qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5)
@ 2018-01-23  3:30 Philippe Mathieu-Daudé
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 01/18] sdcard: Don't always set the high capacity bit Philippe Mathieu-Daudé
                   ` (17 more replies)
  0 siblings, 18 replies; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

Some refactors, few bugfixes, better SD/SPI support.

With this series apply, machines can use cards in UHS-I mode.
(mostly imported from Alistair Francis work)

MMC mode split out for another series.

Since v2:
- split again in 2... other part is cleanup/tracing

Since v1:
- rewrote mostly all patches to keep it simpler.

$ git backport-diff
001/18:[0003] [FC] 'sdcard: Don't always set the high capacity bit'
002/18:[down] 'sdcard: update the CSD CRC register regardless the CSD structure version'
003/18:[down] 'sdcard: fix the 'maximum data transfer rate' to 25MHz'
004/18:[down] 'sdcard: clean the SCR register and add few comments'
005/18:[down] 'sdcard: remove commands from unsupported old MMC specification'
006/18:[down] 'sdcard: simplify using the ldst API'
007/18:[down] 'sdcard: use the correct masked OCR in the R3 reply'
008/18:[down] 'sdcard: use the registerfields API for the CARD_STATUS register masks'
009/18:[down] 'sdcard: handles more commands in SPI mode'
010/18:[down] 'sdcard: handle CMD54 (SDIO)'
011/18:[down] 'sdcard: check the card is in correct state for APP CMD (CMD55)'
012/18:[down] 'sdcard: warn if host uses an incorrect address for APP CMD (CMD55)'
013/18:[down] 'sdcard: simplify SEND_IF_COND (CMD8)'
014/18:[down] 'sdcard: simplify SD_SEND_OP_COND (ACMD41)'
015/18:[down] 'sdcard: add SD SEND_TUNING_BLOCK (CMD19)'
016/18:[down] 'sdcard: add a 'uhs' property, update the OCR register ACCEPT_SWITCH_1V8 bit'
017/18:[down] 'sdcard: implement the UHS-I SWITCH_FUNCTION entries (Spec v3)'
018/18:[0006] [FC] 'sdcard: add an enum for the SD PHY Spec version'

Based-on: 20180123032135.28863-13-f4bug@amsat.org

Philippe Mathieu-Daudé (18):
  sdcard: Don't always set the high capacity bit
  sdcard: update the CSD CRC register regardless the CSD structure version
  sdcard: fix the 'maximum data transfer rate' to 25MHz
  sdcard: clean the SCR register and add few comments
  sdcard: remove commands from unsupported old MMC specification
  sdcard: simplify using the ldst API
  sdcard: use the correct masked OCR in the R3 reply
  sdcard: use the registerfields API for the CARD_STATUS register masks
  sdcard: handles more commands in SPI mode
  sdcard: handle CMD54 (SDIO)
  sdcard: check the card is in correct state for APP CMD (CMD55)
  sdcard: warn if host uses an incorrect address for APP CMD (CMD55)
  sdcard: simplify SEND_IF_COND (CMD8)
  sdcard: simplify SD_SEND_OP_COND (ACMD41)
  sdcard: add SD SEND_TUNING_BLOCK (CMD19)
  sdcard: add a 'uhs' property, update the OCR register ACCEPT_SWITCH_1V8 bit
  sdcard: implement the UHS-I SWITCH_FUNCTION entries (Spec v3)
  sdcard: add an enum for the SD PHY Spec version

 hw/sd/sd.c         | 501 +++++++++++++++++++++++++++++++++++++----------------
 hw/sd/trace-events |   1 +
 2 files changed, 354 insertions(+), 148 deletions(-)

-- 
2.15.1

^ permalink raw reply	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 01/18] sdcard: Don't always set the high capacity bit
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-01-31 16:15   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 02/18] sdcard: update the CSD CRC register regardless the CSD structure version Philippe Mathieu-Daudé
                   ` (16 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

Don't set the high capacity bit by default as it will be set if required
in the sd_set_csd() function.

[based on a patch from Alistair Francis <alistair.francis@xilinx.com>
 and Peter Ogden <ogden@xilinx.com> from qemu/xilinx tag xilinx-v2015.4]
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 437ce25f79..20764451f2 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -289,6 +289,10 @@ static void sd_ocr_powerup(void *opaque)
 
     /* card power-up OK */
     sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_POWER_UP, 1);
+
+    if (sd->size > 1 * G_BYTE) {
+        sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_CAPACITY, 1);
+    }
 }
 
 static void sd_reset_scr(SDState *sd)
@@ -393,7 +397,6 @@ static void sd_reset_csd(SDState *sd, uint64_t size)
         sd->csd[13] = 0x40;
         sd->csd[14] = 0x00;
         sd->csd[15] = 0x00;
-        sd->ocr |= 1 << 30;     /* High Capacity SD Memory Card */
     }
 }
 
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 02/18] sdcard: update the CSD CRC register regardless the CSD structure version
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 01/18] sdcard: Don't always set the high capacity bit Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-01-31 16:16   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 03/18] sdcard: fix the 'maximum data transfer rate' to 25MHz Philippe Mathieu-Daudé
                   ` (15 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 20764451f2..f6318c6fdb 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -377,7 +377,6 @@ static void sd_reset_csd(SDState *sd, uint64_t size)
         sd->csd[13] = 0x20 |	/* Max. write data block length */
             ((HWBLOCK_SHIFT << 6) & 0xc0);
         sd->csd[14] = 0x00;	/* File format group */
-        sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
     } else {			/* SDHC */
         size /= 512 * 1024;
         size -= 1;
@@ -396,8 +395,8 @@ static void sd_reset_csd(SDState *sd, uint64_t size)
         sd->csd[12] = 0x0a;
         sd->csd[13] = 0x40;
         sd->csd[14] = 0x00;
-        sd->csd[15] = 0x00;
     }
+    sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
 }
 
 static void sd_reset_rca(SDState *sd)
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 03/18] sdcard: fix the 'maximum data transfer rate' to 25MHz
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 01/18] sdcard: Don't always set the high capacity bit Philippe Mathieu-Daudé
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 02/18] sdcard: update the CSD CRC register regardless the CSD structure version Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-01-31 16:17   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 04/18] sdcard: clean the SCR register and add few comments Philippe Mathieu-Daudé
                   ` (14 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

To comply with Spec v1.10 (and 2.00, 3.01):

. TRAN_SPEED

for current SD Memory Cards that field must be always 0_0110_010b (032h) which is
equal to 25MHz - the mandatory maximum operating frequency of SD Memory Card.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index f6318c6fdb..56df5b660a 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -356,7 +356,7 @@ static void sd_reset_csd(SDState *sd, uint64_t size)
         sd->csd[0] = 0x00;	/* CSD structure */
         sd->csd[1] = 0x26;	/* Data read access-time-1 */
         sd->csd[2] = 0x00;	/* Data read access-time-2 */
-        sd->csd[3] = 0x5a;	/* Max. data transfer rate */
+        sd->csd[3] = 0x32;  /* Max. data transfer rate: 25 MHz */
         sd->csd[4] = 0x5f;	/* Card Command Classes */
         sd->csd[5] = 0x50 |	/* Max. read data block length */
             HWBLOCK_SHIFT;
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 04/18] sdcard: clean the SCR register and add few comments
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (2 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 03/18] sdcard: fix the 'maximum data transfer rate' to 25MHz Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-01-31 16:18   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 05/18] sdcard: remove commands from unsupported old MMC specification Philippe Mathieu-Daudé
                   ` (13 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 56df5b660a..5d50d48097 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -297,10 +297,13 @@ static void sd_ocr_powerup(void *opaque)
 
 static void sd_reset_scr(SDState *sd)
 {
-    sd->scr[0] = 0x00;		/* SCR Structure */
-    sd->scr[1] = 0x2f;		/* SD Security Support */
-    sd->scr[2] = 0x00;
+    sd->scr[0] = (0 << 4)       /* SCR version 1.0 */
+                 | 0;           /* Spec Versions 1.0 and 1.01 */
+    sd->scr[1] = (2 << 4)       /* SDSC Card (Security Version 1.01) */
+                 | 0b0101;      /* 1-bit or 4-bit width bus modes */
+    sd->scr[2] = 0x00;          /* Extended Security is not supported. */
     sd->scr[3] = 0x00;
+    /* reserved for manufacturer usage */
     sd->scr[4] = 0x00;
     sd->scr[5] = 0x00;
     sd->scr[6] = 0x00;
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 05/18] sdcard: remove commands from unsupported old MMC specification
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (3 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 04/18] sdcard: clean the SCR register and add few comments Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-01-31 16:59   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 06/18] sdcard: simplify using the ldst API Philippe Mathieu-Daudé
                   ` (12 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

This device does not model MMCA Specification previous to v4.2

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 33 ---------------------------------
 1 file changed, 33 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 5d50d48097..3c66521862 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1044,24 +1044,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
         }
         break;
 
