18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Copyright © 2016 Intel Corporation
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
58c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
68c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation
78c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
88c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
98c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
108c2ecf20Sopenharmony_ci *
118c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice (including the next
128c2ecf20Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the
138c2ecf20Sopenharmony_ci * Software.
148c2ecf20Sopenharmony_ci *
158c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
168c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
178c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
188c2ecf20Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
198c2ecf20Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
208c2ecf20Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
218c2ecf20Sopenharmony_ci * IN THE SOFTWARE.
228c2ecf20Sopenharmony_ci *
238c2ecf20Sopenharmony_ci */
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci#include <linux/console.h>
268c2ecf20Sopenharmony_ci#include <linux/vga_switcheroo.h>
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#include <drm/drm_drv.h>
298c2ecf20Sopenharmony_ci#include <drm/i915_pciids.h>
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci#include "display/intel_fbdev.h"
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci#include "i915_drv.h"
348c2ecf20Sopenharmony_ci#include "i915_perf.h"
358c2ecf20Sopenharmony_ci#include "i915_globals.h"
368c2ecf20Sopenharmony_ci#include "i915_selftest.h"
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci#define PLATFORM(x) .platform = (x)
398c2ecf20Sopenharmony_ci#define GEN(x) .gen = (x), .gen_mask = BIT((x) - 1)
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#define I845_PIPE_OFFSETS \
428c2ecf20Sopenharmony_ci	.pipe_offsets = { \
438c2ecf20Sopenharmony_ci		[TRANSCODER_A] = PIPE_A_OFFSET,	\
448c2ecf20Sopenharmony_ci	}, \
458c2ecf20Sopenharmony_ci	.trans_offsets = { \
468c2ecf20Sopenharmony_ci		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
478c2ecf20Sopenharmony_ci	}
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci#define I9XX_PIPE_OFFSETS \
508c2ecf20Sopenharmony_ci	.pipe_offsets = { \
518c2ecf20Sopenharmony_ci		[TRANSCODER_A] = PIPE_A_OFFSET,	\
528c2ecf20Sopenharmony_ci		[TRANSCODER_B] = PIPE_B_OFFSET, \
538c2ecf20Sopenharmony_ci	}, \
548c2ecf20Sopenharmony_ci	.trans_offsets = { \
558c2ecf20Sopenharmony_ci		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
568c2ecf20Sopenharmony_ci		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
578c2ecf20Sopenharmony_ci	}
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci#define IVB_PIPE_OFFSETS \
608c2ecf20Sopenharmony_ci	.pipe_offsets = { \
618c2ecf20Sopenharmony_ci		[TRANSCODER_A] = PIPE_A_OFFSET,	\
628c2ecf20Sopenharmony_ci		[TRANSCODER_B] = PIPE_B_OFFSET, \
638c2ecf20Sopenharmony_ci		[TRANSCODER_C] = PIPE_C_OFFSET, \
648c2ecf20Sopenharmony_ci	}, \
658c2ecf20Sopenharmony_ci	.trans_offsets = { \
668c2ecf20Sopenharmony_ci		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
678c2ecf20Sopenharmony_ci		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
688c2ecf20Sopenharmony_ci		[TRANSCODER_C] = TRANSCODER_C_OFFSET, \
698c2ecf20Sopenharmony_ci	}
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci#define HSW_PIPE_OFFSETS \
728c2ecf20Sopenharmony_ci	.pipe_offsets = { \
738c2ecf20Sopenharmony_ci		[TRANSCODER_A] = PIPE_A_OFFSET,	\
748c2ecf20Sopenharmony_ci		[TRANSCODER_B] = PIPE_B_OFFSET, \
758c2ecf20Sopenharmony_ci		[TRANSCODER_C] = PIPE_C_OFFSET, \
768c2ecf20Sopenharmony_ci		[TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
778c2ecf20Sopenharmony_ci	}, \
788c2ecf20Sopenharmony_ci	.trans_offsets = { \
798c2ecf20Sopenharmony_ci		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
808c2ecf20Sopenharmony_ci		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
818c2ecf20Sopenharmony_ci		[TRANSCODER_C] = TRANSCODER_C_OFFSET, \
828c2ecf20Sopenharmony_ci		[TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
838c2ecf20Sopenharmony_ci	}
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci#define CHV_PIPE_OFFSETS \
868c2ecf20Sopenharmony_ci	.pipe_offsets = { \
878c2ecf20Sopenharmony_ci		[TRANSCODER_A] = PIPE_A_OFFSET, \
888c2ecf20Sopenharmony_ci		[TRANSCODER_B] = PIPE_B_OFFSET, \
898c2ecf20Sopenharmony_ci		[TRANSCODER_C] = CHV_PIPE_C_OFFSET, \
908c2ecf20Sopenharmony_ci	}, \
918c2ecf20Sopenharmony_ci	.trans_offsets = { \
928c2ecf20Sopenharmony_ci		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
938c2ecf20Sopenharmony_ci		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
948c2ecf20Sopenharmony_ci		[TRANSCODER_C] = CHV_TRANSCODER_C_OFFSET, \
958c2ecf20Sopenharmony_ci	}
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci#define I845_CURSOR_OFFSETS \
988c2ecf20Sopenharmony_ci	.cursor_offsets = { \
998c2ecf20Sopenharmony_ci		[PIPE_A] = CURSOR_A_OFFSET, \
1008c2ecf20Sopenharmony_ci	}
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci#define I9XX_CURSOR_OFFSETS \
1038c2ecf20Sopenharmony_ci	.cursor_offsets = { \
1048c2ecf20Sopenharmony_ci		[PIPE_A] = CURSOR_A_OFFSET, \
1058c2ecf20Sopenharmony_ci		[PIPE_B] = CURSOR_B_OFFSET, \
1068c2ecf20Sopenharmony_ci	}
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci#define CHV_CURSOR_OFFSETS \
1098c2ecf20Sopenharmony_ci	.cursor_offsets = { \
1108c2ecf20Sopenharmony_ci		[PIPE_A] = CURSOR_A_OFFSET, \
1118c2ecf20Sopenharmony_ci		[PIPE_B] = CURSOR_B_OFFSET, \
1128c2ecf20Sopenharmony_ci		[PIPE_C] = CHV_CURSOR_C_OFFSET, \
1138c2ecf20Sopenharmony_ci	}
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci#define IVB_CURSOR_OFFSETS \
1168c2ecf20Sopenharmony_ci	.cursor_offsets = { \
1178c2ecf20Sopenharmony_ci		[PIPE_A] = CURSOR_A_OFFSET, \
1188c2ecf20Sopenharmony_ci		[PIPE_B] = IVB_CURSOR_B_OFFSET, \
1198c2ecf20Sopenharmony_ci		[PIPE_C] = IVB_CURSOR_C_OFFSET, \
1208c2ecf20Sopenharmony_ci	}
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci#define TGL_CURSOR_OFFSETS \
1238c2ecf20Sopenharmony_ci	.cursor_offsets = { \
1248c2ecf20Sopenharmony_ci		[PIPE_A] = CURSOR_A_OFFSET, \
1258c2ecf20Sopenharmony_ci		[PIPE_B] = IVB_CURSOR_B_OFFSET, \
1268c2ecf20Sopenharmony_ci		[PIPE_C] = IVB_CURSOR_C_OFFSET, \
1278c2ecf20Sopenharmony_ci		[PIPE_D] = TGL_CURSOR_D_OFFSET, \
1288c2ecf20Sopenharmony_ci	}
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ci#define I9XX_COLORS \
1318c2ecf20Sopenharmony_ci	.color = { .gamma_lut_size = 256 }
1328c2ecf20Sopenharmony_ci#define I965_COLORS \
1338c2ecf20Sopenharmony_ci	.color = { .gamma_lut_size = 129, \
1348c2ecf20Sopenharmony_ci		   .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
1358c2ecf20Sopenharmony_ci	}
1368c2ecf20Sopenharmony_ci#define ILK_COLORS \
1378c2ecf20Sopenharmony_ci	.color = { .gamma_lut_size = 1024 }
1388c2ecf20Sopenharmony_ci#define IVB_COLORS \
1398c2ecf20Sopenharmony_ci	.color = { .degamma_lut_size = 1024, .gamma_lut_size = 1024 }
1408c2ecf20Sopenharmony_ci#define CHV_COLORS \
1418c2ecf20Sopenharmony_ci	.color = { .degamma_lut_size = 65, .gamma_lut_size = 257, \
1428c2ecf20Sopenharmony_ci		   .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
1438c2ecf20Sopenharmony_ci		   .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
1448c2ecf20Sopenharmony_ci	}
1458c2ecf20Sopenharmony_ci#define GLK_COLORS \
1468c2ecf20Sopenharmony_ci	.color = { .degamma_lut_size = 33, .gamma_lut_size = 1024, \
1478c2ecf20Sopenharmony_ci		   .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
1488c2ecf20Sopenharmony_ci					DRM_COLOR_LUT_EQUAL_CHANNELS, \
1498c2ecf20Sopenharmony_ci	}
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci/* Keep in gen based order, and chronological order within a gen */
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci#define GEN_DEFAULT_PAGE_SIZES \
1548c2ecf20Sopenharmony_ci	.page_sizes = I915_GTT_PAGE_SIZE_4K
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci#define GEN_DEFAULT_REGIONS \
1578c2ecf20Sopenharmony_ci	.memory_regions = REGION_SMEM | REGION_STOLEN
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci#define I830_FEATURES \
1608c2ecf20Sopenharmony_ci	GEN(2), \
1618c2ecf20Sopenharmony_ci	.is_mobile = 1, \
1628c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
1638c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
1648c2ecf20Sopenharmony_ci	.display.has_overlay = 1, \
1658c2ecf20Sopenharmony_ci	.display.cursor_needs_physical = 1, \
1668c2ecf20Sopenharmony_ci	.display.overlay_needs_physical = 1, \
1678c2ecf20Sopenharmony_ci	.display.has_gmch = 1, \
1688c2ecf20Sopenharmony_ci	.gpu_reset_clobbers_display = true, \
1698c2ecf20Sopenharmony_ci	.hws_needs_physical = 1, \
1708c2ecf20Sopenharmony_ci	.unfenced_needs_alignment = 1, \
1718c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0), \
1728c2ecf20Sopenharmony_ci	.has_snoop = true, \
1738c2ecf20Sopenharmony_ci	.has_coherent_ggtt = false, \
1748c2ecf20Sopenharmony_ci	.dma_mask_size = 32, \
1758c2ecf20Sopenharmony_ci	I9XX_PIPE_OFFSETS, \
1768c2ecf20Sopenharmony_ci	I9XX_CURSOR_OFFSETS, \
1778c2ecf20Sopenharmony_ci	I9XX_COLORS, \
1788c2ecf20Sopenharmony_ci	GEN_DEFAULT_PAGE_SIZES, \
1798c2ecf20Sopenharmony_ci	GEN_DEFAULT_REGIONS
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci#define I845_FEATURES \
1828c2ecf20Sopenharmony_ci	GEN(2), \
1838c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A), \
1848c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A), \
1858c2ecf20Sopenharmony_ci	.display.has_overlay = 1, \
1868c2ecf20Sopenharmony_ci	.display.overlay_needs_physical = 1, \
1878c2ecf20Sopenharmony_ci	.display.has_gmch = 1, \
1888c2ecf20Sopenharmony_ci	.gpu_reset_clobbers_display = true, \
1898c2ecf20Sopenharmony_ci	.hws_needs_physical = 1, \
1908c2ecf20Sopenharmony_ci	.unfenced_needs_alignment = 1, \
1918c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0), \
1928c2ecf20Sopenharmony_ci	.has_snoop = true, \
1938c2ecf20Sopenharmony_ci	.has_coherent_ggtt = false, \
1948c2ecf20Sopenharmony_ci	.dma_mask_size = 32, \
1958c2ecf20Sopenharmony_ci	I845_PIPE_OFFSETS, \
1968c2ecf20Sopenharmony_ci	I845_CURSOR_OFFSETS, \
1978c2ecf20Sopenharmony_ci	I9XX_COLORS, \
1988c2ecf20Sopenharmony_ci	GEN_DEFAULT_PAGE_SIZES, \
1998c2ecf20Sopenharmony_ci	GEN_DEFAULT_REGIONS
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_cistatic const struct intel_device_info i830_info = {
2028c2ecf20Sopenharmony_ci	I830_FEATURES,
2038c2ecf20Sopenharmony_ci	PLATFORM(INTEL_I830),
2048c2ecf20Sopenharmony_ci};
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_cistatic const struct intel_device_info i845g_info = {
2078c2ecf20Sopenharmony_ci	I845_FEATURES,
2088c2ecf20Sopenharmony_ci	PLATFORM(INTEL_I845G),
2098c2ecf20Sopenharmony_ci};
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_cistatic const struct intel_device_info i85x_info = {
2128c2ecf20Sopenharmony_ci	I830_FEATURES,
2138c2ecf20Sopenharmony_ci	PLATFORM(INTEL_I85X),
2148c2ecf20Sopenharmony_ci	.display.has_fbc = 1,
2158c2ecf20Sopenharmony_ci};
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_cistatic const struct intel_device_info i865g_info = {
2188c2ecf20Sopenharmony_ci	I845_FEATURES,
2198c2ecf20Sopenharmony_ci	PLATFORM(INTEL_I865G),
2208c2ecf20Sopenharmony_ci	.display.has_fbc = 1,
2218c2ecf20Sopenharmony_ci};
2228c2ecf20Sopenharmony_ci
2238c2ecf20Sopenharmony_ci#define GEN3_FEATURES \
2248c2ecf20Sopenharmony_ci	GEN(3), \
2258c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
2268c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
2278c2ecf20Sopenharmony_ci	.display.has_gmch = 1, \
2288c2ecf20Sopenharmony_ci	.gpu_reset_clobbers_display = true, \
2298c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0), \
2308c2ecf20Sopenharmony_ci	.has_snoop = true, \
2318c2ecf20Sopenharmony_ci	.has_coherent_ggtt = true, \
2328c2ecf20Sopenharmony_ci	.dma_mask_size = 32, \
2338c2ecf20Sopenharmony_ci	I9XX_PIPE_OFFSETS, \
2348c2ecf20Sopenharmony_ci	I9XX_CURSOR_OFFSETS, \
2358c2ecf20Sopenharmony_ci	I9XX_COLORS, \
2368c2ecf20Sopenharmony_ci	GEN_DEFAULT_PAGE_SIZES, \
2378c2ecf20Sopenharmony_ci	GEN_DEFAULT_REGIONS
2388c2ecf20Sopenharmony_ci
2398c2ecf20Sopenharmony_cistatic const struct intel_device_info i915g_info = {
2408c2ecf20Sopenharmony_ci	GEN3_FEATURES,
2418c2ecf20Sopenharmony_ci	PLATFORM(INTEL_I915G),
2428c2ecf20Sopenharmony_ci	.has_coherent_ggtt = false,
2438c2ecf20Sopenharmony_ci	.display.cursor_needs_physical = 1,
2448c2ecf20Sopenharmony_ci	.display.has_overlay = 1,
2458c2ecf20Sopenharmony_ci	.display.overlay_needs_physical = 1,
2468c2ecf20Sopenharmony_ci	.hws_needs_physical = 1,
2478c2ecf20Sopenharmony_ci	.unfenced_needs_alignment = 1,
2488c2ecf20Sopenharmony_ci};
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_cistatic const struct intel_device_info i915gm_info = {
2518c2ecf20Sopenharmony_ci	GEN3_FEATURES,
2528c2ecf20Sopenharmony_ci	PLATFORM(INTEL_I915GM),
2538c2ecf20Sopenharmony_ci	.is_mobile = 1,
2548c2ecf20Sopenharmony_ci	.display.cursor_needs_physical = 1,
2558c2ecf20Sopenharmony_ci	.display.has_overlay = 1,
2568c2ecf20Sopenharmony_ci	.display.overlay_needs_physical = 1,
2578c2ecf20Sopenharmony_ci	.display.supports_tv = 1,
2588c2ecf20Sopenharmony_ci	.display.has_fbc = 1,
2598c2ecf20Sopenharmony_ci	.hws_needs_physical = 1,
2608c2ecf20Sopenharmony_ci	.unfenced_needs_alignment = 1,
2618c2ecf20Sopenharmony_ci};
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_cistatic const struct intel_device_info i945g_info = {
2648c2ecf20Sopenharmony_ci	GEN3_FEATURES,
2658c2ecf20Sopenharmony_ci	PLATFORM(INTEL_I945G),
2668c2ecf20Sopenharmony_ci	.display.has_hotplug = 1,
2678c2ecf20Sopenharmony_ci	.display.cursor_needs_physical = 1,
2688c2ecf20Sopenharmony_ci	.display.has_overlay = 1,
2698c2ecf20Sopenharmony_ci	.display.overlay_needs_physical = 1,
2708c2ecf20Sopenharmony_ci	.hws_needs_physical = 1,
2718c2ecf20Sopenharmony_ci	.unfenced_needs_alignment = 1,
2728c2ecf20Sopenharmony_ci};
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_cistatic const struct intel_device_info i945gm_info = {
2758c2ecf20Sopenharmony_ci	GEN3_FEATURES,
2768c2ecf20Sopenharmony_ci	PLATFORM(INTEL_I945GM),
2778c2ecf20Sopenharmony_ci	.is_mobile = 1,
2788c2ecf20Sopenharmony_ci	.display.has_hotplug = 1,
2798c2ecf20Sopenharmony_ci	.display.cursor_needs_physical = 1,
2808c2ecf20Sopenharmony_ci	.display.has_overlay = 1,
2818c2ecf20Sopenharmony_ci	.display.overlay_needs_physical = 1,
2828c2ecf20Sopenharmony_ci	.display.supports_tv = 1,
2838c2ecf20Sopenharmony_ci	.display.has_fbc = 1,
2848c2ecf20Sopenharmony_ci	.hws_needs_physical = 1,
2858c2ecf20Sopenharmony_ci	.unfenced_needs_alignment = 1,
2868c2ecf20Sopenharmony_ci};
2878c2ecf20Sopenharmony_ci
2888c2ecf20Sopenharmony_cistatic const struct intel_device_info g33_info = {
2898c2ecf20Sopenharmony_ci	GEN3_FEATURES,
2908c2ecf20Sopenharmony_ci	PLATFORM(INTEL_G33),
2918c2ecf20Sopenharmony_ci	.display.has_hotplug = 1,
2928c2ecf20Sopenharmony_ci	.display.has_overlay = 1,
2938c2ecf20Sopenharmony_ci	.dma_mask_size = 36,
2948c2ecf20Sopenharmony_ci};
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_cistatic const struct intel_device_info pnv_g_info = {
2978c2ecf20Sopenharmony_ci	GEN3_FEATURES,
2988c2ecf20Sopenharmony_ci	PLATFORM(INTEL_PINEVIEW),
2998c2ecf20Sopenharmony_ci	.display.has_hotplug = 1,
3008c2ecf20Sopenharmony_ci	.display.has_overlay = 1,
3018c2ecf20Sopenharmony_ci	.dma_mask_size = 36,
3028c2ecf20Sopenharmony_ci};
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_cistatic const struct intel_device_info pnv_m_info = {
3058c2ecf20Sopenharmony_ci	GEN3_FEATURES,
3068c2ecf20Sopenharmony_ci	PLATFORM(INTEL_PINEVIEW),
3078c2ecf20Sopenharmony_ci	.is_mobile = 1,
3088c2ecf20Sopenharmony_ci	.display.has_hotplug = 1,
3098c2ecf20Sopenharmony_ci	.display.has_overlay = 1,
3108c2ecf20Sopenharmony_ci	.dma_mask_size = 36,
3118c2ecf20Sopenharmony_ci};
3128c2ecf20Sopenharmony_ci
3138c2ecf20Sopenharmony_ci#define GEN4_FEATURES \
3148c2ecf20Sopenharmony_ci	GEN(4), \
3158c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
3168c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
3178c2ecf20Sopenharmony_ci	.display.has_hotplug = 1, \
3188c2ecf20Sopenharmony_ci	.display.has_gmch = 1, \
3198c2ecf20Sopenharmony_ci	.gpu_reset_clobbers_display = true, \
3208c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0), \
3218c2ecf20Sopenharmony_ci	.has_snoop = true, \
3228c2ecf20Sopenharmony_ci	.has_coherent_ggtt = true, \
3238c2ecf20Sopenharmony_ci	.dma_mask_size = 36, \
3248c2ecf20Sopenharmony_ci	I9XX_PIPE_OFFSETS, \
3258c2ecf20Sopenharmony_ci	I9XX_CURSOR_OFFSETS, \
3268c2ecf20Sopenharmony_ci	I965_COLORS, \
3278c2ecf20Sopenharmony_ci	GEN_DEFAULT_PAGE_SIZES, \
3288c2ecf20Sopenharmony_ci	GEN_DEFAULT_REGIONS
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_cistatic const struct intel_device_info i965g_info = {
3318c2ecf20Sopenharmony_ci	GEN4_FEATURES,
3328c2ecf20Sopenharmony_ci	PLATFORM(INTEL_I965G),
3338c2ecf20Sopenharmony_ci	.display.has_overlay = 1,
3348c2ecf20Sopenharmony_ci	.hws_needs_physical = 1,
3358c2ecf20Sopenharmony_ci	.has_snoop = false,
3368c2ecf20Sopenharmony_ci};
3378c2ecf20Sopenharmony_ci
3388c2ecf20Sopenharmony_cistatic const struct intel_device_info i965gm_info = {
3398c2ecf20Sopenharmony_ci	GEN4_FEATURES,
3408c2ecf20Sopenharmony_ci	PLATFORM(INTEL_I965GM),
3418c2ecf20Sopenharmony_ci	.is_mobile = 1,
3428c2ecf20Sopenharmony_ci	.display.has_fbc = 1,
3438c2ecf20Sopenharmony_ci	.display.has_overlay = 1,
3448c2ecf20Sopenharmony_ci	.display.supports_tv = 1,
3458c2ecf20Sopenharmony_ci	.hws_needs_physical = 1,
3468c2ecf20Sopenharmony_ci	.has_snoop = false,
3478c2ecf20Sopenharmony_ci};
3488c2ecf20Sopenharmony_ci
3498c2ecf20Sopenharmony_cistatic const struct intel_device_info g45_info = {
3508c2ecf20Sopenharmony_ci	GEN4_FEATURES,
3518c2ecf20Sopenharmony_ci	PLATFORM(INTEL_G45),
3528c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0) | BIT(VCS0),
3538c2ecf20Sopenharmony_ci	.gpu_reset_clobbers_display = false,
3548c2ecf20Sopenharmony_ci};
3558c2ecf20Sopenharmony_ci
3568c2ecf20Sopenharmony_cistatic const struct intel_device_info gm45_info = {
3578c2ecf20Sopenharmony_ci	GEN4_FEATURES,
3588c2ecf20Sopenharmony_ci	PLATFORM(INTEL_GM45),
3598c2ecf20Sopenharmony_ci	.is_mobile = 1,
3608c2ecf20Sopenharmony_ci	.display.has_fbc = 1,
3618c2ecf20Sopenharmony_ci	.display.supports_tv = 1,
3628c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0) | BIT(VCS0),
3638c2ecf20Sopenharmony_ci	.gpu_reset_clobbers_display = false,
3648c2ecf20Sopenharmony_ci};
3658c2ecf20Sopenharmony_ci
3668c2ecf20Sopenharmony_ci#define GEN5_FEATURES \
3678c2ecf20Sopenharmony_ci	GEN(5), \
3688c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
3698c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
3708c2ecf20Sopenharmony_ci	.display.has_hotplug = 1, \
3718c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0) | BIT(VCS0), \
3728c2ecf20Sopenharmony_ci	.has_snoop = true, \
3738c2ecf20Sopenharmony_ci	.has_coherent_ggtt = true, \
3748c2ecf20Sopenharmony_ci	/* ilk does support rc6, but we do not implement [power] contexts */ \
3758c2ecf20Sopenharmony_ci	.has_rc6 = 0, \
3768c2ecf20Sopenharmony_ci	.dma_mask_size = 36, \
3778c2ecf20Sopenharmony_ci	I9XX_PIPE_OFFSETS, \
3788c2ecf20Sopenharmony_ci	I9XX_CURSOR_OFFSETS, \
3798c2ecf20Sopenharmony_ci	ILK_COLORS, \
3808c2ecf20Sopenharmony_ci	GEN_DEFAULT_PAGE_SIZES, \
3818c2ecf20Sopenharmony_ci	GEN_DEFAULT_REGIONS
3828c2ecf20Sopenharmony_ci
3838c2ecf20Sopenharmony_cistatic const struct intel_device_info ilk_d_info = {
3848c2ecf20Sopenharmony_ci	GEN5_FEATURES,
3858c2ecf20Sopenharmony_ci	PLATFORM(INTEL_IRONLAKE),
3868c2ecf20Sopenharmony_ci};
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_cistatic const struct intel_device_info ilk_m_info = {
3898c2ecf20Sopenharmony_ci	GEN5_FEATURES,
3908c2ecf20Sopenharmony_ci	PLATFORM(INTEL_IRONLAKE),
3918c2ecf20Sopenharmony_ci	.is_mobile = 1,
3928c2ecf20Sopenharmony_ci	.has_rps = true,
3938c2ecf20Sopenharmony_ci	.display.has_fbc = 1,
3948c2ecf20Sopenharmony_ci};
3958c2ecf20Sopenharmony_ci
3968c2ecf20Sopenharmony_ci#define GEN6_FEATURES \
3978c2ecf20Sopenharmony_ci	GEN(6), \
3988c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
3998c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
4008c2ecf20Sopenharmony_ci	.display.has_hotplug = 1, \
4018c2ecf20Sopenharmony_ci	.display.has_fbc = 1, \
4028c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
4038c2ecf20Sopenharmony_ci	.has_coherent_ggtt = true, \
4048c2ecf20Sopenharmony_ci	.has_llc = 1, \
4058c2ecf20Sopenharmony_ci	.has_rc6 = 1, \
4068c2ecf20Sopenharmony_ci	/* snb does support rc6p, but enabling it causes various issues */ \
4078c2ecf20Sopenharmony_ci	.has_rc6p = 0, \
4088c2ecf20Sopenharmony_ci	.has_rps = true, \
4098c2ecf20Sopenharmony_ci	.dma_mask_size = 40, \
4108c2ecf20Sopenharmony_ci	.ppgtt_type = INTEL_PPGTT_ALIASING, \
4118c2ecf20Sopenharmony_ci	.ppgtt_size = 31, \
4128c2ecf20Sopenharmony_ci	I9XX_PIPE_OFFSETS, \
4138c2ecf20Sopenharmony_ci	I9XX_CURSOR_OFFSETS, \
4148c2ecf20Sopenharmony_ci	ILK_COLORS, \
4158c2ecf20Sopenharmony_ci	GEN_DEFAULT_PAGE_SIZES, \
4168c2ecf20Sopenharmony_ci	GEN_DEFAULT_REGIONS
4178c2ecf20Sopenharmony_ci
4188c2ecf20Sopenharmony_ci#define SNB_D_PLATFORM \
4198c2ecf20Sopenharmony_ci	GEN6_FEATURES, \
4208c2ecf20Sopenharmony_ci	PLATFORM(INTEL_SANDYBRIDGE)
4218c2ecf20Sopenharmony_ci
4228c2ecf20Sopenharmony_cistatic const struct intel_device_info snb_d_gt1_info = {
4238c2ecf20Sopenharmony_ci	SNB_D_PLATFORM,
4248c2ecf20Sopenharmony_ci	.gt = 1,
4258c2ecf20Sopenharmony_ci};
4268c2ecf20Sopenharmony_ci
4278c2ecf20Sopenharmony_cistatic const struct intel_device_info snb_d_gt2_info = {
4288c2ecf20Sopenharmony_ci	SNB_D_PLATFORM,
4298c2ecf20Sopenharmony_ci	.gt = 2,
4308c2ecf20Sopenharmony_ci};
4318c2ecf20Sopenharmony_ci
4328c2ecf20Sopenharmony_ci#define SNB_M_PLATFORM \
4338c2ecf20Sopenharmony_ci	GEN6_FEATURES, \
4348c2ecf20Sopenharmony_ci	PLATFORM(INTEL_SANDYBRIDGE), \
4358c2ecf20Sopenharmony_ci	.is_mobile = 1
4368c2ecf20Sopenharmony_ci
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_cistatic const struct intel_device_info snb_m_gt1_info = {
4398c2ecf20Sopenharmony_ci	SNB_M_PLATFORM,
4408c2ecf20Sopenharmony_ci	.gt = 1,
4418c2ecf20Sopenharmony_ci};
4428c2ecf20Sopenharmony_ci
4438c2ecf20Sopenharmony_cistatic const struct intel_device_info snb_m_gt2_info = {
4448c2ecf20Sopenharmony_ci	SNB_M_PLATFORM,
4458c2ecf20Sopenharmony_ci	.gt = 2,
4468c2ecf20Sopenharmony_ci};
4478c2ecf20Sopenharmony_ci
4488c2ecf20Sopenharmony_ci#define GEN7_FEATURES  \
4498c2ecf20Sopenharmony_ci	GEN(7), \
4508c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
4518c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C), \
4528c2ecf20Sopenharmony_ci	.display.has_hotplug = 1, \
4538c2ecf20Sopenharmony_ci	.display.has_fbc = 1, \
4548c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
4558c2ecf20Sopenharmony_ci	.has_coherent_ggtt = true, \
4568c2ecf20Sopenharmony_ci	.has_llc = 1, \
4578c2ecf20Sopenharmony_ci	.has_rc6 = 1, \
4588c2ecf20Sopenharmony_ci	.has_rc6p = 1, \
4598c2ecf20Sopenharmony_ci	.has_rps = true, \
4608c2ecf20Sopenharmony_ci	.dma_mask_size = 40, \
4618c2ecf20Sopenharmony_ci	.ppgtt_type = INTEL_PPGTT_ALIASING, \
4628c2ecf20Sopenharmony_ci	.ppgtt_size = 31, \
4638c2ecf20Sopenharmony_ci	IVB_PIPE_OFFSETS, \
4648c2ecf20Sopenharmony_ci	IVB_CURSOR_OFFSETS, \
4658c2ecf20Sopenharmony_ci	IVB_COLORS, \
4668c2ecf20Sopenharmony_ci	GEN_DEFAULT_PAGE_SIZES, \
4678c2ecf20Sopenharmony_ci	GEN_DEFAULT_REGIONS
4688c2ecf20Sopenharmony_ci
4698c2ecf20Sopenharmony_ci#define IVB_D_PLATFORM \
4708c2ecf20Sopenharmony_ci	GEN7_FEATURES, \
4718c2ecf20Sopenharmony_ci	PLATFORM(INTEL_IVYBRIDGE), \
4728c2ecf20Sopenharmony_ci	.has_l3_dpf = 1
4738c2ecf20Sopenharmony_ci
4748c2ecf20Sopenharmony_cistatic const struct intel_device_info ivb_d_gt1_info = {
4758c2ecf20Sopenharmony_ci	IVB_D_PLATFORM,
4768c2ecf20Sopenharmony_ci	.gt = 1,
4778c2ecf20Sopenharmony_ci};
4788c2ecf20Sopenharmony_ci
4798c2ecf20Sopenharmony_cistatic const struct intel_device_info ivb_d_gt2_info = {
4808c2ecf20Sopenharmony_ci	IVB_D_PLATFORM,
4818c2ecf20Sopenharmony_ci	.gt = 2,
4828c2ecf20Sopenharmony_ci};
4838c2ecf20Sopenharmony_ci
4848c2ecf20Sopenharmony_ci#define IVB_M_PLATFORM \
4858c2ecf20Sopenharmony_ci	GEN7_FEATURES, \
4868c2ecf20Sopenharmony_ci	PLATFORM(INTEL_IVYBRIDGE), \
4878c2ecf20Sopenharmony_ci	.is_mobile = 1, \
4888c2ecf20Sopenharmony_ci	.has_l3_dpf = 1
4898c2ecf20Sopenharmony_ci
4908c2ecf20Sopenharmony_cistatic const struct intel_device_info ivb_m_gt1_info = {
4918c2ecf20Sopenharmony_ci	IVB_M_PLATFORM,
4928c2ecf20Sopenharmony_ci	.gt = 1,
4938c2ecf20Sopenharmony_ci};
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_cistatic const struct intel_device_info ivb_m_gt2_info = {
4968c2ecf20Sopenharmony_ci	IVB_M_PLATFORM,
4978c2ecf20Sopenharmony_ci	.gt = 2,
4988c2ecf20Sopenharmony_ci};
4998c2ecf20Sopenharmony_ci
5008c2ecf20Sopenharmony_cistatic const struct intel_device_info ivb_q_info = {
5018c2ecf20Sopenharmony_ci	GEN7_FEATURES,
5028c2ecf20Sopenharmony_ci	PLATFORM(INTEL_IVYBRIDGE),
5038c2ecf20Sopenharmony_ci	.gt = 2,
5048c2ecf20Sopenharmony_ci	.pipe_mask = 0, /* legal, last one wins */
5058c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = 0,
5068c2ecf20Sopenharmony_ci	.has_l3_dpf = 1,
5078c2ecf20Sopenharmony_ci};
5088c2ecf20Sopenharmony_ci
5098c2ecf20Sopenharmony_cistatic const struct intel_device_info vlv_info = {
5108c2ecf20Sopenharmony_ci	PLATFORM(INTEL_VALLEYVIEW),
5118c2ecf20Sopenharmony_ci	GEN(7),
5128c2ecf20Sopenharmony_ci	.is_lp = 1,
5138c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B),
5148c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B),
5158c2ecf20Sopenharmony_ci	.has_runtime_pm = 1,
5168c2ecf20Sopenharmony_ci	.has_rc6 = 1,
5178c2ecf20Sopenharmony_ci	.has_rps = true,
5188c2ecf20Sopenharmony_ci	.display.has_gmch = 1,
5198c2ecf20Sopenharmony_ci	.display.has_hotplug = 1,
5208c2ecf20Sopenharmony_ci	.dma_mask_size = 40,
5218c2ecf20Sopenharmony_ci	.ppgtt_type = INTEL_PPGTT_ALIASING,
5228c2ecf20Sopenharmony_ci	.ppgtt_size = 31,
5238c2ecf20Sopenharmony_ci	.has_snoop = true,
5248c2ecf20Sopenharmony_ci	.has_coherent_ggtt = false,
5258c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0),
5268c2ecf20Sopenharmony_ci	.display_mmio_offset = VLV_DISPLAY_BASE,
5278c2ecf20Sopenharmony_ci	I9XX_PIPE_OFFSETS,
5288c2ecf20Sopenharmony_ci	I9XX_CURSOR_OFFSETS,
5298c2ecf20Sopenharmony_ci	I965_COLORS,
5308c2ecf20Sopenharmony_ci	GEN_DEFAULT_PAGE_SIZES,
5318c2ecf20Sopenharmony_ci	GEN_DEFAULT_REGIONS,
5328c2ecf20Sopenharmony_ci};
5338c2ecf20Sopenharmony_ci
5348c2ecf20Sopenharmony_ci#define G75_FEATURES  \
5358c2ecf20Sopenharmony_ci	GEN7_FEATURES, \
5368c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
5378c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
5388c2ecf20Sopenharmony_ci		BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP), \
5398c2ecf20Sopenharmony_ci	.display.has_ddi = 1, \
5408c2ecf20Sopenharmony_ci	.has_fpga_dbg = 1, \
5418c2ecf20Sopenharmony_ci	.display.has_psr = 1, \
5428c2ecf20Sopenharmony_ci	.display.has_psr_hw_tracking = 1, \
5438c2ecf20Sopenharmony_ci	.display.has_dp_mst = 1, \
5448c2ecf20Sopenharmony_ci	.has_rc6p = 0 /* RC6p removed-by HSW */, \
5458c2ecf20Sopenharmony_ci	HSW_PIPE_OFFSETS, \
5468c2ecf20Sopenharmony_ci	.has_runtime_pm = 1
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_ci#define HSW_PLATFORM \
5498c2ecf20Sopenharmony_ci	G75_FEATURES, \
5508c2ecf20Sopenharmony_ci	PLATFORM(INTEL_HASWELL), \
5518c2ecf20Sopenharmony_ci	.has_l3_dpf = 1
5528c2ecf20Sopenharmony_ci
5538c2ecf20Sopenharmony_cistatic const struct intel_device_info hsw_gt1_info = {
5548c2ecf20Sopenharmony_ci	HSW_PLATFORM,
5558c2ecf20Sopenharmony_ci	.gt = 1,
5568c2ecf20Sopenharmony_ci};
5578c2ecf20Sopenharmony_ci
5588c2ecf20Sopenharmony_cistatic const struct intel_device_info hsw_gt2_info = {
5598c2ecf20Sopenharmony_ci	HSW_PLATFORM,
5608c2ecf20Sopenharmony_ci	.gt = 2,
5618c2ecf20Sopenharmony_ci};
5628c2ecf20Sopenharmony_ci
5638c2ecf20Sopenharmony_cistatic const struct intel_device_info hsw_gt3_info = {
5648c2ecf20Sopenharmony_ci	HSW_PLATFORM,
5658c2ecf20Sopenharmony_ci	.gt = 3,
5668c2ecf20Sopenharmony_ci};
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_ci#define GEN8_FEATURES \
5698c2ecf20Sopenharmony_ci	G75_FEATURES, \
5708c2ecf20Sopenharmony_ci	GEN(8), \
5718c2ecf20Sopenharmony_ci	.has_logical_ring_contexts = 1, \
5728c2ecf20Sopenharmony_ci	.dma_mask_size = 39, \
5738c2ecf20Sopenharmony_ci	.ppgtt_type = INTEL_PPGTT_FULL, \
5748c2ecf20Sopenharmony_ci	.ppgtt_size = 48, \
5758c2ecf20Sopenharmony_ci	.has_64bit_reloc = 1, \
5768c2ecf20Sopenharmony_ci	.has_reset_engine = 1
5778c2ecf20Sopenharmony_ci
5788c2ecf20Sopenharmony_ci#define BDW_PLATFORM \
5798c2ecf20Sopenharmony_ci	GEN8_FEATURES, \
5808c2ecf20Sopenharmony_ci	PLATFORM(INTEL_BROADWELL)
5818c2ecf20Sopenharmony_ci
5828c2ecf20Sopenharmony_cistatic const struct intel_device_info bdw_gt1_info = {
5838c2ecf20Sopenharmony_ci	BDW_PLATFORM,
5848c2ecf20Sopenharmony_ci	.gt = 1,
5858c2ecf20Sopenharmony_ci};
5868c2ecf20Sopenharmony_ci
5878c2ecf20Sopenharmony_cistatic const struct intel_device_info bdw_gt2_info = {
5888c2ecf20Sopenharmony_ci	BDW_PLATFORM,
5898c2ecf20Sopenharmony_ci	.gt = 2,
5908c2ecf20Sopenharmony_ci};
5918c2ecf20Sopenharmony_ci
5928c2ecf20Sopenharmony_cistatic const struct intel_device_info bdw_rsvd_info = {
5938c2ecf20Sopenharmony_ci	BDW_PLATFORM,
5948c2ecf20Sopenharmony_ci	.gt = 3,
5958c2ecf20Sopenharmony_ci	/* According to the device ID those devices are GT3, they were
5968c2ecf20Sopenharmony_ci	 * previously treated as not GT3, keep it like that.
5978c2ecf20Sopenharmony_ci	 */
5988c2ecf20Sopenharmony_ci};
5998c2ecf20Sopenharmony_ci
6008c2ecf20Sopenharmony_cistatic const struct intel_device_info bdw_gt3_info = {
6018c2ecf20Sopenharmony_ci	BDW_PLATFORM,
6028c2ecf20Sopenharmony_ci	.gt = 3,
6038c2ecf20Sopenharmony_ci	.platform_engine_mask =
6048c2ecf20Sopenharmony_ci		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
6058c2ecf20Sopenharmony_ci};
6068c2ecf20Sopenharmony_ci
6078c2ecf20Sopenharmony_cistatic const struct intel_device_info chv_info = {
6088c2ecf20Sopenharmony_ci	PLATFORM(INTEL_CHERRYVIEW),
6098c2ecf20Sopenharmony_ci	GEN(8),
6108c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
6118c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C),
6128c2ecf20Sopenharmony_ci	.display.has_hotplug = 1,
6138c2ecf20Sopenharmony_ci	.is_lp = 1,
6148c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0),
6158c2ecf20Sopenharmony_ci	.has_64bit_reloc = 1,
6168c2ecf20Sopenharmony_ci	.has_runtime_pm = 1,
6178c2ecf20Sopenharmony_ci	.has_rc6 = 1,
6188c2ecf20Sopenharmony_ci	.has_rps = true,
6198c2ecf20Sopenharmony_ci	.has_logical_ring_contexts = 1,
6208c2ecf20Sopenharmony_ci	.display.has_gmch = 1,
6218c2ecf20Sopenharmony_ci	.dma_mask_size = 39,
6228c2ecf20Sopenharmony_ci	.ppgtt_type = INTEL_PPGTT_FULL,
6238c2ecf20Sopenharmony_ci	.ppgtt_size = 32,
6248c2ecf20Sopenharmony_ci	.has_reset_engine = 1,
6258c2ecf20Sopenharmony_ci	.has_snoop = true,
6268c2ecf20Sopenharmony_ci	.has_coherent_ggtt = false,
6278c2ecf20Sopenharmony_ci	.display_mmio_offset = VLV_DISPLAY_BASE,
6288c2ecf20Sopenharmony_ci	CHV_PIPE_OFFSETS,
6298c2ecf20Sopenharmony_ci	CHV_CURSOR_OFFSETS,
6308c2ecf20Sopenharmony_ci	CHV_COLORS,
6318c2ecf20Sopenharmony_ci	GEN_DEFAULT_PAGE_SIZES,
6328c2ecf20Sopenharmony_ci	GEN_DEFAULT_REGIONS,
6338c2ecf20Sopenharmony_ci};
6348c2ecf20Sopenharmony_ci
6358c2ecf20Sopenharmony_ci#define GEN9_DEFAULT_PAGE_SIZES \
6368c2ecf20Sopenharmony_ci	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
6378c2ecf20Sopenharmony_ci		      I915_GTT_PAGE_SIZE_64K
6388c2ecf20Sopenharmony_ci
6398c2ecf20Sopenharmony_ci#define GEN9_FEATURES \
6408c2ecf20Sopenharmony_ci	GEN8_FEATURES, \
6418c2ecf20Sopenharmony_ci	GEN(9), \
6428c2ecf20Sopenharmony_ci	GEN9_DEFAULT_PAGE_SIZES, \
6438c2ecf20Sopenharmony_ci	.has_logical_ring_preemption = 1, \
6448c2ecf20Sopenharmony_ci	.display.has_csr = 1, \
6458c2ecf20Sopenharmony_ci	.has_gt_uc = 1, \
6468c2ecf20Sopenharmony_ci	.display.has_hdcp = 1, \
6478c2ecf20Sopenharmony_ci	.display.has_ipc = 1, \
6488c2ecf20Sopenharmony_ci	.ddb_size = 896, \
6498c2ecf20Sopenharmony_ci	.num_supported_dbuf_slices = 1
6508c2ecf20Sopenharmony_ci
6518c2ecf20Sopenharmony_ci#define SKL_PLATFORM \
6528c2ecf20Sopenharmony_ci	GEN9_FEATURES, \
6538c2ecf20Sopenharmony_ci	PLATFORM(INTEL_SKYLAKE)
6548c2ecf20Sopenharmony_ci
6558c2ecf20Sopenharmony_cistatic const struct intel_device_info skl_gt1_info = {
6568c2ecf20Sopenharmony_ci	SKL_PLATFORM,
6578c2ecf20Sopenharmony_ci	.gt = 1,
6588c2ecf20Sopenharmony_ci};
6598c2ecf20Sopenharmony_ci
6608c2ecf20Sopenharmony_cistatic const struct intel_device_info skl_gt2_info = {
6618c2ecf20Sopenharmony_ci	SKL_PLATFORM,
6628c2ecf20Sopenharmony_ci	.gt = 2,
6638c2ecf20Sopenharmony_ci};
6648c2ecf20Sopenharmony_ci
6658c2ecf20Sopenharmony_ci#define SKL_GT3_PLUS_PLATFORM \
6668c2ecf20Sopenharmony_ci	SKL_PLATFORM, \
6678c2ecf20Sopenharmony_ci	.platform_engine_mask = \
6688c2ecf20Sopenharmony_ci		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1)
6698c2ecf20Sopenharmony_ci
6708c2ecf20Sopenharmony_ci
6718c2ecf20Sopenharmony_cistatic const struct intel_device_info skl_gt3_info = {
6728c2ecf20Sopenharmony_ci	SKL_GT3_PLUS_PLATFORM,
6738c2ecf20Sopenharmony_ci	.gt = 3,
6748c2ecf20Sopenharmony_ci};
6758c2ecf20Sopenharmony_ci
6768c2ecf20Sopenharmony_cistatic const struct intel_device_info skl_gt4_info = {
6778c2ecf20Sopenharmony_ci	SKL_GT3_PLUS_PLATFORM,
6788c2ecf20Sopenharmony_ci	.gt = 4,
6798c2ecf20Sopenharmony_ci};
6808c2ecf20Sopenharmony_ci
6818c2ecf20Sopenharmony_ci#define GEN9_LP_FEATURES \
6828c2ecf20Sopenharmony_ci	GEN(9), \
6838c2ecf20Sopenharmony_ci	.is_lp = 1, \
6848c2ecf20Sopenharmony_ci	.num_supported_dbuf_slices = 1, \
6858c2ecf20Sopenharmony_ci	.display.has_hotplug = 1, \
6868c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
6878c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
6888c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
6898c2ecf20Sopenharmony_ci		BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \
6908c2ecf20Sopenharmony_ci		BIT(TRANSCODER_DSI_A) | BIT(TRANSCODER_DSI_C), \
6918c2ecf20Sopenharmony_ci	.has_64bit_reloc = 1, \
6928c2ecf20Sopenharmony_ci	.display.has_ddi = 1, \
6938c2ecf20Sopenharmony_ci	.has_fpga_dbg = 1, \
6948c2ecf20Sopenharmony_ci	.display.has_fbc = 1, \
6958c2ecf20Sopenharmony_ci	.display.has_hdcp = 1, \
6968c2ecf20Sopenharmony_ci	.display.has_psr = 1, \
6978c2ecf20Sopenharmony_ci	.display.has_psr_hw_tracking = 1, \
6988c2ecf20Sopenharmony_ci	.has_runtime_pm = 1, \
6998c2ecf20Sopenharmony_ci	.display.has_csr = 1, \
7008c2ecf20Sopenharmony_ci	.has_rc6 = 1, \
7018c2ecf20Sopenharmony_ci	.has_rps = true, \
7028c2ecf20Sopenharmony_ci	.display.has_dp_mst = 1, \
7038c2ecf20Sopenharmony_ci	.has_logical_ring_contexts = 1, \
7048c2ecf20Sopenharmony_ci	.has_logical_ring_preemption = 1, \
7058c2ecf20Sopenharmony_ci	.has_gt_uc = 1, \
7068c2ecf20Sopenharmony_ci	.dma_mask_size = 39, \
7078c2ecf20Sopenharmony_ci	.ppgtt_type = INTEL_PPGTT_FULL, \
7088c2ecf20Sopenharmony_ci	.ppgtt_size = 48, \
7098c2ecf20Sopenharmony_ci	.has_reset_engine = 1, \
7108c2ecf20Sopenharmony_ci	.has_snoop = true, \
7118c2ecf20Sopenharmony_ci	.has_coherent_ggtt = false, \
7128c2ecf20Sopenharmony_ci	.display.has_ipc = 1, \
7138c2ecf20Sopenharmony_ci	HSW_PIPE_OFFSETS, \
7148c2ecf20Sopenharmony_ci	IVB_CURSOR_OFFSETS, \
7158c2ecf20Sopenharmony_ci	IVB_COLORS, \
7168c2ecf20Sopenharmony_ci	GEN9_DEFAULT_PAGE_SIZES, \
7178c2ecf20Sopenharmony_ci	GEN_DEFAULT_REGIONS
7188c2ecf20Sopenharmony_ci
7198c2ecf20Sopenharmony_cistatic const struct intel_device_info bxt_info = {
7208c2ecf20Sopenharmony_ci	GEN9_LP_FEATURES,
7218c2ecf20Sopenharmony_ci	PLATFORM(INTEL_BROXTON),
7228c2ecf20Sopenharmony_ci	.ddb_size = 512,
7238c2ecf20Sopenharmony_ci};
7248c2ecf20Sopenharmony_ci
7258c2ecf20Sopenharmony_cistatic const struct intel_device_info glk_info = {
7268c2ecf20Sopenharmony_ci	GEN9_LP_FEATURES,
7278c2ecf20Sopenharmony_ci	PLATFORM(INTEL_GEMINILAKE),
7288c2ecf20Sopenharmony_ci	.ddb_size = 1024,
7298c2ecf20Sopenharmony_ci	GLK_COLORS,
7308c2ecf20Sopenharmony_ci};
7318c2ecf20Sopenharmony_ci
7328c2ecf20Sopenharmony_ci#define KBL_PLATFORM \
7338c2ecf20Sopenharmony_ci	GEN9_FEATURES, \
7348c2ecf20Sopenharmony_ci	PLATFORM(INTEL_KABYLAKE)
7358c2ecf20Sopenharmony_ci
7368c2ecf20Sopenharmony_cistatic const struct intel_device_info kbl_gt1_info = {
7378c2ecf20Sopenharmony_ci	KBL_PLATFORM,
7388c2ecf20Sopenharmony_ci	.gt = 1,
7398c2ecf20Sopenharmony_ci};
7408c2ecf20Sopenharmony_ci
7418c2ecf20Sopenharmony_cistatic const struct intel_device_info kbl_gt2_info = {
7428c2ecf20Sopenharmony_ci	KBL_PLATFORM,
7438c2ecf20Sopenharmony_ci	.gt = 2,
7448c2ecf20Sopenharmony_ci};
7458c2ecf20Sopenharmony_ci
7468c2ecf20Sopenharmony_cistatic const struct intel_device_info kbl_gt3_info = {
7478c2ecf20Sopenharmony_ci	KBL_PLATFORM,
7488c2ecf20Sopenharmony_ci	.gt = 3,
7498c2ecf20Sopenharmony_ci	.platform_engine_mask =
7508c2ecf20Sopenharmony_ci		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
7518c2ecf20Sopenharmony_ci};
7528c2ecf20Sopenharmony_ci
7538c2ecf20Sopenharmony_ci#define CFL_PLATFORM \
7548c2ecf20Sopenharmony_ci	GEN9_FEATURES, \
7558c2ecf20Sopenharmony_ci	PLATFORM(INTEL_COFFEELAKE)
7568c2ecf20Sopenharmony_ci
7578c2ecf20Sopenharmony_cistatic const struct intel_device_info cfl_gt1_info = {
7588c2ecf20Sopenharmony_ci	CFL_PLATFORM,
7598c2ecf20Sopenharmony_ci	.gt = 1,
7608c2ecf20Sopenharmony_ci};
7618c2ecf20Sopenharmony_ci
7628c2ecf20Sopenharmony_cistatic const struct intel_device_info cfl_gt2_info = {
7638c2ecf20Sopenharmony_ci	CFL_PLATFORM,
7648c2ecf20Sopenharmony_ci	.gt = 2,
7658c2ecf20Sopenharmony_ci};
7668c2ecf20Sopenharmony_ci
7678c2ecf20Sopenharmony_cistatic const struct intel_device_info cfl_gt3_info = {
7688c2ecf20Sopenharmony_ci	CFL_PLATFORM,
7698c2ecf20Sopenharmony_ci	.gt = 3,
7708c2ecf20Sopenharmony_ci	.platform_engine_mask =
7718c2ecf20Sopenharmony_ci		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
7728c2ecf20Sopenharmony_ci};
7738c2ecf20Sopenharmony_ci
7748c2ecf20Sopenharmony_ci#define CML_PLATFORM \
7758c2ecf20Sopenharmony_ci	GEN9_FEATURES, \
7768c2ecf20Sopenharmony_ci	PLATFORM(INTEL_COMETLAKE)
7778c2ecf20Sopenharmony_ci
7788c2ecf20Sopenharmony_cistatic const struct intel_device_info cml_gt1_info = {
7798c2ecf20Sopenharmony_ci	CML_PLATFORM,
7808c2ecf20Sopenharmony_ci	.gt = 1,
7818c2ecf20Sopenharmony_ci};
7828c2ecf20Sopenharmony_ci
7838c2ecf20Sopenharmony_cistatic const struct intel_device_info cml_gt2_info = {
7848c2ecf20Sopenharmony_ci	CML_PLATFORM,
7858c2ecf20Sopenharmony_ci	.gt = 2,
7868c2ecf20Sopenharmony_ci};
7878c2ecf20Sopenharmony_ci
7888c2ecf20Sopenharmony_ci#define GEN10_FEATURES \
7898c2ecf20Sopenharmony_ci	GEN9_FEATURES, \
7908c2ecf20Sopenharmony_ci	GEN(10), \
7918c2ecf20Sopenharmony_ci	.ddb_size = 1024, \
7928c2ecf20Sopenharmony_ci	.display.has_dsc = 1, \
7938c2ecf20Sopenharmony_ci	.has_coherent_ggtt = false, \
7948c2ecf20Sopenharmony_ci	GLK_COLORS
7958c2ecf20Sopenharmony_ci
7968c2ecf20Sopenharmony_cistatic const struct intel_device_info cnl_info = {
7978c2ecf20Sopenharmony_ci	GEN10_FEATURES,
7988c2ecf20Sopenharmony_ci	PLATFORM(INTEL_CANNONLAKE),
7998c2ecf20Sopenharmony_ci	.gt = 2,
8008c2ecf20Sopenharmony_ci};
8018c2ecf20Sopenharmony_ci
8028c2ecf20Sopenharmony_ci#define GEN11_DEFAULT_PAGE_SIZES \
8038c2ecf20Sopenharmony_ci	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
8048c2ecf20Sopenharmony_ci		      I915_GTT_PAGE_SIZE_64K | \
8058c2ecf20Sopenharmony_ci		      I915_GTT_PAGE_SIZE_2M
8068c2ecf20Sopenharmony_ci
8078c2ecf20Sopenharmony_ci#define GEN11_FEATURES \
8088c2ecf20Sopenharmony_ci	GEN10_FEATURES, \
8098c2ecf20Sopenharmony_ci	GEN11_DEFAULT_PAGE_SIZES, \
8108c2ecf20Sopenharmony_ci	.abox_mask = BIT(0), \
8118c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
8128c2ecf20Sopenharmony_ci		BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \
8138c2ecf20Sopenharmony_ci		BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
8148c2ecf20Sopenharmony_ci	.pipe_offsets = { \
8158c2ecf20Sopenharmony_ci		[TRANSCODER_A] = PIPE_A_OFFSET, \
8168c2ecf20Sopenharmony_ci		[TRANSCODER_B] = PIPE_B_OFFSET, \
8178c2ecf20Sopenharmony_ci		[TRANSCODER_C] = PIPE_C_OFFSET, \
8188c2ecf20Sopenharmony_ci		[TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
8198c2ecf20Sopenharmony_ci		[TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
8208c2ecf20Sopenharmony_ci		[TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
8218c2ecf20Sopenharmony_ci	}, \
8228c2ecf20Sopenharmony_ci	.trans_offsets = { \
8238c2ecf20Sopenharmony_ci		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
8248c2ecf20Sopenharmony_ci		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
8258c2ecf20Sopenharmony_ci		[TRANSCODER_C] = TRANSCODER_C_OFFSET, \
8268c2ecf20Sopenharmony_ci		[TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
8278c2ecf20Sopenharmony_ci		[TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
8288c2ecf20Sopenharmony_ci		[TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
8298c2ecf20Sopenharmony_ci	}, \
8308c2ecf20Sopenharmony_ci	GEN(11), \
8318c2ecf20Sopenharmony_ci	.ddb_size = 2048, \
8328c2ecf20Sopenharmony_ci	.num_supported_dbuf_slices = 2, \
8338c2ecf20Sopenharmony_ci	.has_logical_ring_elsq = 1, \
8348c2ecf20Sopenharmony_ci	.color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }
8358c2ecf20Sopenharmony_ci
8368c2ecf20Sopenharmony_cistatic const struct intel_device_info icl_info = {
8378c2ecf20Sopenharmony_ci	GEN11_FEATURES,
8388c2ecf20Sopenharmony_ci	PLATFORM(INTEL_ICELAKE),
8398c2ecf20Sopenharmony_ci	.platform_engine_mask =
8408c2ecf20Sopenharmony_ci		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
8418c2ecf20Sopenharmony_ci};
8428c2ecf20Sopenharmony_ci
8438c2ecf20Sopenharmony_cistatic const struct intel_device_info ehl_info = {
8448c2ecf20Sopenharmony_ci	GEN11_FEATURES,
8458c2ecf20Sopenharmony_ci	PLATFORM(INTEL_ELKHARTLAKE),
8468c2ecf20Sopenharmony_ci	.require_force_probe = 1,
8478c2ecf20Sopenharmony_ci	.platform_engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0),
8488c2ecf20Sopenharmony_ci	.ppgtt_size = 36,
8498c2ecf20Sopenharmony_ci};
8508c2ecf20Sopenharmony_ci
8518c2ecf20Sopenharmony_ci#define GEN12_FEATURES \
8528c2ecf20Sopenharmony_ci	GEN11_FEATURES, \
8538c2ecf20Sopenharmony_ci	GEN(12), \
8548c2ecf20Sopenharmony_ci	.abox_mask = GENMASK(2, 1), \
8558c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), \
8568c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
8578c2ecf20Sopenharmony_ci		BIT(TRANSCODER_C) | BIT(TRANSCODER_D) | \
8588c2ecf20Sopenharmony_ci		BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
8598c2ecf20Sopenharmony_ci	.pipe_offsets = { \
8608c2ecf20Sopenharmony_ci		[TRANSCODER_A] = PIPE_A_OFFSET, \
8618c2ecf20Sopenharmony_ci		[TRANSCODER_B] = PIPE_B_OFFSET, \
8628c2ecf20Sopenharmony_ci		[TRANSCODER_C] = PIPE_C_OFFSET, \
8638c2ecf20Sopenharmony_ci		[TRANSCODER_D] = PIPE_D_OFFSET, \
8648c2ecf20Sopenharmony_ci		[TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
8658c2ecf20Sopenharmony_ci		[TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
8668c2ecf20Sopenharmony_ci	}, \
8678c2ecf20Sopenharmony_ci	.trans_offsets = { \
8688c2ecf20Sopenharmony_ci		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
8698c2ecf20Sopenharmony_ci		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
8708c2ecf20Sopenharmony_ci		[TRANSCODER_C] = TRANSCODER_C_OFFSET, \
8718c2ecf20Sopenharmony_ci		[TRANSCODER_D] = TRANSCODER_D_OFFSET, \
8728c2ecf20Sopenharmony_ci		[TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
8738c2ecf20Sopenharmony_ci		[TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
8748c2ecf20Sopenharmony_ci	}, \
8758c2ecf20Sopenharmony_ci	TGL_CURSOR_OFFSETS, \
8768c2ecf20Sopenharmony_ci	.has_global_mocs = 1, \
8778c2ecf20Sopenharmony_ci	.display.has_dsb = 1
8788c2ecf20Sopenharmony_ci
8798c2ecf20Sopenharmony_cistatic const struct intel_device_info tgl_info = {
8808c2ecf20Sopenharmony_ci	GEN12_FEATURES,
8818c2ecf20Sopenharmony_ci	PLATFORM(INTEL_TIGERLAKE),
8828c2ecf20Sopenharmony_ci	.display.has_modular_fia = 1,
8838c2ecf20Sopenharmony_ci	.platform_engine_mask =
8848c2ecf20Sopenharmony_ci		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
8858c2ecf20Sopenharmony_ci};
8868c2ecf20Sopenharmony_ci
8878c2ecf20Sopenharmony_cistatic const struct intel_device_info rkl_info = {
8888c2ecf20Sopenharmony_ci	GEN12_FEATURES,
8898c2ecf20Sopenharmony_ci	PLATFORM(INTEL_ROCKETLAKE),
8908c2ecf20Sopenharmony_ci	.abox_mask = BIT(0),
8918c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
8928c2ecf20Sopenharmony_ci	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
8938c2ecf20Sopenharmony_ci		BIT(TRANSCODER_C),
8948c2ecf20Sopenharmony_ci	.require_force_probe = 1,
8958c2ecf20Sopenharmony_ci	.display.has_hti = 1,
8968c2ecf20Sopenharmony_ci	.display.has_psr_hw_tracking = 0,
8978c2ecf20Sopenharmony_ci	.platform_engine_mask =
8988c2ecf20Sopenharmony_ci		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0),
8998c2ecf20Sopenharmony_ci};
9008c2ecf20Sopenharmony_ci
9018c2ecf20Sopenharmony_ci#define GEN12_DGFX_FEATURES \
9028c2ecf20Sopenharmony_ci	GEN12_FEATURES, \
9038c2ecf20Sopenharmony_ci	.memory_regions = REGION_SMEM | REGION_LMEM, \
9048c2ecf20Sopenharmony_ci	.has_master_unit_irq = 1, \
9058c2ecf20Sopenharmony_ci	.is_dgfx = 1
9068c2ecf20Sopenharmony_ci
9078c2ecf20Sopenharmony_cistatic const struct intel_device_info dg1_info __maybe_unused = {
9088c2ecf20Sopenharmony_ci	GEN12_DGFX_FEATURES,
9098c2ecf20Sopenharmony_ci	PLATFORM(INTEL_DG1),
9108c2ecf20Sopenharmony_ci	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),
9118c2ecf20Sopenharmony_ci	.require_force_probe = 1,
9128c2ecf20Sopenharmony_ci	.platform_engine_mask =
9138c2ecf20Sopenharmony_ci		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) |
9148c2ecf20Sopenharmony_ci		BIT(VCS0) | BIT(VCS2),
9158c2ecf20Sopenharmony_ci};
9168c2ecf20Sopenharmony_ci
9178c2ecf20Sopenharmony_ci#undef GEN
9188c2ecf20Sopenharmony_ci#undef PLATFORM
9198c2ecf20Sopenharmony_ci
9208c2ecf20Sopenharmony_ci/*
9218c2ecf20Sopenharmony_ci * Make sure any device matches here are from most specific to most
9228c2ecf20Sopenharmony_ci * general.  For example, since the Quanta match is based on the subsystem
9238c2ecf20Sopenharmony_ci * and subvendor IDs, we need it to come before the more general IVB
9248c2ecf20Sopenharmony_ci * PCI ID matches, otherwise we'll use the wrong info struct above.
9258c2ecf20Sopenharmony_ci */
9268c2ecf20Sopenharmony_cistatic const struct pci_device_id pciidlist[] = {
9278c2ecf20Sopenharmony_ci	INTEL_I830_IDS(&i830_info),
9288c2ecf20Sopenharmony_ci	INTEL_I845G_IDS(&i845g_info),
9298c2ecf20Sopenharmony_ci	INTEL_I85X_IDS(&i85x_info),
9308c2ecf20Sopenharmony_ci	INTEL_I865G_IDS(&i865g_info),
9318c2ecf20Sopenharmony_ci	INTEL_I915G_IDS(&i915g_info),
9328c2ecf20Sopenharmony_ci	INTEL_I915GM_IDS(&i915gm_info),
9338c2ecf20Sopenharmony_ci	INTEL_I945G_IDS(&i945g_info),
9348c2ecf20Sopenharmony_ci	INTEL_I945GM_IDS(&i945gm_info),
9358c2ecf20Sopenharmony_ci	INTEL_I965G_IDS(&i965g_info),
9368c2ecf20Sopenharmony_ci	INTEL_G33_IDS(&g33_info),
9378c2ecf20Sopenharmony_ci	INTEL_I965GM_IDS(&i965gm_info),
9388c2ecf20Sopenharmony_ci	INTEL_GM45_IDS(&gm45_info),
9398c2ecf20Sopenharmony_ci	INTEL_G45_IDS(&g45_info),
9408c2ecf20Sopenharmony_ci	INTEL_PINEVIEW_G_IDS(&pnv_g_info),
9418c2ecf20Sopenharmony_ci	INTEL_PINEVIEW_M_IDS(&pnv_m_info),
9428c2ecf20Sopenharmony_ci	INTEL_IRONLAKE_D_IDS(&ilk_d_info),
9438c2ecf20Sopenharmony_ci	INTEL_IRONLAKE_M_IDS(&ilk_m_info),
9448c2ecf20Sopenharmony_ci	INTEL_SNB_D_GT1_IDS(&snb_d_gt1_info),
9458c2ecf20Sopenharmony_ci	INTEL_SNB_D_GT2_IDS(&snb_d_gt2_info),
9468c2ecf20Sopenharmony_ci	INTEL_SNB_M_GT1_IDS(&snb_m_gt1_info),
9478c2ecf20Sopenharmony_ci	INTEL_SNB_M_GT2_IDS(&snb_m_gt2_info),
9488c2ecf20Sopenharmony_ci	INTEL_IVB_Q_IDS(&ivb_q_info), /* must be first IVB */
9498c2ecf20Sopenharmony_ci	INTEL_IVB_M_GT1_IDS(&ivb_m_gt1_info),
9508c2ecf20Sopenharmony_ci	INTEL_IVB_M_GT2_IDS(&ivb_m_gt2_info),
9518c2ecf20Sopenharmony_ci	INTEL_IVB_D_GT1_IDS(&ivb_d_gt1_info),
9528c2ecf20Sopenharmony_ci	INTEL_IVB_D_GT2_IDS(&ivb_d_gt2_info),
9538c2ecf20Sopenharmony_ci	INTEL_HSW_GT1_IDS(&hsw_gt1_info),
9548c2ecf20Sopenharmony_ci	INTEL_HSW_GT2_IDS(&hsw_gt2_info),
9558c2ecf20Sopenharmony_ci	INTEL_HSW_GT3_IDS(&hsw_gt3_info),
9568c2ecf20Sopenharmony_ci	INTEL_VLV_IDS(&vlv_info),
9578c2ecf20Sopenharmony_ci	INTEL_BDW_GT1_IDS(&bdw_gt1_info),
9588c2ecf20Sopenharmony_ci	INTEL_BDW_GT2_IDS(&bdw_gt2_info),
9598c2ecf20Sopenharmony_ci	INTEL_BDW_GT3_IDS(&bdw_gt3_info),
9608c2ecf20Sopenharmony_ci	INTEL_BDW_RSVD_IDS(&bdw_rsvd_info),
9618c2ecf20Sopenharmony_ci	INTEL_CHV_IDS(&chv_info),
9628c2ecf20Sopenharmony_ci	INTEL_SKL_GT1_IDS(&skl_gt1_info),
9638c2ecf20Sopenharmony_ci	INTEL_SKL_GT2_IDS(&skl_gt2_info),
9648c2ecf20Sopenharmony_ci	INTEL_SKL_GT3_IDS(&skl_gt3_info),
9658c2ecf20Sopenharmony_ci	INTEL_SKL_GT4_IDS(&skl_gt4_info),
9668c2ecf20Sopenharmony_ci	INTEL_BXT_IDS(&bxt_info),
9678c2ecf20Sopenharmony_ci	INTEL_GLK_IDS(&glk_info),
9688c2ecf20Sopenharmony_ci	INTEL_KBL_GT1_IDS(&kbl_gt1_info),
9698c2ecf20Sopenharmony_ci	INTEL_KBL_GT2_IDS(&kbl_gt2_info),
9708c2ecf20Sopenharmony_ci	INTEL_KBL_GT3_IDS(&kbl_gt3_info),
9718c2ecf20Sopenharmony_ci	INTEL_KBL_GT4_IDS(&kbl_gt3_info),
9728c2ecf20Sopenharmony_ci	INTEL_AML_KBL_GT2_IDS(&kbl_gt2_info),
9738c2ecf20Sopenharmony_ci	INTEL_CFL_S_GT1_IDS(&cfl_gt1_info),
9748c2ecf20Sopenharmony_ci	INTEL_CFL_S_GT2_IDS(&cfl_gt2_info),
9758c2ecf20Sopenharmony_ci	INTEL_CFL_H_GT1_IDS(&cfl_gt1_info),
9768c2ecf20Sopenharmony_ci	INTEL_CFL_H_GT2_IDS(&cfl_gt2_info),
9778c2ecf20Sopenharmony_ci	INTEL_CFL_U_GT2_IDS(&cfl_gt2_info),
9788c2ecf20Sopenharmony_ci	INTEL_CFL_U_GT3_IDS(&cfl_gt3_info),
9798c2ecf20Sopenharmony_ci	INTEL_WHL_U_GT1_IDS(&cfl_gt1_info),
9808c2ecf20Sopenharmony_ci	INTEL_WHL_U_GT2_IDS(&cfl_gt2_info),
9818c2ecf20Sopenharmony_ci	INTEL_AML_CFL_GT2_IDS(&cfl_gt2_info),
9828c2ecf20Sopenharmony_ci	INTEL_WHL_U_GT3_IDS(&cfl_gt3_info),
9838c2ecf20Sopenharmony_ci	INTEL_CML_GT1_IDS(&cml_gt1_info),
9848c2ecf20Sopenharmony_ci	INTEL_CML_GT2_IDS(&cml_gt2_info),
9858c2ecf20Sopenharmony_ci	INTEL_CML_U_GT1_IDS(&cml_gt1_info),
9868c2ecf20Sopenharmony_ci	INTEL_CML_U_GT2_IDS(&cml_gt2_info),
9878c2ecf20Sopenharmony_ci	INTEL_CNL_IDS(&cnl_info),
9888c2ecf20Sopenharmony_ci	INTEL_ICL_11_IDS(&icl_info),
9898c2ecf20Sopenharmony_ci	INTEL_EHL_IDS(&ehl_info),
9908c2ecf20Sopenharmony_ci	INTEL_TGL_12_IDS(&tgl_info),
9918c2ecf20Sopenharmony_ci	INTEL_RKL_IDS(&rkl_info),
9928c2ecf20Sopenharmony_ci	{0, 0, 0}
9938c2ecf20Sopenharmony_ci};
9948c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(pci, pciidlist);
9958c2ecf20Sopenharmony_ci
9968c2ecf20Sopenharmony_cistatic void i915_pci_remove(struct pci_dev *pdev)
9978c2ecf20Sopenharmony_ci{
9988c2ecf20Sopenharmony_ci	struct drm_i915_private *i915;
9998c2ecf20Sopenharmony_ci
10008c2ecf20Sopenharmony_ci	i915 = pci_get_drvdata(pdev);
10018c2ecf20Sopenharmony_ci	if (!i915) /* driver load aborted, nothing to cleanup */
10028c2ecf20Sopenharmony_ci		return;
10038c2ecf20Sopenharmony_ci
10048c2ecf20Sopenharmony_ci	i915_driver_remove(i915);
10058c2ecf20Sopenharmony_ci	pci_set_drvdata(pdev, NULL);
10068c2ecf20Sopenharmony_ci}
10078c2ecf20Sopenharmony_ci
10088c2ecf20Sopenharmony_ci/* is device_id present in comma separated list of ids */
10098c2ecf20Sopenharmony_cistatic bool force_probe(u16 device_id, const char *devices)
10108c2ecf20Sopenharmony_ci{
10118c2ecf20Sopenharmony_ci	char *s, *p, *tok;
10128c2ecf20Sopenharmony_ci	bool ret;
10138c2ecf20Sopenharmony_ci
10148c2ecf20Sopenharmony_ci	if (!devices || !*devices)
10158c2ecf20Sopenharmony_ci		return false;
10168c2ecf20Sopenharmony_ci
10178c2ecf20Sopenharmony_ci	/* match everything */
10188c2ecf20Sopenharmony_ci	if (strcmp(devices, "*") == 0)
10198c2ecf20Sopenharmony_ci		return true;
10208c2ecf20Sopenharmony_ci
10218c2ecf20Sopenharmony_ci	s = kstrdup(devices, GFP_KERNEL);
10228c2ecf20Sopenharmony_ci	if (!s)
10238c2ecf20Sopenharmony_ci		return false;
10248c2ecf20Sopenharmony_ci
10258c2ecf20Sopenharmony_ci	for (p = s, ret = false; (tok = strsep(&p, ",")) != NULL; ) {
10268c2ecf20Sopenharmony_ci		u16 val;
10278c2ecf20Sopenharmony_ci
10288c2ecf20Sopenharmony_ci		if (kstrtou16(tok, 16, &val) == 0 && val == device_id) {
10298c2ecf20Sopenharmony_ci			ret = true;
10308c2ecf20Sopenharmony_ci			break;
10318c2ecf20Sopenharmony_ci		}
10328c2ecf20Sopenharmony_ci	}
10338c2ecf20Sopenharmony_ci
10348c2ecf20Sopenharmony_ci	kfree(s);
10358c2ecf20Sopenharmony_ci
10368c2ecf20Sopenharmony_ci	return ret;
10378c2ecf20Sopenharmony_ci}
10388c2ecf20Sopenharmony_ci
10398c2ecf20Sopenharmony_cistatic int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
10408c2ecf20Sopenharmony_ci{
10418c2ecf20Sopenharmony_ci	struct intel_device_info *intel_info =
10428c2ecf20Sopenharmony_ci		(struct intel_device_info *) ent->driver_data;
10438c2ecf20Sopenharmony_ci	int err;
10448c2ecf20Sopenharmony_ci
10458c2ecf20Sopenharmony_ci	if (intel_info->require_force_probe &&
10468c2ecf20Sopenharmony_ci	    !force_probe(pdev->device, i915_modparams.force_probe)) {
10478c2ecf20Sopenharmony_ci		dev_info(&pdev->dev,
10488c2ecf20Sopenharmony_ci			 "Your graphics device %04x is not properly supported by the driver in this\n"
10498c2ecf20Sopenharmony_ci			 "kernel version. To force driver probe anyway, use i915.force_probe=%04x\n"
10508c2ecf20Sopenharmony_ci			 "module parameter or CONFIG_DRM_I915_FORCE_PROBE=%04x configuration option,\n"
10518c2ecf20Sopenharmony_ci			 "or (recommended) check for kernel updates.\n",
10528c2ecf20Sopenharmony_ci			 pdev->device, pdev->device, pdev->device);
10538c2ecf20Sopenharmony_ci		return -ENODEV;
10548c2ecf20Sopenharmony_ci	}
10558c2ecf20Sopenharmony_ci
10568c2ecf20Sopenharmony_ci	/* Only bind to function 0 of the device. Early generations
10578c2ecf20Sopenharmony_ci	 * used function 1 as a placeholder for multi-head. This causes
10588c2ecf20Sopenharmony_ci	 * us confusion instead, especially on the systems where both
10598c2ecf20Sopenharmony_ci	 * functions have the same PCI-ID!
10608c2ecf20Sopenharmony_ci	 */
10618c2ecf20Sopenharmony_ci	if (PCI_FUNC(pdev->devfn))
10628c2ecf20Sopenharmony_ci		return -ENODEV;
10638c2ecf20Sopenharmony_ci
10648c2ecf20Sopenharmony_ci	/*
10658c2ecf20Sopenharmony_ci	 * apple-gmux is needed on dual GPU MacBook Pro
10668c2ecf20Sopenharmony_ci	 * to probe the panel if we're the inactive GPU.
10678c2ecf20Sopenharmony_ci	 */
10688c2ecf20Sopenharmony_ci	if (vga_switcheroo_client_probe_defer(pdev))
10698c2ecf20Sopenharmony_ci		return -EPROBE_DEFER;
10708c2ecf20Sopenharmony_ci
10718c2ecf20Sopenharmony_ci	err = i915_driver_probe(pdev, ent);
10728c2ecf20Sopenharmony_ci	if (err)
10738c2ecf20Sopenharmony_ci		return err;
10748c2ecf20Sopenharmony_ci
10758c2ecf20Sopenharmony_ci	if (i915_inject_probe_failure(pci_get_drvdata(pdev))) {
10768c2ecf20Sopenharmony_ci		i915_pci_remove(pdev);
10778c2ecf20Sopenharmony_ci		return -ENODEV;
10788c2ecf20Sopenharmony_ci	}
10798c2ecf20Sopenharmony_ci
10808c2ecf20Sopenharmony_ci	err = i915_live_selftests(pdev);
10818c2ecf20Sopenharmony_ci	if (err) {
10828c2ecf20Sopenharmony_ci		i915_pci_remove(pdev);
10838c2ecf20Sopenharmony_ci		return err > 0 ? -ENOTTY : err;
10848c2ecf20Sopenharmony_ci	}
10858c2ecf20Sopenharmony_ci
10868c2ecf20Sopenharmony_ci	err = i915_perf_selftests(pdev);
10878c2ecf20Sopenharmony_ci	if (err) {
10888c2ecf20Sopenharmony_ci		i915_pci_remove(pdev);
10898c2ecf20Sopenharmony_ci		return err > 0 ? -ENOTTY : err;
10908c2ecf20Sopenharmony_ci	}
10918c2ecf20Sopenharmony_ci
10928c2ecf20Sopenharmony_ci	return 0;
10938c2ecf20Sopenharmony_ci}
10948c2ecf20Sopenharmony_ci
10958c2ecf20Sopenharmony_cistatic struct pci_driver i915_pci_driver = {
10968c2ecf20Sopenharmony_ci	.name = DRIVER_NAME,
10978c2ecf20Sopenharmony_ci	.id_table = pciidlist,
10988c2ecf20Sopenharmony_ci	.probe = i915_pci_probe,
10998c2ecf20Sopenharmony_ci	.remove = i915_pci_remove,
11008c2ecf20Sopenharmony_ci	.driver.pm = &i915_pm_ops,
11018c2ecf20Sopenharmony_ci};
11028c2ecf20Sopenharmony_ci
11038c2ecf20Sopenharmony_cistatic int __init i915_init(void)
11048c2ecf20Sopenharmony_ci{
11058c2ecf20Sopenharmony_ci	bool use_kms = true;
11068c2ecf20Sopenharmony_ci	int err;
11078c2ecf20Sopenharmony_ci
11088c2ecf20Sopenharmony_ci	err = i915_globals_init();
11098c2ecf20Sopenharmony_ci	if (err)
11108c2ecf20Sopenharmony_ci		return err;
11118c2ecf20Sopenharmony_ci
11128c2ecf20Sopenharmony_ci	err = i915_mock_selftests();
11138c2ecf20Sopenharmony_ci	if (err)
11148c2ecf20Sopenharmony_ci		return err > 0 ? 0 : err;
11158c2ecf20Sopenharmony_ci
11168c2ecf20Sopenharmony_ci	/*
11178c2ecf20Sopenharmony_ci	 * Enable KMS by default, unless explicitly overriden by
11188c2ecf20Sopenharmony_ci	 * either the i915.modeset prarameter or by the
11198c2ecf20Sopenharmony_ci	 * vga_text_mode_force boot option.
11208c2ecf20Sopenharmony_ci	 */
11218c2ecf20Sopenharmony_ci
11228c2ecf20Sopenharmony_ci	if (i915_modparams.modeset == 0)
11238c2ecf20Sopenharmony_ci		use_kms = false;
11248c2ecf20Sopenharmony_ci
11258c2ecf20Sopenharmony_ci	if (vgacon_text_force() && i915_modparams.modeset == -1)
11268c2ecf20Sopenharmony_ci		use_kms = false;
11278c2ecf20Sopenharmony_ci
11288c2ecf20Sopenharmony_ci	if (!use_kms) {
11298c2ecf20Sopenharmony_ci		/* Silently fail loading to not upset userspace. */
11308c2ecf20Sopenharmony_ci		DRM_DEBUG_DRIVER("KMS disabled.\n");
11318c2ecf20Sopenharmony_ci		return 0;
11328c2ecf20Sopenharmony_ci	}
11338c2ecf20Sopenharmony_ci
11348c2ecf20Sopenharmony_ci	err = pci_register_driver(&i915_pci_driver);
11358c2ecf20Sopenharmony_ci	if (err)
11368c2ecf20Sopenharmony_ci		return err;
11378c2ecf20Sopenharmony_ci
11388c2ecf20Sopenharmony_ci	i915_perf_sysctl_register();
11398c2ecf20Sopenharmony_ci	return 0;
11408c2ecf20Sopenharmony_ci}
11418c2ecf20Sopenharmony_ci
11428c2ecf20Sopenharmony_cistatic void __exit i915_exit(void)
11438c2ecf20Sopenharmony_ci{
11448c2ecf20Sopenharmony_ci	if (!i915_pci_driver.driver.owner)
11458c2ecf20Sopenharmony_ci		return;
11468c2ecf20Sopenharmony_ci
11478c2ecf20Sopenharmony_ci	i915_perf_sysctl_unregister();
11488c2ecf20Sopenharmony_ci	pci_unregister_driver(&i915_pci_driver);
11498c2ecf20Sopenharmony_ci	i915_globals_exit();
11508c2ecf20Sopenharmony_ci}
11518c2ecf20Sopenharmony_ci
11528c2ecf20Sopenharmony_cimodule_init(i915_init);
11538c2ecf20Sopenharmony_cimodule_exit(i915_exit);
11548c2ecf20Sopenharmony_ci
11558c2ecf20Sopenharmony_ciMODULE_AUTHOR("Tungsten Graphics, Inc.");
11568c2ecf20Sopenharmony_ciMODULE_AUTHOR("Intel Corporation");
11578c2ecf20Sopenharmony_ci
11588c2ecf20Sopenharmony_ciMODULE_DESCRIPTION(DRIVER_DESC);
11598c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL and additional rights");
1160