1 /* 2 * QEMU PowerPC XIVE2 interrupt controller model (POWER10) 3 * 4 * Copyright (c) 2019-2024, IBM Corporation. 5 * 6 * SPDX-License-Identifier: GPL-2.0-or-later 7 */ 8 9 #ifndef PPC_XIVE2_H 10 #define PPC_XIVE2_H 11 12 #include "hw/ppc/xive.h" 13 #include "hw/ppc/xive2_regs.h" 14 #include "hw/sysbus.h" 15 16 /* 17 * XIVE2 Router (POWER10) 18 */ 19 typedef struct Xive2Router { 20 SysBusDevice parent; 21 22 XiveFabric *xfb; 23 } Xive2Router; 24 25 #define TYPE_XIVE2_ROUTER "xive2-router" 26 OBJECT_DECLARE_TYPE(Xive2Router, Xive2RouterClass, XIVE2_ROUTER); 27 28 /* 29 * Configuration flags 30 */ 31 32 #define XIVE2_GEN1_TIMA_OS 0x00000001 33 #define XIVE2_VP_SAVE_RESTORE 0x00000002 34 #define XIVE2_THREADID_8BITS 0x00000004 35 36 typedef struct Xive2RouterClass { 37 SysBusDeviceClass parent; 38 39 /* XIVE table accessors */ 40 int (*get_eas)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx, 41 Xive2Eas *eas); 42 int (*get_pq)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx, 43 uint8_t *pq); 44 int (*set_pq)(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx, 45 uint8_t *pq); 46 int (*get_end)(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx, 47 Xive2End *end); 48 int (*write_end)(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx, 49 Xive2End *end, uint8_t word_number); 50 int (*get_nvp)(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx, 51 Xive2Nvp *nvp); 52 int (*write_nvp)(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx, 53 Xive2Nvp *nvp, uint8_t word_number); 54 int (*get_nvgc)(Xive2Router *xrtr, bool crowd, 55 uint8_t nvgc_blk, uint32_t nvgc_idx, 56 Xive2Nvgc *nvgc); 57 int (*write_nvgc)(Xive2Router *xrtr, bool crowd, 58 uint8_t nvgc_blk, uint32_t nvgc_idx, 59 Xive2Nvgc *nvgc); 60 uint8_t (*get_block_id)(Xive2Router *xrtr); 61 uint32_t (*get_config)(Xive2Router *xrtr); 62 } Xive2RouterClass; 63 64 int xive2_router_get_eas(Xive2Router *xrtr, uint8_t eas_blk, uint32_t eas_idx, 65 Xive2Eas *eas); 66 int xive2_router_get_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx, 67 Xive2End *end); 68 int xive2_router_write_end(Xive2Router *xrtr, uint8_t end_blk, uint32_t end_idx, 69 Xive2End *end, uint8_t word_number); 70 int xive2_router_get_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx, 71 Xive2Nvp *nvp); 72 int xive2_router_write_nvp(Xive2Router *xrtr, uint8_t nvp_blk, uint32_t nvp_idx, 73 Xive2Nvp *nvp, uint8_t word_number); 74 int xive2_router_get_nvgc(Xive2Router *xrtr, bool crowd, 75 uint8_t nvgc_blk, uint32_t nvgc_idx, 76 Xive2Nvgc *nvgc); 77 int xive2_router_write_nvgc(Xive2Router *xrtr, bool crowd, 78 uint8_t nvgc_blk, uint32_t nvgc_idx, 79 Xive2Nvgc *nvgc); 80 uint32_t xive2_router_get_config(Xive2Router *xrtr); 81 82 void xive2_router_notify(XiveNotifier *xn, uint32_t lisn, bool pq_checked); 83 84 /* 85 * XIVE2 Presenter (POWER10) 86 */ 87 88 int xive2_presenter_tctx_match(XivePresenter *xptr, XiveTCTX *tctx, 89 uint8_t format, 90 uint8_t nvt_blk, uint32_t nvt_idx, 91 bool cam_ignore, uint32_t logic_serv); 92 93 uint64_t xive2_presenter_nvp_backlog_op(XivePresenter *xptr, 94 uint8_t blk, uint32_t idx, 95 uint16_t offset); 96 97 uint64_t xive2_presenter_nvgc_backlog_op(XivePresenter *xptr, 98 bool crowd, 99 uint8_t blk, uint32_t idx, 100 uint16_t offset, uint16_t val); 101 102 /* 103 * XIVE2 END ESBs (POWER10) 104 */ 105 106 #define TYPE_XIVE2_END_SOURCE "xive2-end-source" 107 OBJECT_DECLARE_SIMPLE_TYPE(Xive2EndSource, XIVE2_END_SOURCE) 108 109 typedef struct Xive2EndSource { 110 DeviceState parent; 111 112 uint32_t nr_ends; 113 114 /* ESB memory region */ 115 uint32_t esb_shift; 116 MemoryRegion esb_mmio; 117 118 Xive2Router *xrtr; 119 } Xive2EndSource; 120 121 /* 122 * XIVE2 Thread Interrupt Management Area (POWER10) 123 */ 124 125 void xive2_tm_set_hv_cppr(XivePresenter *xptr, XiveTCTX *tctx, 126 hwaddr offset, uint64_t value, unsigned size); 127 void xive2_tm_set_os_cppr(XivePresenter *xptr, XiveTCTX *tctx, 128 hwaddr offset, uint64_t value, unsigned size); 129 void xive2_tm_push_os_ctx(XivePresenter *xptr, XiveTCTX *tctx, hwaddr offset, 130 uint64_t value, unsigned size); 131 uint64_t xive2_tm_pull_os_ctx(XivePresenter *xptr, XiveTCTX *tctx, 132 hwaddr offset, unsigned size); 133 void xive2_tm_pull_os_ctx_ol(XivePresenter *xptr, XiveTCTX *tctx, 134 hwaddr offset, uint64_t value, unsigned size); 135 bool xive2_tm_irq_precluded(XiveTCTX *tctx, int ring, uint8_t priority); 136 void xive2_tm_set_lsmfb(XiveTCTX *tctx, int ring, uint8_t priority); 137 void xive2_tm_set_hv_target(XivePresenter *xptr, XiveTCTX *tctx, 138 hwaddr offset, uint64_t value, unsigned size); 139 void xive2_tm_pull_phys_ctx_ol(XivePresenter *xptr, XiveTCTX *tctx, 140 hwaddr offset, uint64_t value, unsigned size); 141 142 #endif /* PPC_XIVE2_H */ 143