]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
drm/amdgpu: add cgs interface to register pp handle
[mirror_ubuntu-bionic-kernel.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_cgs.c
index fd435a96481c2f1c019bd4d2303ebbb9b590adad..a7afe553e0a165361e5be1a2cdee46c28ed1e92f 100644 (file)
@@ -42,10 +42,31 @@ struct amdgpu_cgs_device {
        struct amdgpu_device *adev =                                    \
                ((struct amdgpu_cgs_device *)cgs_device)->adev
 
+static void *amdgpu_cgs_register_pp_handle(struct cgs_device *cgs_device,
+                       int (*call_back_func)(struct amd_pp_init *, void **))
+{
+       CGS_FUNC_ADEV;
+       struct amd_pp_init pp_init;
+       struct amd_powerplay *amd_pp;
+
+       if (call_back_func == NULL)
+               return NULL;
+
+       amd_pp = &(adev->powerplay);
+       pp_init.chip_family = adev->family;
+       pp_init.chip_id = adev->asic_type;
+       pp_init.pm_en = (amdgpu_dpm != 0 && !amdgpu_sriov_vf(adev)) ? true : false;
+       pp_init.feature_mask = amdgpu_pp_feature_mask;
+       pp_init.device = cgs_device;
+       if (call_back_func(&pp_init, &(amd_pp->pp_handle)))
+               return NULL;
+
+       return adev->powerplay.pp_handle;
+}
+
 static int amdgpu_cgs_alloc_gpu_mem(struct cgs_device *cgs_device,
                                    enum cgs_gpu_mem_type type,
                                    uint64_t size, uint64_t align,
-                                   uint64_t min_offset, uint64_t max_offset,
                                    cgs_handle_t *handle)
 {
        CGS_FUNC_ADEV;
@@ -53,13 +74,6 @@ static int amdgpu_cgs_alloc_gpu_mem(struct cgs_device *cgs_device,
        int ret = 0;
        uint32_t domain = 0;
        struct amdgpu_bo *obj;
-       struct ttm_placement placement;
-       struct ttm_place place;
-
-       if (min_offset > max_offset) {
-               BUG_ON(1);
-               return -EINVAL;
-       }
 
        /* fail if the alignment is not a power of 2 */
        if (((align != 1) && (align & (align - 1)))
@@ -73,41 +87,19 @@ static int amdgpu_cgs_alloc_gpu_mem(struct cgs_device *cgs_device,
                flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
                        AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
                domain = AMDGPU_GEM_DOMAIN_VRAM;
-               if (max_offset > adev->mc.real_vram_size)
-                       return -EINVAL;
-               place.fpfn = min_offset >> PAGE_SHIFT;
-               place.lpfn = max_offset >> PAGE_SHIFT;
-               place.flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
-                       TTM_PL_FLAG_VRAM;
                break;
        case CGS_GPU_MEM_TYPE__INVISIBLE_CONTIG_FB:
        case CGS_GPU_MEM_TYPE__INVISIBLE_FB:
                flags = AMDGPU_GEM_CREATE_NO_CPU_ACCESS |
                        AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
                domain = AMDGPU_GEM_DOMAIN_VRAM;
-               if (adev->mc.visible_vram_size < adev->mc.real_vram_size) {
-                       place.fpfn =
-                               max(min_offset, adev->mc.visible_vram_size) >> PAGE_SHIFT;
-                       place.lpfn =
-                               min(max_offset, adev->mc.real_vram_size) >> PAGE_SHIFT;
-                       place.flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
-                               TTM_PL_FLAG_VRAM;
-               }
-
                break;
        case CGS_GPU_MEM_TYPE__GART_CACHEABLE:
                domain = AMDGPU_GEM_DOMAIN_GTT;
-               place.fpfn = min_offset >> PAGE_SHIFT;
-               place.lpfn = max_offset >> PAGE_SHIFT;
-               place.flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT;
                break;
        case CGS_GPU_MEM_TYPE__GART_WRITECOMBINE:
                flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC;
                domain = AMDGPU_GEM_DOMAIN_GTT;
-               place.fpfn = min_offset >> PAGE_SHIFT;
-               place.lpfn = max_offset >> PAGE_SHIFT;
-               place.flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_TT |
-                       TTM_PL_FLAG_UNCACHED;
                break;
        default:
                return -EINVAL;
@@ -116,15 +108,8 @@ static int amdgpu_cgs_alloc_gpu_mem(struct cgs_device *cgs_device,
 
        *handle = 0;
 
-       placement.placement = &place;
-       placement.num_placement = 1;
-       placement.busy_placement = &place;
-       placement.num_busy_placement = 1;
-
-       ret = amdgpu_bo_create_restricted(adev, size, PAGE_SIZE,
-                                         true, domain, flags,
-                                         NULL, &placement, NULL,
-                                         0, &obj);
+       ret = amdgpu_bo_create(adev, size, align, true, domain, flags,
+                              NULL, NULL, 0, &obj);
        if (ret) {
                DRM_ERROR("(%d) bo create failed\n", ret);
                return ret;
@@ -155,19 +140,14 @@ static int amdgpu_cgs_gmap_gpu_mem(struct cgs_device *cgs_device, cgs_handle_t h
                                   uint64_t *mcaddr)
 {
        int r;
-       u64 min_offset, max_offset;
        struct amdgpu_bo *obj = (struct amdgpu_bo *)handle;
 
        WARN_ON_ONCE(obj->placement.num_placement > 1);
 
-       min_offset = obj->placements[0].fpfn << PAGE_SHIFT;
-       max_offset = obj->placements[0].lpfn << PAGE_SHIFT;
-
        r = amdgpu_bo_reserve(obj, true);
        if (unlikely(r != 0))
                return r;
-       r = amdgpu_bo_pin_restricted(obj, obj->preferred_domains,
-                                    min_offset, max_offset, mcaddr);
+       r = amdgpu_bo_pin(obj, obj->preferred_domains, mcaddr);
        amdgpu_bo_unreserve(obj);
        return r;
 }
@@ -675,6 +655,85 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
 
                if (!adev->pm.fw) {
                        switch (adev->asic_type) {
+                       case CHIP_TAHITI:
+                               strcpy(fw_name, "radeon/tahiti_smc.bin");
+                               break;
+                       case CHIP_PITCAIRN:
+                               if ((adev->pdev->revision == 0x81) &&
+                                   ((adev->pdev->device == 0x6810) ||
+                                   (adev->pdev->device == 0x6811))) {
+                                       info->is_kicker = true;
+                                       strcpy(fw_name, "radeon/pitcairn_k_smc.bin");
+                               } else {
+                                       strcpy(fw_name, "radeon/pitcairn_smc.bin");
+                               }
+                               break;
+                       case CHIP_VERDE:
+                               if (((adev->pdev->device == 0x6820) &&
+                                       ((adev->pdev->revision == 0x81) ||
+                                       (adev->pdev->revision == 0x83))) ||
+                                   ((adev->pdev->device == 0x6821) &&
+                                       ((adev->pdev->revision == 0x83) ||
+                                       (adev->pdev->revision == 0x87))) ||
+                                   ((adev->pdev->revision == 0x87) &&
+                                       ((adev->pdev->device == 0x6823) ||
+                                       (adev->pdev->device == 0x682b)))) {
+                                       info->is_kicker = true;
+                                       strcpy(fw_name, "radeon/verde_k_smc.bin");
+                               } else {
+                                       strcpy(fw_name, "radeon/verde_smc.bin");
+                               }
+                               break;
+                       case CHIP_OLAND:
+                               if (((adev->pdev->revision == 0x81) &&
+                                       ((adev->pdev->device == 0x6600) ||
+                                       (adev->pdev->device == 0x6604) ||
+                                       (adev->pdev->device == 0x6605) ||
+                                       (adev->pdev->device == 0x6610))) ||
+                                   ((adev->pdev->revision == 0x83) &&
+                                       (adev->pdev->device == 0x6610))) {
+                                       info->is_kicker = true;
+                                       strcpy(fw_name, "radeon/oland_k_smc.bin");
+                               } else {
+                                       strcpy(fw_name, "radeon/oland_smc.bin");
+                               }
+                               break;
+                       case CHIP_HAINAN:
+                               if (((adev->pdev->revision == 0x81) &&
+                                       (adev->pdev->device == 0x6660)) ||
+                                   ((adev->pdev->revision == 0x83) &&
+                                       ((adev->pdev->device == 0x6660) ||
+                                       (adev->pdev->device == 0x6663) ||
+                                       (adev->pdev->device == 0x6665) ||
+                                        (adev->pdev->device == 0x6667)))) {
+                                       info->is_kicker = true;
+                                       strcpy(fw_name, "radeon/hainan_k_smc.bin");
+                               } else if ((adev->pdev->revision == 0xc3) &&
+                                        (adev->pdev->device == 0x6665)) {
+                                       info->is_kicker = true;
+                                       strcpy(fw_name, "radeon/banks_k_2_smc.bin");
+                               } else {
+                                       strcpy(fw_name, "radeon/hainan_smc.bin");
+                               }
+                               break;
+                       case CHIP_BONAIRE:
+                               if ((adev->pdev->revision == 0x80) ||
+                                       (adev->pdev->revision == 0x81) ||
+                                       (adev->pdev->device == 0x665f)) {
+                                       info->is_kicker = true;
+                                       strcpy(fw_name, "radeon/bonaire_k_smc.bin");
+                               } else {
+                                       strcpy(fw_name, "radeon/bonaire_smc.bin");
+                               }
+                               break;
+                       case CHIP_HAWAII:
+                               if (adev->pdev->revision == 0x80) {
+                                       info->is_kicker = true;
+                                       strcpy(fw_name, "radeon/hawaii_k_smc.bin");
+                               } else {
+                                       strcpy(fw_name, "radeon/hawaii_smc.bin");
+                               }
+                               break;
                        case CHIP_TOPAZ:
                                if (((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x81)) ||
                                    ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x83)) ||
@@ -838,6 +897,9 @@ static int amdgpu_cgs_query_system_info(struct cgs_device *cgs_device,
        case CGS_SYSTEM_INFO_PCIE_SUB_SYS_VENDOR_ID:
                sys_info->value = adev->pdev->subsystem_vendor;
                break;
+       case CGS_SYSTEM_INFO_PCIE_BUS_DEVFN:
+               sys_info->value = adev->pdev->devfn;
+               break;
        default:
                return -ENODEV;
        }
@@ -1139,6 +1201,7 @@ static const struct cgs_ops amdgpu_cgs_ops = {
        .is_virtualization_enabled = amdgpu_cgs_is_virtualization_enabled,
        .enter_safe_mode = amdgpu_cgs_enter_safe_mode,
        .lock_grbm_idx = amdgpu_cgs_lock_grbm_idx,
+       .register_pp_handle = amdgpu_cgs_register_pp_handle,
 };
 
 static const struct cgs_os_ops amdgpu_cgs_os_ops = {