| From eb12c957735b582607e5842a06d1f4c62e185c1d Mon Sep 17 00:00:00 2001 |
| From: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Date: Sat, 22 Feb 2020 18:54:32 +0100 |
| Subject: drm/radeon: Inline drm_get_pci_dev |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Daniel Vetter <daniel.vetter@ffwll.ch> |
| |
| commit eb12c957735b582607e5842a06d1f4c62e185c1d upstream. |
| |
| It's the last user, and more importantly, it's the last non-legacy |
| user of anything in drm_pci.c. |
| |
| The only tricky bit is the agp initialization. But a close look shows |
| that radeon does not use the drm_agp midlayer (the main use of that is |
| drm_bufs for legacy drivers), and instead could use the agp subsystem |
| directly (like nouveau does already). Hence we can just pull this in |
| too. |
| |
| A further step would be to entirely drop the use of drm_device->agp, |
| but feels like too much churn just for this patch. |
| |
| Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> |
| Cc: Alex Deucher <alexander.deucher@amd.com> |
| Cc: "Christian König" <christian.koenig@amd.com> |
| Cc: "David (ChunMing) Zhou" <David1.Zhou@amd.com> |
| Cc: amd-gfx@lists.freedesktop.org |
| Reviewed-by: Alex Deucher <alexander.deucher@amd.com> |
| Reviewed-by: Emil Velikov <emil.velikov@collabora.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/radeon/radeon_drv.c | 43 ++++++++++++++++++++++++++++++++++-- |
| drivers/gpu/drm/radeon/radeon_kms.c | 6 +++++ |
| 2 files changed, 47 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/gpu/drm/radeon/radeon_drv.c |
| +++ b/drivers/gpu/drm/radeon/radeon_drv.c |
| @@ -37,6 +37,7 @@ |
| #include <linux/vga_switcheroo.h> |
| #include <linux/mmu_notifier.h> |
| |
| +#include <drm/drm_agpsupport.h> |
| #include <drm/drm_crtc_helper.h> |
| #include <drm/drm_drv.h> |
| #include <drm/drm_fb_helper.h> |
| @@ -325,6 +326,7 @@ static int radeon_pci_probe(struct pci_d |
| const struct pci_device_id *ent) |
| { |
| unsigned long flags = 0; |
| + struct drm_device *dev; |
| int ret; |
| |
| if (!ent) |
| @@ -365,7 +367,44 @@ static int radeon_pci_probe(struct pci_d |
| if (ret) |
| return ret; |
| |
| - return drm_get_pci_dev(pdev, ent, &kms_driver); |
| + dev = drm_dev_alloc(&kms_driver, &pdev->dev); |
| + if (IS_ERR(dev)) |
| + return PTR_ERR(dev); |
| + |
| + ret = pci_enable_device(pdev); |
| + if (ret) |
| + goto err_free; |
| + |
| + dev->pdev = pdev; |
| +#ifdef __alpha__ |
| + dev->hose = pdev->sysdata; |
| +#endif |
| + |
| + pci_set_drvdata(pdev, dev); |
| + |
| + if (pci_find_capability(dev->pdev, PCI_CAP_ID_AGP)) |
| + dev->agp = drm_agp_init(dev); |
| + if (dev->agp) { |
| + dev->agp->agp_mtrr = arch_phys_wc_add( |
| + dev->agp->agp_info.aper_base, |
| + dev->agp->agp_info.aper_size * |
| + 1024 * 1024); |
| + } |
| + |
| + ret = drm_dev_register(dev, ent->driver_data); |
| + if (ret) |
| + goto err_agp; |
| + |
| + return 0; |
| + |
| +err_agp: |
| + if (dev->agp) |
| + arch_phys_wc_del(dev->agp->agp_mtrr); |
| + kfree(dev->agp); |
| + pci_disable_device(pdev); |
| +err_free: |
| + drm_dev_put(dev); |
| + return ret; |
| } |
| |
| static void |
| @@ -575,7 +614,7 @@ radeon_get_crtc_scanout_position(struct |
| |
| static struct drm_driver kms_driver = { |
| .driver_features = |
| - DRIVER_USE_AGP | DRIVER_GEM | DRIVER_RENDER, |
| + DRIVER_GEM | DRIVER_RENDER, |
| .load = radeon_driver_load_kms, |
| .open = radeon_driver_open_kms, |
| .postclose = radeon_driver_postclose_kms, |
| --- a/drivers/gpu/drm/radeon/radeon_kms.c |
| +++ b/drivers/gpu/drm/radeon/radeon_kms.c |
| @@ -31,6 +31,7 @@ |
| #include <linux/uaccess.h> |
| #include <linux/vga_switcheroo.h> |
| |
| +#include <drm/drm_agpsupport.h> |
| #include <drm/drm_fb_helper.h> |
| #include <drm/drm_file.h> |
| #include <drm/drm_ioctl.h> |
| @@ -77,6 +78,11 @@ void radeon_driver_unload_kms(struct drm |
| radeon_modeset_fini(rdev); |
| radeon_device_fini(rdev); |
| |
| + if (dev->agp) |
| + arch_phys_wc_del(dev->agp->agp_mtrr); |
| + kfree(dev->agp); |
| + dev->agp = NULL; |
| + |
| done_free: |
| kfree(rdev); |
| dev->dev_private = NULL; |