All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests
@ 2018-01-08 15:42 Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 01/31] sdhci: add a spec_version property Philippe Mathieu-Daudé
                   ` (29 more replies)
  0 siblings, 30 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Since v4 ("SDHCI: add qtests and fix few issues"):
- spec_version default to v2 (current behaviour)
- addressed Alistair review (no v1, tell user about valid version)
- generic-sdhci is now abstract, added more sdhci device following Linux
  Device Tree names:
  - hw/arm/fsl-imx6: "fsl,imx6q-usdhc"
  - hw/arm/exynos4210: "samsung,exynos4210-dw-mshc"
  - hw/arm/bcm2835_peripherals: "brcm,bcm2835-sdhci"
  - hw/arm/xilinx_zynq: "arasan,sdhci-4.9a"
  - hw/arm/xilinx_zynqmp: "arasan,sdhci-8.9a"

Since v3:
- no change, but split back in 2 series, 1st part is "SDHCI: housekeeping v5",
Based-on: 20180103180805.18140-18-f4bug@amsat.org

Since v2:
- more detailed 'capabilities', all boards converted to use these properties
- since all qtests pass, removed the previous 'capareg' property
- added Stefan/Alistair R-b
- corrected 'access' LED behavior (Alistair's review)
- more uses of the registerfields API
- remove some dead code
- cosmetix:
  - added more comments
  - renamed a pair of registers
  - reordered few struct members

Note, the bcm2835 seems to have 1KB minimum blocksize, however the current
model is implemented with 512B. I didn't change the current value.

Since v1:
- addressed Alistair Francis review comments, added some R-b
- only move register defines to "sd-internal.h"
- fixed deposit64() arguments
- dropped unuseful s->fifo_buffer = NULL
- use a qemu_irq for the LED, restrict the logging to ON/OFF
- fixed a trace format string error
- included Andrey Smirnov ACMD12ERRSTS write patch
- dropped few unuseful patches, and separate the Python polemical ones for later

>From the "SDHCI housekeeping" series:
- 1: we restrict part of "sd/sd.h" into local "sd-internal.h",
- 2,3: we somehow beautiful the code, no logical changes,
- 4-7: we refactor the common sysbus/pci qdev code,
- 8-10: we add plenty of trace events which will result useful later,
- 11: we finally expose a "dma-memory" property.
>From the "SDHCI: add a qtest and fix few issues" series:
- 12,13: fix registers
- 14,15: boards can specify which SDHCI Spec to use (v2 and v3 so far)
- 15-20: HCI qtest

Regards,

Phil.

[----] : patches are identical
[####] : number of functional differences between upstream/downstream patch
[down] : patch is downstream-only
The flags [FC] indicate (F)unctional and (C)ontextual differences, respectively

001/31:[0006] [FC] 'sdhci: add a spec_version property'
002/31:[----] [-C] 'sdhci: add basic Spec v1 capabilities'
003/31:[----] [-C] 'sdhci: add max-block-length capability (Spec v1)'
004/31:[0002] [FC] 'sdhci: add clock capabilities (Spec v1)'
005/31:[----] [--] 'sdhci: add DMA and 64-bit capabilities (Spec v2)'
006/31:[----] [--] 'sdhci: add BLOCK_SIZE_MASK for DMA'
007/31:[----] [--] 'sdhci: Fix 64-bit ADMA2'
008/31:[down] 'hw/sd: clean/reorder the Makefile adding few comments'
009/31:[down] 'sdhci: add a common class'
010/31:[down] 'sdhci: add a Designware/Samsung host controller'
011/31:[down] 'hw/arm/exynos4210: use the "samsung,exynos4210-dw-mshc" device'
012/31:[down] 'sdhci: add the generic Arasan SDHCI 4.9a PHY controller'
013/31:[down] 'hw/arm/xilinx_zynq: use the "arasan,sdhci-4.9a" device'
014/31:[----] [--] 'sdhci: add qtest to check the SD Spec version'
015/31:[----] [--] 'sdhci: check Spec v2 capabilities qtest'
016/31:[0007] [FC] 'sdhci: add v3 capabilities'
017/31:[----] [--] 'sdhci: rename the hostctl1 register'
018/31:[down] 'sdhci: add the Broadcom BCM2835 SDHCI controller'
019/31:[down] 'hw/arm/bcm2835_peripherals: use the "brcm,bcm2835-sdhci" device'
020/31:[down] 'sdhci: add the Freescale controller for i.MX'
021/31:[down] 'hw/arm/fsl-imx6: use the "fsl,imx6q-usdhc" controller'
022/31:[down] 'sdhci: add the generic Arasan SDHCI 8.9a PHY'
023/31:[down] 'hw/arm/xilinx_zynqmp: use the "arasan,sdhci-8.9a" device'
024/31:[down] 'sdhci: let the SYSBUS_SDHCI type be abstract'
025/31:[----] [--] 'sdhci: check Spec v3 capabilities qtest'
026/31:[----] [-C] 'sdhci: remove the deprecated 'capareg' property'
027/31:[----] [--] 'sdhci: add check_capab_readonly() qtest'
028/31:[----] [--] 'sdhci: add a check_capab_baseclock() qtest'
029/31:[----] [--] 'sdhci: add a check_capab_sdma() qtest'
030/31:[----] [--] 'sdhci: add a check_capab_v3() qtest'
031/31:[----] [--] 'sdhci: add Spec v4.2 register definitions'

Philippe Mathieu-Daudé (30):
  sdhci: add a spec_version property
  sdhci: add basic Spec v1 capabilities
  sdhci: add max-block-length capability (Spec v1)
  sdhci: add clock capabilities (Spec v1)
  sdhci: add DMA and 64-bit capabilities (Spec v2)
  sdhci: add BLOCK_SIZE_MASK for DMA
  hw/sd: clean/reorder the Makefile adding few comments
  sdhci: add a common class
  sdhci: add a Designware/Samsung host controller
  hw/arm/exynos4210: use the "samsung,exynos4210-dw-mshc" device
  sdhci: add the generic Arasan SDHCI 4.9a PHY controller
  hw/arm/xilinx_zynq: use the "arasan,sdhci-4.9a" device
  sdhci: add qtest to check the SD Spec version
  sdhci: check Spec v2 capabilities qtest
  sdhci: add v3 capabilities
  sdhci: rename the hostctl1 register
  sdhci: add the Broadcom BCM2835 SDHCI controller
  hw/arm/bcm2835_peripherals: use the "brcm,bcm2835-sdhci" device
  sdhci: add the Freescale controller for i.MX
  hw/arm/fsl-imx6: use the "fsl,imx6q-usdhc" controller
  sdhci: add the generic Arasan SDHCI 8.9a PHY
  hw/arm/xilinx_zynqmp: use the "arasan,sdhci-8.9a" device
  sdhci: let the SYSBUS_SDHCI type be abstract
  sdhci: check Spec v3 capabilities qtest
  sdhci: remove the deprecated 'capareg' property
  sdhci: add check_capab_readonly() qtest
  sdhci: add a check_capab_baseclock() qtest
  sdhci: add a check_capab_sdma() qtest
  sdhci: add a check_capab_v3() qtest
  sdhci: add Spec v4.2 register definitions

Sai Pavan Boddu (1):
  sdhci: Fix 64-bit ADMA2

 include/hw/sd/sdhci.h        |  32 +++++-
 hw/sd/sdhci-internal.h       |  70 +++++++++++--
 hw/arm/bcm2835_peripherals.c |  19 +---
 hw/arm/exynos4210.c          |  12 +--
 hw/arm/fsl-imx6.c            |   2 +-
 hw/arm/xilinx_zynq.c         |  41 +++-----
 hw/arm/xlnx-zynqmp.c         |   2 +-
 hw/sd/arasan_sdhci.c         | 124 ++++++++++++++++++++++
 hw/sd/bcm2835_sdhci.c        |  77 ++++++++++++++
 hw/sd/dw-mshc.c              |  64 ++++++++++++
 hw/sd/fsl-sdhc.c             |  58 +++++++++++
 hw/sd/sdhci.c                | 240 ++++++++++++++++++++++++++-----------------
 hw/sd/Makefile.objs          |  14 ++-
 tests/sdhci-test.c           | 177 +++++++++++++++++++++++++++++++
 tests/Makefile.include       |   3 +
 15 files changed, 774 insertions(+), 161 deletions(-)
 create mode 100644 hw/sd/arasan_sdhci.c
 create mode 100644 hw/sd/bcm2835_sdhci.c
 create mode 100644 hw/sd/dw-mshc.c
 create mode 100644 hw/sd/fsl-sdhc.c
 create mode 100644 tests/sdhci-test.c

-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 01/31] sdhci: add a spec_version property
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 21:41   ` Alistair Francis
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 02/31] sdhci: add basic Spec v1 capabilities Philippe Mathieu-Daudé
                   ` (28 subsequent siblings)
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

default to Spec v2.00

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sdhci-internal.h |  4 ++--
 include/hw/sd/sdhci.h  |  3 +++
 hw/sd/sdhci.c          | 19 +++++++++++++++++--
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
index b7475a1b7b..cf4a055159 100644
--- a/hw/sd/sdhci-internal.h
+++ b/hw/sd/sdhci-internal.h
@@ -212,9 +212,9 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
 /* Slot interrupt status */
 #define SDHC_SLOT_INT_STATUS            0xFC
 
-/* HWInit Host Controller Version Register 0x0401 */
+/* HWInit Host Controller Version Register */
 #define SDHC_HCVER                      0xFE
-#define SD_HOST_SPECv2_VERS             0x2401
+#define SDHC_HCVER_VENDOR               0x24
 
 #define SDHC_REGISTERS_MAP_SIZE         0x100
 #define SDHC_INSERTION_DELAY            (NANOSECONDS_PER_SECOND)
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index 2aea20f1d8..ddd5040410 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -91,6 +91,8 @@ typedef struct SDHCIState {
     uint64_t capareg;      /* Capabilities Register */
     /* 0x48 */
     uint64_t maxcurr;      /* Maximum Current Capabilities Register */
+    /* 0xfe */
+    uint16_t version;      /* Host Controller Version Register */
 
     uint8_t  *fifo_buffer; /* SD host i/o FIFO buffer */
     uint32_t buf_maxsz;
@@ -99,6 +101,7 @@ typedef struct SDHCIState {
     bool     pending_insert_state;
     /* Configurable properties */
     bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
+    uint8_t spec_version;
 } SDHCIState;
 
 #define TYPE_PCI_SDHCI "sdhci-pci"
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index b080950f80..cd4a8efdd7 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -169,7 +169,8 @@ static void sdhci_reset(SDHCIState *s)
 
     timer_del(s->insert_timer);
     timer_del(s->transfer_timer);
-    /* Set all registers to 0. Capabilities registers are not cleared
+
+    /* Set all registers to 0. Capabilities/Version registers are not cleared
      * and assumed to always preserve their value, given to them during
      * initialization */
     memset(&s->sdmasysad, 0, (uintptr_t)&s->capareg - (uintptr_t)&s->sdmasysad);
@@ -923,7 +924,7 @@ static uint64_t sdhci_read(void *opaque, hwaddr offset, unsigned size)
         ret = (uint32_t)(s->admasysaddr >> 32);
         break;
     case SDHC_SLOT_INT_STATUS:
-        ret = (SD_HOST_SPECv2_VERS << 16) | sdhci_slotint(s);
+        ret = (s->version << 16) | sdhci_slotint(s);
         break;
     default:
         qemu_log_mask(LOG_UNIMP, "SDHC rd_%ub @0x%02" HWADDR_PRIx " "
@@ -1178,6 +1179,15 @@ static inline unsigned int sdhci_get_fifolen(SDHCIState *s)
     }
 }
 
+static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
+{
+    if (s->spec_version != 2) {
+        error_setg(errp, "Only Spec v2 is supported");
+        return;
+    }
+    s->version = (SDHC_HCVER_VENDOR << 8) | (s->spec_version - 1);
+}
+
 static void sdhci_initfn(SDHCIState *s)
 {
     qbus_create_inplace(&s->sdbus, sizeof(s->sdbus),
@@ -1190,6 +1200,10 @@ static void sdhci_initfn(SDHCIState *s)
 
 static void sdhci_common_realize(SDHCIState *s, Error **errp)
 {
+    sdhci_init_readonly_registers(s, errp);
+    if (errp && *errp) {
+        return;
+    }
     s->buf_maxsz = sdhci_get_fifolen(s);
     s->fifo_buffer = g_malloc0(s->buf_maxsz);
 
@@ -1290,6 +1304,7 @@ const VMStateDescription sdhci_vmstate = {
 /* Capabilities registers provide information on supported features of this
  * specific host controller implementation */
 static Property sdhci_properties[] = {
+    DEFINE_PROP_UINT8("sd-spec-version", SDHCIState, spec_version, 2),
     DEFINE_PROP_UINT64("capareg", SDHCIState, capareg,
             SDHC_CAPAB_REG_DEFAULT),
     DEFINE_PROP_UINT64("maxcurr", SDHCIState, maxcurr, 0),
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 02/31] sdhci: add basic Spec v1 capabilities
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 01/31] sdhci: add a spec_version property Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 22:00   ` Alistair Francis
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 03/31] sdhci: add max-block-length capability (Spec v1) Philippe Mathieu-Daudé
                   ` (27 subsequent siblings)
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sdhci-internal.h | 22 ++++++++++++++++++-
 include/hw/sd/sdhci.h  |  6 ++++++
 hw/sd/sdhci.c          | 58 ++++++++++++++++++++++++++++++++++++--------------
 3 files changed, 69 insertions(+), 17 deletions(-)

diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
index cf4a055159..6944fcaf00 100644
--- a/hw/sd/sdhci-internal.h
+++ b/hw/sd/sdhci-internal.h
@@ -86,6 +86,9 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
 
 /* R/W Host control Register 0x0 */
 #define SDHC_HOSTCTL                   0x28
+FIELD(SDHC_HOSTCTL, LED_CTRL,          0, 1);
+FIELD(SDHC_HOSTCTL, DATATRANSFERWIDTH, 1, 1); /* SD mode only */
+FIELD(SDHC_HOSTCTL, HIGH_SPEED,        2, 1);
 #define SDHC_CTRL_DMA_CHECK_MASK       0x18
 #define SDHC_CTRL_SDMA                 0x00
 #define SDHC_CTRL_ADMA1_32             0x08
@@ -96,6 +99,7 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
 /* R/W Power Control Register 0x0 */
 #define SDHC_PWRCON                    0x29
 #define SDHC_POWER_ON                  (1 << 0)
+FIELD(SDHC_PWRCON, BUS_VOLTAGE,        1, 3);
 
 /* R/W Block Gap Control Register 0x0 */
 #define SDHC_BLKGAP                    0x2A
@@ -118,6 +122,7 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
 
 /* R/W Timeout Control Register 0x0 */
 #define SDHC_TIMEOUTCON                0x2E
+FIELD(SDHC_TIMEOUTCON, COUNTER,        0, 4);
 
 /* R/W Software Reset Register 0x0 */
 #define SDHC_SWRST                     0x2F
@@ -174,17 +179,32 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
 
 /* ROC Auto CMD12 error status register 0x0 */
 #define SDHC_ACMD12ERRSTS              0x3C
+FIELD(SDHC_ACMD12ERRSTS, TIMEOUT_ERR,  1, 1);
+FIELD(SDHC_ACMD12ERRSTS, CRC_ERR,      2, 1);
+FIELD(SDHC_ACMD12ERRSTS, INDEX_ERR,    4, 1);
 
 /* HWInit Capabilities Register 0x05E80080 */
 #define SDHC_CAPAB                     0x40
-#define SDHC_CAN_DO_DMA                0x00400000
 #define SDHC_CAN_DO_ADMA2              0x00080000
 #define SDHC_CAN_DO_ADMA1              0x00100000
 #define SDHC_64_BIT_BUS_SUPPORT        (1 << 28)
 #define SDHC_CAPAB_BLOCKSIZE(x)        (((x) >> 16) & 0x3)
+FIELD(SDHC_CAPAB, TOCLKFREQ,           0, 6);
+FIELD(SDHC_CAPAB, TOUNIT,              7, 1);
+FIELD(SDHC_CAPAB, BASECLKFREQ,         8, 8);
+FIELD(SDHC_CAPAB, MAXBLOCKLENGTH,     16, 2);
+FIELD(SDHC_CAPAB, HIGHSPEED,          21, 1);
+FIELD(SDHC_CAPAB, SDMA,               22, 1);
+FIELD(SDHC_CAPAB, SUSPRESUME,         23, 1);
+FIELD(SDHC_CAPAB, V33,                24, 1);
+FIELD(SDHC_CAPAB, V30,                25, 1);
+FIELD(SDHC_CAPAB, V18,                26, 1);
 
 /* HWInit Maximum Current Capabilities Register 0x0 */
 #define SDHC_MAXCURR                   0x48
+FIELD(SDHC_MAXCURR, V33_VDD1,          0, 8);
+FIELD(SDHC_MAXCURR, V30_VDD1,          8, 8);
+FIELD(SDHC_MAXCURR, V18_VDD1,         16, 8);
 
 /* W Force Event Auto CMD12 Error Interrupt Register 0x0000 */
 #define SDHC_FEAER                     0x50
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index ddd5040410..266030dc8d 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -102,6 +102,12 @@ typedef struct SDHCIState {
     /* Configurable properties */
     bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
     uint8_t spec_version;
+    struct {
+        bool suspend;
+        bool high_speed;
+        bool sdma;
+        bool v33, v30, v18;
+    } cap;
 } SDHCIState;
 
 #define TYPE_PCI_SDHCI "sdhci-pci"
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index cd4a8efdd7..e7dbab2fdc 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -44,12 +44,6 @@
  * 0 - not supported, 1 - supported, other - prohibited.
  */
 #define SDHC_CAPAB_64BITBUS       0ul        /* 64-bit System Bus Support */
-#define SDHC_CAPAB_18V            1ul        /* Voltage support 1.8v */
-#define SDHC_CAPAB_30V            0ul        /* Voltage support 3.0v */
-#define SDHC_CAPAB_33V            1ul        /* Voltage support 3.3v */
-#define SDHC_CAPAB_SUSPRESUME     0ul        /* Suspend/resume support */
-#define SDHC_CAPAB_SDMA           1ul        /* SDMA support */
-#define SDHC_CAPAB_HIGHSPEED      1ul        /* High speed support */
 #define SDHC_CAPAB_ADMA1          1ul        /* ADMA1 support */
 #define SDHC_CAPAB_ADMA2          1ul        /* ADMA2 support */
 /* Maximum host controller R/W buffers size
@@ -63,9 +57,7 @@
 #define SDHC_CAPAB_TOCLKFREQ      52ul
 
 /* Now check all parameters and calculate CAPABILITIES REGISTER value */
-#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_18V > 1 || SDHC_CAPAB_30V > 1 ||     \
-    SDHC_CAPAB_33V > 1 || SDHC_CAPAB_SUSPRESUME > 1 || SDHC_CAPAB_SDMA > 1 ||  \
-    SDHC_CAPAB_HIGHSPEED > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1 ||\
+#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1 || \
     SDHC_CAPAB_TOUNIT > 1
 #error Capabilities features can have value 0 or 1 only!
 #endif
@@ -90,16 +82,33 @@
 #endif
 
 #define SDHC_CAPAB_REG_DEFAULT                                 \
-   ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_18V << 26) |     \
-    (SDHC_CAPAB_30V << 25) | (SDHC_CAPAB_33V << 24) |          \
-    (SDHC_CAPAB_SUSPRESUME << 23) | (SDHC_CAPAB_SDMA << 22) |  \
-    (SDHC_CAPAB_HIGHSPEED << 21) | (SDHC_CAPAB_ADMA1 << 20) |  \
+   ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_ADMA1 << 20) |   \
     (SDHC_CAPAB_ADMA2 << 19) | (MAX_BLOCK_LENGTH << 16) |      \
     (SDHC_CAPAB_BASECLKFREQ << 8) | (SDHC_CAPAB_TOUNIT << 7) | \
     (SDHC_CAPAB_TOCLKFREQ))
 
 #define MASKED_WRITE(reg, mask, val)  (reg = (reg & (mask)) | (val))
 
+static void sdhci_init_capareg(SDHCIState *s, Error **errp)
+{
+    uint64_t capareg = 0;
+
+    switch (s->spec_version) {
+    case 1:
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, HIGHSPEED, s->cap.high_speed);
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, SDMA, s->cap.sdma);
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, SUSPRESUME, s->cap.suspend);
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, V33, s->cap.v33);
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, V30, s->cap.v30);
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, V18, s->cap.v18);
+        break;
+
+    default:
+        error_setg(errp, "Unsupported spec version: %u", s->spec_version);
+    }
+    s->capareg = capareg;
+}
+
 static uint8_t sdhci_slotint(SDHCIState *s)
 {
     return (s->norintsts & s->norintsigen) || (s->errintsts & s->errintsigen) ||
@@ -1032,7 +1041,7 @@ sdhci_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)
     case SDHC_TRNMOD:
         /* DMA can be enabled only if it is supported as indicated by
          * capabilities register */
-        if (!(s->capareg & SDHC_CAN_DO_DMA)) {
+        if (!(s->capareg & R_SDHC_CAPAB_SDMA_MASK)) {
             value &= ~SDHC_TRNS_DMA;
         }
         MASKED_WRITE(s->trnmod, mask, value & SDHC_TRNMOD_MASK);
@@ -1186,6 +1195,10 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
         return;
     }
     s->version = (SDHC_HCVER_VENDOR << 8) | (s->spec_version - 1);
+
+    if (s->capareg == UINT64_MAX) {
+        sdhci_init_capareg(s, errp);
+    }
 }
 
 static void sdhci_initfn(SDHCIState *s)
@@ -1305,8 +1318,21 @@ const VMStateDescription sdhci_vmstate = {
  * specific host controller implementation */
 static Property sdhci_properties[] = {
     DEFINE_PROP_UINT8("sd-spec-version", SDHCIState, spec_version, 2),
-    DEFINE_PROP_UINT64("capareg", SDHCIState, capareg,
-            SDHC_CAPAB_REG_DEFAULT),
+
+    /* DMA */
+    DEFINE_PROP_BOOL("sdma", SDHCIState, cap.sdma, true),
+    /* Suspend/resume support */
+    DEFINE_PROP_BOOL("suspend", SDHCIState, cap.suspend, false),
+    /* High speed support */
+    DEFINE_PROP_BOOL("high-speed", SDHCIState, cap.high_speed, true),
+    /* Voltage support 3.3/3.0/1.8V */
+    DEFINE_PROP_BOOL("3v3", SDHCIState, cap.v33, true),
+    DEFINE_PROP_BOOL("3v0", SDHCIState, cap.v30, false),
+    DEFINE_PROP_BOOL("1v8", SDHCIState, cap.v18, false),
+
+    /* capareg: deprecated */
+    DEFINE_PROP_UINT64("capareg", SDHCIState, capareg, UINT64_MAX),
+
     DEFINE_PROP_UINT64("maxcurr", SDHCIState, maxcurr, 0),
     DEFINE_PROP_BOOL("pending-insert-quirk", SDHCIState, pending_insert_quirk,
                      false),
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 03/31] sdhci: add max-block-length capability (Spec v1)
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 01/31] sdhci: add a spec_version property Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 02/31] sdhci: add basic Spec v1 capabilities Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 22:20   ` Alistair Francis
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 04/31] sdhci: add clock capabilities " Philippe Mathieu-Daudé
                   ` (26 subsequent siblings)
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sdhci-internal.h |  1 -
 include/hw/sd/sdhci.h  |  1 +
 hw/sd/sdhci.c          | 38 +++++++++++++-------------------------
 3 files changed, 14 insertions(+), 26 deletions(-)

diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
index 6944fcaf00..0561e6eaf7 100644
--- a/hw/sd/sdhci-internal.h
+++ b/hw/sd/sdhci-internal.h
@@ -188,7 +188,6 @@ FIELD(SDHC_ACMD12ERRSTS, INDEX_ERR,    4, 1);
 #define SDHC_CAN_DO_ADMA2              0x00080000
 #define SDHC_CAN_DO_ADMA1              0x00100000
 #define SDHC_64_BIT_BUS_SUPPORT        (1 << 28)
-#define SDHC_CAPAB_BLOCKSIZE(x)        (((x) >> 16) & 0x3)
 FIELD(SDHC_CAPAB, TOCLKFREQ,           0, 6);
 FIELD(SDHC_CAPAB, TOUNIT,              7, 1);
 FIELD(SDHC_CAPAB, BASECLKFREQ,         8, 8);
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index 266030dc8d..2703da1d5a 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -103,6 +103,7 @@ typedef struct SDHCIState {
     bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
     uint8_t spec_version;
     struct {
+        uint16_t max_blk_len;
         bool suspend;
         bool high_speed;
         bool sdma;
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index e7dbab2fdc..c78643fe54 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -46,9 +46,6 @@
 #define SDHC_CAPAB_64BITBUS       0ul        /* 64-bit System Bus Support */
 #define SDHC_CAPAB_ADMA1          1ul        /* ADMA1 support */
 #define SDHC_CAPAB_ADMA2          1ul        /* ADMA2 support */
-/* Maximum host controller R/W buffers size
- * Possible values: 512, 1024, 2048 bytes */
-#define SDHC_CAPAB_MAXBLOCKLENGTH 512ul
 /* Maximum clock frequency for SDclock in MHz
  * value in range 10-63 MHz, 0 - not defined */
 #define SDHC_CAPAB_BASECLKFREQ    52ul
@@ -62,16 +59,6 @@
 #error Capabilities features can have value 0 or 1 only!
 #endif
 
-#if SDHC_CAPAB_MAXBLOCKLENGTH == 512
-#define MAX_BLOCK_LENGTH 0ul
-#elif SDHC_CAPAB_MAXBLOCKLENGTH == 1024
-#define MAX_BLOCK_LENGTH 1ul
-#elif SDHC_CAPAB_MAXBLOCKLENGTH == 2048
-#define MAX_BLOCK_LENGTH 2ul
-#else
-#error Max host controller block size can have value 512, 1024 or 2048 only!
-#endif
-
 #if (SDHC_CAPAB_BASECLKFREQ > 0 && SDHC_CAPAB_BASECLKFREQ < 10) || \
     SDHC_CAPAB_BASECLKFREQ > 63
 #error SDclock frequency can have value in range 0, 10-63 only!
@@ -83,7 +70,7 @@
 
 #define SDHC_CAPAB_REG_DEFAULT                                 \
    ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_ADMA1 << 20) |   \
-    (SDHC_CAPAB_ADMA2 << 19) | (MAX_BLOCK_LENGTH << 16) |      \
+    (SDHC_CAPAB_ADMA2 << 19) |                                 \
     (SDHC_CAPAB_BASECLKFREQ << 8) | (SDHC_CAPAB_TOUNIT << 7) | \
     (SDHC_CAPAB_TOCLKFREQ))
 
@@ -92,9 +79,17 @@
 static void sdhci_init_capareg(SDHCIState *s, Error **errp)
 {
     uint64_t capareg = 0;
+    uint32_t val;
 
     switch (s->spec_version) {
     case 1:
+        val = ctz32(s->cap.max_blk_len >> 9);
+        if (val >= 0b11) {
+            error_setg(errp, "block size can be 512, 1024 or 2048 only");
+            return;
+        }
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, MAXBLOCKLENGTH, val);
+
         capareg = FIELD_DP64(capareg, SDHC_CAPAB, HIGHSPEED, s->cap.high_speed);
         capareg = FIELD_DP64(capareg, SDHC_CAPAB, SDMA, s->cap.sdma);
         capareg = FIELD_DP64(capareg, SDHC_CAPAB, SUSPRESUME, s->cap.suspend);
@@ -1175,17 +1170,7 @@ static const MemoryRegionOps sdhci_mmio_ops = {
 
 static inline unsigned int sdhci_get_fifolen(SDHCIState *s)
 {
-    switch (SDHC_CAPAB_BLOCKSIZE(s->capareg)) {
-    case 0:
-        return 512;
-    case 1:
-        return 1024;
-    case 2:
-        return 2048;
-    default:
-        hw_error("SDHC: unsupported value for maximum block size\n");
-        return 0;
-    }
+    return 1 << (9 + FIELD_EX32(s->capareg, SDHC_CAPAB, MAXBLOCKLENGTH));
 }
 
 static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
@@ -1319,6 +1304,9 @@ const VMStateDescription sdhci_vmstate = {
 static Property sdhci_properties[] = {
     DEFINE_PROP_UINT8("sd-spec-version", SDHCIState, spec_version, 2),
 
+    /* Maximum host controller R/W buffers size
+     * Possible values: 512, 1024, 2048 bytes */
+    DEFINE_PROP_UINT16("max-block-length", SDHCIState, cap.max_blk_len, 512),
     /* DMA */
     DEFINE_PROP_BOOL("sdma", SDHCIState, cap.sdma, true),
     /* Suspend/resume support */
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 04/31] sdhci: add clock capabilities (Spec v1)
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (2 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 03/31] sdhci: add max-block-length capability (Spec v1) Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 22:22   ` Alistair Francis
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 05/31] sdhci: add DMA and 64-bit capabilities (Spec v2) Philippe Mathieu-Daudé
                   ` (25 subsequent siblings)
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 include/hw/sd/sdhci.h |  2 ++
 hw/sd/sdhci.c         | 52 +++++++++++++++++++++++++++++++--------------------
 2 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index 2703da1d5a..c1602becd2 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -103,6 +103,8 @@ typedef struct SDHCIState {
     bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
     uint8_t spec_version;
     struct {
+        uint8_t timeout_clk_freq, base_clk_freq_mhz;
+        bool timeout_clk_in_mhz;
         uint16_t max_blk_len;
         bool suspend;
         bool high_speed;
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index c78643fe54..05681c86d6 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -46,36 +46,31 @@
 #define SDHC_CAPAB_64BITBUS       0ul        /* 64-bit System Bus Support */
 #define SDHC_CAPAB_ADMA1          1ul        /* ADMA1 support */
 #define SDHC_CAPAB_ADMA2          1ul        /* ADMA2 support */
-/* Maximum clock frequency for SDclock in MHz
- * value in range 10-63 MHz, 0 - not defined */
-#define SDHC_CAPAB_BASECLKFREQ    52ul
-#define SDHC_CAPAB_TOUNIT         1ul  /* Timeout clock unit 0 - kHz, 1 - MHz */
-/* Timeout clock frequency 1-63, 0 - not defined */
-#define SDHC_CAPAB_TOCLKFREQ      52ul
 
 /* Now check all parameters and calculate CAPABILITIES REGISTER value */
-#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1 || \
-    SDHC_CAPAB_TOUNIT > 1
+#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1
 #error Capabilities features can have value 0 or 1 only!
 #endif
 
-#if (SDHC_CAPAB_BASECLKFREQ > 0 && SDHC_CAPAB_BASECLKFREQ < 10) || \
-    SDHC_CAPAB_BASECLKFREQ > 63
-#error SDclock frequency can have value in range 0, 10-63 only!
-#endif
-
-#if SDHC_CAPAB_TOCLKFREQ > 63
-#error Timeout clock frequency can have value in range 0-63 only!
-#endif
-
 #define SDHC_CAPAB_REG_DEFAULT                                 \
    ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_ADMA1 << 20) |   \
-    (SDHC_CAPAB_ADMA2 << 19) |                                 \
-    (SDHC_CAPAB_BASECLKFREQ << 8) | (SDHC_CAPAB_TOUNIT << 7) | \
-    (SDHC_CAPAB_TOCLKFREQ))
+    (SDHC_CAPAB_ADMA2 << 19))
 
 #define MASKED_WRITE(reg, mask, val)  (reg = (reg & (mask)) | (val))
 
+static void sdhci_check_capab_freq_range(SDHCIState *s, const char *desc,
+                                         uint8_t freq, Error **errp)
+{
+    switch (freq) {
+    case 0:
+    case 10 ... 63:
+        break;
+        error_setg(errp, "SD %s clock frequency can have value"
+                   "in range 0-63 only", desc);
+        return;
+    }
+}
+
 static void sdhci_init_capareg(SDHCIState *s, Error **errp)
 {
     uint64_t capareg = 0;
@@ -83,6 +78,16 @@ static void sdhci_init_capareg(SDHCIState *s, Error **errp)
 
     switch (s->spec_version) {
     case 1:
+        sdhci_check_capab_freq_range(s, "Timeout", s->cap.timeout_clk_freq,
+                                     errp);
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, TOCLKFREQ,
+                             s->cap.timeout_clk_freq);
+        sdhci_check_capab_freq_range(s, "Base", s->cap.base_clk_freq_mhz, errp);
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, BASECLKFREQ,
+                             s->cap.base_clk_freq_mhz);
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, TOUNIT,
+                             s->cap.timeout_clk_in_mhz);
+
         val = ctz32(s->cap.max_blk_len >> 9);
         if (val >= 0b11) {
             error_setg(errp, "block size can be 512, 1024 or 2048 only");
@@ -1304,6 +1309,13 @@ const VMStateDescription sdhci_vmstate = {
 static Property sdhci_properties[] = {
     DEFINE_PROP_UINT8("sd-spec-version", SDHCIState, spec_version, 2),
 
+    /* Timeout clock frequency 1-63, 0 - not defined */
+    DEFINE_PROP_UINT8("timeout-freq", SDHCIState, cap.timeout_clk_freq, 0),
+    /* Timeout clock unit 0 - kHz, 1 - MHz */
+    DEFINE_PROP_BOOL("freq-in-mhz", SDHCIState, cap.timeout_clk_in_mhz, true),
+    /* Maximum base clock frequency for SD clock in MHz (range 10-63 MHz, 0) */
+    DEFINE_PROP_UINT8("max-frequency", SDHCIState, cap.base_clk_freq_mhz, 0),
+
     /* Maximum host controller R/W buffers size
      * Possible values: 512, 1024, 2048 bytes */
     DEFINE_PROP_UINT16("max-block-length", SDHCIState, cap.max_blk_len, 512),
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 05/31] sdhci: add DMA and 64-bit capabilities (Spec v2)
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (3 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 04/31] sdhci: add clock capabilities " Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-09 21:53   ` Alistair Francis
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 07/31] sdhci: Fix 64-bit ADMA2 Philippe Mathieu-Daudé
                   ` (24 subsequent siblings)
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sdhci-internal.h | 14 +++++++-------
 include/hw/sd/sdhci.h  |  4 ++++
 hw/sd/sdhci.c          | 40 ++++++++++++++++++----------------------
 3 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
index 0561e6eaf7..affbe4015c 100644
--- a/hw/sd/sdhci-internal.h
+++ b/hw/sd/sdhci-internal.h
@@ -89,12 +89,12 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
 FIELD(SDHC_HOSTCTL, LED_CTRL,          0, 1);
 FIELD(SDHC_HOSTCTL, DATATRANSFERWIDTH, 1, 1); /* SD mode only */
 FIELD(SDHC_HOSTCTL, HIGH_SPEED,        2, 1);
-#define SDHC_CTRL_DMA_CHECK_MASK       0x18
+FIELD(SDHC_HOSTCTL, DMA,               3, 2);
 #define SDHC_CTRL_SDMA                 0x00
-#define SDHC_CTRL_ADMA1_32             0x08
+#define SDHC_CTRL_ADMA1_32             0x08 /* NOT ALLOWED since v2 */
 #define SDHC_CTRL_ADMA2_32             0x10
-#define SDHC_CTRL_ADMA2_64             0x18
-#define SDHC_DMA_TYPE(x)               ((x) & SDHC_CTRL_DMA_CHECK_MASK)
+#define SDHC_CTRL_ADMA2_64             0x18 /* only v1 & v2 (v3 optional) */
+#define SDHC_DMA_TYPE(x)               ((x) & R_SDHC_HOSTCTL_DMA_MASK)
 
 /* R/W Power Control Register 0x0 */
 #define SDHC_PWRCON                    0x29
@@ -185,19 +185,19 @@ FIELD(SDHC_ACMD12ERRSTS, INDEX_ERR,    4, 1);
 
 /* HWInit Capabilities Register 0x05E80080 */
 #define SDHC_CAPAB                     0x40
-#define SDHC_CAN_DO_ADMA2              0x00080000
-#define SDHC_CAN_DO_ADMA1              0x00100000
-#define SDHC_64_BIT_BUS_SUPPORT        (1 << 28)
 FIELD(SDHC_CAPAB, TOCLKFREQ,           0, 6);
 FIELD(SDHC_CAPAB, TOUNIT,              7, 1);
 FIELD(SDHC_CAPAB, BASECLKFREQ,         8, 8);
 FIELD(SDHC_CAPAB, MAXBLOCKLENGTH,     16, 2);
+FIELD(SDHC_CAPAB, ADMA2,              19, 1); /* since v2 */
+FIELD(SDHC_CAPAB, ADMA1,              20, 1); /* v1 only? */
 FIELD(SDHC_CAPAB, HIGHSPEED,          21, 1);
 FIELD(SDHC_CAPAB, SDMA,               22, 1);
 FIELD(SDHC_CAPAB, SUSPRESUME,         23, 1);
 FIELD(SDHC_CAPAB, V33,                24, 1);
 FIELD(SDHC_CAPAB, V30,                25, 1);
 FIELD(SDHC_CAPAB, V18,                26, 1);
+FIELD(SDHC_CAPAB, BUS64BIT,           28, 1); /* since v2 */
 
 /* HWInit Maximum Current Capabilities Register 0x0 */
 #define SDHC_MAXCURR                   0x48
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index c1602becd2..4a9c3e9175 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -103,6 +103,7 @@ typedef struct SDHCIState {
     bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
     uint8_t spec_version;
     struct {
+        /* v1 */
         uint8_t timeout_clk_freq, base_clk_freq_mhz;
         bool timeout_clk_in_mhz;
         uint16_t max_blk_len;
@@ -110,6 +111,9 @@ typedef struct SDHCIState {
         bool high_speed;
         bool sdma;
         bool v33, v30, v18;
+        /* v2 */
+        bool adma1, adma2;
+        bool bus64;
     } cap;
 } SDHCIState;
 
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 05681c86d6..56466e0427 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -38,24 +38,6 @@
 #define TYPE_SDHCI_BUS "sdhci-bus"
 #define SDHCI_BUS(obj) OBJECT_CHECK(SDBus, (obj), TYPE_SDHCI_BUS)
 
-/* Default SD/MMC host controller features information, which will be
- * presented in CAPABILITIES register of generic SD host controller at reset.
- * If not stated otherwise:
- * 0 - not supported, 1 - supported, other - prohibited.
- */
-#define SDHC_CAPAB_64BITBUS       0ul        /* 64-bit System Bus Support */
-#define SDHC_CAPAB_ADMA1          1ul        /* ADMA1 support */
-#define SDHC_CAPAB_ADMA2          1ul        /* ADMA2 support */
-
-/* Now check all parameters and calculate CAPABILITIES REGISTER value */
-#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1
-#error Capabilities features can have value 0 or 1 only!
-#endif
-
-#define SDHC_CAPAB_REG_DEFAULT                                 \
-   ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_ADMA1 << 20) |   \
-    (SDHC_CAPAB_ADMA2 << 19))
-
 #define MASKED_WRITE(reg, mask, val)  (reg = (reg & (mask)) | (val))
 
 static void sdhci_check_capab_freq_range(SDHCIState *s, const char *desc,
@@ -71,12 +53,22 @@ static void sdhci_check_capab_freq_range(SDHCIState *s, const char *desc,
     }
 }
 
+/* Default SD/MMC host controller features information, which will be
+ * presented in CAPABILITIES register of generic SD host controller at reset. */
 static void sdhci_init_capareg(SDHCIState *s, Error **errp)
 {
     uint64_t capareg = 0;
     uint32_t val;
 
     switch (s->spec_version) {
+    /* fallback */
+    case 2:
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, ADMA1, s->cap.adma1);
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, ADMA2, s->cap.adma2);
+        /* 64-bit System Bus Support */
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, BUS64BIT, s->cap.bus64);
+
+    /* fallback */
     case 1:
         sdhci_check_capab_freq_range(s, "Timeout", s->cap.timeout_clk_freq,
                                      errp);
@@ -794,7 +786,7 @@ static void sdhci_data_transfer(void *opaque)
 
             break;
         case SDHC_CTRL_ADMA1_32:
-            if (!(s->capareg & SDHC_CAN_DO_ADMA1)) {
+            if (!(s->capareg & R_SDHC_CAPAB_ADMA1_MASK)) {
                 trace_sdhci_error("ADMA1 not supported");
                 break;
             }
@@ -802,7 +794,7 @@ static void sdhci_data_transfer(void *opaque)
             sdhci_do_adma(s);
             break;
         case SDHC_CTRL_ADMA2_32:
-            if (!(s->capareg & SDHC_CAN_DO_ADMA2)) {
+            if (!(s->capareg & R_SDHC_CAPAB_ADMA2_MASK)) {
                 trace_sdhci_error("ADMA2 not supported");
                 break;
             }
@@ -810,8 +802,8 @@ static void sdhci_data_transfer(void *opaque)
             sdhci_do_adma(s);
             break;
         case SDHC_CTRL_ADMA2_64:
-            if (!(s->capareg & SDHC_CAN_DO_ADMA2) ||
-                    !(s->capareg & SDHC_64_BIT_BUS_SUPPORT)) {
+            if (!(s->capareg & R_SDHC_CAPAB_ADMA2_MASK) ||
+                    !(s->capareg & R_SDHC_CAPAB_BUS64BIT_MASK)) {
                 trace_sdhci_error("64 bit ADMA not supported");
                 break;
             }
@@ -1321,6 +1313,8 @@ static Property sdhci_properties[] = {
     DEFINE_PROP_UINT16("max-block-length", SDHCIState, cap.max_blk_len, 512),
     /* DMA */
     DEFINE_PROP_BOOL("sdma", SDHCIState, cap.sdma, true),
+    DEFINE_PROP_BOOL("adma1", SDHCIState, cap.adma1, false),
+    DEFINE_PROP_BOOL("adma2", SDHCIState, cap.adma2, true),
     /* Suspend/resume support */
     DEFINE_PROP_BOOL("suspend", SDHCIState, cap.suspend, false),
     /* High speed support */
@@ -1330,6 +1324,8 @@ static Property sdhci_properties[] = {
     DEFINE_PROP_BOOL("3v0", SDHCIState, cap.v30, false),
     DEFINE_PROP_BOOL("1v8", SDHCIState, cap.v18, false),
 
+    DEFINE_PROP_BOOL("64bit", SDHCIState, cap.bus64, false),
+
     /* capareg: deprecated */
     DEFINE_PROP_UINT64("capareg", SDHCIState, capareg, UINT64_MAX),
 
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 07/31] sdhci: Fix 64-bit ADMA2
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (4 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 05/31] sdhci: add DMA and 64-bit capabilities (Spec v2) Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 08/31] hw/sd: clean/reorder the Makefile adding few comments Philippe Mathieu-Daudé
                   ` (23 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Sai Pavan Boddu, qemu-devel, Edgar E . Iglesias,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

From: Sai Pavan Boddu <saipava@xilinx.com>

The 64-bit ADMA address is not converted to the cpu endianes correctly.
This patch fixes the issue and uses a valid mask for the attribute data.

Signed-off-by: Sai Pavan Boddu <saipava@xilinx.com>
[AF: Re-write commit message]
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
---
 hw/sd/sdhci.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 88052fcc44..83b027a3b6 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -623,8 +623,8 @@ static void get_adma_description(SDHCIState *s, ADMADescr *dscr)
         dscr->length = le16_to_cpu(dscr->length);
         dma_memory_read(&s->dma_as, entry_addr + 4,
                         (uint8_t *)(&dscr->addr), 8);
-        dscr->attr = le64_to_cpu(dscr->attr);
-        dscr->attr &= 0xfffffff8;
+        dscr->addr = le64_to_cpu(dscr->addr);
+        dscr->attr &= (uint8_t) ~0xC0;
         dscr->incr = 12;
         break;
     }
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 08/31] hw/sd: clean/reorder the Makefile adding few comments
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (5 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 07/31] sdhci: Fix 64-bit ADMA2 Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 21:53   ` Alistair Francis
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 09/31] sdhci: add a common class Philippe Mathieu-Daudé
                   ` (22 subsequent siblings)
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

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

