31
31
#include "hw/sysbus.h"
33
#define TYPE_XICS_COMMON "xics-common"
34
#define XICS_COMMON(obj) OBJECT_CHECK(XICSState, (obj), TYPE_XICS_COMMON)
37
* Retain xics as the type name to be compatible for migration. Rest all the
38
* functions, class and variables are renamed as xics_spapr.
40
#define TYPE_XICS_SPAPR "xics"
41
#define XICS_SPAPR(obj) OBJECT_CHECK(XICSState, (obj), TYPE_XICS_SPAPR)
43
#define TYPE_XICS_SPAPR_KVM "xics-spapr-kvm"
44
#define XICS_SPAPR_KVM(obj) \
45
OBJECT_CHECK(KVMXICSState, (obj), TYPE_XICS_SPAPR_KVM)
47
#define XICS_COMMON_CLASS(klass) \
48
OBJECT_CLASS_CHECK(XICSStateClass, (klass), TYPE_XICS_COMMON)
49
#define XICS_SPAPR_CLASS(klass) \
50
OBJECT_CLASS_CHECK(XICSStateClass, (klass), TYPE_XICS_SPAPR)
51
#define XICS_COMMON_GET_CLASS(obj) \
52
OBJECT_GET_CLASS(XICSStateClass, (obj), TYPE_XICS_COMMON)
53
#define XICS_SPAPR_GET_CLASS(obj) \
54
OBJECT_GET_CLASS(XICSStateClass, (obj), TYPE_XICS_SPAPR)
56
33
#define XICS_IPI 0x2
57
34
#define XICS_BUID 0x1
58
35
#define XICS_IRQ_BASE (XICS_BUID << 12)
62
39
* (the kernel implementation supports more but we don't exploit
65
typedef struct XICSStateClass XICSStateClass;
66
typedef struct XICSState XICSState;
67
42
typedef struct ICPStateClass ICPStateClass;
68
43
typedef struct ICPState ICPState;
69
44
typedef struct ICSStateClass ICSStateClass;
70
45
typedef struct ICSState ICSState;
71
46
typedef struct ICSIRQState ICSIRQState;
73
struct XICSStateClass {
74
DeviceClass parent_class;
76
void (*cpu_setup)(XICSState *icp, PowerPCCPU *cpu);
77
void (*set_nr_irqs)(XICSState *icp, uint32_t nr_irqs, Error **errp);
78
void (*set_nr_servers)(XICSState *icp, uint32_t nr_servers, Error **errp);
83
SysBusDevice parent_obj;
88
QLIST_HEAD(, ICSState) ics;
47
typedef struct XICSFabric XICSFabric;
91
49
#define TYPE_ICP "icp"
92
50
#define ICP(obj) OBJECT_CHECK(ICPState, (obj), TYPE_ICP)
146
#define TYPE_XICS_FABRIC "xics-fabric"
147
#define XICS_FABRIC(obj) \
148
OBJECT_CHECK(XICSFabric, (obj), TYPE_XICS_FABRIC)
149
#define XICS_FABRIC_CLASS(klass) \
150
OBJECT_CLASS_CHECK(XICSFabricClass, (klass), TYPE_XICS_FABRIC)
151
#define XICS_FABRIC_GET_CLASS(obj) \
152
OBJECT_GET_CLASS(XICSFabricClass, (obj), TYPE_XICS_FABRIC)
154
typedef struct XICSFabricClass {
155
InterfaceClass parent;
156
ICSState *(*ics_get)(XICSFabric *xi, int irq);
157
void (*ics_resend)(XICSFabric *xi);
158
ICPState *(*icp_get)(XICSFabric *xi, int server);
183
161
#define XICS_IRQS_SPAPR 1024
185
qemu_irq xics_get_qirq(XICSState *icp, int irq);
186
int xics_spapr_alloc(XICSState *icp, int irq_hint, bool lsi, Error **errp);
187
int xics_spapr_alloc_block(XICSState *icp, int num, bool lsi, bool align,
163
int spapr_ics_alloc(ICSState *ics, int irq_hint, bool lsi, Error **errp);
164
int spapr_ics_alloc_block(ICSState *ics, int num, bool lsi, bool align,
189
void xics_spapr_free(XICSState *icp, int irq, int num);
190
void spapr_dt_xics(XICSState *xics, void *fdt, uint32_t phandle);
166
void spapr_ics_free(ICSState *ics, int irq, int num);
167
void spapr_dt_xics(int nr_servers, void *fdt, uint32_t phandle);
192
void xics_cpu_setup(XICSState *icp, PowerPCCPU *cpu);
193
void xics_cpu_destroy(XICSState *icp, PowerPCCPU *cpu);
194
void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers,
195
const char *typename, Error **errp);
169
qemu_irq xics_get_qirq(XICSFabric *xi, int irq);
170
ICPState *xics_icp_get(XICSFabric *xi, int server);
171
void xics_cpu_setup(XICSFabric *xi, PowerPCCPU *cpu);
172
void xics_cpu_destroy(XICSFabric *xi, PowerPCCPU *cpu);
197
174
/* Internal XICS interfaces */
198
175
int xics_get_cpu_index_by_dt_id(int cpu_dt_id);
207
184
uint8_t priority, uint8_t saved_priority);
209
186
void ics_set_irq_type(ICSState *ics, int srcno, bool lsi);
211
ICSState *xics_find_source(XICSState *icp, int irq);
187
void icp_pic_print_info(ICPState *icp, Monitor *mon);
188
void ics_pic_print_info(ICSState *ics, Monitor *mon);
190
void ics_resend(ICSState *ics);
191
void icp_resend(ICPState *ss);
193
typedef struct sPAPRMachineState sPAPRMachineState;
195
int xics_kvm_init(sPAPRMachineState *spapr, Error **errp);
196
int xics_spapr_init(sPAPRMachineState *spapr, Error **errp);
213
198
#endif /* XICS_H */