* [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3)
@ 2018-01-18 20:40 Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 01/14] sdhci: add v3 capabilities Philippe Mathieu-Daudé
` (13 more replies)
0 siblings, 14 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite
This series add minimum features required by Spec v3 to support UHS-I cards.
Since v6:
- rebased on upstream
- included spec v3 qtest back
Since v5:
- addressed Alistair reviews
- dropped "abstract generic-sdhci"
- dropped Linux Device Tree names
- split qtests in another series
- change the bcm2835 minimum blocksize to 1KB (Andrew Baumann)
- added Alistair R-b
- based on Alistair work:
- add SD tunning sequence via Host Control 2 to use UHS-I cards
- add CMD/DAT[] fields in the Present State (used in next series
to switch card voltage)
based on Alistair work:
- add SD tunning sequence via Host Control 2 to use UHS-I cards
- add CMD/DAT[] fields in the Present State (used in next series
to switch card voltage)
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)
Since v3:
- no change, but split back in 2 series, 1st part is "SDHCI: housekeeping v5",
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
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.
$ git backport-diff with v6
001/14:[0015] [FC] 'sdhci: add v3 capabilities'
002/14:[----] [-C] 'sdhci: rename the hostctl1 register'
003/14:[----] [--] 'hw/arm/bcm2835_peripherals: implement SDHCI Spec v3'
004/14:[----] [--] 'hw/arm/bcm2835_peripherals: change maximum block size to 1kB'
005/14:[----] [--] 'hw/arm/fsl-imx6: implement SDHCI Spec v3'
006/14:[0004] [FC] 'hw/arm/xilinx_zynqmp: implement SDHCI Spec v3'
007/14:[down] 'sdhci: check Spec v3 capabilities qtest'
008/14:[down] 'sdhci: add a check_capab_v3() qtest'
009/14:[0018] [FC] 'sdhci: remove the deprecated 'capareg' property'
010/14:[----] [--] 'sdhci: add Spec v4.2 register definitions'
011/14:[----] [--] 'sdhci: implement the Host Control 2 register for the tunning sequence'
012/14:[----] [--] 'sdbus: add trace events'
013/14:[0002] [FC] 'sdhci: implement UHS-I voltage switch'
014/14:[----] [--] 'sdhci: implement CMD/DAT[] fields in the Present State register'
Based-on: 20180118183108.16009-17-f4bug@amsat.org
Philippe Mathieu-Daudé (14):
sdhci: add v3 capabilities
sdhci: rename the hostctl1 register
hw/arm/bcm2835_peripherals: implement SDHCI Spec v3
hw/arm/bcm2835_peripherals: change maximum block size to 1kB
hw/arm/fsl-imx6: implement SDHCI Spec v3
hw/arm/xilinx_zynqmp: implement SDHCI Spec v3
sdhci: check Spec v3 capabilities qtest
sdhci: add a check_capab_v3() qtest
sdhci: remove the deprecated 'capareg' property
sdhci: add Spec v4.2 register definitions
sdhci: implement the Host Control 2 register for the tunning sequence
sdbus: add trace events
sdhci: implement UHS-I voltage switch
sdhci: implement CMD/DAT[] fields in the Present State register
include/hw/sd/sd.h | 20 ++++++++++
include/hw/sd/sdhci.h | 9 ++++-
hw/sd/sdhci-internal.h | 31 +++++++++++++++
hw/arm/bcm2835_peripherals.c | 33 ++++++++++------
hw/arm/fsl-imx6.c | 13 +++++++
hw/arm/xlnx-zynqmp.c | 40 ++++++++++++++------
hw/sd/core.c | 61 +++++++++++++++++++++++++++++-
hw/sd/sd.c | 29 +++++++++++++++
hw/sd/sdhci.c | 89 +++++++++++++++++++++++++++++++-------------
tests/sdhci-test.c | 29 +++++++++++++++
hw/sd/trace-events | 8 ++++
tests/Makefile.include | 1 +
12 files changed, 312 insertions(+), 51 deletions(-)
--
2.15.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v7 01/14] sdhci: add v3 capabilities
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 02/14] sdhci: rename the hostctl1 register Philippe Mathieu-Daudé
` (12 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sdhci-internal.h | 21 +++++++++++++++++++++
include/hw/sd/sdhci.h | 5 +++++
hw/sd/sdhci.c | 24 ++++++++++++++++++++++--
3 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
index 4ed9727ec3..ac4704eb61 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 7e624135f0..bf3bf243d7 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -115,6 +115,11 @@ typedef struct SDHCIState {
***********/
bool adma1, adma2;
bool bus64;
+
+ /***********
+ * Spec v3
+ ***********/
+ uint8_t slot_type, sdr, strength;
} cap;
} SDHCIState;
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index e2379d610f..946dff0fac 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -65,6 +65,18 @@ static uint64_t 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 0;
+ }
+ 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: /* default version */
capareg = FIELD_DP64(capareg, SDHC_CAPAB, ADMA1, s->cap.adma1);
capareg = FIELD_DP64(capareg, SDHC_CAPAB, ADMA2, s->cap.adma2);
@@ -1175,8 +1187,11 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
uint64_t capab;
Error *local_err = NULL;
- 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);
@@ -1219,6 +1234,11 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
DEFINE_PROP_BOOL("adma2", _state, cap.adma2, true), \
DEFINE_PROP_BOOL("64bit", _state, cap.bus64, false), \
\
+ /* Spec v3 properties */ \
+ DEFINE_PROP_UINT8("slot-type", _state, cap.slot_type, 0), \
+ DEFINE_PROP_UINT8("bus-speed", _state, cap.sdr, 0), \
+ DEFINE_PROP_UINT8("driver-strength", _state, cap.strength, 0), \
+ \
/* deprecated: Capabilities registers provide information on supported
* features of this specific host controller implementation */ \
DEFINE_PROP_UINT64("capareg", _state, capareg, UINT64_MAX), \
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v7 02/14] sdhci: rename the hostctl1 register
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 01/14] sdhci: add v3 capabilities Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 03/14] hw/arm/bcm2835_peripherals: implement SDHCI Spec v3 Philippe Mathieu-Daudé
` (11 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite
As per the Spec v3.00
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
---
include/hw/sd/sdhci.h | 2 +-
hw/sd/sdhci.c | 12 ++++++------
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index bf3bf243d7..98edcc1048 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -57,7 +57,7 @@ typedef struct SDHCIState {
uint16_t cmdreg; /* Command Register */
uint32_t rspreg[4]; /* Response Registers 0-3 */
uint32_t prnsts; /* Present State Register */
- 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 946dff0fac..ec7430c83c 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -598,7 +598,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));
@@ -787,7 +787,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);
@@ -896,7 +896,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:
@@ -1014,7 +1014,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 {
@@ -1066,7 +1066,7 @@ 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 ||
@@ -1322,7 +1322,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] 17+ messages in thread
* [Qemu-devel] [PATCH v7 03/14] hw/arm/bcm2835_peripherals: implement SDHCI Spec v3
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 01/14] sdhci: add v3 capabilities Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 02/14] sdhci: rename the hostctl1 register Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 04/14] hw/arm/bcm2835_peripherals: change maximum block size to 1kB Philippe Mathieu-Daudé
` (10 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite, open list:ARM
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/bcm2835_peripherals.c | 32 +++++++++++++++++++++-----------
1 file changed, 21 insertions(+), 11 deletions(-)
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 12e0dd11af..79d680cb1b 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);
@@ -254,14 +251,27 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
memory_region_add_subregion(&s->peri_mr, RNG_OFFSET,
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;
- }
-
+ /* Extended Mass Media Controller
+ *
+ * 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 ¯\_(ツ)_/¯
+ */
+ object_property_set_uint(OBJECT(&s->sdhci), 3, "sd-spec-version", &err);
+ object_property_set_uint(OBJECT(&s->sdhci), 52, "timeout-freq", &err);
+ object_property_set_uint(OBJECT(&s->sdhci), 52, "max-frequency", &err);
+ object_property_set_bool(OBJECT(&s->sdhci), false, "adma1", &err);
+ object_property_set_bool(OBJECT(&s->sdhci), true, "1v8", &err);
object_property_set_bool(OBJECT(&s->sdhci), true, "pending-insert-quirk",
&err);
if (err) {
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v7 04/14] hw/arm/bcm2835_peripherals: change maximum block size to 1kB
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
` (2 preceding siblings ...)
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 03/14] hw/arm/bcm2835_peripherals: implement SDHCI Spec v3 Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 05/14] hw/arm/fsl-imx6: implement SDHCI Spec v3 Philippe Mathieu-Daudé
` (9 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite, open list:ARM
following the datasheet.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/bcm2835_peripherals.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 79d680cb1b..72d4dd73b5 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -272,6 +272,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
object_property_set_uint(OBJECT(&s->sdhci), 52, "max-frequency", &err);
object_property_set_bool(OBJECT(&s->sdhci), false, "adma1", &err);
object_property_set_bool(OBJECT(&s->sdhci), true, "1v8", &err);
+ object_property_set_uint(OBJECT(&s->sdhci), 1024, "max-block-length", &err);
object_property_set_bool(OBJECT(&s->sdhci), true, "pending-insert-quirk",
&err);
if (err) {
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v7 05/14] hw/arm/fsl-imx6: implement SDHCI Spec v3
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
` (3 preceding siblings ...)
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 04/14] hw/arm/bcm2835_peripherals: change maximum block size to 1kB Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 06/14] hw/arm/xilinx_zynqmp: " Philippe Mathieu-Daudé
` (8 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite, open list:ARM
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/fsl-imx6.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index b0d4088290..e7d13d54e6 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -348,6 +348,19 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
{ FSL_IMX6_uSDHC4_ADDR, FSL_IMX6_uSDHC4_IRQ },
};
+ /* UHS-I SDIO3.0 SDR104 1.8V ADMA */
+ object_property_set_uint(OBJECT(&s->esdhc[i]), 3, "sd-spec-version",
+ &err);
+ object_property_set_uint(OBJECT(&s->esdhc[i]), 52, "timeout-freq",
+ &err);
+ object_property_set_uint(OBJECT(&s->esdhc[i]), 52, "max-frequency",
+ &err);
+ object_property_set_bool(OBJECT(&s->esdhc[i]), true, "adma1", &err);
+ object_property_set_bool(OBJECT(&s->esdhc[i]), true, "1v8", &err);
+ if (err) {
+ error_propagate(errp, err);
+ return;
+ }
object_property_set_bool(OBJECT(&s->esdhc[i]), true, "realized", &err);
if (err) {
error_propagate(errp, err);
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v7 06/14] hw/arm/xilinx_zynqmp: implement SDHCI Spec v3
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
` (4 preceding siblings ...)
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 05/14] hw/arm/fsl-imx6: implement SDHCI Spec v3 Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 07/14] sdhci: check Spec v3 capabilities qtest Philippe Mathieu-Daudé
` (7 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite, Edgar E. Iglesias,
open list:Xilinx ZynqMP
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/xlnx-zynqmp.c | 40 +++++++++++++++++++++++++++++-----------
1 file changed, 29 insertions(+), 11 deletions(-)
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index 325642058b..c4f6638ab7 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -381,22 +381,40 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
sysbus_connect_irq(SYS_BUS_DEVICE(&s->sata), 0, gic_spi[SATA_INTR]);
for (i = 0; i < XLNX_ZYNQMP_NUM_SDHCI; i++) {
- char *bus_name;
-
- object_property_set_bool(OBJECT(&s->sdhci[i]), true,
- "realized", &err);
+ char *bus_name = g_strdup_printf("sd-bus%d", i);
+ SysBusDevice *sbd = SYS_BUS_DEVICE(&s->sdhci[i]);
+ Object *sdhci = OBJECT(&s->sdhci[i]);
+
+ /* 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
+ */
+ object_property_set_uint(sdhci, 3, "sd-spec-version", &err);
+ object_property_set_uint(sdhci, 0, "timeout-freq", &err);
+ object_property_set_uint(sdhci, 0, "max-frequency", &err);
+ object_property_set_bool(sdhci, true, "suspend", &err);
+ object_property_set_bool(sdhci, false, "adma1", &err);
+ object_property_set_bool(sdhci, true, "64bit", &err);
+ object_property_set_uint(sdhci, 0b111, "bus-speed", &err);
+ object_property_set_uint(sdhci, 0b111, "driver-strength", &err);
+ object_property_set_bool(sdhci, true, "realized", &err);
if (err) {
error_propagate(errp, err);
return;
}
- sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci[i]), 0,
- sdhci_addr[i]);
- sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci[i]), 0,
- gic_spi[sdhci_intr[i]]);
+ sysbus_mmio_map(sbd, 0, sdhci_addr[i]);
+ sysbus_connect_irq(sbd, 0, gic_spi[sdhci_intr[i]]);
+
/* Alias controller SD bus to the SoC itself */
- bus_name = g_strdup_printf("sd-bus%d", i);
- object_property_add_alias(OBJECT(s), bus_name,
- OBJECT(&s->sdhci[i]), "sd-bus",
+ object_property_add_alias(OBJECT(s), bus_name, sdhci, "sd-bus",
&error_abort);
g_free(bus_name);
}
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v7 07/14] sdhci: check Spec v3 capabilities qtest
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
` (5 preceding siblings ...)
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 06/14] hw/arm/xilinx_zynqmp: " Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 08/14] sdhci: add a check_capab_v3() qtest Philippe Mathieu-Daudé
` (6 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, 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 44ee5651c4..dd01a47839 100644
--- a/tests/sdhci-test.c
+++ b/tests/sdhci-test.c
@@ -42,9 +42,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 struct {
diff --git a/tests/Makefile.include b/tests/Makefile.include
index 756725b0f9..74cae947cb 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -367,6 +367,7 @@ check-qtest-arm-y += tests/boot-serial-test$(EXESUF)
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] 17+ messages in thread
* [Qemu-devel] [PATCH v7 08/14] sdhci: add a check_capab_v3() qtest
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
` (6 preceding siblings ...)
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 07/14] sdhci: check Spec v3 capabilities qtest Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 09/14] sdhci: remove the deprecated 'capareg' property Philippe Mathieu-Daudé
` (5 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
tests/sdhci-test.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/tests/sdhci-test.c b/tests/sdhci-test.c
index dd01a47839..51eaed6df8 100644
--- a/tests/sdhci-test.c
+++ b/tests/sdhci-test.c
@@ -16,6 +16,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 {
@@ -159,6 +161,20 @@ 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) {
+ /* 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 machine_start(const struct sdhci_t *test)
{
if (test->pci.vendor_id) {
@@ -201,6 +217,7 @@ static void test_machine(const void *data)
check_specs_version(test->sdhci.addr, test->sdhci.version);
check_capab_capareg(test->sdhci.addr, test->sdhci.capab.reg);
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] 17+ messages in thread
* [Qemu-devel] [PATCH v7 09/14] sdhci: remove the deprecated 'capareg' property
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
` (7 preceding siblings ...)
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 08/14] sdhci: add a check_capab_v3() qtest Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 10/14] sdhci: add Spec v4.2 register definitions Philippe Mathieu-Daudé
` (4 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite
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>
---
hw/sd/sdhci.c | 15 +--------------
1 file changed, 1 insertion(+), 14 deletions(-)
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index ec7430c83c..651f523089 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1184,7 +1184,6 @@ static inline unsigned int sdhci_get_fifolen(SDHCIState *s)
static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
{
- uint64_t capab;
Error *local_err = NULL;
switch (s->spec_version) {
@@ -1196,20 +1195,11 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
}
s->version = (SDHC_HCVER_VENDOR << 8) | (s->spec_version - 1);
- capab = sdhci_init_capareg(s, &local_err);
+ s->capareg = sdhci_init_capareg(s, &local_err);
if (local_err) {
error_propagate(errp, local_err);
return;
}
- if (s->capareg == UINT64_MAX) {
- s->capareg = capab;
- } else {
- capab = s->capareg & ~capab;
- if (capab) {
- error_setg(errp, "missing capability mask: 0x%" PRIx64, capab);
- return;
- }
- }
}
/* --- qdev common --- */
@@ -1239,9 +1229,6 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
DEFINE_PROP_UINT8("bus-speed", _state, cap.sdr, 0), \
DEFINE_PROP_UINT8("driver-strength", _state, cap.strength, 0), \
\
- /* deprecated: Capabilities registers provide information on supported
- * features of this specific host controller implementation */ \
- DEFINE_PROP_UINT64("capareg", _state, capareg, UINT64_MAX), \
DEFINE_PROP_UINT64("maxcurr", _state, maxcurr, 0)
static void sdhci_initfn(SDHCIState *s)
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v7 10/14] sdhci: add Spec v4.2 register definitions
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
` (8 preceding siblings ...)
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 09/14] sdhci: remove the deprecated 'capareg' property Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 11/14] sdhci: implement the Host Control 2 register for the tunning sequence Philippe Mathieu-Daudé
` (3 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Acked-by: Alistair Francis <alistair.francis@xilinx.com>
---
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 ac4704eb61..b82e847636 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] 17+ messages in thread
* [Qemu-devel] [PATCH v7 11/14] sdhci: implement the Host Control 2 register for the tunning sequence
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
` (9 preceding siblings ...)
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 10/14] sdhci: add Spec v4.2 register definitions Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 21:40 ` Eric Blake
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 12/14] sdbus: add trace events Philippe Mathieu-Daudé
` (2 subsequent siblings)
13 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite
[based on a patch from Alistair Francis <alistair.francis@xilinx.com>
from qemu/xilinx tag xilinx-v2015.2]
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
include/hw/sd/sdhci.h | 1 +
hw/sd/sdhci.c | 22 +++++++++++++++++++---
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index 98edcc1048..9d3f656441 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -71,6 +71,7 @@ typedef struct SDHCIState {
uint16_t norintsigen; /* Normal Interrupt Signal Enable Register */
uint16_t errintsigen; /* Error Interrupt Signal Enable Register */
uint16_t acmd12errsts; /* Auto CMD12 error status register */
+ uint16_t hostctl2; /* Host Control 2 */
uint64_t admasysaddr; /* ADMA System Address Register */
/* Read-only registers */
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 651f523089..37b3b265ef 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -315,14 +315,29 @@ static void sdhci_end_transfer(SDHCIState *s)
static void sdhci_read_block_from_card(SDHCIState *s)
{
int index = 0;
+ uint8_t data;
+ const uint16_t blk_size = s->blksize & BLOCK_SIZE_MASK;
if ((s->trnmod & SDHC_TRNS_MULTI) &&
(s->trnmod & SDHC_TRNS_BLK_CNT_EN) && (s->blkcnt == 0)) {
return;
}
- for (index = 0; index < (s->blksize & BLOCK_SIZE_MASK); index++) {
- s->fifo_buffer[index] = sdbus_read_data(&s->sdbus);
+ for (index = 0; index < blk_size; index++) {
+ data = sdbus_read_data(&s->sdbus);
+ if (!FIELD_EX32(s->hostctl2, SDHC_HOSTCTL2, EXECUTE_TUNING)) {
+ /* Device is not in tunning */
+ s->fifo_buffer[index] = data;
+ }
+ }
+
+ if (FIELD_EX32(s->hostctl2, SDHC_HOSTCTL2, EXECUTE_TUNING)) {
+ /* Device is in tunning */
+ s->hostctl2 &= ~R_SDHC_HOSTCTL2_EXECUTE_TUNING_MASK;
+ s->hostctl2 |= R_SDHC_HOSTCTL2_SAMPLING_CLKSEL_MASK;
+ s->prnsts &= ~(SDHC_DAT_LINE_ACTIVE | SDHC_DOING_READ |
+ SDHC_DATA_INHIBIT);
+ goto read_done;
}
/* New data now available for READ through Buffer Port Register */
@@ -347,6 +362,7 @@ static void sdhci_read_block_from_card(SDHCIState *s)
}
}
+read_done:
sdhci_update_irq(s);
}
@@ -912,7 +928,7 @@ static uint64_t sdhci_read(void *opaque, hwaddr offset, unsigned size)
ret = s->norintsigen | (s->errintsigen << 16);
break;
case SDHC_ACMD12ERRSTS:
- ret = s->acmd12errsts;
+ ret = s->acmd12errsts | (s->hostctl2 << 16);
break;
case SDHC_CAPAB:
ret = (uint32_t)s->capareg;
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v7 12/14] sdbus: add trace events
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
` (10 preceding siblings ...)
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 11/14] sdhci: implement the Host Control 2 register for the tunning sequence Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 13/14] sdhci: implement UHS-I voltage switch Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 14/14] sdhci: implement CMD/DAT[] fields in the Present State register Philippe Mathieu-Daudé
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/core.c | 14 ++++++++++++--
hw/sd/trace-events | 5 +++++
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/hw/sd/core.c b/hw/sd/core.c
index 295dc44ab7..498284f109 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -23,6 +23,12 @@
#include "hw/qdev-core.h"
#include "sysemu/block-backend.h"
#include "hw/sd/sd.h"
+#include "trace.h"
+
+static inline const char *sdbus_name(SDBus *sdbus)
+{
+ return sdbus->qbus.name;
+}
static SDState *get_card(SDBus *sdbus)
{
@@ -39,6 +45,7 @@ int sdbus_do_command(SDBus *sdbus, SDRequest *req, uint8_t *response)
{
SDState *card = get_card(sdbus);
+ trace_sdbus_command(sdbus_name(sdbus), req->cmd, req->arg, req->crc);
if (card) {
SDCardClass *sc = SD_CARD_GET_CLASS(card);
@@ -52,6 +59,7 @@ void sdbus_write_data(SDBus *sdbus, uint8_t value)
{
SDState *card = get_card(sdbus);
+ trace_sdbus_write(sdbus_name(sdbus), value);
if (card) {
SDCardClass *sc = SD_CARD_GET_CLASS(card);
@@ -62,14 +70,16 @@ void sdbus_write_data(SDBus *sdbus, uint8_t value)
uint8_t sdbus_read_data(SDBus *sdbus)
{
SDState *card = get_card(sdbus);
+ uint8_t value = 0;
if (card) {
SDCardClass *sc = SD_CARD_GET_CLASS(card);
- return sc->read_data(card);
+ value = sc->read_data(card);
}
+ trace_sdbus_read(sdbus_name(sdbus), value);
- return 0;
+ return value;
}
bool sdbus_data_ready(SDBus *sdbus)
diff --git a/hw/sd/trace-events b/hw/sd/trace-events
index 0a121156a3..c0f51f11d4 100644
--- a/hw/sd/trace-events
+++ b/hw/sd/trace-events
@@ -1,5 +1,10 @@
# See docs/devel/tracing.txt for syntax documentation.
+# hw/sd/core.c
+sdbus_command(const char *bus_name, uint8_t cmd, uint32_t arg, uint8_t crc) "@%s CMD%02d arg 0x%08x crc 0x%02x"
+sdbus_read(const char *bus_name, uint8_t value) "@%s value 0x%02x"
+sdbus_write(const char *bus_name, uint8_t value) "@%s value 0x%02x"
+
# hw/sd/sdhci.c
sdhci_set_inserted(const char *level) "card state changed: %s"
sdhci_send_command(uint8_t cmd, uint32_t arg) "CMD%02u ARG[0x%08x]"
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v7 13/14] sdhci: implement UHS-I voltage switch
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
` (11 preceding siblings ...)
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 12/14] sdbus: add trace events Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 14/14] sdhci: implement CMD/DAT[] fields in the Present State register Philippe Mathieu-Daudé
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite
[based on a patch from Alistair Francis <alistair.francis@xilinx.com>
from qemu/xilinx tag xilinx-v2015.2]
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
include/hw/sd/sd.h | 16 ++++++++++++++++
include/hw/sd/sdhci.h | 1 +
hw/sd/core.c | 13 +++++++++++++
hw/sd/sd.c | 13 +++++++++++++
hw/sd/sdhci.c | 12 +++++++++++-
hw/sd/trace-events | 1 +
6 files changed, 55 insertions(+), 1 deletion(-)
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index 96caefe373..f086679493 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -55,6 +55,20 @@
#define AKE_SEQ_ERROR (1 << 3)
#define OCR_CCS_BITN 30
+typedef enum {
+ SD_VOLTAGE_0_4V = 400, /* currently not supported */
+ SD_VOLTAGE_1_8V = 1800,
+ SD_VOLTAGE_3_0V = 3000,
+ SD_VOLTAGE_3_3V = 3300,
+} sd_voltage_mv_t;
+
+typedef enum {
+ UHS_NOT_SUPPORTED = 0,
+ UHS_I = 1,
+ UHS_II = 2, /* currently not supported */
+ UHS_III = 3, /* currently not supported */
+} sd_uhs_mode_t;
+
typedef enum {
sd_none = -1,
sd_bc = 0, /* broadcast -- no response */
@@ -88,6 +102,7 @@ typedef struct {
void (*write_data)(SDState *sd, uint8_t value);
uint8_t (*read_data)(SDState *sd);
bool (*data_ready)(SDState *sd);
+ void (*set_voltage)(SDState *sd, uint16_t millivolts);
void (*enable)(SDState *sd, bool enable);
bool (*get_inserted)(SDState *sd);
bool (*get_readonly)(SDState *sd);
@@ -134,6 +149,7 @@ void sd_enable(SDState *sd, bool enable);
/* Functions to be used by qdevified callers (working via
* an SDBus rather than directly with SDState)
*/
+void sdbus_set_voltage(SDBus *sdbus, uint16_t millivolts);
int sdbus_do_command(SDBus *sd, SDRequest *req, uint8_t *response);
void sdbus_write_data(SDBus *sd, uint8_t value);
uint8_t sdbus_read_data(SDBus *sd);
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index 9d3f656441..5951b3fb2d 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -121,6 +121,7 @@ typedef struct SDHCIState {
* Spec v3
***********/
uint8_t slot_type, sdr, strength;
+ uint8_t uhs_mode;
} cap;
} SDHCIState;
diff --git a/hw/sd/core.c b/hw/sd/core.c
index 498284f109..6d198ea775 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -41,6 +41,19 @@ static SDState *get_card(SDBus *sdbus)
return SD_CARD(kid->child);
}
+void sdbus_set_voltage(SDBus *sdbus, uint16_t millivolts)
+{
+ SDState *card = get_card(sdbus);
+
+ trace_sdbus_set_voltage(sdbus_name(sdbus), millivolts);
+ if (card) {
+ SDCardClass *sc = SD_CARD_GET_CLASS(card);
+
+ assert(sc->set_voltage);
+ sc->set_voltage(card, millivolts);
+ }
+}
+
int sdbus_do_command(SDBus *sdbus, SDRequest *req, uint8_t *response)
{
SDState *card = get_card(sdbus);
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 35347a5bbc..609b2da14f 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -128,6 +128,18 @@ struct SDState {
bool enable;
};
+static void sd_set_voltage(SDState *sd, uint16_t millivolts)
+{
+ switch (millivolts) {
+ case 3001 ... 3600: /* SD_VOLTAGE_3_3V */
+ case 2001 ... 3000: /* SD_VOLTAGE_3_0V */
+ break;
+ default:
+ qemu_log_mask(LOG_GUEST_ERROR, "SD card voltage not supported: %.3fV",
+ millivolts / 1000.f);
+ }
+}
+
static void sd_set_mode(SDState *sd)
{
switch (sd->state) {
@@ -1925,6 +1937,7 @@ static void sd_class_init(ObjectClass *klass, void *data)
dc->reset = sd_reset;
dc->bus_type = TYPE_SD_BUS;
+ sc->set_voltage = sd_set_voltage;
sc->do_command = sd_do_command;
sc->write_data = sd_write_data;
sc->read_data = sd_read_data;
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 37b3b265ef..3846182371 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1162,7 +1162,16 @@ sdhci_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)
sdhci_update_irq(s);
break;
case SDHC_ACMD12ERRSTS:
- MASKED_WRITE(s->acmd12errsts, mask, value);
+ MASKED_WRITE(s->acmd12errsts, mask, value & UINT16_MAX);
+ if (s->cap.uhs_mode >= UHS_I) {
+ MASKED_WRITE(s->hostctl2, mask >> 16, value >> 16);
+
+ if (FIELD_EX32(s->hostctl2, SDHC_HOSTCTL2, V18_ENA)) {
+ sdbus_set_voltage(&s->sdbus, SD_VOLTAGE_1_8V);
+ } else {
+ sdbus_set_voltage(&s->sdbus, SD_VOLTAGE_3_3V);
+ }
+ }
break;
case SDHC_CAPAB:
@@ -1244,6 +1253,7 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
DEFINE_PROP_UINT8("slot-type", _state, cap.slot_type, 0), \
DEFINE_PROP_UINT8("bus-speed", _state, cap.sdr, 0), \
DEFINE_PROP_UINT8("driver-strength", _state, cap.strength, 0), \
+ DEFINE_PROP_UINT8("uhs", _state, cap.uhs_mode, UHS_NOT_SUPPORTED), \
\
DEFINE_PROP_UINT64("maxcurr", _state, maxcurr, 0)
diff --git a/hw/sd/trace-events b/hw/sd/trace-events
index c0f51f11d4..f874489980 100644
--- a/hw/sd/trace-events
+++ b/hw/sd/trace-events
@@ -4,6 +4,7 @@
sdbus_command(const char *bus_name, uint8_t cmd, uint32_t arg, uint8_t crc) "@%s CMD%02d arg 0x%08x crc 0x%02x"
sdbus_read(const char *bus_name, uint8_t value) "@%s value 0x%02x"
sdbus_write(const char *bus_name, uint8_t value) "@%s value 0x%02x"
+sdbus_set_voltage(const char *bus_name, uint16_t millivolts) "@%s %u (mV)"
# hw/sd/sdhci.c
sdhci_set_inserted(const char *level) "card state changed: %s"
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v7 14/14] sdhci: implement CMD/DAT[] fields in the Present State register
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
` (12 preceding siblings ...)
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 13/14] sdhci: implement UHS-I voltage switch Philippe Mathieu-Daudé
@ 2018-01-18 20:40 ` Philippe Mathieu-Daudé
13 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 20:40 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Philippe Mathieu-Daudé,
qemu-devel, Edgar E . Iglesias, Andrey Smirnov, Prasad J Pandit,
Sai Pavan Boddu, Peter Crosthwaite
[based on a patch from Alistair Francis <alistair.francis@xilinx.com>
from qemu/xilinx tag xilinx-v2015.2]
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sdhci-internal.h | 2 ++
include/hw/sd/sd.h | 4 ++++
hw/sd/core.c | 34 ++++++++++++++++++++++++++++++++++
hw/sd/sd.c | 16 ++++++++++++++++
hw/sd/sdhci.c | 4 ++++
hw/sd/trace-events | 2 ++
6 files changed, 62 insertions(+)
diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
index b82e847636..8bcca39310 100644
--- a/hw/sd/sdhci-internal.h
+++ b/hw/sd/sdhci-internal.h
@@ -82,6 +82,8 @@
#define SDHC_CARD_PRESENT 0x00010000
#define SDHC_CARD_DETECT 0x00040000
#define SDHC_WRITE_PROTECT 0x00080000
+FIELD(SDHC_PRNSTS, DAT_LVL, 20, 4);
+FIELD(SDHC_PRNSTS, CMD_LVL, 24, 1);
#define TRANSFERRING_DATA(x) \
((x) & (SDHC_DOING_READ | SDHC_DOING_WRITE))
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index f086679493..bf1eb0713c 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -103,6 +103,8 @@ typedef struct {
uint8_t (*read_data)(SDState *sd);
bool (*data_ready)(SDState *sd);
void (*set_voltage)(SDState *sd, uint16_t millivolts);
+ uint8_t (*get_dat_lines)(SDState *sd);
+ bool (*get_cmd_line)(SDState *sd);
void (*enable)(SDState *sd, bool enable);
bool (*get_inserted)(SDState *sd);
bool (*get_readonly)(SDState *sd);
@@ -150,6 +152,8 @@ void sd_enable(SDState *sd, bool enable);
* an SDBus rather than directly with SDState)
*/
void sdbus_set_voltage(SDBus *sdbus, uint16_t millivolts);
+uint8_t sdbus_get_dat_lines(SDBus *sdbus);
+bool sdbus_get_cmd_line(SDBus *sdbus);
int sdbus_do_command(SDBus *sd, SDRequest *req, uint8_t *response);
void sdbus_write_data(SDBus *sd, uint8_t value);
uint8_t sdbus_read_data(SDBus *sd);
diff --git a/hw/sd/core.c b/hw/sd/core.c
index 6d198ea775..3c6eae6c88 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -41,6 +41,40 @@ static SDState *get_card(SDBus *sdbus)
return SD_CARD(kid->child);
}
+uint8_t sdbus_get_dat_lines(SDBus *sdbus)
+{
+ SDState *slave = get_card(sdbus);
+ uint8_t dat_lines = 0b1111; /* 4 bit bus width */
+
+ if (slave) {
+ SDCardClass *sc = SD_CARD_GET_CLASS(slave);
+
+ if (sc->get_dat_lines) {
+ dat_lines = sc->get_dat_lines(slave);
+ }
+ }
+ trace_sdbus_get_dat_lines(sdbus_name(sdbus), dat_lines);
+
+ return dat_lines;
+}
+
+bool sdbus_get_cmd_line(SDBus *sdbus)
+{
+ SDState *slave = get_card(sdbus);
+ bool cmd_line = true;
+
+ if (slave) {
+ SDCardClass *sc = SD_CARD_GET_CLASS(slave);
+
+ if (sc->get_cmd_line) {
+ cmd_line = sc->get_cmd_line(slave);
+ }
+ }
+ trace_sdbus_get_cmd_line(sdbus_name(sdbus), cmd_line);
+
+ return cmd_line;
+}
+
void sdbus_set_voltage(SDBus *sdbus, uint16_t millivolts)
{
SDState *card = get_card(sdbus);
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 609b2da14f..ab9be561d2 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -126,8 +126,20 @@ struct SDState {
BlockBackend *blk;
bool enable;
+ uint8_t dat_lines;
+ bool cmd_line;
};
+static uint8_t sd_get_dat_lines(SDState *sd)
+{
+ return sd->enable ? sd->dat_lines : 0;
+}
+
+static bool sd_get_cmd_line(SDState *sd)
+{
+ return sd->enable ? sd->cmd_line : false;
+}
+
static void sd_set_voltage(SDState *sd, uint16_t millivolts)
{
switch (millivolts) {
@@ -457,6 +469,8 @@ static void sd_reset(DeviceState *dev)
sd->blk_len = 0x200;
sd->pwd_len = 0;
sd->expecting_acmd = false;
+ sd->dat_lines = 0xf;
+ sd->cmd_line = true;
sd->multi_blk_cnt = 0;
}
@@ -1938,6 +1952,8 @@ static void sd_class_init(ObjectClass *klass, void *data)
dc->bus_type = TYPE_SD_BUS;
sc->set_voltage = sd_set_voltage;
+ sc->get_dat_lines = sd_get_dat_lines;
+ sc->get_cmd_line = sd_get_cmd_line;
sc->do_command = sd_do_command;
sc->write_data = sd_write_data;
sc->read_data = sd_read_data;
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 3846182371..01e608b6f8 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -910,6 +910,10 @@ static uint64_t sdhci_read(void *opaque, hwaddr offset, unsigned size)
break;
case SDHC_PRNSTS:
ret = s->prnsts;
+ ret = FIELD_DP32(ret, SDHC_PRNSTS, DAT_LVL,
+ sdbus_get_dat_lines(&s->sdbus));
+ ret = FIELD_DP32(ret, SDHC_PRNSTS, CMD_LVL,
+ sdbus_get_cmd_line(&s->sdbus));
break;
case SDHC_HOSTCTL:
ret = s->hostctl1 | (s->pwrcon << 8) | (s->blkgap << 16) |
diff --git a/hw/sd/trace-events b/hw/sd/trace-events
index f874489980..82efd79bea 100644
--- a/hw/sd/trace-events
+++ b/hw/sd/trace-events
@@ -5,6 +5,8 @@ sdbus_command(const char *bus_name, uint8_t cmd, uint32_t arg, uint8_t crc) "@%s
sdbus_read(const char *bus_name, uint8_t value) "@%s value 0x%02x"
sdbus_write(const char *bus_name, uint8_t value) "@%s value 0x%02x"
sdbus_set_voltage(const char *bus_name, uint16_t millivolts) "@%s %u (mV)"
+sdbus_get_dat_lines(const char *bus_name, uint8_t dat_lines) "@%s dat_lines: %u"
+sdbus_get_cmd_line(const char *bus_name, bool cmd_line) "@%s cmd_line: %u"
# hw/sd/sdhci.c
sdhci_set_inserted(const char *level) "card state changed: %s"
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PATCH v7 11/14] sdhci: implement the Host Control 2 register for the tunning sequence
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 11/14] sdhci: implement the Host Control 2 register for the tunning sequence Philippe Mathieu-Daudé
@ 2018-01-18 21:40 ` Eric Blake
2018-01-18 21:50 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 17+ messages in thread
From: Eric Blake @ 2018-01-18 21:40 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, Alistair Francis, Peter Maydell
Cc: Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
Andrey Smirnov, qemu-devel, Sai Pavan Boddu
[-- Attachment #1: Type: text/plain, Size: 357 bytes --]
On 01/18/2018 02:40 PM, Philippe Mathieu-Daudé wrote:
> [based on a patch from Alistair Francis <alistair.francis@xilinx.com>
> from qemu/xilinx tag xilinx-v2015.2]
In the subject, did you mean s/tunning/tuning/?
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PATCH v7 11/14] sdhci: implement the Host Control 2 register for the tunning sequence
2018-01-18 21:40 ` Eric Blake
@ 2018-01-18 21:50 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-18 21:50 UTC (permalink / raw)
To: Eric Blake, Alistair Francis, Peter Maydell
Cc: Edgar E . Iglesias, Prasad J Pandit, Peter Crosthwaite,
Andrey Smirnov, qemu-devel, Sai Pavan Boddu
[-- Attachment #1: Type: text/plain, Size: 356 bytes --]
On 01/18/2018 06:40 PM, Eric Blake wrote:
> On 01/18/2018 02:40 PM, Philippe Mathieu-Daudé wrote:
>> [based on a patch from Alistair Francis <alistair.francis@xilinx.com>
>> from qemu/xilinx tag xilinx-v2015.2]
>
> In the subject, did you mean s/tunning/tuning/?
I did the same mistake in the cover too :S
Thanks to correct this,
Phil.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2018-01-18 21:50 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-18 20:40 [Qemu-devel] [PATCH v7 00/14] SDHCI: add tunning sequence for UHS-I cards (part 3) Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 01/14] sdhci: add v3 capabilities Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 02/14] sdhci: rename the hostctl1 register Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 03/14] hw/arm/bcm2835_peripherals: implement SDHCI Spec v3 Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 04/14] hw/arm/bcm2835_peripherals: change maximum block size to 1kB Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 05/14] hw/arm/fsl-imx6: implement SDHCI Spec v3 Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 06/14] hw/arm/xilinx_zynqmp: " Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 07/14] sdhci: check Spec v3 capabilities qtest Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 08/14] sdhci: add a check_capab_v3() qtest Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 09/14] sdhci: remove the deprecated 'capareg' property Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 10/14] sdhci: add Spec v4.2 register definitions Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 11/14] sdhci: implement the Host Control 2 register for the tunning sequence Philippe Mathieu-Daudé
2018-01-18 21:40 ` Eric Blake
2018-01-18 21:50 ` Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 12/14] sdbus: add trace events Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 13/14] sdhci: implement UHS-I voltage switch Philippe Mathieu-Daudé
2018-01-18 20:40 ` [Qemu-devel] [PATCH v7 14/14] sdhci: implement CMD/DAT[] fields in the Present State register Philippe Mathieu-Daudé
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.