-    case 11:	/* CMD11:  READ_DAT_UNTIL_STOP */
-        if (sd->spi)
-            goto bad_cmd;
-        switch (sd->state) {
-        case sd_transfer_state:
-            sd->state = sd_sendingdata_state;
-            sd->data_start = req.arg;
-            sd->data_offset = 0;
-
-            if (sd->data_start + sd->blk_len > sd->size)
-                sd->card_status |= ADDRESS_ERROR;
-            return sd_r0;
-
-        default:
-            break;
-        }
-        break;
-
     case 12:	/* CMD12:  STOP_TRANSMISSION */
         switch (sd->state) {
         case sd_sendingdata_state:
@@ -1874,21 +1856,6 @@ uint8_t sd_read_data(SDState *sd)
             sd->state = sd_transfer_state;
         break;
 
-    case 11:	/* CMD11:  READ_DAT_UNTIL_STOP */
-        if (sd->data_offset == 0)
-            BLK_READ_BLOCK(sd->data_start, io_len);
-        ret = sd->data[sd->data_offset ++];
-
-        if (sd->data_offset >= io_len) {
-            sd->data_start += io_len;
-            sd->data_offset = 0;
-            if (sd->data_start + io_len > sd->size) {
-                sd->card_status |= ADDRESS_ERROR;
-                break;
-            }
-        }
-        break;
-
     case 13:	/* ACMD13: SD_STATUS */
         ret = sd->sd_status[sd->data_offset ++];
 
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 06/18] sdcard: simplify using the ldst API
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (4 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 05/18] sdcard: remove commands from unsupported old MMC specification Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-02-08 23:46   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 07/18] sdcard: use the correct masked OCR in the R3 reply Philippe Mathieu-Daudé
                   ` (11 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

the code is easier to review/refactor.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 38 +++++++++-----------------------------
 1 file changed, 9 insertions(+), 29 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 3c66521862..23f5d47782 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -435,57 +435,39 @@ static int sd_req_crc_validate(SDRequest *req)
 {
     uint8_t buffer[5];
     buffer[0] = 0x40 | req->cmd;
-    buffer[1] = (req->arg >> 24) & 0xff;
-    buffer[2] = (req->arg >> 16) & 0xff;
-    buffer[3] = (req->arg >> 8) & 0xff;
-    buffer[4] = (req->arg >> 0) & 0xff;
+    stl_be_p(&buffer[1], req->arg);
     return 0;
     return sd_crc7(buffer, 5) != req->crc;	/* TODO */
 }
 
 static void sd_response_r1_make(SDState *sd, uint8_t *response)
 {
-    uint32_t status = sd->card_status;
+    stl_be_p(response, sd->card_status);
+
     /* Clear the "clear on read" status bits */
     sd->card_status &= ~CARD_STATUS_C;
-
-    response[0] = (status >> 24) & 0xff;
-    response[1] = (status >> 16) & 0xff;
-    response[2] = (status >> 8) & 0xff;
-    response[3] = (status >> 0) & 0xff;
 }
 
 static void sd_response_r3_make(SDState *sd, uint8_t *response)
 {
-    response[0] = (sd->ocr >> 24) & 0xff;
-    response[1] = (sd->ocr >> 16) & 0xff;
-    response[2] = (sd->ocr >> 8) & 0xff;
-    response[3] = (sd->ocr >> 0) & 0xff;
+    stl_be_p(response, sd->ocr);
 }
 
 static void sd_response_r6_make(SDState *sd, uint8_t *response)
 {
-    uint16_t arg;
     uint16_t status;
 
-    arg = sd->rca;
     status = ((sd->card_status >> 8) & 0xc000) |
              ((sd->card_status >> 6) & 0x2000) |
               (sd->card_status & 0x1fff);
     sd->card_status &= ~(CARD_STATUS_C & 0xc81fff);
-
-    response[0] = (arg >> 8) & 0xff;
-    response[1] = arg & 0xff;
-    response[2] = (status >> 8) & 0xff;
-    response[3] = status & 0xff;
+    stw_be_p(response + 0, sd->rca);
+    stw_be_p(response + 2, status);
 }
 
 static void sd_response_r7_make(SDState *sd, uint8_t *response)
 {
-    response[0] = (sd->vhs >> 24) & 0xff;
-    response[1] = (sd->vhs >> 16) & 0xff;
-    response[2] = (sd->vhs >>  8) & 0xff;
-    response[3] = (sd->vhs >>  0) & 0xff;
+    stl_be_p(response, sd->vhs);
 }
 
 static inline uint64_t sd_addr_to_wpnum(uint64_t addr)
@@ -731,7 +713,7 @@ static uint32_t sd_wpbits(SDState *sd, uint64_t addr)
 
 static void sd_function_switch(SDState *sd, uint32_t arg)
 {
-    int i, mode, new_func, crc;
+    int i, mode, new_func;
     mode = !!(arg & 0x80000000);
 
     sd->data[0] = 0x00;		/* Maximum current consumption */
@@ -755,9 +737,7 @@ static void sd_function_switch(SDState *sd, uint32_t arg)
         sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
     }
     memset(&sd->data[17], 0, 47);
-    crc = sd_crc16(sd->data, 64);
-    sd->data[65] = crc >> 8;
-    sd->data[66] = crc & 0xff;
+    stw_be_p(sd->data + 65, sd_crc16(sd->data, 64));
 }
 
 static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 07/18] sdcard: use the correct masked OCR in the R3 reply
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (5 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 06/18] sdcard: simplify using the ldst API Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-01-31 17:01   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 08/18] sdcard: use the registerfields API for the CARD_STATUS register masks Philippe Mathieu-Daudé
                   ` (10 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

use the registerfields API to access the OCR register

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 23f5d47782..ee381540aa 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -47,8 +47,6 @@
 
 //#define DEBUG_SD 1
 
-#define ACMD41_ENQUIRY_MASK     0x00ffffff
-
 typedef enum {
     sd_r0 = 0,    /* no response */
     sd_r1,        /* normal response command */
@@ -271,13 +269,26 @@ static uint16_t sd_crc16(void *message, size_t width)
 
 #define OCR_POWER_DELAY_NS      500000 /* 0.5ms */
 
+FIELD(OCR, VDD_VOLTAGE_WINDOW,          0, 24)
+FIELD(OCR, VDD_VOLTAGE_WIN_LO,          0,  8)
+FIELD(OCR, DUAL_VOLTAGE_CARD,           7,  1)
+FIELD(OCR, VDD_VOLTAGE_WIN_HI,          8, 16)
+FIELD(OCR, ACCEPT_SWITCH_1V8,          24,  1) /* Only UHS-I */
+FIELD(OCR, UHS_II_CARD,                29,  1) /* Only UHS-II */
 FIELD(OCR, CARD_CAPACITY,              30,  1) /* 0:SDSC, 1:SDHC/SDXC */
 FIELD(OCR, CARD_POWER_UP,              31,  1)
 
+#define ACMD41_ENQUIRY_MASK     0x00ffffff
+#define ACMD41_R3_MASK          (R_OCR_VDD_VOLTAGE_WIN_HI_MASK \
+                               | R_OCR_ACCEPT_SWITCH_1V8_MASK \
+                               | R_OCR_UHS_II_CARD_MASK \
+                               | R_OCR_CARD_CAPACITY_MASK \
+                               | R_OCR_CARD_POWER_UP_MASK)
+
 static void sd_reset_ocr(SDState *sd)
 {
-    /* All voltages OK, Standard Capacity SD Memory Card, not yet powered up */
-    sd->ocr = 0x00ffff00;
+    /* All voltages OK */
+    sd->ocr = R_OCR_VDD_VOLTAGE_WIN_HI_MASK;
 }
 
 static void sd_ocr_powerup(void *opaque)
@@ -450,7 +461,7 @@ static void sd_response_r1_make(SDState *sd, uint8_t *response)
 
 static void sd_response_r3_make(SDState *sd, uint8_t *response)
 {
-    stl_be_p(response, sd->ocr);
+    stl_be_p(response, sd->ocr & ACMD41_R3_MASK);
 }
 
 static void sd_response_r6_make(SDState *sd, uint8_t *response)
@@ -1634,7 +1645,13 @@ send_response:
     }
 
 #ifdef DEBUG_SD
-    qemu_hexdump((const char *)response, stderr, "Response", rsplen);
+    if (rsplen) {
+        int i;
+        DPRINTF("Response:");
+        for (i = 0; i < rsplen; i++)
+            fprintf(stderr, " %02x", response[i]);
+        fputc('\n', stderr);
+    }
 #endif
 
     return rsplen;
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 08/18] sdcard: use the registerfields API for the CARD_STATUS register masks
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (6 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 07/18] sdcard: use the correct masked OCR in the R3 reply Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 09/18] sdcard: handles more commands in SPI mode Philippe Mathieu-Daudé
                   ` (9 subsequent siblings)
  17 siblings, 0 replies; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 48 +++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 45 insertions(+), 3 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index ee381540aa..2eca999bc3 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -423,14 +423,56 @@ static void sd_set_rca(SDState *sd)
     sd->rca += 0x4567;
 }
 
+FIELD(CSR, AKE_SEQ_ERROR,               3,  1)
+FIELD(CSR, APP_CMD,                     5,  1)
+FIELD(CSR, FX_EVENT,                    6,  1)
+FIELD(CSR, READY_FOR_DATA,              8,  1)
+FIELD(CSR, CURRENT_STATE,               9,  4)
+FIELD(CSR, ERASE_RESET,                13,  1)
+FIELD(CSR, CARD_ECC_DISABLED,          14,  1)
+FIELD(CSR, WP_ERASE_SKIP,              15,  1)
+FIELD(CSR, CSD_OVERWRITE,              16,  1)
+FIELD(CSR, DEFERRED_RESPONSE,          17,  1)
+FIELD(CSR, ERROR,                      19,  1)
+FIELD(CSR, CC_ERROR,                   20,  1)
+FIELD(CSR, CARD_ECC_FAILED,            21,  1)
+FIELD(CSR, ILLEGAL_COMMAND,            22,  1)
+FIELD(CSR, COM_CRC_ERROR,              23,  1)
+FIELD(CSR, LOCK_UNLOCK_FAILED,         24,  1)
+FIELD(CSR, CARD_IS_LOCKED,             25,  1)
+FIELD(CSR, WP_VIOLATION,               26,  1)
+FIELD(CSR, ERASE_PARAM,                27,  1)
+FIELD(CSR, ERASE_SEQ_ERROR,            28,  1)
+FIELD(CSR, BLOCK_LEN_ERROR,            29,  1)
+FIELD(CSR, ADDRESS_ERROR,              30,  1)
+FIELD(CSR, OUT_OF_RANGE,               31,  1)
+
 /* Card status bits, split by clear condition:
  * A : According to the card current state
  * B : Always related to the previous command
  * C : Cleared by read
  */
-#define CARD_STATUS_A	0x02004100
-#define CARD_STATUS_B	0x00c01e00
-#define CARD_STATUS_C	0xfd39a028
+#define CARD_STATUS_A           (R_CSR_READY_FOR_DATA_MASK \
+                               | R_CSR_CARD_ECC_DISABLED_MASK \
+                               | R_CSR_CARD_IS_LOCKED_MASK)
+#define CARD_STATUS_B           (R_CSR_CURRENT_STATE_MASK \
+                               | R_CSR_ILLEGAL_COMMAND_MASK \
+                               | R_CSR_COM_CRC_ERROR_MASK)
+#define CARD_STATUS_C           (R_CSR_AKE_SEQ_ERROR_MASK \
+                               | R_CSR_APP_CMD_MASK \
+                               | R_CSR_ERASE_RESET_MASK \
+                               | R_CSR_WP_ERASE_SKIP_MASK \
+                               | R_CSR_CSD_OVERWRITE_MASK \
+                               | R_CSR_ERROR_MASK \
+                               | R_CSR_CC_ERROR_MASK \
+                               | R_CSR_CARD_ECC_FAILED_MASK \
+                               | R_CSR_LOCK_UNLOCK_FAILED_MASK \
+                               | R_CSR_WP_VIOLATION_MASK \
+                               | R_CSR_ERASE_PARAM_MASK \
+                               | R_CSR_ERASE_SEQ_ERROR_MASK \
+                               | R_CSR_BLOCK_LEN_ERROR_MASK \
+                               | R_CSR_ADDRESS_ERROR_MASK \
+                               | R_CSR_OUT_OF_RANGE_MASK)
 
 static void sd_reset_cardstatus(SDState *sd)
 {
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 09/18] sdcard: handles more commands in SPI mode
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (7 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 08/18] sdcard: use the registerfields API for the CARD_STATUS register masks Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-02-01  0:11   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 10/18] sdcard: handle CMD54 (SDIO) Philippe Mathieu-Daudé
                   ` (8 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 54 insertions(+), 3 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 2eca999bc3..07424aa56e 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1390,9 +1390,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
 
     /* Application specific commands (Class 8) */
     case 55:	/* CMD55:  APP_CMD */
-        if (sd->rca != rca)
-            return sd_r0;
-
+        if (!sd->spi) {
+            if (sd->rca != rca) {
+                return sd_r0;
+            }
+        }
         sd->expecting_acmd = true;
         sd->card_status |= APP_CMD;
         return sd_r1;
@@ -1412,6 +1414,18 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
         }
         break;
 
