mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
hw/intc/loongarch_pch: Inherit from loongarch_pic_common
Set TYPE_LOONGARCH_PIC inherit from TYPE_LOONGARCH_PIC_COMMON object, it shares vmsate and property of TYPE_LOONGARCH_PIC_COMMON, and has its own realize() function. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Reviewed-by: Song Gao <gaosong@loongson.cn>
This commit is contained in:
parent
b7563779f9
commit
8bf26a9ea3
5 changed files with 77 additions and 26 deletions
|
@ -379,14 +379,14 @@ static void loongarch_pch_pic_reset(DeviceState *d)
|
||||||
s->int_polarity = 0x0;
|
s->int_polarity = 0x0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "loongarch_pic_common.c"
|
static void loongarch_pic_realize(DeviceState *dev, Error **errp)
|
||||||
static void loongarch_pch_pic_realize(DeviceState *dev, Error **errp)
|
|
||||||
{
|
{
|
||||||
LoongArchPCHPIC *s = LOONGARCH_PCH_PIC(dev);
|
LoongArchPICCommonState *s = LOONGARCH_PIC_COMMON(dev);
|
||||||
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
LoongarchPICClass *lpc = LOONGARCH_PIC_GET_CLASS(dev);
|
||||||
|
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
|
||||||
loongarch_pic_common_realize(dev, &local_err);
|
lpc->parent_realize(dev, &local_err);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
return;
|
return;
|
||||||
|
@ -408,26 +408,24 @@ static void loongarch_pch_pic_realize(DeviceState *dev, Error **errp)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void loongarch_pch_pic_class_init(ObjectClass *klass, void *data)
|
static void loongarch_pic_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
LoongarchPICClass *lpc = LOONGARCH_PIC_CLASS(klass);
|
||||||
|
|
||||||
dc->realize = loongarch_pch_pic_realize;
|
|
||||||
device_class_set_legacy_reset(dc, loongarch_pch_pic_reset);
|
device_class_set_legacy_reset(dc, loongarch_pch_pic_reset);
|
||||||
dc->vmsd = &vmstate_loongarch_pic_common;
|
device_class_set_parent_realize(dc, loongarch_pic_realize,
|
||||||
device_class_set_props(dc, loongarch_pic_common_properties);
|
&lpc->parent_realize);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo loongarch_pch_pic_info = {
|
static const TypeInfo loongarch_pic_types[] = {
|
||||||
.name = TYPE_LOONGARCH_PCH_PIC,
|
{
|
||||||
.parent = TYPE_SYS_BUS_DEVICE,
|
.name = TYPE_LOONGARCH_PIC,
|
||||||
.instance_size = sizeof(LoongArchPCHPIC),
|
.parent = TYPE_LOONGARCH_PIC_COMMON,
|
||||||
.class_init = loongarch_pch_pic_class_init,
|
.instance_size = sizeof(LoongarchPICState),
|
||||||
|
.class_size = sizeof(LoongarchPICClass),
|
||||||
|
.class_init = loongarch_pic_class_init,
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void loongarch_pch_pic_register_types(void)
|
DEFINE_TYPES(loongarch_pic_types)
|
||||||
{
|
|
||||||
type_register_static(&loongarch_pch_pic_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
type_init(loongarch_pch_pic_register_types)
|
|
||||||
|
|
|
@ -4,9 +4,15 @@
|
||||||
* Copyright (C) 2024 Loongson Technology Corporation Limited
|
* Copyright (C) 2024 Loongson Technology Corporation Limited
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "qapi/error.h"
|
||||||
|
#include "hw/intc/loongarch_pic_common.h"
|
||||||
|
#include "hw/qdev-properties.h"
|
||||||
|
#include "migration/vmstate.h"
|
||||||
|
|
||||||
static void loongarch_pic_common_realize(DeviceState *dev, Error **errp)
|
static void loongarch_pic_common_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
LoongArchPICCommonState *s = LOONGARCH_PCH_PIC(dev);
|
LoongArchPICCommonState *s = LOONGARCH_PIC_COMMON(dev);
|
||||||
|
|
||||||
if (!s->irq_num || s->irq_num > VIRT_PCH_PIC_IRQ_NUM) {
|
if (!s->irq_num || s->irq_num > VIRT_PCH_PIC_IRQ_NUM) {
|
||||||
error_setg(errp, "Invalid 'pic_irq_num'");
|
error_setg(errp, "Invalid 'pic_irq_num'");
|
||||||
|
@ -39,3 +45,27 @@ static const VMStateDescription vmstate_loongarch_pic_common = {
|
||||||
VMSTATE_END_OF_LIST()
|
VMSTATE_END_OF_LIST()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void loongarch_pic_common_class_init(ObjectClass *klass, void *data)
|
||||||
|
{
|
||||||
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
LoongArchPICCommonClass *lpcc = LOONGARCH_PIC_COMMON_CLASS(klass);
|
||||||
|
|
||||||
|
device_class_set_parent_realize(dc, loongarch_pic_common_realize,
|
||||||
|
&lpcc->parent_realize);
|
||||||
|
device_class_set_props(dc, loongarch_pic_common_properties);
|
||||||
|
dc->vmsd = &vmstate_loongarch_pic_common;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const TypeInfo loongarch_pic_common_types[] = {
|
||||||
|
{
|
||||||
|
.name = TYPE_LOONGARCH_PIC_COMMON,
|
||||||
|
.parent = TYPE_SYS_BUS_DEVICE,
|
||||||
|
.instance_size = sizeof(LoongArchPICCommonState),
|
||||||
|
.class_size = sizeof(LoongArchPICCommonClass),
|
||||||
|
.class_init = loongarch_pic_common_class_init,
|
||||||
|
.abstract = true,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
DEFINE_TYPES(loongarch_pic_common_types)
|
||||||
|
|
|
@ -71,6 +71,6 @@ specific_ss.add(when: 'CONFIG_M68K_IRQC', if_true: files('m68k_irqc.c'))
|
||||||
specific_ss.add(when: 'CONFIG_LOONGSON_IPI_COMMON', if_true: files('loongson_ipi_common.c'))
|
specific_ss.add(when: 'CONFIG_LOONGSON_IPI_COMMON', if_true: files('loongson_ipi_common.c'))
|
||||||
specific_ss.add(when: 'CONFIG_LOONGSON_IPI', if_true: files('loongson_ipi.c'))
|
specific_ss.add(when: 'CONFIG_LOONGSON_IPI', if_true: files('loongson_ipi.c'))
|
||||||
specific_ss.add(when: 'CONFIG_LOONGARCH_IPI', if_true: files('loongarch_ipi.c'))
|
specific_ss.add(when: 'CONFIG_LOONGARCH_IPI', if_true: files('loongarch_ipi.c'))
|
||||||
specific_ss.add(when: 'CONFIG_LOONGARCH_PCH_PIC', if_true: files('loongarch_pch_pic.c'))
|
specific_ss.add(when: 'CONFIG_LOONGARCH_PCH_PIC', if_true: files('loongarch_pch_pic.c', 'loongarch_pic_common.c'))
|
||||||
specific_ss.add(when: 'CONFIG_LOONGARCH_PCH_MSI', if_true: files('loongarch_pch_msi.c'))
|
specific_ss.add(when: 'CONFIG_LOONGARCH_PCH_MSI', if_true: files('loongarch_pch_msi.c'))
|
||||||
specific_ss.add(when: 'CONFIG_LOONGARCH_EXTIOI', if_true: files('loongarch_extioi.c'))
|
specific_ss.add(when: 'CONFIG_LOONGARCH_EXTIOI', if_true: files('loongarch_extioi.c'))
|
||||||
|
|
|
@ -10,9 +10,22 @@
|
||||||
|
|
||||||
#include "hw/intc/loongarch_pic_common.h"
|
#include "hw/intc/loongarch_pic_common.h"
|
||||||
|
|
||||||
#define LoongArchPCHPIC LoongArchPICCommonState
|
#define TYPE_LOONGARCH_PIC "loongarch_pic"
|
||||||
#define TYPE_LOONGARCH_PCH_PIC "loongarch_pch_pic"
|
#define PCH_PIC_NAME(name) TYPE_LOONGARCH_PIC#name
|
||||||
#define PCH_PIC_NAME(name) TYPE_LOONGARCH_PCH_PIC#name
|
OBJECT_DECLARE_TYPE(LoongarchPICState, LoongarchPICClass, LOONGARCH_PIC)
|
||||||
OBJECT_DECLARE_SIMPLE_TYPE(LoongArchPCHPIC, LOONGARCH_PCH_PIC)
|
|
||||||
|
struct LoongarchPICState {
|
||||||
|
LoongArchPICCommonState parent_obj;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LoongarchPICClass {
|
||||||
|
LoongArchPICCommonClass parent_class;
|
||||||
|
|
||||||
|
DeviceRealize parent_realize;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TYPE_LOONGARCH_PCH_PIC TYPE_LOONGARCH_PIC
|
||||||
|
typedef struct LoongArchPICCommonState LoongArchPCHPIC;
|
||||||
|
#define LOONGARCH_PCH_PIC(obj) ((struct LoongArchPICCommonState *)(obj))
|
||||||
|
|
||||||
#endif /* HW_LOONGARCH_PCH_PIC_H */
|
#endif /* HW_LOONGARCH_PCH_PIC_H */
|
||||||
|
|
|
@ -40,6 +40,10 @@
|
||||||
#define POL_LO_START 0x40
|
#define POL_LO_START 0x40
|
||||||
#define POL_HI_START 0x44
|
#define POL_HI_START 0x44
|
||||||
|
|
||||||
|
#define TYPE_LOONGARCH_PIC_COMMON "loongarch_pic_common"
|
||||||
|
OBJECT_DECLARE_TYPE(LoongArchPICCommonState,
|
||||||
|
LoongArchPICCommonClass, LOONGARCH_PIC_COMMON)
|
||||||
|
|
||||||
struct LoongArchPICCommonState {
|
struct LoongArchPICCommonState {
|
||||||
SysBusDevice parent_obj;
|
SysBusDevice parent_obj;
|
||||||
|
|
||||||
|
@ -67,4 +71,10 @@ struct LoongArchPICCommonState {
|
||||||
MemoryRegion iomem8;
|
MemoryRegion iomem8;
|
||||||
unsigned int irq_num;
|
unsigned int irq_num;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct LoongArchPICCommonClass {
|
||||||
|
SysBusDeviceClass parent_class;
|
||||||
|
|
||||||
|
DeviceRealize parent_realize;
|
||||||
|
};
|
||||||
#endif /* HW_LOONGARCH_PIC_COMMON_H */
|
#endif /* HW_LOONGARCH_PIC_COMMON_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue