hc
2024-05-10 61598093bbdd283a7edc367d900f223070ead8d2
kernel/drivers/gpu/drm/radeon/radeon_drv.c
....@@ -29,20 +29,28 @@
2929 * OTHER DEALINGS IN THE SOFTWARE.
3030 */
3131
32
-#include <drm/drmP.h>
33
-#include <drm/radeon_drm.h>
34
-#include "radeon_drv.h"
3532
36
-#include <drm/drm_pciids.h>
33
+#include <linux/compat.h>
3734 #include <linux/console.h>
3835 #include <linux/module.h>
3936 #include <linux/pm_runtime.h>
4037 #include <linux/vga_switcheroo.h>
41
-#include <linux/compat.h>
42
-#include <drm/drm_gem.h>
43
-#include <drm/drm_fb_helper.h>
38
+#include <linux/mmu_notifier.h>
39
+#include <linux/pci.h>
4440
41
+#include <drm/drm_agpsupport.h>
4542 #include <drm/drm_crtc_helper.h>
43
+#include <drm/drm_drv.h>
44
+#include <drm/drm_fb_helper.h>
45
+#include <drm/drm_file.h>
46
+#include <drm/drm_gem.h>
47
+#include <drm/drm_ioctl.h>
48
+#include <drm/drm_pciids.h>
49
+#include <drm/drm_probe_helper.h>
50
+#include <drm/drm_vblank.h>
51
+#include <drm/radeon_drm.h>
52
+
53
+#include "radeon_drv.h"
4654
4755 /*
4856 * KMS wrapper.
....@@ -112,9 +120,6 @@
112120 int radeon_suspend_kms(struct drm_device *dev, bool suspend,
113121 bool fbcon, bool freeze);
114122 int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon);
115
-u32 radeon_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
116
-int radeon_enable_vblank_kms(struct drm_device *dev, unsigned int pipe);
117
-void radeon_disable_vblank_kms(struct drm_device *dev, unsigned int pipe);
118123 void radeon_driver_irq_preinstall_kms(struct drm_device *dev);
119124 int radeon_driver_irq_postinstall_kms(struct drm_device *dev);
120125 void radeon_driver_irq_uninstall_kms(struct drm_device *dev);
....@@ -124,8 +129,7 @@
124129 struct drm_file *file_priv);
125130 void radeon_gem_object_close(struct drm_gem_object *obj,
126131 struct drm_file *file_priv);
127
-struct dma_buf *radeon_gem_prime_export(struct drm_device *dev,
128
- struct drm_gem_object *gobj,
132
+struct dma_buf *radeon_gem_prime_export(struct drm_gem_object *gobj,
129133 int flags);
130134 extern int radeon_get_crtc_scanoutpos(struct drm_device *dev, unsigned int crtc,
131135 unsigned int flags, int *vpos, int *hpos,
....@@ -147,7 +151,6 @@
147151 struct sg_table *sg);
148152 int radeon_gem_prime_pin(struct drm_gem_object *obj);
149153 void radeon_gem_prime_unpin(struct drm_gem_object *obj);
150
-struct reservation_object *radeon_gem_prime_res_obj(struct drm_gem_object *);
151154 void *radeon_gem_prime_vmap(struct drm_gem_object *obj);
152155 void radeon_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
153156
....@@ -311,31 +314,11 @@
311314
312315 bool radeon_device_is_virtual(void);
313316
314
-static int radeon_kick_out_firmware_fb(struct pci_dev *pdev)
315
-{
316
- struct apertures_struct *ap;
317
- bool primary = false;
318
-
319
- ap = alloc_apertures(1);
320
- if (!ap)
321
- return -ENOMEM;
322
-
323
- ap->ranges[0].base = pci_resource_start(pdev, 0);
324
- ap->ranges[0].size = pci_resource_len(pdev, 0);
325
-
326
-#ifdef CONFIG_X86
327
- primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
328
-#endif
329
- drm_fb_helper_remove_conflicting_framebuffers(ap, "radeondrmfb", primary);
330
- kfree(ap);
331
-
332
- return 0;
333
-}
334
-
335317 static int radeon_pci_probe(struct pci_dev *pdev,
336318 const struct pci_device_id *ent)
337319 {
338320 unsigned long flags = 0;
321
+ struct drm_device *dev;
339322 int ret;
340323
341324 if (!ent)
....@@ -372,11 +355,48 @@
372355 return -EPROBE_DEFER;
373356
374357 /* Get rid of things like offb */
375
- ret = radeon_kick_out_firmware_fb(pdev);
358
+ ret = drm_fb_helper_remove_conflicting_pci_framebuffers(pdev, "radeondrmfb");
376359 if (ret)
377360 return ret;
378361
379
- return drm_get_pci_dev(pdev, ent, &kms_driver);
362
+ dev = drm_dev_alloc(&kms_driver, &pdev->dev);
363
+ if (IS_ERR(dev))
364
+ return PTR_ERR(dev);
365
+
366
+ ret = pci_enable_device(pdev);
367
+ if (ret)
368
+ goto err_free;
369
+
370
+ dev->pdev = pdev;
371
+#ifdef __alpha__
372
+ dev->hose = pdev->sysdata;
373
+#endif
374
+
375
+ pci_set_drvdata(pdev, dev);
376
+
377
+ if (pci_find_capability(dev->pdev, PCI_CAP_ID_AGP))
378
+ dev->agp = drm_agp_init(dev);
379
+ if (dev->agp) {
380
+ dev->agp->agp_mtrr = arch_phys_wc_add(
381
+ dev->agp->agp_info.aper_base,
382
+ dev->agp->agp_info.aper_size *
383
+ 1024 * 1024);
384
+ }
385
+
386
+ ret = drm_dev_register(dev, ent->driver_data);
387
+ if (ret)
388
+ goto err_agp;
389
+
390
+ return 0;
391
+
392
+err_agp:
393
+ if (dev->agp)
394
+ arch_phys_wc_del(dev->agp->agp_mtrr);
395
+ kfree(dev->agp);
396
+ pci_disable_device(pdev);
397
+err_free:
398
+ drm_dev_put(dev);
399
+ return ret;
380400 }
381401
382402 static void
....@@ -395,19 +415,28 @@
395415 */
396416 if (radeon_device_is_virtual())
397417 radeon_pci_remove(pdev);
418
+
419
+#if defined(CONFIG_PPC64) || defined(CONFIG_MACH_LOONGSON64)
420
+ /*
421
+ * Some adapters need to be suspended before a
422
+ * shutdown occurs in order to prevent an error
423
+ * during kexec, shutdown or reboot.
424
+ * Make this power and Loongson specific because
425
+ * it breaks some other boards.
426
+ */
427
+ radeon_suspend_kms(pci_get_drvdata(pdev), true, true, false);
428
+#endif
398429 }
399430
400431 static int radeon_pmops_suspend(struct device *dev)
401432 {
402
- struct pci_dev *pdev = to_pci_dev(dev);
403
- struct drm_device *drm_dev = pci_get_drvdata(pdev);
433
+ struct drm_device *drm_dev = dev_get_drvdata(dev);
404434 return radeon_suspend_kms(drm_dev, true, true, false);
405435 }
406436
407437 static int radeon_pmops_resume(struct device *dev)
408438 {
409
- struct pci_dev *pdev = to_pci_dev(dev);
410
- struct drm_device *drm_dev = pci_get_drvdata(pdev);
439
+ struct drm_device *drm_dev = dev_get_drvdata(dev);
411440
412441 /* GPU comes up enabled by the bios on resume */
413442 if (radeon_is_px(drm_dev)) {
....@@ -421,15 +450,13 @@
421450
422451 static int radeon_pmops_freeze(struct device *dev)
423452 {
424
- struct pci_dev *pdev = to_pci_dev(dev);
425
- struct drm_device *drm_dev = pci_get_drvdata(pdev);
453
+ struct drm_device *drm_dev = dev_get_drvdata(dev);
426454 return radeon_suspend_kms(drm_dev, false, true, true);
427455 }
428456
429457 static int radeon_pmops_thaw(struct device *dev)
430458 {
431
- struct pci_dev *pdev = to_pci_dev(dev);
432
- struct drm_device *drm_dev = pci_get_drvdata(pdev);
459
+ struct drm_device *drm_dev = dev_get_drvdata(dev);
433460 return radeon_resume_kms(drm_dev, false, true);
434461 }
435462
....@@ -488,8 +515,7 @@
488515
489516 static int radeon_pmops_runtime_idle(struct device *dev)
490517 {
491
- struct pci_dev *pdev = to_pci_dev(dev);
492
- struct drm_device *drm_dev = pci_get_drvdata(pdev);
518
+ struct drm_device *drm_dev = dev_get_drvdata(dev);
493519 struct drm_crtc *crtc;
494520
495521 if (!radeon_is_px(drm_dev)) {
....@@ -570,31 +596,14 @@
570596 #endif
571597 };
572598
573
-static bool
574
-radeon_get_crtc_scanout_position(struct drm_device *dev, unsigned int pipe,
575
- bool in_vblank_irq, int *vpos, int *hpos,
576
- ktime_t *stime, ktime_t *etime,
577
- const struct drm_display_mode *mode)
578
-{
579
- return radeon_get_crtc_scanoutpos(dev, pipe, 0, vpos, hpos,
580
- stime, etime, mode);
581
-}
582
-
583599 static struct drm_driver kms_driver = {
584600 .driver_features =
585
- DRIVER_USE_AGP |
586
- DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_GEM |
587
- DRIVER_PRIME | DRIVER_RENDER,
601
+ DRIVER_GEM | DRIVER_RENDER,
588602 .load = radeon_driver_load_kms,
589603 .open = radeon_driver_open_kms,
590604 .postclose = radeon_driver_postclose_kms,
591605 .lastclose = radeon_driver_lastclose_kms,
592606 .unload = radeon_driver_unload_kms,
593
- .get_vblank_counter = radeon_get_vblank_counter_kms,
594
- .enable_vblank = radeon_enable_vblank_kms,
595
- .disable_vblank = radeon_disable_vblank_kms,
596
- .get_vblank_timestamp = drm_calc_vbltimestamp_from_scanoutpos,
597
- .get_scanout_position = radeon_get_crtc_scanout_position,
598607 .irq_preinstall = radeon_driver_irq_preinstall_kms,
599608 .irq_postinstall = radeon_driver_irq_postinstall_kms,
600609 .irq_uninstall = radeon_driver_irq_uninstall_kms,
....@@ -610,10 +619,8 @@
610619 .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
611620 .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
612621 .gem_prime_export = radeon_gem_prime_export,
613
- .gem_prime_import = drm_gem_prime_import,
614622 .gem_prime_pin = radeon_gem_prime_pin,
615623 .gem_prime_unpin = radeon_gem_prime_unpin,
616
- .gem_prime_res_obj = radeon_gem_prime_res_obj,
617624 .gem_prime_get_sg_table = radeon_gem_prime_get_sg_table,
618625 .gem_prime_import_sg_table = radeon_gem_prime_import_sg_table,
619626 .gem_prime_vmap = radeon_gem_prime_vmap,
....@@ -669,6 +676,7 @@
669676 {
670677 pci_unregister_driver(pdriver);
671678 radeon_unregister_atpx_handler();
679
+ mmu_notifier_synchronize();
672680 }
673681
674682 module_init(radeon_init);