qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Thomas Huth <huth@tuxfamily.org>
To: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Cc: qemu-devel@nongnu.org
Subject: Re: [PATCH 09/36] next-cube: move SCSI CSRs from next-pc to the next-scsi device
Date: Mon, 28 Oct 2024 17:21:22 +0100	[thread overview]
Message-ID: <20241028172122.23bcb98c@tpx1> (raw)
In-Reply-To: <20241023085852.1061031-10-mark.cave-ayland@ilande.co.uk>

Am Wed, 23 Oct 2024 09:58:25 +0100
schrieb Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>:

> The SCSI CSRs are located within the SCSI subsystem of the NeXT PC (Peripheral
> Contoller) which is now modelled as a separate QEMU device.
> 
> Add a new VMStateDescription for the next-scsi device to enable the SCSI CSRs
> to be migrated.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>  hw/m68k/next-cube.c | 88 +++++++++++++++++++++++++++++++++++++++------
>  1 file changed, 78 insertions(+), 10 deletions(-)
> 
> diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c
> index 266f57ac63..32466a425f 100644
> --- a/hw/m68k/next-cube.c
> +++ b/hw/m68k/next-cube.c
> @@ -93,6 +93,10 @@ struct NeXTSCSI {
>      MemoryRegion scsi_mem;
>  
>      SysBusESPState sysbus_esp;
> +
> +    MemoryRegion scsi_csr_mem;
> +    uint8_t scsi_csr_1;
> +    uint8_t scsi_csr_2;
>  };
>  
>  #define TYPE_NEXT_PC "next-pc"
> @@ -115,8 +119,6 @@ struct NeXTPC {
>      uint32_t led;
>  
>      NeXTSCSI next_scsi;
> -    uint8_t scsi_csr_1;
> -    uint8_t scsi_csr_2;
>  
>      qemu_irq scsi_reset;
>      qemu_irq scsi_dma;
> @@ -364,6 +366,7 @@ static const MemoryRegionOps next_mmio_ops = {
>  static uint64_t next_scr_readfn(void *opaque, hwaddr addr, unsigned size)
>  {
>      NeXTPC *s = NEXT_PC(opaque);
> +    NeXTSCSI *ns = NEXT_SCSI(&s->next_scsi);
>      uint64_t val;
>  
>      switch (addr) {
> @@ -373,12 +376,12 @@ static uint64_t next_scr_readfn(void *opaque, hwaddr addr, unsigned size)
>          break;
>  
>      case 0x14020:
> -        DPRINTF("SCSI 4020  STATUS READ %X\n", s->scsi_csr_1);
> -        val = s->scsi_csr_1;
> +        DPRINTF("SCSI 4020  STATUS READ %X\n", ns->scsi_csr_1);
> +        val = ns->scsi_csr_1;
>          break;
>  
>      case 0x14021:
> -        DPRINTF("SCSI 4021 STATUS READ %X\n", s->scsi_csr_2);
> +        DPRINTF("SCSI 4021 STATUS READ %X\n", ns->scsi_csr_2);
>          val = 0x40;
>          break;
>  
> @@ -411,6 +414,7 @@ static void next_scr_writefn(void *opaque, hwaddr addr, uint64_t val,
>                               unsigned size)
>  {
>      NeXTPC *s = NEXT_PC(opaque);
> +    NeXTSCSI *ns = NEXT_SCSI(&s->next_scsi);
>  
>      switch (addr) {
>      case 0x14108:
> @@ -445,7 +449,7 @@ static void next_scr_writefn(void *opaque, hwaddr addr, uint64_t val,
>              DPRINTF("SCSICSR Reset\n");
>              /* I think this should set DMADIR. CPUDMA and INTMASK to 0 */
>              qemu_irq_raise(s->scsi_reset);
> -            s->scsi_csr_1 &= ~(SCSICSR_INTMASK | 0x80 | 0x1);
> +            ns->scsi_csr_1 &= ~(SCSICSR_INTMASK | 0x80 | 0x1);
>              qemu_irq_lower(s->scsi_reset);
>          }
>          if (val & SCSICSR_DMADIR) {
> @@ -838,6 +842,54 @@ static void nextscsi_write(void *opaque, uint8_t *buf, int size)
>      nextdma_write(opaque, buf, size, NEXTDMA_SCSI);
>  }
>  
> +static void next_scsi_csr_write(void *opaque, hwaddr addr, uint64_t val,
> +                                unsigned size)
> +{
> +    NeXTSCSI *s = NEXT_SCSI(opaque);
> +
> +    switch (addr) {
> +    case 0:
> +        s->scsi_csr_1 = val;
> +        break;
> +
> +    case 1:
> +        s->scsi_csr_2 = val;
> +        break;

The old code never set the scsi_csr_x directly like this, so I'm not sure
whether this is right?

Also, maybe best squash this patch together with the next patch, otherwise
this is temporary change in behaviour, isn't it?

 Thomas


> +    default:
> +        g_assert_not_reached();
> +    }
> +}
> +
> +static uint64_t next_scsi_csr_read(void *opaque, hwaddr addr, unsigned size)
> +{
> +    NeXTSCSI *s = NEXT_SCSI(opaque);
> +    uint64_t val;
> +
> +    switch (addr) {
> +    case 0:
> +        val = s->scsi_csr_1;
> +        break;
> +
> +    case 1:
> +        val = s->scsi_csr_2;
> +        break;
> +
> +    default:
> +        g_assert_not_reached();
> +    }
> +
> +    return val;
> +}
> +
> +static const MemoryRegionOps next_scsi_csr_ops = {
> +    .read = next_scsi_csr_read,
> +    .write = next_scsi_csr_write,
> +    .valid.min_access_size = 1,
> +    .valid.max_access_size = 1,
> +    .endianness = DEVICE_BIG_ENDIAN,
> +};
> +
>  static void next_scsi_init(Object *obj)
>  {
>      NeXTSCSI *s = NEXT_SCSI(obj);
> @@ -845,6 +897,9 @@ static void next_scsi_init(Object *obj)
>  
>      object_initialize_child(obj, "esp", &s->sysbus_esp, TYPE_SYSBUS_ESP);
>  
> +    memory_region_init_io(&s->scsi_csr_mem, obj, &next_scsi_csr_ops,
> +                          s, "csrs", 2);
> +
>      memory_region_init(&s->scsi_mem, obj, "next.scsi", 0x40);
>      sysbus_init_mmio(sbd, &s->scsi_mem);
>  }
> @@ -874,15 +929,30 @@ static void next_scsi_realize(DeviceState *dev, Error **errp)
>      memory_region_add_subregion(&s->scsi_mem, 0x0,
>                                  sysbus_mmio_get_region(sbd, 0));
>  
> +    /* SCSI CSRs */
> +    memory_region_add_subregion(&s->scsi_mem, 0x20, &s->scsi_csr_mem);
> +
>      scsi_bus_legacy_handle_cmdline(&s->sysbus_esp.esp.bus);
>  }
>  
> +static const VMStateDescription next_scsi_vmstate = {
> +    .name = "next-scsi",
> +    .version_id = 0,
> +    .minimum_version_id = 0,
> +    .fields = (const VMStateField[]) {
> +        VMSTATE_UINT8(scsi_csr_1, NeXTSCSI),
> +        VMSTATE_UINT8(scsi_csr_2, NeXTSCSI),
> +        VMSTATE_END_OF_LIST()
> +    },
> +};
> +
>  static void next_scsi_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
>  
>      dc->desc = "NeXT SCSI Controller";
>      dc->realize = next_scsi_realize;
> +    dc->vmsd = &next_scsi_vmstate;
>  }
>  
>  static const TypeInfo next_scsi_info = {
> @@ -1000,8 +1070,8 @@ static const VMStateDescription next_rtc_vmstate = {
>  
>  static const VMStateDescription next_pc_vmstate = {
>      .name = "next-pc",
> -    .version_id = 2,
> -    .minimum_version_id = 2,
> +    .version_id = 3,
> +    .minimum_version_id = 3,
>      .fields = (const VMStateField[]) {
>          VMSTATE_UINT32(scr1, NeXTPC),
>          VMSTATE_UINT32(scr2, NeXTPC),
> @@ -1009,8 +1079,6 @@ static const VMStateDescription next_pc_vmstate = {
>          VMSTATE_UINT32(int_mask, NeXTPC),
>          VMSTATE_UINT32(int_status, NeXTPC),
>          VMSTATE_UINT32(led, NeXTPC),
> -        VMSTATE_UINT8(scsi_csr_1, NeXTPC),
> -        VMSTATE_UINT8(scsi_csr_2, NeXTPC),
>          VMSTATE_STRUCT(rtc, NeXTPC, 0, next_rtc_vmstate, NextRtc),
>          VMSTATE_END_OF_LIST()
>      },


  reply	other threads:[~2024-10-28 16:21 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-23  8:58 [PATCH 00/36] next-cube: more tidy-ups and improvements Mark Cave-Ayland
2024-10-23  8:58 ` [PATCH 01/36] next-cube: fix up compilation when DEBUG_NEXT is enabled Mark Cave-Ayland
2024-10-26  6:30   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 02/36] next-cube: remove 0x14020 dummy value from next_mmio_read() Mark Cave-Ayland
2024-10-26  7:44   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 03/36] next-cube: remove overlap between next.dma and next.mmio memory regions Mark Cave-Ayland
2024-10-24  2:42   ` Philippe Mathieu-Daudé
2024-10-24  8:31     ` Mark Cave-Ayland
2024-10-26  7:56   ` Thomas Huth
2024-10-26 21:13     ` Mark Cave-Ayland
2024-10-27 11:24       ` Thomas Huth
2024-10-28 22:06         ` Mark Cave-Ayland
2024-10-23  8:58 ` [PATCH 04/36] next-cube: remove cpu parameter from next_scsi_init() Mark Cave-Ayland
2024-10-26  7:59   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 05/36] next-cube: create new next.scsi container memory region Mark Cave-Ayland
2024-10-23  8:58 ` [PATCH 06/36] next-cube: move next_scsi_init() to next_pc_realize() Mark Cave-Ayland
2024-10-27 10:07   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 07/36] next-cube: introduce next_pc_init() object init function Mark Cave-Ayland
2024-10-27 10:25   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 08/36] next-cube: introduce next-scsi device Mark Cave-Ayland
2024-10-27 11:58   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 09/36] next-cube: move SCSI CSRs from next-pc to the " Mark Cave-Ayland
2024-10-28 16:21   ` Thomas Huth [this message]
2024-10-28 22:21     ` Mark Cave-Ayland
2024-11-01 16:37       ` Thomas Huth
2024-10-23  8:58 ` [PATCH 10/36] next-cube: move SCSI 4020 logic from next-pc device to " Mark Cave-Ayland
2024-10-28 16:22   ` Thomas Huth
2024-10-28 22:23     ` Mark Cave-Ayland
2024-10-23  8:58 ` [PATCH 11/36] next-cube: move floppy disk MMIO to separate memory region in next-pc Mark Cave-Ayland
2024-10-28 16:31   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 12/36] next-cube: map ESCC registers as a subregion of the next.scr memory region Mark Cave-Ayland
2024-10-28 16:36   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 13/36] next-cube: move ESCC to be QOM child of next-pc device Mark Cave-Ayland
2024-10-28 16:39   ` Thomas Huth
2024-10-28 22:28     ` Mark Cave-Ayland
2024-11-01 16:34       ` Thomas Huth
2024-10-23  8:58 ` [PATCH 14/36] next-cube: move timer MMIO to separate memory region on " Mark Cave-Ayland
2024-11-01 16:46   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 15/36] next-cube: move en ethernet " Mark Cave-Ayland
2024-11-02  7:26   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 16/36] next-cube: add empty slots for unknown accesses to next.scr memory region Mark Cave-Ayland
2024-10-23  8:58 ` [PATCH 17/36] next-cube: remove unused " Mark Cave-Ayland
2024-11-02  9:40   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 18/36] next-cube: rearrange NeXTState declarations to improve readability Mark Cave-Ayland
2024-11-02  9:41   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 19/36] next-cube: convert next-pc device to use Resettable interface Mark Cave-Ayland
2024-11-02  9:48   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 20/36] next-cube: rename typedef struct NextRtc to NeXTRTC Mark Cave-Ayland
2024-11-02  9:49   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 21/36] next-cube: use qemu_irq to drive int_status in next_scr2_rtc_update() Mark Cave-Ayland
2024-11-03 18:31   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 22/36] next-cube: separate rtc read and write shift logic Mark Cave-Ayland
2024-11-03 18:52   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 23/36] next-cube: always use retval to return rtc read values Mark Cave-Ayland
2024-10-23  8:58 ` [PATCH 24/36] next-cube: use named gpio to set RTC data bit in scr2 Mark Cave-Ayland
2024-11-09  7:51   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 25/36] next-cube: use named gpio to read " Mark Cave-Ayland
2024-11-09  7:55   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 26/36] next-cube: don't use rtc phase value of -1 Mark Cave-Ayland
2024-10-23 10:37   ` BALATON Zoltan
2024-10-24  8:28     ` Mark Cave-Ayland
2024-11-09  7:57   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 27/36] next-cube: QOMify NeXTRTC Mark Cave-Ayland
2024-10-24  2:44   ` Philippe Mathieu-Daudé
2024-10-24  8:41     ` Mark Cave-Ayland
2024-11-09  8:14   ` Thomas Huth
2024-11-11 21:30     ` Mark Cave-Ayland
2024-10-23  8:58 ` [PATCH 28/36] next-cube: move reset of next-rtc fields from next-pc to next-rtc Mark Cave-Ayland
2024-11-09  8:19   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 29/36] next-cube: move rtc-data-in gpio from next-pc to next-rtc device Mark Cave-Ayland
2024-11-09  8:21   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 30/36] next-cube: use named gpio output for next-rtc data Mark Cave-Ayland
2024-10-23  8:58 ` [PATCH 31/36] next-cube: add rtc-cmd-reset named gpio to reset the rtc state machine Mark Cave-Ayland
2024-11-09  8:24   ` Thomas Huth
2024-11-11 21:37     ` Mark Cave-Ayland
2024-10-23  8:58 ` [PATCH 32/36] next-cube: add rtc-power-out " Mark Cave-Ayland
2024-10-24  8:45   ` Mark Cave-Ayland
2024-10-23  8:58 ` [PATCH 33/36] next-cube: move next_rtc_cmd_is_write() and next_rtc_data_in_irq() functions Mark Cave-Ayland
2024-11-09  8:25   ` Thomas Huth
2024-11-11 21:39     ` Mark Cave-Ayland
2024-10-23  8:58 ` [PATCH 34/36] next-cube: rename old_scr2 and scr2_2 in next_scr2_rtc_update() Mark Cave-Ayland
2024-11-09  8:25   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 35/36] next-cube: add my copyright to the top of the file Mark Cave-Ayland
2024-11-09  8:26   ` Thomas Huth
2024-10-23  8:58 ` [PATCH 36/36] next-cube: replace boiler-plate GPL 2.0 or later license text with SPDX identifier Mark Cave-Ayland
2024-10-23  9:30   ` Daniel P. Berrangé
2024-10-23  9:42     ` Mark Cave-Ayland
2024-10-29 11:22 ` [PATCH 00/36] next-cube: more tidy-ups and improvements Peter Maydell
2024-10-29 12:51   ` 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=20241028172122.23bcb98c@tpx1 \
    --to=huth@tuxfamily.org \
    --cc=mark.cave-ayland@ilande.co.uk \
    --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).