diff --git a/hw/sd/Makefile.objs b/hw/sd/Makefile.objs
index c2b7664264..0fe2501017 100644
--- a/hw/sd/Makefile.objs
+++ b/hw/sd/Makefile.objs
@@ -1,9 +1,14 @@
+# SD/MMC subsystem core
+common-obj-$(CONFIG_SD) += core.o
+
+# SD/MMC host adapters
 common-obj-$(CONFIG_PL181) += pl181.o
 common-obj-$(CONFIG_SSI_SD) += ssi-sd.o
-common-obj-$(CONFIG_SD) += sd.o core.o
 common-obj-$(CONFIG_SDHCI) += sdhci.o
-
 obj-$(CONFIG_MILKYMIST) += milkymist-memcard.o
 obj-$(CONFIG_OMAP) += omap_mmc.o
 obj-$(CONFIG_PXA2XX) += pxa2xx_mmci.o
 obj-$(CONFIG_RASPI) += bcm2835_sdhost.o
+
+# emulated SD/MMC devices
+common-obj-$(CONFIG_SD) += sd.o
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 09/31] sdhci: add a common class
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (6 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 08/31] hw/sd: clean/reorder the Makefile adding few comments Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-09 21:54   ` Alistair Francis
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 10/31] sdhci: add a Designware/Samsung host controller Philippe Mathieu-Daudé
                   ` (21 subsequent siblings)
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

so this class can be inherited.

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

diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index 4a9c3e9175..a80b7c0424 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -124,4 +124,16 @@ typedef struct SDHCIState {
 #define SYSBUS_SDHCI(obj)                               \
      OBJECT_CHECK(SDHCIState, (obj), TYPE_SYSBUS_SDHCI)
 
+typedef struct {
+    /*< private >*/
+    BusClass parent_class;
+    /*< public >*/
+    DeviceRealize parent_realize;
+} SDHCICommonClass;
+
+#define SYSBUS_SDHCI_COMMON_CLASS(klass) \
+        OBJECT_CLASS_CHECK(SDHCICommonClass, (klass), TYPE_SYSBUS_SDHCI)
+#define SYSBUS_SDHCI_COMMON_GET_CLASS(obj) \
+        OBJECT_GET_CLASS(SDHCICommonClass, (obj), TYPE_SYSBUS_SDHCI)
+
 #endif /* SDHCI_H */
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 10/31] sdhci: add a Designware/Samsung host controller
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (7 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 09/31] sdhci: add a common class Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-09 23:14   ` Alistair Francis
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 11/31] hw/arm/exynos4210: use the "samsung, exynos4210-dw-mshc" device Philippe Mathieu-Daudé
                   ` (20 subsequent siblings)
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/dw-mshc.c     | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/sd/Makefile.objs |  1 +
 2 files changed, 65 insertions(+)
 create mode 100644 hw/sd/dw-mshc.c

