blob: 732101ed57fb8a265d6f4aa709ba9414c184f7d7 [file] [log] [blame]
Chris Wilson42f55512016-06-24 14:00:26 +01001/*
2 * Copyright © 2016 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 *
23 */
24
Chris Wilsona09d0ba2016-06-24 14:00:27 +010025#include <linux/console.h>
Chris Wilson42f55512016-06-24 14:00:26 +010026#include <linux/vgaarb.h>
27#include <linux/vga_switcheroo.h>
28
29#include "i915_drv.h"
Chris Wilson953c7f82017-02-13 17:15:12 +000030#include "i915_selftest.h"
Chris Wilson42f55512016-06-24 14:00:26 +010031
32#define GEN_DEFAULT_PIPEOFFSETS \
33 .pipe_offsets = { PIPE_A_OFFSET, PIPE_B_OFFSET, \
34 PIPE_C_OFFSET, PIPE_EDP_OFFSET }, \
35 .trans_offsets = { TRANSCODER_A_OFFSET, TRANSCODER_B_OFFSET, \
36 TRANSCODER_C_OFFSET, TRANSCODER_EDP_OFFSET }, \
37 .palette_offsets = { PALETTE_A_OFFSET, PALETTE_B_OFFSET }
38
39#define GEN_CHV_PIPEOFFSETS \
40 .pipe_offsets = { PIPE_A_OFFSET, PIPE_B_OFFSET, \
41 CHV_PIPE_C_OFFSET }, \
42 .trans_offsets = { TRANSCODER_A_OFFSET, TRANSCODER_B_OFFSET, \
43 CHV_TRANSCODER_C_OFFSET, }, \
44 .palette_offsets = { PALETTE_A_OFFSET, PALETTE_B_OFFSET, \
45 CHV_PALETTE_C_OFFSET }
46
47#define CURSOR_OFFSETS \
48 .cursor_offsets = { CURSOR_A_OFFSET, CURSOR_B_OFFSET, CHV_CURSOR_C_OFFSET }
49
50#define IVB_CURSOR_OFFSETS \
51 .cursor_offsets = { CURSOR_A_OFFSET, IVB_CURSOR_B_OFFSET, IVB_CURSOR_C_OFFSET }
52
53#define BDW_COLORS \
54 .color = { .degamma_lut_size = 512, .gamma_lut_size = 512 }
55#define CHV_COLORS \
56 .color = { .degamma_lut_size = 65, .gamma_lut_size = 257 }
57
Jani Nikulaa5ce9292016-11-30 17:43:02 +020058/* Keep in gen based order, and chronological order within a gen */
Carlos Santa0eec8dc2016-08-17 12:30:51 -070059#define GEN2_FEATURES \
60 .gen = 2, .num_pipes = 1, \
61 .has_overlay = 1, .overlay_needs_physical = 1, \
Carlos Santa804b8712016-08-17 12:30:55 -070062 .has_gmch_display = 1, \
Carlos Santa31776592016-08-17 12:30:56 -070063 .hws_needs_physical = 1, \
Carlos Santa0eec8dc2016-08-17 12:30:51 -070064 .ring_mask = RENDER_RING, \
65 GEN_DEFAULT_PIPEOFFSETS, \
66 CURSOR_OFFSETS
67
Chris Wilson42f55512016-06-24 14:00:26 +010068static const struct intel_device_info intel_i830_info = {
Carlos Santa0eec8dc2016-08-17 12:30:51 -070069 GEN2_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +020070 .platform = INTEL_I830,
Carlos Santa0eec8dc2016-08-17 12:30:51 -070071 .is_mobile = 1, .cursor_needs_physical = 1,
72 .num_pipes = 2, /* legal, last one wins */
Chris Wilson42f55512016-06-24 14:00:26 +010073};
74
Jani Nikula2a307c22016-11-30 17:43:04 +020075static const struct intel_device_info intel_i845g_info = {
Carlos Santa0eec8dc2016-08-17 12:30:51 -070076 GEN2_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +020077 .platform = INTEL_I845G,
Chris Wilson42f55512016-06-24 14:00:26 +010078};
79
80static const struct intel_device_info intel_i85x_info = {
Carlos Santa0eec8dc2016-08-17 12:30:51 -070081 GEN2_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +020082 .platform = INTEL_I85X, .is_mobile = 1,
Carlos Santa0eec8dc2016-08-17 12:30:51 -070083 .num_pipes = 2, /* legal, last one wins */
Chris Wilson42f55512016-06-24 14:00:26 +010084 .cursor_needs_physical = 1,
Chris Wilson42f55512016-06-24 14:00:26 +010085 .has_fbc = 1,
Chris Wilson42f55512016-06-24 14:00:26 +010086};
87
88static const struct intel_device_info intel_i865g_info = {
Carlos Santa0eec8dc2016-08-17 12:30:51 -070089 GEN2_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +020090 .platform = INTEL_I865G,
Chris Wilson42f55512016-06-24 14:00:26 +010091};
92
Carlos Santa54d2a6a2016-08-17 12:30:50 -070093#define GEN3_FEATURES \
94 .gen = 3, .num_pipes = 2, \
Carlos Santa804b8712016-08-17 12:30:55 -070095 .has_gmch_display = 1, \
Carlos Santa54d2a6a2016-08-17 12:30:50 -070096 .ring_mask = RENDER_RING, \
97 GEN_DEFAULT_PIPEOFFSETS, \
98 CURSOR_OFFSETS
99
Chris Wilson42f55512016-06-24 14:00:26 +0100100static const struct intel_device_info intel_i915g_info = {
Carlos Santa54d2a6a2016-08-17 12:30:50 -0700101 GEN3_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200102 .platform = INTEL_I915G, .cursor_needs_physical = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100103 .has_overlay = 1, .overlay_needs_physical = 1,
Carlos Santa31776592016-08-17 12:30:56 -0700104 .hws_needs_physical = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100105};
Jani Nikulaa5ce9292016-11-30 17:43:02 +0200106
Chris Wilson42f55512016-06-24 14:00:26 +0100107static const struct intel_device_info intel_i915gm_info = {
Carlos Santa54d2a6a2016-08-17 12:30:50 -0700108 GEN3_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200109 .platform = INTEL_I915GM,
Carlos Santa54d2a6a2016-08-17 12:30:50 -0700110 .is_mobile = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100111 .cursor_needs_physical = 1,
112 .has_overlay = 1, .overlay_needs_physical = 1,
113 .supports_tv = 1,
114 .has_fbc = 1,
Carlos Santa31776592016-08-17 12:30:56 -0700115 .hws_needs_physical = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100116};
Jani Nikulaa5ce9292016-11-30 17:43:02 +0200117
Chris Wilson42f55512016-06-24 14:00:26 +0100118static const struct intel_device_info intel_i945g_info = {
Carlos Santa54d2a6a2016-08-17 12:30:50 -0700119 GEN3_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200120 .platform = INTEL_I945G,
Carlos Santa54d2a6a2016-08-17 12:30:50 -0700121 .has_hotplug = 1, .cursor_needs_physical = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100122 .has_overlay = 1, .overlay_needs_physical = 1,
Carlos Santa31776592016-08-17 12:30:56 -0700123 .hws_needs_physical = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100124};
Jani Nikulaa5ce9292016-11-30 17:43:02 +0200125
Chris Wilson42f55512016-06-24 14:00:26 +0100126static const struct intel_device_info intel_i945gm_info = {
Carlos Santa54d2a6a2016-08-17 12:30:50 -0700127 GEN3_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200128 .platform = INTEL_I945GM, .is_mobile = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100129 .has_hotplug = 1, .cursor_needs_physical = 1,
130 .has_overlay = 1, .overlay_needs_physical = 1,
131 .supports_tv = 1,
132 .has_fbc = 1,
Carlos Santa31776592016-08-17 12:30:56 -0700133 .hws_needs_physical = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100134};
135
Jani Nikulaa5ce9292016-11-30 17:43:02 +0200136static const struct intel_device_info intel_g33_info = {
137 GEN3_FEATURES,
138 .platform = INTEL_G33,
139 .has_hotplug = 1,
140 .has_overlay = 1,
141};
142
143static const struct intel_device_info intel_pineview_info = {
144 GEN3_FEATURES,
Jani Nikula73f67aa2016-12-07 22:48:09 +0200145 .platform = INTEL_PINEVIEW, .is_mobile = 1,
Jani Nikulaa5ce9292016-11-30 17:43:02 +0200146 .has_hotplug = 1,
147 .has_overlay = 1,
148};
149
Carlos Santa4d495be2016-08-17 12:30:49 -0700150#define GEN4_FEATURES \
151 .gen = 4, .num_pipes = 2, \
152 .has_hotplug = 1, \
Carlos Santa804b8712016-08-17 12:30:55 -0700153 .has_gmch_display = 1, \
Carlos Santa4d495be2016-08-17 12:30:49 -0700154 .ring_mask = RENDER_RING, \
155 GEN_DEFAULT_PIPEOFFSETS, \
156 CURSOR_OFFSETS
157
Chris Wilson42f55512016-06-24 14:00:26 +0100158static const struct intel_device_info intel_i965g_info = {
Carlos Santa4d495be2016-08-17 12:30:49 -0700159 GEN4_FEATURES,
Jani Nikulac0f86832016-12-07 12:13:04 +0200160 .platform = INTEL_I965G,
Chris Wilson42f55512016-06-24 14:00:26 +0100161 .has_overlay = 1,
Carlos Santa31776592016-08-17 12:30:56 -0700162 .hws_needs_physical = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100163};
164
165static const struct intel_device_info intel_i965gm_info = {
Carlos Santa4d495be2016-08-17 12:30:49 -0700166 GEN4_FEATURES,
Jani Nikulac0f86832016-12-07 12:13:04 +0200167 .platform = INTEL_I965GM,
Carlos Santa4d495be2016-08-17 12:30:49 -0700168 .is_mobile = 1, .has_fbc = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100169 .has_overlay = 1,
170 .supports_tv = 1,
Carlos Santa31776592016-08-17 12:30:56 -0700171 .hws_needs_physical = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100172};
173
Chris Wilson42f55512016-06-24 14:00:26 +0100174static const struct intel_device_info intel_g45_info = {
Carlos Santa4d495be2016-08-17 12:30:49 -0700175 GEN4_FEATURES,
Jani Nikulaf69c11a2016-11-30 17:43:05 +0200176 .platform = INTEL_G45,
Carlos Santa4d495be2016-08-17 12:30:49 -0700177 .has_pipe_cxsr = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100178 .ring_mask = RENDER_RING | BSD_RING,
Chris Wilson42f55512016-06-24 14:00:26 +0100179};
180
181static const struct intel_device_info intel_gm45_info = {
Carlos Santa4d495be2016-08-17 12:30:49 -0700182 GEN4_FEATURES,
Jani Nikulaf69c11a2016-11-30 17:43:05 +0200183 .platform = INTEL_GM45,
Carlos Santa31776592016-08-17 12:30:56 -0700184 .is_mobile = 1, .has_fbc = 1,
Carlos Santa4d495be2016-08-17 12:30:49 -0700185 .has_pipe_cxsr = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100186 .supports_tv = 1,
187 .ring_mask = RENDER_RING | BSD_RING,
Chris Wilson42f55512016-06-24 14:00:26 +0100188};
189
Carlos Santaa1323382016-08-17 12:30:47 -0700190#define GEN5_FEATURES \
191 .gen = 5, .num_pipes = 2, \
Carlos Santa31776592016-08-17 12:30:56 -0700192 .has_hotplug = 1, \
Carlos Santab355f102016-08-17 12:30:48 -0700193 .has_gmbus_irq = 1, \
Carlos Santaa1323382016-08-17 12:30:47 -0700194 .ring_mask = RENDER_RING | BSD_RING, \
195 GEN_DEFAULT_PIPEOFFSETS, \
196 CURSOR_OFFSETS
197
Chris Wilson42f55512016-06-24 14:00:26 +0100198static const struct intel_device_info intel_ironlake_d_info = {
Carlos Santaa1323382016-08-17 12:30:47 -0700199 GEN5_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200200 .platform = INTEL_IRONLAKE,
Chris Wilson42f55512016-06-24 14:00:26 +0100201};
202
203static const struct intel_device_info intel_ironlake_m_info = {
Carlos Santaa1323382016-08-17 12:30:47 -0700204 GEN5_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200205 .platform = INTEL_IRONLAKE,
Carlos Santaa1323382016-08-17 12:30:47 -0700206 .is_mobile = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100207};
208
Carlos Santa07db6be2016-08-17 12:30:38 -0700209#define GEN6_FEATURES \
210 .gen = 6, .num_pipes = 2, \
Carlos Santa31776592016-08-17 12:30:56 -0700211 .has_hotplug = 1, \
Carlos Santa07db6be2016-08-17 12:30:38 -0700212 .has_fbc = 1, \
213 .ring_mask = RENDER_RING | BSD_RING | BLT_RING, \
214 .has_llc = 1, \
Carlos Santa86f36242016-08-17 12:30:44 -0700215 .has_rc6 = 1, \
Carlos Santa33b5bf82016-08-17 12:30:45 -0700216 .has_rc6p = 1, \
Carlos Santab355f102016-08-17 12:30:48 -0700217 .has_gmbus_irq = 1, \
Carlos Santae1a525362016-08-17 12:30:52 -0700218 .has_hw_contexts = 1, \
Michel Thierry9e1d0e62016-12-05 17:57:03 -0800219 .has_aliasing_ppgtt = 1, \
Carlos Santa07db6be2016-08-17 12:30:38 -0700220 GEN_DEFAULT_PIPEOFFSETS, \
221 CURSOR_OFFSETS
222
Chris Wilson42f55512016-06-24 14:00:26 +0100223static const struct intel_device_info intel_sandybridge_d_info = {
Carlos Santa07db6be2016-08-17 12:30:38 -0700224 GEN6_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200225 .platform = INTEL_SANDYBRIDGE,
Chris Wilson42f55512016-06-24 14:00:26 +0100226};
227
228static const struct intel_device_info intel_sandybridge_m_info = {
Carlos Santa07db6be2016-08-17 12:30:38 -0700229 GEN6_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200230 .platform = INTEL_SANDYBRIDGE,
Carlos Santa07db6be2016-08-17 12:30:38 -0700231 .is_mobile = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100232};
233
234#define GEN7_FEATURES \
235 .gen = 7, .num_pipes = 3, \
Carlos Santa31776592016-08-17 12:30:56 -0700236 .has_hotplug = 1, \
Chris Wilson42f55512016-06-24 14:00:26 +0100237 .has_fbc = 1, \
238 .ring_mask = RENDER_RING | BSD_RING | BLT_RING, \
239 .has_llc = 1, \
Carlos Santa86f36242016-08-17 12:30:44 -0700240 .has_rc6 = 1, \
Carlos Santa33b5bf82016-08-17 12:30:45 -0700241 .has_rc6p = 1, \
Carlos Santab355f102016-08-17 12:30:48 -0700242 .has_gmbus_irq = 1, \
Carlos Santae1a525362016-08-17 12:30:52 -0700243 .has_hw_contexts = 1, \
Michel Thierry9e1d0e62016-12-05 17:57:03 -0800244 .has_aliasing_ppgtt = 1, \
245 .has_full_ppgtt = 1, \
Chris Wilson42f55512016-06-24 14:00:26 +0100246 GEN_DEFAULT_PIPEOFFSETS, \
247 IVB_CURSOR_OFFSETS
248
249static const struct intel_device_info intel_ivybridge_d_info = {
250 GEN7_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200251 .platform = INTEL_IVYBRIDGE,
Carlos Santaca9c4522016-08-17 12:30:54 -0700252 .has_l3_dpf = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100253};
254
255static const struct intel_device_info intel_ivybridge_m_info = {
256 GEN7_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200257 .platform = INTEL_IVYBRIDGE,
Chris Wilson42f55512016-06-24 14:00:26 +0100258 .is_mobile = 1,
Carlos Santaca9c4522016-08-17 12:30:54 -0700259 .has_l3_dpf = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100260};
261
262static const struct intel_device_info intel_ivybridge_q_info = {
263 GEN7_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200264 .platform = INTEL_IVYBRIDGE,
Chris Wilson42f55512016-06-24 14:00:26 +0100265 .num_pipes = 0, /* legal, last one wins */
Carlos Santaca9c4522016-08-17 12:30:54 -0700266 .has_l3_dpf = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100267};
268
Carlos Santa8d9c20e2016-08-17 12:30:37 -0700269static const struct intel_device_info intel_valleyview_info = {
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200270 .platform = INTEL_VALLEYVIEW,
Rodrigo Vivieb6f7712016-12-19 13:55:08 -0800271 .gen = 7,
272 .is_lp = 1,
273 .num_pipes = 2,
274 .has_psr = 1,
275 .has_runtime_pm = 1,
276 .has_rc6 = 1,
277 .has_gmbus_irq = 1,
278 .has_hw_contexts = 1,
279 .has_gmch_display = 1,
280 .has_hotplug = 1,
281 .has_aliasing_ppgtt = 1,
282 .has_full_ppgtt = 1,
283 .ring_mask = RENDER_RING | BSD_RING | BLT_RING,
284 .display_mmio_offset = VLV_DISPLAY_BASE,
285 GEN_DEFAULT_PIPEOFFSETS,
286 CURSOR_OFFSETS
Chris Wilson42f55512016-06-24 14:00:26 +0100287};
288
289#define HSW_FEATURES \
290 GEN7_FEATURES, \
291 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, \
292 .has_ddi = 1, \
Carlos Santa6e3b84d2016-08-17 12:30:36 -0700293 .has_fpga_dbg = 1, \
Carlos Santa4aa4c232016-08-17 12:30:39 -0700294 .has_psr = 1, \
Carlos Santa53233f02016-08-17 12:30:43 -0700295 .has_resource_streamer = 1, \
Carlos Santa1d3fe532016-08-17 12:30:46 -0700296 .has_dp_mst = 1, \
Carlos Santa33b5bf82016-08-17 12:30:45 -0700297 .has_rc6p = 0 /* RC6p removed-by HSW */, \
Carlos Santa4aa4c232016-08-17 12:30:39 -0700298 .has_runtime_pm = 1
Chris Wilson42f55512016-06-24 14:00:26 +0100299
Carlos Santa8d9c20e2016-08-17 12:30:37 -0700300static const struct intel_device_info intel_haswell_info = {
Chris Wilson42f55512016-06-24 14:00:26 +0100301 HSW_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200302 .platform = INTEL_HASWELL,
Carlos Santaca9c4522016-08-17 12:30:54 -0700303 .has_l3_dpf = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100304};
305
Chris Wilson42f55512016-06-24 14:00:26 +0100306#define BDW_FEATURES \
307 HSW_FEATURES, \
Carlos Santa4586f1d2016-08-17 12:30:53 -0700308 BDW_COLORS, \
Joonas Lahtinendfc51482016-11-03 10:39:46 +0200309 .has_logical_ring_contexts = 1, \
Michel Thierry9e1d0e62016-12-05 17:57:03 -0800310 .has_full_48bit_ppgtt = 1, \
Joonas Lahtinendfc51482016-11-03 10:39:46 +0200311 .has_64bit_reloc = 1
Chris Wilson42f55512016-06-24 14:00:26 +0100312
Carlos Santa8d9c20e2016-08-17 12:30:37 -0700313static const struct intel_device_info intel_broadwell_info = {
Chris Wilson42f55512016-06-24 14:00:26 +0100314 BDW_FEATURES,
315 .gen = 8,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200316 .platform = INTEL_BROADWELL,
Chris Wilson42f55512016-06-24 14:00:26 +0100317};
318
Carlos Santa8d9c20e2016-08-17 12:30:37 -0700319static const struct intel_device_info intel_broadwell_gt3_info = {
Chris Wilson42f55512016-06-24 14:00:26 +0100320 BDW_FEATURES,
321 .gen = 8,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200322 .platform = INTEL_BROADWELL,
Chris Wilson42f55512016-06-24 14:00:26 +0100323 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING,
324};
325
Chris Wilson42f55512016-06-24 14:00:26 +0100326static const struct intel_device_info intel_cherryview_info = {
327 .gen = 8, .num_pipes = 3,
Carlos Santa31776592016-08-17 12:30:56 -0700328 .has_hotplug = 1,
Rodrigo Vivi8727dc02016-12-18 13:36:26 -0800329 .is_lp = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100330 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200331 .platform = INTEL_CHERRYVIEW,
Joonas Lahtinendfc51482016-11-03 10:39:46 +0200332 .has_64bit_reloc = 1,
Carlos Santa6e3b84d2016-08-17 12:30:36 -0700333 .has_psr = 1,
Carlos Santa4aa4c232016-08-17 12:30:39 -0700334 .has_runtime_pm = 1,
Carlos Santa53233f02016-08-17 12:30:43 -0700335 .has_resource_streamer = 1,
Carlos Santa86f36242016-08-17 12:30:44 -0700336 .has_rc6 = 1,
Carlos Santab355f102016-08-17 12:30:48 -0700337 .has_gmbus_irq = 1,
Carlos Santae1a525362016-08-17 12:30:52 -0700338 .has_hw_contexts = 1,
Carlos Santa4586f1d2016-08-17 12:30:53 -0700339 .has_logical_ring_contexts = 1,
Carlos Santa804b8712016-08-17 12:30:55 -0700340 .has_gmch_display = 1,
Michel Thierry9e1d0e62016-12-05 17:57:03 -0800341 .has_aliasing_ppgtt = 1,
342 .has_full_ppgtt = 1,
Chris Wilson42f55512016-06-24 14:00:26 +0100343 .display_mmio_offset = VLV_DISPLAY_BASE,
344 GEN_CHV_PIPEOFFSETS,
345 CURSOR_OFFSETS,
346 CHV_COLORS,
347};
348
349static const struct intel_device_info intel_skylake_info = {
350 BDW_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200351 .platform = INTEL_SKYLAKE,
Chris Wilson42f55512016-06-24 14:00:26 +0100352 .gen = 9,
Carlos Santa3bacde12016-08-17 12:30:42 -0700353 .has_csr = 1,
Carlos Santa3d810fb2016-08-17 12:30:57 -0700354 .has_guc = 1,
Deepak M6f3fff62016-09-15 15:01:10 +0530355 .ddb_size = 896,
Chris Wilson42f55512016-06-24 14:00:26 +0100356};
357
358static const struct intel_device_info intel_skylake_gt3_info = {
359 BDW_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200360 .platform = INTEL_SKYLAKE,
Chris Wilson42f55512016-06-24 14:00:26 +0100361 .gen = 9,
Carlos Santa3bacde12016-08-17 12:30:42 -0700362 .has_csr = 1,
Carlos Santa3d810fb2016-08-17 12:30:57 -0700363 .has_guc = 1,
Deepak M6f3fff62016-09-15 15:01:10 +0530364 .ddb_size = 896,
Chris Wilson42f55512016-06-24 14:00:26 +0100365 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING,
366};
367
Rodrigo Vivi80fa66b2016-12-01 11:33:16 +0200368#define GEN9_LP_FEATURES \
369 .gen = 9, \
Ander Conselvan de Oliveira3e4274f2016-11-10 17:23:09 +0200370 .is_lp = 1, \
Rodrigo Vivi80fa66b2016-12-01 11:33:16 +0200371 .has_hotplug = 1, \
372 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, \
373 .num_pipes = 3, \
374 .has_64bit_reloc = 1, \
375 .has_ddi = 1, \
376 .has_fpga_dbg = 1, \
377 .has_fbc = 1, \
378 .has_runtime_pm = 1, \
379 .has_pooled_eu = 0, \
380 .has_csr = 1, \
381 .has_resource_streamer = 1, \
382 .has_rc6 = 1, \
383 .has_dp_mst = 1, \
384 .has_gmbus_irq = 1, \
385 .has_hw_contexts = 1, \
386 .has_logical_ring_contexts = 1, \
387 .has_guc = 1, \
388 .has_decoupled_mmio = 1, \
Michel Thierry9e1d0e62016-12-05 17:57:03 -0800389 .has_aliasing_ppgtt = 1, \
390 .has_full_ppgtt = 1, \
391 .has_full_48bit_ppgtt = 1, \
Rodrigo Vivi80fa66b2016-12-01 11:33:16 +0200392 GEN_DEFAULT_PIPEOFFSETS, \
393 IVB_CURSOR_OFFSETS, \
394 BDW_COLORS
395
Chris Wilson42f55512016-06-24 14:00:26 +0100396static const struct intel_device_info intel_broxton_info = {
Rodrigo Vivi80fa66b2016-12-01 11:33:16 +0200397 GEN9_LP_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200398 .platform = INTEL_BROXTON,
Deepak M6f3fff62016-09-15 15:01:10 +0530399 .ddb_size = 512,
Chris Wilson42f55512016-06-24 14:00:26 +0100400};
401
Ander Conselvan de Oliveirac22097f2016-11-14 16:25:26 +0200402static const struct intel_device_info intel_geminilake_info = {
Ander Conselvan de Oliveirac22097f2016-11-14 16:25:26 +0200403 GEN9_LP_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200404 .platform = INTEL_GEMINILAKE,
405 .is_alpha_support = 1,
Ander Conselvan de Oliveirac22097f2016-11-14 16:25:26 +0200406 .ddb_size = 1024,
Ander Conselvan de Oliveira9751baf2017-01-27 11:02:30 +0200407 .color = { .degamma_lut_size = 0, .gamma_lut_size = 1024 }
Ander Conselvan de Oliveirac22097f2016-11-14 16:25:26 +0200408};
409
Chris Wilson42f55512016-06-24 14:00:26 +0100410static const struct intel_device_info intel_kabylake_info = {
411 BDW_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200412 .platform = INTEL_KABYLAKE,
Chris Wilson42f55512016-06-24 14:00:26 +0100413 .gen = 9,
Carlos Santa3bacde12016-08-17 12:30:42 -0700414 .has_csr = 1,
Carlos Santa3d810fb2016-08-17 12:30:57 -0700415 .has_guc = 1,
Deepak M6f3fff62016-09-15 15:01:10 +0530416 .ddb_size = 896,
Chris Wilson42f55512016-06-24 14:00:26 +0100417};
418
419static const struct intel_device_info intel_kabylake_gt3_info = {
420 BDW_FEATURES,
Jani Nikula2e0d26f2016-12-01 14:49:55 +0200421 .platform = INTEL_KABYLAKE,
Chris Wilson42f55512016-06-24 14:00:26 +0100422 .gen = 9,
Carlos Santa3bacde12016-08-17 12:30:42 -0700423 .has_csr = 1,
Carlos Santa3d810fb2016-08-17 12:30:57 -0700424 .has_guc = 1,
Deepak M6f3fff62016-09-15 15:01:10 +0530425 .ddb_size = 896,
Chris Wilson42f55512016-06-24 14:00:26 +0100426 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING,
427};
428
429/*
430 * Make sure any device matches here are from most specific to most
431 * general. For example, since the Quanta match is based on the subsystem
432 * and subvendor IDs, we need it to come before the more general IVB
433 * PCI ID matches, otherwise we'll use the wrong info struct above.
434 */
435static const struct pci_device_id pciidlist[] = {
436 INTEL_I830_IDS(&intel_i830_info),
Jani Nikula2a307c22016-11-30 17:43:04 +0200437 INTEL_I845G_IDS(&intel_i845g_info),
Chris Wilson42f55512016-06-24 14:00:26 +0100438 INTEL_I85X_IDS(&intel_i85x_info),
439 INTEL_I865G_IDS(&intel_i865g_info),
440 INTEL_I915G_IDS(&intel_i915g_info),
441 INTEL_I915GM_IDS(&intel_i915gm_info),
442 INTEL_I945G_IDS(&intel_i945g_info),
443 INTEL_I945GM_IDS(&intel_i945gm_info),
444 INTEL_I965G_IDS(&intel_i965g_info),
445 INTEL_G33_IDS(&intel_g33_info),
446 INTEL_I965GM_IDS(&intel_i965gm_info),
447 INTEL_GM45_IDS(&intel_gm45_info),
448 INTEL_G45_IDS(&intel_g45_info),
449 INTEL_PINEVIEW_IDS(&intel_pineview_info),
450 INTEL_IRONLAKE_D_IDS(&intel_ironlake_d_info),
451 INTEL_IRONLAKE_M_IDS(&intel_ironlake_m_info),
452 INTEL_SNB_D_IDS(&intel_sandybridge_d_info),
453 INTEL_SNB_M_IDS(&intel_sandybridge_m_info),
454 INTEL_IVB_Q_IDS(&intel_ivybridge_q_info), /* must be first IVB */
455 INTEL_IVB_M_IDS(&intel_ivybridge_m_info),
456 INTEL_IVB_D_IDS(&intel_ivybridge_d_info),
Carlos Santa8d9c20e2016-08-17 12:30:37 -0700457 INTEL_HSW_IDS(&intel_haswell_info),
458 INTEL_VLV_IDS(&intel_valleyview_info),
459 INTEL_BDW_GT12_IDS(&intel_broadwell_info),
460 INTEL_BDW_GT3_IDS(&intel_broadwell_gt3_info),
Paulo Zanoni98b2f012017-01-03 18:04:20 -0200461 INTEL_BDW_RSVD_IDS(&intel_broadwell_info),
Chris Wilson42f55512016-06-24 14:00:26 +0100462 INTEL_CHV_IDS(&intel_cherryview_info),
463 INTEL_SKL_GT1_IDS(&intel_skylake_info),
464 INTEL_SKL_GT2_IDS(&intel_skylake_info),
465 INTEL_SKL_GT3_IDS(&intel_skylake_gt3_info),
466 INTEL_SKL_GT4_IDS(&intel_skylake_gt3_info),
467 INTEL_BXT_IDS(&intel_broxton_info),
Ander Conselvan de Oliveira8363e3c2016-11-10 17:23:08 +0200468 INTEL_GLK_IDS(&intel_geminilake_info),
Chris Wilson42f55512016-06-24 14:00:26 +0100469 INTEL_KBL_GT1_IDS(&intel_kabylake_info),
470 INTEL_KBL_GT2_IDS(&intel_kabylake_info),
471 INTEL_KBL_GT3_IDS(&intel_kabylake_gt3_info),
472 INTEL_KBL_GT4_IDS(&intel_kabylake_gt3_info),
473 {0, 0, 0}
474};
475MODULE_DEVICE_TABLE(pci, pciidlist);
476
Chris Wilson953c7f82017-02-13 17:15:12 +0000477static void i915_pci_remove(struct pci_dev *pdev)
478{
479 struct drm_device *dev = pci_get_drvdata(pdev);
480
481 i915_driver_unload(dev);
482 drm_dev_unref(dev);
483}
484
Chris Wilson42f55512016-06-24 14:00:26 +0100485static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
486{
487 struct intel_device_info *intel_info =
488 (struct intel_device_info *) ent->driver_data;
Chris Wilson953c7f82017-02-13 17:15:12 +0000489 int err;
Chris Wilson42f55512016-06-24 14:00:26 +0100490
Jani Nikulac007fb42016-10-31 12:18:28 +0200491 if (IS_ALPHA_SUPPORT(intel_info) && !i915.alpha_support) {
492 DRM_INFO("The driver support for your hardware in this kernel version is alpha quality\n"
493 "See CONFIG_DRM_I915_ALPHA_SUPPORT or i915.alpha_support module parameter\n"
494 "to enable support in this kernel version, or check for kernel updates.\n");
Chris Wilson42f55512016-06-24 14:00:26 +0100495 return -ENODEV;
496 }
497
498 /* Only bind to function 0 of the device. Early generations
499 * used function 1 as a placeholder for multi-head. This causes
500 * us confusion instead, especially on the systems where both
501 * functions have the same PCI-ID!
502 */
503 if (PCI_FUNC(pdev->devfn))
504 return -ENODEV;
505
506 /*
507 * apple-gmux is needed on dual GPU MacBook Pro
508 * to probe the panel if we're the inactive GPU.
509 */
510 if (vga_switcheroo_client_probe_defer(pdev))
511 return -EPROBE_DEFER;
512
Chris Wilson953c7f82017-02-13 17:15:12 +0000513 err = i915_driver_load(pdev, ent);
514 if (err)
515 return err;
Chris Wilson42f55512016-06-24 14:00:26 +0100516
Chris Wilson953c7f82017-02-13 17:15:12 +0000517 err = i915_live_selftests(pdev);
518 if (err) {
519 i915_pci_remove(pdev);
520 return err > 0 ? -ENOTTY : err;
521 }
Chris Wilson42f55512016-06-24 14:00:26 +0100522
Chris Wilson953c7f82017-02-13 17:15:12 +0000523 return 0;
Chris Wilson42f55512016-06-24 14:00:26 +0100524}
525
Chris Wilsona09d0ba2016-06-24 14:00:27 +0100526static struct pci_driver i915_pci_driver = {
Chris Wilson42f55512016-06-24 14:00:26 +0100527 .name = DRIVER_NAME,
528 .id_table = pciidlist,
529 .probe = i915_pci_probe,
530 .remove = i915_pci_remove,
531 .driver.pm = &i915_pm_ops,
532};
Chris Wilsona09d0ba2016-06-24 14:00:27 +0100533
534static int __init i915_init(void)
535{
536 bool use_kms = true;
Chris Wilson953c7f82017-02-13 17:15:12 +0000537 int err;
538
539 err = i915_mock_selftests();
540 if (err)
541 return err > 0 ? 0 : err;
Chris Wilsona09d0ba2016-06-24 14:00:27 +0100542
543 /*
544 * Enable KMS by default, unless explicitly overriden by
545 * either the i915.modeset prarameter or by the
546 * vga_text_mode_force boot option.
547 */
548
549 if (i915.modeset == 0)
550 use_kms = false;
551
552 if (vgacon_text_force() && i915.modeset == -1)
553 use_kms = false;
554
555 if (!use_kms) {
556 /* Silently fail loading to not upset userspace. */
557 DRM_DEBUG_DRIVER("KMS disabled.\n");
558 return 0;
559 }
560
561 return pci_register_driver(&i915_pci_driver);
562}
563
564static void __exit i915_exit(void)
565{
566 if (!i915_pci_driver.driver.owner)
567 return;
568
569 pci_unregister_driver(&i915_pci_driver);
570}
571
572module_init(i915_init);
573module_exit(i915_exit);
574
575MODULE_AUTHOR("Tungsten Graphics, Inc.");
576MODULE_AUTHOR("Intel Corporation");
577
578MODULE_DESCRIPTION(DRIVER_DESC);
579MODULE_LICENSE("GPL and additional rights");