1 1.1 riastrad /* $NetBSD: interrupt.h,v 1.2 2021/12/18 23:45:31 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright(c) 2011-2016 Intel Corporation. All rights reserved. 5 1.1 riastrad * 6 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining a 7 1.1 riastrad * copy of this software and associated documentation files (the "Software"), 8 1.1 riastrad * to deal in the Software without restriction, including without limitation 9 1.1 riastrad * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 1.1 riastrad * and/or sell copies of the Software, and to permit persons to whom the 11 1.1 riastrad * Software is furnished to do so, subject to the following conditions: 12 1.1 riastrad * 13 1.1 riastrad * The above copyright notice and this permission notice (including the next 14 1.1 riastrad * paragraph) shall be included in all copies or substantial portions of the 15 1.1 riastrad * Software. 16 1.1 riastrad * 17 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 1.1 riastrad * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 1.1 riastrad * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 1.1 riastrad * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 1.1 riastrad * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 1.1 riastrad * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 1.1 riastrad * SOFTWARE. 24 1.1 riastrad * 25 1.1 riastrad * Authors: 26 1.1 riastrad * Kevin Tian <kevin.tian (at) intel.com> 27 1.1 riastrad * Zhi Wang <zhi.a.wang (at) intel.com> 28 1.1 riastrad * 29 1.1 riastrad * Contributors: 30 1.1 riastrad * Min he <min.he (at) intel.com> 31 1.1 riastrad * 32 1.1 riastrad */ 33 1.1 riastrad 34 1.1 riastrad #ifndef _GVT_INTERRUPT_H_ 35 1.1 riastrad #define _GVT_INTERRUPT_H_ 36 1.1 riastrad 37 1.1 riastrad #include <linux/types.h> 38 1.1 riastrad 39 1.1 riastrad enum intel_gvt_event_type { 40 1.1 riastrad RCS_MI_USER_INTERRUPT = 0, 41 1.1 riastrad RCS_DEBUG, 42 1.1 riastrad RCS_MMIO_SYNC_FLUSH, 43 1.1 riastrad RCS_CMD_STREAMER_ERR, 44 1.1 riastrad RCS_PIPE_CONTROL, 45 1.1 riastrad RCS_L3_PARITY_ERR, 46 1.1 riastrad RCS_WATCHDOG_EXCEEDED, 47 1.1 riastrad RCS_PAGE_DIRECTORY_FAULT, 48 1.1 riastrad RCS_AS_CONTEXT_SWITCH, 49 1.1 riastrad RCS_MONITOR_BUFF_HALF_FULL, 50 1.1 riastrad 51 1.1 riastrad VCS_MI_USER_INTERRUPT, 52 1.1 riastrad VCS_MMIO_SYNC_FLUSH, 53 1.1 riastrad VCS_CMD_STREAMER_ERR, 54 1.1 riastrad VCS_MI_FLUSH_DW, 55 1.1 riastrad VCS_WATCHDOG_EXCEEDED, 56 1.1 riastrad VCS_PAGE_DIRECTORY_FAULT, 57 1.1 riastrad VCS_AS_CONTEXT_SWITCH, 58 1.1 riastrad 59 1.1 riastrad VCS2_MI_USER_INTERRUPT, 60 1.1 riastrad VCS2_MI_FLUSH_DW, 61 1.1 riastrad VCS2_AS_CONTEXT_SWITCH, 62 1.1 riastrad 63 1.1 riastrad BCS_MI_USER_INTERRUPT, 64 1.1 riastrad BCS_MMIO_SYNC_FLUSH, 65 1.1 riastrad BCS_CMD_STREAMER_ERR, 66 1.1 riastrad BCS_MI_FLUSH_DW, 67 1.1 riastrad BCS_PAGE_DIRECTORY_FAULT, 68 1.1 riastrad BCS_AS_CONTEXT_SWITCH, 69 1.1 riastrad 70 1.1 riastrad VECS_MI_USER_INTERRUPT, 71 1.1 riastrad VECS_MI_FLUSH_DW, 72 1.1 riastrad VECS_AS_CONTEXT_SWITCH, 73 1.1 riastrad 74 1.1 riastrad PIPE_A_FIFO_UNDERRUN, 75 1.1 riastrad PIPE_B_FIFO_UNDERRUN, 76 1.1 riastrad PIPE_A_CRC_ERR, 77 1.1 riastrad PIPE_B_CRC_ERR, 78 1.1 riastrad PIPE_A_CRC_DONE, 79 1.1 riastrad PIPE_B_CRC_DONE, 80 1.1 riastrad PIPE_A_ODD_FIELD, 81 1.1 riastrad PIPE_B_ODD_FIELD, 82 1.1 riastrad PIPE_A_EVEN_FIELD, 83 1.1 riastrad PIPE_B_EVEN_FIELD, 84 1.1 riastrad PIPE_A_LINE_COMPARE, 85 1.1 riastrad PIPE_B_LINE_COMPARE, 86 1.1 riastrad PIPE_C_LINE_COMPARE, 87 1.1 riastrad PIPE_A_VBLANK, 88 1.1 riastrad PIPE_B_VBLANK, 89 1.1 riastrad PIPE_C_VBLANK, 90 1.1 riastrad PIPE_A_VSYNC, 91 1.1 riastrad PIPE_B_VSYNC, 92 1.1 riastrad PIPE_C_VSYNC, 93 1.1 riastrad PRIMARY_A_FLIP_DONE, 94 1.1 riastrad PRIMARY_B_FLIP_DONE, 95 1.1 riastrad PRIMARY_C_FLIP_DONE, 96 1.1 riastrad SPRITE_A_FLIP_DONE, 97 1.1 riastrad SPRITE_B_FLIP_DONE, 98 1.1 riastrad SPRITE_C_FLIP_DONE, 99 1.1 riastrad 100 1.1 riastrad PCU_THERMAL, 101 1.1 riastrad PCU_PCODE2DRIVER_MAILBOX, 102 1.1 riastrad 103 1.1 riastrad DPST_PHASE_IN, 104 1.1 riastrad DPST_HISTOGRAM, 105 1.1 riastrad GSE, 106 1.1 riastrad DP_A_HOTPLUG, 107 1.1 riastrad AUX_CHANNEL_A, 108 1.1 riastrad PERF_COUNTER, 109 1.1 riastrad POISON, 110 1.1 riastrad GTT_FAULT, 111 1.1 riastrad ERROR_INTERRUPT_COMBINED, 112 1.1 riastrad 113 1.1 riastrad FDI_RX_INTERRUPTS_TRANSCODER_A, 114 1.1 riastrad AUDIO_CP_CHANGE_TRANSCODER_A, 115 1.1 riastrad AUDIO_CP_REQUEST_TRANSCODER_A, 116 1.1 riastrad FDI_RX_INTERRUPTS_TRANSCODER_B, 117 1.1 riastrad AUDIO_CP_CHANGE_TRANSCODER_B, 118 1.1 riastrad AUDIO_CP_REQUEST_TRANSCODER_B, 119 1.1 riastrad FDI_RX_INTERRUPTS_TRANSCODER_C, 120 1.1 riastrad AUDIO_CP_CHANGE_TRANSCODER_C, 121 1.1 riastrad AUDIO_CP_REQUEST_TRANSCODER_C, 122 1.1 riastrad ERR_AND_DBG, 123 1.1 riastrad GMBUS, 124 1.1 riastrad SDVO_B_HOTPLUG, 125 1.1 riastrad CRT_HOTPLUG, 126 1.1 riastrad DP_B_HOTPLUG, 127 1.1 riastrad DP_C_HOTPLUG, 128 1.1 riastrad DP_D_HOTPLUG, 129 1.1 riastrad AUX_CHANNEL_B, 130 1.1 riastrad AUX_CHANNEL_C, 131 1.1 riastrad AUX_CHANNEL_D, 132 1.1 riastrad AUDIO_POWER_STATE_CHANGE_B, 133 1.1 riastrad AUDIO_POWER_STATE_CHANGE_C, 134 1.1 riastrad AUDIO_POWER_STATE_CHANGE_D, 135 1.1 riastrad 136 1.1 riastrad INTEL_GVT_EVENT_RESERVED, 137 1.1 riastrad INTEL_GVT_EVENT_MAX, 138 1.1 riastrad }; 139 1.1 riastrad 140 1.1 riastrad struct intel_gvt_irq; 141 1.1 riastrad struct intel_gvt; 142 1.1 riastrad struct intel_vgpu; 143 1.1 riastrad 144 1.1 riastrad typedef void (*gvt_event_virt_handler_t)(struct intel_gvt_irq *irq, 145 1.1 riastrad enum intel_gvt_event_type event, struct intel_vgpu *vgpu); 146 1.1 riastrad 147 1.1 riastrad struct intel_gvt_irq_ops { 148 1.1 riastrad void (*init_irq)(struct intel_gvt_irq *irq); 149 1.1 riastrad void (*check_pending_irq)(struct intel_vgpu *vgpu); 150 1.1 riastrad }; 151 1.1 riastrad 152 1.1 riastrad /* the list of physical interrupt control register groups */ 153 1.1 riastrad enum intel_gvt_irq_type { 154 1.1 riastrad INTEL_GVT_IRQ_INFO_GT, 155 1.1 riastrad INTEL_GVT_IRQ_INFO_DPY, 156 1.1 riastrad INTEL_GVT_IRQ_INFO_PCH, 157 1.1 riastrad INTEL_GVT_IRQ_INFO_PM, 158 1.1 riastrad 159 1.1 riastrad INTEL_GVT_IRQ_INFO_MASTER, 160 1.1 riastrad INTEL_GVT_IRQ_INFO_GT0, 161 1.1 riastrad INTEL_GVT_IRQ_INFO_GT1, 162 1.1 riastrad INTEL_GVT_IRQ_INFO_GT2, 163 1.1 riastrad INTEL_GVT_IRQ_INFO_GT3, 164 1.1 riastrad INTEL_GVT_IRQ_INFO_DE_PIPE_A, 165 1.1 riastrad INTEL_GVT_IRQ_INFO_DE_PIPE_B, 166 1.1 riastrad INTEL_GVT_IRQ_INFO_DE_PIPE_C, 167 1.1 riastrad INTEL_GVT_IRQ_INFO_DE_PORT, 168 1.1 riastrad INTEL_GVT_IRQ_INFO_DE_MISC, 169 1.1 riastrad INTEL_GVT_IRQ_INFO_AUD, 170 1.1 riastrad INTEL_GVT_IRQ_INFO_PCU, 171 1.1 riastrad 172 1.1 riastrad INTEL_GVT_IRQ_INFO_MAX, 173 1.1 riastrad }; 174 1.1 riastrad 175 1.1 riastrad #define INTEL_GVT_IRQ_BITWIDTH 32 176 1.1 riastrad 177 1.1 riastrad /* device specific interrupt bit definitions */ 178 1.1 riastrad struct intel_gvt_irq_info { 179 1.1 riastrad char *name; 180 1.1 riastrad i915_reg_t reg_base; 181 1.1 riastrad enum intel_gvt_event_type bit_to_event[INTEL_GVT_IRQ_BITWIDTH]; 182 1.1 riastrad unsigned long warned; 183 1.1 riastrad int group; 184 1.1 riastrad DECLARE_BITMAP(downstream_irq_bitmap, INTEL_GVT_IRQ_BITWIDTH); 185 1.1 riastrad bool has_upstream_irq; 186 1.1 riastrad }; 187 1.1 riastrad 188 1.1 riastrad /* per-event information */ 189 1.1 riastrad struct intel_gvt_event_info { 190 1.1 riastrad int bit; /* map to register bit */ 191 1.1 riastrad int policy; /* forwarding policy */ 192 1.1 riastrad struct intel_gvt_irq_info *info; /* register info */ 193 1.1 riastrad gvt_event_virt_handler_t v_handler; /* for v_event */ 194 1.1 riastrad }; 195 1.1 riastrad 196 1.1 riastrad struct intel_gvt_irq_map { 197 1.1 riastrad int up_irq_group; 198 1.1 riastrad int up_irq_bit; 199 1.1 riastrad int down_irq_group; 200 1.1 riastrad u32 down_irq_bitmask; 201 1.1 riastrad }; 202 1.1 riastrad 203 1.1 riastrad struct intel_gvt_vblank_timer { 204 1.1 riastrad struct hrtimer timer; 205 1.1 riastrad u64 period; 206 1.1 riastrad }; 207 1.1 riastrad 208 1.1 riastrad /* structure containing device specific IRQ state */ 209 1.1 riastrad struct intel_gvt_irq { 210 1.1 riastrad struct intel_gvt_irq_ops *ops; 211 1.1 riastrad struct intel_gvt_irq_info *info[INTEL_GVT_IRQ_INFO_MAX]; 212 1.1 riastrad DECLARE_BITMAP(irq_info_bitmap, INTEL_GVT_IRQ_INFO_MAX); 213 1.1 riastrad struct intel_gvt_event_info events[INTEL_GVT_EVENT_MAX]; 214 1.1 riastrad DECLARE_BITMAP(pending_events, INTEL_GVT_EVENT_MAX); 215 1.1 riastrad struct intel_gvt_irq_map *irq_map; 216 1.1 riastrad struct intel_gvt_vblank_timer vblank_timer; 217 1.1 riastrad }; 218 1.1 riastrad 219 1.1 riastrad int intel_gvt_init_irq(struct intel_gvt *gvt); 220 1.1 riastrad void intel_gvt_clean_irq(struct intel_gvt *gvt); 221 1.1 riastrad 222 1.1 riastrad void intel_vgpu_trigger_virtual_event(struct intel_vgpu *vgpu, 223 1.1 riastrad enum intel_gvt_event_type event); 224 1.1 riastrad 225 1.1 riastrad int intel_vgpu_reg_iir_handler(struct intel_vgpu *vgpu, unsigned int reg, 226 1.1 riastrad void *p_data, unsigned int bytes); 227 1.1 riastrad int intel_vgpu_reg_ier_handler(struct intel_vgpu *vgpu, 228 1.1 riastrad unsigned int reg, void *p_data, unsigned int bytes); 229 1.1 riastrad int intel_vgpu_reg_master_irq_handler(struct intel_vgpu *vgpu, 230 1.1 riastrad unsigned int reg, void *p_data, unsigned int bytes); 231 1.1 riastrad int intel_vgpu_reg_imr_handler(struct intel_vgpu *vgpu, 232 1.1 riastrad unsigned int reg, void *p_data, unsigned int bytes); 233 1.1 riastrad 234 1.1 riastrad int gvt_ring_id_to_pipe_control_notify_event(int ring_id); 235 1.1 riastrad int gvt_ring_id_to_mi_flush_dw_event(int ring_id); 236 1.1 riastrad int gvt_ring_id_to_mi_user_interrupt_event(int ring_id); 237 1.1 riastrad 238 1.1 riastrad #endif /* _GVT_INTERRUPT_H_ */ 239