diff --git a/hw/sd/dw-mshc.c b/hw/sd/dw-mshc.c
new file mode 100644
index 0000000000..c2869cd569
--- /dev/null
+++ b/hw/sd/dw-mshc.c
@@ -0,0 +1,64 @@
+/*
+ * Synopsys Designware Mobile Storage Host Controller emulation
+ * (and Samsung Exynos specific extensions)
+ *
+ * Copyright (C) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * (at your option) any later version.  See the COPYING file in the
+ * top-level directory.
+ */
+#include "qemu/osdep.h"
+#include "hw/sd/sdhci.h"
+#include "qapi/error.h"
+
+/* Compatible with:
+ * - SD Host Controller Specification Version 2.0
+ * - SDIO Specification Version 2.0
+ * - MMC Specification Version 4.3
+ *
+ * - SDMA
+ * - ADMA
+ */
+static void exynos4210_dw_mshc_realize(DeviceState *dev, Error **errp)
+{
+    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_GET_CLASS(dev);
+    Object *obj = OBJECT(dev);
+    Error *local_err = NULL;
+
+    object_property_set_uint(obj, 2, "sd-spec-version", &local_err);
+    object_property_set_bool(obj, true, "suspend", &local_err);
+    object_property_set_bool(obj, true, "1v8", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    cc->parent_realize(dev, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+}
+
+static void exynos4210_dw_mshc_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_CLASS(klass);
+
+    cc->parent_realize = dc->realize;
+    dc->realize = exynos4210_dw_mshc_realize;
+}
+
+static const TypeInfo exynos4210_dw_mshc_info = {
+    .name = "samsung,exynos4210-dw-mshc",
+    .parent = TYPE_SYSBUS_SDHCI,
+    .class_init = exynos4210_dw_mshc_class_init,
+};
+
+static void dw_mshc_sdhc_register_types(void)
+{
+    type_register_static(&exynos4210_dw_mshc_info);
+}
+
+type_init(dw_mshc_sdhc_register_types)
diff --git a/hw/sd/Makefile.objs b/hw/sd/Makefile.objs
index 0fe2501017..fd866d7f94 100644
--- a/hw/sd/Makefile.objs
+++ b/hw/sd/Makefile.objs
@@ -3,6 +3,7 @@ common-obj-$(CONFIG_SD) += core.o
 
 # SD/MMC host adapters
 common-obj-$(CONFIG_PL181) += pl181.o
+common-obj-$(CONFIG_EXYNOS4) += dw-mshc.o
 common-obj-$(CONFIG_SSI_SD) += ssi-sd.o
 common-obj-$(CONFIG_SDHCI) += sdhci.o
 obj-$(CONFIG_MILKYMIST) += milkymist-memcard.o
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 11/31] hw/arm/exynos4210: use the "samsung, exynos4210-dw-mshc" device
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (8 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 10/31] sdhci: add a Designware/Samsung host controller Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-09 23:18   ` Alistair Francis
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 12/31] sdhci: add the generic Arasan SDHCI 4.9a PHY controller Philippe Mathieu-Daudé
                   ` (19 subsequent siblings)
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

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

diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index e8e1d81e62..eb95131221 100644
--- a/hw/arm/exynos4210.c
+++ b/hw/arm/exynos4210.c
@@ -75,7 +75,6 @@
 #define EXYNOS4210_INT_COMBINER_BASE_ADDR   0x10448000
 
 /* SD/MMC host controllers */
-#define EXYNOS4210_SDHCI_CAPABILITIES       0x05E80080
 #define EXYNOS4210_SDHCI_BASE_ADDR          0x12510000
 #define EXYNOS4210_SDHCI_ADDR(n)            (EXYNOS4210_SDHCI_BASE_ADDR + \
                                                 0x00010000 * (n))
@@ -377,13 +376,10 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem)
         BlockBackend *blk;
         DriveInfo *di;
 
-        dev = qdev_create(NULL, TYPE_SYSBUS_SDHCI);
-        qdev_prop_set_uint32(dev, "capareg", EXYNOS4210_SDHCI_CAPABILITIES);
-        qdev_init_nofail(dev);
-
-        busdev = SYS_BUS_DEVICE(dev);
-        sysbus_mmio_map(busdev, 0, EXYNOS4210_SDHCI_ADDR(n));
-        sysbus_connect_irq(busdev, 0, s->irq_table[exynos4210_get_irq(29, n)]);
+        dev = sysbus_create_varargs("samsung,exynos4210-dw-mshc",
+                                    EXYNOS4210_SDHCI_ADDR(n),
+                                    s->irq_table[exynos4210_get_irq(29, n)],
+                                    NULL);
 
         di = drive_get(IF_SD, 0, n);
         blk = di ? blk_by_legacy_dinfo(di) : NULL;
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 12/31] sdhci: add the generic Arasan SDHCI 4.9a PHY controller
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (9 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 11/31] hw/arm/exynos4210: use the "samsung, exynos4210-dw-mshc" device Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 13/31] hw/arm/xilinx_zynq: use the "arasan, sdhci-4.9a" device Philippe Mathieu-Daudé
                   ` (18 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/arasan_sdhci.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/sd/Makefile.objs  |  1 +
 2 files changed, 73 insertions(+)
 create mode 100644 hw/sd/arasan_sdhci.c

diff --git a/hw/sd/arasan_sdhci.c b/hw/sd/arasan_sdhci.c
new file mode 100644
index 0000000000..c6d96b2583
--- /dev/null
+++ b/hw/sd/arasan_sdhci.c
@@ -0,0 +1,72 @@
+/*
+ * Arasan SDHCI Controller emulation
+ *
+ * Copyright (C) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * (at your option) any later version.  See the COPYING file in the
+ * top-level directory.
+ */
+#include "qemu/osdep.h"
+#include "hw/sd/sdhci.h"
+#include "qapi/error.h"
+
+/* Compatible with:
+ * - SD Host Controller Specification Version 2.0 Part A2
+ * - SDIO Specification Version 2.0
+ * - MMC Specification Version 3.31
+ *
+ * - SDMA (single operation DMA)
+ * - ADMA1 (4 KB boundary limited DMA)
+ * - ADMA2
+ *
+ * - up to seven functions in SD1, SD4, but does not support SPI mode
+ * - SD high-speed (SDHS) card
+ * - SD High Capacity (SDHC) card
+ *
+ * - Low-speed, 1 KHz to 400 KHz
+ * - Full-speed, 1 MHz to 50 MHz (25 MB/sec)
+ */
+static void arasan4_9a_sdhci_realize(DeviceState *dev, Error **errp)
+{
+    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_GET_CLASS(dev);
+    Object *obj = OBJECT(dev);
+    Error *local_err = NULL;
+
+    object_property_set_uint(obj, 2, "sd-spec-version", &local_err);
+    object_property_set_bool(obj, true, "adma1", &local_err);
+    object_property_set_bool(obj, true, "high-speed", &local_err);
+    object_property_set_uint(obj, 1024, "max-block-length", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    cc->parent_realize(dev, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+}
+
+static void arasan4_9a_sdhci_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_CLASS(klass);
+
+    cc->parent_realize = dc->realize;
+    dc->realize = arasan4_9a_sdhci_realize;
+}
+
+static const TypeInfo arasan4_9a_sdhci_info = {
+    .name = "arasan,sdhci-4.9a",
+    .parent = TYPE_SYSBUS_SDHCI,
+    .class_init = arasan4_9a_sdhci_class_init,
+};
+
+static void arasan_sdhci_register_types(void)
+{
+    type_register_static(&arasan4_9a_sdhci_info);
+}
+
+type_init(arasan_sdhci_register_types)
diff --git a/hw/sd/Makefile.objs b/hw/sd/Makefile.objs
index fd866d7f94..ef0fc3d3f7 100644
--- a/hw/sd/Makefile.objs
+++ b/hw/sd/Makefile.objs
@@ -3,6 +3,7 @@ common-obj-$(CONFIG_SD) += core.o
 
 # SD/MMC host adapters
 common-obj-$(CONFIG_PL181) += pl181.o
+common-obj-$(CONFIG_ZYNQ) += arasan_sdhci.o
 common-obj-$(CONFIG_EXYNOS4) += dw-mshc.o
 common-obj-$(CONFIG_SSI_SD) += ssi-sd.o
 common-obj-$(CONFIG_SDHCI) += sdhci.o
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 13/31] hw/arm/xilinx_zynq: use the "arasan, sdhci-4.9a" device
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (10 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 12/31] sdhci: add the generic Arasan SDHCI 4.9a PHY controller Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 14/31] sdhci: add qtest to check the SD Spec version Philippe Mathieu-Daudé
                   ` (17 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite, Edgar E. Iglesias

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/arm/xilinx_zynq.c | 41 +++++++++++++++++------------------------
 1 file changed, 17 insertions(+), 24 deletions(-)

diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 1836a4ed45..55872d5678 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -165,10 +165,8 @@ static void zynq_init(MachineState *machine)
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ext_ram = g_new(MemoryRegion, 1);
     MemoryRegion *ocm_ram = g_new(MemoryRegion, 1);
-    DeviceState *dev, *carddev;
+    DeviceState *dev;
     SysBusDevice *busdev;
-    DriveInfo *di;
-    BlockBackend *blk;
     qemu_irq pic[64];
     int n;
 
@@ -247,27 +245,22 @@ static void zynq_init(MachineState *machine)
     gem_init(&nd_table[0], 0xE000B000, pic[54-IRQ_OFFSET]);
     gem_init(&nd_table[1], 0xE000C000, pic[77-IRQ_OFFSET]);
 
-    dev = qdev_create(NULL, TYPE_SYSBUS_SDHCI);
-    qdev_init_nofail(dev);
-    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0xE0100000);
-    sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[56-IRQ_OFFSET]);
-
-    di = drive_get_next(IF_SD);
-    blk = di ? blk_by_legacy_dinfo(di) : NULL;
-    carddev = qdev_create(qdev_get_child_bus(dev, "sd-bus"), TYPE_SD_CARD);
-    qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
-    object_property_set_bool(OBJECT(carddev), true, "realized", &error_fatal);
-
-    dev = qdev_create(NULL, TYPE_SYSBUS_SDHCI);
-    qdev_init_nofail(dev);
-    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0xE0101000);
-    sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[79-IRQ_OFFSET]);
-
-    di = drive_get_next(IF_SD);
-    blk = di ? blk_by_legacy_dinfo(di) : NULL;
-    carddev = qdev_create(qdev_get_child_bus(dev, "sd-bus"), TYPE_SD_CARD);
-    qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
-    object_property_set_bool(OBJECT(carddev), true, "realized", &error_fatal);
+    for (n = 0; n < 2; n++) {
+        int hci_irq = n ? 79 : 56;
+        hwaddr hci_addr = n ? 0xE0101000 : 0xE0100000;
+        DriveInfo *di;
+        BlockBackend *blk;
+        DeviceState *carddev;
+
+        dev = sysbus_create_varargs("arasan,sdhci-4.9a",
+                                    hci_addr, pic[hci_irq - IRQ_OFFSET], NULL);
+        di = drive_get_next(IF_SD);
+        blk = di ? blk_by_legacy_dinfo(di) : NULL;
+        carddev = qdev_create(qdev_get_child_bus(dev, "sd-bus"), TYPE_SD_CARD);
+        qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
+        object_property_set_bool(OBJECT(carddev), true, "realized",
+                                 &error_fatal);
+    }
 
     dev = qdev_create(NULL, TYPE_ZYNQ_XADC);
     qdev_init_nofail(dev);
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 14/31] sdhci: add qtest to check the SD Spec version
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (11 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 13/31] hw/arm/xilinx_zynq: use the "arasan, sdhci-4.9a" device Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 15/31] sdhci: check Spec v2 capabilities qtest Philippe Mathieu-Daudé
                   ` (16 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

with check_specs_version()

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 tests/sdhci-test.c     | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/Makefile.include |  2 ++
 2 files changed, 84 insertions(+)
 create mode 100644 tests/sdhci-test.c

diff --git a/tests/sdhci-test.c b/tests/sdhci-test.c
new file mode 100644
index 0000000000..492b332588
--- /dev/null
+++ b/tests/sdhci-test.c
@@ -0,0 +1,82 @@
+/*
+ * QTest testcase for SDHCI controllers
+ *
+ * Written by Philippe Mathieu-Daudé <f4bug@amsat.org>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+#include "qemu/osdep.h"
+#include "libqtest.h"
+
+#define SDHC_HCVER                      0xFE
+
+static const struct sdhci_t {
+    const char *arch;
+    const char *machine;
+    struct {
+        uintptr_t addr;
+        uint8_t version;
+        uint8_t baseclock;
+        struct {
+            bool sdma;
+            uint64_t reg;
+        } capab;
+    } sdhci;
+} models[] = {
+    /* Exynos4210 */
+    { "arm",    "smdkc210",
+        {0x12510000, 2, 0, {1, 0x5e80080} } },
+
+    /* Zynq-7000 */
+    { "arm",    "xilinx-zynq-a9",
+        {0xe0100000, 2, 0, {1, 0x01790080} } },
+};
+
+static uint32_t sdhci_readl(uintptr_t base, uint32_t reg_addr)
+{
+    QTestState *qtest = global_qtest;
+
+    return qtest_readl(qtest, base + reg_addr);
+}
+
+static void check_specs_version(uintptr_t addr, uint8_t version)
+{
+    uint32_t v;
+
+    v = sdhci_readl(addr, SDHC_HCVER);
+    v &= 0xff;
+    v += 1;
+    g_assert_cmpuint(v, ==, version);
+}
+
+static void test_machine(const void *data)
+{
+    const struct sdhci_t *test = data;
+
+    global_qtest = qtest_startf("-machine %s -d unimp", test->machine);
+
+    check_specs_version(test->sdhci.addr, test->sdhci.version);
+
+    qtest_quit(global_qtest);
+}
+
+int main(int argc, char *argv[])
+{
+    const char *arch = qtest_get_arch();
+    char *name;
+    int i;
+
+    g_test_init(&argc, &argv, NULL);
+
+    for (i = 0; i < ARRAY_SIZE(models); i++) {
+        if (strcmp(arch, models[i].arch)) {
+            continue;
+        }
+        name = g_strdup_printf("sdhci/%s", models[i].machine);
+        qtest_add_data_func(name, &models[i], test_machine);
+        g_free(name);
+    }
+
+    return g_test_run();
+}
diff --git a/tests/Makefile.include b/tests/Makefile.include
index 77f8183117..2d7058ca4c 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -357,6 +357,7 @@ check-qtest-arm-y += tests/virtio-blk-test$(EXESUF)
 gcov-files-arm-y += arm-softmmu/hw/block/virtio-blk.c
 check-qtest-arm-y += tests/test-arm-mptimer$(EXESUF)
 gcov-files-arm-y += hw/timer/arm_mptimer.c
+check-qtest-arm-y += tests/sdhci-test$(EXESUF)
 
 check-qtest-aarch64-y = tests/numa-test$(EXESUF)
 
@@ -612,6 +613,7 @@ tests/test-qht-par$(EXESUF): tests/test-qht-par.o tests/qht-bench$(EXESUF) $(tes
 tests/qht-bench$(EXESUF): tests/qht-bench.o $(test-util-obj-y)
 tests/test-bufferiszero$(EXESUF): tests/test-bufferiszero.o $(test-util-obj-y)
 tests/atomic_add-bench$(EXESUF): tests/atomic_add-bench.o $(test-util-obj-y)
+tests/sdhci-test$(EXESUF): tests/sdhci-test.o
 
 tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o \
 	hw/core/qdev.o hw/core/qdev-properties.o hw/core/hotplug.o\
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 15/31] sdhci: check Spec v2 capabilities qtest
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (12 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 14/31] sdhci: add qtest to check the SD Spec version Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 16/31] sdhci: add v3 capabilities Philippe Mathieu-Daudé
                   ` (15 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

with check_capab_capareg()

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 tests/sdhci-test.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/tests/sdhci-test.c b/tests/sdhci-test.c
index 492b332588..200d7bcee2 100644
--- a/tests/sdhci-test.c
+++ b/tests/sdhci-test.c
@@ -9,6 +9,7 @@
 #include "qemu/osdep.h"
 #include "libqtest.h"
 
+#define SDHC_CAPAB                      0x40
 #define SDHC_HCVER                      0xFE
 
 static const struct sdhci_t {
@@ -40,6 +41,13 @@ static uint32_t sdhci_readl(uintptr_t base, uint32_t reg_addr)
     return qtest_readl(qtest, base + reg_addr);
 }
 
+static uint64_t sdhci_readq(uintptr_t base, uint32_t reg_addr)
+{
+    QTestState *qtest = global_qtest;
+
+    return qtest_readq(qtest, base + reg_addr);
+}
+
 static void check_specs_version(uintptr_t addr, uint8_t version)
 {
     uint32_t v;
@@ -50,12 +58,21 @@ static void check_specs_version(uintptr_t addr, uint8_t version)
     g_assert_cmpuint(v, ==, version);
 }
 
+static void check_capab_capareg(uintptr_t addr, uint64_t expected_capab)
+{
+    uint64_t capab;
+
+    capab = sdhci_readq(addr, SDHC_CAPAB);
+    g_assert_cmphex(capab, ==, expected_capab);
+}
+
 static void test_machine(const void *data)
 {
     const struct sdhci_t *test = data;
 
     global_qtest = qtest_startf("-machine %s -d unimp", test->machine);
 
+    check_capab_capareg(test->sdhci.addr, test->sdhci.capab.reg);
     check_specs_version(test->sdhci.addr, test->sdhci.version);
 
     qtest_quit(global_qtest);
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 16/31] sdhci: add v3 capabilities
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (13 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 15/31] sdhci: check Spec v2 capabilities qtest Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 17/31] sdhci: rename the hostctl1 register Philippe Mathieu-Daudé
                   ` (14 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sdhci-internal.h | 21 +++++++++++++++++++++
 include/hw/sd/sdhci.h  |  2 ++
 hw/sd/sdhci.c          | 21 +++++++++++++++++++--
 3 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
index affbe4015c..1da91a27b4 100644
--- a/hw/sd/sdhci-internal.h
+++ b/hw/sd/sdhci-internal.h
@@ -43,6 +43,7 @@
 #define SDHC_TRNS_DMA                  0x0001
 #define SDHC_TRNS_BLK_CNT_EN           0x0002
 #define SDHC_TRNS_ACMD12               0x0004
+#define SDHC_TRNS_ACMD23               0x0008 /* since v3 */
 #define SDHC_TRNS_READ                 0x0010
 #define SDHC_TRNS_MULTI                0x0020
 #define SDHC_TRNMOD_MASK               0x0037
@@ -183,12 +184,23 @@ FIELD(SDHC_ACMD12ERRSTS, TIMEOUT_ERR,  1, 1);
 FIELD(SDHC_ACMD12ERRSTS, CRC_ERR,      2, 1);
 FIELD(SDHC_ACMD12ERRSTS, INDEX_ERR,    4, 1);
 
+/* Host Control Register 2 (since v3) */
+#define SDHC_HOSTCTL2                  0x3E
+FIELD(SDHC_HOSTCTL2, UHS_MODE_SEL,     0, 3);
+FIELD(SDHC_HOSTCTL2, V18_ENA,          3, 1); /* UHS-I only */
+FIELD(SDHC_HOSTCTL2, DRIVER_STRENGTH,  4, 2); /* UHS-I only */
+FIELD(SDHC_HOSTCTL2, EXECUTE_TUNING,   6, 1); /* UHS-I only */
+FIELD(SDHC_HOSTCTL2, SAMPLING_CLKSEL,  7, 1); /* UHS-I only */
+FIELD(SDHC_HOSTCTL2, ASYNC_INT,       14, 1);
+FIELD(SDHC_HOSTCTL2, PRESET_ENA,      15, 1);
+
 /* HWInit Capabilities Register 0x05E80080 */
 #define SDHC_CAPAB                     0x40
 FIELD(SDHC_CAPAB, TOCLKFREQ,           0, 6);
 FIELD(SDHC_CAPAB, TOUNIT,              7, 1);
 FIELD(SDHC_CAPAB, BASECLKFREQ,         8, 8);
 FIELD(SDHC_CAPAB, MAXBLOCKLENGTH,     16, 2);
+FIELD(SDHC_CAPAB, EMBEDDED_8BIT,      18, 1); /* since v3 */
 FIELD(SDHC_CAPAB, ADMA2,              19, 1); /* since v2 */
 FIELD(SDHC_CAPAB, ADMA1,              20, 1); /* v1 only? */
 FIELD(SDHC_CAPAB, HIGHSPEED,          21, 1);
@@ -198,6 +210,15 @@ FIELD(SDHC_CAPAB, V33,                24, 1);
 FIELD(SDHC_CAPAB, V30,                25, 1);
 FIELD(SDHC_CAPAB, V18,                26, 1);
 FIELD(SDHC_CAPAB, BUS64BIT,           28, 1); /* since v2 */
+FIELD(SDHC_CAPAB, ASYNC_INT,          29, 1); /* since v3 */
+FIELD(SDHC_CAPAB, SLOT_TYPE,          30, 2); /* since v3 */
+FIELD(SDHC_CAPAB, BUS_SPEED,          32, 3); /* since v3 */
+FIELD(SDHC_CAPAB, DRIVER_STRENGTH,    36, 3); /* since v3 */
+FIELD(SDHC_CAPAB, DRIVER_TYPE_A,      36, 1); /* since v3 */
+FIELD(SDHC_CAPAB, DRIVER_TYPE_C,      37, 1); /* since v3 */
+FIELD(SDHC_CAPAB, DRIVER_TYPE_D,      38, 1); /* since v3 */
+FIELD(SDHC_CAPAB, TIMER_RETUNNING,    40, 4); /* since v3 */
+FIELD(SDHC_CAPAB, SDR50_TUNNING,      45, 1); /* since v3 */
 
 /* HWInit Maximum Current Capabilities Register 0x0 */
 #define SDHC_MAXCURR                   0x48
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index a80b7c0424..c0098fc920 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -114,6 +114,8 @@ typedef struct SDHCIState {
         /* v2 */
         bool adma1, adma2;
         bool bus64;
+        /* v3 */
+        uint8_t slot_type, sdr, strength;
     } cap;
 } SDHCIState;
 
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 83b027a3b6..3f5e0760f6 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -62,6 +62,17 @@ static void sdhci_init_capareg(SDHCIState *s, Error **errp)
     uint32_t val;
 
     switch (s->spec_version) {
+    case 3:
+        val = FIELD_EX64(capareg, SDHC_CAPAB, SLOT_TYPE);
+        if (val) {
+            error_setg(errp, "slot-type not supported");
+            return;
+        }
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, SLOT_TYPE, val);
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, BUS_SPEED, s->cap.sdr);
+        capareg = FIELD_DP64(capareg, SDHC_CAPAB, DRIVER_STRENGTH,
+                             s->cap.strength);
+
     /* fallback */
     case 2:
         capareg = FIELD_DP64(capareg, SDHC_CAPAB, ADMA1, s->cap.adma1);
@@ -1174,8 +1185,11 @@ static inline unsigned int sdhci_get_fifolen(SDHCIState *s)
 
 static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
 {
-    if (s->spec_version != 2) {
-        error_setg(errp, "Only Spec v2 is supported");
+    switch (s->spec_version) {
+    case 2 ... 3:
+        break;
+    default:
+        error_setg(errp, "Only Spec v2/v3 are supported");
         return;
     }
     s->version = (SDHC_HCVER_VENDOR << 8) | (s->spec_version - 1);
@@ -1327,6 +1341,9 @@ static Property sdhci_properties[] = {
     DEFINE_PROP_BOOL("1v8", SDHCIState, cap.v18, false),
 
     DEFINE_PROP_BOOL("64bit", SDHCIState, cap.bus64, false),
+    DEFINE_PROP_UINT8("slot-type", SDHCIState, cap.slot_type, 0),
+    DEFINE_PROP_UINT8("bus-speed", SDHCIState, cap.sdr, 0),
+    DEFINE_PROP_UINT8("driver-strength", SDHCIState, cap.strength, 0),
 
     /* capareg: deprecated */
     DEFINE_PROP_UINT64("capareg", SDHCIState, capareg, UINT64_MAX),
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 17/31] sdhci: rename the hostctl1 register
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (14 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 16/31] sdhci: add v3 capabilities Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 21:54   ` Alistair Francis
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 18/31] sdhci: add the Broadcom BCM2835 SDHCI controller Philippe Mathieu-Daudé
                   ` (13 subsequent siblings)
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

As per the Spec v3.00

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 include/hw/sd/sdhci.h |  2 +-
 hw/sd/sdhci.c         | 14 +++++++-------
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index c0098fc920..ecd192ee47 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -65,7 +65,7 @@ typedef struct SDHCIState {
     /* Buffer Data Port Register - virtual access point to R and W buffers */
     uint32_t prnsts;       /* Present State Register */
     /* 0x28 */
-    uint8_t  hostctl;      /* Host Control Register */
+    uint8_t  hostctl1;     /* Host Control Register */
     uint8_t  pwrcon;       /* Power control Register */
     uint8_t  blkgap;       /* Block Gap Control Register */
     uint8_t  wakcon;       /* WakeUp Control Register */
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 3f5e0760f6..d7e247cb48 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -600,7 +600,7 @@ static void get_adma_description(SDHCIState *s, ADMADescr *dscr)
     uint32_t adma1 = 0;
     uint64_t adma2 = 0;
     hwaddr entry_addr = (hwaddr)s->admasysaddr;
-    switch (SDHC_DMA_TYPE(s->hostctl)) {
+    switch (SDHC_DMA_TYPE(s->hostctl1)) {
     case SDHC_CTRL_ADMA2_32:
         dma_memory_read(&s->dma_as, entry_addr, (uint8_t *)&adma2,
                         sizeof(adma2));
@@ -789,7 +789,7 @@ static void sdhci_data_transfer(void *opaque)
     SDHCIState *s = (SDHCIState *)opaque;
 
     if (s->trnmod & SDHC_TRNS_DMA) {
-        switch (SDHC_DMA_TYPE(s->hostctl)) {
+        switch (SDHC_DMA_TYPE(s->hostctl1)) {
         case SDHC_CTRL_SDMA:
             if ((s->blkcnt == 1) || !(s->trnmod & SDHC_TRNS_MULTI)) {
                 sdhci_sdma_transfer_single_block(s);
@@ -898,7 +898,7 @@ static uint64_t sdhci_read(void *opaque, hwaddr offset, unsigned size)
         ret = s->prnsts;
         break;
     case SDHC_HOSTCTL:
-        ret = s->hostctl | (s->pwrcon << 8) | (s->blkgap << 16) |
+        ret = s->hostctl1 | (s->pwrcon << 8) | (s->blkgap << 16) |
               (s->wakcon << 24);
         break;
     case SDHC_CLKCON:
@@ -1016,7 +1016,7 @@ sdhci_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)
         MASKED_WRITE(s->sdmasysad, mask, value);
         /* Writing to last byte of sdmasysad might trigger transfer */
         if (!(mask & 0xFF000000) && TRANSFERRING_DATA(s->prnsts) && s->blkcnt &&
-                s->blksize && SDHC_DMA_TYPE(s->hostctl) == SDHC_CTRL_SDMA) {
+                s->blksize && SDHC_DMA_TYPE(s->hostctl1) == SDHC_CTRL_SDMA) {
             if (s->trnmod & SDHC_TRNS_MULTI) {
                 sdhci_sdma_transfer_multi_blocks(s);
             } else {
@@ -1068,14 +1068,14 @@ sdhci_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)
         if (!(mask & 0xFF0000)) {
             sdhci_blkgap_write(s, value >> 16);
         }
-        MASKED_WRITE(s->hostctl, mask, value);
+        MASKED_WRITE(s->hostctl1, mask, value);
         MASKED_WRITE(s->pwrcon, mask >> 8, value >> 8);
         MASKED_WRITE(s->wakcon, mask >> 24, value >> 24);
         if (!(s->prnsts & SDHC_CARD_PRESENT) || ((s->pwrcon >> 1) & 0x7) < 5 ||
                 !(s->capareg & (1 << (31 - ((s->pwrcon >> 1) & 0x7))))) {
             s->pwrcon &= ~SDHC_POWER_ON;
         }
-        qemu_set_irq(s->access_led, s->hostctl & 1);
+        qemu_set_irq(s->access_led, s->hostctl1 & 1);
         break;
     case SDHC_CLKCON:
         if (!(mask & 0xFF000000)) {
@@ -1284,7 +1284,7 @@ const VMStateDescription sdhci_vmstate = {
         VMSTATE_UINT16(cmdreg, SDHCIState),
         VMSTATE_UINT32_ARRAY(rspreg, SDHCIState, 4),
         VMSTATE_UINT32(prnsts, SDHCIState),
-        VMSTATE_UINT8(hostctl, SDHCIState),
+        VMSTATE_UINT8(hostctl1, SDHCIState),
         VMSTATE_UINT8(pwrcon, SDHCIState),
         VMSTATE_UINT8(blkgap, SDHCIState),
         VMSTATE_UINT8(wakcon, SDHCIState),
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 18/31] sdhci: add the Broadcom BCM2835 SDHCI controller
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (15 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 17/31] sdhci: rename the hostctl1 register Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 19/31] hw/arm/bcm2835_peripherals: use the "brcm, bcm2835-sdhci" device Philippe Mathieu-Daudé
                   ` (12 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

based on Arasan SD 3.0, eMMC 4.4

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/bcm2835_sdhci.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/sd/Makefile.objs   |  2 +-
 2 files changed, 78 insertions(+), 1 deletion(-)
 create mode 100644 hw/sd/bcm2835_sdhci.c

diff --git a/hw/sd/bcm2835_sdhci.c b/hw/sd/bcm2835_sdhci.c
new file mode 100644
index 0000000000..3baf0887d8
--- /dev/null
+++ b/hw/sd/bcm2835_sdhci.c
@@ -0,0 +1,77 @@
+/*
+ * Broadcom BCM2835 SDHCI controller emulation
+ *
+ * Copyright (C) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * (at your option) any later version.  See the COPYING file in the
+ * top-level directory.
+ */
+#include "qemu/osdep.h"
+#include "hw/sd/sdhci.h"
+#include "qapi/error.h"
+
+/* Compatible with:
+ * - SD Host Controller Specification Version 3.0 Draft 1.0
+ * - SDIO Specification Version 3.0
+ * - MMC Specification Version 4.4
+ *
+ * - 32-bit access only
+ * - default clocks
+ * - no DMA
+ * - SD high-speed (SDHS) card
+ * - maximum block size: 1kB
+ *
+ * For the exact details please refer to the Arasan documentation:
+ *   SD3.0_Host_AHB_eMMC4.4_Usersguide_ver5.9_jan11_10.pdf   ¯\_(ツ)_/¯
+ */
+static void bcm2835_sdhci_realize(DeviceState *dev, Error **errp)
+{
+    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_GET_CLASS(dev);
+    Object *obj = OBJECT(dev);
+    Error *local_err = NULL;
+
+    object_property_set_uint(obj, 3, "sd-spec-version", &local_err);
+    object_property_set_uint(obj, 52, "timeout-freq", &local_err);
+    object_property_set_uint(obj, 52, "max-frequency", &local_err);
+    object_property_set_bool(obj, false, "sdma", &local_err);
+    object_property_set_bool(obj, false, "adma1", &local_err);
+    object_property_set_bool(obj, false, "adma2", &local_err);
+    object_property_set_bool(obj, true, "1v8", &local_err);
+    /* FIXME verify/validate with someone from Broadcom?
+    object_property_set_uint(obj, 1024, "max-block-length", &local_err);
+    */
+    object_property_set_bool(obj, true, "pending-insert-quirk",  &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    cc->parent_realize(dev, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+}
+
+static void bcm2835_sdhci_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_CLASS(klass);
+
+    cc->parent_realize = dc->realize;
+    dc->realize = bcm2835_sdhci_realize;
+}
+
+static const TypeInfo bcm2835_sdhci_info = {
+    .name = "brcm,bcm2835-sdhci",
+    .parent = TYPE_SYSBUS_SDHCI,
+    .class_init = bcm2835_sdhci_class_init,
+};
+
+static void brcm_sdhci_register_types(void)
+{
+    type_register_static(&bcm2835_sdhci_info);
+}
+
+type_init(brcm_sdhci_register_types)
diff --git a/hw/sd/Makefile.objs b/hw/sd/Makefile.objs
index ef0fc3d3f7..b3e69c3018 100644
--- a/hw/sd/Makefile.objs
+++ b/hw/sd/Makefile.objs
@@ -10,7 +10,7 @@ common-obj-$(CONFIG_SDHCI) += sdhci.o
 obj-$(CONFIG_MILKYMIST) += milkymist-memcard.o
 obj-$(CONFIG_OMAP) += omap_mmc.o
 obj-$(CONFIG_PXA2XX) += pxa2xx_mmci.o
-obj-$(CONFIG_RASPI) += bcm2835_sdhost.o
+obj-$(CONFIG_RASPI) += bcm2835_sdhost.o bcm2835_sdhci.o
 
 # emulated SD/MMC devices
 common-obj-$(CONFIG_SD) += sd.o
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 19/31] hw/arm/bcm2835_peripherals: use the "brcm, bcm2835-sdhci" device
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (16 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 18/31] sdhci: add the Broadcom BCM2835 SDHCI controller Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 20/31] sdhci: add the Freescale controller for i.MX Philippe Mathieu-Daudé
                   ` (11 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

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

diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 12e0dd11af..6a9fd79bcf 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -18,9 +18,6 @@
 /* Peripheral base address on the VC (GPU) system bus */
 #define BCM2835_VC_PERI_BASE 0x7e000000
 
-/* Capabilities for SD controller: no DMA, high-speed, default clocks etc. */
-#define BCM2835_SDHC_CAPAREG 0x52034b4
-
 static void bcm2835_peripherals_init(Object *obj)
 {
     BCM2835PeripheralState *s = BCM2835_PERIPHERALS(obj);
@@ -91,7 +88,7 @@ static void bcm2835_peripherals_init(Object *obj)
     qdev_set_parent_bus(DEVICE(&s->rng), sysbus_get_default());
 
     /* Extended Mass Media Controller */
-    object_initialize(&s->sdhci, sizeof(s->sdhci), TYPE_SYSBUS_SDHCI);
+    object_initialize(&s->sdhci, sizeof(s->sdhci), "brcm,bcm2835-sdhci");
     object_property_add_child(obj, "sdhci", OBJECT(&s->sdhci), NULL);
     qdev_set_parent_bus(DEVICE(&s->sdhci), sysbus_get_default());
 
@@ -255,20 +252,6 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                 sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->rng), 0));
 
     /* Extended Mass Media Controller */
-    object_property_set_int(OBJECT(&s->sdhci), BCM2835_SDHC_CAPAREG, "capareg",
-                            &err);
-    if (err) {
-        error_propagate(errp, err);
-        return;
-    }
-
-    object_property_set_bool(OBJECT(&s->sdhci), true, "pending-insert-quirk",
-                             &err);
-    if (err) {
-        error_propagate(errp, err);
-        return;
-    }
-
     object_property_set_bool(OBJECT(&s->sdhci), true, "realized", &err);
     if (err) {
         error_propagate(errp, err);
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 20/31] sdhci: add the Freescale controller for i.MX
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (17 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 19/31] hw/arm/bcm2835_peripherals: use the "brcm, bcm2835-sdhci" device Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 21/31] hw/arm/fsl-imx6: use the "fsl, imx6q-usdhc" controller Philippe Mathieu-Daudé
                   ` (10 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/fsl-sdhc.c    | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/sd/Makefile.objs |  1 +
 2 files changed, 59 insertions(+)
 create mode 100644 hw/sd/fsl-sdhc.c

diff --git a/hw/sd/fsl-sdhc.c b/hw/sd/fsl-sdhc.c
new file mode 100644
index 0000000000..aa8075a9e5
--- /dev/null
+++ b/hw/sd/fsl-sdhc.c
@@ -0,0 +1,58 @@
+/*
+ * Freescale SD Host Controller for i.MX emulation
+ *
+ * Copyright (C) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * (at your option) any later version.  See the COPYING file in the
+ * top-level directory.
+ */
+#include "qemu/osdep.h"
+#include "hw/sd/sdhci.h"
+#include "qapi/error.h"
+
+/* UHS-I SDIO3.0 SDR104 1.8V ADMA */
+static void fsl_imx6q_usdhc_realize(DeviceState *dev, Error **errp)
+{
+    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_GET_CLASS(dev);
+    Object *obj = OBJECT(dev);
+    Error *local_err = NULL;
+
+    object_property_set_uint(obj, 3, "sd-spec-version", &local_err);
+    object_property_set_uint(obj, 52, "timeout-freq", &local_err);
+    object_property_set_uint(obj, 52, "max-frequency", &local_err);
+    object_property_set_bool(obj, true, "adma1", &local_err);
+    object_property_set_bool(obj, true, "1v8", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    cc->parent_realize(dev, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+}
+
+static void fsl_imx6q_usdhc_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_CLASS(klass);
+
+    cc->parent_realize = dc->realize;
+    dc->realize = fsl_imx6q_usdhc_realize;
+}
+
+static const TypeInfo fsl_imx6q_usdhc_info = {
+    .name = "fsl,imx6q-usdhc",
+    .parent = TYPE_SYSBUS_SDHCI,
+    .class_init = fsl_imx6q_usdhc_class_init,
+};
+
+static void fsl_imx_sdhc_register_types(void)
+{
+    type_register_static(&fsl_imx6q_usdhc_info);
+}
+
+type_init(fsl_imx_sdhc_register_types)
diff --git a/hw/sd/Makefile.objs b/hw/sd/Makefile.objs
index b3e69c3018..b058a9328e 100644
--- a/hw/sd/Makefile.objs
+++ b/hw/sd/Makefile.objs
@@ -4,6 +4,7 @@ common-obj-$(CONFIG_SD) += core.o
 # SD/MMC host adapters
 common-obj-$(CONFIG_PL181) += pl181.o
 common-obj-$(CONFIG_ZYNQ) += arasan_sdhci.o
+common-obj-$(CONFIG_IMX) += fsl-sdhc.o
 common-obj-$(CONFIG_EXYNOS4) += dw-mshc.o
 common-obj-$(CONFIG_SSI_SD) += ssi-sd.o
 common-obj-$(CONFIG_SDHCI) += sdhci.o
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 21/31] hw/arm/fsl-imx6: use the "fsl, imx6q-usdhc" controller
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (18 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 20/31] sdhci: add the Freescale controller for i.MX Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 22/31] sdhci: add the generic Arasan SDHCI 8.9a PHY Philippe Mathieu-Daudé
                   ` (9 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

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

diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index 59ef33efa9..f632ec7519 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -93,7 +93,7 @@ static void fsl_imx6_init(Object *obj)
     }
 
     for (i = 0; i < FSL_IMX6_NUM_ESDHCS; i++) {
-        object_initialize(&s->esdhc[i], sizeof(s->esdhc[i]), TYPE_SYSBUS_SDHCI);
+        object_initialize(&s->esdhc[i], sizeof(s->esdhc[i]), "fsl,imx6q-usdhc");
         qdev_set_parent_bus(DEVICE(&s->esdhc[i]), sysbus_get_default());
         snprintf(name, NAME_SIZE, "sdhc%d", i + 1);
         object_property_add_child(obj, name, OBJECT(&s->esdhc[i]), NULL);
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 22/31] sdhci: add the generic Arasan SDHCI 8.9a PHY
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (19 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 21/31] hw/arm/fsl-imx6: use the "fsl, imx6q-usdhc" controller Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 23/31] hw/arm/xilinx_zynqmp: use the "arasan, sdhci-8.9a" device Philippe Mathieu-Daudé
                   ` (8 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

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

diff --git a/hw/sd/arasan_sdhci.c b/hw/sd/arasan_sdhci.c
index c6d96b2583..11160baa22 100644
--- a/hw/sd/arasan_sdhci.c
+++ b/hw/sd/arasan_sdhci.c
@@ -49,6 +49,42 @@ static void arasan4_9a_sdhci_realize(DeviceState *dev, Error **errp)
     }
 }
 
