17f4dd379Sjsg /* 27f4dd379Sjsg * Copyright © 2014-2017 Intel Corporation 37f4dd379Sjsg * 47f4dd379Sjsg * Permission is hereby granted, free of charge, to any person obtaining a 57f4dd379Sjsg * copy of this software and associated documentation files (the "Software"), 67f4dd379Sjsg * to deal in the Software without restriction, including without limitation 77f4dd379Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 87f4dd379Sjsg * and/or sell copies of the Software, and to permit persons to whom the 97f4dd379Sjsg * Software is furnished to do so, subject to the following conditions: 107f4dd379Sjsg * 117f4dd379Sjsg * The above copyright notice and this permission notice (including the next 127f4dd379Sjsg * paragraph) shall be included in all copies or substantial portions of the 137f4dd379Sjsg * Software. 147f4dd379Sjsg * 157f4dd379Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 167f4dd379Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 177f4dd379Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 187f4dd379Sjsg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 197f4dd379Sjsg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 207f4dd379Sjsg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 217f4dd379Sjsg * IN THE SOFTWARE. 227f4dd379Sjsg * 237f4dd379Sjsg */ 247f4dd379Sjsg 257f4dd379Sjsg #ifndef _INTEL_DEVICE_INFO_H_ 267f4dd379Sjsg #define _INTEL_DEVICE_INFO_H_ 277f4dd379Sjsg 28c349dbc7Sjsg #include <uapi/drm/i915_drm.h> 29c349dbc7Sjsg 305ca02815Sjsg #include "intel_step.h" 315ca02815Sjsg 32c349dbc7Sjsg #include "gt/intel_engine_types.h" 33c349dbc7Sjsg #include "gt/intel_context_types.h" 34c349dbc7Sjsg #include "gt/intel_sseu.h" 357f4dd379Sjsg 36*f005ef32Sjsg #include "gem/i915_gem_object_types.h" 37*f005ef32Sjsg 387f4dd379Sjsg struct drm_printer; 397f4dd379Sjsg struct drm_i915_private; 401bb76ff1Sjsg struct intel_gt_definition; 417f4dd379Sjsg 427f4dd379Sjsg /* Keep in gen based order, and chronological order within a gen */ 437f4dd379Sjsg enum intel_platform { 447f4dd379Sjsg INTEL_PLATFORM_UNINITIALIZED = 0, 457f4dd379Sjsg /* gen2 */ 467f4dd379Sjsg INTEL_I830, 477f4dd379Sjsg INTEL_I845G, 487f4dd379Sjsg INTEL_I85X, 497f4dd379Sjsg INTEL_I865G, 507f4dd379Sjsg /* gen3 */ 517f4dd379Sjsg INTEL_I915G, 527f4dd379Sjsg INTEL_I915GM, 537f4dd379Sjsg INTEL_I945G, 547f4dd379Sjsg INTEL_I945GM, 557f4dd379Sjsg INTEL_G33, 567f4dd379Sjsg INTEL_PINEVIEW, 577f4dd379Sjsg /* gen4 */ 587f4dd379Sjsg INTEL_I965G, 597f4dd379Sjsg INTEL_I965GM, 607f4dd379Sjsg INTEL_G45, 617f4dd379Sjsg INTEL_GM45, 627f4dd379Sjsg /* gen5 */ 637f4dd379Sjsg INTEL_IRONLAKE, 647f4dd379Sjsg /* gen6 */ 657f4dd379Sjsg INTEL_SANDYBRIDGE, 667f4dd379Sjsg /* gen7 */ 677f4dd379Sjsg INTEL_IVYBRIDGE, 687f4dd379Sjsg INTEL_VALLEYVIEW, 697f4dd379Sjsg INTEL_HASWELL, 707f4dd379Sjsg /* gen8 */ 717f4dd379Sjsg INTEL_BROADWELL, 727f4dd379Sjsg INTEL_CHERRYVIEW, 737f4dd379Sjsg /* gen9 */ 747f4dd379Sjsg INTEL_SKYLAKE, 757f4dd379Sjsg INTEL_BROXTON, 767f4dd379Sjsg INTEL_KABYLAKE, 777f4dd379Sjsg INTEL_GEMINILAKE, 787f4dd379Sjsg INTEL_COFFEELAKE, 79ad8b1aafSjsg INTEL_COMETLAKE, 807f4dd379Sjsg /* gen11 */ 817f4dd379Sjsg INTEL_ICELAKE, 82c349dbc7Sjsg INTEL_ELKHARTLAKE, 835ca02815Sjsg INTEL_JASPERLAKE, 84c349dbc7Sjsg /* gen12 */ 85c349dbc7Sjsg INTEL_TIGERLAKE, 86ad8b1aafSjsg INTEL_ROCKETLAKE, 87ad8b1aafSjsg INTEL_DG1, 885ca02815Sjsg INTEL_ALDERLAKE_S, 895ca02815Sjsg INTEL_ALDERLAKE_P, 905ca02815Sjsg INTEL_XEHPSDV, 915ca02815Sjsg INTEL_DG2, 921bb76ff1Sjsg INTEL_PONTEVECCHIO, 931bb76ff1Sjsg INTEL_METEORLAKE, 947f4dd379Sjsg INTEL_MAX_PLATFORMS 957f4dd379Sjsg }; 967f4dd379Sjsg 97c349dbc7Sjsg /* 98c349dbc7Sjsg * Subplatform bits share the same namespace per parent platform. In other words 99c349dbc7Sjsg * it is fine for the same bit to be used on multiple parent platforms. 100c349dbc7Sjsg */ 101c349dbc7Sjsg 1021bb76ff1Sjsg #define INTEL_SUBPLATFORM_BITS (3) 1035ca02815Sjsg #define INTEL_SUBPLATFORM_MASK (BIT(INTEL_SUBPLATFORM_BITS) - 1) 104c349dbc7Sjsg 105c349dbc7Sjsg /* HSW/BDW/SKL/KBL/CFL */ 106c349dbc7Sjsg #define INTEL_SUBPLATFORM_ULT (0) 107c349dbc7Sjsg #define INTEL_SUBPLATFORM_ULX (1) 108c349dbc7Sjsg 1095ca02815Sjsg /* ICL */ 110c349dbc7Sjsg #define INTEL_SUBPLATFORM_PORTF (0) 111c349dbc7Sjsg 1121bb76ff1Sjsg /* TGL */ 1131bb76ff1Sjsg #define INTEL_SUBPLATFORM_UY (0) 1141bb76ff1Sjsg 1155ca02815Sjsg /* DG2 */ 1165ca02815Sjsg #define INTEL_SUBPLATFORM_G10 0 1175ca02815Sjsg #define INTEL_SUBPLATFORM_G11 1 1181bb76ff1Sjsg #define INTEL_SUBPLATFORM_G12 2 1191bb76ff1Sjsg 1201bb76ff1Sjsg /* ADL */ 1211bb76ff1Sjsg #define INTEL_SUBPLATFORM_RPL 0 1221bb76ff1Sjsg 1231bb76ff1Sjsg /* ADL-P */ 1241bb76ff1Sjsg /* 1251bb76ff1Sjsg * As #define INTEL_SUBPLATFORM_RPL 0 will apply 1261bb76ff1Sjsg * here too, SUBPLATFORM_N will have different 1271bb76ff1Sjsg * bit set 1281bb76ff1Sjsg */ 1291bb76ff1Sjsg #define INTEL_SUBPLATFORM_N 1 130*f005ef32Sjsg #define INTEL_SUBPLATFORM_RPLU 2 1311bb76ff1Sjsg 1321bb76ff1Sjsg /* MTL */ 1331bb76ff1Sjsg #define INTEL_SUBPLATFORM_M 0 1341bb76ff1Sjsg #define INTEL_SUBPLATFORM_P 1 1355ca02815Sjsg 136c349dbc7Sjsg enum intel_ppgtt_type { 137c349dbc7Sjsg INTEL_PPGTT_NONE = I915_GEM_PPGTT_NONE, 138c349dbc7Sjsg INTEL_PPGTT_ALIASING = I915_GEM_PPGTT_ALIASING, 139c349dbc7Sjsg INTEL_PPGTT_FULL = I915_GEM_PPGTT_FULL, 140c349dbc7Sjsg }; 141c349dbc7Sjsg 1427f4dd379Sjsg #define DEV_INFO_FOR_EACH_FLAG(func) \ 1437f4dd379Sjsg func(is_mobile); \ 1447f4dd379Sjsg func(is_lp); \ 145c349dbc7Sjsg func(require_force_probe); \ 146c349dbc7Sjsg func(is_dgfx); \ 1477f4dd379Sjsg /* Keep has_* in alphabetical order */ \ 1487f4dd379Sjsg func(has_64bit_reloc); \ 1491bb76ff1Sjsg func(has_64k_pages); \ 150c349dbc7Sjsg func(gpu_reset_clobbers_display); \ 1517f4dd379Sjsg func(has_reset_engine); \ 1521bb76ff1Sjsg func(has_3d_pipeline); \ 1531bb76ff1Sjsg func(has_4tile); \ 1541bb76ff1Sjsg func(has_flat_ccs); \ 155c349dbc7Sjsg func(has_global_mocs); \ 156*f005ef32Sjsg func(has_gmd_id); \ 157c349dbc7Sjsg func(has_gt_uc); \ 1581bb76ff1Sjsg func(has_heci_pxp); \ 1591bb76ff1Sjsg func(has_heci_gscfi); \ 1601bb76ff1Sjsg func(has_guc_deprivilege); \ 1611bb76ff1Sjsg func(has_l3_ccs_read); \ 1627f4dd379Sjsg func(has_l3_dpf); \ 1637f4dd379Sjsg func(has_llc); \ 1647f4dd379Sjsg func(has_logical_ring_contexts); \ 1657f4dd379Sjsg func(has_logical_ring_elsq); \ 1661bb76ff1Sjsg func(has_media_ratio_mode); \ 1671bb76ff1Sjsg func(has_mslice_steering); \ 168*f005ef32Sjsg func(has_oa_bpc_reporting); \ 169*f005ef32Sjsg func(has_oa_slice_contrib_limits); \ 170*f005ef32Sjsg func(has_oam); \ 1711bb76ff1Sjsg func(has_one_eu_per_fuse_bit); \ 1721bb76ff1Sjsg func(has_pxp); \ 1737f4dd379Sjsg func(has_rc6); \ 1747f4dd379Sjsg func(has_rc6p); \ 175c349dbc7Sjsg func(has_rps); \ 1767f4dd379Sjsg func(has_runtime_pm); \ 1777f4dd379Sjsg func(has_snoop); \ 178c349dbc7Sjsg func(has_coherent_ggtt); \ 1791bb76ff1Sjsg func(tuning_thread_rr_after_dep); \ 1807f4dd379Sjsg func(unfenced_needs_alignment); \ 181c349dbc7Sjsg func(hws_needs_physical); 182c349dbc7Sjsg 183*f005ef32Sjsg struct intel_ip_version { 1845ca02815Sjsg u8 ver; 1851bb76ff1Sjsg u8 rel; 186*f005ef32Sjsg u8 step; 187c349dbc7Sjsg }; 188c349dbc7Sjsg 189c349dbc7Sjsg struct intel_runtime_info { 190*f005ef32Sjsg /* 191*f005ef32Sjsg * Single "graphics" IP version that represents 192*f005ef32Sjsg * render, compute and copy behavior. 193*f005ef32Sjsg */ 1941bb76ff1Sjsg struct { 195*f005ef32Sjsg struct intel_ip_version ip; 1961bb76ff1Sjsg } graphics; 1971bb76ff1Sjsg struct { 198*f005ef32Sjsg struct intel_ip_version ip; 1991bb76ff1Sjsg } media; 2001bb76ff1Sjsg 201c349dbc7Sjsg /* 202c349dbc7Sjsg * Platform mask is used for optimizing or-ed IS_PLATFORM calls into 2031bb76ff1Sjsg * single runtime conditionals, and also to provide groundwork for 2041bb76ff1Sjsg * future per platform, or per SKU build optimizations. 205c349dbc7Sjsg * 206c349dbc7Sjsg * Array can be extended when necessary if the corresponding 207c349dbc7Sjsg * BUILD_BUG_ON is hit. 208c349dbc7Sjsg */ 209c349dbc7Sjsg u32 platform_mask[2]; 210c349dbc7Sjsg 211c349dbc7Sjsg u16 device_id; 212c349dbc7Sjsg 213c349dbc7Sjsg u32 rawclk_freq; 2147f4dd379Sjsg 2155ca02815Sjsg struct intel_step_info step; 2161bb76ff1Sjsg 2171bb76ff1Sjsg unsigned int page_sizes; /* page sizes supported by the HW */ 2181bb76ff1Sjsg 2191bb76ff1Sjsg enum intel_ppgtt_type ppgtt_type; 2201bb76ff1Sjsg unsigned int ppgtt_size; /* log2, e.g. 31/32/48 bits */ 2211bb76ff1Sjsg 2221bb76ff1Sjsg bool has_pooled_eu; 2231bb76ff1Sjsg }; 2241bb76ff1Sjsg 2251bb76ff1Sjsg struct intel_device_info { 2261bb76ff1Sjsg enum intel_platform platform; 2271bb76ff1Sjsg 2281bb76ff1Sjsg unsigned int dma_mask_size; /* available DMA address bits */ 2291bb76ff1Sjsg 2301bb76ff1Sjsg const struct intel_gt_definition *extra_gt_list; 2311bb76ff1Sjsg 2321bb76ff1Sjsg u8 gt; /* GT number, 0 if undefined */ 2331bb76ff1Sjsg 234*f005ef32Sjsg intel_engine_mask_t platform_engine_mask; /* Engines supported by the HW */ 235*f005ef32Sjsg u32 memory_regions; /* regions supported by the HW */ 236*f005ef32Sjsg 2371bb76ff1Sjsg #define DEFINE_FLAG(name) u8 name:1 2381bb76ff1Sjsg DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG); 2391bb76ff1Sjsg #undef DEFINE_FLAG 2401bb76ff1Sjsg 2411bb76ff1Sjsg /* 2421bb76ff1Sjsg * Initial runtime info. Do not access outside of i915_driver_create(). 2431bb76ff1Sjsg */ 2441bb76ff1Sjsg const struct intel_runtime_info __runtime; 245*f005ef32Sjsg 246*f005ef32Sjsg u32 cachelevel_to_pat[I915_MAX_CACHE_LEVEL]; 247*f005ef32Sjsg u32 max_pat_index; 2487f4dd379Sjsg }; 2497f4dd379Sjsg 2507f4dd379Sjsg struct intel_driver_caps { 2517f4dd379Sjsg unsigned int scheduler; 2527f4dd379Sjsg bool has_logical_contexts:1; 2537f4dd379Sjsg }; 2547f4dd379Sjsg 2557f4dd379Sjsg const char *intel_platform_name(enum intel_platform platform); 2567f4dd379Sjsg 257*f005ef32Sjsg void intel_device_info_driver_create(struct drm_i915_private *i915, u16 device_id, 258*f005ef32Sjsg const struct intel_device_info *match_info); 259*f005ef32Sjsg void intel_device_info_runtime_init_early(struct drm_i915_private *dev_priv); 260c349dbc7Sjsg void intel_device_info_runtime_init(struct drm_i915_private *dev_priv); 261c349dbc7Sjsg 2621bb76ff1Sjsg void intel_device_info_print(const struct intel_device_info *info, 2631bb76ff1Sjsg const struct intel_runtime_info *runtime, 2647f4dd379Sjsg struct drm_printer *p); 2657f4dd379Sjsg 2667f4dd379Sjsg void intel_driver_caps_print(const struct intel_driver_caps *caps, 2677f4dd379Sjsg struct drm_printer *p); 2687f4dd379Sjsg 2697f4dd379Sjsg #endif 270