xref: /qemu/include/hw/ppc/xive2.h (revision 71569cd8aba31fcb3a326c56c307d2b811417c0b)
1f8a233deSCédric Le Goater /*
2f8a233deSCédric Le Goater  * QEMU PowerPC XIVE2 interrupt controller model  (POWER10)
3f8a233deSCédric Le Goater  *
49cb7f6ebSFrederic Barrat  * Copyright (c) 2019-2024, IBM Corporation.
5f8a233deSCédric Le Goater  *
69cb7f6ebSFrederic Barrat  * SPDX-License-Identifier: GPL-2.0-or-later
7f8a233deSCédric Le Goater  */
8f8a233deSCédric Le Goater 
9f8a233deSCédric Le Goater #ifndef PPC_XIVE2_H
10f8a233deSCédric Le Goater #define PPC_XIVE2_H
11f8a233deSCédric Le Goater 
1214f11a20SMarkus Armbruster #include "hw/ppc/xive.h"
13f8a233deSCédric Le Goater #include "hw/ppc/xive2_regs.h"
1414f11a20SMarkus Armbruster #include "hw/sysbus.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 
28e16032b8SCédric Le Goater /*
29e16032b8SCédric Le Goater  * Configuration flags
30e16032b8SCédric Le Goater  */
31e16032b8SCédric Le Goater 
32e16032b8SCédric Le Goater #define XIVE2_GEN1_TIMA_OS      0x00000001
33835806f1SCédric Le Goater #define XIVE2_VP_SAVE_RESTORE   0x00000002
3409a7e60cSCédric Le Goater #define XIVE2_THREADID_8BITS    0x00000004
35e16032b8SCédric Le Goater 
36f8a233deSCédric Le Goater typedef struct Xive2RouterClass {
37f8a233deSCédric Le Goater     SysBusDeviceClass parent;
38f8a233deSCédric Le Goater 
39f8a233deSCédric Le Goater     /* XIVE table accessors */
40f8a233deSCédric Le Goater     int (*get_eas)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
41f8a233deSCédric Le Goater                    Xive2Eas *eas);
420aa2612aSCédric Le Goater     int (*get_pq)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
430aa2612aSCédric Le Goater                   uint8_t *pq);
440aa2612aSCédric Le Goater     int (*set_pq)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
450aa2612aSCédric Le Goater                   uint8_t *pq);
46f8a233deSCédric Le Goater     int (*get_end)(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
47f8a233deSCédric Le Goater                    Xive2End *end);
48f8a233deSCédric Le Goater     int (*write_end)(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
49f8a233deSCédric Le Goater                      Xive2End *end, uint8_t word_number);
50f8a233deSCédric Le Goater     int (*get_nvp)(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
51f8a233deSCédric Le Goater                    Xive2Nvp *nvp);
52f8a233deSCédric Le Goater     int (*write_nvp)(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
53f8a233deSCédric Le Goater                      Xive2Nvp *nvp, uint8_t word_number);
5476798e12SFrederic Barrat     int (*get_nvgc)(Xive2Router *xrtr, bool crowd,
5576798e12SFrederic Barrat                     uint8_t nvgc_blk, uint32_t nvgc_idx,
5676798e12SFrederic Barrat                     Xive2Nvgc *nvgc);
5776798e12SFrederic Barrat     int (*write_nvgc)(Xive2Router *xrtr, bool crowd,
5876798e12SFrederic Barrat                       uint8_t nvgc_blk, uint32_t nvgc_idx,
5976798e12SFrederic Barrat                       Xive2Nvgc *nvgc);
60f8a233deSCédric Le Goater     uint8_t (*get_block_id)(Xive2Router *xrtr);
61e16032b8SCédric Le Goater     uint32_t (*get_config)(Xive2Router *xrtr);
62f8a233deSCédric Le Goater } Xive2RouterClass;
63f8a233deSCédric Le Goater 
64f8a233deSCédric Le Goater int xive2_router_get_eas(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
65f8a233deSCédric Le Goater                         Xive2Eas *eas);
66f8a233deSCédric Le Goater int xive2_router_get_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
67f8a233deSCédric Le Goater                         Xive2End *end);
68f8a233deSCédric Le Goater int xive2_router_write_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
69f8a233deSCédric Le Goater                           Xive2End *end, uint8_t word_number);
70f8a233deSCédric Le Goater int xive2_router_get_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
71f8a233deSCédric Le Goater                         Xive2Nvp *nvp);
72f8a233deSCédric Le Goater int xive2_router_write_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
73f8a233deSCédric Le Goater                           Xive2Nvp *nvp, uint8_t word_number);
7476798e12SFrederic Barrat int xive2_router_get_nvgc(Xive2Router *xrtr, bool crowd,
7576798e12SFrederic Barrat                           uint8_t nvgc_blk, uint32_t nvgc_idx,
7676798e12SFrederic Barrat                           Xive2Nvgc *nvgc);
7776798e12SFrederic Barrat int xive2_router_write_nvgc(Xive2Router *xrtr, bool crowd,
7876798e12SFrederic Barrat                             uint8_t nvgc_blk, uint32_t nvgc_idx,
7976798e12SFrederic Barrat                             Xive2Nvgc *nvgc);
80e16032b8SCédric Le Goater uint32_t xive2_router_get_config(Xive2Router *xrtr);
81f8a233deSCédric Le Goater 
820aa2612aSCédric Le Goater void xive2_router_notify(XiveNotifier *xn, uint32_t lisn, bool pq_checked);
83f8a233deSCédric Le Goater 
84f8a233deSCédric Le Goater /*
8509a67f3dSCédric Le Goater  * XIVE2 Presenter (POWER10)
8609a67f3dSCédric Le Goater  */
8709a67f3dSCédric Le Goater 
8809a67f3dSCédric Le Goater int xive2_presenter_tctx_match(XivePresenter *xptr, XiveTCTX *tctx,
8909a67f3dSCédric Le Goater                                uint8_t format,
9009a67f3dSCédric Le Goater                                uint8_t nvt_blk, uint32_t nvt_idx,
91*1a3cc120SFrederic Barrat                                bool crowd, bool cam_ignore,
92*1a3cc120SFrederic Barrat                                uint32_t logic_serv);
9309a67f3dSCédric Le Goater 
9496a2132cSFrederic Barrat uint64_t xive2_presenter_nvp_backlog_op(XivePresenter *xptr,
9596a2132cSFrederic Barrat                                         uint8_t blk, uint32_t idx,
9696a2132cSFrederic Barrat                                         uint16_t offset);
9796a2132cSFrederic Barrat 
9896a2132cSFrederic Barrat uint64_t xive2_presenter_nvgc_backlog_op(XivePresenter *xptr,
9996a2132cSFrederic Barrat                                          bool crowd,
10096a2132cSFrederic Barrat                                          uint8_t blk, uint32_t idx,
10196a2132cSFrederic Barrat                                          uint16_t offset, uint16_t val);
10296a2132cSFrederic Barrat 
10309a67f3dSCédric Le Goater /*
104f8a233deSCédric Le Goater  * XIVE2 END ESBs  (POWER10)
105f8a233deSCédric Le Goater  */
106f8a233deSCédric Le Goater 
107f8a233deSCédric Le Goater #define TYPE_XIVE2_END_SOURCE "xive2-end-source"
108f8a233deSCédric Le Goater OBJECT_DECLARE_SIMPLE_TYPE(Xive2EndSource, XIVE2_END_SOURCE)
109f8a233deSCédric Le Goater 
110f8a233deSCédric Le Goater typedef struct Xive2EndSource {
111f8a233deSCédric Le Goater     DeviceState parent;
112f8a233deSCédric Le Goater 
113f8a233deSCédric Le Goater     uint32_t        nr_ends;
114f8a233deSCédric Le Goater 
115f8a233deSCédric Le Goater     /* ESB memory region */
116f8a233deSCédric Le Goater     uint32_t        esb_shift;
117f8a233deSCédric Le Goater     MemoryRegion    esb_mmio;
118f8a233deSCédric Le Goater 
119f8a233deSCédric Le Goater     Xive2Router     *xrtr;
120f8a233deSCédric Le Goater } Xive2EndSource;
121f8a233deSCédric Le Goater 
12295d729e2SCédric Le Goater /*
12395d729e2SCédric Le Goater  * XIVE2 Thread Interrupt Management Area (POWER10)
12495d729e2SCédric Le Goater  */
12595d729e2SCédric Le Goater 
12626c55b99SFrederic Barrat void xive2_tm_set_hv_cppr(XivePresenter *xptr, XiveTCTX *tctx,
12726c55b99SFrederic Barrat                           hwaddr offset, uint64_t value, unsigned size);
12826c55b99SFrederic Barrat void xive2_tm_set_os_cppr(XivePresenter *xptr, XiveTCTX *tctx,
12926c55b99SFrederic Barrat                           hwaddr offset, uint64_t value, unsigned size);
13095d729e2SCédric Le Goater void xive2_tm_push_os_ctx(XivePresenter *xptr, XiveTCTX *tctx, hwaddr offset,
13195d729e2SCédric Le Goater                            uint64_t value, unsigned size);
13295d729e2SCédric Le Goater uint64_t xive2_tm_pull_os_ctx(XivePresenter *xptr, XiveTCTX *tctx,
13395d729e2SCédric Le Goater                                hwaddr offset, unsigned size);
134cebfeb9eSFrederic Barrat void xive2_tm_pull_os_ctx_ol(XivePresenter *xptr, XiveTCTX *tctx,
135cebfeb9eSFrederic Barrat                              hwaddr offset, uint64_t value, unsigned size);
1369cb7f6ebSFrederic Barrat bool xive2_tm_irq_precluded(XiveTCTX *tctx, int ring, uint8_t priority);
13758fa4433SFrederic Barrat void xive2_tm_set_lsmfb(XiveTCTX *tctx, int ring, uint8_t priority);
138cfe9a7f2SGlenn Miles void xive2_tm_set_hv_target(XivePresenter *xptr, XiveTCTX *tctx,
139cfe9a7f2SGlenn Miles                             hwaddr offset, uint64_t value, unsigned size);
14081939a92SGlenn Miles void xive2_tm_pull_phys_ctx_ol(XivePresenter *xptr, XiveTCTX *tctx,
14181939a92SGlenn Miles                                hwaddr offset, uint64_t value, unsigned size);
142f8a233deSCédric Le Goater 
143f8a233deSCédric Le Goater #endif /* PPC_XIVE2_H */
144