xref: /qemu/include/hw/ppc/xive2.h (revision f8a233dedf2560d7d592dab347ddf2a58e8a98db)
1*f8a233deSCédric Le Goater /*
2*f8a233deSCédric Le Goater  * QEMU PowerPC XIVE2 interrupt controller model  (POWER10)
3*f8a233deSCédric Le Goater  *
4*f8a233deSCédric Le Goater  * Copyright (c) 2019-2022, IBM Corporation.
5*f8a233deSCédric Le Goater  *
6*f8a233deSCédric Le Goater  * This code is licensed under the GPL version 2 or later. See the
7*f8a233deSCédric Le Goater  * COPYING file in the top-level directory.
8*f8a233deSCédric Le Goater  *
9*f8a233deSCédric Le Goater  */
10*f8a233deSCédric Le Goater 
11*f8a233deSCédric Le Goater #ifndef PPC_XIVE2_H
12*f8a233deSCédric Le Goater #define PPC_XIVE2_H
13*f8a233deSCédric Le Goater 
14*f8a233deSCédric Le Goater #include "hw/ppc/xive2_regs.h"
15*f8a233deSCédric Le Goater 
16*f8a233deSCédric Le Goater /*
17*f8a233deSCédric Le Goater  * XIVE2 Router (POWER10)
18*f8a233deSCédric Le Goater  */
19*f8a233deSCédric Le Goater typedef struct Xive2Router {
20*f8a233deSCédric Le Goater     SysBusDevice    parent;
21*f8a233deSCédric Le Goater 
22*f8a233deSCédric Le Goater     XiveFabric *xfb;
23*f8a233deSCédric Le Goater } Xive2Router;
24*f8a233deSCédric Le Goater 
25*f8a233deSCédric Le Goater #define TYPE_XIVE2_ROUTER "xive2-router"
26*f8a233deSCédric Le Goater OBJECT_DECLARE_TYPE(Xive2Router, Xive2RouterClass, XIVE2_ROUTER);
27*f8a233deSCédric Le Goater 
28*f8a233deSCédric Le Goater typedef struct Xive2RouterClass {
29*f8a233deSCédric Le Goater     SysBusDeviceClass parent;
30*f8a233deSCédric Le Goater 
31*f8a233deSCédric Le Goater     /* XIVE table accessors */
32*f8a233deSCédric Le Goater     int (*get_eas)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
33*f8a233deSCédric Le Goater                    Xive2Eas *eas);
34*f8a233deSCédric Le Goater     int (*get_end)(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
35*f8a233deSCédric Le Goater                    Xive2End *end);
36*f8a233deSCédric Le Goater     int (*write_end)(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
37*f8a233deSCédric Le Goater                      Xive2End *end, uint8_t word_number);
38*f8a233deSCédric Le Goater     int (*get_nvp)(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
39*f8a233deSCédric Le Goater                    Xive2Nvp *nvp);
40*f8a233deSCédric Le Goater     int (*write_nvp)(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
41*f8a233deSCédric Le Goater                      Xive2Nvp *nvp, uint8_t word_number);
42*f8a233deSCédric Le Goater     uint8_t (*get_block_id)(Xive2Router *xrtr);
43*f8a233deSCédric Le Goater } Xive2RouterClass;
44*f8a233deSCédric Le Goater 
45*f8a233deSCédric Le Goater int xive2_router_get_eas(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
46*f8a233deSCédric Le Goater                         Xive2Eas *eas);
47*f8a233deSCédric Le Goater int xive2_router_get_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
48*f8a233deSCédric Le Goater                         Xive2End *end);
49*f8a233deSCédric Le Goater int xive2_router_write_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
50*f8a233deSCédric Le Goater                           Xive2End *end, uint8_t word_number);
51*f8a233deSCédric Le Goater int xive2_router_get_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
52*f8a233deSCédric Le Goater                         Xive2Nvp *nvp);
53*f8a233deSCédric Le Goater int xive2_router_write_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
54*f8a233deSCédric Le Goater                           Xive2Nvp *nvp, uint8_t word_number);
55*f8a233deSCédric Le Goater 
56*f8a233deSCédric Le Goater void xive2_router_notify(XiveNotifier *xn, uint32_t lisn);
57*f8a233deSCédric Le Goater 
58*f8a233deSCédric Le Goater /*
59*f8a233deSCédric Le Goater  * XIVE2 END ESBs  (POWER10)
60*f8a233deSCédric Le Goater  */
61*f8a233deSCédric Le Goater 
62*f8a233deSCédric Le Goater #define TYPE_XIVE2_END_SOURCE "xive2-end-source"
63*f8a233deSCédric Le Goater OBJECT_DECLARE_SIMPLE_TYPE(Xive2EndSource, XIVE2_END_SOURCE)
64*f8a233deSCédric Le Goater 
65*f8a233deSCédric Le Goater typedef struct Xive2EndSource {
66*f8a233deSCédric Le Goater     DeviceState parent;
67*f8a233deSCédric Le Goater 
68*f8a233deSCédric Le Goater     uint32_t        nr_ends;
69*f8a233deSCédric Le Goater 
70*f8a233deSCédric Le Goater     /* ESB memory region */
71*f8a233deSCédric Le Goater     uint32_t        esb_shift;
72*f8a233deSCédric Le Goater     MemoryRegion    esb_mmio;
73*f8a233deSCédric Le Goater 
74*f8a233deSCédric Le Goater     Xive2Router     *xrtr;
75*f8a233deSCédric Le Goater } Xive2EndSource;
76*f8a233deSCédric Le Goater 
77*f8a233deSCédric Le Goater 
78*f8a233deSCédric Le Goater #endif /* PPC_XIVE2_H */
79