Merge tag 'amd-drm-next-5.14-2021-06-02' of https://gitlab.freedesktop.org/agd5f...
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_kms.c
index 39ee88d..425596c 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "amdgpu.h"
 #include <drm/amdgpu_drm.h>
+#include <drm/drm_drv.h>
 #include "amdgpu_uvd.h"
 #include "amdgpu_vce.h"
 #include "atom.h"
@@ -91,8 +92,11 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)
                pm_runtime_forbid(dev->dev);
        }
 
+       if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DRV_UNLOAD))
+               DRM_WARN("smart shift update failed\n");
+
        amdgpu_acpi_fini(adev);
-       amdgpu_device_fini(adev);
+       amdgpu_device_fini_hw(adev);
 }
 
 void amdgpu_register_gpu_instance(struct amdgpu_device *adev)
@@ -214,6 +218,9 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
                pm_runtime_put_autosuspend(dev->dev);
        }
 
+       if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DRV_LOAD))
+               DRM_WARN("smart shift update failed\n");
+
 out:
        if (r) {
                /* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */
@@ -861,6 +868,21 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
                                            min((size_t)size, (size_t)(bios_size - bios_offset)))
                                        ? -EFAULT : 0;
                }
+               case AMDGPU_INFO_VBIOS_INFO: {
+                       struct drm_amdgpu_info_vbios vbios_info = {};
+                       struct atom_context *atom_context;
+
+                       atom_context = adev->mode_info.atom_context;
+                       memcpy(vbios_info.name, atom_context->name, sizeof(atom_context->name));
+                       memcpy(vbios_info.vbios_pn, atom_context->vbios_pn, sizeof(atom_context->vbios_pn));
+                       vbios_info.version = atom_context->version;
+                       memcpy(vbios_info.vbios_ver_str, atom_context->vbios_ver_str,
+                                               sizeof(atom_context->vbios_ver_str));
+                       memcpy(vbios_info.date, atom_context->date, sizeof(atom_context->date));
+
+                       return copy_to_user(out, &vbios_info,
+                                               min((size_t)size, sizeof(vbios_info))) ? -EFAULT : 0;
+               }
                default:
                        DRM_DEBUG_KMS("Invalid request %d\n",
                                        info->vbios_info.type);
@@ -986,7 +1008,7 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
 
                if (!ras)
                        return -EINVAL;
-               ras_mask = (uint64_t)ras->supported << 32 | ras->features;
+               ras_mask = (uint64_t)adev->ras_enabled << 32 | ras->features;
 
                return copy_to_user(out, &ras_mask,
                                min_t(u64, size, sizeof(ras_mask))) ?
@@ -1114,7 +1136,8 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
                dev_warn(adev->dev, "No more PASIDs available!");
                pasid = 0;
        }
-       r = amdgpu_vm_init(adev, &fpriv->vm, AMDGPU_VM_CONTEXT_GFX, pasid);
+
+       r = amdgpu_vm_init(adev, &fpriv->vm, pasid);
        if (r)
                goto error_pasid;
 
@@ -1219,6 +1242,15 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
        pm_runtime_put_autosuspend(dev->dev);
 }
 
+
+void amdgpu_driver_release_kms(struct drm_device *dev)
+{
+       struct amdgpu_device *adev = drm_to_adev(dev);
+
+       amdgpu_device_fini_sw(adev);
+       pci_set_drvdata(adev->pdev, NULL);
+}
+
 /*
  * VBlank related functions.
  */