Merge drm/drm-next into drm-misc-next
authorThomas Zimmermann <tzimmermann@suse.de>
Sat, 22 May 2021 05:17:05 +0000 (07:17 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Sat, 22 May 2021 05:17:05 +0000 (07:17 +0200)
Backmerging from drm/drm-next to the patches for AMD devices
for v5.14.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
30 files changed:
1  2 
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
drivers/gpu/drm/amd/amdgpu/navi10_ih.c
drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
drivers/gpu/drm/amd/amdgpu/vega10_ih.c
drivers/gpu/drm/amd/amdkfd/kfd_device.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/include/amd_shared.h
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gpu_error.h

Simple merge
@@@ -75,75 -80,6 +80,16 @@@ static DEVICE_ATTR(mem_info_gtt_total, 
  static DEVICE_ATTR(mem_info_gtt_used, S_IRUGO,
                   amdgpu_mem_info_gtt_used_show, NULL);
  
- static const struct ttm_resource_manager_func amdgpu_gtt_mgr_func;
- /**
-  * amdgpu_gtt_mgr_init - init GTT manager and DRM MM
-  *
-  * @adev: amdgpu_device pointer
-  * @gtt_size: maximum size of GTT
-  *
-  * Allocate and initialize the GTT manager.
-  */
- int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size)
- {
-       struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr;
-       struct ttm_resource_manager *man = &mgr->manager;
-       uint64_t start, size;
-       man->use_tt = true;
-       man->func = &amdgpu_gtt_mgr_func;
-       ttm_resource_manager_init(man, gtt_size >> PAGE_SHIFT);
-       start = AMDGPU_GTT_MAX_TRANSFER_SIZE * AMDGPU_GTT_NUM_TRANSFER_WINDOWS;
-       size = (adev->gmc.gart_size >> PAGE_SHIFT) - start;
-       drm_mm_init(&mgr->mm, start, size);
-       spin_lock_init(&mgr->lock);
-       atomic64_set(&mgr->available, gtt_size >> PAGE_SHIFT);
-       ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_TT, &mgr->manager);
-       ttm_resource_manager_set_used(man, true);
-       return 0;
- }
- /**
-  * amdgpu_gtt_mgr_fini - free and destroy GTT manager
-  *
-  * @adev: amdgpu_device pointer
-  *
-  * Destroy and free the GTT manager, returns -EBUSY if ranges are still
-  * allocated inside it.
-  */
- void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev)
- {
-       struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr;
-       struct ttm_resource_manager *man = &mgr->manager;
-       int ret;
-       ttm_resource_manager_set_used(man, false);
-       ret = ttm_resource_manager_evict_all(&adev->mman.bdev, man);
-       if (ret)
-               return;
-       spin_lock(&mgr->lock);
-       drm_mm_takedown(&mgr->mm);
-       spin_unlock(&mgr->lock);
-       ttm_resource_manager_cleanup(man);
-       ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_TT, NULL);
- }
 +static struct attribute *amdgpu_gtt_mgr_attributes[] = {
 +      &dev_attr_mem_info_gtt_total.attr,
 +      &dev_attr_mem_info_gtt_used.attr,
 +      NULL
 +};
 +
 +const struct attribute_group amdgpu_gtt_mgr_attr_group = {
 +      .attrs = amdgpu_gtt_mgr_attributes
 +};
 +
  /**
   * amdgpu_gtt_mgr_has_gart_addr - Check if mem has address space
   *
@@@ -306,3 -249,76 +259,61 @@@ static const struct ttm_resource_manage
        .free = amdgpu_gtt_mgr_del,
        .debug = amdgpu_gtt_mgr_debug
  };
 -      int ret;
+ /**
+  * amdgpu_gtt_mgr_init - init GTT manager and DRM MM
+  *
+  * @adev: amdgpu_device pointer
+  * @gtt_size: maximum size of GTT
+  *
+  * Allocate and initialize the GTT manager.
+  */
+ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size)
+ {
+       struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr;
+       struct ttm_resource_manager *man = &mgr->manager;
+       uint64_t start, size;
 -      ret = device_create_file(adev->dev, &dev_attr_mem_info_gtt_total);
 -      if (ret) {
 -              DRM_ERROR("Failed to create device file mem_info_gtt_total\n");
 -              return ret;
 -      }
 -      ret = device_create_file(adev->dev, &dev_attr_mem_info_gtt_used);
 -      if (ret) {
 -              DRM_ERROR("Failed to create device file mem_info_gtt_used\n");
 -              return ret;
 -      }
 -
+       man->use_tt = true;
+       man->func = &amdgpu_gtt_mgr_func;
+       ttm_resource_manager_init(man, gtt_size >> PAGE_SHIFT);
+       start = AMDGPU_GTT_MAX_TRANSFER_SIZE * AMDGPU_GTT_NUM_TRANSFER_WINDOWS;
+       size = (adev->gmc.gart_size >> PAGE_SHIFT) - start;
+       drm_mm_init(&mgr->mm, start, size);
+       spin_lock_init(&mgr->lock);
+       atomic64_set(&mgr->available, gtt_size >> PAGE_SHIFT);
 -      device_remove_file(adev->dev, &dev_attr_mem_info_gtt_total);
 -      device_remove_file(adev->dev, &dev_attr_mem_info_gtt_used);
 -
+       ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_TT, &mgr->manager);
+       ttm_resource_manager_set_used(man, true);
+       return 0;
+ }
+ /**
+  * amdgpu_gtt_mgr_fini - free and destroy GTT manager
+  *
+  * @adev: amdgpu_device pointer
+  *
+  * Destroy and free the GTT manager, returns -EBUSY if ranges are still
+  * allocated inside it.
+  */
+ void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev)
+ {
+       struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr;
+       struct ttm_resource_manager *man = &mgr->manager;
+       int ret;
+       ttm_resource_manager_set_used(man, false);
+       ret = ttm_resource_manager_evict_all(&adev->mman.bdev, man);
+       if (ret)
+               return;
+       spin_lock(&mgr->lock);
+       drm_mm_takedown(&mgr->mm);
+       spin_unlock(&mgr->lock);
+       ttm_resource_manager_cleanup(man);
+       ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_TT, NULL);
+ }
  
  #include "amdgpu_ras.h"
  #include "amdgpu_securedisplay.h"
