From: "mar.krzeminski" <mar.krzeminski@gmail.com>
To: Jean-Christophe Dubois <jcd@tribudubois.net>,
qemu-devel@nongnu.org, peter.maydell@linaro.org
Subject: Re: [Qemu-devel] [PATCH v2] [i.MX] fix CS handling during SPI access.
Date: Tue, 3 Jan 2017 18:18:27 +0100 [thread overview]
Message-ID: <0dbadac5-5e70-df78-ce0f-6aceaba8da14@gmail.com> (raw)
In-Reply-To: <20170102211104.4753-1-jcd@tribudubois.net>
Hello JC,
W dniu 02.01.2017 o 22:11, Jean-Christophe Dubois pisze:
> The i.MX SPI device was not de-asserting the CS line at the end of
> memory access.
>
> This triggered a SIGSEGV in Qemu when the sabrelite emulator was acessing
> a SPI flash memory.
>
> Whit this path the CS signal is correctly asserted and deasserted arround
> memory access.
This code assume, that iMX SPI does not support devices which
are active when CS signal is asserted. I have not read datasheet,
but if iMX SPI can support such devices I think it could be better to
implement such functionality in model - even if currently in Qemu you
will not use it.
If you will stick in deasserted CS line as active, please see comments
below.
>
> This was tested by:
> * booting linux on Sabrelite Qemu emulator.
> * booting xvisor on Sabrelite Qemu emultor.
>
> Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
> ---
>
> Changes since v1:
> * Fix coding style issue.
>
> hw/ssi/imx_spi.c | 33 ++++++++++++++++++++++-----------
> 1 file changed, 22 insertions(+), 11 deletions(-)
>
> diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
> index e4e395f..c2d293c 100644
> --- a/hw/ssi/imx_spi.c
> +++ b/hw/ssi/imx_spi.c
> @@ -152,13 +152,20 @@ static bool imx_spi_is_multiple_master_burst(IMXSPIState *s)
>
> static void imx_spi_flush_txfifo(IMXSPIState *s)
> {
> - uint32_t tx;
> - uint32_t rx;
> + uint32_t i;
>
> DPRINTF("Begin: TX Fifo Size = %d, RX Fifo Size = %d\n",
> fifo32_num_used(&s->tx_fifo), fifo32_num_used(&s->rx_fifo));
>
> + /* Activate the requested CS line */
> + for (i = 0; i < 4; i++) {
> + qemu_set_irq(s->cs_lines[i],
> + i == imx_spi_selected_channel(s) ? 0 : 1);
> + }
Since you are setting to 1 all cs lines in reset, this loop could be
removed, and only selected cs line could be de-asserted.
> +
> while (!fifo32_is_empty(&s->tx_fifo)) {
> + uint32_t tx;
> + uint32_t rx = 0;
> int tx_burst = 0;
> int index = 0;
>
> @@ -178,8 +185,6 @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
>
> tx_burst = MIN(s->burst_length, 32);
>
> - rx = 0;
> -
> while (tx_burst) {
> uint8_t byte = tx & 0xff;
>
> @@ -221,6 +226,13 @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
> s->regs[ECSPI_STATREG] |= ECSPI_STATREG_TC;
> }
>
> + /* Deselect all SS lines if transfert if completed */
> + if (s->regs[ECSPI_STATREG] & ECSPI_STATREG_TC) {
> + for (i = 0; i < 4; i++) {
> + qemu_set_irq(s->cs_lines[i], 1);
> + }
> + }
> +
Same as above.
Thanks,
Marcin
> /* TODO: We should also use TDR and RDR bits */
>
> DPRINTF("End: TX Fifo Size = %d, RX Fifo Size = %d\n",
> @@ -230,6 +242,7 @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
> static void imx_spi_reset(DeviceState *dev)
> {
> IMXSPIState *s = IMX_SPI(dev);
> + uint32_t i;
>
> DPRINTF("\n");
>
> @@ -243,6 +256,11 @@ static void imx_spi_reset(DeviceState *dev)
> imx_spi_update_irq(s);
>
> s->burst_length = 0;
> +
> + /* Disable all CS lines */
> + for (i = 0; i < 4; i++) {
> + qemu_set_irq(s->cs_lines[i], 1);
> + }
> }
>
> static uint64_t imx_spi_read(void *opaque, hwaddr offset, unsigned size)
> @@ -359,15 +377,8 @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
> }
>
> if (imx_spi_channel_is_master(s)) {
> - int i;
> -
> /* We are in master mode */
>
> - for (i = 0; i < 4; i++) {
> - qemu_set_irq(s->cs_lines[i],
> - i == imx_spi_selected_channel(s) ? 0 : 1);
> - }
> -
> if ((value & change_mask & ECSPI_CONREG_SMC) &&
> !fifo32_is_empty(&s->tx_fifo)) {
> /* SMC bit is set and TX FIFO has some slots filled in */
prev parent reply other threads:[~2017-01-03 17:18 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-02 21:11 [Qemu-devel] [PATCH v2] [i.MX] fix CS handling during SPI access Jean-Christophe Dubois
2017-01-03 17:18 ` mar.krzeminski [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0dbadac5-5e70-df78-ce0f-6aceaba8da14@gmail.com \
--to=mar.krzeminski@gmail.com \
--cc=jcd@tribudubois.net \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).