xref: /qemu/include/hw/ppc/xive2.h (revision 0aa2612a01f233a4a25fb89e8362baf6cf896be6)
1f8a233deSCédric Le Goater /*
2f8a233deSCédric Le Goater  * QEMU PowerPC XIVE2 interrupt controller model  (POWER10)
3f8a233deSCédric Le Goater  *
4f8a233deSCédric Le Goater  * Copyright (c) 2019-2022, IBM Corporation.
5f8a233deSCédric Le Goater  *
6f8a233deSCédric Le Goater  * This code is licensed under the GPL version 2 or later. See the
7f8a233deSCédric Le Goater  * COPYING file in the top-level directory.
8f8a233deSCédric Le Goater  *
9f8a233deSCédric Le Goater  */
10f8a233deSCédric Le Goater 
11f8a233deSCédric Le Goater #ifndef PPC_XIVE2_H
12f8a233deSCédric Le Goater #define PPC_XIVE2_H
13f8a233deSCédric Le Goater 
14f8a233deSCédric Le Goater #include "hw/ppc/xive2_regs.h"
15f8a233deSCédric Le Goater 
16f8a233deSCédric Le Goater /*
17f8a233deSCédric Le Goater  * XIVE2 Router (POWER10)
18f8a233deSCédric Le Goater  */
19f8a233deSCédric Le Goater typedef struct Xive2Router {
20f8a233deSCédric Le Goater     SysBusDevice    parent;
21f8a233deSCédric Le Goater 
22f8a233deSCédric Le Goater     XiveFabric *xfb;
23f8a233deSCédric Le Goater } Xive2Router;
24f8a233deSCédric Le Goater 
25f8a233deSCédric Le Goater #define TYPE_XIVE2_ROUTER "xive2-router"
26f8a233deSCédric Le Goater OBJECT_DECLARE_TYPE(Xive2Router, Xive2RouterClass, XIVE2_ROUTER);
27f8a233deSCédric Le Goater 
28f8a233deSCédric Le Goater typedef struct Xive2RouterClass {
29f8a233deSCédric Le Goater     SysBusDeviceClass parent;
30f8a233deSCédric Le Goater 
31f8a233deSCédric Le Goater     /* XIVE table accessors */
32f8a233deSCédric Le Goater     int (*get_eas)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
33f8a233deSCédric Le Goater                    Xive2Eas *eas);
34*0aa2612aSCédric Le Goater     int (*get_pq)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
35*0aa2612aSCédric Le Goater                   uint8_t *pq);
36*0aa2612aSCédric Le Goater     int (*set_pq)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
37*0aa2612aSCédric Le Goater                   uint8_t *pq);
38f8a233deSCédric Le Goater     int (*get_end)(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
39f8a233deSCédric Le Goater                    Xive2End *end);
40f8a233deSCédric Le Goater     int (*write_end)(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
41f8a233deSCédric Le Goater                      Xive2End *end, uint8_t word_number);
42f8a233deSCédric Le Goater     int (*get_nvp)(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
43f8a233deSCédric Le Goater                    Xive2Nvp *nvp);
44f8a233deSCédric Le Goater     int (*write_nvp)(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
45f8a233deSCédric Le Goater                      Xive2Nvp *nvp, uint8_t word_number);
46f8a233deSCédric Le Goater     uint8_t (*get_block_id)(Xive2Router *xrtr);
47f8a233deSCédric Le Goater } Xive2RouterClass;
48f8a233deSCédric Le Goater 
49f8a233deSCédric Le Goater int xive2_router_get_eas(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
50f8a233deSCédric Le Goater                         Xive2Eas *eas);
51f8a233deSCédric Le Goater int xive2_router_get_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
52f8a233deSCédric Le Goater                         Xive2End *end);
53f8a233deSCédric Le Goater int xive2_router_write_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
54f8a233deSCédric Le Goater                           Xive2End *end, uint8_t word_number);
55f8a233deSCédric Le Goater int xive2_router_get_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
56f8a233deSCédric Le Goater                         Xive2Nvp *nvp);
57f8a233deSCédric Le Goater int xive2_router_write_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
58f8a233deSCédric Le Goater                           Xive2Nvp *nvp, uint8_t word_number);
59f8a233deSCédric Le Goater 
60*0aa2612aSCédric Le Goater void xive2_router_notify(XiveNotifier *xn, uint32_t lisn, bool pq_checked);
61f8a233deSCédric Le Goater 
62f8a233deSCédric Le Goater /*
6309a67f3dSCédric Le Goater  * XIVE2 Presenter (POWER10)
6409a67f3dSCédric Le Goater  */
6509a67f3dSCédric Le Goater 
6609a67f3dSCédric Le Goater int xive2_presenter_tctx_match(XivePresenter *xptr, XiveTCTX *tctx,
6709a67f3dSCédric Le Goater                                uint8_t format,
6809a67f3dSCédric Le Goater                                uint8_t nvt_blk, uint32_t nvt_idx,
6909a67f3dSCédric Le Goater                                bool cam_ignore, uint32_t logic_serv);
7009a67f3dSCédric Le Goater 
7109a67f3dSCédric Le Goater /*
72f8a233deSCédric Le Goater  * XIVE2 END ESBs  (POWER10)
73f8a233deSCédric Le Goater  */
74f8a233deSCédric Le Goater 
75f8a233deSCédric Le Goater #define TYPE_XIVE2_END_SOURCE "xive2-end-source"
76f8a233deSCédric Le Goater OBJECT_DECLARE_SIMPLE_TYPE(Xive2EndSource, XIVE2_END_SOURCE)
77f8a233deSCédric Le Goater 
78f8a233deSCédric Le Goater typedef struct Xive2EndSource {
79f8a233deSCédric Le Goater     DeviceState parent;
80f8a233deSCédric Le Goater 
81f8a233deSCédric Le Goater     uint32_t        nr_ends;
82f8a233deSCédric Le Goater 
83f8a233deSCédric Le Goater     /* ESB memory region */
84f8a233deSCédric Le Goater     uint32_t        esb_shift;
85f8a233deSCédric Le Goater     MemoryRegion    esb_mmio;
86f8a233deSCédric Le Goater 
87f8a233deSCédric Le Goater     Xive2Router     *xrtr;
88f8a233deSCédric Le Goater } Xive2EndSource;
89f8a233deSCédric Le Goater 
90f8a233deSCédric Le Goater 
91f8a233deSCédric Le Goater #endif /* PPC_XIVE2_H */
92