+    case 58:    /* CMD58:   READ_OCR (SPI) */
+        if (!sd->spi) {
+            goto bad_cmd;
+        }
+        return sd_r3;
+
+    case 59:    /* CMD59:   CRC_ON_OFF (SPI) */
+        if (!sd->spi) {
+            goto bad_cmd;
+        }
+        goto unimplemented_cmd;
+
     default:
     bad_cmd:
         qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
@@ -1436,6 +1450,9 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
     sd->card_status |= APP_CMD;
     switch (req.cmd) {
     case 6:	/* ACMD6:  SET_BUS_WIDTH */
+        if (sd->spi) {
+            goto unimplemented_cmd;
+        }
         switch (sd->state) {
         case sd_transfer_state:
             sd->sd_status[0] &= 0x3f;
@@ -1460,6 +1477,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
         }
         break;
 
+    case 18:
+        if (sd->spi) {
+            goto unimplemented_cmd;
+        }
+        break;
+
     case 22:	/* ACMD22: SEND_NUM_WR_BLOCKS */
         switch (sd->state) {
         case sd_transfer_state:
@@ -1485,6 +1508,19 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
         }
         break;
 
+    case 25:
+    case 26:
+        if (sd->spi) {
+            goto unimplemented_cmd;
+        }
+        break;
+
+    case 38:
+        if (sd->spi) {
+            goto unimplemented_cmd;
+        }
+        break;
+
     case 41:	/* ACMD41: SD_APP_OP_COND */
         if (sd->spi) {
             /* SEND_OP_CMD */
@@ -1542,6 +1578,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
         }
         break;
 
+    case 43 ... 49:
+        if (sd->spi) {
+            goto unimplemented_cmd;
+        }
+        break;
+
     case 51:	/* ACMD51: SEND_SCR */
         switch (sd->state) {
         case sd_transfer_state:
@@ -1555,9 +1597,18 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
         }
         break;
 
+    case 55:    /* Not exist */
+        break;
+
     default:
         /* Fall back to standard commands.  */
         return sd_normal_command(sd, req);
+
+    unimplemented_cmd:
+        /* Commands that are recognised but not yet implemented in SPI mode.  */
+        qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
+                      req.cmd);
+        return sd_illegal;
     }
 
     qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 10/18] sdcard: handle CMD54 (SDIO)
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (8 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 09/18] sdcard: handles more commands in SPI mode Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-02-01  0:12   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 11/18] sdcard: check the card is in correct state for APP CMD (CMD55) Philippe Mathieu-Daudé
                   ` (7 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

Linux uses it to poll the bus before polling for a card.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 07424aa56e..bbf9496e8a 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1378,9 +1378,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
         }
         break;
 
-    case 52:
-    case 53:
-        /* CMD52, CMD53: reserved for SDIO cards
+    case 52 ... 54:
+        /* CMD52, CMD53, CMD54: reserved for SDIO cards
          * (see the SDIO Simplified Specification V2.0)
          * Handle as illegal command but do not complain
          * on stderr, as some OSes may use these in their
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 11/18] sdcard: check the card is in correct state for APP CMD (CMD55)
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (9 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 10/18] sdcard: handle CMD54 (SDIO) Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-02-01  0:27   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 12/18] sdcard: warn if host uses an incorrect address " Philippe Mathieu-Daudé
                   ` (6 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index bbf9496e8a..434d1fbc47 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1389,6 +1389,14 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
 
     /* Application specific commands (Class 8) */
     case 55:	/* CMD55:  APP_CMD */
+        switch (sd->state) {
+        case sd_ready_state:
+        case sd_identification_state:
+        case sd_inactive_state:
+            return sd_illegal;
+        default:
+            break;
+        }
         if (!sd->spi) {
             if (sd->rca != rca) {
                 return sd_r0;
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 12/18] sdcard: warn if host uses an incorrect address for APP CMD (CMD55)
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (10 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 11/18] sdcard: check the card is in correct state for APP CMD (CMD55) Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-02-01  0:27   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 13/18] sdcard: simplify SEND_IF_COND (CMD8) Philippe Mathieu-Daudé
                   ` (5 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 434d1fbc47..b5c947df62 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1394,6 +1394,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
         case sd_identification_state:
         case sd_inactive_state:
             return sd_illegal;
+        case sd_idle_state:
+            if (rca) {
+                qemu_log_mask(LOG_GUEST_ERROR,
+                              "SD: illegal RCA 0x%04x for APP_CMD\n", req.cmd);
+            }
         default:
             break;
         }
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 13/18] sdcard: simplify SEND_IF_COND (CMD8)
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (11 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 12/18] sdcard: warn if host uses an incorrect address " Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-02-01  0:33   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 14/18] sdcard: simplify SD_SEND_OP_COND (ACMD41) Philippe Mathieu-Daudé
                   ` (4 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

replace switch(single case) -> if()

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index b5c947df62..707c294169 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1015,23 +1015,19 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
 
     case 8:	/* CMD8:   SEND_IF_COND */
         /* Physical Layer Specification Version 2.00 command */
-        switch (sd->state) {
-        case sd_idle_state:
-            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;
-            }
-
-            /* Accept.  */
-            sd->vhs = req.arg;
-            return sd_r7;
-
-        default:
+        if (sd->state != sd_idle_state) {
             break;
         }
-        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;
+        }
+
+        /* Accept.  */
+        sd->vhs = req.arg;
+        return sd_r7;
 
     case 9:	/* CMD9:   SEND_CSD */
         switch (sd->state) {
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 14/18] sdcard: simplify SD_SEND_OP_COND (ACMD41)
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (12 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 13/18] sdcard: simplify SEND_IF_COND (CMD8) Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-02-02  0:55   ` Alistair Francis
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 15/18] sdcard: add SD SEND_TUNING_BLOCK (CMD19) Philippe Mathieu-Daudé
                   ` (3 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

replace switch(single case) -> if()

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 56 ++++++++++++++++++++++++++------------------------------
 1 file changed, 26 insertions(+), 30 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 707c294169..6efcacb942 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1535,45 +1535,41 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
             sd->state = sd_transfer_state;
             return sd_r1;
         }
-        switch (sd->state) {
-        case sd_idle_state:
-            /* If it's the first ACMD41 since reset, we need to decide
-             * whether to power up. If this is not an enquiry ACMD41,
-             * we immediately report power on and proceed below to the
-             * ready state, but if it is, we set a timer to model a
-             * delay for power up. This works around a bug in EDK2
-             * UEFI, which sends an initial enquiry ACMD41, but
-             * assumes that the card is in ready state as soon as it
-             * sees the power up bit set. */
-            if (!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)) {
-                if ((req.arg & ACMD41_ENQUIRY_MASK) != 0) {
-                    timer_del(sd->ocr_power_timer);
-                    sd_ocr_powerup(sd);
-                } else {
-                    trace_sdcard_inquiry_cmd41();
-                    if (!timer_pending(sd->ocr_power_timer)) {
-                        timer_mod_ns(sd->ocr_power_timer,
-                                     (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)
-                                      + OCR_POWER_DELAY_NS));
-                    }
+        if (sd->state != sd_idle_state) {
+            break;
+        }
+        /* If it's the first ACMD41 since reset, we need to decide
+         * whether to power up. If this is not an enquiry ACMD41,
+         * we immediately report power on and proceed below to the
+         * ready state, but if it is, we set a timer to model a
+         * delay for power up. This works around a bug in EDK2
+         * UEFI, which sends an initial enquiry ACMD41, but
+         * assumes that the card is in ready state as soon as it
+         * sees the power up bit set. */
+        if (!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)) {
+            if ((req.arg & ACMD41_ENQUIRY_MASK) != 0) {
+                timer_del(sd->ocr_power_timer);
+                sd_ocr_powerup(sd);
+            } else {
+                trace_sdcard_inquiry_cmd41();
+                if (!timer_pending(sd->ocr_power_timer)) {
+                    timer_mod_ns(sd->ocr_power_timer,
+                                 (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)
+                                  + OCR_POWER_DELAY_NS));
                 }
             }
+        }
 
+        if (FIELD_EX32(sd->ocr & req.arg, OCR, VDD_VOLTAGE_WINDOW)) {
             /* We accept any voltage.  10000 V is nothing.
              *
              * Once we're powered up, we advance straight to ready state
              * unless it's an enquiry ACMD41 (bits 23:0 == 0).
              */
-            if (req.arg & ACMD41_ENQUIRY_MASK) {
-                sd->state = sd_ready_state;
-            }
-
-            return sd_r3;
-
-        default:
-            break;
+            sd->state = sd_ready_state;
         }
-        break;
+
+        return sd_r3;
 
     case 42:	/* ACMD42: SET_CLR_CARD_DETECT */
         switch (sd->state) {
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 15/18] sdcard: add SD SEND_TUNING_BLOCK (CMD19)
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (13 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 14/18] sdcard: simplify SD_SEND_OP_COND (ACMD41) Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 16/18] sdcard: add a 'uhs' property, update the OCR register ACCEPT_SWITCH_1V8 bit Philippe Mathieu-Daudé
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

