* [Qemu-devel] [PATCH v3] aspeed/smc: handle dummy bytes when doing fast reads in command mode
@ 2017-01-18 15:01 Cédric Le Goater
2017-01-18 18:23 ` mar.krzeminski
2017-01-24 11:45 ` Peter Maydell
0 siblings, 2 replies; 4+ messages in thread
From: Cédric Le Goater @ 2017-01-18 15:01 UTC (permalink / raw)
To: Peter Crosthwaite
Cc: Peter Maydell, qemu-devel, Marcin Krzeminski,
Cédric Le Goater
When doing fast read, a certain amount of dummy bytes should be sent
before the read. This number is configurable in the controler CE0
Control Register and needs to be modeled using fake transfers to the
flash module.
This only supports command mode. User mode requires more work and a
possible extension of the m25p80 device model.
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
Changes since v2:
- handled dummies under read routine and removed the test on the spi
command READ_FAST (0xb)
hw/ssi/aspeed_smc.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
index a0a816407fc1..fc3cccec0566 100644
--- a/hw/ssi/aspeed_smc.c
+++ b/hw/ssi/aspeed_smc.c
@@ -69,7 +69,9 @@
#define R_CTRL0 (0x10 / 4)
#define CTRL_CMD_SHIFT 16
#define CTRL_CMD_MASK 0xff
+#define CTRL_DUMMY_HIGH_SHIFT 14
#define CTRL_AST2400_SPI_4BYTE (1 << 13)
+#define CTRL_DUMMY_LOW_SHIFT 6 /* 2 bits [7:6] */
#define CTRL_CE_STOP_ACTIVE (1 << 2)
#define CTRL_CMD_MODE_MASK 0x3
#define CTRL_READMODE 0x0
@@ -490,6 +492,16 @@ static uint32_t aspeed_smc_check_segment_addr(const AspeedSMCFlash *fl,
return addr;
}
+static int aspeed_smc_flash_dummies(const AspeedSMCFlash *fl)
+{
+ const AspeedSMCState *s = fl->controller;
+ uint32_t r_ctrl0 = s->regs[s->r_ctrl0 + fl->id];
+ uint32_t dummy_high = (r_ctrl0 >> CTRL_DUMMY_HIGH_SHIFT) & 0x1;
+ uint32_t dummy_low = (r_ctrl0 >> CTRL_DUMMY_LOW_SHIFT) & 0x3;
+
+ return ((dummy_high << 2) | dummy_low) * 8;
+}
+
static void aspeed_smc_flash_send_addr(AspeedSMCFlash *fl, uint32_t addr)
{
const AspeedSMCState *s = fl->controller;
@@ -526,6 +538,15 @@ static uint64_t aspeed_smc_flash_read(void *opaque, hwaddr addr, unsigned size)
aspeed_smc_flash_select(fl);
aspeed_smc_flash_send_addr(fl, addr);
+ /*
+ * Use fake transfers to model dummy bytes. The value should
+ * be configured to some non-zero value in fast read mode and
+ * zero in read mode.
+ */
+ for (i = 0; i < aspeed_smc_flash_dummies(fl); i++) {
+ ssi_transfer(fl->controller->spi, 0xFF);
+ }
+
for (i = 0; i < size; i++) {
ret |= ssi_transfer(s->spi, 0x0) << (8 * i);
}
--
2.7.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH v3] aspeed/smc: handle dummy bytes when doing fast reads in command mode
2017-01-18 15:01 [Qemu-devel] [PATCH v3] aspeed/smc: handle dummy bytes when doing fast reads in command mode Cédric Le Goater
@ 2017-01-18 18:23 ` mar.krzeminski
2017-01-23 10:05 ` Cédric Le Goater
2017-01-24 11:45 ` Peter Maydell
1 sibling, 1 reply; 4+ messages in thread
From: mar.krzeminski @ 2017-01-18 18:23 UTC (permalink / raw)
To: Cédric Le Goater, Peter Crosthwaite; +Cc: Peter Maydell, qemu-devel
W dniu 18.01.2017 o 16:01, Cédric Le Goater pisze:
> When doing fast read, a certain amount of dummy bytes should be sent
> before the read. This number is configurable in the controler CE0
> Control Register and needs to be modeled using fake transfers to the
> flash module.
>
> This only supports command mode. User mode requires more work and a
> possible extension of the m25p80 device model.
>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---
>
> Changes since v2:
>
> - handled dummies under read routine and removed the test on the spi
> command READ_FAST (0xb)
>
> hw/ssi/aspeed_smc.c | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
> index a0a816407fc1..fc3cccec0566 100644
> --- a/hw/ssi/aspeed_smc.c
> +++ b/hw/ssi/aspeed_smc.c
> @@ -69,7 +69,9 @@
> #define R_CTRL0 (0x10 / 4)
> #define CTRL_CMD_SHIFT 16
> #define CTRL_CMD_MASK 0xff
> +#define CTRL_DUMMY_HIGH_SHIFT 14
> #define CTRL_AST2400_SPI_4BYTE (1 << 13)
> +#define CTRL_DUMMY_LOW_SHIFT 6 /* 2 bits [7:6] */
> #define CTRL_CE_STOP_ACTIVE (1 << 2)
> #define CTRL_CMD_MODE_MASK 0x3
> #define CTRL_READMODE 0x0
> @@ -490,6 +492,16 @@ static uint32_t aspeed_smc_check_segment_addr(const AspeedSMCFlash *fl,
> return addr;
> }
>
> +static int aspeed_smc_flash_dummies(const AspeedSMCFlash *fl)
> +{
> + const AspeedSMCState *s = fl->controller;
> + uint32_t r_ctrl0 = s->regs[s->r_ctrl0 + fl->id];
> + uint32_t dummy_high = (r_ctrl0 >> CTRL_DUMMY_HIGH_SHIFT) & 0x1;
> + uint32_t dummy_low = (r_ctrl0 >> CTRL_DUMMY_LOW_SHIFT) & 0x3;
> +
> + return ((dummy_high << 2) | dummy_low) * 8;
> +}
> +
> static void aspeed_smc_flash_send_addr(AspeedSMCFlash *fl, uint32_t addr)
> {
> const AspeedSMCState *s = fl->controller;
> @@ -526,6 +538,15 @@ static uint64_t aspeed_smc_flash_read(void *opaque, hwaddr addr, unsigned size)
> aspeed_smc_flash_select(fl);
> aspeed_smc_flash_send_addr(fl, addr);
>
> + /*
> + * Use fake transfers to model dummy bytes. The value should
> + * be configured to some non-zero value in fast read mode and
> + * zero in read mode.
> + */
> + for (i = 0; i < aspeed_smc_flash_dummies(fl); i++) {
> + ssi_transfer(fl->controller->spi, 0xFF);
> + }
> +
> for (i = 0; i < size; i++) {
> ret |= ssi_transfer(s->spi, 0x0) << (8 * i);
> }
If it does not break CTRL_WRITEMODE then:
Acked-by: Marcin Krzemiński <mar.krzeminski@gmail.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH v3] aspeed/smc: handle dummy bytes when doing fast reads in command mode
2017-01-18 18:23 ` mar.krzeminski
@ 2017-01-23 10:05 ` Cédric Le Goater
0 siblings, 0 replies; 4+ messages in thread
From: Cédric Le Goater @ 2017-01-23 10:05 UTC (permalink / raw)
To: mar.krzeminski, Peter Crosthwaite; +Cc: Peter Maydell, qemu-devel
On 01/18/2017 07:23 PM, mar.krzeminski wrote:
> W dniu 18.01.2017 o 16:01, Cédric Le Goater pisze:
>> When doing fast read, a certain amount of dummy bytes should be sent
>> before the read. This number is configurable in the controler CE0
>> Control Register and needs to be modeled using fake transfers to the
>> flash module.
>>
>> This only supports command mode. User mode requires more work and a
>> possible extension of the m25p80 device model.
>>
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>> ---
>>
>> Changes since v2:
>>
>> - handled dummies under read routine and removed the test on the spi
>> command READ_FAST (0xb)
>>
>> hw/ssi/aspeed_smc.c | 21 +++++++++++++++++++++
>> 1 file changed, 21 insertions(+)
>>
>> diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
>> index a0a816407fc1..fc3cccec0566 100644
>> --- a/hw/ssi/aspeed_smc.c
>> +++ b/hw/ssi/aspeed_smc.c
>> @@ -69,7 +69,9 @@
>> #define R_CTRL0 (0x10 / 4)
>> #define CTRL_CMD_SHIFT 16
>> #define CTRL_CMD_MASK 0xff
>> +#define CTRL_DUMMY_HIGH_SHIFT 14
>> #define CTRL_AST2400_SPI_4BYTE (1 << 13)
>> +#define CTRL_DUMMY_LOW_SHIFT 6 /* 2 bits [7:6] */
>> #define CTRL_CE_STOP_ACTIVE (1 << 2)
>> #define CTRL_CMD_MODE_MASK 0x3
>> #define CTRL_READMODE 0x0
>> @@ -490,6 +492,16 @@ static uint32_t aspeed_smc_check_segment_addr(const AspeedSMCFlash *fl,
>> return addr;
>> }
>> +static int aspeed_smc_flash_dummies(const AspeedSMCFlash *fl)
>> +{
>> + const AspeedSMCState *s = fl->controller;
>> + uint32_t r_ctrl0 = s->regs[s->r_ctrl0 + fl->id];
>> + uint32_t dummy_high = (r_ctrl0 >> CTRL_DUMMY_HIGH_SHIFT) & 0x1;
>> + uint32_t dummy_low = (r_ctrl0 >> CTRL_DUMMY_LOW_SHIFT) & 0x3;
>> +
>> + return ((dummy_high << 2) | dummy_low) * 8;
>> +}
>> +
>> static void aspeed_smc_flash_send_addr(AspeedSMCFlash *fl, uint32_t addr)
>> {
>> const AspeedSMCState *s = fl->controller;
>> @@ -526,6 +538,15 @@ static uint64_t aspeed_smc_flash_read(void *opaque, hwaddr addr, unsigned size)
>> aspeed_smc_flash_select(fl);
>> aspeed_smc_flash_send_addr(fl, addr);
>> + /*
>> + * Use fake transfers to model dummy bytes. The value should
>> + * be configured to some non-zero value in fast read mode and
>> + * zero in read mode.
>> + */
>> + for (i = 0; i < aspeed_smc_flash_dummies(fl); i++) {
>> + ssi_transfer(fl->controller->spi, 0xFF);
>> + }
>> +
>> for (i = 0; i < size; i++) {
>> ret |= ssi_transfer(s->spi, 0x0) << (8 * i);
>> }
> If it does not break CTRL_WRITEMODE then:
> Acked-by: Marcin Krzemiński <mar.krzeminski@gmail.com>
yes. now the dummy transfers are under the CTRL_FREADMODE case,
which is the same as CTRL_READMODE but in this case, the number
of dummies should zero.
Thanks,
C.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH v3] aspeed/smc: handle dummy bytes when doing fast reads in command mode
2017-01-18 15:01 [Qemu-devel] [PATCH v3] aspeed/smc: handle dummy bytes when doing fast reads in command mode Cédric Le Goater
2017-01-18 18:23 ` mar.krzeminski
@ 2017-01-24 11:45 ` Peter Maydell
1 sibling, 0 replies; 4+ messages in thread
From: Peter Maydell @ 2017-01-24 11:45 UTC (permalink / raw)
To: Cédric Le Goater
Cc: Peter Crosthwaite, QEMU Developers, Marcin Krzeminski
On 18 January 2017 at 15:01, Cédric Le Goater <clg@kaod.org> wrote:
> When doing fast read, a certain amount of dummy bytes should be sent
> before the read. This number is configurable in the controler CE0
> Control Register and needs to be modeled using fake transfers to the
> flash module.
>
> This only supports command mode. User mode requires more work and a
> possible extension of the m25p80 device model.
>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
Applied to target-arm.next, thanks.
-- PMM
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-01-24 11:45 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-18 15:01 [Qemu-devel] [PATCH v3] aspeed/smc: handle dummy bytes when doing fast reads in command mode Cédric Le Goater
2017-01-18 18:23 ` mar.krzeminski
2017-01-23 10:05 ` Cédric Le Goater
2017-01-24 11:45 ` Peter Maydell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).