Re: [PATCH v1 1/7] hw/fsi: Introduce IBM's Local bus
Hi Joel, On 8/28/23 23:34, Joel Stanley wrote: On Fri, 25 Aug 2023 at 20:31, Ninad Palsule wrote: This is a part of patchset where IBM's Flexible Service Interface is introduced. The LBUS is modelled to maintain the qdev bus hierarchy and to take advantage of the object model to automatically generate the CFAM configuration block. The configuration block presents engines in the order they are attached to the CFAM's LBUS. Engine implementations should subclass the LBusDevice and set the 'config' member of LBusDeviceClass to match the engine's type. Signed-off-by: Andrew Jeffery Signed-off-by: Cédric Le Goater Signed-off-by: Ninad Palsule --- hw/Kconfig| 1 + hw/fsi/Kconfig| 2 + hw/fsi/lbus.c | 94 +++ hw/fsi/meson.build| 1 + hw/meson.build| 1 + include/hw/fsi/bits.h | 15 +++ include/hw/fsi/lbus.h | 57 ++ 7 files changed, 171 insertions(+) create mode 100644 hw/fsi/Kconfig create mode 100644 hw/fsi/lbus.c create mode 100644 hw/fsi/meson.build create mode 100644 include/hw/fsi/bits.h create mode 100644 include/hw/fsi/lbus.h diff --git a/hw/Kconfig b/hw/Kconfig index ba62ff6417..2ccb73add5 100644 --- a/hw/Kconfig +++ b/hw/Kconfig @@ -9,6 +9,7 @@ source core/Kconfig source cxl/Kconfig source display/Kconfig source dma/Kconfig +source fsi/Kconfig source gpio/Kconfig source hyperv/Kconfig source i2c/Kconfig diff --git a/hw/fsi/Kconfig b/hw/fsi/Kconfig new file mode 100644 index 00..687449e14e --- /dev/null +++ b/hw/fsi/Kconfig @@ -0,0 +1,2 @@ +config LBUS +bool diff --git a/hw/fsi/lbus.c b/hw/fsi/lbus.c new file mode 100644 index 00..afb26ef7ea --- /dev/null +++ b/hw/fsi/lbus.c @@ -0,0 +1,94 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * Copyright (C) 2023 IBM Corp. + * + * IBM Local bus where FSI slaves are connected + */ + +#include "qemu/osdep.h" + +#include "qapi/error.h" +#include "qemu/log.h" + +#include "hw/fsi/lbus.h" + +#include "hw/qdev-properties.h" + +static void lbus_realize(BusState *bus, Error **errp) +{ +LBusNode *node; +LBus *lbus = LBUS(bus); + +memory_region_init(>mr, OBJECT(lbus), TYPE_LBUS, + (2 * 1024 * 1024) - 0x400); + +QLIST_FOREACH(node, >devices, next) { +memory_region_add_subregion(>mr, node->ldev->address, +>ldev->iomem); +} +} + +static void lbus_init(Object *o) +{ +} + +static void lbus_class_init(ObjectClass *klass, void *data) +{ +BusClass *k = BUS_CLASS(klass); +k->realize = lbus_realize; +} + +static const TypeInfo lbus_info = { +.name = TYPE_LBUS, +.parent = TYPE_BUS, +.instance_init = lbus_init, +.instance_size = sizeof(LBus), +.class_init = lbus_class_init, +}; + +static Property lbus_device_props[] = { +DEFINE_PROP_UINT32("address", LBusDevice, address, 0), +DEFINE_PROP_END_OF_LIST(), +}; + +DeviceState *lbus_create_device(LBus *bus, const char *type, uint32_t addr) +{ +DeviceState *dev; +LBusNode *node; + +dev = qdev_new(type); +qdev_prop_set_uint8(dev, "address", addr); +qdev_realize_and_unref(dev, >bus, _fatal); + +/* Move to post_load */ +node = g_malloc(sizeof(struct LBusNode)); +node->ldev = LBUS_DEVICE(dev); +QLIST_INSERT_HEAD(>devices, node, next); + +return dev; +} + +static void lbus_device_class_init(ObjectClass *klass, void *data) +{ +DeviceClass *dc = DEVICE_CLASS(klass); + +dc->bus_type = TYPE_LBUS; +device_class_set_props(dc, lbus_device_props); +} + +static const TypeInfo lbus_device_type_info = { +.name = TYPE_LBUS_DEVICE, +.parent = TYPE_DEVICE, +.instance_size = sizeof(LBusDevice), +.abstract = true, +.class_init = lbus_device_class_init, +.class_size = sizeof(LBusDeviceClass), +}; + +static void lbus_register_types(void) +{ +type_register_static(_info); +type_register_static(_device_type_info); +} + +type_init(lbus_register_types); diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build new file mode 100644 index 00..e1007d5fea --- /dev/null +++ b/hw/fsi/meson.build @@ -0,0 +1 @@ +system_ss.add(when: 'CONFIG_LBUS', if_true: files('lbus.c')) diff --git a/hw/meson.build b/hw/meson.build index c7ac7d3d75..6c71ee9cfa 100644 --- a/hw/meson.build +++ b/hw/meson.build @@ -43,6 +43,7 @@ subdir('virtio') subdir('watchdog') subdir('xen') subdir('xenpv') +subdir('fsi') subdir('alpha') subdir('arm') diff --git a/include/hw/fsi/bits.h b/include/hw/fsi/bits.h new file mode 100644 index 00..338ae483cf --- /dev/null +++ b/include/hw/fsi/bits.h @@ -0,0 +1,15 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * Copyright (C) 2023 IBM Corp. + * + * Bit operation macros + */ +#ifndef FSI_BITS_H +#define FSI_BITS_H + +#define BE_BIT(x) BIT(31 - (x)) +#define GENMASK(t, b) \ +(((1ULL << ((t) + 1)) - 1) & ~((1ULL << (b)) - 1))
Re: [PATCH v1 1/7] hw/fsi: Introduce IBM's Local bus
On Fri, 25 Aug 2023 at 20:31, Ninad Palsule wrote: > > This is a part of patchset where IBM's Flexible Service Interface is > introduced. > > The LBUS is modelled to maintain the qdev bus hierarchy and to take > advantage of the object model to automatically generate the CFAM > configuration block. The configuration block presents engines in the > order they are attached to the CFAM's LBUS. Engine implementations > should subclass the LBusDevice and set the 'config' member of > LBusDeviceClass to match the engine's type. > > Signed-off-by: Andrew Jeffery > Signed-off-by: Cédric Le Goater > Signed-off-by: Ninad Palsule > --- > hw/Kconfig| 1 + > hw/fsi/Kconfig| 2 + > hw/fsi/lbus.c | 94 +++ > hw/fsi/meson.build| 1 + > hw/meson.build| 1 + > include/hw/fsi/bits.h | 15 +++ > include/hw/fsi/lbus.h | 57 ++ > 7 files changed, 171 insertions(+) > create mode 100644 hw/fsi/Kconfig > create mode 100644 hw/fsi/lbus.c > create mode 100644 hw/fsi/meson.build > create mode 100644 include/hw/fsi/bits.h > create mode 100644 include/hw/fsi/lbus.h > > diff --git a/hw/Kconfig b/hw/Kconfig > index ba62ff6417..2ccb73add5 100644 > --- a/hw/Kconfig > +++ b/hw/Kconfig > @@ -9,6 +9,7 @@ source core/Kconfig > source cxl/Kconfig > source display/Kconfig > source dma/Kconfig > +source fsi/Kconfig > source gpio/Kconfig > source hyperv/Kconfig > source i2c/Kconfig > diff --git a/hw/fsi/Kconfig b/hw/fsi/Kconfig > new file mode 100644 > index 00..687449e14e > --- /dev/null > +++ b/hw/fsi/Kconfig > @@ -0,0 +1,2 @@ > +config LBUS > +bool > diff --git a/hw/fsi/lbus.c b/hw/fsi/lbus.c > new file mode 100644 > index 00..afb26ef7ea > --- /dev/null > +++ b/hw/fsi/lbus.c > @@ -0,0 +1,94 @@ > +/* > + * SPDX-License-Identifier: GPL-2.0-or-later > + * Copyright (C) 2023 IBM Corp. > + * > + * IBM Local bus where FSI slaves are connected > + */ > + > +#include "qemu/osdep.h" > + > +#include "qapi/error.h" > +#include "qemu/log.h" > + > +#include "hw/fsi/lbus.h" > + > +#include "hw/qdev-properties.h" > + > +static void lbus_realize(BusState *bus, Error **errp) > +{ > +LBusNode *node; > +LBus *lbus = LBUS(bus); > + > +memory_region_init(>mr, OBJECT(lbus), TYPE_LBUS, > + (2 * 1024 * 1024) - 0x400); > + > +QLIST_FOREACH(node, >devices, next) { > +memory_region_add_subregion(>mr, node->ldev->address, > +>ldev->iomem); > +} > +} > + > +static void lbus_init(Object *o) > +{ > +} > + > +static void lbus_class_init(ObjectClass *klass, void *data) > +{ > +BusClass *k = BUS_CLASS(klass); > +k->realize = lbus_realize; > +} > + > +static const TypeInfo lbus_info = { > +.name = TYPE_LBUS, > +.parent = TYPE_BUS, > +.instance_init = lbus_init, > +.instance_size = sizeof(LBus), > +.class_init = lbus_class_init, > +}; > + > +static Property lbus_device_props[] = { > +DEFINE_PROP_UINT32("address", LBusDevice, address, 0), > +DEFINE_PROP_END_OF_LIST(), > +}; > + > +DeviceState *lbus_create_device(LBus *bus, const char *type, uint32_t addr) > +{ > +DeviceState *dev; > +LBusNode *node; > + > +dev = qdev_new(type); > +qdev_prop_set_uint8(dev, "address", addr); > +qdev_realize_and_unref(dev, >bus, _fatal); > + > +/* Move to post_load */ > +node = g_malloc(sizeof(struct LBusNode)); > +node->ldev = LBUS_DEVICE(dev); > +QLIST_INSERT_HEAD(>devices, node, next); > + > +return dev; > +} > + > +static void lbus_device_class_init(ObjectClass *klass, void *data) > +{ > +DeviceClass *dc = DEVICE_CLASS(klass); > + > +dc->bus_type = TYPE_LBUS; > +device_class_set_props(dc, lbus_device_props); > +} > + > +static const TypeInfo lbus_device_type_info = { > +.name = TYPE_LBUS_DEVICE, > +.parent = TYPE_DEVICE, > +.instance_size = sizeof(LBusDevice), > +.abstract = true, > +.class_init = lbus_device_class_init, > +.class_size = sizeof(LBusDeviceClass), > +}; > + > +static void lbus_register_types(void) > +{ > +type_register_static(_info); > +type_register_static(_device_type_info); > +} > + > +type_init(lbus_register_types); > diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build > new file mode 100644 > index 00..e1007d5fea > --- /dev/null > +++ b/hw/fsi/meson.build > @@ -0,0 +1 @@ > +system_ss.add(when: 'CONFIG_LBUS', if_true: files('lbus.c')) > diff --git a/hw/meson.build b/hw/meson.build > index c7ac7d3d75..6c71ee9cfa 100644 > --- a/hw/meson.build > +++ b/hw/meson.build > @@ -43,6 +43,7 @@ subdir('virtio') > subdir('watchdog') > subdir('xen') > subdir('xenpv') > +subdir('fsi') > > subdir('alpha') > subdir('arm') > diff --git a/include/hw/fsi/bits.h b/include/hw/fsi/bits.h > new file mode 100644 > index 00..338ae483cf > --- /dev/null > +++ b/include/hw/fsi/bits.h > @@ -0,0 +1,15 @@ > +/* > + *
[PATCH v1 1/7] hw/fsi: Introduce IBM's Local bus
This is a part of patchset where IBM's Flexible Service Interface is introduced. The LBUS is modelled to maintain the qdev bus hierarchy and to take advantage of the object model to automatically generate the CFAM configuration block. The configuration block presents engines in the order they are attached to the CFAM's LBUS. Engine implementations should subclass the LBusDevice and set the 'config' member of LBusDeviceClass to match the engine's type. Signed-off-by: Andrew Jeffery Signed-off-by: Cédric Le Goater Signed-off-by: Ninad Palsule --- hw/Kconfig| 1 + hw/fsi/Kconfig| 2 + hw/fsi/lbus.c | 94 +++ hw/fsi/meson.build| 1 + hw/meson.build| 1 + include/hw/fsi/bits.h | 15 +++ include/hw/fsi/lbus.h | 57 ++ 7 files changed, 171 insertions(+) create mode 100644 hw/fsi/Kconfig create mode 100644 hw/fsi/lbus.c create mode 100644 hw/fsi/meson.build create mode 100644 include/hw/fsi/bits.h create mode 100644 include/hw/fsi/lbus.h diff --git a/hw/Kconfig b/hw/Kconfig index ba62ff6417..2ccb73add5 100644 --- a/hw/Kconfig +++ b/hw/Kconfig @@ -9,6 +9,7 @@ source core/Kconfig source cxl/Kconfig source display/Kconfig source dma/Kconfig +source fsi/Kconfig source gpio/Kconfig source hyperv/Kconfig source i2c/Kconfig diff --git a/hw/fsi/Kconfig b/hw/fsi/Kconfig new file mode 100644 index 00..687449e14e --- /dev/null +++ b/hw/fsi/Kconfig @@ -0,0 +1,2 @@ +config LBUS +bool diff --git a/hw/fsi/lbus.c b/hw/fsi/lbus.c new file mode 100644 index 00..afb26ef7ea --- /dev/null +++ b/hw/fsi/lbus.c @@ -0,0 +1,94 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * Copyright (C) 2023 IBM Corp. + * + * IBM Local bus where FSI slaves are connected + */ + +#include "qemu/osdep.h" + +#include "qapi/error.h" +#include "qemu/log.h" + +#include "hw/fsi/lbus.h" + +#include "hw/qdev-properties.h" + +static void lbus_realize(BusState *bus, Error **errp) +{ +LBusNode *node; +LBus *lbus = LBUS(bus); + +memory_region_init(>mr, OBJECT(lbus), TYPE_LBUS, + (2 * 1024 * 1024) - 0x400); + +QLIST_FOREACH(node, >devices, next) { +memory_region_add_subregion(>mr, node->ldev->address, +>ldev->iomem); +} +} + +static void lbus_init(Object *o) +{ +} + +static void lbus_class_init(ObjectClass *klass, void *data) +{ +BusClass *k = BUS_CLASS(klass); +k->realize = lbus_realize; +} + +static const TypeInfo lbus_info = { +.name = TYPE_LBUS, +.parent = TYPE_BUS, +.instance_init = lbus_init, +.instance_size = sizeof(LBus), +.class_init = lbus_class_init, +}; + +static Property lbus_device_props[] = { +DEFINE_PROP_UINT32("address", LBusDevice, address, 0), +DEFINE_PROP_END_OF_LIST(), +}; + +DeviceState *lbus_create_device(LBus *bus, const char *type, uint32_t addr) +{ +DeviceState *dev; +LBusNode *node; + +dev = qdev_new(type); +qdev_prop_set_uint8(dev, "address", addr); +qdev_realize_and_unref(dev, >bus, _fatal); + +/* Move to post_load */ +node = g_malloc(sizeof(struct LBusNode)); +node->ldev = LBUS_DEVICE(dev); +QLIST_INSERT_HEAD(>devices, node, next); + +return dev; +} + +static void lbus_device_class_init(ObjectClass *klass, void *data) +{ +DeviceClass *dc = DEVICE_CLASS(klass); + +dc->bus_type = TYPE_LBUS; +device_class_set_props(dc, lbus_device_props); +} + +static const TypeInfo lbus_device_type_info = { +.name = TYPE_LBUS_DEVICE, +.parent = TYPE_DEVICE, +.instance_size = sizeof(LBusDevice), +.abstract = true, +.class_init = lbus_device_class_init, +.class_size = sizeof(LBusDeviceClass), +}; + +static void lbus_register_types(void) +{ +type_register_static(_info); +type_register_static(_device_type_info); +} + +type_init(lbus_register_types); diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build new file mode 100644 index 00..e1007d5fea --- /dev/null +++ b/hw/fsi/meson.build @@ -0,0 +1 @@ +system_ss.add(when: 'CONFIG_LBUS', if_true: files('lbus.c')) diff --git a/hw/meson.build b/hw/meson.build index c7ac7d3d75..6c71ee9cfa 100644 --- a/hw/meson.build +++ b/hw/meson.build @@ -43,6 +43,7 @@ subdir('virtio') subdir('watchdog') subdir('xen') subdir('xenpv') +subdir('fsi') subdir('alpha') subdir('arm') diff --git a/include/hw/fsi/bits.h b/include/hw/fsi/bits.h new file mode 100644 index 00..338ae483cf --- /dev/null +++ b/include/hw/fsi/bits.h @@ -0,0 +1,15 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * Copyright (C) 2023 IBM Corp. + * + * Bit operation macros + */ +#ifndef FSI_BITS_H +#define FSI_BITS_H + +#define BE_BIT(x) BIT(31 - (x)) +#define GENMASK(t, b) \ +(((1ULL << ((t) + 1)) - 1) & ~((1ULL << (b)) - 1)) +#define BE_GENMASK(t, b) GENMASK(BE_BIT(t), BE_BIT(b)) + +#endif /* FSI_BITS_H */ diff --git