+/* Compatible with:
+ * - SD Host Controller Specification Version 3.00
+ * - SDIO Specification Version 3.0
+ * - eMMC Specification Version 4.51
+ *
+ * Host clock rate variable between 0 and 208 MHz
+ * Transfers the data in SDR104, SDR50, DDR50 modes
+ * (SDR104 mode: up to 832Mbits/s using 4 parallel data lines)
+ * Transfers the data in 1 bit and 4 bit SD modes
+ * UHS speed modes, 1.8V
+ * voltage switch, tuning commands
+ */
+static void arasan8_9a_sdhci_realize(DeviceState *dev, Error **errp)
+{
+    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_GET_CLASS(dev);
+    Object *obj = OBJECT(dev);
+    Error *local_err = NULL;
+
+    object_property_set_uint(obj, 3, "sd-spec-version", &local_err);
+    object_property_set_bool(obj, true, "suspend", &local_err);
+    object_property_set_bool(obj, true, "1v8", &local_err);
+    object_property_set_bool(obj, true, "64bit", &local_err);
+    object_property_set_uint(obj, 0b111, "bus-speed", &local_err);
+    object_property_set_uint(obj, 0b111, "driver-strength", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    cc->parent_realize(dev, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+}
+
 static void arasan4_9a_sdhci_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -58,15 +94,31 @@ static void arasan4_9a_sdhci_class_init(ObjectClass *klass, void *data)
     dc->realize = arasan4_9a_sdhci_realize;
 }
 
+static void arasan8_9a_sdhci_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_CLASS(klass);
+
+    cc->parent_realize = dc->realize;
+    dc->realize = arasan8_9a_sdhci_realize;
+}
+
 static const TypeInfo arasan4_9a_sdhci_info = {
     .name = "arasan,sdhci-4.9a",
     .parent = TYPE_SYSBUS_SDHCI,
     .class_init = arasan4_9a_sdhci_class_init,
 };
 