[based on a patch from Alistair Francis <alistair.francis@xilinx.com>
 from qemu/xilinx tag xilinx-v2015.2]
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 6efcacb942..27176ba33e 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1169,6 +1169,14 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
         }
         break;
 
+    case 19:    /* CMD19: SEND_TUNING_BLOCK (SD) */
+        if (sd->state == sd_transfer_state) {
+            sd->state = sd_sendingdata_state;
+            sd->data_offset = 0;
+            return sd_r1;
+        }
+        break;
+
     case 23:    /* CMD23: SET_BLOCK_COUNT */
         switch (sd->state) {
         case sd_transfer_state:
@@ -1911,6 +1919,15 @@ void sd_write_data(SDState *sd, uint8_t value)
     }
 }
 
+#define SD_TUNING_BLOCK_SIZE    64
+
+static const uint32_t sd_tunning_data[SD_TUNING_BLOCK_SIZE / 4] = {
+    0xFF0FFF00, 0x0FFCC3CC, 0xC33CCCFF, 0xFEFFFEEF,
+    0xFFDFFFDD, 0xFFFBFFFB, 0XBFFF7FFF, 0X77F7BDEF,
+    0XFFF0FFF0, 0X0FFCCC3C, 0XCC33CCCF, 0XFFEFFFEE,
+    0XFFFDFFFD, 0XDFFFBFFF, 0XBBFFF7FF, 0XF77F7BDE,
+};
+
 uint8_t sd_read_data(SDState *sd)
 {
     /* TODO: Append CRCs */
@@ -1990,6 +2007,13 @@ uint8_t sd_read_data(SDState *sd)
         }
         break;
 
+    case 19:    /* CMD19:  SEND_TUNING_BLOCK (SD) */
+        if (sd->data_offset >= SD_TUNING_BLOCK_SIZE - 1) {
+            sd->state = sd_transfer_state;
+        }
+        ret = ((uint8_t *)(&sd_tunning_data))[sd->data_offset++];
+        break;
+
     case 22:	/* ACMD22: SEND_NUM_WR_BLOCKS */
         ret = sd->data[sd->data_offset ++];
 
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 16/18] sdcard: add a 'uhs' property, update the OCR register ACCEPT_SWITCH_1V8 bit
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (14 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 15/18] sdcard: add SD SEND_TUNING_BLOCK (CMD19) Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-01-25 10:30   ` Philippe Mathieu-Daudé
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 17/18] sdcard: implement the UHS-I SWITCH_FUNCTION entries (Spec v3) Philippe Mathieu-Daudé
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 18/18] sdcard: add an enum for the SD PHY Spec version Philippe Mathieu-Daudé
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 27176ba33e..b3b6859bc4 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -93,6 +93,7 @@ struct SDState {
     /* Configurable properties */
     BlockBackend *blk;
     bool spi;
+    uint8_t uhs_supported;
 
     uint32_t mode;    /* current card mode, one of SDCardModes */
     int32_t state;    /* current card state, one of SDCardStates */
@@ -289,6 +290,8 @@ static void sd_reset_ocr(SDState *sd)
 {
     /* All voltages OK */
     sd->ocr = R_OCR_VDD_VOLTAGE_WIN_HI_MASK;
+
+    sd->ocr = FIELD_DP32(sd->ocr, OCR, ACCEPT_SWITCH_1V8, !!sd->uhs_supported);
 }
 
 static void sd_ocr_powerup(void *opaque)
@@ -2107,6 +2110,7 @@ static Property sd_properties[] = {
      * board to ensure that ssi transfers only occur when the chip select
      * is asserted.  */
     DEFINE_PROP_BOOL("spi", SDState, spi, false),
+    DEFINE_PROP_UINT8("uhs", SDState, uhs_supported, UHS_NOT_SUPPORTED),
     DEFINE_PROP_END_OF_LIST()
 };
 
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 17/18] sdcard: implement the UHS-I SWITCH_FUNCTION entries (Spec v3)
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (15 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 16/18] sdcard: add a 'uhs' property, update the OCR register ACCEPT_SWITCH_1V8 bit Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 18/18] sdcard: add an enum for the SD PHY Spec version Philippe Mathieu-Daudé
  17 siblings, 0 replies; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

[based on a patch from Alistair Francis <alistair.francis@xilinx.com>
 from qemu/xilinx tag xilinx-v2015.2]
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c         | 148 +++++++++++++++++++++++++++++++++++++++++++++--------
 hw/sd/trace-events |   1 +
 2 files changed, 127 insertions(+), 22 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index b3b6859bc4..1f6c4ce2a4 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -125,6 +125,7 @@ struct SDState {
     bool enable;
     uint8_t dat_lines;
     bool cmd_line;
+    bool uhs_enabled;
 };
 
 static const char *sd_state_name(enum SDCardStates state)
@@ -569,6 +570,7 @@ static void sd_reset(DeviceState *dev)
     sd->expecting_acmd = false;
     sd->dat_lines = 0xf;
     sd->cmd_line = true;
+    sd->uhs_enabled = false;
     sd->multi_blk_cnt = 0;
 }
 
@@ -767,30 +769,132 @@ static uint32_t sd_wpbits(SDState *sd, uint64_t addr)
     return ret;
 }
 
+/* Function Group */
+enum {
+    SD_FG_MIN               = 1,
+    SD_FG_ACCESS_MODE       = 1,
+    SD_FG_COMMAND_SYSTEM    = 2,
+    SD_FG_DRIVER_STRENGTH   = 3,
+    SD_FG_CURRENT_LIMIT     = 4,
+    SD_FG_RSVD_5            = 5,
+    SD_FG_RSVD_6            = 6,
+    SD_FG_COUNT
+};
+
+/* Function name */
+#define SD_FN_COUNT 16
+
+static const char *sd_fn_grp_name[SD_FG_COUNT] = {
+    [SD_FG_ACCESS_MODE]     = "ACCESS_MODE",
+    [SD_FG_COMMAND_SYSTEM]  = "COMMAND_SYSTEM",
+    [SD_FG_DRIVER_STRENGTH] = "DRIVER_STRENGTH",
+    [SD_FG_CURRENT_LIMIT]   = "CURRENT_LIMIT",
+    [SD_FG_RSVD_5]          = "RSVD5",
+    [SD_FG_RSVD_6]          = "RSVD6",
+};
+
+typedef struct sd_fn_support {
+    const char *name;
+    bool uhs_only;
+    bool unimp;
+} sd_fn_support;
+
+static const sd_fn_support *sd_fn_support_defs[SD_FG_COUNT] = {
+    [SD_FG_ACCESS_MODE] = (sd_fn_support [SD_FN_COUNT]) {
+        [0] = { .name = "default/SDR12" },
+        [1] = { .name = "high-speed/SDR25" },
+        [2] = { .name = "SDR50",    .uhs_only = true },
+        [3] = { .name = "SDR104",   .uhs_only = true },
+        [4] = { .name = "DDR50",    .uhs_only = true },
+    },
+    [SD_FG_COMMAND_SYSTEM] = (sd_fn_support [SD_FN_COUNT]) {
+        [0] = { .name = "default" },
+        [1] = { .name = "For eC" },
+        [3] = { .name = "OTP",      .unimp = true },
+        [4] = { .name = "ASSD",     .unimp = true },
+    },
+    [SD_FG_DRIVER_STRENGTH] = (sd_fn_support [SD_FN_COUNT]) {
+        [0] = { .name = "default/Type B" },
+        [1] = { .name = "Type A",   .uhs_only = true },
+        [2] = { .name = "Type C",   .uhs_only = true },
+        [3] = { .name = "Type D",   .uhs_only = true },
+    },
+    [SD_FG_CURRENT_LIMIT] = (sd_fn_support [SD_FN_COUNT]) {
+        [0] = { .name = "default/200mA" },
+        [1] = { .name = "400mA",    .uhs_only = true },
+        [2] = { .name = "600mA",    .uhs_only = true },
+        [3] = { .name = "800mA",    .uhs_only = true },
+    },
+    [SD_FG_RSVD_5] = (sd_fn_support [SD_FN_COUNT]) {
+        [0] = { .name = "default" },
+    },
+    [SD_FG_RSVD_6] = (sd_fn_support [SD_FN_COUNT]) {
+        [0] = { .name = "default" },
+    },
+};
+
+#define SD_FN_NO_INFLUENCE          (1 << 15)
+
 static void sd_function_switch(SDState *sd, uint32_t arg)
 {
-    int i, mode, new_func;
-    mode = !!(arg & 0x80000000);
-
-    sd->data[0] = 0x00;		/* Maximum current consumption */
-    sd->data[1] = 0x01;
-    sd->data[2] = 0x80;		/* Supported group 6 functions */
-    sd->data[3] = 0x01;
-    sd->data[4] = 0x80;		/* Supported group 5 functions */
-    sd->data[5] = 0x01;
-    sd->data[6] = 0x80;		/* Supported group 4 functions */
-    sd->data[7] = 0x01;
-    sd->data[8] = 0x80;		/* Supported group 3 functions */
-    sd->data[9] = 0x01;
-    sd->data[10] = 0x80;	/* Supported group 2 functions */
-    sd->data[11] = 0x43;
-    sd->data[12] = 0x80;	/* Supported group 1 functions */
-    sd->data[13] = 0x03;
-    for (i = 0; i < 6; i ++) {
-        new_func = (arg >> (i * 4)) & 0x0f;
-        if (mode && new_func != 0x0f)
-            sd->function_group[i] = new_func;
-        sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
+    int fn_grp, new_func, i;
+    uint8_t *data_p;
+    bool mode = extract32(arg, 31, 1);  /* 0: check only, 1: do switch */
+
+    stw_be_p(sd->data + 0, 0x0001);     /* Maximum current consumption */
+
+    data_p = &sd->data[2];
+    for (fn_grp = SD_FG_COUNT - 1; fn_grp >= SD_FG_MIN; fn_grp--) {
+        uint16_t supported_fns = SD_FN_NO_INFLUENCE;
+        for (i = 0; i < SD_FN_COUNT; ++i) {
+            const sd_fn_support *def = &sd_fn_support_defs[fn_grp][i];
+
+            if (def->name && !def->unimp &&
+                    !(def->uhs_only && !sd->uhs_enabled)) {
+                supported_fns |= 1 << i;
+            }
+        }
+        stw_be_p(data_p, supported_fns);
+        data_p += 2;
+    }
+
+    assert(data_p == &sd->data[14]);
+    for (fn_grp = SD_FG_COUNT - 1; fn_grp >= SD_FG_MIN; fn_grp--) {
+        new_func = (arg >> ((fn_grp - 1) * 4)) & 0x0f;
+        if (new_func == 0xf) {
+            new_func = sd->function_group[fn_grp - 1];
+        } else {
+            const sd_fn_support *def = &sd_fn_support_defs[fn_grp][new_func];
+            if (mode) {
+                if (!def->name) {
+                    qemu_log_mask(LOG_GUEST_ERROR,
+                                  "Function %d not a valid for "
+                                  "function group %d\n",
+                                  new_func, fn_grp);
+                    new_func = 0xf;
+                } else if (def->unimp) {
+                    qemu_log_mask(LOG_UNIMP,
+                                  "Function %s (fn grp %d) not implemented\n",
+                                  def->name, fn_grp);
+                    new_func = 0xf;
+                } else if (def->uhs_only && !sd->uhs_enabled) {
+                    qemu_log_mask(LOG_GUEST_ERROR,
+                                  "Function %s (fn grp %d) only "
+                                  "valid in UHS mode\n",
+                                  def->name, fn_grp);
+                    new_func = 0xf;
+                } else {
+                    sd->function_group[fn_grp - 1] = new_func;
+                }
+            }
+            trace_sdcard_function_select(def->name, sd_fn_grp_name[fn_grp],
+                                         mode);
+        }
+        if (!(fn_grp & 0x1)) { /* evens go in high nibble */
+            *data_p = new_func << 4;
+        } else { /* odds go in low nibble */
+            *(data_p++) |= new_func;
+        }
     }
     memset(&sd->data[17], 0, 47);
     stw_be_p(sd->data + 65, sd_crc16(sd->data, 64));
diff --git a/hw/sd/trace-events b/hw/sd/trace-events
index 2059ace61f..c106541a47 100644
--- a/hw/sd/trace-events
+++ b/hw/sd/trace-events
@@ -42,6 +42,7 @@ sdcard_write_block(uint64_t addr, uint32_t len) "addr 0x%" PRIx64 " size 0x%x"
 sdcard_write_data(const char *proto, const char *cmd_desc, uint8_t cmd, uint8_t value) "%s %20s/ CMD%02d value 0x%02x"
 sdcard_read_data(const char *proto, const char *cmd_desc, uint8_t cmd, int length) "%s %20s/ CMD%02d len %d"
 sdcard_set_voltage(uint16_t millivolts) "%u mV"
+sdcard_function_select(const char *fn_name, const char *grp_name, bool do_switch) "Function %s (group: %s, sw: %u)"
 
 # hw/sd/milkymist-memcard.c
 milkymist_memcard_memory_read(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 18/18] sdcard: add an enum for the SD PHY Spec version
  2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
                   ` (16 preceding siblings ...)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 17/18] sdcard: implement the UHS-I SWITCH_FUNCTION entries (Spec v3) Philippe Mathieu-Daudé
