1 /* $OpenBSD: opal.h,v 1.19 2021/01/23 12:10:08 kettenis Exp $ */ 2 3 /* 4 * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #ifndef _MACHINE_OPAL_H_ 20 #define _MACHINE_OPAL_H_ 21 22 /* Tokens. */ 23 #define OPAL_TEST 0 24 #define OPAL_CONSOLE_WRITE 1 25 #define OPAL_CONSOLE_READ 2 26 #define OPAL_RTC_READ 3 27 #define OPAL_RTC_WRITE 4 28 #define OPAL_CEC_POWER_DOWN 5 29 #define OPAL_CEC_REBOOT 6 30 #define OPAL_HANDLE_INTERRUPT 9 31 #define OPAL_POLL_EVENTS 10 32 #define OPAL_PCI_CONFIG_READ_WORD 15 33 #define OPAL_PCI_CONFIG_WRITE_WORD 18 34 #define OPAL_SET_XIVE 19 35 #define OPAL_GET_XIVE 20 36 #define OPAL_PCI_EEH_FREEZE_STATUS 23 37 #define OPAL_PCI_EEH_FREEZE_CLEAR 26 38 #define OPAL_PCI_PHB_MMIO_ENABLE 27 39 #define OPAL_PCI_SET_PHB_MEM_WINDOW 28 40 #define OPAL_PCI_MAP_PE_MMIO_WINDOW 29 41 #define OPAL_PCI_SET_PE 31 42 #define OPAL_PCI_SET_XIVE_PE 37 43 #define OPAL_GET_MSI_32 39 44 #define OPAL_GET_MSI_64 40 45 #define OPAL_START_CPU 41 46 #define OPAL_PCI_MAP_PE_DMA_WINDOW 44 47 #define OPAL_PCI_MAP_PE_DMA_WINDOW_REAL 45 48 #define OPAL_PCI_RESET 49 49 #define OPAL_REINIT_CPUS 70 50 #define OPAL_CHECK_TOKEN 80 51 #define OPAL_SENSOR_READ 88 52 #define OPAL_IPMI_SEND 107 53 #define OPAL_IPMI_RECV 108 54 #define OPAL_CONSOLE_FLUSH 117 55 #define OPAL_XIVE_RESET 128 56 #define OPAL_XIVE_GET_IRQ_INFO 129 57 #define OPAL_XIVE_GET_IRQ_CONFIG 131 58 #define OPAL_XIVE_SET_IRQ_CONFIG 131 59 #define OPAL_XIVE_GET_QUEUE_INFO 132 60 #define OPAL_XIVE_SET_QUEUE_INFO 133 61 #define OPAL_XIVE_GET_VP_INFO 137 62 #define OPAL_XIVE_SET_VP_INFO 138 63 #define OPAL_XIVE_DUMP 142 64 #define OPAL_SENSOR_READ_U64 162 65 66 /* Return codes. */ 67 #define OPAL_SUCCESS 0 68 #define OPAL_PARAMETER -1 69 #define OPAL_BUSY -2 70 #define OPAL_PARTIAL -3 71 #define OPAL_CONSTRAINED -4 72 #define OPAL_CLOSED -5 73 #define OPAL_HARDWARE -6 74 #define OPAL_UNSUPPORTED -7 75 #define OPAL_PERMISSION -8 76 #define OPAL_NO_MEM -9 77 #define OPAL_RESOURCE -10 78 #define OPAL_INTERNAL_ERROR -11 79 #define OPAL_BUSY_EVENT -12 80 #define OPAL_HARDWARE_FROZEN -13 81 #define OPAL_WRONG_STATE -14 82 #define OPAL_ASYNC_COMPLETION -15 83 #define OPAL_EMPTY -16 84 85 /* OPAL_POLL_EVENT */ 86 #define OPAL_EVENT_CONSOLE_OUTPUT 0x00000008 87 #define OPAL_EVENT_CONSOLE_INPUT 0x00000010 88 89 /* OPAL_PCI_EEH_FREEZE_CLEAR */ 90 #define OPAL_EEH_ACTION_CLEAR_FREEZE_MMIO 1 91 #define OPAL_EEH_ACTION_CLEAR_FREEZE_DMA 2 92 #define OPAL_EEH_ACTION_CLEAR_FREEZE_ALL 3 93 94 /* OPAL_PCI_PHB_MMIO_ENABLE */ 95 #define OPAL_M32_WINDOW_TYPE 1 96 #define OPAL_M64_WINDOW_TYPE 2 97 #define OPAL_IO_WINDOW_TYPE 3 98 #define OPAL_DISABLE_M64 0 99 #define OPAL_ENABLE_M64_SPLIT 1 100 #define OPAL_ENABLE_M64_NON_SPLIT 2 101 102 /* OPAL_PCIE_SET_PE */ 103 #define OPAL_IGNORE_RID_BUS_NUMBER 0 104 #define OPAL_IGNORE_RID_DEVICE_NUMBER 0 105 #define OPAL_COMPARE_RID_DEVICE_NUMBER 1 106 #define OPAL_IGNORE_RID_FUNCTION_NUMBER 0 107 #define OPAL_COMPARE_RID_FUNCTION_NUMBER 1 108 #define OPAL_UNMAP_PE 0 109 #define OPAL_MAP_PE 1 110 111 /* OPAL_PCI_RESET */ 112 #define OPAL_RESET_PHB_COMPLETE 1 113 #define OPAL_RESET_PCI_LINK 2 114 #define OPAL_RESET_PHB_ERROR 3 115 #define OPAL_RESET_PCI_HOT 4 116 #define OPAL_RESET_PCI_FUNDAMENTAL 5 117 #define OPAL_RESET_PCI_IODA_TABLE 6 118 #define OPAL_DEASSERT_RESET 0 119 #define OPAL_ASSERT_RESET 1 120 121 /* OPAL_REINIT_CPUS */ 122 #define OPAL_REINIT_CPUS_HILE_BE 0x00000001 123 #define OPAL_REINIT_CPUS_HILE_LE 0x00000002 124 #define OPAL_REINIT_CPUS_MMU_HASH 0x00000004 125 #define OPAL_REINIT_CPUS_MMU_RADIX 0x00000008 126 #define OPAL_REINIT_CPUS_TM_SUSPEND_DISABLED 0x00000010 127 128 /* OPAL_CHECK_TOKEN */ 129 #define OPAL_TOKEN_ABSENT 0 130 #define OPAL_TOKEN_PRESENT 1 131 132 /* OPAL_IPMI_SEND/RECV */ 133 #define OPAL_IPMI_MSG_FORMAT_VERSION_1 1 134 135 #ifndef _LOCORE 136 struct opal_ipmi_msg { 137 uint8_t version; 138 uint8_t netfn; 139 uint8_t cmd; 140 uint8_t data[0]; 141 }; 142 #endif 143 144 /* OPAL_XIVE_RESET */ 145 #define OPAL_XIVE_MODE_EMU 0 146 #define OPAL_XIVE_MODE_EXPL 1 147 148 /* OPAL_XIVE_GET_IRQ_INFO */ 149 #define OPAL_XIVE_IRQ_TRIGGER_PAGE 0x00000001 150 #define OPAL_XIVE_IRQ_STORE_EOI 0x00000002 151 #define OPAL_XIVE_IRQ_LSI 0x00000004 152 #define OPAL_XIVE_IRQ_SHIFT_BUG 0x00000008 153 #define OPAL_XIVE_IRQ_MASK_VIA_FW 0x00000010 154 #define OPAL_XIVE_IRQ_EOI_VIA_FW 0x00000020 155 156 /* OPAL_XIVE_GET_QUEUE_INFO */ 157 #define OPAL_XIVE_EQ_ENABLED 0x00000001 158 #define OPAL_XIVE_EQ_ALWAYS_NOTIFY 0x00000002 159 #define OPAL_XIVE_EQ_ESCALATE 0x00000004 160 161 /* OPAL_XIVE_GET_VP_INFO */ 162 #define OPAL_XIVE_VP_ENABLED 0x00000001 163 #define OPAL_XIVE_VP_SINGLE_ESCALATION 0x00000002 164 165 /* OPAL_XIVE_DUMP */ 166 #define XIVE_DUMP_TM_HYP 0x00000000 167 #define XIVE_DUMP_TM_POOL 0x00000001 168 #define XIVE_DUMP_TM_OS 0x00000002 169 #define XIVE_DUMP_TM_USER 0x00000003 170 #define XIVE_DUMP_VP 0x00000004 171 #define XIVE_DUMP_EMU_STATE 0x00000005 172 173 #ifndef _LOCORE 174 175 void *opal_phys(void *); 176 177 int64_t opal_test(uint64_t); 178 int64_t opal_console_write(int64_t, int64_t *, const uint8_t *); 179 int64_t opal_console_read(int64_t, int64_t *, uint8_t *); 180 int64_t opal_rtc_read(uint32_t *, uint64_t *); 181 int64_t opal_rtc_write(uint32_t, uint64_t); 182 int64_t opal_cec_power_down(uint64_t); 183 int64_t opal_cec_reboot(void); 184 int64_t opal_handle_interrupt(uint32_t, uint64_t *); 185 int64_t opal_poll_events(uint64_t *); 186 int64_t opal_pci_config_read_word(uint64_t, uint64_t, uint64_t, uint32_t *); 187 int64_t opal_pci_config_write_word(uint64_t, uint64_t, uint64_t, uint32_t); 188 int64_t opal_set_xive(uint32_t, uint16_t, uint8_t); 189 int64_t opal_get_xive(uint32_t, uint16_t *, uint8_t *); 190 int64_t opal_pci_eeh_freeze_status(uint64_t, uint64_t, uint8_t *, 191 uint16_t *, uint64_t *); 192 int64_t opal_pci_eeh_freeze_clear(uint64_t, uint64_t, uint64_t); 193 int64_t opal_pci_phb_mmio_enable(uint64_t, uint16_t, uint16_t, uint16_t); 194 int64_t opal_pci_set_phb_mem_window(uint64_t, uint16_t, uint16_t, 195 uint64_t, uint64_t, uint64_t); 196 int64_t opal_pci_map_pe_mmio_window(uint64_t, uint64_t, uint16_t, 197 uint16_t, uint16_t); 198 int64_t opal_pci_set_pe(uint64_t, uint64_t, uint64_t, uint8_t, uint8_t, 199 uint8_t, uint8_t); 200 int64_t opal_pci_set_xive_pe(uint64_t, uint64_t, uint32_t); 201 int64_t opal_get_msi_32(uint64_t, uint32_t, uint32_t, uint8_t, 202 uint32_t *, uint32_t *); 203 int64_t opal_get_msi_64(uint64_t, uint32_t, uint32_t, uint8_t, 204 uint64_t *, uint32_t *); 205 int64_t opal_start_cpu(uint64_t, uint64_t); 206 int64_t opal_pci_map_pe_dma_window(uint64_t, uint64_t, uint16_t, uint16_t, 207 uint64_t, uint64_t, uint64_t); 208 int64_t opal_pci_map_pe_dma_window_real(uint64_t, uint64_t, uint16_t, 209 uint64_t, uint64_t); 210 int64_t opal_pci_reset(uint64_t, uint8_t, uint8_t); 211 int64_t opal_reinit_cpus(uint64_t); 212 int64_t opal_check_token(uint64_t); 213 int64_t opal_sensor_read(uint32_t, int, uint32_t *); 214 int64_t opal_ipmi_send(uint64_t, struct opal_ipmi_msg *, uint64_t); 215 int64_t opal_ipmi_recv(uint64_t, struct opal_ipmi_msg *, uint64_t *); 216 int64_t opal_console_flush(uint64_t); 217 int64_t opal_xive_reset(uint64_t); 218 int64_t opal_xive_get_irq_info(uint32_t, uint64_t *, uint64_t *, 219 uint64_t *, uint32_t *, uint32_t *); 220 int64_t opal_xive_get_irq_config(uint32_t, uint64_t *, uint8_t *, uint32_t *); 221 int64_t opal_xive_set_irq_config(uint32_t, uint64_t, uint8_t, uint32_t); 222 int64_t opal_xive_get_queue_info(uint64_t, uint8_t, uint64_t *, 223 uint64_t *, uint64_t *, uint32_t *, uint64_t *); 224 int64_t opal_xive_set_queue_info(uint64_t, uint8_t, uint64_t, 225 uint64_t, uint64_t); 226 int64_t opal_xive_get_vp_info(uint64_t, uint64_t *, uint64_t *, 227 uint64_t *, uint32_t *); 228 int64_t opal_xive_set_vp_info(uint64_t, uint64_t, uint64_t); 229 int64_t opal_xive_dump(uint32_t, uint32_t); 230 int64_t opal_sensor_read_u64(uint32_t, int, uint64_t *); 231 232 void opal_printf(const char *fmt, ...); 233 234 void *opal_intr_establish(uint64_t, int, int (*)(void *), void *); 235 236 #endif 237 238 #endif /* _MACHINE_OPAL_H_ */ 239