+static const TypeInfo arasan8_9a_sdhci_info = {
+    .name = "arasan,sdhci-8.9a",
+    .parent = TYPE_SYSBUS_SDHCI,
+    .class_init = arasan8_9a_sdhci_class_init,
+};
+
 static void arasan_sdhci_register_types(void)
 {
     type_register_static(&arasan4_9a_sdhci_info);
+    type_register_static(&arasan8_9a_sdhci_info);
 }
 
 type_init(arasan_sdhci_register_types)
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 23/31] hw/arm/xilinx_zynqmp: use the "arasan, sdhci-8.9a" device
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (20 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 22/31] sdhci: add the generic Arasan SDHCI 8.9a PHY Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 24/31] sdhci: let the SYSBUS_SDHCI type be abstract Philippe Mathieu-Daudé
                   ` (7 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite, Edgar E. Iglesias

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

diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index 325642058b..e4f9193adc 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -164,7 +164,7 @@ static void xlnx_zynqmp_init(Object *obj)
 
     for (i = 0; i < XLNX_ZYNQMP_NUM_SDHCI; i++) {
         object_initialize(&s->sdhci[i], sizeof(s->sdhci[i]),
-                          TYPE_SYSBUS_SDHCI);
+                          "arasan,sdhci-8.9a");
         qdev_set_parent_bus(DEVICE(&s->sdhci[i]),
                             sysbus_get_default());
     }
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 24/31] sdhci: let the SYSBUS_SDHCI type be abstract
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (21 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 23/31] hw/arm/xilinx_zynqmp: use the "arasan, sdhci-8.9a" device Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 25/31] sdhci: check Spec v3 capabilities qtest Philippe Mathieu-Daudé
                   ` (6 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

all boards previously using it now use a SYSBUS_SDHCI child.

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

diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index d7e247cb48..34bda73b66 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1463,6 +1463,7 @@ static void sdhci_sysbus_class_init(ObjectClass *klass, void *data)
 }
 
 static const TypeInfo sdhci_sysbus_info = {
+    .abstract = true,
     .name = TYPE_SYSBUS_SDHCI,
     .parent = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(SDHCIState),
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 25/31] sdhci: check Spec v3 capabilities qtest
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (22 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 24/31] sdhci: let the SYSBUS_SDHCI type be abstract Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 26/31] sdhci: remove the deprecated 'capareg' property Philippe Mathieu-Daudé
                   ` (5 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 tests/sdhci-test.c     | 12 ++++++++++++
 tests/Makefile.include |  1 +
 2 files changed, 13 insertions(+)

diff --git a/tests/sdhci-test.c b/tests/sdhci-test.c
index 200d7bcee2..f7487808af 100644
--- a/tests/sdhci-test.c
+++ b/tests/sdhci-test.c
@@ -29,9 +29,21 @@ static const struct sdhci_t {
     { "arm",    "smdkc210",
         {0x12510000, 2, 0, {1, 0x5e80080} } },
 
+    /* i.MX 6 */
+    { "arm",    "sabrelite",
+        {0x02190000, 3, 0, {1, 0x057834b4} } },
+
+    /* BCM2835 */
+    { "arm",    "raspi2",
+        {0x3f300000, 3, 52, {0, 0x52034b4} } },
+
     /* Zynq-7000 */
     { "arm",    "xilinx-zynq-a9",
         {0xe0100000, 2, 0, {1, 0x01790080} } },
+
+    /* ZynqMP */
+    { "aarch64", "xlnx-zcu102",
+        {0xff160000, 3, 0, {1, 0x7715e80080} } },
 };
 
 static uint32_t sdhci_readl(uintptr_t base, uint32_t reg_addr)
diff --git a/tests/Makefile.include b/tests/Makefile.include
index 2d7058ca4c..0cf327425e 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -360,6 +360,7 @@ gcov-files-arm-y += hw/timer/arm_mptimer.c
 check-qtest-arm-y += tests/sdhci-test$(EXESUF)
 
 check-qtest-aarch64-y = tests/numa-test$(EXESUF)
+check-qtest-aarch64-y += tests/sdhci-test$(EXESUF)
 
 check-qtest-microblazeel-y = $(check-qtest-microblaze-y)
 
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 26/31] sdhci: remove the deprecated 'capareg' property
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (23 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 25/31] sdhci: check Spec v3 capabilities qtest Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-09 22:00   ` Alistair Francis
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 27/31] sdhci: add check_capab_readonly() qtest Philippe Mathieu-Daudé
                   ` (4 subsequent siblings)
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

All SDHCI consumers have been upgraded to set correct properties.

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

diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 34bda73b66..ae914a6ef9 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1194,9 +1194,7 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
     }
     s->version = (SDHC_HCVER_VENDOR << 8) | (s->spec_version - 1);
 
-    if (s->capareg == UINT64_MAX) {
-        sdhci_init_capareg(s, errp);
-    }
+    sdhci_init_capareg(s, errp);
 }
 
 static void sdhci_initfn(SDHCIState *s)
@@ -1345,9 +1343,6 @@ static Property sdhci_properties[] = {
     DEFINE_PROP_UINT8("bus-speed", SDHCIState, cap.sdr, 0),
     DEFINE_PROP_UINT8("driver-strength", SDHCIState, cap.strength, 0),
 
-    /* capareg: deprecated */
-    DEFINE_PROP_UINT64("capareg", SDHCIState, capareg, UINT64_MAX),
-
     DEFINE_PROP_UINT64("maxcurr", SDHCIState, maxcurr, 0),
     DEFINE_PROP_BOOL("pending-insert-quirk", SDHCIState, pending_insert_quirk,
                      false),
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 27/31] sdhci: add check_capab_readonly() qtest
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (24 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 26/31] sdhci: remove the deprecated 'capareg' property Philippe Mathieu-Daudé
@ 2018-01-08 15:42 ` Philippe Mathieu-Daudé
  2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 28/31] sdhci: add a check_capab_baseclock() qtest Philippe Mathieu-Daudé
                   ` (3 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:42 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 tests/sdhci-test.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/tests/sdhci-test.c b/tests/sdhci-test.c
index f7487808af..0443a23e45 100644
--- a/tests/sdhci-test.c
+++ b/tests/sdhci-test.c
@@ -60,6 +60,13 @@ static uint64_t sdhci_readq(uintptr_t base, uint32_t reg_addr)
     return qtest_readq(qtest, base + reg_addr);
 }
 
+static void sdhci_writeq(uintptr_t base, uint32_t reg_addr, uint64_t value)
+{
+    QTestState *qtest = global_qtest;
+
+    qtest_writeq(qtest, base + reg_addr, value);
+}
+
 static void check_specs_version(uintptr_t addr, uint8_t version)
 {
     uint32_t v;
@@ -78,6 +85,20 @@ static void check_capab_capareg(uintptr_t addr, uint64_t expected_capab)
     g_assert_cmphex(capab, ==, expected_capab);
 }
 
+static void check_capab_readonly(uintptr_t addr)
+{
+    const uint64_t vrand = 0x123456789abcdef;
+    uint64_t capab0, capab1;
+
+    capab0 = sdhci_readq(addr, SDHC_CAPAB);
+    g_assert_cmpuint(capab0, !=, vrand);
+
+    sdhci_writeq(addr, SDHC_CAPAB, vrand);
+    capab1 = sdhci_readq(addr, SDHC_CAPAB);
+    g_assert_cmpuint(capab1, !=, vrand);
+    g_assert_cmpuint(capab1, ==, capab0);
+}
+
 static void test_machine(const void *data)
 {
     const struct sdhci_t *test = data;
@@ -86,6 +107,7 @@ static void test_machine(const void *data)
 
     check_capab_capareg(test->sdhci.addr, test->sdhci.capab.reg);
     check_specs_version(test->sdhci.addr, test->sdhci.version);
+    check_capab_readonly(test->sdhci.addr);
 
     qtest_quit(global_qtest);
 }
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 28/31] sdhci: add a check_capab_baseclock() qtest
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (25 preceding siblings ...)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 27/31] sdhci: add check_capab_readonly() qtest Philippe Mathieu-Daudé
@ 2018-01-08 15:43 ` Philippe Mathieu-Daudé
  2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 29/31] sdhci: add a check_capab_sdma() qtest Philippe Mathieu-Daudé
                   ` (2 subsequent siblings)
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:43 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 tests/sdhci-test.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/tests/sdhci-test.c b/tests/sdhci-test.c
index 0443a23e45..2aa3fa0d3b 100644
--- a/tests/sdhci-test.c
+++ b/tests/sdhci-test.c
@@ -7,9 +7,11 @@
  * See the COPYING file in the top-level directory.
  */
 #include "qemu/osdep.h"
+#include "hw/registerfields.h"
 #include "libqtest.h"
 
 #define SDHC_CAPAB                      0x40
+FIELD(SDHC_CAPAB, BASECLKFREQ,               8, 8); /* since v2 */
 #define SDHC_HCVER                      0xFE
 
 static const struct sdhci_t {
@@ -99,6 +101,18 @@ static void check_capab_readonly(uintptr_t addr)
     g_assert_cmpuint(capab1, ==, capab0);
 }
 
+static void check_capab_baseclock(uintptr_t addr, uint8_t expected_freq)
+{
+    uint64_t capab, capab_freq;
+
+    if (!expected_freq) {
+        return;
+    }
+    capab = sdhci_readq(addr, SDHC_CAPAB);
+    capab_freq = FIELD_EX64(capab, SDHC_CAPAB, BASECLKFREQ);
+    g_assert_cmpuint(capab_freq, ==, expected_freq);
+}
+
 static void test_machine(const void *data)
 {
     const struct sdhci_t *test = data;
@@ -108,6 +122,7 @@ static void test_machine(const void *data)
     check_capab_capareg(test->sdhci.addr, test->sdhci.capab.reg);
     check_specs_version(test->sdhci.addr, test->sdhci.version);
     check_capab_readonly(test->sdhci.addr);
+    check_capab_baseclock(test->sdhci.addr, test->sdhci.baseclock);
 
     qtest_quit(global_qtest);
 }
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 29/31] sdhci: add a check_capab_sdma() qtest
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (26 preceding siblings ...)
  2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 28/31] sdhci: add a check_capab_baseclock() qtest Philippe Mathieu-Daudé
@ 2018-01-08 15:43 ` Philippe Mathieu-Daudé
  2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 30/31] sdhci: add a check_capab_v3() qtest Philippe Mathieu-Daudé
  2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 31/31] sdhci: add Spec v4.2 register definitions Philippe Mathieu-Daudé
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:43 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 tests/sdhci-test.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/tests/sdhci-test.c b/tests/sdhci-test.c
index 2aa3fa0d3b..91b1b29d75 100644
--- a/tests/sdhci-test.c
+++ b/tests/sdhci-test.c
@@ -12,6 +12,7 @@
 
 #define SDHC_CAPAB                      0x40
 FIELD(SDHC_CAPAB, BASECLKFREQ,               8, 8); /* since v2 */
+FIELD(SDHC_CAPAB, SDMA,                     22, 1);
 #define SDHC_HCVER                      0xFE
 
 static const struct sdhci_t {
@@ -113,6 +114,15 @@ static void check_capab_baseclock(uintptr_t addr, uint8_t expected_freq)
     g_assert_cmpuint(capab_freq, ==, expected_freq);
 }
 
+static void check_capab_sdma(uintptr_t addr, bool supported)
+{
+    uint64_t capab, capab_sdma;
+
+    capab = sdhci_readq(addr, SDHC_CAPAB);
+    capab_sdma = FIELD_EX64(capab, SDHC_CAPAB, SDMA);
+    g_assert_cmpuint(capab_sdma, ==, supported);
+}
+
 static void test_machine(const void *data)
 {
     const struct sdhci_t *test = data;
@@ -122,6 +132,7 @@ static void test_machine(const void *data)
     check_capab_capareg(test->sdhci.addr, test->sdhci.capab.reg);
     check_specs_version(test->sdhci.addr, test->sdhci.version);
     check_capab_readonly(test->sdhci.addr);
+    check_capab_sdma(test->sdhci.addr, test->sdhci.capab.sdma);
     check_capab_baseclock(test->sdhci.addr, test->sdhci.baseclock);
 
     qtest_quit(global_qtest);
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 30/31] sdhci: add a check_capab_v3() qtest
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (27 preceding siblings ...)
  2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 29/31] sdhci: add a check_capab_sdma() qtest Philippe Mathieu-Daudé
@ 2018-01-08 15:43 ` Philippe Mathieu-Daudé
  2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 31/31] sdhci: add Spec v4.2 register definitions Philippe Mathieu-Daudé
  29 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:43 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 tests/sdhci-test.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/tests/sdhci-test.c b/tests/sdhci-test.c
index 91b1b29d75..6ebe9f4d25 100644
--- a/tests/sdhci-test.c
+++ b/tests/sdhci-test.c
@@ -13,6 +13,8 @@
 #define SDHC_CAPAB                      0x40
 FIELD(SDHC_CAPAB, BASECLKFREQ,               8, 8); /* since v2 */
 FIELD(SDHC_CAPAB, SDMA,                     22, 1);
+FIELD(SDHC_CAPAB, SDR,                      32, 3); /* since v3 */
+FIELD(SDHC_CAPAB, DRIVER,                   36, 3); /* since v3 */
 #define SDHC_HCVER                      0xFE
 
 static const struct sdhci_t {
@@ -123,6 +125,21 @@ static void check_capab_sdma(uintptr_t addr, bool supported)
     g_assert_cmpuint(capab_sdma, ==, supported);
 }
 
+static void check_capab_v3(uintptr_t addr, uint8_t version)
+{
+    uint64_t capab, capab_v3;
+
+    if (version >= 3) {
+        return;
+    }
+    /* before v3 those fields are RESERVED */
+    capab = sdhci_readq(addr, SDHC_CAPAB);
+    capab_v3 = FIELD_EX64(capab, SDHC_CAPAB, SDR);
+    g_assert_cmpuint(capab_v3, ==, 0);
+    capab_v3 = FIELD_EX64(capab, SDHC_CAPAB, DRIVER);
+    g_assert_cmpuint(capab_v3, ==, 0);
+}
+
 static void test_machine(const void *data)
 {
     const struct sdhci_t *test = data;
@@ -132,6 +149,7 @@ static void test_machine(const void *data)
     check_capab_capareg(test->sdhci.addr, test->sdhci.capab.reg);
     check_specs_version(test->sdhci.addr, test->sdhci.version);
     check_capab_readonly(test->sdhci.addr);
+    check_capab_v3(test->sdhci.addr, test->sdhci.version);
     check_capab_sdma(test->sdhci.addr, test->sdhci.capab.sdma);
     check_capab_baseclock(test->sdhci.addr, test->sdhci.baseclock);
 
-- 
2.15.1

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

* [Qemu-devel] [PATCH v5 31/31] sdhci: add Spec v4.2 register definitions
  2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
                   ` (28 preceding siblings ...)
  2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 30/31] sdhci: add a check_capab_v3() qtest Philippe Mathieu-Daudé
@ 2018-01-08 15:43 ` Philippe Mathieu-Daudé
  2018-01-18 18:21   ` Alistair Francis
  29 siblings, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 15:43 UTC (permalink / raw)
  To: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Edgar E . Iglesias, Sai Pavan Boddu,
	Clement Deschamps, Jean-Christophe Dubois, Grégory Estrade,
	Krzysztof Kozlowski, Andrew Baumann, Prasad J Pandit, qemu-arm,
	Eduardo Habkost, Peter Crosthwaite

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

diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
index 1da91a27b4..8193aa1821 100644
--- a/hw/sd/sdhci-internal.h
+++ b/hw/sd/sdhci-internal.h
@@ -191,6 +191,10 @@ FIELD(SDHC_HOSTCTL2, V18_ENA,          3, 1); /* UHS-I only */
 FIELD(SDHC_HOSTCTL2, DRIVER_STRENGTH,  4, 2); /* UHS-I only */
 FIELD(SDHC_HOSTCTL2, EXECUTE_TUNING,   6, 1); /* UHS-I only */
 FIELD(SDHC_HOSTCTL2, SAMPLING_CLKSEL,  7, 1); /* UHS-I only */
+FIELD(SDHC_HOSTCTL2, UHS_II_ENA,       8, 1); /* since v4 */
+FIELD(SDHC_HOSTCTL2, ADMA2_LENGTH,    10, 1); /* since v4 */
+FIELD(SDHC_HOSTCTL2, CMD23_ENA,       11, 1); /* since v4 */
+FIELD(SDHC_HOSTCTL2, VERSION4,        12, 1); /* since v4 */
 FIELD(SDHC_HOSTCTL2, ASYNC_INT,       14, 1);
 FIELD(SDHC_HOSTCTL2, PRESET_ENA,      15, 1);
 
@@ -219,12 +223,16 @@ FIELD(SDHC_CAPAB, DRIVER_TYPE_C,      37, 1); /* since v3 */
 FIELD(SDHC_CAPAB, DRIVER_TYPE_D,      38, 1); /* since v3 */
 FIELD(SDHC_CAPAB, TIMER_RETUNNING,    40, 4); /* since v3 */
 FIELD(SDHC_CAPAB, SDR50_TUNNING,      45, 1); /* since v3 */
+FIELD(SDHC_CAPAB, CLK_MUL,            48, 8); /* since v4.20 */
+FIELD(SDHC_CAPAB, ADMA3,              59, 1); /* since v4.20 */
+FIELD(SDHC_CAPAB, V18_VDD2,           60, 1); /* since v4.20 */
 
 /* HWInit Maximum Current Capabilities Register 0x0 */
 #define SDHC_MAXCURR                   0x48
 FIELD(SDHC_MAXCURR, V33_VDD1,          0, 8);
 FIELD(SDHC_MAXCURR, V30_VDD1,          8, 8);
 FIELD(SDHC_MAXCURR, V18_VDD1,         16, 8);
+FIELD(SDHC_MAXCURR, V18_VDD2,         32, 8); /* since v4.20 */
 
 /* W Force Event Auto CMD12 Error Interrupt Register 0x0000 */
 #define SDHC_FEAER                     0x50
-- 
2.15.1

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

* Re: [Qemu-devel] [PATCH v5 01/31] sdhci: add a spec_version property
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 01/31] sdhci: add a spec_version property Philippe Mathieu-Daudé
@ 2018-01-08 21:41   ` Alistair Francis
  0 siblings, 0 replies; 45+ messages in thread
From: Alistair Francis @ 2018-01-08 21:41 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On Mon, Jan 8, 2018 at 7:42 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> default to Spec v2.00
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

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

Alistair

> ---
>  hw/sd/sdhci-internal.h |  4 ++--
>  include/hw/sd/sdhci.h  |  3 +++
>  hw/sd/sdhci.c          | 19 +++++++++++++++++--
>  3 files changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
> index b7475a1b7b..cf4a055159 100644
> --- a/hw/sd/sdhci-internal.h
> +++ b/hw/sd/sdhci-internal.h
> @@ -212,9 +212,9 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
>  /* Slot interrupt status */
>  #define SDHC_SLOT_INT_STATUS            0xFC
>
> -/* HWInit Host Controller Version Register 0x0401 */
> +/* HWInit Host Controller Version Register */
>  #define SDHC_HCVER                      0xFE
> -#define SD_HOST_SPECv2_VERS             0x2401
> +#define SDHC_HCVER_VENDOR               0x24
>
>  #define SDHC_REGISTERS_MAP_SIZE         0x100
>  #define SDHC_INSERTION_DELAY            (NANOSECONDS_PER_SECOND)
> diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
> index 2aea20f1d8..ddd5040410 100644
> --- a/include/hw/sd/sdhci.h
> +++ b/include/hw/sd/sdhci.h
> @@ -91,6 +91,8 @@ typedef struct SDHCIState {
>      uint64_t capareg;      /* Capabilities Register */
>      /* 0x48 */
>      uint64_t maxcurr;      /* Maximum Current Capabilities Register */
> +    /* 0xfe */
> +    uint16_t version;      /* Host Controller Version Register */
>
>      uint8_t  *fifo_buffer; /* SD host i/o FIFO buffer */
>      uint32_t buf_maxsz;
> @@ -99,6 +101,7 @@ typedef struct SDHCIState {
>      bool     pending_insert_state;
>      /* Configurable properties */
>      bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
> +    uint8_t spec_version;
>  } SDHCIState;
>
>  #define TYPE_PCI_SDHCI "sdhci-pci"
> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
> index b080950f80..cd4a8efdd7 100644
> --- a/hw/sd/sdhci.c
> +++ b/hw/sd/sdhci.c
> @@ -169,7 +169,8 @@ static void sdhci_reset(SDHCIState *s)
>
>      timer_del(s->insert_timer);
>      timer_del(s->transfer_timer);
> -    /* Set all registers to 0. Capabilities registers are not cleared
> +
> +    /* Set all registers to 0. Capabilities/Version registers are not cleared
>       * and assumed to always preserve their value, given to them during
>       * initialization */
>      memset(&s->sdmasysad, 0, (uintptr_t)&s->capareg - (uintptr_t)&s->sdmasysad);
> @@ -923,7 +924,7 @@ static uint64_t sdhci_read(void *opaque, hwaddr offset, unsigned size)
>          ret = (uint32_t)(s->admasysaddr >> 32);
>          break;
>      case SDHC_SLOT_INT_STATUS:
> -        ret = (SD_HOST_SPECv2_VERS << 16) | sdhci_slotint(s);
> +        ret = (s->version << 16) | sdhci_slotint(s);
>          break;
>      default:
>          qemu_log_mask(LOG_UNIMP, "SDHC rd_%ub @0x%02" HWADDR_PRIx " "
> @@ -1178,6 +1179,15 @@ static inline unsigned int sdhci_get_fifolen(SDHCIState *s)
>      }
>  }
>
> +static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
> +{
> +    if (s->spec_version != 2) {
> +        error_setg(errp, "Only Spec v2 is supported");
> +        return;
> +    }
> +    s->version = (SDHC_HCVER_VENDOR << 8) | (s->spec_version - 1);
> +}
> +
>  static void sdhci_initfn(SDHCIState *s)
>  {
>      qbus_create_inplace(&s->sdbus, sizeof(s->sdbus),
> @@ -1190,6 +1200,10 @@ static void sdhci_initfn(SDHCIState *s)
>
>  static void sdhci_common_realize(SDHCIState *s, Error **errp)
>  {
> +    sdhci_init_readonly_registers(s, errp);
> +    if (errp && *errp) {
> +        return;
> +    }
>      s->buf_maxsz = sdhci_get_fifolen(s);
>      s->fifo_buffer = g_malloc0(s->buf_maxsz);
>
> @@ -1290,6 +1304,7 @@ const VMStateDescription sdhci_vmstate = {
>  /* Capabilities registers provide information on supported features of this
>   * specific host controller implementation */
>  static Property sdhci_properties[] = {
> +    DEFINE_PROP_UINT8("sd-spec-version", SDHCIState, spec_version, 2),
>      DEFINE_PROP_UINT64("capareg", SDHCIState, capareg,
>              SDHC_CAPAB_REG_DEFAULT),
>      DEFINE_PROP_UINT64("maxcurr", SDHCIState, maxcurr, 0),
> --
> 2.15.1
>
>

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

* Re: [Qemu-devel] [PATCH v5 08/31] hw/sd: clean/reorder the Makefile adding few comments
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 08/31] hw/sd: clean/reorder the Makefile adding few comments Philippe Mathieu-Daudé
@ 2018-01-08 21:53   ` Alistair Francis
  0 siblings, 0 replies; 45+ messages in thread
From: Alistair Francis @ 2018-01-08 21:53 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On Mon, Jan 8, 2018 at 7:42 AM, 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/Makefile.objs | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/hw/sd/Makefile.objs b/hw/sd/Makefile.objs
> index c2b7664264..0fe2501017 100644
> --- a/hw/sd/Makefile.objs
> +++ b/hw/sd/Makefile.objs
> @@ -1,9 +1,14 @@
> +# SD/MMC subsystem core
> +common-obj-$(CONFIG_SD) += core.o
> +
> +# SD/MMC host adapters
>  common-obj-$(CONFIG_PL181) += pl181.o
>  common-obj-$(CONFIG_SSI_SD) += ssi-sd.o
> -common-obj-$(CONFIG_SD) += sd.o core.o
>  common-obj-$(CONFIG_SDHCI) += sdhci.o
> -
>  obj-$(CONFIG_MILKYMIST) += milkymist-memcard.o
>  obj-$(CONFIG_OMAP) += omap_mmc.o
>  obj-$(CONFIG_PXA2XX) += pxa2xx_mmci.o
>  obj-$(CONFIG_RASPI) += bcm2835_sdhost.o
> +
> +# emulated SD/MMC devices
> +common-obj-$(CONFIG_SD) += sd.o
> --
> 2.15.1
>
>

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

* Re: [Qemu-devel] [PATCH v5 17/31] sdhci: rename the hostctl1 register
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 17/31] sdhci: rename the hostctl1 register Philippe Mathieu-Daudé
@ 2018-01-08 21:54   ` Alistair Francis
  0 siblings, 0 replies; 45+ messages in thread
From: Alistair Francis @ 2018-01-08 21:54 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On Mon, Jan 8, 2018 at 7:42 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> As per the Spec v3.00
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

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

Alistair

> ---
>  include/hw/sd/sdhci.h |  2 +-
>  hw/sd/sdhci.c         | 14 +++++++-------
>  2 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
> index c0098fc920..ecd192ee47 100644
> --- a/include/hw/sd/sdhci.h
> +++ b/include/hw/sd/sdhci.h
> @@ -65,7 +65,7 @@ typedef struct SDHCIState {
>      /* Buffer Data Port Register - virtual access point to R and W buffers */
>      uint32_t prnsts;       /* Present State Register */
>      /* 0x28 */
> -    uint8_t  hostctl;      /* Host Control Register */
> +    uint8_t  hostctl1;     /* Host Control Register */
>      uint8_t  pwrcon;       /* Power control Register */
>      uint8_t  blkgap;       /* Block Gap Control Register */
>      uint8_t  wakcon;       /* WakeUp Control Register */
> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
> index 3f5e0760f6..d7e247cb48 100644
> --- a/hw/sd/sdhci.c
> +++ b/hw/sd/sdhci.c
> @@ -600,7 +600,7 @@ static void get_adma_description(SDHCIState *s, ADMADescr *dscr)
>      uint32_t adma1 = 0;
>      uint64_t adma2 = 0;
>      hwaddr entry_addr = (hwaddr)s->admasysaddr;
> -    switch (SDHC_DMA_TYPE(s->hostctl)) {
> +    switch (SDHC_DMA_TYPE(s->hostctl1)) {
>      case SDHC_CTRL_ADMA2_32:
>          dma_memory_read(&s->dma_as, entry_addr, (uint8_t *)&adma2,
>                          sizeof(adma2));
> @@ -789,7 +789,7 @@ static void sdhci_data_transfer(void *opaque)
>      SDHCIState *s = (SDHCIState *)opaque;
>
>      if (s->trnmod & SDHC_TRNS_DMA) {
> -        switch (SDHC_DMA_TYPE(s->hostctl)) {
> +        switch (SDHC_DMA_TYPE(s->hostctl1)) {
>          case SDHC_CTRL_SDMA:
>              if ((s->blkcnt == 1) || !(s->trnmod & SDHC_TRNS_MULTI)) {
>                  sdhci_sdma_transfer_single_block(s);
> @@ -898,7 +898,7 @@ static uint64_t sdhci_read(void *opaque, hwaddr offset, unsigned size)
>          ret = s->prnsts;
>          break;
>      case SDHC_HOSTCTL:
> -        ret = s->hostctl | (s->pwrcon << 8) | (s->blkgap << 16) |
> +        ret = s->hostctl1 | (s->pwrcon << 8) | (s->blkgap << 16) |
>                (s->wakcon << 24);
>          break;
>      case SDHC_CLKCON:
> @@ -1016,7 +1016,7 @@ sdhci_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)
>          MASKED_WRITE(s->sdmasysad, mask, value);
>          /* Writing to last byte of sdmasysad might trigger transfer */
>          if (!(mask & 0xFF000000) && TRANSFERRING_DATA(s->prnsts) && s->blkcnt &&
> -                s->blksize && SDHC_DMA_TYPE(s->hostctl) == SDHC_CTRL_SDMA) {
> +                s->blksize && SDHC_DMA_TYPE(s->hostctl1) == SDHC_CTRL_SDMA) {
>              if (s->trnmod & SDHC_TRNS_MULTI) {
>                  sdhci_sdma_transfer_multi_blocks(s);
>              } else {
> @@ -1068,14 +1068,14 @@ sdhci_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)
>          if (!(mask & 0xFF0000)) {
>              sdhci_blkgap_write(s, value >> 16);
>          }
> -        MASKED_WRITE(s->hostctl, mask, value);
> +        MASKED_WRITE(s->hostctl1, mask, value);
>          MASKED_WRITE(s->pwrcon, mask >> 8, value >> 8);
>          MASKED_WRITE(s->wakcon, mask >> 24, value >> 24);
>          if (!(s->prnsts & SDHC_CARD_PRESENT) || ((s->pwrcon >> 1) & 0x7) < 5 ||
>                  !(s->capareg & (1 << (31 - ((s->pwrcon >> 1) & 0x7))))) {
>              s->pwrcon &= ~SDHC_POWER_ON;
>          }
> -        qemu_set_irq(s->access_led, s->hostctl & 1);
> +        qemu_set_irq(s->access_led, s->hostctl1 & 1);
>          break;
>      case SDHC_CLKCON:
>          if (!(mask & 0xFF000000)) {
> @@ -1284,7 +1284,7 @@ const VMStateDescription sdhci_vmstate = {
>          VMSTATE_UINT16(cmdreg, SDHCIState),
>          VMSTATE_UINT32_ARRAY(rspreg, SDHCIState, 4),
>          VMSTATE_UINT32(prnsts, SDHCIState),
> -        VMSTATE_UINT8(hostctl, SDHCIState),
> +        VMSTATE_UINT8(hostctl1, SDHCIState),
>          VMSTATE_UINT8(pwrcon, SDHCIState),
>          VMSTATE_UINT8(blkgap, SDHCIState),
>          VMSTATE_UINT8(wakcon, SDHCIState),
> --
> 2.15.1
>
>

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

* Re: [Qemu-devel] [PATCH v5 02/31] sdhci: add basic Spec v1 capabilities
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 02/31] sdhci: add basic Spec v1 capabilities Philippe Mathieu-Daudé
@ 2018-01-08 22:00   ` Alistair Francis
  2018-01-08 22:33     ` [Qemu-devel] [Qemu-arm] " Philippe Mathieu-Daudé
  0 siblings, 1 reply; 45+ messages in thread
From: Alistair Francis @ 2018-01-08 22:00 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On Mon, Jan 8, 2018 at 7:42 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  hw/sd/sdhci-internal.h | 22 ++++++++++++++++++-
>  include/hw/sd/sdhci.h  |  6 ++++++
>  hw/sd/sdhci.c          | 58 ++++++++++++++++++++++++++++++++++++--------------
>  3 files changed, 69 insertions(+), 17 deletions(-)
>
> diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
> index cf4a055159..6944fcaf00 100644
> --- a/hw/sd/sdhci-internal.h
> +++ b/hw/sd/sdhci-internal.h
> @@ -86,6 +86,9 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
>
>  /* R/W Host control Register 0x0 */
>  #define SDHC_HOSTCTL                   0x28
> +FIELD(SDHC_HOSTCTL, LED_CTRL,          0, 1);
> +FIELD(SDHC_HOSTCTL, DATATRANSFERWIDTH, 1, 1); /* SD mode only */
> +FIELD(SDHC_HOSTCTL, HIGH_SPEED,        2, 1);
>  #define SDHC_CTRL_DMA_CHECK_MASK       0x18
>  #define SDHC_CTRL_SDMA                 0x00
>  #define SDHC_CTRL_ADMA1_32             0x08
> @@ -96,6 +99,7 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
>  /* R/W Power Control Register 0x0 */
>  #define SDHC_PWRCON                    0x29
>  #define SDHC_POWER_ON                  (1 << 0)
> +FIELD(SDHC_PWRCON, BUS_VOLTAGE,        1, 3);
>
>  /* R/W Block Gap Control Register 0x0 */
>  #define SDHC_BLKGAP                    0x2A
> @@ -118,6 +122,7 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
>
>  /* R/W Timeout Control Register 0x0 */
>  #define SDHC_TIMEOUTCON                0x2E
> +FIELD(SDHC_TIMEOUTCON, COUNTER,        0, 4);
>
>  /* R/W Software Reset Register 0x0 */
>  #define SDHC_SWRST                     0x2F
> @@ -174,17 +179,32 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
>
>  /* ROC Auto CMD12 error status register 0x0 */
>  #define SDHC_ACMD12ERRSTS              0x3C
> +FIELD(SDHC_ACMD12ERRSTS, TIMEOUT_ERR,  1, 1);
> +FIELD(SDHC_ACMD12ERRSTS, CRC_ERR,      2, 1);
> +FIELD(SDHC_ACMD12ERRSTS, INDEX_ERR,    4, 1);
>
>  /* HWInit Capabilities Register 0x05E80080 */
>  #define SDHC_CAPAB                     0x40
> -#define SDHC_CAN_DO_DMA                0x00400000
>  #define SDHC_CAN_DO_ADMA2              0x00080000
>  #define SDHC_CAN_DO_ADMA1              0x00100000
>  #define SDHC_64_BIT_BUS_SUPPORT        (1 << 28)
>  #define SDHC_CAPAB_BLOCKSIZE(x)        (((x) >> 16) & 0x3)
> +FIELD(SDHC_CAPAB, TOCLKFREQ,           0, 6);
> +FIELD(SDHC_CAPAB, TOUNIT,              7, 1);
> +FIELD(SDHC_CAPAB, BASECLKFREQ,         8, 8);
> +FIELD(SDHC_CAPAB, MAXBLOCKLENGTH,     16, 2);
> +FIELD(SDHC_CAPAB, HIGHSPEED,          21, 1);
> +FIELD(SDHC_CAPAB, SDMA,               22, 1);
> +FIELD(SDHC_CAPAB, SUSPRESUME,         23, 1);
> +FIELD(SDHC_CAPAB, V33,                24, 1);
> +FIELD(SDHC_CAPAB, V30,                25, 1);
> +FIELD(SDHC_CAPAB, V18,                26, 1);
>
>  /* HWInit Maximum Current Capabilities Register 0x0 */
>  #define SDHC_MAXCURR                   0x48
> +FIELD(SDHC_MAXCURR, V33_VDD1,          0, 8);
> +FIELD(SDHC_MAXCURR, V30_VDD1,          8, 8);
> +FIELD(SDHC_MAXCURR, V18_VDD1,         16, 8);
>
>  /* W Force Event Auto CMD12 Error Interrupt Register 0x0000 */
>  #define SDHC_FEAER                     0x50
> diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
> index ddd5040410..266030dc8d 100644
> --- a/include/hw/sd/sdhci.h
> +++ b/include/hw/sd/sdhci.h
> @@ -102,6 +102,12 @@ typedef struct SDHCIState {
>      /* Configurable properties */
>      bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
>      uint8_t spec_version;
> +    struct {
> +        bool suspend;
> +        bool high_speed;
> +        bool sdma;
> +        bool v33, v30, v18;
> +    } cap;
>  } SDHCIState;
>
>  #define TYPE_PCI_SDHCI "sdhci-pci"
> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
> index cd4a8efdd7..e7dbab2fdc 100644
> --- a/hw/sd/sdhci.c
> +++ b/hw/sd/sdhci.c
> @@ -44,12 +44,6 @@
>   * 0 - not supported, 1 - supported, other - prohibited.
>   */
>  #define SDHC_CAPAB_64BITBUS       0ul        /* 64-bit System Bus Support */
> -#define SDHC_CAPAB_18V            1ul        /* Voltage support 1.8v */
> -#define SDHC_CAPAB_30V            0ul        /* Voltage support 3.0v */
> -#define SDHC_CAPAB_33V            1ul        /* Voltage support 3.3v */
> -#define SDHC_CAPAB_SUSPRESUME     0ul        /* Suspend/resume support */
> -#define SDHC_CAPAB_SDMA           1ul        /* SDMA support */
> -#define SDHC_CAPAB_HIGHSPEED      1ul        /* High speed support */
>  #define SDHC_CAPAB_ADMA1          1ul        /* ADMA1 support */
>  #define SDHC_CAPAB_ADMA2          1ul        /* ADMA2 support */
>  /* Maximum host controller R/W buffers size
> @@ -63,9 +57,7 @@
>  #define SDHC_CAPAB_TOCLKFREQ      52ul
>
>  /* Now check all parameters and calculate CAPABILITIES REGISTER value */
> -#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_18V > 1 || SDHC_CAPAB_30V > 1 ||     \
> -    SDHC_CAPAB_33V > 1 || SDHC_CAPAB_SUSPRESUME > 1 || SDHC_CAPAB_SDMA > 1 ||  \
> -    SDHC_CAPAB_HIGHSPEED > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1 ||\
> +#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1 || \
>      SDHC_CAPAB_TOUNIT > 1
>  #error Capabilities features can have value 0 or 1 only!
>  #endif
> @@ -90,16 +82,33 @@
>  #endif
>
>  #define SDHC_CAPAB_REG_DEFAULT                                 \
> -   ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_18V << 26) |     \
> -    (SDHC_CAPAB_30V << 25) | (SDHC_CAPAB_33V << 24) |          \
> -    (SDHC_CAPAB_SUSPRESUME << 23) | (SDHC_CAPAB_SDMA << 22) |  \
> -    (SDHC_CAPAB_HIGHSPEED << 21) | (SDHC_CAPAB_ADMA1 << 20) |  \
> +   ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_ADMA1 << 20) |   \
>      (SDHC_CAPAB_ADMA2 << 19) | (MAX_BLOCK_LENGTH << 16) |      \
>      (SDHC_CAPAB_BASECLKFREQ << 8) | (SDHC_CAPAB_TOUNIT << 7) | \
>      (SDHC_CAPAB_TOCLKFREQ))
>
>  #define MASKED_WRITE(reg, mask, val)  (reg = (reg & (mask)) | (val))
>
> +static void sdhci_init_capareg(SDHCIState *s, Error **errp)
> +{
> +    uint64_t capareg = 0;
> +
> +    switch (s->spec_version) {
> +    case 1:
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, HIGHSPEED, s->cap.high_speed);
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, SDMA, s->cap.sdma);
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, SUSPRESUME, s->cap.suspend);
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, V33, s->cap.v33);
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, V30, s->cap.v30);
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, V18, s->cap.v18);
> +        break;
> +

Don't we need to support v2 here as well? We default to v2 don't we?

Alistair

> +    default:
> +        error_setg(errp, "Unsupported spec version: %u", s->spec_version);
> +    }
> +    s->capareg = capareg;
> +}
> +
>  static uint8_t sdhci_slotint(SDHCIState *s)
>  {
>      return (s->norintsts & s->norintsigen) || (s->errintsts & s->errintsigen) ||
> @@ -1032,7 +1041,7 @@ sdhci_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)
>      case SDHC_TRNMOD:
>          /* DMA can be enabled only if it is supported as indicated by
>           * capabilities register */
> -        if (!(s->capareg & SDHC_CAN_DO_DMA)) {
> +        if (!(s->capareg & R_SDHC_CAPAB_SDMA_MASK)) {
>              value &= ~SDHC_TRNS_DMA;
>          }
>          MASKED_WRITE(s->trnmod, mask, value & SDHC_TRNMOD_MASK);
> @@ -1186,6 +1195,10 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
>          return;
>      }
>      s->version = (SDHC_HCVER_VENDOR << 8) | (s->spec_version - 1);
> +
> +    if (s->capareg == UINT64_MAX) {
> +        sdhci_init_capareg(s, errp);
> +    }
>  }
>
>  static void sdhci_initfn(SDHCIState *s)
> @@ -1305,8 +1318,21 @@ const VMStateDescription sdhci_vmstate = {
>   * specific host controller implementation */
>  static Property sdhci_properties[] = {
>      DEFINE_PROP_UINT8("sd-spec-version", SDHCIState, spec_version, 2),
> -    DEFINE_PROP_UINT64("capareg", SDHCIState, capareg,
> -            SDHC_CAPAB_REG_DEFAULT),
> +
> +    /* DMA */
> +    DEFINE_PROP_BOOL("sdma", SDHCIState, cap.sdma, true),
> +    /* Suspend/resume support */
> +    DEFINE_PROP_BOOL("suspend", SDHCIState, cap.suspend, false),
> +    /* High speed support */
> +    DEFINE_PROP_BOOL("high-speed", SDHCIState, cap.high_speed, true),
> +    /* Voltage support 3.3/3.0/1.8V */
> +    DEFINE_PROP_BOOL("3v3", SDHCIState, cap.v33, true),
> +    DEFINE_PROP_BOOL("3v0", SDHCIState, cap.v30, false),
> +    DEFINE_PROP_BOOL("1v8", SDHCIState, cap.v18, false),
> +
> +    /* capareg: deprecated */
> +    DEFINE_PROP_UINT64("capareg", SDHCIState, capareg, UINT64_MAX),
> +
>      DEFINE_PROP_UINT64("maxcurr", SDHCIState, maxcurr, 0),
>      DEFINE_PROP_BOOL("pending-insert-quirk", SDHCIState, pending_insert_quirk,
>                       false),
> --
> 2.15.1
>
>

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

* Re: [Qemu-devel] [PATCH v5 03/31] sdhci: add max-block-length capability (Spec v1)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 03/31] sdhci: add max-block-length capability (Spec v1) Philippe Mathieu-Daudé
@ 2018-01-08 22:20   ` Alistair Francis
  0 siblings, 0 replies; 45+ messages in thread