@ 2018-01-23  3:30 ` Philippe Mathieu-Daudé
  2018-02-01  0:41   ` Alistair Francis
  17 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23  3:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé, qemu-devel, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite, Andrzej Zaborowski

So far this device intends to model the Spec v1.10

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 1f6c4ce2a4..9880a5d090 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -47,6 +47,11 @@
 
 //#define DEBUG_SD 1
 
+typedef enum {
+    SD_PHY_SPEC_VER_1_10 = 110,
+    SD_PHY_SPEC_VER_2_00 = 200, /* not yet supported */
+} sd_phy_spec_ver_t;
+
 typedef enum {
     sd_r0 = 0,    /* no response */
     sd_r1,        /* normal response command */
@@ -122,6 +127,7 @@ struct SDState {
     qemu_irq inserted_cb;
     QEMUTimer *ocr_power_timer;
     const char *proto_name;
+    int spec_version;
     bool enable;
     uint8_t dat_lines;
     bool cmd_line;
@@ -2191,6 +2197,7 @@ static void sd_realize(DeviceState *dev, Error **errp)
     int ret;
 
     sd->proto_name = sd->spi ? "SPI" : "SD";
+    sd->spec_version = SD_PHY_SPEC_VER_1_10;
 
     if (sd->blk && blk_is_read_only(sd->blk)) {
         error_setg(errp, "Cannot use read-only drive as SD card");
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 16/18] sdcard: add a 'uhs' property, update the OCR register ACCEPT_SWITCH_1V8 bit
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 16/18] sdcard: add a 'uhs' property, update the OCR register ACCEPT_SWITCH_1V8 bit Philippe Mathieu-Daudé
@ 2018-01-25 10:30   ` Philippe Mathieu-Daudé
  2018-01-25 10:37     ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-25 10:30 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: qemu-devel, Edgar E . Iglesias, Prasad J Pandit,
	Peter Crosthwaite, Andrzej Zaborowski

On 01/23/2018 12:30 AM, Philippe Mathieu-Daudé wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  hw/sd/sd.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 27176ba33e..b3b6859bc4 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -93,6 +93,7 @@ struct SDState {
>      /* Configurable properties */
>      BlockBackend *blk;
>      bool spi;
> +    uint8_t uhs_supported;
>  
>      uint32_t mode;    /* current card mode, one of SDCardModes */
>      int32_t state;    /* current card state, one of SDCardStates */
> @@ -289,6 +290,8 @@ static void sd_reset_ocr(SDState *sd)
>  {
>      /* All voltages OK */
>      sd->ocr = R_OCR_VDD_VOLTAGE_WIN_HI_MASK;
> +
> +    sd->ocr = FIELD_DP32(sd->ocr, OCR, ACCEPT_SWITCH_1V8, !!sd->uhs_supported);

This patch has to go after this series #17 "sdcard: implement the UHS-I
SWITCH_FUNCTION entries (Spec v3)"

>  }
>  
>  static void sd_ocr_powerup(void *opaque)
> @@ -2107,6 +2110,7 @@ static Property sd_properties[] = {
>       * board to ensure that ssi transfers only occur when the chip select
>       * is asserted.  */
>      DEFINE_PROP_BOOL("spi", SDState, spi, false),
> +    DEFINE_PROP_UINT8("uhs", SDState, uhs_supported, UHS_NOT_SUPPORTED),
>      DEFINE_PROP_END_OF_LIST()
>  };
>  
> 

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 16/18] sdcard: add a 'uhs' property, update the OCR register ACCEPT_SWITCH_1V8 bit
  2018-01-25 10:30   ` Philippe Mathieu-Daudé
@ 2018-01-25 10:37     ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-25 10:37 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Igor Mitsyanko
  Cc: qemu-devel, Edgar E . Iglesias, Prasad J Pandit,
	Peter Crosthwaite, Andrzej Zaborowski

On 01/25/2018 07:30 AM, Philippe Mathieu-Daudé wrote:
> On 01/23/2018 12:30 AM, Philippe Mathieu-Daudé wrote:
>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>> ---
>>  hw/sd/sd.c | 4 ++++
>>  1 file changed, 4 insertions(+)
>>
>> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
>> index 27176ba33e..b3b6859bc4 100644
>> --- a/hw/sd/sd.c
>> +++ b/hw/sd/sd.c
>> @@ -93,6 +93,7 @@ struct SDState {
>>      /* Configurable properties */
>>      BlockBackend *blk;
>>      bool spi;
>> +    uint8_t uhs_supported;
>>  
>>      uint32_t mode;    /* current card mode, one of SDCardModes */
>>      int32_t state;    /* current card state, one of SDCardStates */
>> @@ -289,6 +290,8 @@ static void sd_reset_ocr(SDState *sd)
>>  {
>>      /* All voltages OK */
>>      sd->ocr = R_OCR_VDD_VOLTAGE_WIN_HI_MASK;
>> +
>> +    sd->ocr = FIELD_DP32(sd->ocr, OCR, ACCEPT_SWITCH_1V8, !!sd->uhs_supported);
> 
> This patch has to go after this series #17 "sdcard: implement the UHS-I
> SWITCH_FUNCTION entries (Spec v3)"

Also although the SD interface is working/tested, the MMC interface is
missing from this series, and UHS enabled MMC cards are not usable:

kernel: mmc0: SDHCI controller on PCI [0000:00:05.0] using ADMA
kernel: sd 0:0:0:0: Attached scsi generic sg0 type 0
kernel: mmc0: Skipping voltage switch
[mmc kthread looping]

> 
>>  }
>>  
>>  static void sd_ocr_powerup(void *opaque)
>> @@ -2107,6 +2110,7 @@ static Property sd_properties[] = {
>>       * board to ensure that ssi transfers only occur when the chip select
>>       * is asserted.  */
>>      DEFINE_PROP_BOOL("spi", SDState, spi, false),
>> +    DEFINE_PROP_UINT8("uhs", SDState, uhs_supported, UHS_NOT_SUPPORTED),
>>      DEFINE_PROP_END_OF_LIST()
>>  };
>>  
>>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 01/18] sdcard: Don't always set the high capacity bit
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 01/18] sdcard: Don't always set the high capacity bit Philippe Mathieu-Daudé
@ 2018-01-31 16:15   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-01-31 16:15 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Don't set the high capacity bit by default as it will be set if required
> in the sd_set_csd() function.
>
> [based on a patch from Alistair Francis <alistair.francis@xilinx.com>
>  and Peter Ogden <ogden@xilinx.com> from qemu/xilinx tag xilinx-v2015.4]
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 437ce25f79..20764451f2 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -289,6 +289,10 @@ static void sd_ocr_powerup(void *opaque)
>
>      /* card power-up OK */
>      sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_POWER_UP, 1);
> +
> +    if (sd->size > 1 * G_BYTE) {
> +        sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_CAPACITY, 1);
> +    }
>  }
>
>  static void sd_reset_scr(SDState *sd)
> @@ -393,7 +397,6 @@ static void sd_reset_csd(SDState *sd, uint64_t size)
>          sd->csd[13] = 0x40;
>          sd->csd[14] = 0x00;
>          sd->csd[15] = 0x00;
> -        sd->ocr |= 1 << 30;     /* High Capacity SD Memory Card */
>      }
>  }
>
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 02/18] sdcard: update the CSD CRC register regardless the CSD structure version
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 02/18] sdcard: update the CSD CRC register regardless the CSD structure version Philippe Mathieu-Daudé
@ 2018-01-31 16:16   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-01-31 16:16 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 20764451f2..f6318c6fdb 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -377,7 +377,6 @@ static void sd_reset_csd(SDState *sd, uint64_t size)
>          sd->csd[13] = 0x20 |   /* Max. write data block length */
>              ((HWBLOCK_SHIFT << 6) & 0xc0);
>          sd->csd[14] = 0x00;    /* File format group */
> -        sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
>      } else {                   /* SDHC */
>          size /= 512 * 1024;
>          size -= 1;
> @@ -396,8 +395,8 @@ static void sd_reset_csd(SDState *sd, uint64_t size)
>          sd->csd[12] = 0x0a;
>          sd->csd[13] = 0x40;
>          sd->csd[14] = 0x00;
> -        sd->csd[15] = 0x00;
>      }
> +    sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
>  }
>
>  static void sd_reset_rca(SDState *sd)
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 03/18] sdcard: fix the 'maximum data transfer rate' to 25MHz
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 03/18] sdcard: fix the 'maximum data transfer rate' to 25MHz Philippe Mathieu-Daudé
@ 2018-01-31 16:17   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-01-31 16:17 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> To comply with Spec v1.10 (and 2.00, 3.01):
>
> . TRAN_SPEED
>
> for current SD Memory Cards that field must be always 0_0110_010b (032h) which is
> equal to 25MHz - the mandatory maximum operating frequency of SD Memory Card.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index f6318c6fdb..56df5b660a 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -356,7 +356,7 @@ static void sd_reset_csd(SDState *sd, uint64_t size)
>          sd->csd[0] = 0x00;     /* CSD structure */
>          sd->csd[1] = 0x26;     /* Data read access-time-1 */
>          sd->csd[2] = 0x00;     /* Data read access-time-2 */
> -        sd->csd[3] = 0x5a;     /* Max. data transfer rate */
> +        sd->csd[3] = 0x32;  /* Max. data transfer rate: 25 MHz */
>          sd->csd[4] = 0x5f;     /* Card Command Classes */
>          sd->csd[5] = 0x50 |    /* Max. read data block length */
>              HWBLOCK_SHIFT;
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 04/18] sdcard: clean the SCR register and add few comments
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 04/18] sdcard: clean the SCR register and add few comments Philippe Mathieu-Daudé
@ 2018-01-31 16:18   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-01-31 16:18 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 56df5b660a..5d50d48097 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -297,10 +297,13 @@ static void sd_ocr_powerup(void *opaque)
>
>  static void sd_reset_scr(SDState *sd)
>  {
> -    sd->scr[0] = 0x00;         /* SCR Structure */
> -    sd->scr[1] = 0x2f;         /* SD Security Support */
> -    sd->scr[2] = 0x00;
> +    sd->scr[0] = (0 << 4)       /* SCR version 1.0 */
> +                 | 0;           /* Spec Versions 1.0 and 1.01 */
> +    sd->scr[1] = (2 << 4)       /* SDSC Card (Security Version 1.01) */
> +                 | 0b0101;      /* 1-bit or 4-bit width bus modes */
> +    sd->scr[2] = 0x00;          /* Extended Security is not supported. */
>      sd->scr[3] = 0x00;
> +    /* reserved for manufacturer usage */
>      sd->scr[4] = 0x00;
>      sd->scr[5] = 0x00;
>      sd->scr[6] = 0x00;
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 05/18] sdcard: remove commands from unsupported old MMC specification
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 05/18] sdcard: remove commands from unsupported old MMC specification Philippe Mathieu-Daudé
@ 2018-01-31 16:59   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-01-31 16:59 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> This device does not model MMCA Specification previous to v4.2
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 33 ---------------------------------
>  1 file changed, 33 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 5d50d48097..3c66521862 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -1044,24 +1044,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
>          }
>          break;
>
> -    case 11:   /* CMD11:  READ_DAT_UNTIL_STOP */
> -        if (sd->spi)
> -            goto bad_cmd;
> -        switch (sd->state) {
> -        case sd_transfer_state:
> -            sd->state = sd_sendingdata_state;
> -            sd->data_start = req.arg;
> -            sd->data_offset = 0;
> -
> -            if (sd->data_start + sd->blk_len > sd->size)
> -                sd->card_status |= ADDRESS_ERROR;
> -            return sd_r0;
> -
> -        default:
> -            break;
> -        }
> -        break;
> -
>      case 12:   /* CMD12:  STOP_TRANSMISSION */
>          switch (sd->state) {
>          case sd_sendingdata_state:
> @@ -1874,21 +1856,6 @@ uint8_t sd_read_data(SDState *sd)
>              sd->state = sd_transfer_state;
>          break;
>
> -    case 11:   /* CMD11:  READ_DAT_UNTIL_STOP */
> -        if (sd->data_offset == 0)
> -            BLK_READ_BLOCK(sd->data_start, io_len);
> -        ret = sd->data[sd->data_offset ++];
> -
> -        if (sd->data_offset >= io_len) {
> -            sd->data_start += io_len;
> -            sd->data_offset = 0;
> -            if (sd->data_start + io_len > sd->size) {
> -                sd->card_status |= ADDRESS_ERROR;
> -                break;
> -            }
> -        }
> -        break;
> -
>      case 13:   /* ACMD13: SD_STATUS */
>          ret = sd->sd_status[sd->data_offset ++];
>
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 07/18] sdcard: use the correct masked OCR in the R3 reply
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 07/18] sdcard: use the correct masked OCR in the R3 reply Philippe Mathieu-Daudé
@ 2018-01-31 17:01   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-01-31 17:01 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> use the registerfields API to access the OCR register
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 29 +++++++++++++++++++++++------
>  1 file changed, 23 insertions(+), 6 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 23f5d47782..ee381540aa 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -47,8 +47,6 @@
>
>  //#define DEBUG_SD 1
>
> -#define ACMD41_ENQUIRY_MASK     0x00ffffff
> -
>  typedef enum {
>      sd_r0 = 0,    /* no response */
>      sd_r1,        /* normal response command */
> @@ -271,13 +269,26 @@ static uint16_t sd_crc16(void *message, size_t width)
>
>  #define OCR_POWER_DELAY_NS      500000 /* 0.5ms */
>
> +FIELD(OCR, VDD_VOLTAGE_WINDOW,          0, 24)
> +FIELD(OCR, VDD_VOLTAGE_WIN_LO,          0,  8)
> +FIELD(OCR, DUAL_VOLTAGE_CARD,           7,  1)
> +FIELD(OCR, VDD_VOLTAGE_WIN_HI,          8, 16)
> +FIELD(OCR, ACCEPT_SWITCH_1V8,          24,  1) /* Only UHS-I */
> +FIELD(OCR, UHS_II_CARD,                29,  1) /* Only UHS-II */
>  FIELD(OCR, CARD_CAPACITY,              30,  1) /* 0:SDSC, 1:SDHC/SDXC */
>  FIELD(OCR, CARD_POWER_UP,              31,  1)
>
> +#define ACMD41_ENQUIRY_MASK     0x00ffffff
> +#define ACMD41_R3_MASK          (R_OCR_VDD_VOLTAGE_WIN_HI_MASK \
> +                               | R_OCR_ACCEPT_SWITCH_1V8_MASK \
> +                               | R_OCR_UHS_II_CARD_MASK \
> +                               | R_OCR_CARD_CAPACITY_MASK \
> +                               | R_OCR_CARD_POWER_UP_MASK)
> +
>  static void sd_reset_ocr(SDState *sd)
>  {
> -    /* All voltages OK, Standard Capacity SD Memory Card, not yet powered up */
> -    sd->ocr = 0x00ffff00;
> +    /* All voltages OK */
> +    sd->ocr = R_OCR_VDD_VOLTAGE_WIN_HI_MASK;
>  }
>
>  static void sd_ocr_powerup(void *opaque)
> @@ -450,7 +461,7 @@ static void sd_response_r1_make(SDState *sd, uint8_t *response)
>
>  static void sd_response_r3_make(SDState *sd, uint8_t *response)
>  {
> -    stl_be_p(response, sd->ocr);
> +    stl_be_p(response, sd->ocr & ACMD41_R3_MASK);
>  }
>
>  static void sd_response_r6_make(SDState *sd, uint8_t *response)
> @@ -1634,7 +1645,13 @@ send_response:
>      }
>
>  #ifdef DEBUG_SD
> -    qemu_hexdump((const char *)response, stderr, "Response", rsplen);
> +    if (rsplen) {
> +        int i;
> +        DPRINTF("Response:");
> +        for (i = 0; i < rsplen; i++)
> +            fprintf(stderr, " %02x", response[i]);
> +        fputc('\n', stderr);
> +    }
>  #endif
>
>      return rsplen;
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 09/18] sdcard: handles more commands in SPI mode
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 09/18] sdcard: handles more commands in SPI mode Philippe Mathieu-Daudé
@ 2018-02-01  0:11   ` Alistair Francis
  2018-02-01  7:39     ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 36+ messages in thread
From: Alistair Francis @ 2018-02-01  0:11 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  hw/sd/sd.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 54 insertions(+), 3 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 2eca999bc3..07424aa56e 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -1390,9 +1390,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
>
>      /* Application specific commands (Class 8) */
>      case 55:   /* CMD55:  APP_CMD */
> -        if (sd->rca != rca)
> -            return sd_r0;
> -
> +        if (!sd->spi) {
> +            if (sd->rca != rca) {
> +                return sd_r0;
> +            }
> +        }
>          sd->expecting_acmd = true;
>          sd->card_status |= APP_CMD;
>          return sd_r1;
> @@ -1412,6 +1414,18 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
>          }
>          break;
>
> +    case 58:    /* CMD58:   READ_OCR (SPI) */
> +        if (!sd->spi) {
> +            goto bad_cmd;
> +        }
> +        return sd_r3;
> +
> +    case 59:    /* CMD59:   CRC_ON_OFF (SPI) */
> +        if (!sd->spi) {
> +            goto bad_cmd;
> +        }
> +        goto unimplemented_cmd;
> +
>      default:
>      bad_cmd:
>          qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
> @@ -1436,6 +1450,9 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
>      sd->card_status |= APP_CMD;
>      switch (req.cmd) {
>      case 6:    /* ACMD6:  SET_BUS_WIDTH */
> +        if (sd->spi) {
> +            goto unimplemented_cmd;
> +        }
>          switch (sd->state) {
>          case sd_transfer_state:
>              sd->sd_status[0] &= 0x3f;
> @@ -1460,6 +1477,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
>          }
>          break;
>
> +    case 18:

These should all have a comment describing what they are and for the
others as well.

> +        if (sd->spi) {
> +            goto unimplemented_cmd;
> +        }
> +        break;
> +
>      case 22:   /* ACMD22: SEND_NUM_WR_BLOCKS */
>          switch (sd->state) {
>          case sd_transfer_state:
> @@ -1485,6 +1508,19 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
>          }
>          break;
>
> +    case 25:
> +    case 26:
> +        if (sd->spi) {
> +            goto unimplemented_cmd;
> +        }
> +        break;
> +
> +    case 38:
> +        if (sd->spi) {
> +            goto unimplemented_cmd;
> +        }
> +        break;
> +
>      case 41:   /* ACMD41: SD_APP_OP_COND */
>          if (sd->spi) {
>              /* SEND_OP_CMD */
> @@ -1542,6 +1578,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
>          }
>          break;
>
> +    case 43 ... 49:
> +        if (sd->spi) {
> +            goto unimplemented_cmd;
> +        }
> +        break;
> +
>      case 51:   /* ACMD51: SEND_SCR */
>          switch (sd->state) {
>          case sd_transfer_state:
> @@ -1555,9 +1597,18 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
>          }
>          break;
>
> +    case 55:    /* Not exist */
> +        break;
> +
>      default:
>          /* Fall back to standard commands.  */
>          return sd_normal_command(sd, req);
> +
> +    unimplemented_cmd:
> +        /* Commands that are recognised but not yet implemented in SPI mode.  */

This should be unimplemented_spi_cmd then, to be more clear.

Alistair

> +        qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
> +                      req.cmd);
> +        return sd_illegal;
>      }
>
>      qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 10/18] sdcard: handle CMD54 (SDIO)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 10/18] sdcard: handle CMD54 (SDIO) Philippe Mathieu-Daudé
@ 2018-02-01  0:12   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-02-01  0:12 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Linux uses it to poll the bus before polling for a card.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 07424aa56e..bbf9496e8a 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -1378,9 +1378,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
>          }
>          break;
>
> -    case 52:
> -    case 53:
> -        /* CMD52, CMD53: reserved for SDIO cards
> +    case 52 ... 54:
> +        /* CMD52, CMD53, CMD54: reserved for SDIO cards
>           * (see the SDIO Simplified Specification V2.0)
>           * Handle as illegal command but do not complain
>           * on stderr, as some OSes may use these in their
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 11/18] sdcard: check the card is in correct state for APP CMD (CMD55)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 11/18] sdcard: check the card is in correct state for APP CMD (CMD55) Philippe Mathieu-Daudé
@ 2018-02-01  0:27   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-02-01  0:27 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index bbf9496e8a..434d1fbc47 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -1389,6 +1389,14 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
>
>      /* Application specific commands (Class 8) */
>      case 55:   /* CMD55:  APP_CMD */
> +        switch (sd->state) {
> +        case sd_ready_state:
> +        case sd_identification_state:
> +        case sd_inactive_state:
> +            return sd_illegal;
> +        default:
> +            break;
> +        }
>          if (!sd->spi) {
>              if (sd->rca != rca) {
>                  return sd_r0;
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 12/18] sdcard: warn if host uses an incorrect address for APP CMD (CMD55)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 12/18] sdcard: warn if host uses an incorrect address " Philippe Mathieu-Daudé
@ 2018-02-01  0:27   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-02-01  0:27 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 434d1fbc47..b5c947df62 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -1394,6 +1394,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
>          case sd_identification_state:
>          case sd_inactive_state:
>              return sd_illegal;
> +        case sd_idle_state:
> +            if (rca) {
> +                qemu_log_mask(LOG_GUEST_ERROR,
> +                              "SD: illegal RCA 0x%04x for APP_CMD\n", req.cmd);
> +            }
>          default:
>              break;
>          }
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 13/18] sdcard: simplify SEND_IF_COND (CMD8)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 13/18] sdcard: simplify SEND_IF_COND (CMD8) Philippe Mathieu-Daudé
@ 2018-02-01  0:33   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-02-01  0:33 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> replace switch(single case) -> if()
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 26 +++++++++++---------------
>  1 file changed, 11 insertions(+), 15 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index b5c947df62..707c294169 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -1015,23 +1015,19 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
>
>      case 8:    /* CMD8:   SEND_IF_COND */
>          /* Physical Layer Specification Version 2.00 command */
> -        switch (sd->state) {
> -        case sd_idle_state:
> -            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;
> -            }
> -
> -            /* Accept.  */
> -            sd->vhs = req.arg;
> -            return sd_r7;
> -
> -        default:
> +        if (sd->state != sd_idle_state) {
>              break;
>          }
> -        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;
> +        }
> +
> +        /* Accept.  */
> +        sd->vhs = req.arg;
> +        return sd_r7;
>
>      case 9:    /* CMD9:   SEND_CSD */
>          switch (sd->state) {
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 18/18] sdcard: add an enum for the SD PHY Spec version
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 18/18] sdcard: add an enum for the SD PHY Spec version Philippe Mathieu-Daudé
@ 2018-02-01  0:41   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-02-01  0:41 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> So far this device intends to model the Spec v1.10
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 1f6c4ce2a4..9880a5d090 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -47,6 +47,11 @@
>
>  //#define DEBUG_SD 1
>
> +typedef enum {
> +    SD_PHY_SPEC_VER_1_10 = 110,
> +    SD_PHY_SPEC_VER_2_00 = 200, /* not yet supported */
> +} sd_phy_spec_ver_t;
> +
>  typedef enum {
>      sd_r0 = 0,    /* no response */
>      sd_r1,        /* normal response command */
> @@ -122,6 +127,7 @@ struct SDState {
>      qemu_irq inserted_cb;
>      QEMUTimer *ocr_power_timer;
>      const char *proto_name;
> +    int spec_version;
>      bool enable;
>      uint8_t dat_lines;
>      bool cmd_line;
> @@ -2191,6 +2197,7 @@ static void sd_realize(DeviceState *dev, Error **errp)
>      int ret;
>
>      sd->proto_name = sd->spi ? "SPI" : "SD";
> +    sd->spec_version = SD_PHY_SPEC_VER_1_10;
>
>      if (sd->blk && blk_is_read_only(sd->blk)) {
>          error_setg(errp, "Cannot use read-only drive as SD card");
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 09/18] sdcard: handles more commands in SPI mode
  2018-02-01  0:11   ` Alistair Francis
