diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_pci.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_pci.c | 503 |
1 files changed, 503 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c new file mode 100644 index 000000000000..949c01686a66 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_pci.c | |||
@@ -0,0 +1,503 @@ | |||
1 | /* | ||
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 | |||
25 | #include <linux/console.h> | ||
26 | #include <linux/vgaarb.h> | ||
27 | #include <linux/vga_switcheroo.h> | ||
28 | |||
29 | #include "i915_drv.h" | ||
30 | |||
31 | #define GEN_DEFAULT_PIPEOFFSETS \ | ||
32 | .pipe_offsets = { PIPE_A_OFFSET, PIPE_B_OFFSET, \ | ||
33 | PIPE_C_OFFSET, PIPE_EDP_OFFSET }, \ | ||
34 | .trans_offsets = { TRANSCODER_A_OFFSET, TRANSCODER_B_OFFSET, \ | ||
35 | TRANSCODER_C_OFFSET, TRANSCODER_EDP_OFFSET }, \ | ||
36 | .palette_offsets = { PALETTE_A_OFFSET, PALETTE_B_OFFSET } | ||
37 | |||
38 | #define GEN_CHV_PIPEOFFSETS \ | ||
39 | .pipe_offsets = { PIPE_A_OFFSET, PIPE_B_OFFSET, \ | ||
40 | CHV_PIPE_C_OFFSET }, \ | ||
41 | .trans_offsets = { TRANSCODER_A_OFFSET, TRANSCODER_B_OFFSET, \ | ||
42 | CHV_TRANSCODER_C_OFFSET, }, \ | ||
43 | .palette_offsets = { PALETTE_A_OFFSET, PALETTE_B_OFFSET, \ | ||
44 | CHV_PALETTE_C_OFFSET } | ||
45 | |||
46 | #define CURSOR_OFFSETS \ | ||
47 | .cursor_offsets = { CURSOR_A_OFFSET, CURSOR_B_OFFSET, CHV_CURSOR_C_OFFSET } | ||
48 | |||
49 | #define IVB_CURSOR_OFFSETS \ | ||
50 | .cursor_offsets = { CURSOR_A_OFFSET, IVB_CURSOR_B_OFFSET, IVB_CURSOR_C_OFFSET } | ||
51 | |||
52 | #define BDW_COLORS \ | ||
53 | .color = { .degamma_lut_size = 512, .gamma_lut_size = 512 } | ||
54 | #define CHV_COLORS \ | ||
55 | .color = { .degamma_lut_size = 65, .gamma_lut_size = 257 } | ||
56 | |||
57 | static const struct intel_device_info intel_i830_info = { | ||
58 | .gen = 2, .is_mobile = 1, .cursor_needs_physical = 1, .num_pipes = 2, | ||
59 | .has_overlay = 1, .overlay_needs_physical = 1, | ||
60 | .ring_mask = RENDER_RING, | ||
61 | GEN_DEFAULT_PIPEOFFSETS, | ||
62 | CURSOR_OFFSETS, | ||
63 | }; | ||
64 | |||
65 | static const struct intel_device_info intel_845g_info = { | ||
66 | .gen = 2, .num_pipes = 1, | ||
67 | .has_overlay = 1, .overlay_needs_physical = 1, | ||
68 | .ring_mask = RENDER_RING, | ||
69 | GEN_DEFAULT_PIPEOFFSETS, | ||
70 | CURSOR_OFFSETS, | ||
71 | }; | ||
72 | |||
73 | static const struct intel_device_info intel_i85x_info = { | ||
74 | .gen = 2, .is_i85x = 1, .is_mobile = 1, .num_pipes = 2, | ||
75 | .cursor_needs_physical = 1, | ||
76 | .has_overlay = 1, .overlay_needs_physical = 1, | ||
77 | .has_fbc = 1, | ||
78 | .ring_mask = RENDER_RING, | ||
79 | GEN_DEFAULT_PIPEOFFSETS, | ||
80 | CURSOR_OFFSETS, | ||
81 | }; | ||
82 | |||
83 | static const struct intel_device_info intel_i865g_info = { | ||
84 | .gen = 2, .num_pipes = 1, | ||
85 | .has_overlay = 1, .overlay_needs_physical = 1, | ||
86 | .ring_mask = RENDER_RING, | ||
87 | GEN_DEFAULT_PIPEOFFSETS, | ||
88 | CURSOR_OFFSETS, | ||
89 | }; | ||
90 | |||
91 | static const struct intel_device_info intel_i915g_info = { | ||
92 | .gen = 3, .is_i915g = 1, .cursor_needs_physical = 1, .num_pipes = 2, | ||
93 | .has_overlay = 1, .overlay_needs_physical = 1, | ||
94 | .ring_mask = RENDER_RING, | ||
95 | GEN_DEFAULT_PIPEOFFSETS, | ||
96 | CURSOR_OFFSETS, | ||
97 | }; | ||
98 | static const struct intel_device_info intel_i915gm_info = { | ||
99 | .gen = 3, .is_mobile = 1, .num_pipes = 2, | ||
100 | .cursor_needs_physical = 1, | ||
101 | .has_overlay = 1, .overlay_needs_physical = 1, | ||
102 | .supports_tv = 1, | ||
103 | .has_fbc = 1, | ||
104 | .ring_mask = RENDER_RING, | ||
105 | GEN_DEFAULT_PIPEOFFSETS, | ||
106 | CURSOR_OFFSETS, | ||
107 | }; | ||
108 | static const struct intel_device_info intel_i945g_info = { | ||
109 | .gen = 3, .has_hotplug = 1, .cursor_needs_physical = 1, .num_pipes = 2, | ||
110 | .has_overlay = 1, .overlay_needs_physical = 1, | ||
111 | .ring_mask = RENDER_RING, | ||
112 | GEN_DEFAULT_PIPEOFFSETS, | ||
113 | CURSOR_OFFSETS, | ||
114 | }; | ||
115 | static const struct intel_device_info intel_i945gm_info = { | ||
116 | .gen = 3, .is_i945gm = 1, .is_mobile = 1, .num_pipes = 2, | ||
117 | .has_hotplug = 1, .cursor_needs_physical = 1, | ||
118 | .has_overlay = 1, .overlay_needs_physical = 1, | ||
119 | .supports_tv = 1, | ||
120 | .has_fbc = 1, | ||
121 | .ring_mask = RENDER_RING, | ||
122 | GEN_DEFAULT_PIPEOFFSETS, | ||
123 | CURSOR_OFFSETS, | ||
124 | }; | ||
125 | |||
126 | static const struct intel_device_info intel_i965g_info = { | ||
127 | .gen = 4, .is_broadwater = 1, .num_pipes = 2, | ||
128 | .has_hotplug = 1, | ||
129 | .has_overlay = 1, | ||
130 | .ring_mask = RENDER_RING, | ||
131 | GEN_DEFAULT_PIPEOFFSETS, | ||
132 | CURSOR_OFFSETS, | ||
133 | }; | ||
134 | |||
135 | static const struct intel_device_info intel_i965gm_info = { | ||
136 | .gen = 4, .is_crestline = 1, .num_pipes = 2, | ||
137 | .is_mobile = 1, .has_fbc = 1, .has_hotplug = 1, | ||
138 | .has_overlay = 1, | ||
139 | .supports_tv = 1, | ||
140 | .ring_mask = RENDER_RING, | ||
141 | GEN_DEFAULT_PIPEOFFSETS, | ||
142 | CURSOR_OFFSETS, | ||
143 | }; | ||
144 | |||
145 | static const struct intel_device_info intel_g33_info = { | ||
146 | .gen = 3, .is_g33 = 1, .num_pipes = 2, | ||
147 | .need_gfx_hws = 1, .has_hotplug = 1, | ||
148 | .has_overlay = 1, | ||
149 | .ring_mask = RENDER_RING, | ||
150 | GEN_DEFAULT_PIPEOFFSETS, | ||
151 | CURSOR_OFFSETS, | ||
152 | }; | ||
153 | |||
154 | static const struct intel_device_info intel_g45_info = { | ||
155 | .gen = 4, .is_g4x = 1, .need_gfx_hws = 1, .num_pipes = 2, | ||
156 | .has_pipe_cxsr = 1, .has_hotplug = 1, | ||
157 | .ring_mask = RENDER_RING | BSD_RING, | ||
158 | GEN_DEFAULT_PIPEOFFSETS, | ||
159 | CURSOR_OFFSETS, | ||
160 | }; | ||
161 | |||
162 | static const struct intel_device_info intel_gm45_info = { | ||
163 | .gen = 4, .is_g4x = 1, .num_pipes = 2, | ||
164 | .is_mobile = 1, .need_gfx_hws = 1, .has_fbc = 1, | ||
165 | .has_pipe_cxsr = 1, .has_hotplug = 1, | ||
166 | .supports_tv = 1, | ||
167 | .ring_mask = RENDER_RING | BSD_RING, | ||
168 | GEN_DEFAULT_PIPEOFFSETS, | ||
169 | CURSOR_OFFSETS, | ||
170 | }; | ||
171 | |||
172 | static const struct intel_device_info intel_pineview_info = { | ||
173 | .gen = 3, .is_g33 = 1, .is_pineview = 1, .is_mobile = 1, .num_pipes = 2, | ||
174 | .need_gfx_hws = 1, .has_hotplug = 1, | ||
175 | .has_overlay = 1, | ||
176 | GEN_DEFAULT_PIPEOFFSETS, | ||
177 | CURSOR_OFFSETS, | ||
178 | }; | ||
179 | |||
180 | static const struct intel_device_info intel_ironlake_d_info = { | ||
181 | .gen = 5, .num_pipes = 2, | ||
182 | .need_gfx_hws = 1, .has_hotplug = 1, | ||
183 | .ring_mask = RENDER_RING | BSD_RING, | ||
184 | GEN_DEFAULT_PIPEOFFSETS, | ||
185 | CURSOR_OFFSETS, | ||
186 | }; | ||
187 | |||
188 | static const struct intel_device_info intel_ironlake_m_info = { | ||
189 | .gen = 5, .is_mobile = 1, .num_pipes = 2, | ||
190 | .need_gfx_hws = 1, .has_hotplug = 1, | ||
191 | .has_fbc = 1, | ||
192 | .ring_mask = RENDER_RING | BSD_RING, | ||
193 | GEN_DEFAULT_PIPEOFFSETS, | ||
194 | CURSOR_OFFSETS, | ||
195 | }; | ||
196 | |||
197 | static const struct intel_device_info intel_sandybridge_d_info = { | ||
198 | .gen = 6, .num_pipes = 2, | ||
199 | .need_gfx_hws = 1, .has_hotplug = 1, | ||
200 | .has_fbc = 1, | ||
201 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING, | ||
202 | .has_llc = 1, | ||
203 | GEN_DEFAULT_PIPEOFFSETS, | ||
204 | CURSOR_OFFSETS, | ||
205 | }; | ||
206 | |||
207 | static const struct intel_device_info intel_sandybridge_m_info = { | ||
208 | .gen = 6, .is_mobile = 1, .num_pipes = 2, | ||
209 | .need_gfx_hws = 1, .has_hotplug = 1, | ||
210 | .has_fbc = 1, | ||
211 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING, | ||
212 | .has_llc = 1, | ||
213 | GEN_DEFAULT_PIPEOFFSETS, | ||
214 | CURSOR_OFFSETS, | ||
215 | }; | ||
216 | |||
217 | #define GEN7_FEATURES \ | ||
218 | .gen = 7, .num_pipes = 3, \ | ||
219 | .need_gfx_hws = 1, .has_hotplug = 1, \ | ||
220 | .has_fbc = 1, \ | ||
221 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING, \ | ||
222 | .has_llc = 1, \ | ||
223 | GEN_DEFAULT_PIPEOFFSETS, \ | ||
224 | IVB_CURSOR_OFFSETS | ||
225 | |||
226 | static const struct intel_device_info intel_ivybridge_d_info = { | ||
227 | GEN7_FEATURES, | ||
228 | .is_ivybridge = 1, | ||
229 | }; | ||
230 | |||
231 | static const struct intel_device_info intel_ivybridge_m_info = { | ||
232 | GEN7_FEATURES, | ||
233 | .is_ivybridge = 1, | ||
234 | .is_mobile = 1, | ||
235 | }; | ||
236 | |||
237 | static const struct intel_device_info intel_ivybridge_q_info = { | ||
238 | GEN7_FEATURES, | ||
239 | .is_ivybridge = 1, | ||
240 | .num_pipes = 0, /* legal, last one wins */ | ||
241 | }; | ||
242 | |||
243 | #define VLV_FEATURES \ | ||
244 | .gen = 7, .num_pipes = 2, \ | ||
245 | .need_gfx_hws = 1, .has_hotplug = 1, \ | ||
246 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING, \ | ||
247 | .display_mmio_offset = VLV_DISPLAY_BASE, \ | ||
248 | GEN_DEFAULT_PIPEOFFSETS, \ | ||
249 | CURSOR_OFFSETS | ||
250 | |||
251 | static const struct intel_device_info intel_valleyview_m_info = { | ||
252 | VLV_FEATURES, | ||
253 | .is_valleyview = 1, | ||
254 | .is_mobile = 1, | ||
255 | }; | ||
256 | |||
257 | static const struct intel_device_info intel_valleyview_d_info = { | ||
258 | VLV_FEATURES, | ||
259 | .is_valleyview = 1, | ||
260 | }; | ||
261 | |||
262 | #define HSW_FEATURES \ | ||
263 | GEN7_FEATURES, \ | ||
264 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, \ | ||
265 | .has_ddi = 1, \ | ||
266 | .has_fpga_dbg = 1 | ||
267 | |||
268 | static const struct intel_device_info intel_haswell_d_info = { | ||
269 | HSW_FEATURES, | ||
270 | .is_haswell = 1, | ||
271 | }; | ||
272 | |||
273 | static const struct intel_device_info intel_haswell_m_info = { | ||
274 | HSW_FEATURES, | ||
275 | .is_haswell = 1, | ||
276 | .is_mobile = 1, | ||
277 | }; | ||
278 | |||
279 | #define BDW_FEATURES \ | ||
280 | HSW_FEATURES, \ | ||
281 | BDW_COLORS | ||
282 | |||
283 | static const struct intel_device_info intel_broadwell_d_info = { | ||
284 | BDW_FEATURES, | ||
285 | .gen = 8, | ||
286 | .is_broadwell = 1, | ||
287 | }; | ||
288 | |||
289 | static const struct intel_device_info intel_broadwell_m_info = { | ||
290 | BDW_FEATURES, | ||
291 | .gen = 8, .is_mobile = 1, | ||
292 | .is_broadwell = 1, | ||
293 | }; | ||
294 | |||
295 | static const struct intel_device_info intel_broadwell_gt3d_info = { | ||
296 | BDW_FEATURES, | ||
297 | .gen = 8, | ||
298 | .is_broadwell = 1, | ||
299 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING, | ||
300 | }; | ||
301 | |||
302 | static const struct intel_device_info intel_broadwell_gt3m_info = { | ||
303 | BDW_FEATURES, | ||
304 | .gen = 8, .is_mobile = 1, | ||
305 | .is_broadwell = 1, | ||
306 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING, | ||
307 | }; | ||
308 | |||
309 | static const struct intel_device_info intel_cherryview_info = { | ||
310 | .gen = 8, .num_pipes = 3, | ||
311 | .need_gfx_hws = 1, .has_hotplug = 1, | ||
312 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, | ||
313 | .is_cherryview = 1, | ||
314 | .display_mmio_offset = VLV_DISPLAY_BASE, | ||
315 | GEN_CHV_PIPEOFFSETS, | ||
316 | CURSOR_OFFSETS, | ||
317 | CHV_COLORS, | ||
318 | }; | ||
319 | |||
320 | static const struct intel_device_info intel_skylake_info = { | ||
321 | BDW_FEATURES, | ||
322 | .is_skylake = 1, | ||
323 | .gen = 9, | ||
324 | }; | ||
325 | |||
326 | static const struct intel_device_info intel_skylake_gt3_info = { | ||
327 | BDW_FEATURES, | ||
328 | .is_skylake = 1, | ||
329 | .gen = 9, | ||
330 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING, | ||
331 | }; | ||
332 | |||
333 | static const struct intel_device_info intel_broxton_info = { | ||
334 | .is_broxton = 1, | ||
335 | .gen = 9, | ||
336 | .need_gfx_hws = 1, .has_hotplug = 1, | ||
337 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, | ||
338 | .num_pipes = 3, | ||
339 | .has_ddi = 1, | ||
340 | .has_fpga_dbg = 1, | ||
341 | .has_fbc = 1, | ||
342 | .has_pooled_eu = 0, | ||
343 | GEN_DEFAULT_PIPEOFFSETS, | ||
344 | IVB_CURSOR_OFFSETS, | ||
345 | BDW_COLORS, | ||
346 | }; | ||
347 | |||
348 | static const struct intel_device_info intel_kabylake_info = { | ||
349 | BDW_FEATURES, | ||
350 | .is_kabylake = 1, | ||
351 | .gen = 9, | ||
352 | }; | ||
353 | |||
354 | static const struct intel_device_info intel_kabylake_gt3_info = { | ||
355 | BDW_FEATURES, | ||
356 | .is_kabylake = 1, | ||
357 | .gen = 9, | ||
358 | .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING, | ||
359 | }; | ||
360 | |||
361 | /* | ||
362 | * Make sure any device matches here are from most specific to most | ||
363 | * general. For example, since the Quanta match is based on the subsystem | ||
364 | * and subvendor IDs, we need it to come before the more general IVB | ||
365 | * PCI ID matches, otherwise we'll use the wrong info struct above. | ||
366 | */ | ||
367 | static const struct pci_device_id pciidlist[] = { | ||
368 | INTEL_I830_IDS(&intel_i830_info), | ||
369 | INTEL_I845G_IDS(&intel_845g_info), | ||
370 | INTEL_I85X_IDS(&intel_i85x_info), | ||
371 | INTEL_I865G_IDS(&intel_i865g_info), | ||
372 | INTEL_I915G_IDS(&intel_i915g_info), | ||
373 | INTEL_I915GM_IDS(&intel_i915gm_info), | ||
374 | INTEL_I945G_IDS(&intel_i945g_info), | ||
375 | INTEL_I945GM_IDS(&intel_i945gm_info), | ||
376 | INTEL_I965G_IDS(&intel_i965g_info), | ||
377 | INTEL_G33_IDS(&intel_g33_info), | ||
378 | INTEL_I965GM_IDS(&intel_i965gm_info), | ||
379 | INTEL_GM45_IDS(&intel_gm45_info), | ||
380 | INTEL_G45_IDS(&intel_g45_info), | ||
381 | INTEL_PINEVIEW_IDS(&intel_pineview_info), | ||
382 | INTEL_IRONLAKE_D_IDS(&intel_ironlake_d_info), | ||
383 | INTEL_IRONLAKE_M_IDS(&intel_ironlake_m_info), | ||
384 | INTEL_SNB_D_IDS(&intel_sandybridge_d_info), | ||
385 | INTEL_SNB_M_IDS(&intel_sandybridge_m_info), | ||
386 | INTEL_IVB_Q_IDS(&intel_ivybridge_q_info), /* must be first IVB */ | ||
387 | INTEL_IVB_M_IDS(&intel_ivybridge_m_info), | ||
388 | INTEL_IVB_D_IDS(&intel_ivybridge_d_info), | ||
389 | INTEL_HSW_D_IDS(&intel_haswell_d_info), | ||
390 | INTEL_HSW_M_IDS(&intel_haswell_m_info), | ||
391 | INTEL_VLV_M_IDS(&intel_valleyview_m_info), | ||
392 | INTEL_VLV_D_IDS(&intel_valleyview_d_info), | ||
393 | INTEL_BDW_GT12M_IDS(&intel_broadwell_m_info), | ||
394 | INTEL_BDW_GT12D_IDS(&intel_broadwell_d_info), | ||
395 | INTEL_BDW_GT3M_IDS(&intel_broadwell_gt3m_info), | ||
396 | INTEL_BDW_GT3D_IDS(&intel_broadwell_gt3d_info), | ||
397 | INTEL_CHV_IDS(&intel_cherryview_info), | ||
398 | INTEL_SKL_GT1_IDS(&intel_skylake_info), | ||
399 | INTEL_SKL_GT2_IDS(&intel_skylake_info), | ||
400 | INTEL_SKL_GT3_IDS(&intel_skylake_gt3_info), | ||
401 | INTEL_SKL_GT4_IDS(&intel_skylake_gt3_info), | ||
402 | INTEL_BXT_IDS(&intel_broxton_info), | ||
403 | INTEL_KBL_GT1_IDS(&intel_kabylake_info), | ||
404 | INTEL_KBL_GT2_IDS(&intel_kabylake_info), | ||
405 | INTEL_KBL_GT3_IDS(&intel_kabylake_gt3_info), | ||
406 | INTEL_KBL_GT4_IDS(&intel_kabylake_gt3_info), | ||
407 | {0, 0, 0} | ||
408 | }; | ||
409 | MODULE_DEVICE_TABLE(pci, pciidlist); | ||
410 | |||
411 | extern int i915_driver_load(struct pci_dev *pdev, | ||
412 | const struct pci_device_id *ent); | ||
413 | |||
414 | static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
415 | { | ||
416 | struct intel_device_info *intel_info = | ||
417 | (struct intel_device_info *) ent->driver_data; | ||
418 | |||
419 | if (IS_PRELIMINARY_HW(intel_info) && !i915.preliminary_hw_support) { | ||
420 | DRM_INFO("This hardware requires preliminary hardware support.\n" | ||
421 | "See CONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT, and/or modparam preliminary_hw_support\n"); | ||
422 | return -ENODEV; | ||
423 | } | ||
424 | |||
425 | /* Only bind to function 0 of the device. Early generations | ||
426 | * used function 1 as a placeholder for multi-head. This causes | ||
427 | * us confusion instead, especially on the systems where both | ||
428 | * functions have the same PCI-ID! | ||
429 | */ | ||
430 | if (PCI_FUNC(pdev->devfn)) | ||
431 | return -ENODEV; | ||
432 | |||
433 | /* | ||
434 | * apple-gmux is needed on dual GPU MacBook Pro | ||
435 | * to probe the panel if we're the inactive GPU. | ||
436 | */ | ||
437 | if (vga_switcheroo_client_probe_defer(pdev)) | ||
438 | return -EPROBE_DEFER; | ||
439 | |||
440 | return i915_driver_load(pdev, ent); | ||
441 | } | ||
442 | |||
443 | extern void i915_driver_unload(struct drm_device *dev); | ||
444 | |||
445 | static void i915_pci_remove(struct pci_dev *pdev) | ||
446 | { | ||
447 | struct drm_device *dev = pci_get_drvdata(pdev); | ||
448 | |||
449 | i915_driver_unload(dev); | ||
450 | drm_dev_unref(dev); | ||
451 | } | ||
452 | |||
453 | extern const struct dev_pm_ops i915_pm_ops; | ||
454 | |||
455 | static struct pci_driver i915_pci_driver = { | ||
456 | .name = DRIVER_NAME, | ||
457 | .id_table = pciidlist, | ||
458 | .probe = i915_pci_probe, | ||
459 | .remove = i915_pci_remove, | ||
460 | .driver.pm = &i915_pm_ops, | ||
461 | }; | ||
462 | |||
463 | static int __init i915_init(void) | ||
464 | { | ||
465 | bool use_kms = true; | ||
466 | |||
467 | /* | ||
468 | * Enable KMS by default, unless explicitly overriden by | ||
469 | * either the i915.modeset prarameter or by the | ||
470 | * vga_text_mode_force boot option. | ||
471 | */ | ||
472 | |||
473 | if (i915.modeset == 0) | ||
474 | use_kms = false; | ||
475 | |||
476 | if (vgacon_text_force() && i915.modeset == -1) | ||
477 | use_kms = false; | ||
478 | |||
479 | if (!use_kms) { | ||
480 | /* Silently fail loading to not upset userspace. */ | ||
481 | DRM_DEBUG_DRIVER("KMS disabled.\n"); | ||
482 | return 0; | ||
483 | } | ||
484 | |||
485 | return pci_register_driver(&i915_pci_driver); | ||
486 | } | ||
487 | |||
488 | static void __exit i915_exit(void) | ||
489 | { | ||
490 | if (!i915_pci_driver.driver.owner) | ||
491 | return; | ||
492 | |||
493 | pci_unregister_driver(&i915_pci_driver); | ||
494 | } | ||
495 | |||
496 | module_init(i915_init); | ||
497 | module_exit(i915_exit); | ||
498 | |||
499 | MODULE_AUTHOR("Tungsten Graphics, Inc."); | ||
500 | MODULE_AUTHOR("Intel Corporation"); | ||
501 | |||
502 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
503 | MODULE_LICENSE("GPL and additional rights"); | ||