* [Qemu-devel] [PATCH v4 01/25] sdhci: add a spec_version property
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
@ 2018-01-03 18:33 ` Philippe Mathieu-Daudé
2018-01-04 17:51 ` Alistair Francis
2018-01-03 18:33 ` [Qemu-devel] [PATCH v4 02/25] sdhci: add basic Spec v1 capabilities Philippe Mathieu-Daudé
` (20 subsequent siblings)
21 siblings, 1 reply; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:33 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell, Andrey Smirnov
Cc: Philippe Mathieu-Daudé, qemu-devel, 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..ae8ddf4e3b 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 < 1) {
+ error_setg(errp, "spec version invalid");
+ 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, 1),
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] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 01/25] sdhci: add a spec_version property
2018-01-03 18:33 ` [Qemu-devel] [PATCH v4 01/25] sdhci: add a spec_version property Philippe Mathieu-Daudé
@ 2018-01-04 17:51 ` Alistair Francis
2018-01-04 19:36 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 25+ messages in thread
From: Alistair Francis @ 2018-01-04 17:51 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Andrey Smirnov, Peter Crosthwaite,
qemu-devel@nongnu.org Developers
On Wed, Jan 3, 2018 at 10:33 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> 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..ae8ddf4e3b 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 < 1) {
> + error_setg(errp, "spec version invalid");
Can we tell the user that the version must be greater then 1?
> + 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, 1),
This changes what we used to report to the guest. This at least needs
to be mentioned in the commit message.
Alistair
> 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] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 01/25] sdhci: add a spec_version property
2018-01-04 17:51 ` Alistair Francis
@ 2018-01-04 19:36 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-04 19:36 UTC (permalink / raw)
To: Alistair Francis
Cc: Edgar E . Iglesias, Peter Maydell, Andrey Smirnov,
Peter Crosthwaite, qemu-devel@nongnu.org Developers
On 01/04/2018 02:51 PM, Alistair Francis wrote:
> On Wed, Jan 3, 2018 at 10:33 AM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>> 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..ae8ddf4e3b 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 < 1) {
>> + error_setg(errp, "spec version invalid");
>
> Can we tell the user that the version must be greater then 1?
Good idea.
I started this at v1 to start verifying v1 features expected to be
working for v2, but we don't have v1-only HCI, so I'll see to have this
default to v2 directly.
>
>> + 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, 1),
>
> This changes what we used to report to the guest. This at least needs
> to be mentioned in the commit message.
Yes you right, I'll use a default v2 to avoid this guest change.
>> 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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 02/25] sdhci: add basic Spec v1 capabilities
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
2018-01-03 18:33 ` [Qemu-devel] [PATCH v4 01/25] sdhci: add a spec_version property Philippe Mathieu-Daudé
@ 2018-01-03 18:33 ` Philippe Mathieu-Daudé
2018-01-03 18:33 ` [Qemu-devel] [PATCH v4 03/25] sdhci: add max-block-length capability (Spec v1) Philippe Mathieu-Daudé
` (19 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:33 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell, Andrey Smirnov
Cc: Philippe Mathieu-Daudé, qemu-devel, 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 ae8ddf4e3b..5e08949b37 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, 1),
- 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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 03/25] sdhci: add max-block-length capability (Spec v1)
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
2018-01-03 18:33 ` [Qemu-devel] [PATCH v4 01/25] sdhci: add a spec_version property Philippe Mathieu-Daudé
2018-01-03 18:33 ` [Qemu-devel] [PATCH v4 02/25] sdhci: add basic Spec v1 capabilities Philippe Mathieu-Daudé
@ 2018-01-03 18:33 ` Philippe Mathieu-Daudé
2018-01-03 18:33 ` [Qemu-devel] [PATCH v4 05/25] sdhci: add DMA and 64-bit capabilities (Spec v2) Philippe Mathieu-Daudé
` (18 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:33 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell, Andrey Smirnov
Cc: Philippe Mathieu-Daudé, qemu-devel, 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 5e08949b37..e192f1e653 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, 1),
+ /* 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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 05/25] sdhci: add DMA and 64-bit capabilities (Spec v2)
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (2 preceding siblings ...)
2018-01-03 18:33 ` [Qemu-devel] [PATCH v4 03/25] sdhci: add max-block-length capability (Spec v1) Philippe Mathieu-Daudé
@ 2018-01-03 18:33 ` Philippe Mathieu-Daudé
2018-01-03 18:33 ` [Qemu-devel] [PATCH v4 06/25] sdhci: default to Spec v2 Philippe Mathieu-Daudé
` (17 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:33 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Andrey Smirnov, Grégory Estrade
Cc: Philippe Mathieu-Daudé, qemu-devel, 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 737d6c09a2..f8423f969e 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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 06/25] sdhci: default to Spec v2
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (3 preceding siblings ...)
2018-01-03 18:33 ` [Qemu-devel] [PATCH v4 05/25] sdhci: add DMA and 64-bit capabilities (Spec v2) Philippe Mathieu-Daudé
@ 2018-01-03 18:33 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 07/25] sdhci: add a 'dma' shortcut property Philippe Mathieu-Daudé
` (16 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:33 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell, Andrey Smirnov
Cc: Philippe Mathieu-Daudé, qemu-devel, Peter Crosthwaite
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sdhci.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index f8423f969e..8692798021 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1299,7 +1299,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, 1),
+ 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),
--
2.15.1
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 07/25] sdhci: add a 'dma' shortcut property
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (4 preceding siblings ...)
2018-01-03 18:33 ` [Qemu-devel] [PATCH v4 06/25] sdhci: default to Spec v2 Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 09/25] sdhci: Fix 64-bit ADMA2 Philippe Mathieu-Daudé
` (15 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell, Andrey Smirnov
Cc: Philippe Mathieu-Daudé, qemu-devel, Peter Crosthwaite
disabling it disables all DMAs at once.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
include/hw/sd/sdhci.h | 1 +
hw/sd/sdhci.c | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index 4a9c3e9175..bac37f9e11 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -101,6 +101,7 @@ typedef struct SDHCIState {
bool pending_insert_state;
/* Configurable properties */
bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
+ bool dma; /* shortcut for sdma + adma* */
uint8_t spec_version;
struct {
/* v1 */
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 8692798021..cc1e28fa61 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1178,6 +1178,10 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
}
s->version = (SDHC_HCVER_VENDOR << 8) | (s->spec_version - 1);
+ if (!s->dma) {
+ s->cap.sdma = s->cap.adma1 = s->cap.adma2 = false;
+ }
+
if (s->capareg == UINT64_MAX) {
sdhci_init_capareg(s, errp);
}
@@ -1312,6 +1316,7 @@ static Property sdhci_properties[] = {
* Possible values: 512, 1024, 2048 bytes */
DEFINE_PROP_UINT16("max-block-length", SDHCIState, cap.max_blk_len, 512),
/* DMA */
+ DEFINE_PROP_BOOL("dma", SDHCIState, dma, true), /* shortcut */
DEFINE_PROP_BOOL("sdma", SDHCIState, cap.sdma, true),
DEFINE_PROP_BOOL("adma1", SDHCIState, cap.adma1, false),
DEFINE_PROP_BOOL("adma2", SDHCIState, cap.adma2, true),
--
2.15.1
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 09/25] sdhci: Fix 64-bit ADMA2
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (5 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 07/25] sdhci: add a 'dma' shortcut property Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 10/25] hw/arm/exynos4210: implement SDHCI Spec v2 Philippe Mathieu-Daudé
` (14 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Andrey Smirnov, Grégory Estrade, Prasad J Pandit
Cc: Sai Pavan Boddu, qemu-devel, Peter Crosthwaite,
Philippe Mathieu-Daudé
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>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
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 755bbbecd1..50b483cbf2 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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 10/25] hw/arm/exynos4210: implement SDHCI Spec v2
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (6 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 09/25] sdhci: Fix 64-bit ADMA2 Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 11/25] hw/arm/xilinx_zynq: " Philippe Mathieu-Daudé
` (13 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Igor Mitsyanko, Krzysztof Kozlowski, Andrey Smirnov
Cc: Philippe Mathieu-Daudé, qemu-devel, qemu-arm, Peter Crosthwaite
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/exynos4210.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index e8e1d81e62..0e6acac784 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,8 +376,18 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem)
BlockBackend *blk;
DriveInfo *di;
+ /* Compatible with:
+ * - SD Host Controller Specification Version 2.0
+ * - SDIO Specification Version 2.0
+ * - MMC Specification Version 4.3
+ *
+ * - SDMA
+ * - ADMA
+ */
dev = qdev_create(NULL, TYPE_SYSBUS_SDHCI);
- qdev_prop_set_uint32(dev, "capareg", EXYNOS4210_SDHCI_CAPABILITIES);
+ qdev_prop_set_uint8(dev, "sd-spec-version", 2);
+ qdev_prop_set_bit(dev, "suspend", true);
+ qdev_prop_set_bit(dev, "1v8", true);
qdev_init_nofail(dev);
busdev = SYS_BUS_DEVICE(dev);
--
2.15.1
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 11/25] hw/arm/xilinx_zynq: implement SDHCI Spec v2
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (7 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 10/25] hw/arm/exynos4210: implement SDHCI Spec v2 Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 12/25] sdhci: add qtest to check the SD Spec version Philippe Mathieu-Daudé
` (12 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell, Andrey Smirnov
Cc: Philippe Mathieu-Daudé,
qemu-devel, Peter Crosthwaite, Edgar E. Iglesias,
open list:Xilinx Zynq
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/xilinx_zynq.c | 64 ++++++++++++++++++++++++++++++++--------------------
1 file changed, 40 insertions(+), 24 deletions(-)
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 1836a4ed45..9a106db7b7 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,45 @@ 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;
+
+ /* 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)
+ */
+ dev = qdev_create(NULL, TYPE_SYSBUS_SDHCI);
+ qdev_prop_set_uint8(dev, "sd-spec-version", 2);
+ qdev_prop_set_bit(dev, "adma1", true);
+ qdev_prop_set_bit(dev, "high-speed", true);
+ qdev_prop_set_uint16(dev, "max-block-length", 1024);
+ qdev_init_nofail(dev);
+ sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, hci_addr);
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[hci_irq - 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_ZYNQ_XADC);
qdev_init_nofail(dev);
--
2.15.1
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 12/25] sdhci: add qtest to check the SD Spec version
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (8 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 11/25] hw/arm/xilinx_zynq: " Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 13/25] sdhci: check Spec v2 capabilities qtest Philippe Mathieu-Daudé
` (11 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Igor Mitsyanko, Krzysztof Kozlowski, Andrey Smirnov
Cc: Philippe Mathieu-Daudé, qemu-devel, 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 c002352134..af7f324e07 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -355,6 +355,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)
@@ -609,6 +610,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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 13/25] sdhci: check Spec v2 capabilities qtest
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (9 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 12/25] sdhci: add qtest to check the SD Spec version Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 15/25] sdhci: rename the hostctl1 register Philippe Mathieu-Daudé
` (10 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Igor Mitsyanko, Krzysztof Kozlowski, Andrey Smirnov
Cc: Philippe Mathieu-Daudé, qemu-devel, 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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 15/25] sdhci: rename the hostctl1 register
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (10 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 13/25] sdhci: check Spec v2 capabilities qtest Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 16/25] hw/arm/bcm2835_peripherals: implement SDHCI Spec v3 Philippe Mathieu-Daudé
` (9 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell, Andrey Smirnov
Cc: Philippe Mathieu-Daudé, qemu-devel, 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 46e1e42fa1..c2da48c17c 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 58c07bae80..2bd3c5a4b9 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)) {
@@ -1285,7 +1285,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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 16/25] hw/arm/bcm2835_peripherals: implement SDHCI Spec v3
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (11 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 15/25] sdhci: rename the hostctl1 register Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 17/25] hw/arm/fsl-imx6: " Philippe Mathieu-Daudé
` (8 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Andrey Smirnov,
Grégory Estrade gregory . estrade @ gmail . com Clement
Deschamps, Andrew Baumann, Ashok kumar
Cc: Philippe Mathieu-Daudé, qemu-devel, qemu-arm, Peter Crosthwaite
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/bcm2835_peripherals.c | 35 ++++++++++++++++++++++++-----------
1 file changed, 24 insertions(+), 11 deletions(-)
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 12e0dd11af..b1a7bc1617 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,30 @@ 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, "clock-freq", &err);
+ object_property_set_bool(OBJECT(&s->sdhci), false, "dma", &err);
+ object_property_set_bool(OBJECT(&s->sdhci), true, "1v8", &err);
+ /* FIXME verify/validate with someone from Broadcom?
+ 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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 17/25] hw/arm/fsl-imx6: implement SDHCI Spec v3
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (12 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 16/25] hw/arm/bcm2835_peripherals: implement SDHCI Spec v3 Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 18/25] hw/arm/xilinx_zynqmp: " Philippe Mathieu-Daudé
` (7 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Andrey Smirnov, Jean-Christophe Dubois
Cc: Philippe Mathieu-Daudé, qemu-devel, qemu-arm, Peter Crosthwaite
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/fsl-imx6.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index 59ef33efa9..d4de428dbc 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -348,6 +348,18 @@ 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, "clock-freq", &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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 18/25] hw/arm/xilinx_zynqmp: implement SDHCI Spec v3
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (13 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 17/25] hw/arm/fsl-imx6: " Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 19/25] sdhci: check Spec v3 capabilities qtest Philippe Mathieu-Daudé
` (6 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell, Andrey Smirnov
Cc: Philippe Mathieu-Daudé,
qemu-devel, qemu-arm, Peter Crosthwaite, Edgar E. Iglesias
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/xlnx-zynqmp.c | 38 +++++++++++++++++++++++++++-----------
1 file changed, 27 insertions(+), 11 deletions(-)
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index c707c66322..067c309f56 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -374,22 +374,38 @@ 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_bool(sdhci, true, "suspend", &err);
+ object_property_set_bool(sdhci, true, "1v8", &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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 19/25] sdhci: check Spec v3 capabilities qtest
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (14 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 18/25] hw/arm/xilinx_zynqmp: " Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 20/25] sdhci: remove the deprecated 'capareg' property Philippe Mathieu-Daudé
` (5 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Andrey Smirnov, Jean-Christophe Dubois, Grégory Estrade,
Clement Deschamps, Andrew Baumann
Cc: Philippe Mathieu-Daudé, qemu-devel, 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 af7f324e07..cd18ab4519 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -358,6 +358,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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 20/25] sdhci: remove the deprecated 'capareg' property
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (15 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 19/25] sdhci: check Spec v3 capabilities qtest Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 21/25] sdhci: add check_capab_readonly() qtest Philippe Mathieu-Daudé
` (4 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell, Andrey Smirnov
Cc: Philippe Mathieu-Daudé, qemu-devel, 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 2bd3c5a4b9..2b63ff1891 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1195,9 +1195,7 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
s->cap.sdma = s->cap.adma1 = s->cap.adma2 = false;
}
- if (s->capareg == UINT64_MAX) {
- sdhci_init_capareg(s, errp);
- }
+ sdhci_init_capareg(s, errp);
}
static void sdhci_initfn(SDHCIState *s)
@@ -1347,9 +1345,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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 21/25] sdhci: add check_capab_readonly() qtest
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (16 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 20/25] sdhci: remove the deprecated 'capareg' property Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 22/25] sdhci: add a check_capab_baseclock() qtest Philippe Mathieu-Daudé
` (3 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Andrey Smirnov, Stefan Hajnoczi
Cc: Philippe Mathieu-Daudé, qemu-devel, 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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 22/25] sdhci: add a check_capab_baseclock() qtest
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (17 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 21/25] sdhci: add check_capab_readonly() qtest Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 23/25] sdhci: add a check_capab_sdma() qtest Philippe Mathieu-Daudé
` (2 subsequent siblings)
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Andrey Smirnov, Igor Mitsyanko, Krzysztof Kozlowski,
Stefan Hajnoczi
Cc: Philippe Mathieu-Daudé, qemu-devel, 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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 23/25] sdhci: add a check_capab_sdma() qtest
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (18 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 22/25] sdhci: add a check_capab_baseclock() qtest Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 24/25] sdhci: add a check_capab_v3() qtest Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 25/25] sdhci: add Spec v4.2 register definitions Philippe Mathieu-Daudé
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Andrey Smirnov, Igor Mitsyanko, Krzysztof Kozlowski,
Stefan Hajnoczi
Cc: Philippe Mathieu-Daudé, qemu-devel, 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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 24/25] sdhci: add a check_capab_v3() qtest
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (19 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 23/25] sdhci: add a check_capab_sdma() qtest Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 25/25] sdhci: add Spec v4.2 register definitions Philippe Mathieu-Daudé
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell,
Andrey Smirnov, Stefan Hajnoczi
Cc: Philippe Mathieu-Daudé, qemu-devel, 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] 25+ messages in thread
* [Qemu-devel] [PATCH v4 25/25] sdhci: add Spec v4.2 register definitions
2018-01-03 18:33 [Qemu-devel] [PATCH v4 00/25] SDHCI: add qtests and fix few issues Philippe Mathieu-Daudé
` (20 preceding siblings ...)
2018-01-03 18:34 ` [Qemu-devel] [PATCH v4 24/25] sdhci: add a check_capab_v3() qtest Philippe Mathieu-Daudé
@ 2018-01-03 18:34 ` Philippe Mathieu-Daudé
21 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-03 18:34 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Peter Maydell, Andrey Smirnov
Cc: Philippe Mathieu-Daudé, qemu-devel, 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] 25+ messages in thread