@ 2018-02-01  7:39     ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-02-01  7:39 UTC (permalink / raw)
  To: Alistair Francis
  Cc: Peter Maydell, Igor Mitsyanko, Edgar E . Iglesias,
	Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On 01/31/2018 09:11 PM, Alistair Francis wrote:
> On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>> ---
>>  hw/sd/sd.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
>>  1 file changed, 54 insertions(+), 3 deletions(-)
>>
>> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
>> index 2eca999bc3..07424aa56e 100644
>> --- a/hw/sd/sd.c
>> +++ b/hw/sd/sd.c
>> @@ -1390,9 +1390,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
>>
>>      /* Application specific commands (Class 8) */
>>      case 55:   /* CMD55:  APP_CMD */
>> -        if (sd->rca != rca)
>> -            return sd_r0;
>> -
>> +        if (!sd->spi) {
>> +            if (sd->rca != rca) {
>> +                return sd_r0;
>> +            }
>> +        }
>>          sd->expecting_acmd = true;
>>          sd->card_status |= APP_CMD;
>>          return sd_r1;
>> @@ -1412,6 +1414,18 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
>>          }
>>          break;
>>
>> +    case 58:    /* CMD58:   READ_OCR (SPI) */
>> +        if (!sd->spi) {
>> +            goto bad_cmd;
>> +        }
>> +        return sd_r3;
>> +
>> +    case 59:    /* CMD59:   CRC_ON_OFF (SPI) */
>> +        if (!sd->spi) {
>> +            goto bad_cmd;
>> +        }
>> +        goto unimplemented_cmd;
>> +
>>      default:
>>      bad_cmd:
>>          qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
>> @@ -1436,6 +1450,9 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
>>      sd->card_status |= APP_CMD;
>>      switch (req.cmd) {
>>      case 6:    /* ACMD6:  SET_BUS_WIDTH */
>> +        if (sd->spi) {
>> +            goto unimplemented_cmd;
>> +        }
>>          switch (sd->state) {
>>          case sd_transfer_state:
>>              sd->sd_status[0] &= 0x3f;
>> @@ -1460,6 +1477,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
>>          }
>>          break;
>>
>> +    case 18:
> 
> These should all have a comment describing what they are and for the
> others as well.

This is backported from a patch of you or Peter Crosthwaite =)

