Message ID | 1614540807-30686-7-git-send-email-sai.pavan.boddu@xilinx.com |
---|---|
State | New |
Headers | show |
Series | eMMC support | expand |
On 2/28/21 8:33 PM, Sai Pavan Boddu wrote: > From: Vincent Palatin <vpalatin@chromium.org> > > Sends the EXT_CSD register as response to CMD8. > > Signed-off-by: Vincent Palatin <vpalatin@chromium.org> > Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> > --- > hw/sd/sd.c | 52 ++++++++++++++++++++++++++++++++++++---------------- > 1 file changed, 36 insertions(+), 16 deletions(-) > > diff --git a/hw/sd/sd.c b/hw/sd/sd.c > index a26695b..181e7e2 100644 > --- a/hw/sd/sd.c > +++ b/hw/sd/sd.c > @@ -1141,24 +1141,37 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) > } > break; > > - case 8: /* CMD8: SEND_IF_COND */ > - if (sd->spec_version < SD_PHY_SPECv2_00_VERS) { > - break; > - } > - if (sd->state != sd_idle_state) { > - break; > - } > - sd->vhs = 0; > - > - /* No response if not exactly one VHS bit is set. */ > - if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + 1))) { > - return sd->spi ? sd_r7 : sd_r0; > - } > + case 8: /* CMD8: SEND_IF_COND / SEND_EXT_CSD */ > + if (sd->emmc) { > + switch (sd->state) { > + case sd_transfer_state: > + /* MMC : Sends the EXT_CSD register as a Block of data */ > + sd->state = sd_sendingdata_state; > + memcpy(sd->data, sd->ext_csd, sizeof(sd->ext_csd)); > + sd->data_start = addr; > + sd->data_offset = 0; > + return sd_r1; > + default: > + break; > + } This is big enough to be a SDCardClass handler. Thanks, C. > + } else { > + if (sd->spec_version < SD_PHY_SPECv2_00_VERS) { > + break; > + } > + if (sd->state != sd_idle_state) { > + break; > + } > + sd->vhs = 0; > > - /* Accept. */ > - sd->vhs = req.arg; > - return sd_r7; > + /* No response if not exactly one VHS bit is set. */ > + if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + 1))) { > + return sd->spi ? sd_r7 : sd_r0; > + } > > + /* Accept. */ > + sd->vhs = req.arg; > + return sd_r7; > + } > case 9: /* CMD9: SEND_CSD */ > switch (sd->state) { > case sd_standby_state: > @@ -2081,6 +2094,13 @@ uint8_t sd_read_byte(SDState *sd) > sd->state = sd_transfer_state; > break; > > + case 8: /* CMD8: SEND_EXT_CSD on MMC */ > + ret = sd->data[sd->data_offset++]; > + if (sd->data_offset >= sizeof(sd->ext_csd)) { > + sd->state = sd_transfer_state; > + } > + break; > + > case 9: /* CMD9: SEND_CSD */ > case 10: /* CMD10: SEND_CID */ > ret = sd->data[sd->data_offset ++]; >
diff --git a/hw/sd/sd.c b/hw/sd/sd.c index a26695b..181e7e2 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -1141,24 +1141,37 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) } break; - case 8: /* CMD8: SEND_IF_COND */ - if (sd->spec_version < SD_PHY_SPECv2_00_VERS) { - break; - } - if (sd->state != sd_idle_state) { - break; - } - sd->vhs = 0; - - /* No response if not exactly one VHS bit is set. */ - if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + 1))) { - return sd->spi ? sd_r7 : sd_r0; - } + case 8: /* CMD8: SEND_IF_COND / SEND_EXT_CSD */ + if (sd->emmc) { + switch (sd->state) { + case sd_transfer_state: + /* MMC : Sends the EXT_CSD register as a Block of data */ + sd->state = sd_sendingdata_state; + memcpy(sd->data, sd->ext_csd, sizeof(sd->ext_csd)); + sd->data_start = addr; + sd->data_offset = 0; + return sd_r1; + default: + break; + } + } else { + if (sd->spec_version < SD_PHY_SPECv2_00_VERS) { + break; + } + if (sd->state != sd_idle_state) { + break; + } + sd->vhs = 0; - /* Accept. */ - sd->vhs = req.arg; - return sd_r7; + /* No response if not exactly one VHS bit is set. */ + if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + 1))) { + return sd->spi ? sd_r7 : sd_r0; + } + /* Accept. */ + sd->vhs = req.arg; + return sd_r7; + } case 9: /* CMD9: SEND_CSD */ switch (sd->state) { case sd_standby_state: @@ -2081,6 +2094,13 @@ uint8_t sd_read_byte(SDState *sd) sd->state = sd_transfer_state; break; + case 8: /* CMD8: SEND_EXT_CSD on MMC */ + ret = sd->data[sd->data_offset++]; + if (sd->data_offset >= sizeof(sd->ext_csd)) { + sd->state = sd_transfer_state; + } + break; + case 9: /* CMD9: SEND_CSD */ case 10: /* CMD10: SEND_CID */ ret = sd->data[sd->data_offset ++];