xref: /openbmc/qemu/include/hw/ppc/xive2.h (revision 6b829602e2f10f301ff8508f3a6850a0e913142c)
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 
1414f11a20SMarkus Armbruster #include "hw/ppc/xive.h"
15f8a233deSCédric Le Goater #include "hw/ppc/xive2_regs.h"
1614f11a20SMarkus Armbruster #include "hw/sysbus.h"
17f8a233deSCédric Le Goater 
18f8a233deSCédric Le Goater /*
19f8a233deSCédric Le Goater  * XIVE2 Router (POWER10)
20f8a233deSCédric Le Goater  */
21f8a233deSCédric Le Goater typedef struct Xive2Router {
22f8a233deSCédric Le Goater     SysBusDevice    parent;
23f8a233deSCédric Le Goater 
24f8a233deSCédric Le Goater     XiveFabric *xfb;
25f8a233deSCédric Le Goater } Xive2Router;
26f8a233deSCédric Le Goater 
27f8a233deSCédric Le Goater #define TYPE_XIVE2_ROUTER "xive2-router"
28f8a233deSCédric Le Goater OBJECT_DECLARE_TYPE(Xive2Router, Xive2RouterClass, XIVE2_ROUTER);
29f8a233deSCédric Le Goater 
30e16032b8SCédric Le Goater /*
31e16032b8SCédric Le Goater  * Configuration flags
32e16032b8SCédric Le Goater  */
33e16032b8SCédric Le Goater 
34e16032b8SCédric Le Goater #define XIVE2_GEN1_TIMA_OS      0x00000001
35835806f1SCédric Le Goater #define XIVE2_VP_SAVE_RESTORE   0x00000002
3609a7e60cSCédric Le Goater #define XIVE2_THREADID_8BITS    0x00000004
37e16032b8SCédric Le Goater 
38f8a233deSCédric Le Goater typedef struct Xive2RouterClass {
39f8a233deSCédric Le Goater     SysBusDeviceClass parent;
40f8a233deSCédric Le Goater 
41f8a233deSCédric Le Goater     /* XIVE table accessors */
42f8a233deSCédric Le Goater     int (*get_eas)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
43f8a233deSCédric Le Goater                    Xive2Eas *eas);
440aa2612aSCédric Le Goater     int (*get_pq)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
450aa2612aSCédric Le Goater                   uint8_t *pq);
460aa2612aSCédric Le Goater     int (*set_pq)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
470aa2612aSCédric Le Goater                   uint8_t *pq);
48f8a233deSCédric Le Goater     int (*get_end)(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
49f8a233deSCédric Le Goater                    Xive2End *end);
50f8a233deSCédric Le Goater     int (*write_end)(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
51f8a233deSCédric Le Goater                      Xive2End *end, uint8_t word_number);
52f8a233deSCédric Le Goater     int (*get_nvp)(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
53f8a233deSCédric Le Goater                    Xive2Nvp *nvp);
54f8a233deSCédric Le Goater     int (*write_nvp)(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
55f8a233deSCédric Le Goater                      Xive2Nvp *nvp, uint8_t word_number);
5676798e12SFrederic Barrat     int (*get_nvgc)(Xive2Router *xrtr, bool crowd,
5776798e12SFrederic Barrat                     uint8_t nvgc_blk, uint32_t nvgc_idx,
5876798e12SFrederic Barrat                     Xive2Nvgc *nvgc);
5976798e12SFrederic Barrat     int (*write_nvgc)(Xive2Router *xrtr, bool crowd,
6076798e12SFrederic Barrat                       uint8_t nvgc_blk, uint32_t nvgc_idx,
6176798e12SFrederic Barrat                       Xive2Nvgc *nvgc);
62f8a233deSCédric Le Goater     uint8_t (*get_block_id)(Xive2Router *xrtr);
63e16032b8SCédric Le Goater     uint32_t (*get_config)(Xive2Router *xrtr);
64f8a233deSCédric Le Goater } Xive2RouterClass;
65f8a233deSCédric Le Goater 
66f8a233deSCédric Le Goater int xive2_router_get_eas(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
67f8a233deSCédric Le Goater                         Xive2Eas *eas);
68f8a233deSCédric Le Goater int xive2_router_get_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
69f8a233deSCédric Le Goater                         Xive2End *end);
70f8a233deSCédric Le Goater int xive2_router_write_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
71f8a233deSCédric Le Goater                           Xive2End *end, uint8_t word_number);
72f8a233deSCédric Le Goater int xive2_router_get_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
73f8a233deSCédric Le Goater                         Xive2Nvp *nvp);
74f8a233deSCédric Le Goater int xive2_router_write_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
75f8a233deSCédric Le Goater                           Xive2Nvp *nvp, uint8_t word_number);
7676798e12SFrederic Barrat int xive2_router_get_nvgc(Xive2Router *xrtr, bool crowd,
7776798e12SFrederic Barrat                           uint8_t nvgc_blk, uint32_t nvgc_idx,
7876798e12SFrederic Barrat                           Xive2Nvgc *nvgc);
7976798e12SFrederic Barrat int xive2_router_write_nvgc(Xive2Router *xrtr, bool crowd,
8076798e12SFrederic Barrat                             uint8_t nvgc_blk, uint32_t nvgc_idx,
8176798e12SFrederic Barrat                             Xive2Nvgc *nvgc);
82e16032b8SCédric Le Goater uint32_t xive2_router_get_config(Xive2Router *xrtr);
83f8a233deSCédric Le Goater 
840aa2612aSCédric Le Goater void xive2_router_notify(XiveNotifier *xn, uint32_t lisn, bool pq_checked);
85f8a233deSCédric Le Goater 
86f8a233deSCédric Le Goater /*
8709a67f3dSCédric Le Goater  * XIVE2 Presenter (POWER10)
8809a67f3dSCédric Le Goater  */
8909a67f3dSCédric Le Goater 
9009a67f3dSCédric Le Goater int xive2_presenter_tctx_match(XivePresenter *xptr, XiveTCTX *tctx,
9109a67f3dSCédric Le Goater                                uint8_t format,
9209a67f3dSCédric Le Goater                                uint8_t nvt_blk, uint32_t nvt_idx,
9309a67f3dSCédric Le Goater                                bool cam_ignore, uint32_t logic_serv);
9409a67f3dSCédric Le Goater 
9509a67f3dSCédric Le Goater /*
96f8a233deSCédric Le Goater  * XIVE2 END ESBs  (POWER10)
97f8a233deSCédric Le Goater  */
98f8a233deSCédric Le Goater 
99f8a233deSCédric Le Goater #define TYPE_XIVE2_END_SOURCE "xive2-end-source"
100f8a233deSCédric Le Goater OBJECT_DECLARE_SIMPLE_TYPE(Xive2EndSource, XIVE2_END_SOURCE)
101f8a233deSCédric Le Goater 
102f8a233deSCédric Le Goater typedef struct Xive2EndSource {
103f8a233deSCédric Le Goater     DeviceState parent;
104f8a233deSCédric Le Goater 
105f8a233deSCédric Le Goater     uint32_t        nr_ends;
106f8a233deSCédric Le Goater 
107f8a233deSCédric Le Goater     /* ESB memory region */
108f8a233deSCédric Le Goater     uint32_t        esb_shift;
109f8a233deSCédric Le Goater     MemoryRegion    esb_mmio;
110f8a233deSCédric Le Goater 
111f8a233deSCédric Le Goater     Xive2Router     *xrtr;
112f8a233deSCédric Le Goater } Xive2EndSource;
113f8a233deSCédric Le Goater 
11495d729e2SCédric Le Goater /*
11595d729e2SCédric Le Goater  * XIVE2 Thread Interrupt Management Area (POWER10)
11695d729e2SCédric Le Goater  */
11795d729e2SCédric Le Goater 
11895d729e2SCédric Le Goater void xive2_tm_push_os_ctx(XivePresenter *xptr, XiveTCTX *tctx, hwaddr offset,
11995d729e2SCédric Le Goater                            uint64_t value, unsigned size);
12095d729e2SCédric Le Goater uint64_t xive2_tm_pull_os_ctx(XivePresenter *xptr, XiveTCTX *tctx,
12195d729e2SCédric Le Goater                                hwaddr offset, unsigned size);
122cebfeb9eSFrederic Barrat void xive2_tm_pull_os_ctx_ol(XivePresenter *xptr, XiveTCTX *tctx,
123cebfeb9eSFrederic Barrat                              hwaddr offset, uint64_t value, unsigned size);
124cfe9a7f2SGlenn Miles void xive2_tm_set_hv_target(XivePresenter *xptr, XiveTCTX *tctx,
125cfe9a7f2SGlenn Miles                             hwaddr offset, uint64_t value, unsigned size);
126*81939a92SGlenn Miles void xive2_tm_pull_phys_ctx_ol(XivePresenter *xptr, XiveTCTX *tctx,
127*81939a92SGlenn Miles                                hwaddr offset, uint64_t value, unsigned size);
128f8a233deSCédric Le Goater 
129f8a233deSCédric Le Goater #endif /* PPC_XIVE2_H */
130