diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_drv.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_drv.c | 215 |
1 files changed, 211 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 13a60f4d422..f70c351bb43 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
@@ -35,12 +35,92 @@ | |||
35 | #include "radeon_drv.h" | 35 | #include "radeon_drv.h" |
36 | 36 | ||
37 | #include "drm_pciids.h" | 37 | #include "drm_pciids.h" |
38 | #include <linux/console.h> | ||
39 | |||
40 | |||
41 | #if defined(CONFIG_DRM_RADEON_KMS) | ||
42 | /* | ||
43 | * KMS wrapper. | ||
44 | */ | ||
45 | #define KMS_DRIVER_MAJOR 2 | ||
46 | #define KMS_DRIVER_MINOR 0 | ||
47 | #define KMS_DRIVER_PATCHLEVEL 0 | ||
48 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); | ||
49 | int radeon_driver_unload_kms(struct drm_device *dev); | ||
50 | int radeon_driver_firstopen_kms(struct drm_device *dev); | ||
51 | void radeon_driver_lastclose_kms(struct drm_device *dev); | ||
52 | int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv); | ||
53 | void radeon_driver_postclose_kms(struct drm_device *dev, | ||
54 | struct drm_file *file_priv); | ||
55 | void radeon_driver_preclose_kms(struct drm_device *dev, | ||
56 | struct drm_file *file_priv); | ||
57 | int radeon_suspend_kms(struct drm_device *dev, pm_message_t state); | ||
58 | int radeon_resume_kms(struct drm_device *dev); | ||
59 | u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc); | ||
60 | int radeon_enable_vblank_kms(struct drm_device *dev, int crtc); | ||
61 | void radeon_disable_vblank_kms(struct drm_device *dev, int crtc); | ||
62 | void radeon_driver_irq_preinstall_kms(struct drm_device *dev); | ||
63 | int radeon_driver_irq_postinstall_kms(struct drm_device *dev); | ||
64 | void radeon_driver_irq_uninstall_kms(struct drm_device *dev); | ||
65 | irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS); | ||
66 | int radeon_master_create_kms(struct drm_device *dev, struct drm_master *master); | ||
67 | void radeon_master_destroy_kms(struct drm_device *dev, | ||
68 | struct drm_master *master); | ||
69 | int radeon_dma_ioctl_kms(struct drm_device *dev, void *data, | ||
70 | struct drm_file *file_priv); | ||
71 | int radeon_gem_object_init(struct drm_gem_object *obj); | ||
72 | void radeon_gem_object_free(struct drm_gem_object *obj); | ||
73 | extern struct drm_ioctl_desc radeon_ioctls_kms[]; | ||
74 | extern int radeon_max_kms_ioctl; | ||
75 | int radeon_mmap(struct file *filp, struct vm_area_struct *vma); | ||
76 | #if defined(CONFIG_DEBUG_FS) | ||
77 | int radeon_debugfs_init(struct drm_minor *minor); | ||
78 | void radeon_debugfs_cleanup(struct drm_minor *minor); | ||
79 | #endif | ||
80 | #endif | ||
81 | |||
38 | 82 | ||
39 | int radeon_no_wb; | 83 | int radeon_no_wb; |
84 | #if defined(CONFIG_DRM_RADEON_KMS) | ||
85 | int radeon_modeset = -1; | ||
86 | int radeon_dynclks = -1; | ||
87 | int radeon_r4xx_atom = 0; | ||
88 | int radeon_agpmode = 0; | ||
89 | int radeon_vram_limit = 0; | ||
90 | int radeon_gart_size = 512; /* default gart size */ | ||
91 | int radeon_benchmarking = 0; | ||
92 | int radeon_connector_table = 0; | ||
93 | #endif | ||
40 | 94 | ||
41 | MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers"); | 95 | MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers"); |
42 | module_param_named(no_wb, radeon_no_wb, int, 0444); | 96 | module_param_named(no_wb, radeon_no_wb, int, 0444); |
43 | 97 | ||
98 | #if defined(CONFIG_DRM_RADEON_KMS) | ||
99 | MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); | ||
100 | module_param_named(modeset, radeon_modeset, int, 0400); | ||
101 | |||
102 | MODULE_PARM_DESC(dynclks, "Disable/Enable dynamic clocks"); | ||
103 | module_param_named(dynclks, radeon_dynclks, int, 0444); | ||
104 | |||
105 | MODULE_PARM_DESC(r4xx_atom, "Enable ATOMBIOS modesetting for R4xx"); | ||
106 | module_param_named(r4xx_atom, radeon_r4xx_atom, int, 0444); | ||
107 | |||
108 | MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing"); | ||
109 | module_param_named(vramlimit, radeon_vram_limit, int, 0600); | ||
110 | |||
111 | MODULE_PARM_DESC(agpmode, "AGP Mode (-1 == PCI)"); | ||
112 | module_param_named(agpmode, radeon_agpmode, int, 0444); | ||
113 | |||
114 | MODULE_PARM_DESC(gartsize, "Size of PCIE/IGP gart to setup in megabytes (32,64, etc)\n"); | ||
115 | module_param_named(gartsize, radeon_gart_size, int, 0600); | ||
116 | |||
117 | MODULE_PARM_DESC(benchmark, "Run benchmark"); | ||
118 | module_param_named(benchmark, radeon_benchmarking, int, 0444); | ||
119 | |||
120 | MODULE_PARM_DESC(connector_table, "Force connector table"); | ||
121 | module_param_named(connector_table, radeon_connector_table, int, 0444); | ||
122 | #endif | ||
123 | |||
44 | static int radeon_suspend(struct drm_device *dev, pm_message_t state) | 124 | static int radeon_suspend(struct drm_device *dev, pm_message_t state) |
45 | { | 125 | { |
46 | drm_radeon_private_t *dev_priv = dev->dev_private; | 126 | drm_radeon_private_t *dev_priv = dev->dev_private; |
@@ -73,7 +153,11 @@ static struct pci_device_id pciidlist[] = { | |||
73 | radeon_PCI_IDS | 153 | radeon_PCI_IDS |
74 | }; | 154 | }; |
75 | 155 | ||
76 | static struct drm_driver driver = { | 156 | #if defined(CONFIG_DRM_RADEON_KMS) |
157 | MODULE_DEVICE_TABLE(pci, pciidlist); | ||
158 | #endif | ||
159 | |||
160 | static struct drm_driver driver_old = { | ||
77 | .driver_features = | 161 | .driver_features = |
78 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | | 162 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | |
79 | DRIVER_HAVE_IRQ | DRIVER_HAVE_DMA | DRIVER_IRQ_SHARED, | 163 | DRIVER_HAVE_IRQ | DRIVER_HAVE_DMA | DRIVER_IRQ_SHARED, |
@@ -127,15 +211,138 @@ static struct drm_driver driver = { | |||
127 | .patchlevel = DRIVER_PATCHLEVEL, | 211 | .patchlevel = DRIVER_PATCHLEVEL, |
128 | }; | 212 | }; |
129 | 213 | ||
214 | #if defined(CONFIG_DRM_RADEON_KMS) | ||
215 | static struct drm_driver kms_driver; | ||
216 | |||
217 | static int __devinit | ||
218 | radeon_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
219 | { | ||
220 | return drm_get_dev(pdev, ent, &kms_driver); | ||
221 | } | ||
222 | |||
223 | static void | ||
224 | radeon_pci_remove(struct pci_dev *pdev) | ||
225 | { | ||
226 | struct drm_device *dev = pci_get_drvdata(pdev); | ||
227 | |||
228 | drm_put_dev(dev); | ||
229 | } | ||
230 | |||
231 | static int | ||
232 | radeon_pci_suspend(struct pci_dev *pdev, pm_message_t state) | ||
233 | { | ||
234 | struct drm_device *dev = pci_get_drvdata(pdev); | ||
235 | return radeon_suspend_kms(dev, state); | ||
236 | } | ||
237 | |||
238 | static int | ||
239 | radeon_pci_resume(struct pci_dev *pdev) | ||
240 | { | ||
241 | struct drm_device *dev = pci_get_drvdata(pdev); | ||
242 | return radeon_resume_kms(dev); | ||
243 | } | ||
244 | |||
245 | static struct drm_driver kms_driver = { | ||
246 | .driver_features = | ||
247 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | | ||
248 | DRIVER_HAVE_IRQ | DRIVER_HAVE_DMA | DRIVER_IRQ_SHARED | DRIVER_GEM, | ||
249 | .dev_priv_size = 0, | ||
250 | .load = radeon_driver_load_kms, | ||
251 | .firstopen = radeon_driver_firstopen_kms, | ||
252 | .open = radeon_driver_open_kms, | ||
253 | .preclose = radeon_driver_preclose_kms, | ||
254 | .postclose = radeon_driver_postclose_kms, | ||
255 | .lastclose = radeon_driver_lastclose_kms, | ||
256 | .unload = radeon_driver_unload_kms, | ||
257 | .suspend = radeon_suspend_kms, | ||
258 | .resume = radeon_resume_kms, | ||
259 | .get_vblank_counter = radeon_get_vblank_counter_kms, | ||
260 | .enable_vblank = radeon_enable_vblank_kms, | ||
261 | .disable_vblank = radeon_disable_vblank_kms, | ||
262 | .master_create = radeon_master_create_kms, | ||
263 | .master_destroy = radeon_master_destroy_kms, | ||
264 | #if defined(CONFIG_DEBUG_FS) | ||
265 | .debugfs_init = radeon_debugfs_init, | ||
266 | .debugfs_cleanup = radeon_debugfs_cleanup, | ||
267 | #endif | ||
268 | .irq_preinstall = radeon_driver_irq_preinstall_kms, | ||
269 | .irq_postinstall = radeon_driver_irq_postinstall_kms, | ||
270 | .irq_uninstall = radeon_driver_irq_uninstall_kms, | ||
271 | .irq_handler = radeon_driver_irq_handler_kms, | ||
272 | .reclaim_buffers = drm_core_reclaim_buffers, | ||
273 | .get_map_ofs = drm_core_get_map_ofs, | ||
274 | .get_reg_ofs = drm_core_get_reg_ofs, | ||
275 | .ioctls = radeon_ioctls_kms, | ||
276 | .gem_init_object = radeon_gem_object_init, | ||
277 | .gem_free_object = radeon_gem_object_free, | ||
278 | .dma_ioctl = radeon_dma_ioctl_kms, | ||
279 | .fops = { | ||
280 | .owner = THIS_MODULE, | ||
281 | .open = drm_open, | ||
282 | .release = drm_release, | ||
283 | .ioctl = drm_ioctl, | ||
284 | .mmap = radeon_mmap, | ||
285 | .poll = drm_poll, | ||
286 | .fasync = drm_fasync, | ||
287 | #ifdef CONFIG_COMPAT | ||
288 | .compat_ioctl = NULL, | ||
289 | #endif | ||
290 | }, | ||
291 | |||
292 | .pci_driver = { | ||
293 | .name = DRIVER_NAME, | ||
294 | .id_table = pciidlist, | ||
295 | .probe = radeon_pci_probe, | ||
296 | .remove = radeon_pci_remove, | ||
297 | .suspend = radeon_pci_suspend, | ||
298 | .resume = radeon_pci_resume, | ||
299 | }, | ||
300 | |||
301 | .name = DRIVER_NAME, | ||
302 | .desc = DRIVER_DESC, | ||
303 | .date = DRIVER_DATE, | ||
304 | .major = KMS_DRIVER_MAJOR, | ||
305 | .minor = KMS_DRIVER_MINOR, | ||
306 | .patchlevel = KMS_DRIVER_PATCHLEVEL, | ||
307 | }; | ||
308 | #endif | ||
309 | |||
310 | static struct drm_driver *driver; | ||
311 | |||
130 | static int __init radeon_init(void) | 312 | static int __init radeon_init(void) |
131 | { | 313 | { |
132 | driver.num_ioctls = radeon_max_ioctl; | 314 | driver = &driver_old; |
133 | return drm_init(&driver); | 315 | driver->num_ioctls = radeon_max_ioctl; |
316 | #if defined(CONFIG_DRM_RADEON_KMS) && defined(CONFIG_X86) | ||
317 | /* if enabled by default */ | ||
318 | if (radeon_modeset == -1) { | ||
319 | DRM_INFO("radeon default to kernel modesetting.\n"); | ||
320 | radeon_modeset = 1; | ||
321 | } | ||
322 | if (radeon_modeset == 1) { | ||
323 | DRM_INFO("radeon kernel modesetting enabled.\n"); | ||
324 | driver = &kms_driver; | ||
325 | driver->driver_features |= DRIVER_MODESET; | ||
326 | driver->num_ioctls = radeon_max_kms_ioctl; | ||
327 | } | ||
328 | |||
329 | /* if the vga console setting is enabled still | ||
330 | * let modprobe override it */ | ||
331 | #ifdef CONFIG_VGA_CONSOLE | ||
332 | if (vgacon_text_force() && radeon_modeset == -1) { | ||
333 | DRM_INFO("VGACON disable radeon kernel modesetting.\n"); | ||
334 | driver = &driver_old; | ||
335 | driver->driver_features &= ~DRIVER_MODESET; | ||
336 | radeon_modeset = 0; | ||
337 | } | ||
338 | #endif | ||
339 | #endif | ||
340 | return drm_init(driver); | ||
134 | } | 341 | } |
135 | 342 | ||
136 | static void __exit radeon_exit(void) | 343 | static void __exit radeon_exit(void) |
137 | { | 344 | { |
138 | drm_exit(&driver); | 345 | drm_exit(driver); |
139 | } | 346 | } |
140 | 347 | ||
141 | module_init(radeon_init); | 348 | module_init(radeon_init); |