[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 09/26] hw/ssi: Check for duplicate CS indexes
From: |
Cédric Le Goater |
Subject: |
[PULL 09/26] hw/ssi: Check for duplicate CS indexes |
Date: |
Fri, 1 Sep 2023 11:41:57 +0200 |
This to avoid indexes conflicts on the same SSI bus. Adapt machines
using multiple devices on the same bus to avoid breakage.
Cc: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
Cc: Alistair Francis <alistair@alistair23.me>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/arm/stellaris.c | 4 +++-
hw/arm/xilinx_zynq.c | 1 +
hw/arm/xlnx-versal-virt.c | 1 +
hw/arm/xlnx-zcu102.c | 2 ++
hw/microblaze/petalogix_ml605_mmu.c | 1 +
hw/ssi/ssi.c | 21 +++++++++++++++++++++
6 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index f7e99baf6236..5a3106e00939 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1242,7 +1242,9 @@ static void stellaris_init(MachineState *ms,
stellaris_board_info *board)
qdev_get_child_bus(sddev, "sd-bus"),
&error_fatal);
- ssddev = ssi_create_peripheral(bus, "ssd0323");
+ ssddev = qdev_new("ssd0323");
+ qdev_prop_set_uint8(ssddev, "cs", 1);
+ qdev_realize_and_unref(ssddev, bus, &error_fatal);
gpio_d_splitter = qdev_new(TYPE_SPLIT_IRQ);
qdev_prop_set_uint32(gpio_d_splitter, "num-lines", 2);
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 3190cc0b8dbc..8dc2ea83a93b 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -164,6 +164,7 @@ static inline int zynq_init_spi_flashes(uint32_t base_addr,
qemu_irq irq,
blk_by_legacy_dinfo(dinfo),
&error_fatal);
}
+ qdev_prop_set_uint8(flash_dev, "cs", j);
qdev_realize_and_unref(flash_dev, BUS(spi), &error_fatal);
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
index 1ee2b8697fe2..88c561ff6328 100644
--- a/hw/arm/xlnx-versal-virt.c
+++ b/hw/arm/xlnx-versal-virt.c
@@ -740,6 +740,7 @@ static void versal_virt_init(MachineState *machine)
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo), &error_fatal);
}
+ qdev_prop_set_uint8(flash_dev, "cs", i);
qdev_realize_and_unref(flash_dev, spi_bus, &error_fatal);
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
index 4c84bb932aa0..21483f75fd93 100644
--- a/hw/arm/xlnx-zcu102.c
+++ b/hw/arm/xlnx-zcu102.c
@@ -201,6 +201,7 @@ static void xlnx_zcu102_init(MachineState *machine)
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo), &error_fatal);
}
+ qdev_prop_set_uint8(flash_dev, "cs", i);
qdev_realize_and_unref(flash_dev, spi_bus, &error_fatal);
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
@@ -224,6 +225,7 @@ static void xlnx_zcu102_init(MachineState *machine)
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo), &error_fatal);
}
+ qdev_prop_set_uint8(flash_dev, "cs", i);
qdev_realize_and_unref(flash_dev, spi_bus, &error_fatal);
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
diff --git a/hw/microblaze/petalogix_ml605_mmu.c
b/hw/microblaze/petalogix_ml605_mmu.c
index babb05303520..ea0fb68cf026 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -192,6 +192,7 @@ petalogix_ml605_init(MachineState *machine)
blk_by_legacy_dinfo(dinfo),
&error_fatal);
}
+ qdev_prop_set_uint8(dev, "cs", i);
qdev_realize_and_unref(dev, BUS(spi), &error_fatal);
cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
index 54ca3c34e9d0..1f3e540ab8a1 100644
--- a/hw/ssi/ssi.c
+++ b/hw/ssi/ssi.c
@@ -42,10 +42,31 @@ DeviceState *ssi_get_cs(SSIBus *bus, uint8_t cs_index)
return NULL;
}
+static bool ssi_bus_check_address(BusState *b, DeviceState *dev, Error **errp)
+{
+ SSIPeripheral *s = SSI_PERIPHERAL(dev);
+
+ if (ssi_get_cs(SSI_BUS(b), s->cs_index)) {
+ error_setg(errp, "CS index '0x%x' in use by a %s device", s->cs_index,
+ object_get_typename(OBJECT(dev)));
+ return false;
+ }
+
+ return true;
+}
+
+static void ssi_bus_class_init(ObjectClass *klass, void *data)
+{
+ BusClass *k = BUS_CLASS(klass);
+
+ k->check_address = ssi_bus_check_address;
+}
+
static const TypeInfo ssi_bus_info = {
.name = TYPE_SSI_BUS,
.parent = TYPE_BUS,
.instance_size = sizeof(SSIBus),
+ .class_init = ssi_bus_class_init,
};
static void ssi_cs_default(void *opaque, int n, int level)
--
2.41.0
- [PULL 00/26] aspeed queue, Cédric Le Goater, 2023/09/01
- [PULL 01/26] aspeed: Introduce helper for 32-bit hosts limitation, Cédric Le Goater, 2023/09/01
- [PULL 02/26] hw/i2c/aspeed: Fix Tx count and Rx size error in buffer pool mode, Cédric Le Goater, 2023/09/01
- [PULL 03/26] hw/i2c/aspeed: Fix TXBUF transmission start position error, Cédric Le Goater, 2023/09/01
- [PULL 05/26] tests/avocado/machine_aspeed.py: Update SDK images, Cédric Le Goater, 2023/09/01
- [PULL 06/26] hw/ssi: Add a "cs" property to SSIPeripheral, Cédric Le Goater, 2023/09/01
- [PULL 04/26] hw/i2c/aspeed: Add support for buffer organization, Cédric Le Goater, 2023/09/01
- [PULL 07/26] hw/ssi: Introduce a ssi_get_cs() helper, Cédric Le Goater, 2023/09/01
- [PULL 09/26] hw/ssi: Check for duplicate CS indexes,
Cédric Le Goater <=
- [PULL 08/26] aspeed/smc: Wire CS lines at reset, Cédric Le Goater, 2023/09/01
- [PULL 11/26] m25p80: Introduce an helper to retrieve the BlockBackend of a device, Cédric Le Goater, 2023/09/01
- [PULL 12/26] aspeed: Get the BlockBackend of FMC0 from the flash device, Cédric Le Goater, 2023/09/01
- [PULL 13/26] hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01, Cédric Le Goater, 2023/09/01
- [PULL 15/26] hw/sd: When card is in wrong state, log which spec version is used, Cédric Le Goater, 2023/09/01
- [PULL 14/26] hw/sd: When card is in wrong state, log which state it is, Cédric Le Goater, 2023/09/01
- [PULL 10/26] aspeed: Create flash devices only when defaults are enabled, Cédric Le Goater, 2023/09/01
- [PULL 17/26] hw/sd: Introduce sd_cmd_handler type, Cédric Le Goater, 2023/09/01
- [PULL 16/26] hw/sd: Move proto_name to SDProto structure, Cédric Le Goater, 2023/09/01
- [PULL 18/26] hw/sd: Add sd_cmd_illegal() handler, Cédric Le Goater, 2023/09/01