1*c7be4527Sriastradh /* $NetBSD: i915_pci.c,v 1.5 2024/01/14 22:15:15 riastradh Exp $ */
24e390cabSriastradh
34e390cabSriastradh /*
44e390cabSriastradh * Copyright © 2016 Intel Corporation
54e390cabSriastradh *
64e390cabSriastradh * Permission is hereby granted, free of charge, to any person obtaining a
74e390cabSriastradh * copy of this software and associated documentation files (the "Software"),
84e390cabSriastradh * to deal in the Software without restriction, including without limitation
94e390cabSriastradh * the rights to use, copy, modify, merge, publish, distribute, sublicense,
104e390cabSriastradh * and/or sell copies of the Software, and to permit persons to whom the
114e390cabSriastradh * Software is furnished to do so, subject to the following conditions:
124e390cabSriastradh *
134e390cabSriastradh * The above copyright notice and this permission notice (including the next
144e390cabSriastradh * paragraph) shall be included in all copies or substantial portions of the
154e390cabSriastradh * Software.
164e390cabSriastradh *
174e390cabSriastradh * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
184e390cabSriastradh * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
194e390cabSriastradh * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
204e390cabSriastradh * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
214e390cabSriastradh * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
224e390cabSriastradh * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
234e390cabSriastradh * IN THE SOFTWARE.
244e390cabSriastradh *
254e390cabSriastradh */
264e390cabSriastradh
274e390cabSriastradh #include <sys/cdefs.h>
28*c7be4527Sriastradh __KERNEL_RCSID(0, "$NetBSD: i915_pci.c,v 1.5 2024/01/14 22:15:15 riastradh Exp $");
294e390cabSriastradh
304e390cabSriastradh #include <linux/console.h>
314e390cabSriastradh #include <linux/vga_switcheroo.h>
324e390cabSriastradh
334e390cabSriastradh #include <drm/drm_drv.h>
344e390cabSriastradh
354e390cabSriastradh #include "display/intel_fbdev.h"
364e390cabSriastradh
374e390cabSriastradh #include "i915_drv.h"
384e390cabSriastradh #include "i915_perf.h"
394e390cabSriastradh #include "i915_globals.h"
404e390cabSriastradh #include "i915_selftest.h"
414e390cabSriastradh
424e390cabSriastradh #define PLATFORM(x) .platform = (x)
434e390cabSriastradh #define GEN(x) .gen = (x), .gen_mask = BIT((x) - 1)
444e390cabSriastradh
454e390cabSriastradh #define I845_PIPE_OFFSETS \
464e390cabSriastradh .pipe_offsets = { \
474e390cabSriastradh [TRANSCODER_A] = PIPE_A_OFFSET, \
484e390cabSriastradh }, \
494e390cabSriastradh .trans_offsets = { \
504e390cabSriastradh [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
514e390cabSriastradh }
524e390cabSriastradh
534e390cabSriastradh #define I9XX_PIPE_OFFSETS \
544e390cabSriastradh .pipe_offsets = { \
554e390cabSriastradh [TRANSCODER_A] = PIPE_A_OFFSET, \
564e390cabSriastradh [TRANSCODER_B] = PIPE_B_OFFSET, \
574e390cabSriastradh }, \
584e390cabSriastradh .trans_offsets = { \
594e390cabSriastradh [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
604e390cabSriastradh [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
614e390cabSriastradh }
624e390cabSriastradh
634e390cabSriastradh #define IVB_PIPE_OFFSETS \
644e390cabSriastradh .pipe_offsets = { \
654e390cabSriastradh [TRANSCODER_A] = PIPE_A_OFFSET, \
664e390cabSriastradh [TRANSCODER_B] = PIPE_B_OFFSET, \
674e390cabSriastradh [TRANSCODER_C] = PIPE_C_OFFSET, \
684e390cabSriastradh }, \
694e390cabSriastradh .trans_offsets = { \
704e390cabSriastradh [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
714e390cabSriastradh [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
724e390cabSriastradh [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
734e390cabSriastradh }
744e390cabSriastradh
754e390cabSriastradh #define HSW_PIPE_OFFSETS \
764e390cabSriastradh .pipe_offsets = { \
774e390cabSriastradh [TRANSCODER_A] = PIPE_A_OFFSET, \
784e390cabSriastradh [TRANSCODER_B] = PIPE_B_OFFSET, \
794e390cabSriastradh [TRANSCODER_C] = PIPE_C_OFFSET, \
804e390cabSriastradh [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
814e390cabSriastradh }, \
824e390cabSriastradh .trans_offsets = { \
834e390cabSriastradh [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
844e390cabSriastradh [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
854e390cabSriastradh [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
864e390cabSriastradh [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
874e390cabSriastradh }
884e390cabSriastradh
894e390cabSriastradh #define CHV_PIPE_OFFSETS \
904e390cabSriastradh .pipe_offsets = { \
914e390cabSriastradh [TRANSCODER_A] = PIPE_A_OFFSET, \
924e390cabSriastradh [TRANSCODER_B] = PIPE_B_OFFSET, \
934e390cabSriastradh [TRANSCODER_C] = CHV_PIPE_C_OFFSET, \
944e390cabSriastradh }, \
954e390cabSriastradh .trans_offsets = { \
964e390cabSriastradh [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
974e390cabSriastradh [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
984e390cabSriastradh [TRANSCODER_C] = CHV_TRANSCODER_C_OFFSET, \
994e390cabSriastradh }
1004e390cabSriastradh
1014e390cabSriastradh #define I845_CURSOR_OFFSETS \
1024e390cabSriastradh .cursor_offsets = { \
1034e390cabSriastradh [PIPE_A] = CURSOR_A_OFFSET, \
1044e390cabSriastradh }
1054e390cabSriastradh
1064e390cabSriastradh #define I9XX_CURSOR_OFFSETS \
1074e390cabSriastradh .cursor_offsets = { \
1084e390cabSriastradh [PIPE_A] = CURSOR_A_OFFSET, \
1094e390cabSriastradh [PIPE_B] = CURSOR_B_OFFSET, \
1104e390cabSriastradh }
1114e390cabSriastradh
1124e390cabSriastradh #define CHV_CURSOR_OFFSETS \
1134e390cabSriastradh .cursor_offsets = { \
1144e390cabSriastradh [PIPE_A] = CURSOR_A_OFFSET, \
1154e390cabSriastradh [PIPE_B] = CURSOR_B_OFFSET, \
1164e390cabSriastradh [PIPE_C] = CHV_CURSOR_C_OFFSET, \
1174e390cabSriastradh }
1184e390cabSriastradh
1194e390cabSriastradh #define IVB_CURSOR_OFFSETS \
1204e390cabSriastradh .cursor_offsets = { \
1214e390cabSriastradh [PIPE_A] = CURSOR_A_OFFSET, \
1224e390cabSriastradh [PIPE_B] = IVB_CURSOR_B_OFFSET, \
1234e390cabSriastradh [PIPE_C] = IVB_CURSOR_C_OFFSET, \
1244e390cabSriastradh }
1254e390cabSriastradh
1264e390cabSriastradh #define TGL_CURSOR_OFFSETS \
1274e390cabSriastradh .cursor_offsets = { \
1284e390cabSriastradh [PIPE_A] = CURSOR_A_OFFSET, \
1294e390cabSriastradh [PIPE_B] = IVB_CURSOR_B_OFFSET, \
1304e390cabSriastradh [PIPE_C] = IVB_CURSOR_C_OFFSET, \
1314e390cabSriastradh [PIPE_D] = TGL_CURSOR_D_OFFSET, \
1324e390cabSriastradh }
1334e390cabSriastradh
1344e390cabSriastradh #define I9XX_COLORS \
1354e390cabSriastradh .color = { .gamma_lut_size = 256 }
1364e390cabSriastradh #define I965_COLORS \
1374e390cabSriastradh .color = { .gamma_lut_size = 129, \
1384e390cabSriastradh .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
1394e390cabSriastradh }
1404e390cabSriastradh #define ILK_COLORS \
1414e390cabSriastradh .color = { .gamma_lut_size = 1024 }
1424e390cabSriastradh #define IVB_COLORS \
1434e390cabSriastradh .color = { .degamma_lut_size = 1024, .gamma_lut_size = 1024 }
1444e390cabSriastradh #define CHV_COLORS \
1454e390cabSriastradh .color = { .degamma_lut_size = 65, .gamma_lut_size = 257, \
1464e390cabSriastradh .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
1474e390cabSriastradh .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
1484e390cabSriastradh }
1494e390cabSriastradh #define GLK_COLORS \
1504e390cabSriastradh .color = { .degamma_lut_size = 33, .gamma_lut_size = 1024, \
1514e390cabSriastradh .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
1524e390cabSriastradh DRM_COLOR_LUT_EQUAL_CHANNELS, \
1534e390cabSriastradh }
1544e390cabSriastradh
1554e390cabSriastradh /* Keep in gen based order, and chronological order within a gen */
1564e390cabSriastradh
1574e390cabSriastradh #define GEN_DEFAULT_PAGE_SIZES \
1584e390cabSriastradh .page_sizes = I915_GTT_PAGE_SIZE_4K
1594e390cabSriastradh
1604e390cabSriastradh #define GEN_DEFAULT_REGIONS \
1614e390cabSriastradh .memory_regions = REGION_SMEM | REGION_STOLEN
1624e390cabSriastradh
1634e390cabSriastradh #define I830_FEATURES \
1644e390cabSriastradh GEN(2), \
1654e390cabSriastradh .is_mobile = 1, \
1664e390cabSriastradh .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
1674e390cabSriastradh .display.has_overlay = 1, \
1684e390cabSriastradh .display.cursor_needs_physical = 1, \
1694e390cabSriastradh .display.overlay_needs_physical = 1, \
1704e390cabSriastradh .display.has_gmch = 1, \
1714e390cabSriastradh .gpu_reset_clobbers_display = true, \
1724e390cabSriastradh .hws_needs_physical = 1, \
1734e390cabSriastradh .unfenced_needs_alignment = 1, \
1744e390cabSriastradh .engine_mask = BIT(RCS0), \
1754e390cabSriastradh .has_snoop = true, \
1764e390cabSriastradh .has_coherent_ggtt = false, \
1774e390cabSriastradh I9XX_PIPE_OFFSETS, \
1784e390cabSriastradh I9XX_CURSOR_OFFSETS, \
1794e390cabSriastradh I9XX_COLORS, \
1804e390cabSriastradh GEN_DEFAULT_PAGE_SIZES, \
1814e390cabSriastradh GEN_DEFAULT_REGIONS
1824e390cabSriastradh
1834e390cabSriastradh #define I845_FEATURES \
1844e390cabSriastradh GEN(2), \
1854e390cabSriastradh .pipe_mask = BIT(PIPE_A), \
1864e390cabSriastradh .display.has_overlay = 1, \
1874e390cabSriastradh .display.overlay_needs_physical = 1, \
1884e390cabSriastradh .display.has_gmch = 1, \
1894e390cabSriastradh .gpu_reset_clobbers_display = true, \
1904e390cabSriastradh .hws_needs_physical = 1, \
1914e390cabSriastradh .unfenced_needs_alignment = 1, \
1924e390cabSriastradh .engine_mask = BIT(RCS0), \
1934e390cabSriastradh .has_snoop = true, \
1944e390cabSriastradh .has_coherent_ggtt = false, \
1954e390cabSriastradh I845_PIPE_OFFSETS, \
1964e390cabSriastradh I845_CURSOR_OFFSETS, \
1974e390cabSriastradh I9XX_COLORS, \
1984e390cabSriastradh GEN_DEFAULT_PAGE_SIZES, \
1994e390cabSriastradh GEN_DEFAULT_REGIONS
2004e390cabSriastradh
2014e390cabSriastradh static const struct intel_device_info i830_info = {
2024e390cabSriastradh I830_FEATURES,
2034e390cabSriastradh PLATFORM(INTEL_I830),
2044e390cabSriastradh };
2054e390cabSriastradh
2064e390cabSriastradh static const struct intel_device_info i845g_info = {
2074e390cabSriastradh I845_FEATURES,
2084e390cabSriastradh PLATFORM(INTEL_I845G),
2094e390cabSriastradh };
2104e390cabSriastradh
2114e390cabSriastradh static const struct intel_device_info i85x_info = {
2124e390cabSriastradh I830_FEATURES,
2134e390cabSriastradh PLATFORM(INTEL_I85X),
2144e390cabSriastradh .display.has_fbc = 1,
2154e390cabSriastradh };
2164e390cabSriastradh
2174e390cabSriastradh static const struct intel_device_info i865g_info = {
2184e390cabSriastradh I845_FEATURES,
2194e390cabSriastradh PLATFORM(INTEL_I865G),
2204e390cabSriastradh };
2214e390cabSriastradh
2224e390cabSriastradh #define GEN3_FEATURES \
2234e390cabSriastradh GEN(3), \
2244e390cabSriastradh .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
2254e390cabSriastradh .display.has_gmch = 1, \
2264e390cabSriastradh .gpu_reset_clobbers_display = true, \
2274e390cabSriastradh .engine_mask = BIT(RCS0), \
2284e390cabSriastradh .has_snoop = true, \
2294e390cabSriastradh .has_coherent_ggtt = true, \
2304e390cabSriastradh I9XX_PIPE_OFFSETS, \
2314e390cabSriastradh I9XX_CURSOR_OFFSETS, \
2324e390cabSriastradh I9XX_COLORS, \
2334e390cabSriastradh GEN_DEFAULT_PAGE_SIZES, \
2344e390cabSriastradh GEN_DEFAULT_REGIONS
2354e390cabSriastradh
2364e390cabSriastradh static const struct intel_device_info i915g_info = {
2374e390cabSriastradh GEN3_FEATURES,
2384e390cabSriastradh PLATFORM(INTEL_I915G),
2394e390cabSriastradh .has_coherent_ggtt = false,
2404e390cabSriastradh .display.cursor_needs_physical = 1,
2414e390cabSriastradh .display.has_overlay = 1,
2424e390cabSriastradh .display.overlay_needs_physical = 1,
2434e390cabSriastradh .hws_needs_physical = 1,
2444e390cabSriastradh .unfenced_needs_alignment = 1,
2454e390cabSriastradh };
2464e390cabSriastradh
2474e390cabSriastradh static const struct intel_device_info i915gm_info = {
2484e390cabSriastradh GEN3_FEATURES,
2494e390cabSriastradh PLATFORM(INTEL_I915GM),
2504e390cabSriastradh .is_mobile = 1,
2514e390cabSriastradh .display.cursor_needs_physical = 1,
2524e390cabSriastradh .display.has_overlay = 1,
2534e390cabSriastradh .display.overlay_needs_physical = 1,
2544e390cabSriastradh .display.supports_tv = 1,
2554e390cabSriastradh .display.has_fbc = 1,
2564e390cabSriastradh .hws_needs_physical = 1,
2574e390cabSriastradh .unfenced_needs_alignment = 1,
2584e390cabSriastradh };
2594e390cabSriastradh
2604e390cabSriastradh static const struct intel_device_info i945g_info = {
2614e390cabSriastradh GEN3_FEATURES,
2624e390cabSriastradh PLATFORM(INTEL_I945G),
2634e390cabSriastradh .display.has_hotplug = 1,
2644e390cabSriastradh .display.cursor_needs_physical = 1,
2654e390cabSriastradh .display.has_overlay = 1,
2664e390cabSriastradh .display.overlay_needs_physical = 1,
2674e390cabSriastradh .hws_needs_physical = 1,
2684e390cabSriastradh .unfenced_needs_alignment = 1,
2694e390cabSriastradh };
2704e390cabSriastradh
2714e390cabSriastradh static const struct intel_device_info i945gm_info = {
2724e390cabSriastradh GEN3_FEATURES,
2734e390cabSriastradh PLATFORM(INTEL_I945GM),
2744e390cabSriastradh .is_mobile = 1,
2754e390cabSriastradh .display.has_hotplug = 1,
2764e390cabSriastradh .display.cursor_needs_physical = 1,
2774e390cabSriastradh .display.has_overlay = 1,
2784e390cabSriastradh .display.overlay_needs_physical = 1,
2794e390cabSriastradh .display.supports_tv = 1,
2804e390cabSriastradh .display.has_fbc = 1,
2814e390cabSriastradh .hws_needs_physical = 1,
2824e390cabSriastradh .unfenced_needs_alignment = 1,
2834e390cabSriastradh };
2844e390cabSriastradh
2854e390cabSriastradh static const struct intel_device_info g33_info = {
2864e390cabSriastradh GEN3_FEATURES,
2874e390cabSriastradh PLATFORM(INTEL_G33),
2884e390cabSriastradh .display.has_hotplug = 1,
2894e390cabSriastradh .display.has_overlay = 1,
2904e390cabSriastradh };
2914e390cabSriastradh
2924e390cabSriastradh static const struct intel_device_info pnv_g_info = {
2934e390cabSriastradh GEN3_FEATURES,
2944e390cabSriastradh PLATFORM(INTEL_PINEVIEW),
2954e390cabSriastradh .display.has_hotplug = 1,
2964e390cabSriastradh .display.has_overlay = 1,
2974e390cabSriastradh };
2984e390cabSriastradh
2994e390cabSriastradh static const struct intel_device_info pnv_m_info = {
3004e390cabSriastradh GEN3_FEATURES,
3014e390cabSriastradh PLATFORM(INTEL_PINEVIEW),
3024e390cabSriastradh .is_mobile = 1,
3034e390cabSriastradh .display.has_hotplug = 1,
3044e390cabSriastradh .display.has_overlay = 1,
3054e390cabSriastradh };
3064e390cabSriastradh
3074e390cabSriastradh #define GEN4_FEATURES \
3084e390cabSriastradh GEN(4), \
3094e390cabSriastradh .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
3104e390cabSriastradh .display.has_hotplug = 1, \
3114e390cabSriastradh .display.has_gmch = 1, \
3124e390cabSriastradh .gpu_reset_clobbers_display = true, \
3134e390cabSriastradh .engine_mask = BIT(RCS0), \
3144e390cabSriastradh .has_snoop = true, \
3154e390cabSriastradh .has_coherent_ggtt = true, \
3164e390cabSriastradh I9XX_PIPE_OFFSETS, \
3174e390cabSriastradh I9XX_CURSOR_OFFSETS, \
3184e390cabSriastradh I965_COLORS, \
3194e390cabSriastradh GEN_DEFAULT_PAGE_SIZES, \
3204e390cabSriastradh GEN_DEFAULT_REGIONS
3214e390cabSriastradh
3224e390cabSriastradh static const struct intel_device_info i965g_info = {
3234e390cabSriastradh GEN4_FEATURES,
3244e390cabSriastradh PLATFORM(INTEL_I965G),
3254e390cabSriastradh .display.has_overlay = 1,
3264e390cabSriastradh .hws_needs_physical = 1,
3274e390cabSriastradh .has_snoop = false,
3284e390cabSriastradh };
3294e390cabSriastradh
3304e390cabSriastradh static const struct intel_device_info i965gm_info = {
3314e390cabSriastradh GEN4_FEATURES,
3324e390cabSriastradh PLATFORM(INTEL_I965GM),
3334e390cabSriastradh .is_mobile = 1,
3344e390cabSriastradh .display.has_fbc = 1,
3354e390cabSriastradh .display.has_overlay = 1,
3364e390cabSriastradh .display.supports_tv = 1,
3374e390cabSriastradh .hws_needs_physical = 1,
3384e390cabSriastradh .has_snoop = false,
3394e390cabSriastradh };
3404e390cabSriastradh
3414e390cabSriastradh static const struct intel_device_info g45_info = {
3424e390cabSriastradh GEN4_FEATURES,
3434e390cabSriastradh PLATFORM(INTEL_G45),
3444e390cabSriastradh .engine_mask = BIT(RCS0) | BIT(VCS0),
3454e390cabSriastradh .gpu_reset_clobbers_display = false,
3464e390cabSriastradh };
3474e390cabSriastradh
3484e390cabSriastradh static const struct intel_device_info gm45_info = {
3494e390cabSriastradh GEN4_FEATURES,
3504e390cabSriastradh PLATFORM(INTEL_GM45),
3514e390cabSriastradh .is_mobile = 1,
3524e390cabSriastradh .display.has_fbc = 1,
3534e390cabSriastradh .display.supports_tv = 1,
3544e390cabSriastradh .engine_mask = BIT(RCS0) | BIT(VCS0),
3554e390cabSriastradh .gpu_reset_clobbers_display = false,
3564e390cabSriastradh };
3574e390cabSriastradh
3584e390cabSriastradh #define GEN5_FEATURES \
3594e390cabSriastradh GEN(5), \
3604e390cabSriastradh .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
3614e390cabSriastradh .display.has_hotplug = 1, \
3624e390cabSriastradh .engine_mask = BIT(RCS0) | BIT(VCS0), \
3634e390cabSriastradh .has_snoop = true, \
3644e390cabSriastradh .has_coherent_ggtt = true, \
3654e390cabSriastradh /* ilk does support rc6, but we do not implement [power] contexts */ \
3664e390cabSriastradh .has_rc6 = 0, \
3674e390cabSriastradh I9XX_PIPE_OFFSETS, \
3684e390cabSriastradh I9XX_CURSOR_OFFSETS, \
3694e390cabSriastradh ILK_COLORS, \
3704e390cabSriastradh GEN_DEFAULT_PAGE_SIZES, \
3714e390cabSriastradh GEN_DEFAULT_REGIONS
3724e390cabSriastradh
3734e390cabSriastradh static const struct intel_device_info ilk_d_info = {
3744e390cabSriastradh GEN5_FEATURES,
3754e390cabSriastradh PLATFORM(INTEL_IRONLAKE),
3764e390cabSriastradh };
3774e390cabSriastradh
3784e390cabSriastradh static const struct intel_device_info ilk_m_info = {
3794e390cabSriastradh GEN5_FEATURES,
3804e390cabSriastradh PLATFORM(INTEL_IRONLAKE),
3814e390cabSriastradh .is_mobile = 1,
3824e390cabSriastradh .display.has_fbc = 1,
3834e390cabSriastradh };
3844e390cabSriastradh
3854e390cabSriastradh #define GEN6_FEATURES \
3864e390cabSriastradh GEN(6), \
3874e390cabSriastradh .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
3884e390cabSriastradh .display.has_hotplug = 1, \
3894e390cabSriastradh .display.has_fbc = 1, \
3904e390cabSriastradh .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
3914e390cabSriastradh .has_coherent_ggtt = true, \
3924e390cabSriastradh .has_llc = 1, \
3934e390cabSriastradh .has_rc6 = 1, \
3944e390cabSriastradh .has_rc6p = 1, \
3954e390cabSriastradh .has_rps = true, \
3964e390cabSriastradh .ppgtt_type = INTEL_PPGTT_ALIASING, \
3974e390cabSriastradh .ppgtt_size = 31, \
3984e390cabSriastradh I9XX_PIPE_OFFSETS, \
3994e390cabSriastradh I9XX_CURSOR_OFFSETS, \
4004e390cabSriastradh ILK_COLORS, \
4014e390cabSriastradh GEN_DEFAULT_PAGE_SIZES, \
4024e390cabSriastradh GEN_DEFAULT_REGIONS
4034e390cabSriastradh
4044e390cabSriastradh #define SNB_D_PLATFORM \
4054e390cabSriastradh GEN6_FEATURES, \
4064e390cabSriastradh PLATFORM(INTEL_SANDYBRIDGE)
4074e390cabSriastradh
4084e390cabSriastradh static const struct intel_device_info snb_d_gt1_info = {
4094e390cabSriastradh SNB_D_PLATFORM,
4104e390cabSriastradh .gt = 1,
4114e390cabSriastradh };
4124e390cabSriastradh
4134e390cabSriastradh static const struct intel_device_info snb_d_gt2_info = {
4144e390cabSriastradh SNB_D_PLATFORM,
4154e390cabSriastradh .gt = 2,
4164e390cabSriastradh };
4174e390cabSriastradh
4184e390cabSriastradh #define SNB_M_PLATFORM \
4194e390cabSriastradh GEN6_FEATURES, \
4204e390cabSriastradh PLATFORM(INTEL_SANDYBRIDGE), \
4214e390cabSriastradh .is_mobile = 1
4224e390cabSriastradh
4234e390cabSriastradh
4244e390cabSriastradh static const struct intel_device_info snb_m_gt1_info = {
4254e390cabSriastradh SNB_M_PLATFORM,
4264e390cabSriastradh .gt = 1,
4274e390cabSriastradh };
4284e390cabSriastradh
4294e390cabSriastradh static const struct intel_device_info snb_m_gt2_info = {
4304e390cabSriastradh SNB_M_PLATFORM,
4314e390cabSriastradh .gt = 2,
4324e390cabSriastradh };
4334e390cabSriastradh
4344e390cabSriastradh #define GEN7_FEATURES \
4354e390cabSriastradh GEN(7), \
4364e390cabSriastradh .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
4374e390cabSriastradh .display.has_hotplug = 1, \
4384e390cabSriastradh .display.has_fbc = 1, \
4394e390cabSriastradh .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
4404e390cabSriastradh .has_coherent_ggtt = true, \
4414e390cabSriastradh .has_llc = 1, \
4424e390cabSriastradh .has_rc6 = 1, \
4434e390cabSriastradh .has_rc6p = 1, \
4444e390cabSriastradh .has_rps = true, \
445*c7be4527Sriastradh .ppgtt_type = INTEL_PPGTT_ALIASING, \
4464e390cabSriastradh .ppgtt_size = 31, \
4474e390cabSriastradh IVB_PIPE_OFFSETS, \
4484e390cabSriastradh IVB_CURSOR_OFFSETS, \
4494e390cabSriastradh IVB_COLORS, \
4504e390cabSriastradh GEN_DEFAULT_PAGE_SIZES, \
4514e390cabSriastradh GEN_DEFAULT_REGIONS
4524e390cabSriastradh
4534e390cabSriastradh #define IVB_D_PLATFORM \
4544e390cabSriastradh GEN7_FEATURES, \
4554e390cabSriastradh PLATFORM(INTEL_IVYBRIDGE), \
4564e390cabSriastradh .has_l3_dpf = 1
4574e390cabSriastradh
4584e390cabSriastradh static const struct intel_device_info ivb_d_gt1_info = {
4594e390cabSriastradh IVB_D_PLATFORM,
4604e390cabSriastradh .gt = 1,
4614e390cabSriastradh };
4624e390cabSriastradh
4634e390cabSriastradh static const struct intel_device_info ivb_d_gt2_info = {
4644e390cabSriastradh IVB_D_PLATFORM,
4654e390cabSriastradh .gt = 2,
4664e390cabSriastradh };
4674e390cabSriastradh
4684e390cabSriastradh #define IVB_M_PLATFORM \
4694e390cabSriastradh GEN7_FEATURES, \
4704e390cabSriastradh PLATFORM(INTEL_IVYBRIDGE), \
4714e390cabSriastradh .is_mobile = 1, \
4724e390cabSriastradh .has_l3_dpf = 1
4734e390cabSriastradh
4744e390cabSriastradh static const struct intel_device_info ivb_m_gt1_info = {
4754e390cabSriastradh IVB_M_PLATFORM,
4764e390cabSriastradh .gt = 1,
4774e390cabSriastradh };
4784e390cabSriastradh
4794e390cabSriastradh static const struct intel_device_info ivb_m_gt2_info = {
4804e390cabSriastradh IVB_M_PLATFORM,
4814e390cabSriastradh .gt = 2,
4824e390cabSriastradh };
4834e390cabSriastradh
4844e390cabSriastradh static const struct intel_device_info ivb_q_info = {
4854e390cabSriastradh GEN7_FEATURES,
4864e390cabSriastradh PLATFORM(INTEL_IVYBRIDGE),
4874e390cabSriastradh .gt = 2,
4884e390cabSriastradh .pipe_mask = 0, /* legal, last one wins */
4894e390cabSriastradh .has_l3_dpf = 1,
4904e390cabSriastradh };
4914e390cabSriastradh
4924e390cabSriastradh static const struct intel_device_info vlv_info = {
4934e390cabSriastradh PLATFORM(INTEL_VALLEYVIEW),
4944e390cabSriastradh GEN(7),
4954e390cabSriastradh .is_lp = 1,
4964e390cabSriastradh .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B),
4974e390cabSriastradh .has_runtime_pm = 1,
4984e390cabSriastradh .has_rc6 = 1,
4994e390cabSriastradh .has_rps = true,
5004e390cabSriastradh .display.has_gmch = 1,
5014e390cabSriastradh .display.has_hotplug = 1,
502*c7be4527Sriastradh .ppgtt_type = INTEL_PPGTT_ALIASING,
5034e390cabSriastradh .ppgtt_size = 31,
5044e390cabSriastradh .has_snoop = true,
5054e390cabSriastradh .has_coherent_ggtt = false,
5064e390cabSriastradh .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0),
5074e390cabSriastradh .display_mmio_offset = VLV_DISPLAY_BASE,
5084e390cabSriastradh I9XX_PIPE_OFFSETS,
5094e390cabSriastradh I9XX_CURSOR_OFFSETS,
5104e390cabSriastradh I965_COLORS,
5114e390cabSriastradh GEN_DEFAULT_PAGE_SIZES,
5124e390cabSriastradh GEN_DEFAULT_REGIONS,
5134e390cabSriastradh };
5144e390cabSriastradh
5154e390cabSriastradh #define G75_FEATURES \
5164e390cabSriastradh GEN7_FEATURES, \
5174e390cabSriastradh .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
5184e390cabSriastradh .display.has_ddi = 1, \
5194e390cabSriastradh .has_fpga_dbg = 1, \
5204e390cabSriastradh .display.has_psr = 1, \
5214e390cabSriastradh .display.has_dp_mst = 1, \
5224e390cabSriastradh .has_rc6p = 0 /* RC6p removed-by HSW */, \
5234e390cabSriastradh HSW_PIPE_OFFSETS, \
5244e390cabSriastradh .has_runtime_pm = 1
5254e390cabSriastradh
5264e390cabSriastradh #define HSW_PLATFORM \
5274e390cabSriastradh G75_FEATURES, \
5284e390cabSriastradh PLATFORM(INTEL_HASWELL), \
5294e390cabSriastradh .has_l3_dpf = 1
5304e390cabSriastradh
5314e390cabSriastradh static const struct intel_device_info hsw_gt1_info = {
5324e390cabSriastradh HSW_PLATFORM,
5334e390cabSriastradh .gt = 1,
5344e390cabSriastradh };
5354e390cabSriastradh
5364e390cabSriastradh static const struct intel_device_info hsw_gt2_info = {
5374e390cabSriastradh HSW_PLATFORM,
5384e390cabSriastradh .gt = 2,
5394e390cabSriastradh };
5404e390cabSriastradh
5414e390cabSriastradh static const struct intel_device_info hsw_gt3_info = {
5424e390cabSriastradh HSW_PLATFORM,
5434e390cabSriastradh .gt = 3,
5444e390cabSriastradh };
5454e390cabSriastradh
5464e390cabSriastradh #define GEN8_FEATURES \
5474e390cabSriastradh G75_FEATURES, \
5484e390cabSriastradh GEN(8), \
5494e390cabSriastradh .has_logical_ring_contexts = 1, \
5504e390cabSriastradh .ppgtt_type = INTEL_PPGTT_FULL, \
5514e390cabSriastradh .ppgtt_size = 48, \
5524e390cabSriastradh .has_64bit_reloc = 1, \
5534e390cabSriastradh .has_reset_engine = 1
5544e390cabSriastradh
5554e390cabSriastradh #define BDW_PLATFORM \
5564e390cabSriastradh GEN8_FEATURES, \
5574e390cabSriastradh PLATFORM(INTEL_BROADWELL)
5584e390cabSriastradh
5594e390cabSriastradh static const struct intel_device_info bdw_gt1_info = {
5604e390cabSriastradh BDW_PLATFORM,
5614e390cabSriastradh .gt = 1,
5624e390cabSriastradh };
5634e390cabSriastradh
5644e390cabSriastradh static const struct intel_device_info bdw_gt2_info = {
5654e390cabSriastradh BDW_PLATFORM,
5664e390cabSriastradh .gt = 2,
5674e390cabSriastradh };
5684e390cabSriastradh
5694e390cabSriastradh static const struct intel_device_info bdw_rsvd_info = {
5704e390cabSriastradh BDW_PLATFORM,
5714e390cabSriastradh .gt = 3,
5724e390cabSriastradh /* According to the device ID those devices are GT3, they were
5734e390cabSriastradh * previously treated as not GT3, keep it like that.
5744e390cabSriastradh */
5754e390cabSriastradh };
5764e390cabSriastradh
5774e390cabSriastradh static const struct intel_device_info bdw_gt3_info = {
5784e390cabSriastradh BDW_PLATFORM,
5794e390cabSriastradh .gt = 3,
5804e390cabSriastradh .engine_mask =
5814e390cabSriastradh BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
5824e390cabSriastradh };
5834e390cabSriastradh
5844e390cabSriastradh static const struct intel_device_info chv_info = {
5854e390cabSriastradh PLATFORM(INTEL_CHERRYVIEW),
5864e390cabSriastradh GEN(8),
5874e390cabSriastradh .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
5884e390cabSriastradh .display.has_hotplug = 1,
5894e390cabSriastradh .is_lp = 1,
5904e390cabSriastradh .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0),
5914e390cabSriastradh .has_64bit_reloc = 1,
5924e390cabSriastradh .has_runtime_pm = 1,
5934e390cabSriastradh .has_rc6 = 1,
5944e390cabSriastradh .has_rps = true,
5954e390cabSriastradh .has_logical_ring_contexts = 1,
5964e390cabSriastradh .display.has_gmch = 1,
5974e390cabSriastradh .ppgtt_type = INTEL_PPGTT_ALIASING,
5984e390cabSriastradh .ppgtt_size = 32,
5994e390cabSriastradh .has_reset_engine = 1,
6004e390cabSriastradh .has_snoop = true,
6014e390cabSriastradh .has_coherent_ggtt = false,
6024e390cabSriastradh .display_mmio_offset = VLV_DISPLAY_BASE,
6034e390cabSriastradh CHV_PIPE_OFFSETS,
6044e390cabSriastradh CHV_CURSOR_OFFSETS,
6054e390cabSriastradh CHV_COLORS,
6064e390cabSriastradh GEN_DEFAULT_PAGE_SIZES,
6074e390cabSriastradh GEN_DEFAULT_REGIONS,
6084e390cabSriastradh };
6094e390cabSriastradh
6104e390cabSriastradh #define GEN9_DEFAULT_PAGE_SIZES \
6114e390cabSriastradh .page_sizes = I915_GTT_PAGE_SIZE_4K | \
6124e390cabSriastradh I915_GTT_PAGE_SIZE_64K
6134e390cabSriastradh
6144e390cabSriastradh #define GEN9_FEATURES \
6154e390cabSriastradh GEN8_FEATURES, \
6164e390cabSriastradh GEN(9), \
6174e390cabSriastradh GEN9_DEFAULT_PAGE_SIZES, \
6184e390cabSriastradh .has_logical_ring_preemption = 1, \
6194e390cabSriastradh .display.has_csr = 1, \
6204e390cabSriastradh .has_gt_uc = 1, \
6214e390cabSriastradh .display.has_hdcp = 1, \
6224e390cabSriastradh .display.has_ipc = 1, \
6234e390cabSriastradh .ddb_size = 896
6244e390cabSriastradh
6254e390cabSriastradh #define SKL_PLATFORM \
6264e390cabSriastradh GEN9_FEATURES, \
6274e390cabSriastradh PLATFORM(INTEL_SKYLAKE)
6284e390cabSriastradh
6294e390cabSriastradh static const struct intel_device_info skl_gt1_info = {
6304e390cabSriastradh SKL_PLATFORM,
6314e390cabSriastradh .gt = 1,
6324e390cabSriastradh };
6334e390cabSriastradh
6344e390cabSriastradh static const struct intel_device_info skl_gt2_info = {
6354e390cabSriastradh SKL_PLATFORM,
6364e390cabSriastradh .gt = 2,
6374e390cabSriastradh };
6384e390cabSriastradh
6394e390cabSriastradh #define SKL_GT3_PLUS_PLATFORM \
6404e390cabSriastradh SKL_PLATFORM, \
6414e390cabSriastradh .engine_mask = \
6424e390cabSriastradh BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1)
6434e390cabSriastradh
6444e390cabSriastradh
6454e390cabSriastradh static const struct intel_device_info skl_gt3_info = {
6464e390cabSriastradh SKL_GT3_PLUS_PLATFORM,
6474e390cabSriastradh .gt = 3,
6484e390cabSriastradh };
6494e390cabSriastradh
6504e390cabSriastradh static const struct intel_device_info skl_gt4_info = {
6514e390cabSriastradh SKL_GT3_PLUS_PLATFORM,
6524e390cabSriastradh .gt = 4,
6534e390cabSriastradh };
6544e390cabSriastradh
6554e390cabSriastradh #define GEN9_LP_FEATURES \
6564e390cabSriastradh GEN(9), \
6574e390cabSriastradh .is_lp = 1, \
6584e390cabSriastradh .display.has_hotplug = 1, \
6594e390cabSriastradh .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
6604e390cabSriastradh .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
6614e390cabSriastradh .has_64bit_reloc = 1, \
6624e390cabSriastradh .display.has_ddi = 1, \
6634e390cabSriastradh .has_fpga_dbg = 1, \
6644e390cabSriastradh .display.has_fbc = 1, \
6654e390cabSriastradh .display.has_hdcp = 1, \
6664e390cabSriastradh .display.has_psr = 1, \
6674e390cabSriastradh .has_runtime_pm = 1, \
6684e390cabSriastradh .display.has_csr = 1, \
6694e390cabSriastradh .has_rc6 = 1, \
6704e390cabSriastradh .has_rps = true, \
6714e390cabSriastradh .display.has_dp_mst = 1, \
6724e390cabSriastradh .has_logical_ring_contexts = 1, \
6734e390cabSriastradh .has_logical_ring_preemption = 1, \
6744e390cabSriastradh .has_gt_uc = 1, \
6754e390cabSriastradh .ppgtt_type = INTEL_PPGTT_FULL, \
6764e390cabSriastradh .ppgtt_size = 48, \
6774e390cabSriastradh .has_reset_engine = 1, \
6784e390cabSriastradh .has_snoop = true, \
6794e390cabSriastradh .has_coherent_ggtt = false, \
6804e390cabSriastradh .display.has_ipc = 1, \
6814e390cabSriastradh HSW_PIPE_OFFSETS, \
6824e390cabSriastradh IVB_CURSOR_OFFSETS, \
6834e390cabSriastradh IVB_COLORS, \
6844e390cabSriastradh GEN9_DEFAULT_PAGE_SIZES, \
6854e390cabSriastradh GEN_DEFAULT_REGIONS
6864e390cabSriastradh
6874e390cabSriastradh static const struct intel_device_info bxt_info = {
6884e390cabSriastradh GEN9_LP_FEATURES,
6894e390cabSriastradh PLATFORM(INTEL_BROXTON),
6904e390cabSriastradh .ddb_size = 512,
6914e390cabSriastradh };
6924e390cabSriastradh
6934e390cabSriastradh static const struct intel_device_info glk_info = {
6944e390cabSriastradh GEN9_LP_FEATURES,
6954e390cabSriastradh PLATFORM(INTEL_GEMINILAKE),
6964e390cabSriastradh .ddb_size = 1024,
6974e390cabSriastradh GLK_COLORS,
6984e390cabSriastradh };
6994e390cabSriastradh
7004e390cabSriastradh #define KBL_PLATFORM \
7014e390cabSriastradh GEN9_FEATURES, \
7024e390cabSriastradh PLATFORM(INTEL_KABYLAKE)
7034e390cabSriastradh
7044e390cabSriastradh static const struct intel_device_info kbl_gt1_info = {
7054e390cabSriastradh KBL_PLATFORM,
7064e390cabSriastradh .gt = 1,
7074e390cabSriastradh };
7084e390cabSriastradh
7094e390cabSriastradh static const struct intel_device_info kbl_gt2_info = {
7104e390cabSriastradh KBL_PLATFORM,
7114e390cabSriastradh .gt = 2,
7124e390cabSriastradh };
7134e390cabSriastradh
7144e390cabSriastradh static const struct intel_device_info kbl_gt3_info = {
7154e390cabSriastradh KBL_PLATFORM,
7164e390cabSriastradh .gt = 3,
7174e390cabSriastradh .engine_mask =
7184e390cabSriastradh BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
7194e390cabSriastradh };
7204e390cabSriastradh
7214e390cabSriastradh #define CFL_PLATFORM \
7224e390cabSriastradh GEN9_FEATURES, \
7234e390cabSriastradh PLATFORM(INTEL_COFFEELAKE)
7244e390cabSriastradh
7254e390cabSriastradh static const struct intel_device_info cfl_gt1_info = {
7264e390cabSriastradh CFL_PLATFORM,
7274e390cabSriastradh .gt = 1,
7284e390cabSriastradh };
7294e390cabSriastradh
7304e390cabSriastradh static const struct intel_device_info cfl_gt2_info = {
7314e390cabSriastradh CFL_PLATFORM,
7324e390cabSriastradh .gt = 2,
7334e390cabSriastradh };
7344e390cabSriastradh
7354e390cabSriastradh static const struct intel_device_info cfl_gt3_info = {
7364e390cabSriastradh CFL_PLATFORM,
7374e390cabSriastradh .gt = 3,
7384e390cabSriastradh .engine_mask =
7394e390cabSriastradh BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
7404e390cabSriastradh };
7414e390cabSriastradh
7424e390cabSriastradh #define GEN10_FEATURES \
7434e390cabSriastradh GEN9_FEATURES, \
7444e390cabSriastradh GEN(10), \
7454e390cabSriastradh .ddb_size = 1024, \
7464e390cabSriastradh .display.has_dsc = 1, \
7474e390cabSriastradh .has_coherent_ggtt = false, \
7484e390cabSriastradh GLK_COLORS
7494e390cabSriastradh
7504e390cabSriastradh static const struct intel_device_info cnl_info = {
7514e390cabSriastradh GEN10_FEATURES,
7524e390cabSriastradh PLATFORM(INTEL_CANNONLAKE),
7534e390cabSriastradh .gt = 2,
7544e390cabSriastradh };
7554e390cabSriastradh
7564e390cabSriastradh #define GEN11_DEFAULT_PAGE_SIZES \
7574e390cabSriastradh .page_sizes = I915_GTT_PAGE_SIZE_4K | \
7584e390cabSriastradh I915_GTT_PAGE_SIZE_64K | \
7594e390cabSriastradh I915_GTT_PAGE_SIZE_2M
7604e390cabSriastradh
7614e390cabSriastradh #define GEN11_FEATURES \
7624e390cabSriastradh GEN10_FEATURES, \
7634e390cabSriastradh GEN11_DEFAULT_PAGE_SIZES, \
7644e390cabSriastradh .pipe_offsets = { \
7654e390cabSriastradh [TRANSCODER_A] = PIPE_A_OFFSET, \
7664e390cabSriastradh [TRANSCODER_B] = PIPE_B_OFFSET, \
7674e390cabSriastradh [TRANSCODER_C] = PIPE_C_OFFSET, \
7684e390cabSriastradh [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
7694e390cabSriastradh [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
7704e390cabSriastradh [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
7714e390cabSriastradh }, \
7724e390cabSriastradh .trans_offsets = { \
7734e390cabSriastradh [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
7744e390cabSriastradh [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
7754e390cabSriastradh [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
7764e390cabSriastradh [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
7774e390cabSriastradh [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
7784e390cabSriastradh [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
7794e390cabSriastradh }, \
7804e390cabSriastradh GEN(11), \
7814e390cabSriastradh .ddb_size = 2048, \
7824e390cabSriastradh .has_logical_ring_elsq = 1, \
7834e390cabSriastradh .color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }
7844e390cabSriastradh
7854e390cabSriastradh static const struct intel_device_info icl_info = {
7864e390cabSriastradh GEN11_FEATURES,
7874e390cabSriastradh PLATFORM(INTEL_ICELAKE),
7884e390cabSriastradh .engine_mask =
7894e390cabSriastradh BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
7904e390cabSriastradh };
7914e390cabSriastradh
7924e390cabSriastradh static const struct intel_device_info ehl_info = {
7934e390cabSriastradh GEN11_FEATURES,
7944e390cabSriastradh PLATFORM(INTEL_ELKHARTLAKE),
7954e390cabSriastradh .require_force_probe = 1,
7964e390cabSriastradh .engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0),
7974e390cabSriastradh .ppgtt_size = 36,
7984e390cabSriastradh };
7994e390cabSriastradh
8004e390cabSriastradh #define GEN12_FEATURES \
8014e390cabSriastradh GEN11_FEATURES, \
8024e390cabSriastradh GEN(12), \
8034e390cabSriastradh .pipe_offsets = { \
8044e390cabSriastradh [TRANSCODER_A] = PIPE_A_OFFSET, \
8054e390cabSriastradh [TRANSCODER_B] = PIPE_B_OFFSET, \
8064e390cabSriastradh [TRANSCODER_C] = PIPE_C_OFFSET, \
8074e390cabSriastradh [TRANSCODER_D] = PIPE_D_OFFSET, \
8084e390cabSriastradh [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
8094e390cabSriastradh [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
8104e390cabSriastradh }, \
8114e390cabSriastradh .trans_offsets = { \
8124e390cabSriastradh [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
8134e390cabSriastradh [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
8144e390cabSriastradh [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
8154e390cabSriastradh [TRANSCODER_D] = TRANSCODER_D_OFFSET, \
8164e390cabSriastradh [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
8174e390cabSriastradh [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
8184e390cabSriastradh }, \
8194e390cabSriastradh TGL_CURSOR_OFFSETS, \
8204e390cabSriastradh .has_global_mocs = 1, \
8214e390cabSriastradh .display.has_dsb = 1
8224e390cabSriastradh
8234e390cabSriastradh static const struct intel_device_info tgl_info = {
8244e390cabSriastradh GEN12_FEATURES,
8254e390cabSriastradh PLATFORM(INTEL_TIGERLAKE),
8264e390cabSriastradh .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),
8274e390cabSriastradh .require_force_probe = 1,
8284e390cabSriastradh .display.has_modular_fia = 1,
8294e390cabSriastradh .engine_mask =
8304e390cabSriastradh BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
8314e390cabSriastradh .has_rps = false, /* XXX disabled for debugging */
8324e390cabSriastradh };
8334e390cabSriastradh
8344e390cabSriastradh #define GEN12_DGFX_FEATURES \
8354e390cabSriastradh GEN12_FEATURES, \
8364e390cabSriastradh .is_dgfx = 1
8374e390cabSriastradh
8384e390cabSriastradh #undef GEN
8394e390cabSriastradh #undef PLATFORM
8404e390cabSriastradh
8414e390cabSriastradh /*
8424e390cabSriastradh * Make sure any device matches here are from most specific to most
8434e390cabSriastradh * general. For example, since the Quanta match is based on the subsystem
8444e390cabSriastradh * and subvendor IDs, we need it to come before the more general IVB
8454e390cabSriastradh * PCI ID matches, otherwise we'll use the wrong info struct above.
8464e390cabSriastradh */
8474e390cabSriastradh static const struct pci_device_id pciidlist[] = {
8484e390cabSriastradh INTEL_I830_IDS(&i830_info),
8494e390cabSriastradh INTEL_I845G_IDS(&i845g_info),
8504e390cabSriastradh INTEL_I85X_IDS(&i85x_info),
8514e390cabSriastradh INTEL_I865G_IDS(&i865g_info),
8524e390cabSriastradh INTEL_I915G_IDS(&i915g_info),
8534e390cabSriastradh INTEL_I915GM_IDS(&i915gm_info),
8544e390cabSriastradh INTEL_I945G_IDS(&i945g_info),
8554e390cabSriastradh INTEL_I945GM_IDS(&i945gm_info),
8564e390cabSriastradh INTEL_I965G_IDS(&i965g_info),
8574e390cabSriastradh INTEL_G33_IDS(&g33_info),
8584e390cabSriastradh INTEL_I965GM_IDS(&i965gm_info),
8594e390cabSriastradh INTEL_GM45_IDS(&gm45_info),
8604e390cabSriastradh INTEL_G45_IDS(&g45_info),
8614e390cabSriastradh INTEL_PINEVIEW_G_IDS(&pnv_g_info),
8624e390cabSriastradh INTEL_PINEVIEW_M_IDS(&pnv_m_info),
8634e390cabSriastradh INTEL_IRONLAKE_D_IDS(&ilk_d_info),
8644e390cabSriastradh INTEL_IRONLAKE_M_IDS(&ilk_m_info),
8654e390cabSriastradh INTEL_SNB_D_GT1_IDS(&snb_d_gt1_info),
8664e390cabSriastradh INTEL_SNB_D_GT2_IDS(&snb_d_gt2_info),
8674e390cabSriastradh INTEL_SNB_M_GT1_IDS(&snb_m_gt1_info),
8684e390cabSriastradh INTEL_SNB_M_GT2_IDS(&snb_m_gt2_info),
8694e390cabSriastradh INTEL_IVB_Q_IDS(&ivb_q_info), /* must be first IVB */
8704e390cabSriastradh INTEL_IVB_M_GT1_IDS(&ivb_m_gt1_info),
8714e390cabSriastradh INTEL_IVB_M_GT2_IDS(&ivb_m_gt2_info),
8724e390cabSriastradh INTEL_IVB_D_GT1_IDS(&ivb_d_gt1_info),
8734e390cabSriastradh INTEL_IVB_D_GT2_IDS(&ivb_d_gt2_info),
8744e390cabSriastradh INTEL_HSW_GT1_IDS(&hsw_gt1_info),
8754e390cabSriastradh INTEL_HSW_GT2_IDS(&hsw_gt2_info),
8764e390cabSriastradh INTEL_HSW_GT3_IDS(&hsw_gt3_info),
8774e390cabSriastradh INTEL_VLV_IDS(&vlv_info),
8784e390cabSriastradh INTEL_BDW_GT1_IDS(&bdw_gt1_info),
8794e390cabSriastradh INTEL_BDW_GT2_IDS(&bdw_gt2_info),
8804e390cabSriastradh INTEL_BDW_GT3_IDS(&bdw_gt3_info),
8814e390cabSriastradh INTEL_BDW_RSVD_IDS(&bdw_rsvd_info),
8824e390cabSriastradh INTEL_CHV_IDS(&chv_info),
8834e390cabSriastradh INTEL_SKL_GT1_IDS(&skl_gt1_info),
8844e390cabSriastradh INTEL_SKL_GT2_IDS(&skl_gt2_info),
8854e390cabSriastradh INTEL_SKL_GT3_IDS(&skl_gt3_info),
8864e390cabSriastradh INTEL_SKL_GT4_IDS(&skl_gt4_info),
8874e390cabSriastradh INTEL_BXT_IDS(&bxt_info),
8884e390cabSriastradh INTEL_GLK_IDS(&glk_info),
8894e390cabSriastradh INTEL_KBL_GT1_IDS(&kbl_gt1_info),
8904e390cabSriastradh INTEL_KBL_GT2_IDS(&kbl_gt2_info),
8914e390cabSriastradh INTEL_KBL_GT3_IDS(&kbl_gt3_info),
8924e390cabSriastradh INTEL_KBL_GT4_IDS(&kbl_gt3_info),
8934e390cabSriastradh INTEL_AML_KBL_GT2_IDS(&kbl_gt2_info),
8944e390cabSriastradh INTEL_CFL_S_GT1_IDS(&cfl_gt1_info),
8954e390cabSriastradh INTEL_CFL_S_GT2_IDS(&cfl_gt2_info),
8964e390cabSriastradh INTEL_CFL_H_GT1_IDS(&cfl_gt1_info),
8974e390cabSriastradh INTEL_CFL_H_GT2_IDS(&cfl_gt2_info),
8984e390cabSriastradh INTEL_CFL_U_GT2_IDS(&cfl_gt2_info),
8994e390cabSriastradh INTEL_CFL_U_GT3_IDS(&cfl_gt3_info),
9004e390cabSriastradh INTEL_WHL_U_GT1_IDS(&cfl_gt1_info),
9014e390cabSriastradh INTEL_WHL_U_GT2_IDS(&cfl_gt2_info),
9024e390cabSriastradh INTEL_AML_CFL_GT2_IDS(&cfl_gt2_info),
9034e390cabSriastradh INTEL_WHL_U_GT3_IDS(&cfl_gt3_info),
9044e390cabSriastradh INTEL_CML_GT1_IDS(&cfl_gt1_info),
9054e390cabSriastradh INTEL_CML_GT2_IDS(&cfl_gt2_info),
9064e390cabSriastradh INTEL_CML_U_GT1_IDS(&cfl_gt1_info),
9074e390cabSriastradh INTEL_CML_U_GT2_IDS(&cfl_gt2_info),
9084e390cabSriastradh INTEL_CNL_IDS(&cnl_info),
9094e390cabSriastradh INTEL_ICL_11_IDS(&icl_info),
9104e390cabSriastradh INTEL_EHL_IDS(&ehl_info),
9114e390cabSriastradh INTEL_TGL_12_IDS(&tgl_info),
9124e390cabSriastradh {0, 0, 0}
9134e390cabSriastradh };
9144e390cabSriastradh MODULE_DEVICE_TABLE(pci, pciidlist);
9154e390cabSriastradh
91695117f5fSriastradh #ifdef __NetBSD__
91795117f5fSriastradh
91895117f5fSriastradh /* XXX Kludge to expose this to NetBSD driver attachment goop. */
91995117f5fSriastradh const struct pci_device_id *const i915_device_ids = pciidlist;
92095117f5fSriastradh const size_t i915_n_device_ids = __arraycount(pciidlist);
92195117f5fSriastradh
92295117f5fSriastradh #else
i915_pci_remove(struct pci_dev * pdev)9234e390cabSriastradh static void i915_pci_remove(struct pci_dev *pdev)
9244e390cabSriastradh {
9254e390cabSriastradh struct drm_i915_private *i915;
9264e390cabSriastradh
9274e390cabSriastradh i915 = pci_get_drvdata(pdev);
9284e390cabSriastradh if (!i915) /* driver load aborted, nothing to cleanup */
9294e390cabSriastradh return;
9304e390cabSriastradh
9314e390cabSriastradh i915_driver_remove(i915);
9324e390cabSriastradh pci_set_drvdata(pdev, NULL);
9334e390cabSriastradh
9344e390cabSriastradh drm_dev_put(&i915->drm);
9354e390cabSriastradh }
9364e390cabSriastradh
9374e390cabSriastradh /* is device_id present in comma separated list of ids */
force_probe(u16 device_id,const char * devices)9384e390cabSriastradh static bool force_probe(u16 device_id, const char *devices)
9394e390cabSriastradh {
9404e390cabSriastradh char *s, *p, *tok;
9414e390cabSriastradh bool ret;
9424e390cabSriastradh
9434e390cabSriastradh /* FIXME: transitional */
9444e390cabSriastradh if (i915_modparams.alpha_support) {
9454e390cabSriastradh DRM_INFO("i915.alpha_support is deprecated, use i915.force_probe=%04x instead\n",
9464e390cabSriastradh device_id);
9474e390cabSriastradh return true;
9484e390cabSriastradh }
9494e390cabSriastradh
9504e390cabSriastradh if (!devices || !*devices)
9514e390cabSriastradh return false;
9524e390cabSriastradh
9534e390cabSriastradh /* match everything */
9544e390cabSriastradh if (strcmp(devices, "*") == 0)
9554e390cabSriastradh return true;
9564e390cabSriastradh
9574e390cabSriastradh s = kstrdup(devices, GFP_KERNEL);
9584e390cabSriastradh if (!s)
9594e390cabSriastradh return false;
9604e390cabSriastradh
9614e390cabSriastradh for (p = s, ret = false; (tok = strsep(&p, ",")) != NULL; ) {
9624e390cabSriastradh u16 val;
9634e390cabSriastradh
9644e390cabSriastradh if (kstrtou16(tok, 16, &val) == 0 && val == device_id) {
9654e390cabSriastradh ret = true;
9664e390cabSriastradh break;
9674e390cabSriastradh }
9684e390cabSriastradh }
9694e390cabSriastradh
9704e390cabSriastradh kfree(s);
9714e390cabSriastradh
9724e390cabSriastradh return ret;
9734e390cabSriastradh }
9744e390cabSriastradh
i915_pci_probe(struct pci_dev * pdev,const struct pci_device_id * ent)9754e390cabSriastradh static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
9764e390cabSriastradh {
9774e390cabSriastradh struct intel_device_info *intel_info =
9784e390cabSriastradh (struct intel_device_info *) ent->driver_data;
9794e390cabSriastradh int err;
9804e390cabSriastradh
9814e390cabSriastradh if (intel_info->require_force_probe &&
9824e390cabSriastradh !force_probe(pdev->device, i915_modparams.force_probe)) {
9834e390cabSriastradh DRM_INFO("Your graphics device %04x is not properly supported by the driver in this\n"
9844e390cabSriastradh "kernel version. To force driver probe anyway, use i915.force_probe=%04x\n"
9854e390cabSriastradh "module parameter or CONFIG_DRM_I915_FORCE_PROBE=%04x configuration option,\n"
9864e390cabSriastradh "or (recommended) check for kernel updates.\n",
9874e390cabSriastradh pdev->device, pdev->device, pdev->device);
9884e390cabSriastradh return -ENODEV;
9894e390cabSriastradh }
9904e390cabSriastradh
9914e390cabSriastradh /* Only bind to function 0 of the device. Early generations
9924e390cabSriastradh * used function 1 as a placeholder for multi-head. This causes
9934e390cabSriastradh * us confusion instead, especially on the systems where both
9944e390cabSriastradh * functions have the same PCI-ID!
9954e390cabSriastradh */
9964e390cabSriastradh if (PCI_FUNC(pdev->devfn))
9974e390cabSriastradh return -ENODEV;
9984e390cabSriastradh
99921412d4aSriastradh #ifndef __NetBSD__ /* XXX vga switcheroo */
10004e390cabSriastradh /*
10014e390cabSriastradh * apple-gmux is needed on dual GPU MacBook Pro
10024e390cabSriastradh * to probe the panel if we're the inactive GPU.
10034e390cabSriastradh */
10044e390cabSriastradh if (vga_switcheroo_client_probe_defer(pdev))
10054e390cabSriastradh return -EPROBE_DEFER;
100621412d4aSriastradh #endif
10074e390cabSriastradh
10084e390cabSriastradh err = i915_driver_probe(pdev, ent);
10094e390cabSriastradh if (err)
10104e390cabSriastradh return err;
10114e390cabSriastradh
10124e390cabSriastradh if (i915_inject_probe_failure(pci_get_drvdata(pdev))) {
10134e390cabSriastradh i915_pci_remove(pdev);
10144e390cabSriastradh return -ENODEV;
10154e390cabSriastradh }
10164e390cabSriastradh
10174e390cabSriastradh err = i915_live_selftests(pdev);
10184e390cabSriastradh if (err) {
10194e390cabSriastradh i915_pci_remove(pdev);
10204e390cabSriastradh return err > 0 ? -ENOTTY : err;
10214e390cabSriastradh }
10224e390cabSriastradh
10234e390cabSriastradh err = i915_perf_selftests(pdev);
10244e390cabSriastradh if (err) {
10254e390cabSriastradh i915_pci_remove(pdev);
10264e390cabSriastradh return err > 0 ? -ENOTTY : err;
10274e390cabSriastradh }
10284e390cabSriastradh
10294e390cabSriastradh return 0;
10304e390cabSriastradh }
10314e390cabSriastradh
103241ec0267Sriastradh #ifndef __NetBSD__
10334e390cabSriastradh static struct pci_driver i915_pci_driver = {
10344e390cabSriastradh .name = DRIVER_NAME,
10354e390cabSriastradh .id_table = pciidlist,
10364e390cabSriastradh .probe = i915_pci_probe,
10374e390cabSriastradh .remove = i915_pci_remove,
10384e390cabSriastradh .driver.pm = &i915_pm_ops,
10394e390cabSriastradh };
104041ec0267Sriastradh #endif
10414e390cabSriastradh
i915_init(void)10424e390cabSriastradh static int __init i915_init(void)
10434e390cabSriastradh {
10444e390cabSriastradh bool use_kms = true;
10454e390cabSriastradh int err;
10464e390cabSriastradh
10474e390cabSriastradh err = i915_globals_init();
10484e390cabSriastradh if (err)
10494e390cabSriastradh return err;
10504e390cabSriastradh
10514e390cabSriastradh err = i915_mock_selftests();
10524e390cabSriastradh if (err)
10534e390cabSriastradh return err > 0 ? 0 : err;
10544e390cabSriastradh
10554e390cabSriastradh /*
10564e390cabSriastradh * Enable KMS by default, unless explicitly overriden by
10574e390cabSriastradh * either the i915.modeset prarameter or by the
10584e390cabSriastradh * vga_text_mode_force boot option.
10594e390cabSriastradh */
10604e390cabSriastradh
10614e390cabSriastradh if (i915_modparams.modeset == 0)
10624e390cabSriastradh use_kms = false;
10634e390cabSriastradh
10644e390cabSriastradh if (vgacon_text_force() && i915_modparams.modeset == -1)
10654e390cabSriastradh use_kms = false;
10664e390cabSriastradh
10674e390cabSriastradh if (!use_kms) {
10684e390cabSriastradh /* Silently fail loading to not upset userspace. */
10694e390cabSriastradh DRM_DEBUG_DRIVER("KMS disabled.\n");
10704e390cabSriastradh return 0;
10714e390cabSriastradh }
10724e390cabSriastradh
10734e390cabSriastradh err = pci_register_driver(&i915_pci_driver);
10744e390cabSriastradh if (err)
10754e390cabSriastradh return err;
10764e390cabSriastradh
10774e390cabSriastradh i915_perf_sysctl_register();
10784e390cabSriastradh return 0;
10794e390cabSriastradh }
10804e390cabSriastradh
i915_exit(void)10814e390cabSriastradh static void __exit i915_exit(void)
10824e390cabSriastradh {
10834e390cabSriastradh if (!i915_pci_driver.driver.owner)
10844e390cabSriastradh return;
10854e390cabSriastradh
10864e390cabSriastradh i915_perf_sysctl_unregister();
10874e390cabSriastradh pci_unregister_driver(&i915_pci_driver);
10884e390cabSriastradh i915_globals_exit();
10894e390cabSriastradh }
10904e390cabSriastradh
10914e390cabSriastradh module_init(i915_init);
10924e390cabSriastradh module_exit(i915_exit);
10934e390cabSriastradh
109495117f5fSriastradh #endif
109595117f5fSriastradh
10964e390cabSriastradh MODULE_AUTHOR("Tungsten Graphics, Inc.");
10974e390cabSriastradh MODULE_AUTHOR("Intel Corporation");
10984e390cabSriastradh
10994e390cabSriastradh MODULE_DESCRIPTION(DRIVER_DESC);
11004e390cabSriastradh MODULE_LICENSE("GPL and additional rights");
1101