[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 24/42] esp: use in-built TC to determine PDMA transfer len
From: |
Laurent Vivier |
Subject: |
Re: [PATCH v2 24/42] esp: use in-built TC to determine PDMA transfer length |
Date: |
Tue, 2 Mar 2021 22:48:34 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.0 |
Le 09/02/2021 à 20:30, Mark Cave-Ayland a écrit :
> Real hardware simply counts down using the in-built TC to determine when the
> the PDMA request is complete. Use the TC to determine the PDMA transfer length
> which then enables us to remove the redundant pdma_len variable.
>
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
> hw/scsi/esp.c | 28 +++++++++++++---------------
> include/hw/scsi/esp.h | 1 -
> 2 files changed, 13 insertions(+), 16 deletions(-)
>
> diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
> index 50503a6f53..bff330733f 100644
> --- a/hw/scsi/esp.c
> +++ b/hw/scsi/esp.c
> @@ -127,10 +127,9 @@ static uint32_t esp_get_stc(ESPState *s)
> return dmalen;
> }
>
> -static void set_pdma(ESPState *s, enum pdma_origin_id origin, uint32_t len)
> +static void set_pdma(ESPState *s, enum pdma_origin_id origin)
> {
> s->pdma_origin = origin;
> - s->pdma_len = len;
> }
>
> static uint8_t esp_pdma_read(ESPState *s)
> @@ -138,7 +137,7 @@ static uint8_t esp_pdma_read(ESPState *s)
> uint32_t dmalen = esp_get_tc(s);
> uint8_t val;
>
> - if (dmalen == 0 || s->pdma_len == 0) {
> + if (dmalen == 0) {
> return 0;
> }
>
> @@ -161,7 +160,6 @@ static uint8_t esp_pdma_read(ESPState *s)
> }
>
> s->ti_size--;
> - s->pdma_len--;
> dmalen--;
> esp_set_tc(s, dmalen);
>
> @@ -172,7 +170,7 @@ static void esp_pdma_write(ESPState *s, uint8_t val)
> {
> uint32_t dmalen = esp_get_tc(s);
>
> - if (dmalen == 0 || s->pdma_len == 0) {
> + if (dmalen == 0) {
> return;
> }
>
> @@ -195,7 +193,6 @@ static void esp_pdma_write(ESPState *s, uint8_t val)
> }
>
> s->ti_size++;
> - s->pdma_len--;
> dmalen--;
> esp_set_tc(s, dmalen);
> }
> @@ -243,7 +240,7 @@ static uint32_t get_cmd(ESPState *s)
> if (s->dma_memory_read) {
> s->dma_memory_read(s->dma_opaque, buf, dmalen);
> } else {
> - set_pdma(s, CMD, dmalen);
> + set_pdma(s, CMD);
> esp_raise_drq(s);
> return 0;
> }
> @@ -406,7 +403,7 @@ static void write_response(ESPState *s)
> s->rregs[ESP_RINTR] = INTR_BS | INTR_FC;
> s->rregs[ESP_RSEQ] = SEQ_CD;
> } else {
> - set_pdma(s, TI, 2);
> + set_pdma(s, TI);
> s->pdma_cb = write_response_pdma_cb;
> esp_raise_drq(s);
> return;
> @@ -474,7 +471,7 @@ static void esp_do_dma(ESPState *s)
> if (s->dma_memory_read) {
> s->dma_memory_read(s->dma_opaque, &s->cmdbuf[s->cmdlen], len);
> } else {
> - set_pdma(s, CMD, len);
> + set_pdma(s, CMD);
> s->pdma_cb = do_dma_pdma_cb;
> esp_raise_drq(s);
> return;
> @@ -497,7 +494,7 @@ static void esp_do_dma(ESPState *s)
> if (s->dma_memory_read) {
> s->dma_memory_read(s->dma_opaque, s->async_buf, len);
> } else {
> - set_pdma(s, ASYNC, len);
> + set_pdma(s, ASYNC);
> s->pdma_cb = do_dma_pdma_cb;
> esp_raise_drq(s);
> return;
> @@ -506,7 +503,7 @@ static void esp_do_dma(ESPState *s)
> if (s->dma_memory_write) {
> s->dma_memory_write(s->dma_opaque, s->async_buf, len);
> } else {
> - set_pdma(s, ASYNC, len);
> + set_pdma(s, ASYNC);
> s->pdma_cb = do_dma_pdma_cb;
> esp_raise_drq(s);
> return;
> @@ -851,7 +848,6 @@ static const VMStateDescription vmstate_esp_pdma = {
> .needed = esp_pdma_needed,
> .fields = (VMStateField[]) {
> VMSTATE_INT32(pdma_origin, ESPState),
> - VMSTATE_UINT32(pdma_len, ESPState),
> VMSTATE_END_OF_LIST()
> }
> };
> @@ -950,6 +946,7 @@ static void sysbus_esp_pdma_write(void *opaque, hwaddr
> addr,
> {
> SysBusESPState *sysbus = opaque;
> ESPState *s = ESP(&sysbus->esp);
> + uint32_t dmalen;
>
> trace_esp_pdma_write(size);
>
> @@ -962,7 +959,8 @@ static void sysbus_esp_pdma_write(void *opaque, hwaddr
> addr,
> esp_pdma_write(s, val);
> break;
> }
> - if (s->pdma_len == 0 && s->pdma_cb) {
> + dmalen = esp_get_tc(s);
> + if (dmalen == 0 && s->pdma_cb) {
> esp_lower_drq(s);
> s->pdma_cb(s);
> s->pdma_cb = NULL;
> @@ -979,7 +977,7 @@ static uint64_t sysbus_esp_pdma_read(void *opaque, hwaddr
> addr,
>
> trace_esp_pdma_read(size);
>
> - if (dmalen == 0 || s->pdma_len == 0) {
> + if (dmalen == 0) {
> return 0;
> }
> switch (size) {
> @@ -992,7 +990,7 @@ static uint64_t sysbus_esp_pdma_read(void *opaque, hwaddr
> addr,
> break;
> }
> dmalen = esp_get_tc(s);
> - if (dmalen == 0 || (s->pdma_len == 0 && s->pdma_cb)) {
> + if (dmalen == 0 && s->pdma_cb) {
> esp_lower_drq(s);
> s->pdma_cb(s);
> s->pdma_cb = NULL;
> diff --git a/include/hw/scsi/esp.h b/include/hw/scsi/esp.h
> index 5908d59a0a..1e84b7bfb0 100644
> --- a/include/hw/scsi/esp.h
> +++ b/include/hw/scsi/esp.h
> @@ -57,7 +57,6 @@ struct ESPState {
> void *dma_opaque;
> void (*dma_cb)(ESPState *s);
> int pdma_origin;
> - uint32_t pdma_len;
> void (*pdma_cb)(ESPState *s);
>
> uint8_t mig_version_id;
>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [PATCH v2 24/42] esp: use in-built TC to determine PDMA transfer length,
Laurent Vivier <=