Message ID | 20210209193018.31339-10-mark.cave-ayland@ilande.co.uk |
---|---|
State | New |
Headers | show |
Series | esp: consolidate PDMA transfer buffers and other fixes | expand |
Le 09/02/2021 à 20:29, Mark Cave-Ayland a écrit : > This simplifies reading and writing the TC register value without having to > manually shift each individual 8-bit value. > > Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> > Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > --- > hw/scsi/esp.c | 38 +++++++++++++++++++++++--------------- > 1 file changed, 23 insertions(+), 15 deletions(-) > > diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c > index e82e75d490..3a39450930 100644 > --- a/hw/scsi/esp.c > +++ b/hw/scsi/esp.c > @@ -98,6 +98,24 @@ void esp_request_cancelled(SCSIRequest *req) > } > } > > +static uint32_t esp_get_tc(ESPState *s) > +{ > + uint32_t dmalen; > + > + dmalen = s->rregs[ESP_TCLO]; > + dmalen |= s->rregs[ESP_TCMID] << 8; > + dmalen |= s->rregs[ESP_TCHI] << 16; > + > + return dmalen; > +} > + > +static void esp_set_tc(ESPState *s, uint32_t dmalen) > +{ > + s->rregs[ESP_TCLO] = dmalen & 0xff; The "& 0xff" is not needed as rregs is uint8_t. > + s->rregs[ESP_TCMID] = dmalen >> 8; > + s->rregs[ESP_TCHI] = dmalen >> 16; > +} > + > static void set_pdma(ESPState *s, enum pdma_origin_id origin, > uint32_t index, uint32_t len) > { > @@ -157,9 +175,7 @@ static uint32_t get_cmd(ESPState *s, uint8_t *buf, uint8_t buflen) > > target = s->wregs[ESP_WBUSID] & BUSID_DID; > if (s->dma) { > - dmalen = s->rregs[ESP_TCLO]; > - dmalen |= s->rregs[ESP_TCMID] << 8; > - dmalen |= s->rregs[ESP_TCHI] << 16; > + dmalen = esp_get_tc(s); > if (dmalen > buflen) { > return 0; > } > @@ -348,9 +364,7 @@ static void esp_dma_done(ESPState *s) > s->rregs[ESP_RINTR] = INTR_BS; > s->rregs[ESP_RSEQ] = 0; > s->rregs[ESP_RFLAGS] = 0; > - s->rregs[ESP_TCLO] = 0; > - s->rregs[ESP_TCMID] = 0; > - s->rregs[ESP_TCHI] = 0; > + esp_set_tc(s, 0); > esp_raise_irq(s); > } > > @@ -536,9 +550,7 @@ static void handle_ti(ESPState *s) > return; > } > > - dmalen = s->rregs[ESP_TCLO]; > - dmalen |= s->rregs[ESP_TCMID] << 8; > - dmalen |= s->rregs[ESP_TCHI] << 16; > + dmalen = esp_get_tc(s); > if (dmalen == 0) { > dmalen = 0x10000; > } > @@ -889,9 +901,7 @@ static void sysbus_esp_pdma_write(void *opaque, hwaddr addr, > > trace_esp_pdma_write(size); > > - dmalen = s->rregs[ESP_TCLO]; > - dmalen |= s->rregs[ESP_TCMID] << 8; > - dmalen |= s->rregs[ESP_TCHI] << 16; > + dmalen = esp_get_tc(s); > if (dmalen == 0 || s->pdma_len == 0) { > return; > } > @@ -908,9 +918,7 @@ static void sysbus_esp_pdma_write(void *opaque, hwaddr addr, > dmalen -= 2; > break; > } > - s->rregs[ESP_TCLO] = dmalen & 0xff; > - s->rregs[ESP_TCMID] = dmalen >> 8; > - s->rregs[ESP_TCHI] = dmalen >> 16; > + esp_set_tc(s, dmalen); > if (s->pdma_len == 0 && s->pdma_cb) { > esp_lower_drq(s); > s->pdma_cb(s); > Reviewed-by: Laurent Vivier <laurent@vivier.eu>
On 01/03/2021 21:24, Laurent Vivier wrote: > Le 09/02/2021 à 20:29, Mark Cave-Ayland a écrit : >> This simplifies reading and writing the TC register value without having to >> manually shift each individual 8-bit value. >> >> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> >> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> >> --- >> hw/scsi/esp.c | 38 +++++++++++++++++++++++--------------- >> 1 file changed, 23 insertions(+), 15 deletions(-) >> >> diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c >> index e82e75d490..3a39450930 100644 >> --- a/hw/scsi/esp.c >> +++ b/hw/scsi/esp.c >> @@ -98,6 +98,24 @@ void esp_request_cancelled(SCSIRequest *req) >> } >> } >> >> +static uint32_t esp_get_tc(ESPState *s) >> +{ >> + uint32_t dmalen; >> + >> + dmalen = s->rregs[ESP_TCLO]; >> + dmalen |= s->rregs[ESP_TCMID] << 8; >> + dmalen |= s->rregs[ESP_TCHI] << 16; >> + >> + return dmalen; >> +} >> + >> +static void esp_set_tc(ESPState *s, uint32_t dmalen) >> +{ >> + s->rregs[ESP_TCLO] = dmalen & 0xff; > > The "& 0xff" is not needed as rregs is uint8_t. That's true - I think it's just done that way since that was how it was originally written in the section below where I copied it from. I'll remove it in the next version. >> + s->rregs[ESP_TCMID] = dmalen >> 8; >> + s->rregs[ESP_TCHI] = dmalen >> 16; >> +} >> + >> static void set_pdma(ESPState *s, enum pdma_origin_id origin, >> uint32_t index, uint32_t len) >> { >> @@ -157,9 +175,7 @@ static uint32_t get_cmd(ESPState *s, uint8_t *buf, uint8_t buflen) >> >> target = s->wregs[ESP_WBUSID] & BUSID_DID; >> if (s->dma) { >> - dmalen = s->rregs[ESP_TCLO]; >> - dmalen |= s->rregs[ESP_TCMID] << 8; >> - dmalen |= s->rregs[ESP_TCHI] << 16; >> + dmalen = esp_get_tc(s); >> if (dmalen > buflen) { >> return 0; >> } >> @@ -348,9 +364,7 @@ static void esp_dma_done(ESPState *s) >> s->rregs[ESP_RINTR] = INTR_BS; >> s->rregs[ESP_RSEQ] = 0; >> s->rregs[ESP_RFLAGS] = 0; >> - s->rregs[ESP_TCLO] = 0; >> - s->rregs[ESP_TCMID] = 0; >> - s->rregs[ESP_TCHI] = 0; >> + esp_set_tc(s, 0); >> esp_raise_irq(s); >> } >> >> @@ -536,9 +550,7 @@ static void handle_ti(ESPState *s) >> return; >> } >> >> - dmalen = s->rregs[ESP_TCLO]; >> - dmalen |= s->rregs[ESP_TCMID] << 8; >> - dmalen |= s->rregs[ESP_TCHI] << 16; >> + dmalen = esp_get_tc(s); >> if (dmalen == 0) { >> dmalen = 0x10000; >> } >> @@ -889,9 +901,7 @@ static void sysbus_esp_pdma_write(void *opaque, hwaddr addr, >> >> trace_esp_pdma_write(size); >> >> - dmalen = s->rregs[ESP_TCLO]; >> - dmalen |= s->rregs[ESP_TCMID] << 8; >> - dmalen |= s->rregs[ESP_TCHI] << 16; >> + dmalen = esp_get_tc(s); >> if (dmalen == 0 || s->pdma_len == 0) { >> return; >> } >> @@ -908,9 +918,7 @@ static void sysbus_esp_pdma_write(void *opaque, hwaddr addr, >> dmalen -= 2; >> break; >> } >> - s->rregs[ESP_TCLO] = dmalen & 0xff; >> - s->rregs[ESP_TCMID] = dmalen >> 8; >> - s->rregs[ESP_TCHI] = dmalen >> 16; >> + esp_set_tc(s, dmalen); >> if (s->pdma_len == 0 && s->pdma_cb) { >> esp_lower_drq(s); >> s->pdma_cb(s); >> > > Reviewed-by: Laurent Vivier <laurent@vivier.eu> ATB, Mark.
diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c index e82e75d490..3a39450930 100644 --- a/hw/scsi/esp.c +++ b/hw/scsi/esp.c @@ -98,6 +98,24 @@ void esp_request_cancelled(SCSIRequest *req) } } +static uint32_t esp_get_tc(ESPState *s) +{ + uint32_t dmalen; + + dmalen = s->rregs[ESP_TCLO]; + dmalen |= s->rregs[ESP_TCMID] << 8; + dmalen |= s->rregs[ESP_TCHI] << 16; + + return dmalen; +} + +static void esp_set_tc(ESPState *s, uint32_t dmalen) +{ + s->rregs[ESP_TCLO] = dmalen & 0xff; + s->rregs[ESP_TCMID] = dmalen >> 8; + s->rregs[ESP_TCHI] = dmalen >> 16; +} + static void set_pdma(ESPState *s, enum pdma_origin_id origin, uint32_t index, uint32_t len) { @@ -157,9 +175,7 @@ static uint32_t get_cmd(ESPState *s, uint8_t *buf, uint8_t buflen) target = s->wregs[ESP_WBUSID] & BUSID_DID; if (s->dma) { - dmalen = s->rregs[ESP_TCLO]; - dmalen |= s->rregs[ESP_TCMID] << 8; - dmalen |= s->rregs[ESP_TCHI] << 16; + dmalen = esp_get_tc(s); if (dmalen > buflen) { return 0; } @@ -348,9 +364,7 @@ static void esp_dma_done(ESPState *s) s->rregs[ESP_RINTR] = INTR_BS; s->rregs[ESP_RSEQ] = 0; s->rregs[ESP_RFLAGS] = 0; - s->rregs[ESP_TCLO] = 0; - s->rregs[ESP_TCMID] = 0; - s->rregs[ESP_TCHI] = 0; + esp_set_tc(s, 0); esp_raise_irq(s); } @@ -536,9 +550,7 @@ static void handle_ti(ESPState *s) return; } - dmalen = s->rregs[ESP_TCLO]; - dmalen |= s->rregs[ESP_TCMID] << 8; - dmalen |= s->rregs[ESP_TCHI] << 16; + dmalen = esp_get_tc(s); if (dmalen == 0) { dmalen = 0x10000; } @@ -889,9 +901,7 @@ static void sysbus_esp_pdma_write(void *opaque, hwaddr addr, trace_esp_pdma_write(size); - dmalen = s->rregs[ESP_TCLO]; - dmalen |= s->rregs[ESP_TCMID] << 8; - dmalen |= s->rregs[ESP_TCHI] << 16; + dmalen = esp_get_tc(s); if (dmalen == 0 || s->pdma_len == 0) { return; } @@ -908,9 +918,7 @@ static void sysbus_esp_pdma_write(void *opaque, hwaddr addr, dmalen -= 2; break; } - s->rregs[ESP_TCLO] = dmalen & 0xff; - s->rregs[ESP_TCMID] = dmalen >> 8; - s->rregs[ESP_TCHI] = dmalen >> 16; + esp_set_tc(s, dmalen); if (s->pdma_len == 0 && s->pdma_cb) { esp_lower_drq(s); s->pdma_cb(s);