I'll check the specs and add documentation.

> 
>> +        if (sd->spi) {
>> +            goto unimplemented_cmd;
>> +        }
>> +        break;
>> +
>>      case 22:   /* ACMD22: SEND_NUM_WR_BLOCKS */
>>          switch (sd->state) {
>>          case sd_transfer_state:
>> @@ -1485,6 +1508,19 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
>>          }
>>          break;
>>
>> +    case 25:
>> +    case 26:
>> +        if (sd->spi) {
>> +            goto unimplemented_cmd;
>> +        }
>> +        break;
>> +
>> +    case 38:
>> +        if (sd->spi) {
>> +            goto unimplemented_cmd;
>> +        }
>> +        break;
>> +
>>      case 41:   /* ACMD41: SD_APP_OP_COND */
>>          if (sd->spi) {
>>              /* SEND_OP_CMD */
>> @@ -1542,6 +1578,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
>>          }
>>          break;
>>
>> +    case 43 ... 49:
>> +        if (sd->spi) {
>> +            goto unimplemented_cmd;
>> +        }
>> +        break;
>> +
>>      case 51:   /* ACMD51: SEND_SCR */
>>          switch (sd->state) {
>>          case sd_transfer_state:
>> @@ -1555,9 +1597,18 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
>>          }
>>          break;
>>
>> +    case 55:    /* Not exist */
>> +        break;
>> +
>>      default:
>>          /* Fall back to standard commands.  */
>>          return sd_normal_command(sd, req);
>> +
>> +    unimplemented_cmd:
>> +        /* Commands that are recognised but not yet implemented in SPI mode.  */
> 
> This should be unimplemented_spi_cmd then, to be more clear.

Good idea.