+ #include "amdgpu_atomfirmware.h"
  
 +#include <drm/drm_drv.h>
 +
  static int psp_sysfs_init(struct amdgpu_device *adev);
  static void psp_sysfs_fini(struct amdgpu_device *adev);
  
@@@ -1038,8 -1017,16 +1021,15 @@@ static int psp_ras_load(struct psp_cont
        if (!cmd)
                return -ENOMEM;
  
 -      memset(psp->fw_pri_buf, 0, PSP_1_MEG);
 -      memcpy(psp->fw_pri_buf, psp->ta_ras_start_addr, psp->ta_ras_ucode_size);
 +      psp_copy_fw(psp, psp->ta_ras_start_addr, psp->ta_ras_ucode_size);
  
+       ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
+       if (psp->adev->gmc.xgmi.connected_to_cpu)
+               ras_cmd->ras_in_message.init_flags.poison_mode_en = 1;
+       else
+               ras_cmd->ras_in_message.init_flags.dgpu_mode = 1;
        psp_prep_ta_load_cmd_buf(cmd,
                                 psp->fw_pri_mc_addr,
                                 psp->ta_ras_ucode_size,
@@@ -2328,10 -2359,9 +2359,10 @@@ int amdgpu_ras_pre_fini(struct amdgpu_d
  {
        struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
  
-       if (!adev->ras_features || !con)
+       if (!adev->ras_enabled || !con)
                return 0;
  
 +
        /* Need disable ras on all IPs here before ip [hw/sw]fini */
        amdgpu_ras_disable_all_features(adev, 0);
        amdgpu_ras_recovery_fini(adev);
@@@ -1594,23 -1619,21 +1620,24 @@@ static int amdgpu_vm_update_ptes(struc
   * Returns:
   * 0 for success, -EINVAL for failure.
   */
- static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
-                                      struct amdgpu_device *bo_adev,
-                                      struct amdgpu_vm *vm, bool immediate,
-                                      bool unlocked, struct dma_resv *resv,
-                                      uint64_t start, uint64_t last,
-                                      uint64_t flags, uint64_t offset,
-                                      struct drm_mm_node *nodes,
-                                      dma_addr_t *pages_addr,
-                                      struct dma_fence **fence)
+ int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
+                               struct amdgpu_device *bo_adev,
+                               struct amdgpu_vm *vm, bool immediate,
+                               bool unlocked, struct dma_resv *resv,
+                               uint64_t start, uint64_t last,
+                               uint64_t flags, uint64_t offset,
+                               struct ttm_resource *res,
+                               dma_addr_t *pages_addr,
+                               struct dma_fence **fence,
+                               bool *table_freed)
  {
        struct amdgpu_vm_update_params params;
+       struct amdgpu_res_cursor cursor;
        enum amdgpu_sync_mode sync_mode;
-       uint64_t pfn;
 -      int r;
 +      int r, idx;
 +
 +      if (!drm_dev_enter(&adev->ddev, &idx))
 +              return -ENODEV;
  
        memset(&params, 0, sizeof(params));
        params.adev = adev;
  
        r = vm->update_funcs->commit(&params, fence);
  
+       if (table_freed)
+               *table_freed = params.table_freed;
  error_unlock:
        amdgpu_vm_eviction_unlock(vm);
 +      drm_dev_exit(idx);
        return r;
  }
  
@@@ -162,74 -181,6 +181,10 @@@ static struct attribute *amdgpu_vram_mg
        NULL
  };
  
- static const struct ttm_resource_manager_func amdgpu_vram_mgr_func;
- /**
-  * amdgpu_vram_mgr_init - init VRAM manager and DRM MM
-  *
-  * @adev: amdgpu_device pointer
-  *
-  * Allocate and initialize the VRAM manager.
-  */
- int amdgpu_vram_mgr_init(struct amdgpu_device *adev)
- {
-       struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr;
-       struct ttm_resource_manager *man = &mgr->manager;
-       ttm_resource_manager_init(man, adev->gmc.real_vram_size >> PAGE_SHIFT);
-       man->func = &amdgpu_vram_mgr_func;
-       drm_mm_init(&mgr->mm, 0, man->size);
-       spin_lock_init(&mgr->lock);
-       INIT_LIST_HEAD(&mgr->reservations_pending);
-       INIT_LIST_HEAD(&mgr->reserved_pages);
-       ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, &mgr->manager);
-       ttm_resource_manager_set_used(man, true);
-       return 0;
- }
- /**
-  * amdgpu_vram_mgr_fini - free and destroy VRAM manager
-  *
-  * @adev: amdgpu_device pointer
-  *
-  * Destroy and free the VRAM manager, returns -EBUSY if ranges are still
-  * allocated inside it.
-  */
- void amdgpu_vram_mgr_fini(struct amdgpu_device *adev)
- {
-       struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr;
-       struct ttm_resource_manager *man = &mgr->manager;
-       int ret;
-       struct amdgpu_vram_reservation *rsv, *temp;
-       ttm_resource_manager_set_used(man, false);
-       ret = ttm_resource_manager_evict_all(&adev->mman.bdev, man);
-       if (ret)
-               return;
-       spin_lock(&mgr->lock);
-       list_for_each_entry_safe(rsv, temp, &mgr->reservations_pending, node)
-               kfree(rsv);
-       list_for_each_entry_safe(rsv, temp, &mgr->reserved_pages, node) {
-               drm_mm_remove_node(&rsv->mm_node);
-               kfree(rsv);
-       }
-       drm_mm_takedown(&mgr->mm);
-       spin_unlock(&mgr->lock);
-       ttm_resource_manager_cleanup(man);
-       ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, NULL);
- }
 +const struct attribute_group amdgpu_vram_mgr_attr_group = {
 +      .attrs = amdgpu_vram_mgr_attributes
 +};
 +
  /**
   * amdgpu_vram_mgr_vis_size - Calculate visible node size
   *
@@@ -724,3 -672,73 +676,65 @@@ static const struct ttm_resource_manage
        .free   = amdgpu_vram_mgr_del,
        .debug  = amdgpu_vram_mgr_debug
  };
 -      int ret;
+ /**
+  * amdgpu_vram_mgr_init - init VRAM manager and DRM MM
+  *
+  * @adev: amdgpu_device pointer
+  *
+  * Allocate and initialize the VRAM manager.
+  */
+ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)
+ {
+       struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr;
+       struct ttm_resource_manager *man = &mgr->manager;
 -      /* Add the two VRAM-related sysfs files */
 -      ret = sysfs_create_files(&adev->dev->kobj, amdgpu_vram_mgr_attributes);
 -      if (ret)
 -              DRM_ERROR("Failed to register sysfs\n");
 -
+       ttm_resource_manager_init(man, adev->gmc.real_vram_size >> PAGE_SHIFT);
+       man->func = &amdgpu_vram_mgr_func;
+       drm_mm_init(&mgr->mm, 0, man->size);
+       spin_lock_init(&mgr->lock);
+       INIT_LIST_HEAD(&mgr->reservations_pending);
+       INIT_LIST_HEAD(&mgr->reserved_pages);
 -      sysfs_remove_files(&adev->dev->kobj, amdgpu_vram_mgr_attributes);
 -
+       ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, &mgr->manager);
+       ttm_resource_manager_set_used(man, true);
+       return 0;
+ }
+ /**
+  * amdgpu_vram_mgr_fini - free and destroy VRAM manager
+  *
+  * @adev: amdgpu_device pointer
+  *
+  * Destroy and free the VRAM manager, returns -EBUSY if ranges are still
+  * allocated inside it.
+  */
+ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev)
+ {
+       struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr;
+       struct ttm_resource_manager *man = &mgr->manager;
+       int ret;
+       struct amdgpu_vram_reservation *rsv, *temp;
+       ttm_resource_manager_set_used(man, false);
+       ret = ttm_resource_manager_evict_all(&adev->mman.bdev, man);
+       if (ret)
+               return;
+       spin_lock(&mgr->lock);
+       list_for_each_entry_safe(rsv, temp, &mgr->reservations_pending, node)
+               kfree(rsv);
+       list_for_each_entry_safe(rsv, temp, &mgr->reserved_pages, node) {
+               drm_mm_remove_node(&rsv->mm_node);
+               kfree(rsv);
+       }
+       drm_mm_takedown(&mgr->mm);
+       spin_unlock(&mgr->lock);
+       ttm_resource_manager_cleanup(man);
+       ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, NULL);
+ }
Simple merge
Simple merge
@@@ -861,6 -891,8 +891,7 @@@ out
  void kgd2kfd_device_exit(struct kfd_dev *kfd)
  {
        if (kfd->init_complete) {
 -              kgd2kfd_suspend(kfd, false);
+               svm_migrate_fini((struct amdgpu_device *)kfd->kgd);
                device_queue_manager_uninit(kfd->dqm);
                kfd_interrupt_exit(kfd);
                kfd_topology_remove_device(kfd);
Simple merge
Simple merge