162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright © 2014-2017 Intel Corporation
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
562306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
662306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation
762306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
862306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
962306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * The above copyright notice and this permission notice (including the next
1262306a36Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the
1362306a36Sopenharmony_ci * Software.
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1662306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1762306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1862306a36Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1962306a36Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2062306a36Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
2162306a36Sopenharmony_ci * IN THE SOFTWARE.
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci */
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#ifndef _INTEL_DEVICE_INFO_H_
2662306a36Sopenharmony_ci#define _INTEL_DEVICE_INFO_H_
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#include <uapi/drm/i915_drm.h>
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#include "intel_step.h"
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#include "gt/intel_engine_types.h"
3362306a36Sopenharmony_ci#include "gt/intel_context_types.h"
3462306a36Sopenharmony_ci#include "gt/intel_sseu.h"
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#include "gem/i915_gem_object_types.h"
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistruct drm_printer;
3962306a36Sopenharmony_cistruct drm_i915_private;
4062306a36Sopenharmony_cistruct intel_gt_definition;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/* Keep in gen based order, and chronological order within a gen */
4362306a36Sopenharmony_cienum intel_platform {
4462306a36Sopenharmony_ci	INTEL_PLATFORM_UNINITIALIZED = 0,
4562306a36Sopenharmony_ci	/* gen2 */
4662306a36Sopenharmony_ci	INTEL_I830,
4762306a36Sopenharmony_ci	INTEL_I845G,
4862306a36Sopenharmony_ci	INTEL_I85X,
4962306a36Sopenharmony_ci	INTEL_I865G,
5062306a36Sopenharmony_ci	/* gen3 */
5162306a36Sopenharmony_ci	INTEL_I915G,
5262306a36Sopenharmony_ci	INTEL_I915GM,
5362306a36Sopenharmony_ci	INTEL_I945G,
5462306a36Sopenharmony_ci	INTEL_I945GM,
5562306a36Sopenharmony_ci	INTEL_G33,
5662306a36Sopenharmony_ci	INTEL_PINEVIEW,
5762306a36Sopenharmony_ci	/* gen4 */
5862306a36Sopenharmony_ci	INTEL_I965G,
5962306a36Sopenharmony_ci	INTEL_I965GM,
6062306a36Sopenharmony_ci	INTEL_G45,
6162306a36Sopenharmony_ci	INTEL_GM45,
6262306a36Sopenharmony_ci	/* gen5 */
6362306a36Sopenharmony_ci	INTEL_IRONLAKE,
6462306a36Sopenharmony_ci	/* gen6 */
6562306a36Sopenharmony_ci	INTEL_SANDYBRIDGE,
6662306a36Sopenharmony_ci	/* gen7 */
6762306a36Sopenharmony_ci	INTEL_IVYBRIDGE,
6862306a36Sopenharmony_ci	INTEL_VALLEYVIEW,
6962306a36Sopenharmony_ci	INTEL_HASWELL,
7062306a36Sopenharmony_ci	/* gen8 */
7162306a36Sopenharmony_ci	INTEL_BROADWELL,
7262306a36Sopenharmony_ci	INTEL_CHERRYVIEW,
7362306a36Sopenharmony_ci	/* gen9 */
7462306a36Sopenharmony_ci	INTEL_SKYLAKE,
7562306a36Sopenharmony_ci	INTEL_BROXTON,
7662306a36Sopenharmony_ci	INTEL_KABYLAKE,
7762306a36Sopenharmony_ci	INTEL_GEMINILAKE,
7862306a36Sopenharmony_ci	INTEL_COFFEELAKE,
7962306a36Sopenharmony_ci	INTEL_COMETLAKE,
8062306a36Sopenharmony_ci	/* gen11 */
8162306a36Sopenharmony_ci	INTEL_ICELAKE,
8262306a36Sopenharmony_ci	INTEL_ELKHARTLAKE,
8362306a36Sopenharmony_ci	INTEL_JASPERLAKE,
8462306a36Sopenharmony_ci	/* gen12 */
8562306a36Sopenharmony_ci	INTEL_TIGERLAKE,
8662306a36Sopenharmony_ci	INTEL_ROCKETLAKE,
8762306a36Sopenharmony_ci	INTEL_DG1,
8862306a36Sopenharmony_ci	INTEL_ALDERLAKE_S,
8962306a36Sopenharmony_ci	INTEL_ALDERLAKE_P,
9062306a36Sopenharmony_ci	INTEL_XEHPSDV,
9162306a36Sopenharmony_ci	INTEL_DG2,
9262306a36Sopenharmony_ci	INTEL_PONTEVECCHIO,
9362306a36Sopenharmony_ci	INTEL_METEORLAKE,
9462306a36Sopenharmony_ci	INTEL_MAX_PLATFORMS
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/*
9862306a36Sopenharmony_ci * Subplatform bits share the same namespace per parent platform. In other words
9962306a36Sopenharmony_ci * it is fine for the same bit to be used on multiple parent platforms.
10062306a36Sopenharmony_ci */
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_BITS (3)
10362306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_MASK (BIT(INTEL_SUBPLATFORM_BITS) - 1)
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci/* HSW/BDW/SKL/KBL/CFL */
10662306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_ULT	(0)
10762306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_ULX	(1)
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/* ICL */
11062306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_PORTF	(0)
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci/* TGL */
11362306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_UY	(0)
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/* DG2 */
11662306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_G10	0
11762306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_G11	1
11862306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_G12	2
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci/* ADL */
12162306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_RPL	0
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci/* ADL-P */
12462306a36Sopenharmony_ci/*
12562306a36Sopenharmony_ci * As #define INTEL_SUBPLATFORM_RPL 0 will apply
12662306a36Sopenharmony_ci * here too, SUBPLATFORM_N will have different
12762306a36Sopenharmony_ci * bit set
12862306a36Sopenharmony_ci */
12962306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_N    1
13062306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_RPLU  2
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci/* MTL */
13362306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_M	0
13462306a36Sopenharmony_ci#define INTEL_SUBPLATFORM_P	1
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_cienum intel_ppgtt_type {
13762306a36Sopenharmony_ci	INTEL_PPGTT_NONE = I915_GEM_PPGTT_NONE,
13862306a36Sopenharmony_ci	INTEL_PPGTT_ALIASING = I915_GEM_PPGTT_ALIASING,
13962306a36Sopenharmony_ci	INTEL_PPGTT_FULL = I915_GEM_PPGTT_FULL,
14062306a36Sopenharmony_ci};
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci#define DEV_INFO_FOR_EACH_FLAG(func) \
14362306a36Sopenharmony_ci	func(is_mobile); \
14462306a36Sopenharmony_ci	func(is_lp); \
14562306a36Sopenharmony_ci	func(require_force_probe); \
14662306a36Sopenharmony_ci	func(is_dgfx); \
14762306a36Sopenharmony_ci	/* Keep has_* in alphabetical order */ \
14862306a36Sopenharmony_ci	func(has_64bit_reloc); \
14962306a36Sopenharmony_ci	func(has_64k_pages); \
15062306a36Sopenharmony_ci	func(gpu_reset_clobbers_display); \
15162306a36Sopenharmony_ci	func(has_reset_engine); \
15262306a36Sopenharmony_ci	func(has_3d_pipeline); \
15362306a36Sopenharmony_ci	func(has_4tile); \
15462306a36Sopenharmony_ci	func(has_flat_ccs); \
15562306a36Sopenharmony_ci	func(has_global_mocs); \
15662306a36Sopenharmony_ci	func(has_gmd_id); \
15762306a36Sopenharmony_ci	func(has_gt_uc); \
15862306a36Sopenharmony_ci	func(has_heci_pxp); \
15962306a36Sopenharmony_ci	func(has_heci_gscfi); \
16062306a36Sopenharmony_ci	func(has_guc_deprivilege); \
16162306a36Sopenharmony_ci	func(has_l3_ccs_read); \
16262306a36Sopenharmony_ci	func(has_l3_dpf); \
16362306a36Sopenharmony_ci	func(has_llc); \
16462306a36Sopenharmony_ci	func(has_logical_ring_contexts); \
16562306a36Sopenharmony_ci	func(has_logical_ring_elsq); \
16662306a36Sopenharmony_ci	func(has_media_ratio_mode); \
16762306a36Sopenharmony_ci	func(has_mslice_steering); \
16862306a36Sopenharmony_ci	func(has_oa_bpc_reporting); \
16962306a36Sopenharmony_ci	func(has_oa_slice_contrib_limits); \
17062306a36Sopenharmony_ci	func(has_oam); \
17162306a36Sopenharmony_ci	func(has_one_eu_per_fuse_bit); \
17262306a36Sopenharmony_ci	func(has_pxp); \
17362306a36Sopenharmony_ci	func(has_rc6); \
17462306a36Sopenharmony_ci	func(has_rc6p); \
17562306a36Sopenharmony_ci	func(has_rps); \
17662306a36Sopenharmony_ci	func(has_runtime_pm); \
17762306a36Sopenharmony_ci	func(has_snoop); \
17862306a36Sopenharmony_ci	func(has_coherent_ggtt); \
17962306a36Sopenharmony_ci	func(tuning_thread_rr_after_dep); \
18062306a36Sopenharmony_ci	func(unfenced_needs_alignment); \
18162306a36Sopenharmony_ci	func(hws_needs_physical);
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cistruct intel_ip_version {
18462306a36Sopenharmony_ci	u8 ver;
18562306a36Sopenharmony_ci	u8 rel;
18662306a36Sopenharmony_ci	u8 step;
18762306a36Sopenharmony_ci};
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cistruct intel_runtime_info {
19062306a36Sopenharmony_ci	/*
19162306a36Sopenharmony_ci	 * Single "graphics" IP version that represents
19262306a36Sopenharmony_ci	 * render, compute and copy behavior.
19362306a36Sopenharmony_ci	 */
19462306a36Sopenharmony_ci	struct {
19562306a36Sopenharmony_ci		struct intel_ip_version ip;
19662306a36Sopenharmony_ci	} graphics;
19762306a36Sopenharmony_ci	struct {
19862306a36Sopenharmony_ci		struct intel_ip_version ip;
19962306a36Sopenharmony_ci	} media;
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	/*
20262306a36Sopenharmony_ci	 * Platform mask is used for optimizing or-ed IS_PLATFORM calls into
20362306a36Sopenharmony_ci	 * single runtime conditionals, and also to provide groundwork for
20462306a36Sopenharmony_ci	 * future per platform, or per SKU build optimizations.
20562306a36Sopenharmony_ci	 *
20662306a36Sopenharmony_ci	 * Array can be extended when necessary if the corresponding
20762306a36Sopenharmony_ci	 * BUILD_BUG_ON is hit.
20862306a36Sopenharmony_ci	 */
20962306a36Sopenharmony_ci	u32 platform_mask[2];
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	u16 device_id;
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	u32 rawclk_freq;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	struct intel_step_info step;
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	unsigned int page_sizes; /* page sizes supported by the HW */
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci	enum intel_ppgtt_type ppgtt_type;
22062306a36Sopenharmony_ci	unsigned int ppgtt_size; /* log2, e.g. 31/32/48 bits */
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci	bool has_pooled_eu;
22362306a36Sopenharmony_ci};
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_cistruct intel_device_info {
22662306a36Sopenharmony_ci	enum intel_platform platform;
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci	unsigned int dma_mask_size; /* available DMA address bits */
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	const struct intel_gt_definition *extra_gt_list;
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	u8 gt; /* GT number, 0 if undefined */
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	intel_engine_mask_t platform_engine_mask; /* Engines supported by the HW */
23562306a36Sopenharmony_ci	u32 memory_regions; /* regions supported by the HW */
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci#define DEFINE_FLAG(name) u8 name:1
23862306a36Sopenharmony_ci	DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG);
23962306a36Sopenharmony_ci#undef DEFINE_FLAG
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci	/*
24262306a36Sopenharmony_ci	 * Initial runtime info. Do not access outside of i915_driver_create().
24362306a36Sopenharmony_ci	 */
24462306a36Sopenharmony_ci	const struct intel_runtime_info __runtime;
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci	u32 cachelevel_to_pat[I915_MAX_CACHE_LEVEL];
24762306a36Sopenharmony_ci	u32 max_pat_index;
24862306a36Sopenharmony_ci};
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_cistruct intel_driver_caps {
25162306a36Sopenharmony_ci	unsigned int scheduler;
25262306a36Sopenharmony_ci	bool has_logical_contexts:1;
25362306a36Sopenharmony_ci};
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ciconst char *intel_platform_name(enum intel_platform platform);
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_civoid intel_device_info_driver_create(struct drm_i915_private *i915, u16 device_id,
25862306a36Sopenharmony_ci				     const struct intel_device_info *match_info);
25962306a36Sopenharmony_civoid intel_device_info_runtime_init_early(struct drm_i915_private *dev_priv);
26062306a36Sopenharmony_civoid intel_device_info_runtime_init(struct drm_i915_private *dev_priv);
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_civoid intel_device_info_print(const struct intel_device_info *info,
26362306a36Sopenharmony_ci			     const struct intel_runtime_info *runtime,
26462306a36Sopenharmony_ci			     struct drm_printer *p);
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_civoid intel_driver_caps_print(const struct intel_driver_caps *caps,
26762306a36Sopenharmony_ci			     struct drm_printer *p);
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci#endif
270