xref: /openbsd-src/sys/dev/pci/drm/i915/intel_device_info.h (revision 7d75b92ac3cdabdec06a2a7839e63c9d5d7bef57)
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