xref: /qemu/include/hw/ppc/xive2.h (revision 14f11a20)
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);
56f8a233deSCédric Le Goater     uint8_t (*get_block_id)(Xive2Router *xrtr);
57e16032b8SCédric Le Goater     uint32_t (*get_config)(Xive2Router *xrtr);
58f8a233deSCédric Le Goater } Xive2RouterClass;
59f8a233deSCédric Le Goater 
60f8a233deSCédric Le Goater int xive2_router_get_eas(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx,
61f8a233deSCédric Le Goater                         Xive2Eas *eas);
62f8a233deSCédric Le Goater int xive2_router_get_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
63f8a233deSCédric Le Goater                         Xive2End *end);
64f8a233deSCédric Le Goater int xive2_router_write_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx,
65f8a233deSCédric Le Goater                           Xive2End *end, uint8_t word_number);
66f8a233deSCédric Le Goater int xive2_router_get_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
67f8a233deSCédric Le Goater                         Xive2Nvp *nvp);
68f8a233deSCédric Le Goater int xive2_router_write_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx,
69f8a233deSCédric Le Goater                           Xive2Nvp *nvp, uint8_t word_number);
70e16032b8SCédric Le Goater uint32_t xive2_router_get_config(Xive2Router *xrtr);
71f8a233deSCédric Le Goater 
720aa2612aSCédric Le Goater void xive2_router_notify(XiveNotifier *xn, uint32_t lisn, bool pq_checked);
73f8a233deSCédric Le Goater 
74f8a233deSCédric Le Goater /*
7509a67f3dSCédric Le Goater  * XIVE2 Presenter (POWER10)
7609a67f3dSCédric Le Goater  */
7709a67f3dSCédric Le Goater 
7809a67f3dSCédric Le Goater int xive2_presenter_tctx_match(XivePresenter *xptr, XiveTCTX *tctx,
7909a67f3dSCédric Le Goater                                uint8_t format,
8009a67f3dSCédric Le Goater                                uint8_t nvt_blk, uint32_t nvt_idx,
8109a67f3dSCédric Le Goater                                bool cam_ignore, uint32_t logic_serv);
8209a67f3dSCédric Le Goater 
8309a67f3dSCédric Le Goater /*
84f8a233deSCédric Le Goater  * XIVE2 END ESBs  (POWER10)
85f8a233deSCédric Le Goater  */
86f8a233deSCédric Le Goater 
87f8a233deSCédric Le Goater #define TYPE_XIVE2_END_SOURCE "xive2-end-source"
88f8a233deSCédric Le Goater OBJECT_DECLARE_SIMPLE_TYPE(Xive2EndSource, XIVE2_END_SOURCE)
89f8a233deSCédric Le Goater 
90f8a233deSCédric Le Goater typedef struct Xive2EndSource {
91f8a233deSCédric Le Goater     DeviceState parent;
92f8a233deSCédric Le Goater 
93f8a233deSCédric Le Goater     uint32_t        nr_ends;
94f8a233deSCédric Le Goater 
95f8a233deSCédric Le Goater     /* ESB memory region */
96f8a233deSCédric Le Goater     uint32_t        esb_shift;
97f8a233deSCédric Le Goater     MemoryRegion    esb_mmio;
98f8a233deSCédric Le Goater 
99f8a233deSCédric Le Goater     Xive2Router     *xrtr;
100f8a233deSCédric Le Goater } Xive2EndSource;
101f8a233deSCédric Le Goater 
10295d729e2SCédric Le Goater /*
10395d729e2SCédric Le Goater  * XIVE2 Thread Interrupt Management Area (POWER10)
10495d729e2SCédric Le Goater  */
10595d729e2SCédric Le Goater 
10695d729e2SCédric Le Goater void xive2_tm_push_os_ctx(XivePresenter *xptr, XiveTCTX *tctx, hwaddr offset,
10795d729e2SCédric Le Goater                            uint64_t value, unsigned size);
10895d729e2SCédric Le Goater uint64_t xive2_tm_pull_os_ctx(XivePresenter *xptr, XiveTCTX *tctx,
10995d729e2SCédric Le Goater                                hwaddr offset, unsigned size);
110f8a233deSCédric Le Goater 
111f8a233deSCédric Le Goater #endif /* PPC_XIVE2_H */
112