[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 3/6] hw:sdhci: Introduce a new "capareg" class member to s
From: |
Bernhard Beschow |
Subject: |
Re: [PATCH v2 3/6] hw:sdhci: Introduce a new "capareg" class member to set the different Capability Registers. |
Date: |
Tue, 03 Dec 2024 20:23:42 +0000 |
Am 3. Dezember 2024 02:14:57 UTC schrieb Jamin Lin via <qemu-devel@nongnu.org>:
>Currently, it set the hardcode value of capability registers to all ASPEED SOCs
>However, the value of capability registers should be different for all ASPEED
>SOCs. For example: the bit 28 of the Capability Register 1 should be 1 for
>64-bits System Bus support for AST2700.
>
>Introduce a new "capareg" class member whose data type is uint_64 to set the
>different Capability Registers to all ASPEED SOCs.
>
>The value of Capability Register is "0x0000000001e80080" for AST2400 and
>AST2500. The value of Capability Register is "0x0000000701f80080" for AST2600.
>
>Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
>---
> hw/arm/aspeed_ast2400.c | 3 +-
> hw/arm/aspeed_ast2600.c | 7 ++--
> hw/sd/aspeed_sdhci.c | 72 +++++++++++++++++++++++++++++++-----
> include/hw/sd/aspeed_sdhci.h | 12 +++++-
> 4 files changed, 78 insertions(+), 16 deletions(-)
>
>diff --git a/hw/arm/aspeed_ast2400.c b/hw/arm/aspeed_ast2400.c
>index ecc81ecc79..3c1b419945 100644
>--- a/hw/arm/aspeed_ast2400.c
>+++ b/hw/arm/aspeed_ast2400.c
>@@ -224,7 +224,8 @@ static void aspeed_ast2400_soc_init(Object *obj)
> snprintf(typename, sizeof(typename), "aspeed.gpio-%s", socname);
> object_initialize_child(obj, "gpio", &s->gpio, typename);
>
>- object_initialize_child(obj, "sdc", &s->sdhci, TYPE_ASPEED_SDHCI);
>+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
>+ object_initialize_child(obj, "sdc", &s->sdhci, typename);
>
> object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
>
>diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
>index c40d3d8443..b5703bd064 100644
>--- a/hw/arm/aspeed_ast2600.c
>+++ b/hw/arm/aspeed_ast2600.c
>@@ -236,8 +236,8 @@ static void aspeed_soc_ast2600_init(Object *obj)
> snprintf(typename, sizeof(typename), "aspeed.gpio-%s-1_8v", socname);
> object_initialize_child(obj, "gpio_1_8v", &s->gpio_1_8v, typename);
>
>- object_initialize_child(obj, "sd-controller", &s->sdhci,
>- TYPE_ASPEED_SDHCI);
>+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
>+ object_initialize_child(obj, "sd-controller", &s->sdhci, typename);
>
> object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
>
>@@ -247,8 +247,7 @@ static void aspeed_soc_ast2600_init(Object *obj)
> &s->sdhci.slots[i], TYPE_SYSBUS_SDHCI);
> }
>
>- object_initialize_child(obj, "emmc-controller", &s->emmc,
>- TYPE_ASPEED_SDHCI);
>+ object_initialize_child(obj, "emmc-controller", &s->emmc, typename);
>
> object_property_set_int(OBJECT(&s->emmc), "num-slots", 1, &error_abort);
>
>diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
>index acd6538261..93f5571021 100644
>--- a/hw/sd/aspeed_sdhci.c
>+++ b/hw/sd/aspeed_sdhci.c
>@@ -148,6 +148,7 @@ static void aspeed_sdhci_realize(DeviceState *dev, Error
>**errp)
> {
> SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
> AspeedSDHCIState *sdhci = ASPEED_SDHCI(dev);
>+ AspeedSDHCIClass *asc = ASPEED_SDHCI_GET_CLASS(sdhci);
>
> /* Create input irqs for the slots */
> qdev_init_gpio_in_named_with_opaque(DEVICE(sbd), aspeed_sdhci_set_irq,
>@@ -167,7 +168,7 @@ static void aspeed_sdhci_realize(DeviceState *dev, Error
>**errp)
> }
>
> if (!object_property_set_uint(sdhci_slot, "capareg",
>- ASPEED_SDHCI_CAPABILITIES, errp)) {
>+ asc->capareg, errp)) {
> return;
> }
>
>@@ -218,13 +219,66 @@ static void aspeed_sdhci_class_init(ObjectClass *classp,
>void *data)
> device_class_set_props(dc, aspeed_sdhci_properties);
> }
>
>-static const TypeInfo aspeed_sdhci_types[] = {
>- {
>- .name = TYPE_ASPEED_SDHCI,
>- .parent = TYPE_SYS_BUS_DEVICE,
>- .instance_size = sizeof(AspeedSDHCIState),
>- .class_init = aspeed_sdhci_class_init,
>- },
Why not just extend this array? It's made for registering multiple types,
exactly what this patch is introducing.
>+static const TypeInfo aspeed_sdhci_info = {
>+ .name = TYPE_ASPEED_SDHCI,
>+ .parent = TYPE_SYS_BUS_DEVICE,
>+ .instance_size = sizeof(AspeedSDHCIState),
>+ .class_init = aspeed_sdhci_class_init,
>+ .class_size = sizeof(AspeedSDHCIClass),
>+ .abstract = true,
>+};
>+
>+static void aspeed_2400_sdhci_class_init(ObjectClass *klass, void *data)
>+{
>+ DeviceClass *dc = DEVICE_CLASS(klass);
>+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
>+
>+ dc->desc = "ASPEED 2400 SDHCI Controller";
>+ asc->capareg = 0x0000000001e80080;
>+}
>+
>+static const TypeInfo aspeed_2400_sdhci_info = {
>+ .name = TYPE_ASPEED_2400_SDHCI,
>+ .parent = TYPE_ASPEED_SDHCI,
>+ .class_init = aspeed_2400_sdhci_class_init,
>+};
>+
>+static void aspeed_2500_sdhci_class_init(ObjectClass *klass, void *data)
>+{
>+ DeviceClass *dc = DEVICE_CLASS(klass);
>+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
>+
>+ dc->desc = "ASPEED 2500 SDHCI Controller";
>+ asc->capareg = 0x0000000001e80080;
>+}
>+
>+static const TypeInfo aspeed_2500_sdhci_info = {
>+ .name = TYPE_ASPEED_2500_SDHCI,
>+ .parent = TYPE_ASPEED_SDHCI,
>+ .class_init = aspeed_2500_sdhci_class_init,
> };
>
>-DEFINE_TYPES(aspeed_sdhci_types)
>+static void aspeed_2600_sdhci_class_init(ObjectClass *klass, void *data)
>+{
>+ DeviceClass *dc = DEVICE_CLASS(klass);
>+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
>+
>+ dc->desc = "ASPEED 2600 SDHCI Controller";
>+ asc->capareg = 0x0000000701f80080;
>+}
>+
>+static const TypeInfo aspeed_2600_sdhci_info = {
>+ .name = TYPE_ASPEED_2600_SDHCI,
>+ .parent = TYPE_ASPEED_SDHCI,
>+ .class_init = aspeed_2600_sdhci_class_init,
>+};
>+
>+static void aspeed_sdhci_register_types(void)
>+{
>+ type_register_static(&aspeed_sdhci_info);
>+ type_register_static(&aspeed_2400_sdhci_info);
>+ type_register_static(&aspeed_2500_sdhci_info);
>+ type_register_static(&aspeed_2600_sdhci_info);
>+}
>+
>+type_init(aspeed_sdhci_register_types);
>diff --git a/include/hw/sd/aspeed_sdhci.h b/include/hw/sd/aspeed_sdhci.h
>index 057bc5f3d1..8083797e25 100644
>--- a/include/hw/sd/aspeed_sdhci.h
>+++ b/include/hw/sd/aspeed_sdhci.h
>@@ -13,9 +13,11 @@
> #include "qom/object.h"
>
> #define TYPE_ASPEED_SDHCI "aspeed.sdhci"
>-OBJECT_DECLARE_SIMPLE_TYPE(AspeedSDHCIState, ASPEED_SDHCI)
>+#define TYPE_ASPEED_2400_SDHCI TYPE_ASPEED_SDHCI "-ast2400"
>+#define TYPE_ASPEED_2500_SDHCI TYPE_ASPEED_SDHCI "-ast2500"
>+#define TYPE_ASPEED_2600_SDHCI TYPE_ASPEED_SDHCI "-ast2600"
>+OBJECT_DECLARE_TYPE(AspeedSDHCIState, AspeedSDHCIClass, ASPEED_SDHCI)
>
>-#define ASPEED_SDHCI_CAPABILITIES 0x01E80080
> #define ASPEED_SDHCI_NUM_SLOTS 2
> #define ASPEED_SDHCI_NUM_REGS (ASPEED_SDHCI_REG_SIZE / sizeof(uint32_t))
> #define ASPEED_SDHCI_REG_SIZE 0x100
>@@ -32,4 +34,10 @@ struct AspeedSDHCIState {
> uint32_t regs[ASPEED_SDHCI_NUM_REGS];
> };
>
>+struct AspeedSDHCIClass {
>+ SysBusDeviceClass parent_class;
>+
>+ uint64_t capareg;
>+};
The struct seems not AST-specific and could be turned into a base class for all
SDHCI device models, no? That way one could also add further device-specific
constants other than capareg.
Best regards,
Bernhard
>+
> #endif /* ASPEED_SDHCI_H */
[PATCH v2 4/6] hw/sd/aspeed_sdhci: Add AST2700 Support, Jamin Lin, 2024/12/02
[PATCH v2 5/6] aspeed/soc: Support SDHCI for AST2700, Jamin Lin, 2024/12/02
[PATCH v2 6/6] aspeed/soc: Support eMMC for AST2700, Jamin Lin, 2024/12/02