From: Alistair Francis @ 2018-01-08 22:20 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On Mon, Jan 8, 2018 at 7:42 AM, 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/sdhci-internal.h |  1 -
>  include/hw/sd/sdhci.h  |  1 +
>  hw/sd/sdhci.c          | 38 +++++++++++++-------------------------
>  3 files changed, 14 insertions(+), 26 deletions(-)
>
> diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
> index 6944fcaf00..0561e6eaf7 100644
> --- a/hw/sd/sdhci-internal.h
> +++ b/hw/sd/sdhci-internal.h
> @@ -188,7 +188,6 @@ FIELD(SDHC_ACMD12ERRSTS, INDEX_ERR,    4, 1);
>  #define SDHC_CAN_DO_ADMA2              0x00080000
>  #define SDHC_CAN_DO_ADMA1              0x00100000
>  #define SDHC_64_BIT_BUS_SUPPORT        (1 << 28)
> -#define SDHC_CAPAB_BLOCKSIZE(x)        (((x) >> 16) & 0x3)
>  FIELD(SDHC_CAPAB, TOCLKFREQ,           0, 6);
>  FIELD(SDHC_CAPAB, TOUNIT,              7, 1);
>  FIELD(SDHC_CAPAB, BASECLKFREQ,         8, 8);
> diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
> index 266030dc8d..2703da1d5a 100644
> --- a/include/hw/sd/sdhci.h
> +++ b/include/hw/sd/sdhci.h
> @@ -103,6 +103,7 @@ typedef struct SDHCIState {
>      bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
>      uint8_t spec_version;
>      struct {
> +        uint16_t max_blk_len;
>          bool suspend;
>          bool high_speed;
>          bool sdma;
> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
> index e7dbab2fdc..c78643fe54 100644
> --- a/hw/sd/sdhci.c
> +++ b/hw/sd/sdhci.c
> @@ -46,9 +46,6 @@
>  #define SDHC_CAPAB_64BITBUS       0ul        /* 64-bit System Bus Support */
>  #define SDHC_CAPAB_ADMA1          1ul        /* ADMA1 support */
>  #define SDHC_CAPAB_ADMA2          1ul        /* ADMA2 support */
> -/* Maximum host controller R/W buffers size
> - * Possible values: 512, 1024, 2048 bytes */
> -#define SDHC_CAPAB_MAXBLOCKLENGTH 512ul
>  /* Maximum clock frequency for SDclock in MHz
>   * value in range 10-63 MHz, 0 - not defined */
>  #define SDHC_CAPAB_BASECLKFREQ    52ul
> @@ -62,16 +59,6 @@
>  #error Capabilities features can have value 0 or 1 only!
>  #endif
>
> -#if SDHC_CAPAB_MAXBLOCKLENGTH == 512
> -#define MAX_BLOCK_LENGTH 0ul
> -#elif SDHC_CAPAB_MAXBLOCKLENGTH == 1024
> -#define MAX_BLOCK_LENGTH 1ul
> -#elif SDHC_CAPAB_MAXBLOCKLENGTH == 2048
> -#define MAX_BLOCK_LENGTH 2ul
> -#else
> -#error Max host controller block size can have value 512, 1024 or 2048 only!
> -#endif
> -
>  #if (SDHC_CAPAB_BASECLKFREQ > 0 && SDHC_CAPAB_BASECLKFREQ < 10) || \
>      SDHC_CAPAB_BASECLKFREQ > 63
>  #error SDclock frequency can have value in range 0, 10-63 only!
> @@ -83,7 +70,7 @@
>
>  #define SDHC_CAPAB_REG_DEFAULT                                 \
>     ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_ADMA1 << 20) |   \
> -    (SDHC_CAPAB_ADMA2 << 19) | (MAX_BLOCK_LENGTH << 16) |      \
> +    (SDHC_CAPAB_ADMA2 << 19) |                                 \
>      (SDHC_CAPAB_BASECLKFREQ << 8) | (SDHC_CAPAB_TOUNIT << 7) | \
>      (SDHC_CAPAB_TOCLKFREQ))
>
> @@ -92,9 +79,17 @@
>  static void sdhci_init_capareg(SDHCIState *s, Error **errp)
>  {
>      uint64_t capareg = 0;
> +    uint32_t val;
>
>      switch (s->spec_version) {
>      case 1:
> +        val = ctz32(s->cap.max_blk_len >> 9);
> +        if (val >= 0b11) {
> +            error_setg(errp, "block size can be 512, 1024 or 2048 only");
> +            return;
> +        }
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, MAXBLOCKLENGTH, val);
> +
>          capareg = FIELD_DP64(capareg, SDHC_CAPAB, HIGHSPEED, s->cap.high_speed);
>          capareg = FIELD_DP64(capareg, SDHC_CAPAB, SDMA, s->cap.sdma);
>          capareg = FIELD_DP64(capareg, SDHC_CAPAB, SUSPRESUME, s->cap.suspend);
> @@ -1175,17 +1170,7 @@ static const MemoryRegionOps sdhci_mmio_ops = {
>
>  static inline unsigned int sdhci_get_fifolen(SDHCIState *s)
>  {
> -    switch (SDHC_CAPAB_BLOCKSIZE(s->capareg)) {
> -    case 0:
> -        return 512;
> -    case 1:
> -        return 1024;
> -    case 2:
> -        return 2048;
> -    default:
> -        hw_error("SDHC: unsupported value for maximum block size\n");
> -        return 0;
> -    }
> +    return 1 << (9 + FIELD_EX32(s->capareg, SDHC_CAPAB, MAXBLOCKLENGTH));
>  }
>
>  static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
> @@ -1319,6 +1304,9 @@ const VMStateDescription sdhci_vmstate = {
>  static Property sdhci_properties[] = {
>      DEFINE_PROP_UINT8("sd-spec-version", SDHCIState, spec_version, 2),
>
> +    /* Maximum host controller R/W buffers size
> +     * Possible values: 512, 1024, 2048 bytes */
> +    DEFINE_PROP_UINT16("max-block-length", SDHCIState, cap.max_blk_len, 512),
>      /* DMA */
>      DEFINE_PROP_BOOL("sdma", SDHCIState, cap.sdma, true),
>      /* Suspend/resume support */
> --
> 2.15.1
>
>

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

* Re: [Qemu-devel] [PATCH v5 04/31] sdhci: add clock capabilities (Spec v1)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 04/31] sdhci: add clock capabilities " Philippe Mathieu-Daudé
@ 2018-01-08 22:22   ` Alistair Francis
  2018-01-08 22:35     ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 45+ messages in thread
From: Alistair Francis @ 2018-01-08 22:22 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On Mon, Jan 8, 2018 at 7:42 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  include/hw/sd/sdhci.h |  2 ++
>  hw/sd/sdhci.c         | 52 +++++++++++++++++++++++++++++++--------------------
>  2 files changed, 34 insertions(+), 20 deletions(-)
>
> diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
> index 2703da1d5a..c1602becd2 100644
> --- a/include/hw/sd/sdhci.h
> +++ b/include/hw/sd/sdhci.h
> @@ -103,6 +103,8 @@ typedef struct SDHCIState {
>      bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
>      uint8_t spec_version;
>      struct {
> +        uint8_t timeout_clk_freq, base_clk_freq_mhz;
> +        bool timeout_clk_in_mhz;
>          uint16_t max_blk_len;
>          bool suspend;
>          bool high_speed;
> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
> index c78643fe54..05681c86d6 100644
> --- a/hw/sd/sdhci.c
> +++ b/hw/sd/sdhci.c
> @@ -46,36 +46,31 @@
>  #define SDHC_CAPAB_64BITBUS       0ul        /* 64-bit System Bus Support */
>  #define SDHC_CAPAB_ADMA1          1ul        /* ADMA1 support */
>  #define SDHC_CAPAB_ADMA2          1ul        /* ADMA2 support */
> -/* Maximum clock frequency for SDclock in MHz
> - * value in range 10-63 MHz, 0 - not defined */
> -#define SDHC_CAPAB_BASECLKFREQ    52ul
> -#define SDHC_CAPAB_TOUNIT         1ul  /* Timeout clock unit 0 - kHz, 1 - MHz */
> -/* Timeout clock frequency 1-63, 0 - not defined */
> -#define SDHC_CAPAB_TOCLKFREQ      52ul
>
>  /* Now check all parameters and calculate CAPABILITIES REGISTER value */
> -#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1 || \
> -    SDHC_CAPAB_TOUNIT > 1
> +#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1
>  #error Capabilities features can have value 0 or 1 only!
>  #endif
>
> -#if (SDHC_CAPAB_BASECLKFREQ > 0 && SDHC_CAPAB_BASECLKFREQ < 10) || \
> -    SDHC_CAPAB_BASECLKFREQ > 63
> -#error SDclock frequency can have value in range 0, 10-63 only!
> -#endif
> -
> -#if SDHC_CAPAB_TOCLKFREQ > 63
> -#error Timeout clock frequency can have value in range 0-63 only!
> -#endif
> -
>  #define SDHC_CAPAB_REG_DEFAULT                                 \
>     ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_ADMA1 << 20) |   \
> -    (SDHC_CAPAB_ADMA2 << 19) |                                 \
> -    (SDHC_CAPAB_BASECLKFREQ << 8) | (SDHC_CAPAB_TOUNIT << 7) | \
> -    (SDHC_CAPAB_TOCLKFREQ))
> +    (SDHC_CAPAB_ADMA2 << 19))
>
>  #define MASKED_WRITE(reg, mask, val)  (reg = (reg & (mask)) | (val))
>
> +static void sdhci_check_capab_freq_range(SDHCIState *s, const char *desc,
> +                                         uint8_t freq, Error **errp)
> +{
> +    switch (freq) {
> +    case 0:
> +    case 10 ... 63:
> +        break;

You are missing a default here.

Alistair

> +        error_setg(errp, "SD %s clock frequency can have value"
> +                   "in range 0-63 only", desc);
> +        return;
> +    }
> +}
> +
>  static void sdhci_init_capareg(SDHCIState *s, Error **errp)
>  {
>      uint64_t capareg = 0;
> @@ -83,6 +78,16 @@ static void sdhci_init_capareg(SDHCIState *s, Error **errp)
>
>      switch (s->spec_version) {
>      case 1:
> +        sdhci_check_capab_freq_range(s, "Timeout", s->cap.timeout_clk_freq,
> +                                     errp);
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, TOCLKFREQ,
> +                             s->cap.timeout_clk_freq);
> +        sdhci_check_capab_freq_range(s, "Base", s->cap.base_clk_freq_mhz, errp);
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, BASECLKFREQ,
> +                             s->cap.base_clk_freq_mhz);
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, TOUNIT,
> +                             s->cap.timeout_clk_in_mhz);
> +
>          val = ctz32(s->cap.max_blk_len >> 9);
>          if (val >= 0b11) {
>              error_setg(errp, "block size can be 512, 1024 or 2048 only");
> @@ -1304,6 +1309,13 @@ const VMStateDescription sdhci_vmstate = {
>  static Property sdhci_properties[] = {
>      DEFINE_PROP_UINT8("sd-spec-version", SDHCIState, spec_version, 2),
>
> +    /* Timeout clock frequency 1-63, 0 - not defined */
> +    DEFINE_PROP_UINT8("timeout-freq", SDHCIState, cap.timeout_clk_freq, 0),
> +    /* Timeout clock unit 0 - kHz, 1 - MHz */
> +    DEFINE_PROP_BOOL("freq-in-mhz", SDHCIState, cap.timeout_clk_in_mhz, true),
> +    /* Maximum base clock frequency for SD clock in MHz (range 10-63 MHz, 0) */
> +    DEFINE_PROP_UINT8("max-frequency", SDHCIState, cap.base_clk_freq_mhz, 0),
> +
>      /* Maximum host controller R/W buffers size
>       * Possible values: 512, 1024, 2048 bytes */
>      DEFINE_PROP_UINT16("max-block-length", SDHCIState, cap.max_blk_len, 512),
> --
> 2.15.1
>
>

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

* Re: [Qemu-devel] [Qemu-arm] [PATCH v5 02/31] sdhci: add basic Spec v1 capabilities
  2018-01-08 22:00   ` Alistair Francis
@ 2018-01-08 22:33     ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 22:33 UTC (permalink / raw)
  To: Alistair Francis
  Cc: Edgar E . Iglesias, Peter Maydell, Prasad J Pandit,
	Grégory Estrade, Andrey Smirnov,
	qemu-devel@nongnu.org Developers, Krzysztof Kozlowski,
	Sai Pavan Boddu, Igor Mitsyanko, qemu-arm, Clement Deschamps,
	Andrew Baumann, Jean-Christophe Dubois, Eduardo Habkost

On 01/08/2018 07:00 PM, Alistair Francis wrote:
> On Mon, Jan 8, 2018 at 7:42 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>> ---
>>  hw/sd/sdhci-internal.h | 22 ++++++++++++++++++-
>>  include/hw/sd/sdhci.h  |  6 ++++++
>>  hw/sd/sdhci.c          | 58 ++++++++++++++++++++++++++++++++++++--------------
>>  3 files changed, 69 insertions(+), 17 deletions(-)
>>
>> diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
>> index cf4a055159..6944fcaf00 100644
>> --- a/hw/sd/sdhci-internal.h
>> +++ b/hw/sd/sdhci-internal.h
>> @@ -86,6 +86,9 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
>>
>>  /* R/W Host control Register 0x0 */
>>  #define SDHC_HOSTCTL                   0x28
>> +FIELD(SDHC_HOSTCTL, LED_CTRL,          0, 1);
>> +FIELD(SDHC_HOSTCTL, DATATRANSFERWIDTH, 1, 1); /* SD mode only */
>> +FIELD(SDHC_HOSTCTL, HIGH_SPEED,        2, 1);
>>  #define SDHC_CTRL_DMA_CHECK_MASK       0x18
>>  #define SDHC_CTRL_SDMA                 0x00
>>  #define SDHC_CTRL_ADMA1_32             0x08
>> @@ -96,6 +99,7 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
>>  /* R/W Power Control Register 0x0 */
>>  #define SDHC_PWRCON                    0x29
>>  #define SDHC_POWER_ON                  (1 << 0)
>> +FIELD(SDHC_PWRCON, BUS_VOLTAGE,        1, 3);
>>
>>  /* R/W Block Gap Control Register 0x0 */
>>  #define SDHC_BLKGAP                    0x2A
>> @@ -118,6 +122,7 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
>>
>>  /* R/W Timeout Control Register 0x0 */
>>  #define SDHC_TIMEOUTCON                0x2E
>> +FIELD(SDHC_TIMEOUTCON, COUNTER,        0, 4);
>>
>>  /* R/W Software Reset Register 0x0 */
>>  #define SDHC_SWRST                     0x2F
>> @@ -174,17 +179,32 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
>>
>>  /* ROC Auto CMD12 error status register 0x0 */
>>  #define SDHC_ACMD12ERRSTS              0x3C
>> +FIELD(SDHC_ACMD12ERRSTS, TIMEOUT_ERR,  1, 1);
>> +FIELD(SDHC_ACMD12ERRSTS, CRC_ERR,      2, 1);
>> +FIELD(SDHC_ACMD12ERRSTS, INDEX_ERR,    4, 1);
>>
>>  /* HWInit Capabilities Register 0x05E80080 */
>>  #define SDHC_CAPAB                     0x40
>> -#define SDHC_CAN_DO_DMA                0x00400000
>>  #define SDHC_CAN_DO_ADMA2              0x00080000
>>  #define SDHC_CAN_DO_ADMA1              0x00100000
>>  #define SDHC_64_BIT_BUS_SUPPORT        (1 << 28)
>>  #define SDHC_CAPAB_BLOCKSIZE(x)        (((x) >> 16) & 0x3)
>> +FIELD(SDHC_CAPAB, TOCLKFREQ,           0, 6);
>> +FIELD(SDHC_CAPAB, TOUNIT,              7, 1);
>> +FIELD(SDHC_CAPAB, BASECLKFREQ,         8, 8);
>> +FIELD(SDHC_CAPAB, MAXBLOCKLENGTH,     16, 2);
>> +FIELD(SDHC_CAPAB, HIGHSPEED,          21, 1);
>> +FIELD(SDHC_CAPAB, SDMA,               22, 1);
>> +FIELD(SDHC_CAPAB, SUSPRESUME,         23, 1);
>> +FIELD(SDHC_CAPAB, V33,                24, 1);
>> +FIELD(SDHC_CAPAB, V30,                25, 1);
>> +FIELD(SDHC_CAPAB, V18,                26, 1);
>>
>>  /* HWInit Maximum Current Capabilities Register 0x0 */
>>  #define SDHC_MAXCURR                   0x48
>> +FIELD(SDHC_MAXCURR, V33_VDD1,          0, 8);
>> +FIELD(SDHC_MAXCURR, V30_VDD1,          8, 8);
>> +FIELD(SDHC_MAXCURR, V18_VDD1,         16, 8);
>>
>>  /* W Force Event Auto CMD12 Error Interrupt Register 0x0000 */
>>  #define SDHC_FEAER                     0x50
>> diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
>> index ddd5040410..266030dc8d 100644
>> --- a/include/hw/sd/sdhci.h
>> +++ b/include/hw/sd/sdhci.h
>> @@ -102,6 +102,12 @@ typedef struct SDHCIState {
>>      /* Configurable properties */
>>      bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
>>      uint8_t spec_version;
>> +    struct {
>> +        bool suspend;
>> +        bool high_speed;
>> +        bool sdma;
>> +        bool v33, v30, v18;
>> +    } cap;
>>  } SDHCIState;
>>
>>  #define TYPE_PCI_SDHCI "sdhci-pci"
>> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
>> index cd4a8efdd7..e7dbab2fdc 100644
>> --- a/hw/sd/sdhci.c
>> +++ b/hw/sd/sdhci.c
>> @@ -44,12 +44,6 @@
>>   * 0 - not supported, 1 - supported, other - prohibited.
>>   */
>>  #define SDHC_CAPAB_64BITBUS       0ul        /* 64-bit System Bus Support */
>> -#define SDHC_CAPAB_18V            1ul        /* Voltage support 1.8v */
>> -#define SDHC_CAPAB_30V            0ul        /* Voltage support 3.0v */
>> -#define SDHC_CAPAB_33V            1ul        /* Voltage support 3.3v */
>> -#define SDHC_CAPAB_SUSPRESUME     0ul        /* Suspend/resume support */
>> -#define SDHC_CAPAB_SDMA           1ul        /* SDMA support */
>> -#define SDHC_CAPAB_HIGHSPEED      1ul        /* High speed support */
>>  #define SDHC_CAPAB_ADMA1          1ul        /* ADMA1 support */
>>  #define SDHC_CAPAB_ADMA2          1ul        /* ADMA2 support */
>>  /* Maximum host controller R/W buffers size
>> @@ -63,9 +57,7 @@
>>  #define SDHC_CAPAB_TOCLKFREQ      52ul
>>
>>  /* Now check all parameters and calculate CAPABILITIES REGISTER value */
>> -#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_18V > 1 || SDHC_CAPAB_30V > 1 ||     \
>> -    SDHC_CAPAB_33V > 1 || SDHC_CAPAB_SUSPRESUME > 1 || SDHC_CAPAB_SDMA > 1 ||  \
>> -    SDHC_CAPAB_HIGHSPEED > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1 ||\
>> +#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1 || \
>>      SDHC_CAPAB_TOUNIT > 1
>>  #error Capabilities features can have value 0 or 1 only!
>>  #endif
>> @@ -90,16 +82,33 @@
>>  #endif
>>
>>  #define SDHC_CAPAB_REG_DEFAULT                                 \
>> -   ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_18V << 26) |     \
>> -    (SDHC_CAPAB_30V << 25) | (SDHC_CAPAB_33V << 24) |          \
>> -    (SDHC_CAPAB_SUSPRESUME << 23) | (SDHC_CAPAB_SDMA << 22) |  \
>> -    (SDHC_CAPAB_HIGHSPEED << 21) | (SDHC_CAPAB_ADMA1 << 20) |  \
>> +   ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_ADMA1 << 20) |   \
>>      (SDHC_CAPAB_ADMA2 << 19) | (MAX_BLOCK_LENGTH << 16) |      \
>>      (SDHC_CAPAB_BASECLKFREQ << 8) | (SDHC_CAPAB_TOUNIT << 7) | \
>>      (SDHC_CAPAB_TOCLKFREQ))
>>
>>  #define MASKED_WRITE(reg, mask, val)  (reg = (reg & (mask)) | (val))
>>
>> +static void sdhci_init_capareg(SDHCIState *s, Error **errp)
>> +{
>> +    uint64_t capareg = 0;
>> +
>> +    switch (s->spec_version) {
>> +    case 1:
>> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, HIGHSPEED, s->cap.high_speed);
>> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, SDMA, s->cap.sdma);
>> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, SUSPRESUME, s->cap.suspend);
>> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, V33, s->cap.v33);
>> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, V30, s->cap.v30);
>> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, V18, s->cap.v18);
>> +        break;
>> +
> 
> Don't we need to support v2 here as well? We default to v2 don't we?

