diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 320cc49eb0576..4b87560f2f7d5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -771,7 +771,11 @@ struct amd_powerplay { struct amdgpu_device { struct device *dev; struct pci_dev *pdev; +#ifdef HAVE_DRM_DRIVER_RELEASE struct drm_device ddev; +#else + struct drm_device *ddev; +#endif #ifdef CONFIG_DRM_AMD_ACP struct amdgpu_acp acp; @@ -1043,12 +1047,20 @@ struct amdgpu_device { static inline struct amdgpu_device *drm_to_adev(struct drm_device *ddev) { +#ifdef HAVE_DRM_DRIVER_RELEASE return container_of(ddev, struct amdgpu_device, ddev); +#else + return ddev->dev_private; +#endif } static inline struct drm_device *adev_to_drm(struct amdgpu_device *adev) { +#ifdef HAVE_DRM_DRIVER_RELEASE return &adev->ddev; +#else + return adev->ddev; +#endif } static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev) @@ -1255,7 +1267,11 @@ static inline void *amdgpu_atpx_get_dhandle(void) { return NULL; } extern const struct drm_ioctl_desc amdgpu_ioctls_kms[]; extern const int amdgpu_max_kms_ioctl; +#ifdef HAVE_DRM_DRIVER_RELEASE int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags); +#else +int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags); +#endif void amdgpu_driver_unload_kms(struct drm_device *dev); void amdgpu_driver_lastclose_kms(struct drm_device *dev); int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index e2efce607c51a..a1360a1bde67d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -1181,6 +1181,7 @@ static int amdgpu_pci_probe(struct pci_dev *pdev, if (ret) return ret; +#ifdef HAVE_DRM_DRIVER_RELEASE adev = kzalloc(sizeof(*adev), GFP_KERNEL); if (!adev) return -ENOMEM; @@ -1191,6 +1192,11 @@ static int amdgpu_pci_probe(struct pci_dev *pdev, ret = drm_dev_init(ddev, &kms_driver, &pdev->dev); if (ret) goto err_free; +#else + ddev = drm_dev_alloc(&kms_driver, &pdev->dev); + if (IS_ERR(ddev)) + return PTR_ERR(ddev); +#endif kcl_drm_vma_offset_manager_init(ddev->vma_offset_manager); #ifdef HAVE_DRM_DRV_DRIVER_ATOMIC @@ -1216,7 +1222,11 @@ static int amdgpu_pci_probe(struct pci_dev *pdev, ddev->pdev = pdev; pci_set_drvdata(pdev, ddev); +#ifdef HAVE_DRM_DRIVER_RELEASE ret = amdgpu_driver_load_kms(adev, ent->driver_data); +#else + ret = amdgpu_driver_load_kms(ddev, ent->driver_data); +#endif if (ret) goto err_pci; @@ -1231,6 +1241,9 @@ static int amdgpu_pci_probe(struct pci_dev *pdev, goto err_pci; } +#ifndef HAVE_DRM_DRIVER_RELEASE + adev = drm_to_adev(ddev); +#endif ret = amdgpu_debugfs_init(adev); if (ret) DRM_ERROR("Creating debugfs files failed (%d).\n", ret); @@ -1265,6 +1278,7 @@ amdgpu_pci_remove(struct pci_dev *pdev) drm_dev_put(dev); } +#ifdef HAVE_DRM_DRIVER_RELEASE static void amdgpu_driver_release(struct drm_device *ddev) { struct amdgpu_device *adev = drm_to_adev(ddev); @@ -1272,6 +1286,7 @@ static void amdgpu_driver_release(struct drm_device *ddev) drm_dev_fini(ddev); kfree(adev); } +#endif static void amdgpu_pci_shutdown(struct pci_dev *pdev) @@ -1611,7 +1626,9 @@ static struct drm_driver kms_driver = { .debugfs_cleanup = amdgpu_debugfs_cleanup, #endif #endif +#ifdef HAVE_DRM_DRIVER_RELEASE .release = amdgpu_driver_release, +#endif .irq_handler = amdgpu_irq_handler, .ioctls = amdgpu_ioctls_kms, #ifndef HAVE_GEM_FREE_OBJECT_UNLOCKED_IN_DRM_DRIVER diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 9bb6008a82b13..8647e3fbd80d4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -86,7 +86,11 @@ void amdgpu_driver_unload_kms(struct drm_device *dev) amdgpu_unregister_gpu_instance(adev); if (adev->rmmio == NULL) +#ifdef HAVE_DRM_DRIVER_RELEASE return; +#else + goto done_free; +#endif if (adev->runpm) { pm_runtime_get_sync(dev->dev); @@ -95,6 +99,11 @@ void amdgpu_driver_unload_kms(struct drm_device *dev) amdgpu_acpi_fini(adev); amdgpu_device_fini(adev); +#ifndef HAVE_DRM_DRIVER_RELEASE +done_free: + kfree(adev); + dev->dev_private = NULL; +#endif } void amdgpu_register_gpu_instance(struct amdgpu_device *adev) @@ -131,12 +140,28 @@ void amdgpu_register_gpu_instance(struct amdgpu_device *adev) * This is the main load function for KMS (all asics). * Returns 0 on success, error on failure. */ +#ifdef HAVE_DRM_DRIVER_RELEASE int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags) +#else +int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags) +#endif { +#ifdef HAVE_DRM_DRIVER_RELEASE struct drm_device *dev; +#else + struct amdgpu_device *adev; +#endif int r, acpi_status; +#ifdef HAVE_DRM_DRIVER_RELEASE dev = adev_to_drm(adev); +#else + adev = kzalloc(sizeof(struct amdgpu_device), GFP_KERNEL); + if (adev == NULL) { + return -ENOMEM; + } + dev->dev_private = (void *)adev; +#endif if (amdgpu_has_atpx() && (amdgpu_is_atpx_hybrid() || diff --git a/drivers/gpu/drm/amd/dkms/config/config.h b/drivers/gpu/drm/amd/dkms/config/config.h index 412fb9a3756e0..7e5ea998aa27f 100644 --- a/drivers/gpu/drm/amd/dkms/config/config.h +++ b/drivers/gpu/drm/amd/dkms/config/config.h @@ -305,6 +305,9 @@ /* drm_driver->gem_prime_res_obj() is available */ /* #undef HAVE_DRM_DRIVER_GEM_PRIME_RES_OBJ */ +/* drm_dev_fini() is available */ +#define HAVE_DRM_DRIVER_RELEASE 1 + /* Define to 1 if you have the header file. */ /* #undef HAVE_DRM_DRMP_H */ diff --git a/drivers/gpu/drm/amd/dkms/m4/drm-dev-fini.m4 b/drivers/gpu/drm/amd/dkms/m4/drm-dev-fini.m4 new file mode 100644 index 0000000000000..d10464a76a3ac --- /dev/null +++ b/drivers/gpu/drm/amd/dkms/m4/drm-dev-fini.m4 @@ -0,0 +1,14 @@ +#dnl +#dnl v4.10-rc5-1045-gf30c92576af4 +#dnl drm: Provide a driver hook for drm_dev_release() +#dnl +AC_DEFUN([AC_AMDGPU_DRM_DRIVER_RELEASE], [ + AC_KERNEL_DO_BACKGROUND([ + AC_KERNEL_CHECK_SYMBOL_EXPORT( + [drm_dev_fini], + [drivers/gpu/drm/drm_drv.c], + [AC_DEFINE(HAVE_DRM_DRIVER_RELEASE, 1, + [drm_dev_fini() is available])] + ) + ]) +]) diff --git a/drivers/gpu/drm/amd/dkms/m4/kernel.m4 b/drivers/gpu/drm/amd/dkms/m4/kernel.m4 index 229fbc5137e6f..78dbac3de3959 100644 --- a/drivers/gpu/drm/amd/dkms/m4/kernel.m4 +++ b/drivers/gpu/drm/amd/dkms/m4/kernel.m4 @@ -200,6 +200,7 @@ AC_DEFUN([AC_CONFIG_KERNEL], [ AC_AMDGPU_DRM_CONNECTOR_STATE_HDCP_CONTENT_TYPE AC_AMDGPU_DRM_HDCP_UPDATE_CONTENT_PROTECTION AC_AMDGPU_DOWN_READ_KILLABLE + AC_AMDGPU_DRM_DRIVER_RELEASE AC_KERNEL_WAIT AS_IF([test "$LINUX_OBJ" != "$LINUX"], [