1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright © 2014-2017 Intel Corporation 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a 5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"), 6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation 7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the 9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the next 12*4882a593Smuzhiyun * paragraph) shall be included in all copies or substantial portions of the 13*4882a593Smuzhiyun * Software. 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*4882a593Smuzhiyun * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20*4882a593Smuzhiyun * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21*4882a593Smuzhiyun * IN THE SOFTWARE. 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #ifndef _INTEL_DEVICE_INFO_H_ 26*4882a593Smuzhiyun #define _INTEL_DEVICE_INFO_H_ 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #include <uapi/drm/i915_drm.h> 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #include "display/intel_display.h" 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #include "gt/intel_engine_types.h" 33*4882a593Smuzhiyun #include "gt/intel_context_types.h" 34*4882a593Smuzhiyun #include "gt/intel_sseu.h" 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun struct drm_printer; 37*4882a593Smuzhiyun struct drm_i915_private; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* Keep in gen based order, and chronological order within a gen */ 40*4882a593Smuzhiyun enum intel_platform { 41*4882a593Smuzhiyun INTEL_PLATFORM_UNINITIALIZED = 0, 42*4882a593Smuzhiyun /* gen2 */ 43*4882a593Smuzhiyun INTEL_I830, 44*4882a593Smuzhiyun INTEL_I845G, 45*4882a593Smuzhiyun INTEL_I85X, 46*4882a593Smuzhiyun INTEL_I865G, 47*4882a593Smuzhiyun /* gen3 */ 48*4882a593Smuzhiyun INTEL_I915G, 49*4882a593Smuzhiyun INTEL_I915GM, 50*4882a593Smuzhiyun INTEL_I945G, 51*4882a593Smuzhiyun INTEL_I945GM, 52*4882a593Smuzhiyun INTEL_G33, 53*4882a593Smuzhiyun INTEL_PINEVIEW, 54*4882a593Smuzhiyun /* gen4 */ 55*4882a593Smuzhiyun INTEL_I965G, 56*4882a593Smuzhiyun INTEL_I965GM, 57*4882a593Smuzhiyun INTEL_G45, 58*4882a593Smuzhiyun INTEL_GM45, 59*4882a593Smuzhiyun /* gen5 */ 60*4882a593Smuzhiyun INTEL_IRONLAKE, 61*4882a593Smuzhiyun /* gen6 */ 62*4882a593Smuzhiyun INTEL_SANDYBRIDGE, 63*4882a593Smuzhiyun /* gen7 */ 64*4882a593Smuzhiyun INTEL_IVYBRIDGE, 65*4882a593Smuzhiyun INTEL_VALLEYVIEW, 66*4882a593Smuzhiyun INTEL_HASWELL, 67*4882a593Smuzhiyun /* gen8 */ 68*4882a593Smuzhiyun INTEL_BROADWELL, 69*4882a593Smuzhiyun INTEL_CHERRYVIEW, 70*4882a593Smuzhiyun /* gen9 */ 71*4882a593Smuzhiyun INTEL_SKYLAKE, 72*4882a593Smuzhiyun INTEL_BROXTON, 73*4882a593Smuzhiyun INTEL_KABYLAKE, 74*4882a593Smuzhiyun INTEL_GEMINILAKE, 75*4882a593Smuzhiyun INTEL_COFFEELAKE, 76*4882a593Smuzhiyun INTEL_COMETLAKE, 77*4882a593Smuzhiyun /* gen10 */ 78*4882a593Smuzhiyun INTEL_CANNONLAKE, 79*4882a593Smuzhiyun /* gen11 */ 80*4882a593Smuzhiyun INTEL_ICELAKE, 81*4882a593Smuzhiyun INTEL_ELKHARTLAKE, 82*4882a593Smuzhiyun /* gen12 */ 83*4882a593Smuzhiyun INTEL_TIGERLAKE, 84*4882a593Smuzhiyun INTEL_ROCKETLAKE, 85*4882a593Smuzhiyun INTEL_DG1, 86*4882a593Smuzhiyun INTEL_MAX_PLATFORMS 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* 90*4882a593Smuzhiyun * Subplatform bits share the same namespace per parent platform. In other words 91*4882a593Smuzhiyun * it is fine for the same bit to be used on multiple parent platforms. 92*4882a593Smuzhiyun */ 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define INTEL_SUBPLATFORM_BITS (3) 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* HSW/BDW/SKL/KBL/CFL */ 97*4882a593Smuzhiyun #define INTEL_SUBPLATFORM_ULT (0) 98*4882a593Smuzhiyun #define INTEL_SUBPLATFORM_ULX (1) 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* CNL/ICL */ 101*4882a593Smuzhiyun #define INTEL_SUBPLATFORM_PORTF (0) 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun enum intel_ppgtt_type { 104*4882a593Smuzhiyun INTEL_PPGTT_NONE = I915_GEM_PPGTT_NONE, 105*4882a593Smuzhiyun INTEL_PPGTT_ALIASING = I915_GEM_PPGTT_ALIASING, 106*4882a593Smuzhiyun INTEL_PPGTT_FULL = I915_GEM_PPGTT_FULL, 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun #define DEV_INFO_FOR_EACH_FLAG(func) \ 110*4882a593Smuzhiyun func(is_mobile); \ 111*4882a593Smuzhiyun func(is_lp); \ 112*4882a593Smuzhiyun func(require_force_probe); \ 113*4882a593Smuzhiyun func(is_dgfx); \ 114*4882a593Smuzhiyun /* Keep has_* in alphabetical order */ \ 115*4882a593Smuzhiyun func(has_64bit_reloc); \ 116*4882a593Smuzhiyun func(gpu_reset_clobbers_display); \ 117*4882a593Smuzhiyun func(has_reset_engine); \ 118*4882a593Smuzhiyun func(has_fpga_dbg); \ 119*4882a593Smuzhiyun func(has_global_mocs); \ 120*4882a593Smuzhiyun func(has_gt_uc); \ 121*4882a593Smuzhiyun func(has_l3_dpf); \ 122*4882a593Smuzhiyun func(has_llc); \ 123*4882a593Smuzhiyun func(has_logical_ring_contexts); \ 124*4882a593Smuzhiyun func(has_logical_ring_elsq); \ 125*4882a593Smuzhiyun func(has_logical_ring_preemption); \ 126*4882a593Smuzhiyun func(has_master_unit_irq); \ 127*4882a593Smuzhiyun func(has_pooled_eu); \ 128*4882a593Smuzhiyun func(has_rc6); \ 129*4882a593Smuzhiyun func(has_rc6p); \ 130*4882a593Smuzhiyun func(has_rps); \ 131*4882a593Smuzhiyun func(has_runtime_pm); \ 132*4882a593Smuzhiyun func(has_snoop); \ 133*4882a593Smuzhiyun func(has_coherent_ggtt); \ 134*4882a593Smuzhiyun func(unfenced_needs_alignment); \ 135*4882a593Smuzhiyun func(hws_needs_physical); 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define DEV_INFO_DISPLAY_FOR_EACH_FLAG(func) \ 138*4882a593Smuzhiyun /* Keep in alphabetical order */ \ 139*4882a593Smuzhiyun func(cursor_needs_physical); \ 140*4882a593Smuzhiyun func(has_csr); \ 141*4882a593Smuzhiyun func(has_ddi); \ 142*4882a593Smuzhiyun func(has_dp_mst); \ 143*4882a593Smuzhiyun func(has_dsb); \ 144*4882a593Smuzhiyun func(has_dsc); \ 145*4882a593Smuzhiyun func(has_fbc); \ 146*4882a593Smuzhiyun func(has_gmch); \ 147*4882a593Smuzhiyun func(has_hdcp); \ 148*4882a593Smuzhiyun func(has_hotplug); \ 149*4882a593Smuzhiyun func(has_hti); \ 150*4882a593Smuzhiyun func(has_ipc); \ 151*4882a593Smuzhiyun func(has_modular_fia); \ 152*4882a593Smuzhiyun func(has_overlay); \ 153*4882a593Smuzhiyun func(has_psr); \ 154*4882a593Smuzhiyun func(has_psr_hw_tracking); \ 155*4882a593Smuzhiyun func(overlay_needs_physical); \ 156*4882a593Smuzhiyun func(supports_tv); 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun struct intel_device_info { 159*4882a593Smuzhiyun u16 gen_mask; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun u8 gen; 162*4882a593Smuzhiyun u8 gt; /* GT number, 0 if undefined */ 163*4882a593Smuzhiyun intel_engine_mask_t platform_engine_mask; /* Engines supported by the HW */ 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun enum intel_platform platform; 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun unsigned int dma_mask_size; /* available DMA address bits */ 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun enum intel_ppgtt_type ppgtt_type; 170*4882a593Smuzhiyun unsigned int ppgtt_size; /* log2, e.g. 31/32/48 bits */ 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun unsigned int page_sizes; /* page sizes supported by the HW */ 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun u32 memory_regions; /* regions supported by the HW */ 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun u32 display_mmio_offset; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun u8 pipe_mask; 179*4882a593Smuzhiyun u8 cpu_transcoder_mask; 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun u8 abox_mask; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun #define DEFINE_FLAG(name) u8 name:1 184*4882a593Smuzhiyun DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG); 185*4882a593Smuzhiyun #undef DEFINE_FLAG 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun struct { 188*4882a593Smuzhiyun #define DEFINE_FLAG(name) u8 name:1 189*4882a593Smuzhiyun DEV_INFO_DISPLAY_FOR_EACH_FLAG(DEFINE_FLAG); 190*4882a593Smuzhiyun #undef DEFINE_FLAG 191*4882a593Smuzhiyun } display; 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun u16 ddb_size; /* in blocks */ 194*4882a593Smuzhiyun u8 num_supported_dbuf_slices; /* number of DBuf slices */ 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun /* Register offsets for the various display pipes and transcoders */ 197*4882a593Smuzhiyun int pipe_offsets[I915_MAX_TRANSCODERS]; 198*4882a593Smuzhiyun int trans_offsets[I915_MAX_TRANSCODERS]; 199*4882a593Smuzhiyun int cursor_offsets[I915_MAX_PIPES]; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun struct color_luts { 202*4882a593Smuzhiyun u32 degamma_lut_size; 203*4882a593Smuzhiyun u32 gamma_lut_size; 204*4882a593Smuzhiyun u32 degamma_lut_tests; 205*4882a593Smuzhiyun u32 gamma_lut_tests; 206*4882a593Smuzhiyun } color; 207*4882a593Smuzhiyun }; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun struct intel_runtime_info { 210*4882a593Smuzhiyun /* 211*4882a593Smuzhiyun * Platform mask is used for optimizing or-ed IS_PLATFORM calls into 212*4882a593Smuzhiyun * into single runtime conditionals, and also to provide groundwork 213*4882a593Smuzhiyun * for future per platform, or per SKU build optimizations. 214*4882a593Smuzhiyun * 215*4882a593Smuzhiyun * Array can be extended when necessary if the corresponding 216*4882a593Smuzhiyun * BUILD_BUG_ON is hit. 217*4882a593Smuzhiyun */ 218*4882a593Smuzhiyun u32 platform_mask[2]; 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun u16 device_id; 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun u8 num_sprites[I915_MAX_PIPES]; 223*4882a593Smuzhiyun u8 num_scalers[I915_MAX_PIPES]; 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun u32 rawclk_freq; 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun u32 cs_timestamp_frequency_hz; 228*4882a593Smuzhiyun u32 cs_timestamp_period_ns; 229*4882a593Smuzhiyun }; 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun struct intel_driver_caps { 232*4882a593Smuzhiyun unsigned int scheduler; 233*4882a593Smuzhiyun bool has_logical_contexts:1; 234*4882a593Smuzhiyun }; 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun const char *intel_platform_name(enum intel_platform platform); 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun void intel_device_info_subplatform_init(struct drm_i915_private *dev_priv); 239*4882a593Smuzhiyun void intel_device_info_runtime_init(struct drm_i915_private *dev_priv); 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun void intel_device_info_print_static(const struct intel_device_info *info, 242*4882a593Smuzhiyun struct drm_printer *p); 243*4882a593Smuzhiyun void intel_device_info_print_runtime(const struct intel_runtime_info *info, 244*4882a593Smuzhiyun struct drm_printer *p); 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun void intel_driver_caps_print(const struct intel_driver_caps *caps, 247*4882a593Smuzhiyun struct drm_printer *p); 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun #endif 250