argh you right, I planed to also put 2 but completely forgot :(

we don't want to support v1, but v2 expects these capabilities from v1.

> 
> Alistair
> 
>> +    default:
>> +        error_setg(errp, "Unsupported spec version: %u", s->spec_version);
>> +    }
>> +    s->capareg = capareg;
>> +}
>> +
>>  static uint8_t sdhci_slotint(SDHCIState *s)
>>  {
>>      return (s->norintsts & s->norintsigen) || (s->errintsts & s->errintsigen) ||
>> @@ -1032,7 +1041,7 @@ sdhci_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)
>>      case SDHC_TRNMOD:
>>          /* DMA can be enabled only if it is supported as indicated by
>>           * capabilities register */
>> -        if (!(s->capareg & SDHC_CAN_DO_DMA)) {
>> +        if (!(s->capareg & R_SDHC_CAPAB_SDMA_MASK)) {
>>              value &= ~SDHC_TRNS_DMA;
>>          }
>>          MASKED_WRITE(s->trnmod, mask, value & SDHC_TRNMOD_MASK);
>> @@ -1186,6 +1195,10 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
>>          return;
>>      }
>>      s->version = (SDHC_HCVER_VENDOR << 8) | (s->spec_version - 1);
>> +
>> +    if (s->capareg == UINT64_MAX) {
>> +        sdhci_init_capareg(s, errp);
>> +    }
>>  }
>>
>>  static void sdhci_initfn(SDHCIState *s)
>> @@ -1305,8 +1318,21 @@ const VMStateDescription sdhci_vmstate = {
>>   * specific host controller implementation */
>>  static Property sdhci_properties[] = {
>>      DEFINE_PROP_UINT8("sd-spec-version", SDHCIState, spec_version, 2),
>> -    DEFINE_PROP_UINT64("capareg", SDHCIState, capareg,
>> -            SDHC_CAPAB_REG_DEFAULT),
>> +
>> +    /* DMA */
>> +    DEFINE_PROP_BOOL("sdma", SDHCIState, cap.sdma, true),
>> +    /* Suspend/resume support */
>> +    DEFINE_PROP_BOOL("suspend", SDHCIState, cap.suspend, false),
>> +    /* High speed support */
>> +    DEFINE_PROP_BOOL("high-speed", SDHCIState, cap.high_speed, true),
>> +    /* Voltage support 3.3/3.0/1.8V */
>> +    DEFINE_PROP_BOOL("3v3", SDHCIState, cap.v33, true),
>> +    DEFINE_PROP_BOOL("3v0", SDHCIState, cap.v30, false),
>> +    DEFINE_PROP_BOOL("1v8", SDHCIState, cap.v18, false),
>> +
>> +    /* capareg: deprecated */
>> +    DEFINE_PROP_UINT64("capareg", SDHCIState, capareg, UINT64_MAX),
>> +
>>      DEFINE_PROP_UINT64("maxcurr", SDHCIState, maxcurr, 0),
>>      DEFINE_PROP_BOOL("pending-insert-quirk", SDHCIState, pending_insert_quirk,
>>                       false),
>> --
>> 2.15.1
>>
>>
> 

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

* Re: [Qemu-devel] [PATCH v5 04/31] sdhci: add clock capabilities (Spec v1)
  2018-01-08 22:22   ` Alistair Francis
@ 2018-01-08 22:35     ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-08 22:35 UTC (permalink / raw)
  To: Alistair Francis
  Cc: Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On 01/08/2018 07:22 PM, Alistair Francis wrote:
> On Mon, Jan 8, 2018 at 7:42 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>> ---
>>  include/hw/sd/sdhci.h |  2 ++
>>  hw/sd/sdhci.c         | 52 +++++++++++++++++++++++++++++++--------------------
>>  2 files changed, 34 insertions(+), 20 deletions(-)
>>
>> diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
>> index 2703da1d5a..c1602becd2 100644
>> --- a/include/hw/sd/sdhci.h
>> +++ b/include/hw/sd/sdhci.h
>> @@ -103,6 +103,8 @@ typedef struct SDHCIState {
>>      bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
>>      uint8_t spec_version;
>>      struct {
>> +        uint8_t timeout_clk_freq, base_clk_freq_mhz;
>> +        bool timeout_clk_in_mhz;
>>          uint16_t max_blk_len;
>>          bool suspend;
>>          bool high_speed;
>> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
>> index c78643fe54..05681c86d6 100644
>> --- a/hw/sd/sdhci.c
>> +++ b/hw/sd/sdhci.c
>> @@ -46,36 +46,31 @@
>>  #define SDHC_CAPAB_64BITBUS       0ul        /* 64-bit System Bus Support */
>>  #define SDHC_CAPAB_ADMA1          1ul        /* ADMA1 support */
>>  #define SDHC_CAPAB_ADMA2          1ul        /* ADMA2 support */
>> -/* Maximum clock frequency for SDclock in MHz
>> - * value in range 10-63 MHz, 0 - not defined */
>> -#define SDHC_CAPAB_BASECLKFREQ    52ul
>> -#define SDHC_CAPAB_TOUNIT         1ul  /* Timeout clock unit 0 - kHz, 1 - MHz */
>> -/* Timeout clock frequency 1-63, 0 - not defined */
>> -#define SDHC_CAPAB_TOCLKFREQ      52ul
>>
>>  /* Now check all parameters and calculate CAPABILITIES REGISTER value */
>> -#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1 || \
>> -    SDHC_CAPAB_TOUNIT > 1
>> +#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1
>>  #error Capabilities features can have value 0 or 1 only!
>>  #endif
>>
>> -#if (SDHC_CAPAB_BASECLKFREQ > 0 && SDHC_CAPAB_BASECLKFREQ < 10) || \
>> -    SDHC_CAPAB_BASECLKFREQ > 63
>> -#error SDclock frequency can have value in range 0, 10-63 only!
>> -#endif
>> -
>> -#if SDHC_CAPAB_TOCLKFREQ > 63
>> -#error Timeout clock frequency can have value in range 0-63 only!
>> -#endif
>> -
>>  #define SDHC_CAPAB_REG_DEFAULT                                 \
>>     ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_ADMA1 << 20) |   \
>> -    (SDHC_CAPAB_ADMA2 << 19) |                                 \
>> -    (SDHC_CAPAB_BASECLKFREQ << 8) | (SDHC_CAPAB_TOUNIT << 7) | \
>> -    (SDHC_CAPAB_TOCLKFREQ))
>> +    (SDHC_CAPAB_ADMA2 << 19))
>>
>>  #define MASKED_WRITE(reg, mask, val)  (reg = (reg & (mask)) | (val))
>>
>> +static void sdhci_check_capab_freq_range(SDHCIState *s, const char *desc,
>> +                                         uint8_t freq, Error **errp)
>> +{
>> +    switch (freq) {
>> +    case 0:
>> +    case 10 ... 63:
>> +        break;
> 
> You are missing a default here.

Thanks, peer review is useful :)

I didn't try qtest expected failures yet, I'll see if it's doable.

> 
> Alistair
> 
>> +        error_setg(errp, "SD %s clock frequency can have value"
>> +                   "in range 0-63 only", desc);
>> +        return;
>> +    }
>> +}
>> +
>>  static void sdhci_init_capareg(SDHCIState *s, Error **errp)
>>  {
>>      uint64_t capareg = 0;
>> @@ -83,6 +78,16 @@ static void sdhci_init_capareg(SDHCIState *s, Error **errp)
>>
>>      switch (s->spec_version) {
>>      case 1:
>> +        sdhci_check_capab_freq_range(s, "Timeout", s->cap.timeout_clk_freq,
>> +                                     errp);
>> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, TOCLKFREQ,
>> +                             s->cap.timeout_clk_freq);
>> +        sdhci_check_capab_freq_range(s, "Base", s->cap.base_clk_freq_mhz, errp);
>> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, BASECLKFREQ,
>> +                             s->cap.base_clk_freq_mhz);
>> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, TOUNIT,
>> +                             s->cap.timeout_clk_in_mhz);
>> +
>>          val = ctz32(s->cap.max_blk_len >> 9);
>>          if (val >= 0b11) {
>>              error_setg(errp, "block size can be 512, 1024 or 2048 only");
>> @@ -1304,6 +1309,13 @@ const VMStateDescription sdhci_vmstate = {
>>  static Property sdhci_properties[] = {
>>      DEFINE_PROP_UINT8("sd-spec-version", SDHCIState, spec_version, 2),
>>
>> +    /* Timeout clock frequency 1-63, 0 - not defined */
>> +    DEFINE_PROP_UINT8("timeout-freq", SDHCIState, cap.timeout_clk_freq, 0),
>> +    /* Timeout clock unit 0 - kHz, 1 - MHz */
>> +    DEFINE_PROP_BOOL("freq-in-mhz", SDHCIState, cap.timeout_clk_in_mhz, true),
>> +    /* Maximum base clock frequency for SD clock in MHz (range 10-63 MHz, 0) */
>> +    DEFINE_PROP_UINT8("max-frequency", SDHCIState, cap.base_clk_freq_mhz, 0),
>> +
>>      /* Maximum host controller R/W buffers size
>>       * Possible values: 512, 1024, 2048 bytes */
>>      DEFINE_PROP_UINT16("max-block-length", SDHCIState, cap.max_blk_len, 512),
>> --
>> 2.15.1
>>
>>

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

* Re: [Qemu-devel] [PATCH v5 05/31] sdhci: add DMA and 64-bit capabilities (Spec v2)
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 05/31] sdhci: add DMA and 64-bit capabilities (Spec v2) Philippe Mathieu-Daudé
@ 2018-01-09 21:53   ` Alistair Francis
  0 siblings, 0 replies; 45+ messages in thread
From: Alistair Francis @ 2018-01-09 21:53 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On Mon, Jan 8, 2018 at 7:42 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  hw/sd/sdhci-internal.h | 14 +++++++-------
>  include/hw/sd/sdhci.h  |  4 ++++
>  hw/sd/sdhci.c          | 40 ++++++++++++++++++----------------------
>  3 files changed, 29 insertions(+), 29 deletions(-)
>
> diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
> index 0561e6eaf7..affbe4015c 100644
> --- a/hw/sd/sdhci-internal.h
> +++ b/hw/sd/sdhci-internal.h
> @@ -89,12 +89,12 @@ FIELD(SDHC_PRNSTS, WRITE_PROTECT,      19, 1);
>  FIELD(SDHC_HOSTCTL, LED_CTRL,          0, 1);
>  FIELD(SDHC_HOSTCTL, DATATRANSFERWIDTH, 1, 1); /* SD mode only */
>  FIELD(SDHC_HOSTCTL, HIGH_SPEED,        2, 1);
> -#define SDHC_CTRL_DMA_CHECK_MASK       0x18
> +FIELD(SDHC_HOSTCTL, DMA,               3, 2);
>  #define SDHC_CTRL_SDMA                 0x00
> -#define SDHC_CTRL_ADMA1_32             0x08
> +#define SDHC_CTRL_ADMA1_32             0x08 /* NOT ALLOWED since v2 */
>  #define SDHC_CTRL_ADMA2_32             0x10
> -#define SDHC_CTRL_ADMA2_64             0x18
> -#define SDHC_DMA_TYPE(x)               ((x) & SDHC_CTRL_DMA_CHECK_MASK)
> +#define SDHC_CTRL_ADMA2_64             0x18 /* only v1 & v2 (v3 optional) */
> +#define SDHC_DMA_TYPE(x)               ((x) & R_SDHC_HOSTCTL_DMA_MASK)
>
>  /* R/W Power Control Register 0x0 */
>  #define SDHC_PWRCON                    0x29
> @@ -185,19 +185,19 @@ FIELD(SDHC_ACMD12ERRSTS, INDEX_ERR,    4, 1);
>
>  /* HWInit Capabilities Register 0x05E80080 */
>  #define SDHC_CAPAB                     0x40
> -#define SDHC_CAN_DO_ADMA2              0x00080000
> -#define SDHC_CAN_DO_ADMA1              0x00100000
> -#define SDHC_64_BIT_BUS_SUPPORT        (1 << 28)
>  FIELD(SDHC_CAPAB, TOCLKFREQ,           0, 6);
>  FIELD(SDHC_CAPAB, TOUNIT,              7, 1);
>  FIELD(SDHC_CAPAB, BASECLKFREQ,         8, 8);
>  FIELD(SDHC_CAPAB, MAXBLOCKLENGTH,     16, 2);
> +FIELD(SDHC_CAPAB, ADMA2,              19, 1); /* since v2 */
> +FIELD(SDHC_CAPAB, ADMA1,              20, 1); /* v1 only? */
>  FIELD(SDHC_CAPAB, HIGHSPEED,          21, 1);
>  FIELD(SDHC_CAPAB, SDMA,               22, 1);
>  FIELD(SDHC_CAPAB, SUSPRESUME,         23, 1);
>  FIELD(SDHC_CAPAB, V33,                24, 1);
>  FIELD(SDHC_CAPAB, V30,                25, 1);
>  FIELD(SDHC_CAPAB, V18,                26, 1);
> +FIELD(SDHC_CAPAB, BUS64BIT,           28, 1); /* since v2 */
>
>  /* HWInit Maximum Current Capabilities Register 0x0 */
>  #define SDHC_MAXCURR                   0x48
> diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
> index c1602becd2..4a9c3e9175 100644
> --- a/include/hw/sd/sdhci.h
> +++ b/include/hw/sd/sdhci.h
> @@ -103,6 +103,7 @@ typedef struct SDHCIState {
>      bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
>      uint8_t spec_version;
>      struct {
> +        /* v1 */
>          uint8_t timeout_clk_freq, base_clk_freq_mhz;
>          bool timeout_clk_in_mhz;
>          uint16_t max_blk_len;
> @@ -110,6 +111,9 @@ typedef struct SDHCIState {
>          bool high_speed;
>          bool sdma;
>          bool v33, v30, v18;
> +        /* v2 */
> +        bool adma1, adma2;
> +        bool bus64;
>      } cap;
>  } SDHCIState;
>
> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
> index 05681c86d6..56466e0427 100644
> --- a/hw/sd/sdhci.c
> +++ b/hw/sd/sdhci.c
> @@ -38,24 +38,6 @@
>  #define TYPE_SDHCI_BUS "sdhci-bus"
>  #define SDHCI_BUS(obj) OBJECT_CHECK(SDBus, (obj), TYPE_SDHCI_BUS)
>
> -/* Default SD/MMC host controller features information, which will be
> - * presented in CAPABILITIES register of generic SD host controller at reset.
> - * If not stated otherwise:
> - * 0 - not supported, 1 - supported, other - prohibited.
> - */
> -#define SDHC_CAPAB_64BITBUS       0ul        /* 64-bit System Bus Support */
> -#define SDHC_CAPAB_ADMA1          1ul        /* ADMA1 support */
> -#define SDHC_CAPAB_ADMA2          1ul        /* ADMA2 support */
> -
> -/* Now check all parameters and calculate CAPABILITIES REGISTER value */
> -#if SDHC_CAPAB_64BITBUS > 1 || SDHC_CAPAB_ADMA2 > 1 || SDHC_CAPAB_ADMA1 > 1
> -#error Capabilities features can have value 0 or 1 only!
> -#endif
> -
> -#define SDHC_CAPAB_REG_DEFAULT                                 \
> -   ((SDHC_CAPAB_64BITBUS << 28) | (SDHC_CAPAB_ADMA1 << 20) |   \
> -    (SDHC_CAPAB_ADMA2 << 19))
> -
>  #define MASKED_WRITE(reg, mask, val)  (reg = (reg & (mask)) | (val))
>
>  static void sdhci_check_capab_freq_range(SDHCIState *s, const char *desc,
> @@ -71,12 +53,22 @@ static void sdhci_check_capab_freq_range(SDHCIState *s, const char *desc,
>      }
>  }
>
> +/* Default SD/MMC host controller features information, which will be
> + * presented in CAPABILITIES register of generic SD host controller at reset. */
>  static void sdhci_init_capareg(SDHCIState *s, Error **errp)
>  {
>      uint64_t capareg = 0;
>      uint32_t val;
>
>      switch (s->spec_version) {
> +    /* fallback */

This isn't really a fall through here.

> +    case 2:
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, ADMA1, s->cap.adma1);
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, ADMA2, s->cap.adma2);
> +        /* 64-bit System Bus Support */
> +        capareg = FIELD_DP64(capareg, SDHC_CAPAB, BUS64BIT, s->cap.bus64);
> +
> +    /* fallback */
>      case 1:
>          sdhci_check_capab_freq_range(s, "Timeout", s->cap.timeout_clk_freq,
>                                       errp);
> @@ -794,7 +786,7 @@ static void sdhci_data_transfer(void *opaque)
>
>              break;
>          case SDHC_CTRL_ADMA1_32:
> -            if (!(s->capareg & SDHC_CAN_DO_ADMA1)) {
> +            if (!(s->capareg & R_SDHC_CAPAB_ADMA1_MASK)) {
>                  trace_sdhci_error("ADMA1 not supported");
>                  break;
>              }
> @@ -802,7 +794,7 @@ static void sdhci_data_transfer(void *opaque)
>              sdhci_do_adma(s);
>              break;
>          case SDHC_CTRL_ADMA2_32:
> -            if (!(s->capareg & SDHC_CAN_DO_ADMA2)) {
> +            if (!(s->capareg & R_SDHC_CAPAB_ADMA2_MASK)) {
>                  trace_sdhci_error("ADMA2 not supported");
>                  break;
>              }
> @@ -810,8 +802,8 @@ static void sdhci_data_transfer(void *opaque)
>              sdhci_do_adma(s);
>              break;
>          case SDHC_CTRL_ADMA2_64:
> -            if (!(s->capareg & SDHC_CAN_DO_ADMA2) ||
> -                    !(s->capareg & SDHC_64_BIT_BUS_SUPPORT)) {
> +            if (!(s->capareg & R_SDHC_CAPAB_ADMA2_MASK) ||
> +                    !(s->capareg & R_SDHC_CAPAB_BUS64BIT_MASK)) {
>                  trace_sdhci_error("64 bit ADMA not supported");
>                  break;
>              }
> @@ -1321,6 +1313,8 @@ static Property sdhci_properties[] = {
>      DEFINE_PROP_UINT16("max-block-length", SDHCIState, cap.max_blk_len, 512),
>      /* DMA */
>      DEFINE_PROP_BOOL("sdma", SDHCIState, cap.sdma, true),
> +    DEFINE_PROP_BOOL("adma1", SDHCIState, cap.adma1, false),

This looks like a change from what we previously had. It at lease
deserves a commit message.

Alistair

> +    DEFINE_PROP_BOOL("adma2", SDHCIState, cap.adma2, true),
>      /* Suspend/resume support */
>      DEFINE_PROP_BOOL("suspend", SDHCIState, cap.suspend, false),
>      /* High speed support */
> @@ -1330,6 +1324,8 @@ static Property sdhci_properties[] = {
>      DEFINE_PROP_BOOL("3v0", SDHCIState, cap.v30, false),
>      DEFINE_PROP_BOOL("1v8", SDHCIState, cap.v18, false),
>
> +    DEFINE_PROP_BOOL("64bit", SDHCIState, cap.bus64, false),
> +
>      /* capareg: deprecated */
>      DEFINE_PROP_UINT64("capareg", SDHCIState, capareg, UINT64_MAX),
>
> --
> 2.15.1
>
>

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

* Re: [Qemu-devel] [PATCH v5 09/31] sdhci: add a common class
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 09/31] sdhci: add a common class Philippe Mathieu-Daudé
@ 2018-01-09 21:54   ` Alistair Francis
  0 siblings, 0 replies; 45+ messages in thread
From: Alistair Francis @ 2018-01-09 21:54 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On Mon, Jan 8, 2018 at 7:42 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> so this class can be inherited.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

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

Alistair

> ---
>  include/hw/sd/sdhci.h | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
>
> diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
> index 4a9c3e9175..a80b7c0424 100644
> --- a/include/hw/sd/sdhci.h
> +++ b/include/hw/sd/sdhci.h
> @@ -124,4 +124,16 @@ typedef struct SDHCIState {
>  #define SYSBUS_SDHCI(obj)                               \
>       OBJECT_CHECK(SDHCIState, (obj), TYPE_SYSBUS_SDHCI)
>
> +typedef struct {
> +    /*< private >*/
> +    BusClass parent_class;
> +    /*< public >*/
> +    DeviceRealize parent_realize;
> +} SDHCICommonClass;
> +
> +#define SYSBUS_SDHCI_COMMON_CLASS(klass) \
> +        OBJECT_CLASS_CHECK(SDHCICommonClass, (klass), TYPE_SYSBUS_SDHCI)
> +#define SYSBUS_SDHCI_COMMON_GET_CLASS(obj) \
> +        OBJECT_GET_CLASS(SDHCICommonClass, (obj), TYPE_SYSBUS_SDHCI)
> +
>  #endif /* SDHCI_H */
> --
> 2.15.1
>
>

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

* Re: [Qemu-devel] [PATCH v5 26/31] sdhci: remove the deprecated 'capareg' property
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 26/31] sdhci: remove the deprecated 'capareg' property Philippe Mathieu-Daudé
@ 2018-01-09 22:00   ` Alistair Francis
  0 siblings, 0 replies; 45+ messages in thread
From: Alistair Francis @ 2018-01-09 22:00 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On Mon, Jan 8, 2018 at 7:42 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> All SDHCI consumers have been upgraded to set correct properties.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

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

Alistair

> ---
>  hw/sd/sdhci.c | 7 +------
>  1 file changed, 1 insertion(+), 6 deletions(-)
>
> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
> index 34bda73b66..ae914a6ef9 100644
> --- a/hw/sd/sdhci.c
> +++ b/hw/sd/sdhci.c
> @@ -1194,9 +1194,7 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
>      }
>      s->version = (SDHC_HCVER_VENDOR << 8) | (s->spec_version - 1);
>
> -    if (s->capareg == UINT64_MAX) {
> -        sdhci_init_capareg(s, errp);
> -    }
> +    sdhci_init_capareg(s, errp);
>  }
>
>  static void sdhci_initfn(SDHCIState *s)
> @@ -1345,9 +1343,6 @@ static Property sdhci_properties[] = {
>      DEFINE_PROP_UINT8("bus-speed", SDHCIState, cap.sdr, 0),
>      DEFINE_PROP_UINT8("driver-strength", SDHCIState, cap.strength, 0),
>
> -    /* capareg: deprecated */
> -    DEFINE_PROP_UINT64("capareg", SDHCIState, capareg, UINT64_MAX),
> -
>      DEFINE_PROP_UINT64("maxcurr", SDHCIState, maxcurr, 0),
>      DEFINE_PROP_BOOL("pending-insert-quirk", SDHCIState, pending_insert_quirk,
>                       false),
> --
> 2.15.1
>
>

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

* Re: [Qemu-devel] [PATCH v5 10/31] sdhci: add a Designware/Samsung host controller
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 10/31] sdhci: add a Designware/Samsung host controller Philippe Mathieu-Daudé
@ 2018-01-09 23:14   ` Alistair Francis
  0 siblings, 0 replies; 45+ messages in thread
From: Alistair Francis @ 2018-01-09 23:14 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On Mon, Jan 8, 2018 at 7:42 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  hw/sd/dw-mshc.c     | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  hw/sd/Makefile.objs |  1 +
>  2 files changed, 65 insertions(+)
>  create mode 100644 hw/sd/dw-mshc.c
>
> diff --git a/hw/sd/dw-mshc.c b/hw/sd/dw-mshc.c
> new file mode 100644
> index 0000000000..c2869cd569
> --- /dev/null
> +++ b/hw/sd/dw-mshc.c
> @@ -0,0 +1,64 @@
> +/*
> + * Synopsys Designware Mobile Storage Host Controller emulation
> + * (and Samsung Exynos specific extensions)
> + *
> + * Copyright (C) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or
> + * (at your option) any later version.  See the COPYING file in the
> + * top-level directory.
> + */
> +#include "qemu/osdep.h"
> +#include "hw/sd/sdhci.h"
> +#include "qapi/error.h"
> +
> +/* Compatible with:
> + * - SD Host Controller Specification Version 2.0
> + * - SDIO Specification Version 2.0
> + * - MMC Specification Version 4.3
> + *
> + * - SDMA
> + * - ADMA
> + */
> +static void exynos4210_dw_mshc_realize(DeviceState *dev, Error **errp)
> +{
> +    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_GET_CLASS(dev);
> +    Object *obj = OBJECT(dev);
> +    Error *local_err = NULL;
> +
> +    object_property_set_uint(obj, 2, "sd-spec-version", &local_err);
> +    object_property_set_bool(obj, true, "suspend", &local_err);
> +    object_property_set_bool(obj, true, "1v8", &local_err);
> +    if (local_err) {
> +        error_propagate(errp, local_err);
> +        return;
> +    }
> +
> +    cc->parent_realize(dev, &local_err);
> +    if (local_err) {
> +        error_propagate(errp, local_err);
> +        return;
> +    }
> +}
> +
> +static void exynos4210_dw_mshc_class_init(ObjectClass *klass, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +    SDHCICommonClass *cc = SYSBUS_SDHCI_COMMON_CLASS(klass);
> +
> +    cc->parent_realize = dc->realize;

This need an explanation, why are we doing this weird realise logic?

Alistair

> +    dc->realize = exynos4210_dw_mshc_realize;
> +}
> +
> +static const TypeInfo exynos4210_dw_mshc_info = {
> +    .name = "samsung,exynos4210-dw-mshc",
> +    .parent = TYPE_SYSBUS_SDHCI,
> +    .class_init = exynos4210_dw_mshc_class_init,
> +};
> +
> +static void dw_mshc_sdhc_register_types(void)
> +{
> +    type_register_static(&exynos4210_dw_mshc_info);
> +}
> +
> +type_init(dw_mshc_sdhc_register_types)
> diff --git a/hw/sd/Makefile.objs b/hw/sd/Makefile.objs
> index 0fe2501017..fd866d7f94 100644
> --- a/hw/sd/Makefile.objs
> +++ b/hw/sd/Makefile.objs
> @@ -3,6 +3,7 @@ common-obj-$(CONFIG_SD) += core.o
>
>  # SD/MMC host adapters
>  common-obj-$(CONFIG_PL181) += pl181.o
> +common-obj-$(CONFIG_EXYNOS4) += dw-mshc.o
>  common-obj-$(CONFIG_SSI_SD) += ssi-sd.o
>  common-obj-$(CONFIG_SDHCI) += sdhci.o
>  obj-$(CONFIG_MILKYMIST) += milkymist-memcard.o
> --
> 2.15.1
>
>

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

* Re: [Qemu-devel] [PATCH v5 11/31] hw/arm/exynos4210: use the "samsung, exynos4210-dw-mshc" device
  2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 11/31] hw/arm/exynos4210: use the "samsung, exynos4210-dw-mshc" device Philippe Mathieu-Daudé
@ 2018-01-09 23:18   ` Alistair Francis
  0 siblings, 0 replies; 45+ messages in thread
From: Alistair Francis @ 2018-01-09 23:18 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

On Mon, Jan 8, 2018 at 7:42 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  hw/arm/exynos4210.c | 12 ++++--------
>  1 file changed, 4 insertions(+), 8 deletions(-)
>
> diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
> index e8e1d81e62..eb95131221 100644
> --- a/hw/arm/exynos4210.c
> +++ b/hw/arm/exynos4210.c
> @@ -75,7 +75,6 @@
>  #define EXYNOS4210_INT_COMBINER_BASE_ADDR   0x10448000
>
>  /* SD/MMC host controllers */
> -#define EXYNOS4210_SDHCI_CAPABILITIES       0x05E80080
>  #define EXYNOS4210_SDHCI_BASE_ADDR          0x12510000
>  #define EXYNOS4210_SDHCI_ADDR(n)            (EXYNOS4210_SDHCI_BASE_ADDR + \
>                                                  0x00010000 * (n))
> @@ -377,13 +376,10 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem)
>          BlockBackend *blk;
>          DriveInfo *di;
>
> -        dev = qdev_create(NULL, TYPE_SYSBUS_SDHCI);
> -        qdev_prop_set_uint32(dev, "capareg", EXYNOS4210_SDHCI_CAPABILITIES);
> -        qdev_init_nofail(dev);
> -
> -        busdev = SYS_BUS_DEVICE(dev);
> -        sysbus_mmio_map(busdev, 0, EXYNOS4210_SDHCI_ADDR(n));
> -        sysbus_connect_irq(busdev, 0, s->irq_table[exynos4210_get_irq(29, n)]);
> +        dev = sysbus_create_varargs("samsung,exynos4210-dw-mshc",

Isn't this a legacy function, shouldn't we be moving away from it?

Alistair

> +                                    EXYNOS4210_SDHCI_ADDR(n),
> +                                    s->irq_table[exynos4210_get_irq(29, n)],
> +                                    NULL);
>
>          di = drive_get(IF_SD, 0, n);
>          blk = di ? blk_by_legacy_dinfo(di) : NULL;
> --
> 2.15.1
>
>

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

* Re: [Qemu-devel] [PATCH v5 31/31] sdhci: add Spec v4.2 register definitions
  2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 31/31] sdhci: add Spec v4.2 register definitions Philippe Mathieu-Daudé
@ 2018-01-18 18:21   ` Alistair Francis
  0 siblings, 0 replies; 45+ messages in thread
From: Alistair Francis @ 2018-01-18 18:21 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Alistair Francis, Peter Maydell, Andrey Smirnov, Igor Mitsyanko,
	Edgar E . Iglesias, Prasad J Pandit, Grégory Estrade,
	qemu-devel@nongnu.org Developers, Peter Crosthwaite,
	Krzysztof Kozlowski, Jean-Christophe Dubois, Sai Pavan Boddu,
	qemu-arm, Clement Deschamps, Andrew Baumann, Eduardo Habkost

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

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

Alistair

> ---
>  hw/sd/sdhci-internal.h | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
> index 1da91a27b4..8193aa1821 100644
> --- a/hw/sd/sdhci-internal.h
> +++ b/hw/sd/sdhci-internal.h
> @@ -191,6 +191,10 @@ FIELD(SDHC_HOSTCTL2, V18_ENA,          3, 1); /* UHS-I only */
>  FIELD(SDHC_HOSTCTL2, DRIVER_STRENGTH,  4, 2); /* UHS-I only */
>  FIELD(SDHC_HOSTCTL2, EXECUTE_TUNING,   6, 1); /* UHS-I only */
>  FIELD(SDHC_HOSTCTL2, SAMPLING_CLKSEL,  7, 1); /* UHS-I only */
> +FIELD(SDHC_HOSTCTL2, UHS_II_ENA,       8, 1); /* since v4 */
> +FIELD(SDHC_HOSTCTL2, ADMA2_LENGTH,    10, 1); /* since v4 */
> +FIELD(SDHC_HOSTCTL2, CMD23_ENA,       11, 1); /* since v4 */
> +FIELD(SDHC_HOSTCTL2, VERSION4,        12, 1); /* since v4 */
>  FIELD(SDHC_HOSTCTL2, ASYNC_INT,       14, 1);
>  FIELD(SDHC_HOSTCTL2, PRESET_ENA,      15, 1);
>
> @@ -219,12 +223,16 @@ FIELD(SDHC_CAPAB, DRIVER_TYPE_C,      37, 1); /* since v3 */
>  FIELD(SDHC_CAPAB, DRIVER_TYPE_D,      38, 1); /* since v3 */
>  FIELD(SDHC_CAPAB, TIMER_RETUNNING,    40, 4); /* since v3 */
>  FIELD(SDHC_CAPAB, SDR50_TUNNING,      45, 1); /* since v3 */
> +FIELD(SDHC_CAPAB, CLK_MUL,            48, 8); /* since v4.20 */
> +FIELD(SDHC_CAPAB, ADMA3,              59, 1); /* since v4.20 */
> +FIELD(SDHC_CAPAB, V18_VDD2,           60, 1); /* since v4.20 */
>
>  /* HWInit Maximum Current Capabilities Register 0x0 */
>  #define SDHC_MAXCURR                   0x48
>  FIELD(SDHC_MAXCURR, V33_VDD1,          0, 8);
>  FIELD(SDHC_MAXCURR, V30_VDD1,          8, 8);
>  FIELD(SDHC_MAXCURR, V18_VDD1,         16, 8);
> +FIELD(SDHC_MAXCURR, V18_VDD2,         32, 8); /* since v4.20 */
>
>  /* W Force Event Auto CMD12 Error Interrupt Register 0x0000 */
>  #define SDHC_FEAER                     0x50
> --
> 2.15.1
>
>

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

end of thread, other threads:[~2018-01-18 18:22 UTC | newest]

Thread overview: 45+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-08 15:42 [Qemu-devel] [PATCH v5 00/31] SDHCI: make it abstract, add inherited devices, add qtests Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 01/31] sdhci: add a spec_version property Philippe Mathieu-Daudé
2018-01-08 21:41   ` Alistair Francis
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 02/31] sdhci: add basic Spec v1 capabilities Philippe Mathieu-Daudé
2018-01-08 22:00   ` Alistair Francis
2018-01-08 22:33     ` [Qemu-devel] [Qemu-arm] " Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 03/31] sdhci: add max-block-length capability (Spec v1) Philippe Mathieu-Daudé
2018-01-08 22:20   ` Alistair Francis
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 04/31] sdhci: add clock capabilities " Philippe Mathieu-Daudé
2018-01-08 22:22   ` Alistair Francis
2018-01-08 22:35     ` Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 05/31] sdhci: add DMA and 64-bit capabilities (Spec v2) Philippe Mathieu-Daudé
2018-01-09 21:53   ` Alistair Francis
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 07/31] sdhci: Fix 64-bit ADMA2 Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 08/31] hw/sd: clean/reorder the Makefile adding few comments Philippe Mathieu-Daudé
2018-01-08 21:53   ` Alistair Francis
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 09/31] sdhci: add a common class Philippe Mathieu-Daudé
2018-01-09 21:54   ` Alistair Francis
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 10/31] sdhci: add a Designware/Samsung host controller Philippe Mathieu-Daudé
2018-01-09 23:14   ` Alistair Francis
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 11/31] hw/arm/exynos4210: use the "samsung, exynos4210-dw-mshc" device Philippe Mathieu-Daudé
2018-01-09 23:18   ` Alistair Francis
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 12/31] sdhci: add the generic Arasan SDHCI 4.9a PHY controller Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 13/31] hw/arm/xilinx_zynq: use the "arasan, sdhci-4.9a" device Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 14/31] sdhci: add qtest to check the SD Spec version Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 15/31] sdhci: check Spec v2 capabilities qtest Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 16/31] sdhci: add v3 capabilities Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 17/31] sdhci: rename the hostctl1 register Philippe Mathieu-Daudé
2018-01-08 21:54   ` Alistair Francis
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 18/31] sdhci: add the Broadcom BCM2835 SDHCI controller Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 19/31] hw/arm/bcm2835_peripherals: use the "brcm, bcm2835-sdhci" device Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 20/31] sdhci: add the Freescale controller for i.MX Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 21/31] hw/arm/fsl-imx6: use the "fsl, imx6q-usdhc" controller Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 22/31] sdhci: add the generic Arasan SDHCI 8.9a PHY Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 23/31] hw/arm/xilinx_zynqmp: use the "arasan, sdhci-8.9a" device Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 24/31] sdhci: let the SYSBUS_SDHCI type be abstract Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 25/31] sdhci: check Spec v3 capabilities qtest Philippe Mathieu-Daudé
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 26/31] sdhci: remove the deprecated 'capareg' property Philippe Mathieu-Daudé
2018-01-09 22:00   ` Alistair Francis
2018-01-08 15:42 ` [Qemu-devel] [PATCH v5 27/31] sdhci: add check_capab_readonly() qtest Philippe Mathieu-Daudé
2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 28/31] sdhci: add a check_capab_baseclock() qtest Philippe Mathieu-Daudé
2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 29/31] sdhci: add a check_capab_sdma() qtest Philippe Mathieu-Daudé
2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 30/31] sdhci: add a check_capab_v3() qtest Philippe Mathieu-Daudé
2018-01-08 15:43 ` [Qemu-devel] [PATCH v5 31/31] sdhci: add Spec v4.2 register definitions Philippe Mathieu-Daudé
2018-01-18 18:21   ` Alistair Francis

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.