> 
> Alistair
> 
>> +        qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
>> +                      req.cmd);
>> +        return sd_illegal;
>>      }
>>
>>      qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
>> --
>> 2.15.1
>>
>>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 14/18] sdcard: simplify SD_SEND_OP_COND (ACMD41)
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 14/18] sdcard: simplify SD_SEND_OP_COND (ACMD41) Philippe Mathieu-Daudé
@ 2018-02-02  0:55   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-02-02  0:55 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> replace switch(single case) -> if()
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 56 ++++++++++++++++++++++++++------------------------------
>  1 file changed, 26 insertions(+), 30 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 707c294169..6efcacb942 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -1535,45 +1535,41 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
>              sd->state = sd_transfer_state;
>              return sd_r1;
>          }
> -        switch (sd->state) {
> -        case sd_idle_state:
> -            /* If it's the first ACMD41 since reset, we need to decide
> -             * whether to power up. If this is not an enquiry ACMD41,
> -             * we immediately report power on and proceed below to the
> -             * ready state, but if it is, we set a timer to model a
> -             * delay for power up. This works around a bug in EDK2
> -             * UEFI, which sends an initial enquiry ACMD41, but
> -             * assumes that the card is in ready state as soon as it
> -             * sees the power up bit set. */
> -            if (!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)) {
> -                if ((req.arg & ACMD41_ENQUIRY_MASK) != 0) {
> -                    timer_del(sd->ocr_power_timer);
> -                    sd_ocr_powerup(sd);
> -                } else {
> -                    trace_sdcard_inquiry_cmd41();
> -                    if (!timer_pending(sd->ocr_power_timer)) {
> -                        timer_mod_ns(sd->ocr_power_timer,
> -                                     (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)
> -                                      + OCR_POWER_DELAY_NS));
> -                    }
> +        if (sd->state != sd_idle_state) {
> +            break;
> +        }
> +        /* If it's the first ACMD41 since reset, we need to decide
> +         * whether to power up. If this is not an enquiry ACMD41,
> +         * we immediately report power on and proceed below to the
> +         * ready state, but if it is, we set a timer to model a
> +         * delay for power up. This works around a bug in EDK2
> +         * UEFI, which sends an initial enquiry ACMD41, but
> +         * assumes that the card is in ready state as soon as it
> +         * sees the power up bit set. */
> +        if (!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)) {
> +            if ((req.arg & ACMD41_ENQUIRY_MASK) != 0) {
> +                timer_del(sd->ocr_power_timer);
> +                sd_ocr_powerup(sd);
> +            } else {
> +                trace_sdcard_inquiry_cmd41();
> +                if (!timer_pending(sd->ocr_power_timer)) {
> +                    timer_mod_ns(sd->ocr_power_timer,
> +                                 (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)
> +                                  + OCR_POWER_DELAY_NS));
>                  }
>              }
> +        }
>
> +        if (FIELD_EX32(sd->ocr & req.arg, OCR, VDD_VOLTAGE_WINDOW)) {
>              /* We accept any voltage.  10000 V is nothing.
>               *
>               * Once we're powered up, we advance straight to ready state
>               * unless it's an enquiry ACMD41 (bits 23:0 == 0).
>               */
> -            if (req.arg & ACMD41_ENQUIRY_MASK) {
> -                sd->state = sd_ready_state;
> -            }
> -
> -            return sd_r3;
> -
> -        default:
> -            break;
> +            sd->state = sd_ready_state;
>          }
> -        break;
> +
> +        return sd_r3;
>
>      case 42:   /* ACMD42: SET_CLR_CARD_DETECT */
>          switch (sd->state) {
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 06/18] sdcard: simplify using the ldst API
  2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 06/18] sdcard: simplify using the ldst API Philippe Mathieu-Daudé
@ 2018-02-08 23:46   ` Alistair Francis
  0 siblings, 0 replies; 36+ messages in thread
From: Alistair Francis @ 2018-02-08 23:46 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
	qemu-devel@nongnu.org Developers

On Mon, Jan 22, 2018 at 7:30 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> the code is easier to review/refactor.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>

Alistair

> ---
>  hw/sd/sd.c | 38 +++++++++-----------------------------
>  1 file changed, 9 insertions(+), 29 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 3c66521862..23f5d47782 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -435,57 +435,39 @@ static int sd_req_crc_validate(SDRequest *req)
>  {
>      uint8_t buffer[5];
>      buffer[0] = 0x40 | req->cmd;
> -    buffer[1] = (req->arg >> 24) & 0xff;
> -    buffer[2] = (req->arg >> 16) & 0xff;
> -    buffer[3] = (req->arg >> 8) & 0xff;
> -    buffer[4] = (req->arg >> 0) & 0xff;
> +    stl_be_p(&buffer[1], req->arg);
>      return 0;
>      return sd_crc7(buffer, 5) != req->crc;     /* TODO */
>  }
>
>  static void sd_response_r1_make(SDState *sd, uint8_t *response)
>  {
> -    uint32_t status = sd->card_status;
> +    stl_be_p(response, sd->card_status);
> +
>      /* Clear the "clear on read" status bits */
>      sd->card_status &= ~CARD_STATUS_C;
> -
> -    response[0] = (status >> 24) & 0xff;
> -    response[1] = (status >> 16) & 0xff;
> -    response[2] = (status >> 8) & 0xff;
> -    response[3] = (status >> 0) & 0xff;
>  }
>
>  static void sd_response_r3_make(SDState *sd, uint8_t *response)
>  {
> -    response[0] = (sd->ocr >> 24) & 0xff;
> -    response[1] = (sd->ocr >> 16) & 0xff;
> -    response[2] = (sd->ocr >> 8) & 0xff;
> -    response[3] = (sd->ocr >> 0) & 0xff;
> +    stl_be_p(response, sd->ocr);
>  }
>
>  static void sd_response_r6_make(SDState *sd, uint8_t *response)
>  {
> -    uint16_t arg;
>      uint16_t status;
>
> -    arg = sd->rca;
>      status = ((sd->card_status >> 8) & 0xc000) |
>               ((sd->card_status >> 6) & 0x2000) |
>                (sd->card_status & 0x1fff);
>      sd->card_status &= ~(CARD_STATUS_C & 0xc81fff);
> -
> -    response[0] = (arg >> 8) & 0xff;
> -    response[1] = arg & 0xff;
> -    response[2] = (status >> 8) & 0xff;
> -    response[3] = status & 0xff;
> +    stw_be_p(response + 0, sd->rca);
> +    stw_be_p(response + 2, status);
>  }
>
>  static void sd_response_r7_make(SDState *sd, uint8_t *response)
>  {
> -    response[0] = (sd->vhs >> 24) & 0xff;
> -    response[1] = (sd->vhs >> 16) & 0xff;
> -    response[2] = (sd->vhs >>  8) & 0xff;
> -    response[3] = (sd->vhs >>  0) & 0xff;
> +    stl_be_p(response, sd->vhs);
>  }
>
>  static inline uint64_t sd_addr_to_wpnum(uint64_t addr)
> @@ -731,7 +713,7 @@ static uint32_t sd_wpbits(SDState *sd, uint64_t addr)
>
>  static void sd_function_switch(SDState *sd, uint32_t arg)
>  {
> -    int i, mode, new_func, crc;
> +    int i, mode, new_func;
>      mode = !!(arg & 0x80000000);
>
>      sd->data[0] = 0x00;                /* Maximum current consumption */
> @@ -755,9 +737,7 @@ static void sd_function_switch(SDState *sd, uint32_t arg)
>          sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
>      }
>      memset(&sd->data[17], 0, 47);
> -    crc = sd_crc16(sd->data, 64);
> -    sd->data[65] = crc >> 8;
> -    sd->data[66] = crc & 0xff;
> +    stw_be_p(sd->data + 65, sd_crc16(sd->data, 64));
>  }
>
>  static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
> --
> 2.15.1
>
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

end of thread, other threads:[~2018-02-08 23:46 UTC | newest]

Thread overview: 36+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-23  3:30 [Qemu-devel] [PATCH v3 00/18] SDCard: bugfixes, support UHS-I (part 5) Philippe Mathieu-Daudé
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 01/18] sdcard: Don't always set the high capacity bit Philippe Mathieu-Daudé
2018-01-31 16:15   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 02/18] sdcard: update the CSD CRC register regardless the CSD structure version Philippe Mathieu-Daudé
2018-01-31 16:16   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 03/18] sdcard: fix the 'maximum data transfer rate' to 25MHz Philippe Mathieu-Daudé
2018-01-31 16:17   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 04/18] sdcard: clean the SCR register and add few comments Philippe Mathieu-Daudé
2018-01-31 16:18   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 05/18] sdcard: remove commands from unsupported old MMC specification Philippe Mathieu-Daudé
2018-01-31 16:59   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 06/18] sdcard: simplify using the ldst API Philippe Mathieu-Daudé
2018-02-08 23:46   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 07/18] sdcard: use the correct masked OCR in the R3 reply Philippe Mathieu-Daudé
2018-01-31 17:01   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 08/18] sdcard: use the registerfields API for the CARD_STATUS register masks Philippe Mathieu-Daudé
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 09/18] sdcard: handles more commands in SPI mode Philippe Mathieu-Daudé
2018-02-01  0:11   ` Alistair Francis
2018-02-01  7:39     ` Philippe Mathieu-Daudé
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 10/18] sdcard: handle CMD54 (SDIO) Philippe Mathieu-Daudé
2018-02-01  0:12   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 11/18] sdcard: check the card is in correct state for APP CMD (CMD55) Philippe Mathieu-Daudé
2018-02-01  0:27   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 12/18] sdcard: warn if host uses an incorrect address " Philippe Mathieu-Daudé
2018-02-01  0:27   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 13/18] sdcard: simplify SEND_IF_COND (CMD8) Philippe Mathieu-Daudé
2018-02-01  0:33   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 14/18] sdcard: simplify SD_SEND_OP_COND (ACMD41) Philippe Mathieu-Daudé
2018-02-02  0:55   ` Alistair Francis
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 15/18] sdcard: add SD SEND_TUNING_BLOCK (CMD19) Philippe Mathieu-Daudé
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 16/18] sdcard: add a 'uhs' property, update the OCR register ACCEPT_SWITCH_1V8 bit Philippe Mathieu-Daudé
2018-01-25 10:30   ` Philippe Mathieu-Daudé
2018-01-25 10:37     ` Philippe Mathieu-Daudé
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 17/18] sdcard: implement the UHS-I SWITCH_FUNCTION entries (Spec v3) Philippe Mathieu-Daudé
2018-01-23  3:30 ` [Qemu-devel] [PATCH v3 18/18] sdcard: add an enum for the SD PHY Spec version Philippe Mathieu-Daudé
2018-02-01  0:41   ` Alistair Francis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).