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