Message ID | 1614540807-30686-17-git-send-email-sai.pavan.boddu@xilinx.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | eMMC support | expand |
On 2/28/21 8:33 PM, Sai Pavan Boddu wrote: > From: Joel Stanley <joel@jms.id.au> > > This assumes a specially constructued image: > > dd if=/dev/zero of=mmc-bootarea.img count=2 bs=1M > dd if=u-boot-spl.bin of=mmc-bootarea.img conv=notrunc > dd if=u-boot.bin of=mmc-bootarea.img conv=notrunc count=64 bs=1K > cat mmc-bootarea.img obmc-phosphor-image.wic > mmc.img > truncate --size 16GB mmc.img > truncate --size 128MB mmc-bootarea.img > > Signed-off-by: Joel Stanley <joel@jms.id.au> > [clg: - changes on the definition names ] > Signed-off-by: Cédric Le Goater <clg@kaod.org> > [spb: use data_start property to access right emmc partition, > Clean up PARTITION_ENABLE support as incomplete, > Fix commit message to be generic.] > Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> > --- > hw/sd/sd.c | 40 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 40 insertions(+) > > diff --git a/hw/sd/sd.c b/hw/sd/sd.c > index 08b77ad..d311477 100644 > --- a/hw/sd/sd.c > +++ b/hw/sd/sd.c > @@ -1044,6 +1044,34 @@ static void sd_lock_command(SDState *sd) > sd->card_status &= ~CARD_IS_LOCKED; > } > > +/* > + * This requires a disk image that has two boot partitions inserted at the > + * beginning of it. The size of the boot partitions are configured in the > + * ext_csd structure, which is hardcoded in qemu. They are currently set to > + * 1MB each. > + */ > +static uint32_t sd_bootpart_offset(SDState *sd) > +{ > + unsigned int access = sd->ext_csd[EXT_CSD_PART_CONFIG] & > + EXT_CSD_PART_CONFIG_ACC_MASK; > + unsigned int boot_capacity = sd->ext_csd[EXT_CSD_BOOT_MULT] << 17; > + > + if (!sd->emmc) { > + return 0; > + } > + > + switch (access) { > + case EXT_CSD_PART_CONFIG_ACC_DEFAULT: > + return boot_capacity * 2; > + case EXT_CSD_PART_CONFIG_ACC_BOOT0: > + return 0; > + case EXT_CSD_PART_CONFIG_ACC_BOOT0 + 1: > + return boot_capacity * 1; > + default: > + g_assert_not_reached(); > + } > +} > + > static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) > { > uint32_t rca = 0x0000; > @@ -1359,6 +1387,9 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) > return sd_r1; > } > > + if (sd->emmc) { > + addr += sd_bootpart_offset(sd); This could be a class handler. The default behavior would be to return 0. C. > + } > sd->state = sd_sendingdata_state; > sd->data_start = addr; > sd->data_offset = 0; > @@ -1378,6 +1409,9 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) > return sd_r1; > } > > + if (sd->emmc) { > + addr += sd_bootpart_offset(sd); > + } > sd->state = sd_sendingdata_state; > sd->data_start = addr; > sd->data_offset = 0; > @@ -1434,6 +1468,9 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) > return sd_r1; > } > > + if (sd->emmc) { > + addr += sd_bootpart_offset(sd); > + } > sd->state = sd_receivingdata_state; > sd->data_start = addr; > sd->data_offset = 0; > @@ -1464,6 +1501,9 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) > return sd_r1; > } > > + if (sd->emmc) { > + addr += sd_bootpart_offset(sd); > + } > sd->state = sd_receivingdata_state; > sd->data_start = addr; > sd->data_offset = 0; >
diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 08b77ad..d311477 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -1044,6 +1044,34 @@ static void sd_lock_command(SDState *sd) sd->card_status &= ~CARD_IS_LOCKED; } +/* + * This requires a disk image that has two boot partitions inserted at the + * beginning of it. The size of the boot partitions are configured in the + * ext_csd structure, which is hardcoded in qemu. They are currently set to + * 1MB each. + */ +static uint32_t sd_bootpart_offset(SDState *sd) +{ + unsigned int access = sd->ext_csd[EXT_CSD_PART_CONFIG] & + EXT_CSD_PART_CONFIG_ACC_MASK; + unsigned int boot_capacity = sd->ext_csd[EXT_CSD_BOOT_MULT] << 17; + + if (!sd->emmc) { + return 0; + } + + switch (access) { + case EXT_CSD_PART_CONFIG_ACC_DEFAULT: + return boot_capacity * 2; + case EXT_CSD_PART_CONFIG_ACC_BOOT0: + return 0; + case EXT_CSD_PART_CONFIG_ACC_BOOT0 + 1: + return boot_capacity * 1; + default: + g_assert_not_reached(); + } +} + static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) { uint32_t rca = 0x0000; @@ -1359,6 +1387,9 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) return sd_r1; } + if (sd->emmc) { + addr += sd_bootpart_offset(sd); + } sd->state = sd_sendingdata_state; sd->data_start = addr; sd->data_offset = 0; @@ -1378,6 +1409,9 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) return sd_r1; } + if (sd->emmc) { + addr += sd_bootpart_offset(sd); + } sd->state = sd_sendingdata_state; sd->data_start = addr; sd->data_offset = 0; @@ -1434,6 +1468,9 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) return sd_r1; } + if (sd->emmc) { + addr += sd_bootpart_offset(sd); + } sd->state = sd_receivingdata_state; sd->data_start = addr; sd->data_offset = 0; @@ -1464,6 +1501,9 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) return sd_r1; } + if (sd->emmc) { + addr += sd_bootpart_offset(sd); + } sd->state = sd_receivingdata_state; sd->data_start = addr; sd->data_offset = 0;