diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1966-drm-amdgpu-Reserve-shared-memory-on-VRAM-for-SR-IOV.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1966-drm-amdgpu-Reserve-shared-memory-on-VRAM-for-SR-IOV.patch | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1966-drm-amdgpu-Reserve-shared-memory-on-VRAM-for-SR-IOV.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1966-drm-amdgpu-Reserve-shared-memory-on-VRAM-for-SR-IOV.patch new file mode 100644 index 00000000..f9fd33cd --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1966-drm-amdgpu-Reserve-shared-memory-on-VRAM-for-SR-IOV.patch @@ -0,0 +1,214 @@ +From c650e90f0086ef6059c6c5dba5a1e2a09e227b3b Mon Sep 17 00:00:00 2001 +From: Horace Chen <horace.chen@amd.com> +Date: Fri, 29 Sep 2017 14:41:57 +0800 +Subject: [PATCH 1966/4131] drm/amdgpu: Reserve shared memory on VRAM for + SR-IOV +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +SR-IOV need to reserve a piece of shared VRAM at the exact place +to exchange data betweem PF and VF. The start address and size of +the shared mem are passed to guest through VBIOS structure +VRAM_UsageByFirmware. + +VRAM_UsageByFirmware is a general feature in VBIOS, it indicates +that VBIOS need to reserve a piece of memory on the VRAM. + +Because the mem address is specified. Reserve it early in +amdgpu_ttm_init to make sure that it can monoplize the space. + +Signed-off-by: Horace Chen <horace.chen@amd.com> +Reviewed-by: Christian König <christian.koenig@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 14 +++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c | 18 ++++++- + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 76 ++++++++++++++++++++++++++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 9 ++++ + 4 files changed, 116 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index d866296..7758192 100755 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -1421,6 +1421,18 @@ struct amdgpu_atcs { + }; + + /* ++ * Firmware VRAM reservation ++ */ ++struct amdgpu_fw_vram_usage { ++ u64 start_offset; ++ u64 size; ++ struct amdgpu_bo *reserved_bo; ++ void *va; ++}; ++ ++int amdgpu_fw_reserve_vram_init(struct amdgpu_device *adev); ++ ++/* + * CGS + */ + struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev); +@@ -1663,6 +1675,8 @@ struct amdgpu_device { + struct delayed_work late_init_work; + + struct amdgpu_virt virt; ++ /* firmware VRAM reservation */ ++ struct amdgpu_fw_vram_usage fw_vram_usage; + + /* link all shadow bo */ + struct list_head shadow_list; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c +index 274d031..337180e 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c +@@ -1811,6 +1811,8 @@ int amdgpu_atombios_allocate_fb_scratch(struct amdgpu_device *adev) + uint16_t data_offset; + int usage_bytes = 0; + struct _ATOM_VRAM_USAGE_BY_FIRMWARE *firmware_usage; ++ u64 start_addr; ++ u64 size; + + if (amdgpu_atom_parse_data_header(ctx, index, NULL, NULL, NULL, &data_offset)) { + firmware_usage = (struct _ATOM_VRAM_USAGE_BY_FIRMWARE *)(ctx->bios + data_offset); +@@ -1819,7 +1821,21 @@ int amdgpu_atombios_allocate_fb_scratch(struct amdgpu_device *adev) + le32_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware), + le16_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb)); + +- usage_bytes = le16_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb) * 1024; ++ start_addr = firmware_usage->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware; ++ size = firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb; ++ ++ if ((uint32_t)(start_addr & ATOM_VRAM_OPERATION_FLAGS_MASK) == ++ (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION << ++ ATOM_VRAM_OPERATION_FLAGS_SHIFT)) { ++ /* Firmware request VRAM reservation for SR-IOV */ ++ adev->fw_vram_usage.start_offset = (start_addr & ++ (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10; ++ adev->fw_vram_usage.size = size << 10; ++ /* Use the default scratch size */ ++ usage_bytes = 0; ++ } else { ++ usage_bytes = le16_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb) * 1024; ++ } + } + ctx->scratch_size_bytes = 0; + if (usage_bytes == 0) +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index b3d12c2..0cd1647 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -659,6 +659,81 @@ void amdgpu_gart_location(struct amdgpu_device *adev, struct amdgpu_mc *mc) + } + + /* ++ * Firmware Reservation functions ++ */ ++/** ++ * amdgpu_fw_reserve_vram_fini - free fw reserved vram ++ * ++ * @adev: amdgpu_device pointer ++ * ++ * free fw reserved vram if it has been reserved. ++ */ ++void amdgpu_fw_reserve_vram_fini(struct amdgpu_device *adev) ++{ ++ amdgpu_bo_free_kernel(&adev->fw_vram_usage.reserved_bo, ++ NULL, &adev->fw_vram_usage.va); ++} ++ ++/** ++ * amdgpu_fw_reserve_vram_init - create bo vram reservation from fw ++ * ++ * @adev: amdgpu_device pointer ++ * ++ * create bo vram reservation from fw. ++ */ ++int amdgpu_fw_reserve_vram_init(struct amdgpu_device *adev) ++{ ++ int r = 0; ++ u64 gpu_addr; ++ u64 vram_size = adev->mc.visible_vram_size; ++ ++ adev->fw_vram_usage.va = NULL; ++ adev->fw_vram_usage.reserved_bo = NULL; ++ ++ if (adev->fw_vram_usage.size > 0 && ++ adev->fw_vram_usage.size <= vram_size) { ++ ++ r = amdgpu_bo_create(adev, adev->fw_vram_usage.size, ++ PAGE_SIZE, true, 0, ++ AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | ++ AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, NULL, NULL, 0, ++ &adev->fw_vram_usage.reserved_bo); ++ if (r) ++ goto error_create; ++ ++ r = amdgpu_bo_reserve(adev->fw_vram_usage.reserved_bo, false); ++ if (r) ++ goto error_reserve; ++ r = amdgpu_bo_pin_restricted(adev->fw_vram_usage.reserved_bo, ++ AMDGPU_GEM_DOMAIN_VRAM, ++ adev->fw_vram_usage.start_offset, ++ (adev->fw_vram_usage.start_offset + ++ adev->fw_vram_usage.size), &gpu_addr); ++ if (r) ++ goto error_pin; ++ r = amdgpu_bo_kmap(adev->fw_vram_usage.reserved_bo, ++ &adev->fw_vram_usage.va); ++ if (r) ++ goto error_kmap; ++ ++ amdgpu_bo_unreserve(adev->fw_vram_usage.reserved_bo); ++ } ++ return r; ++ ++error_kmap: ++ amdgpu_bo_unpin(adev->fw_vram_usage.reserved_bo); ++error_pin: ++ amdgpu_bo_unreserve(adev->fw_vram_usage.reserved_bo); ++error_reserve: ++ amdgpu_bo_unref(&adev->fw_vram_usage.reserved_bo); ++error_create: ++ adev->fw_vram_usage.va = NULL; ++ adev->fw_vram_usage.reserved_bo = NULL; ++ return r; ++} ++ ++ ++/* + * GPU helpers function. + */ + /** +@@ -2370,6 +2445,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev) + /* evict vram memory */ + amdgpu_bo_evict_vram(adev); + amdgpu_ib_pool_fini(adev); ++ amdgpu_fw_reserve_vram_fini(adev); + amdgpu_fence_driver_fini(adev); + amdgpu_fbdev_fini(adev); + r = amdgpu_fini(adev); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +index 7239121..857a3ca 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +@@ -1486,6 +1486,15 @@ int amdgpu_ttm_init(struct amdgpu_device *adev) + /* Change the size here instead of the init above so only lpfn is affected */ + amdgpu_ttm_set_active_vram_size(adev, adev->mc.visible_vram_size); + ++ /* ++ *The reserved vram for firmware must be pinned to the specified ++ *place on the VRAM, so reserve it early. ++ */ ++ r = amdgpu_fw_reserve_vram_init(adev); ++ if (r) { ++ return r; ++ } ++ + r = amdgpu_bo_create_kernel(adev, adev->mc.stolen_size, PAGE_SIZE, + AMDGPU_GEM_DOMAIN_VRAM, + &adev->stolen_vga_memory, +-- +2.7.4 + |