All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
To: Laurent Vivier <laurent@vivier.eu>,
	qemu-devel@nongnu.org, pbonzini@redhat.com, fam@euphon.net
Subject: Re: [PATCH v2 18/42] esp: accumulate SCSI commands for PDMA transfers in cmdbuf instead of pdma_buf
Date: Tue, 2 Mar 2021 19:29:13 +0000	[thread overview]
Message-ID: <15ceb143-d902-b415-3f5d-48999840a560@ilande.co.uk> (raw)
In-Reply-To: <68838f99-f2fa-5eb3-683c-85b39b155ab4@vivier.eu>

On 02/03/2021 17:59, Laurent Vivier wrote:

> Le 02/03/2021 à 18:34, Mark Cave-Ayland a écrit :
>> On 02/03/2021 17:02, Laurent Vivier wrote:
>>
>>> Le 09/02/2021 à 20:29, Mark Cave-Ayland a écrit :
>>>> ESP SCSI commands are already accumulated in cmdbuf and so there is no need to
>>>> keep a separate pdma_buf buffer. Accumulate SCSI commands for PDMA transfers in
>>>> cmdbuf instead of pdma_buf so update cmdlen accordingly and change pdma_origin
>>>> for PDMA transfers to CMD which allows the PDMA origin to be removed.
>>>>
>>>> This commit also removes a stray memcpy() from get_cmd() which is a no-op because
>>>> cmdlen is always zero at the start of a command.
>>>>
>>>> Notionally the removal of pdma_buf from vmstate_esp_pdma also breaks migration
>>>> compatibility for the PDMA subsection until its complete removal by the end of
>>>> the series.
>>>>
>>>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>>>> ---
>>>>    hw/scsi/esp.c         | 56 +++++++++++++++++++------------------------
>>>>    include/hw/scsi/esp.h |  2 --
>>>>    2 files changed, 25 insertions(+), 33 deletions(-)
>>>>
>>>> diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
>>>> index 7134c0aff4..b846f022fb 100644
>>>> --- a/hw/scsi/esp.c
>>>> +++ b/hw/scsi/esp.c
>>>> @@ -139,8 +139,6 @@ static void set_pdma(ESPState *s, enum pdma_origin_id origin,
>>>>    static uint8_t *get_pdma_buf(ESPState *s)
>>>>    {
>>>>        switch (s->pdma_origin) {
>>>> -    case PDMA:
>>>> -        return s->pdma_buf;
>>>>        case TI:
>>>>            return s->ti_buf;
>>>>        case CMD:
>>>> @@ -161,14 +159,12 @@ static uint8_t esp_pdma_read(ESPState *s)
>>>>        }
>>>>          switch (s->pdma_origin) {
>>>> -    case PDMA:
>>>> -        val = s->pdma_buf[s->pdma_cur++];
>>>> -        break;
>>>>        case TI:
>>>>            val = s->ti_buf[s->pdma_cur++];
>>>>            break;
>>>>        case CMD:
>>>> -        val = s->cmdbuf[s->pdma_cur++];
>>>> +        val = s->cmdbuf[s->cmdlen++];
>>>> +        s->pdma_cur++;
>>>>            break;
>>>>        case ASYNC:
>>>>            val = s->async_buf[s->pdma_cur++];
>>>> @@ -193,14 +189,12 @@ static void esp_pdma_write(ESPState *s, uint8_t val)
>>>>        }
>>>>          switch (s->pdma_origin) {
>>>> -    case PDMA:
>>>> -        s->pdma_buf[s->pdma_cur++] = val;
>>>> -        break;
>>>>        case TI:
>>>>            s->ti_buf[s->pdma_cur++] = val;
>>>>            break;
>>>>        case CMD:
>>>> -        s->cmdbuf[s->pdma_cur++] = val;
>>>> +        s->cmdbuf[s->cmdlen++] = val;
>>>> +        s->pdma_cur++;
>>>>            break;
>>>>        case ASYNC:
>>>>            s->async_buf[s->pdma_cur++] = val;
>>>> @@ -256,8 +250,7 @@ static uint32_t get_cmd(ESPState *s, uint8_t *buf, uint8_t buflen)
>>>>            if (s->dma_memory_read) {
>>>>                s->dma_memory_read(s->dma_opaque, buf, dmalen);
>>>>            } else {
>>>> -            memcpy(s->pdma_buf, buf, dmalen);
>>>> -            set_pdma(s, PDMA, 0, dmalen);
>>>> +            set_pdma(s, CMD, 0, dmalen);
>>>>                esp_raise_drq(s);
>>>>                return 0;
>>>>            }
>>>> @@ -316,24 +309,24 @@ static void satn_pdma_cb(ESPState *s)
>>>>        if (get_cmd_cb(s) < 0) {
>>>>            return;
>>>>        }
>>>> -    if (s->pdma_cur != s->pdma_start) {
>>>> -        do_cmd(s, get_pdma_buf(s) + s->pdma_start);
>>>> +    s->do_cmd = 0;
>>>> +    if (s->cmdlen) {
>>>> +        do_cmd(s, s->cmdbuf);
>>>
>>> I don't understant how you can remove the pdma_start: normally it is here to keep track of the
>>> position in the pDMA if the migration is occuraing while a pDMA transfer.
>>
>> Hi Laurent,
>>
>> I was going to follow up on your reviews later this evening, however this one caught my eye: as per
>> the cover letter, this patchset is a migration break for the q800 machine. As there are likely more
>> incompatible changes for the q800 machine coming up soon, it didn't seem worth the effort (and
>> indeed I don't think it's possible to recreate the new internal state with 100% accuracy from the
>> old state).
>>
>> Migration for ESP devices that don't use PDMA is still supported, and I've tested this during
>> development with qemu-system-sparc.
>>
> 
> I don't mean we can't migrate from a previous version to the new one, I mean the migration between
> two machines of the current version is not possible anymore as we don't keep track of the position
> of the pDMA index inside the buffer.
> 
> With a DMA, the migration cannot happen in the middle of the DMA, while with pDMA it can (as it's a
> processor loop).
> 
> The whole purpose of get_pdma() and set_pdma() was for the migration.
> 
> https://patchew.org/QEMU/20190910113323.17324-1-laurent@vivier.eu/diff/20190910193347.16000-1-laurent@vivier.eu/
> 
> Previously the Q800 was not migratable also because the CPU was not migratable, but I added recently
> the VMSTATE for the CPU.

What should happen here is that the PDMA bytes for the message out and command phases 
are accumulated in cmdbuf and cmdlen as per normal ESP DMA - these are already 
included in the migration stream so there should be no problem there.

The PDMA callbacks are invoked when pdma_len == 0 where pdma_len is initially set to 
len in esp_do_dma: this is effectively the TC which is set to the length of the CDB 
for a DMA transfer. This means that the PDMA callback and hence do_cmd() are only 
called at the end of the transfer once the entire CDB has been accumulated where 
pdma_start is 0 (cmdbuf always includes the preceding IDENTIFY byte).


ATB,

Mark.


  reply	other threads:[~2021-03-02 19:36 UTC|newest]

Thread overview: 135+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-09 19:29 [PATCH v2 00/42] esp: consolidate PDMA transfer buffers and other fixes Mark Cave-Ayland
2021-02-09 19:29 ` [PATCH v2 01/42] esp: checkpatch fixes Mark Cave-Ayland
2021-03-01 19:43   ` Laurent Vivier
2021-03-03  8:33     ` Mark Cave-Ayland
2021-02-09 19:29 ` [PATCH v2 02/42] esp: rename existing ESP QOM type to SYSBUS_ESP Mark Cave-Ayland
2021-02-10 22:29   ` Philippe Mathieu-Daudé
2021-03-01 19:52   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 03/42] esp: QOMify the internal ESP device state Mark Cave-Ayland
2021-02-12 18:51   ` Philippe Mathieu-Daudé
2021-02-15 22:29     ` Mark Cave-Ayland
2021-03-01 20:11       ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 04/42] esp: add vmstate_esp version to embedded ESPState Mark Cave-Ayland
2021-02-16  7:35   ` Philippe Mathieu-Daudé
2021-03-01 20:21   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 05/42] esp: add trace event when receiving a TI command Mark Cave-Ayland
2021-03-01 20:24   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 06/42] esp: fix esp_reg_read() trace event Mark Cave-Ayland
2021-03-01 20:29   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 07/42] esp: add PDMA trace events Mark Cave-Ayland
2021-03-01 20:32   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 08/42] esp: determine transfer direction directly from SCSI phase Mark Cave-Ayland
2021-02-16  7:36   ` Philippe Mathieu-Daudé
2021-03-01 21:18   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 09/42] esp: introduce esp_get_tc() and esp_set_tc() Mark Cave-Ayland
2021-03-01 21:24   ` Laurent Vivier
2021-03-03  8:35     ` Mark Cave-Ayland
2021-02-09 19:29 ` [PATCH v2 10/42] esp: introduce esp_get_stc() Mark Cave-Ayland
2021-02-10 22:33   ` Philippe Mathieu-Daudé
2021-02-11  7:53     ` Mark Cave-Ayland
2021-02-11 10:07       ` Philippe Mathieu-Daudé
2021-02-15 22:27         ` Mark Cave-Ayland
2021-03-01 21:28   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 11/42] esp: apply transfer length adjustment when STC is zero at TC load time Mark Cave-Ayland
2021-02-16  7:33   ` Philippe Mathieu-Daudé
2021-02-16 21:52     ` Mark Cave-Ayland
2021-03-01 21:35   ` Laurent Vivier
2021-03-03  8:44     ` Mark Cave-Ayland
2021-02-09 19:29 ` [PATCH v2 12/42] esp: remove dma_counter from ESPState Mark Cave-Ayland
2021-02-10 22:37   ` Philippe Mathieu-Daudé
2021-03-01 21:44   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 13/42] esp: remove dma_left " Mark Cave-Ayland
2021-02-23 21:22   ` Philippe Mathieu-Daudé
2021-03-01 21:50   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 14/42] esp: remove minlen restriction in handle_ti Mark Cave-Ayland
2021-02-23 18:24   ` Philippe Mathieu-Daudé
2021-03-01 22:04   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 15/42] esp: introduce esp_pdma_read() and esp_pdma_write() functions Mark Cave-Ayland
2021-02-10 22:51   ` Philippe Mathieu-Daudé
2021-02-11  8:01     ` Mark Cave-Ayland
2021-02-11 10:09       ` Philippe Mathieu-Daudé
2021-03-01 22:06   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 16/42] esp: use pdma_origin directly in esp_pdma_read()/esp_pdma_write() Mark Cave-Ayland
2021-02-23 18:25   ` Philippe Mathieu-Daudé
2021-03-01 22:07   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 17/42] esp: move pdma_len and TC logic into esp_pdma_read()/esp_pdma_write() Mark Cave-Ayland
2021-02-23 21:23   ` Philippe Mathieu-Daudé
2021-03-01 22:09   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 18/42] esp: accumulate SCSI commands for PDMA transfers in cmdbuf instead of pdma_buf Mark Cave-Ayland
2021-02-23 21:25   ` Philippe Mathieu-Daudé
2021-03-02 17:02   ` Laurent Vivier
2021-03-02 17:34     ` Mark Cave-Ayland
2021-03-02 17:59       ` Laurent Vivier
2021-03-02 19:29         ` Mark Cave-Ayland [this message]
2021-03-02 21:21           ` Laurent Vivier
2021-03-02 21:22   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 19/42] esp: remove buf parameter from do_cmd() Mark Cave-Ayland
2021-02-23 18:27   ` Philippe Mathieu-Daudé
2021-03-02 17:03   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 20/42] esp: remove the buf and buflen parameters from get_cmd() Mark Cave-Ayland
2021-02-16  7:31   ` Philippe Mathieu-Daudé
2021-03-02 17:03   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 21/42] esp: remove redundant pdma_start from ESPState Mark Cave-Ayland
2021-03-02 21:22   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 22/42] esp: move PDMA length adjustments into esp_pdma_read()/esp_pdma_write() Mark Cave-Ayland
2021-03-02 21:44   ` Laurent Vivier
2021-02-09 19:29 ` [PATCH v2 23/42] esp: use ti_wptr/ti_rptr to manage the current FIFO position for PDMA Mark Cave-Ayland
2021-02-23 21:29   ` Philippe Mathieu-Daudé
2021-03-02 21:47   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 24/42] esp: use in-built TC to determine PDMA transfer length Mark Cave-Ayland
2021-02-23 18:32   ` Philippe Mathieu-Daudé
2021-03-02 21:48   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 25/42] esp: remove CMD pdma_origin Mark Cave-Ayland
2021-02-23 18:34   ` Philippe Mathieu-Daudé
2021-03-02 21:49   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 26/42] esp: rename get_cmd_cb() to esp_select() Mark Cave-Ayland
2021-03-02 21:51   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 27/42] esp: fix PDMA target selection Mark Cave-Ayland
2021-03-02 21:57   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 28/42] esp: use FIFO for PDMA transfers between initiator and device Mark Cave-Ayland
2021-03-02 22:02   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 29/42] esp: remove pdma_origin from ESPState Mark Cave-Ayland
2021-03-02 22:03   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 30/42] esp: add 4 byte PDMA read and write transfers Mark Cave-Ayland
2021-02-12 18:56   ` Philippe Mathieu-Daudé
2021-02-15 22:35     ` Mark Cave-Ayland
2021-02-16  7:30       ` Philippe Mathieu-Daudé
2021-02-16 21:36         ` Mark Cave-Ayland
2021-02-23  8:24         ` Mark Cave-Ayland
2021-02-23 18:55           ` Philippe Mathieu-Daudé
2021-03-02 22:05   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 31/42] esp: implement FIFO flush command Mark Cave-Ayland
2021-03-03 19:32   ` Laurent Vivier
2021-03-04 18:26     ` Mark Cave-Ayland
2021-02-09 19:30 ` [PATCH v2 32/42] esp: latch individual bits in ESP_RINTR register Mark Cave-Ayland
2021-03-03 19:48   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 33/42] esp: defer command completion interrupt on incoming data transfers Mark Cave-Ayland
2021-02-18 17:25   ` Mark Cave-Ayland
2021-03-03 19:52     ` Laurent Vivier
2021-03-04 18:33       ` Mark Cave-Ayland
2021-02-09 19:30 ` [PATCH v2 34/42] esp: remove old deferred command completion mechanism Mark Cave-Ayland
2021-03-03 19:55   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 35/42] esp: raise interrupt after every non-DMA byte transferred to the FIFO Mark Cave-Ayland
2021-03-03 19:59   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 36/42] esp: add maxlen parameter to get_cmd() Mark Cave-Ayland
2021-02-23 18:43   ` Philippe Mathieu-Daudé
2021-03-03 20:04   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 37/42] esp: transition to message out phase after SATN and stop command Mark Cave-Ayland
2021-03-03 20:06   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 38/42] esp: convert ti_buf from array to Fifo8 Mark Cave-Ayland
2021-02-23 18:49   ` Philippe Mathieu-Daudé
2021-02-25  9:15     ` Mark Cave-Ayland
2021-03-03 20:11   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 39/42] esp: convert cmdbuf " Mark Cave-Ayland
2021-03-03 20:16   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 40/42] esp: add trivial implementation of the ESP_RFLAGS register Mark Cave-Ayland
2021-02-23 18:51   ` Philippe Mathieu-Daudé
2021-03-03 20:19   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 41/42] esp: implement non-DMA transfers in PDMA mode Mark Cave-Ayland
2021-03-03 20:22   ` Laurent Vivier
2021-02-09 19:30 ` [PATCH v2 42/42] esp: add support for unaligned accesses Mark Cave-Ayland
2021-03-03 20:22   ` Laurent Vivier
2021-02-23 21:32 ` [PATCH v2 00/42] esp: consolidate PDMA transfer buffers and other fixes Philippe Mathieu-Daudé
2021-02-25  9:54   ` Mark Cave-Ayland
2021-02-25 10:50     ` Philippe Mathieu-Daudé
2021-02-25 19:17       ` Mark Cave-Ayland

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=15ceb143-d902-b415-3f5d-48999840a560@ilande.co.uk \
    --to=mark.cave-ayland@ilande.co.uk \
    --cc=fam@euphon.net \
    --cc=laurent@vivier.eu \
    --cc=pbonzini@redhat.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.