From: Alex Deucher <alexander.deucher@xxxxxxx> Rename the VRAM manager functions so they can be resused to manage doorbell BAR as well. Cc: Christian Koenig <christian.koenig@xxxxxxx> Signed-off-by: Alex Deucher <alexander.deucher@xxxxxxx> Signed-off-by: Shashank Sharma <shashank.sharma@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 8 +- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 4 +- drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 4 +- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 4 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 4 +- .../gpu/drm/amd/amdgpu/amdgpu_res_cursor.h | 14 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 4 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 36 ++-- drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 200 ++++++++++-------- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h | 18 +- 12 files changed, 157 insertions(+), 143 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 7b5ce00f0602..e34eae8d64cf 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -723,7 +723,7 @@ static void amdgpu_cs_get_threshold_for_moves(struct amdgpu_device *adev, if (!amdgpu_gmc_vram_full_visible(&adev->gmc)) { u64 total_vis_vram = adev->gmc.visible_vram_size; u64 used_vis_vram = - amdgpu_vram_mgr_vis_usage(&adev->mman.vram_mgr); + amdgpu_bar_mgr_vis_usage(&adev->mman.vram_mgr); if (used_vis_vram < total_vis_vram) { u64 free_vis_vram = total_vis_vram - used_vis_vram; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c index 271e30e34d93..c48ccde281c3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c @@ -179,9 +179,9 @@ static struct sg_table *amdgpu_dma_buf_map(struct dma_buf_attachment *attach, break; case TTM_PL_VRAM: - r = amdgpu_vram_mgr_alloc_sgt(adev, bo->tbo.resource, 0, - bo->tbo.base.size, attach->dev, - dir, &sgt); + r = amdgpu_bar_mgr_alloc_sgt(adev, bo->tbo.resource, 0, + bo->tbo.base.size, attach->dev, + dir, &sgt); if (r) return ERR_PTR(r); break; @@ -215,7 +215,7 @@ static void amdgpu_dma_buf_unmap(struct dma_buf_attachment *attach, sg_free_table(sgt); kfree(sgt); } else { - amdgpu_vram_mgr_free_sgt(attach->dev, dir, sgt); + amdgpu_bar_mgr_free_sgt(attach->dev, dir, sgt); } } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index cd4caaa29528..9f148ea7ca66 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -2807,12 +2807,12 @@ static struct pci_error_handlers amdgpu_pci_err_handler = { .resume = amdgpu_pci_resume, }; -extern const struct attribute_group amdgpu_vram_mgr_attr_group; +extern const struct attribute_group amdgpu_bar_mgr_attr_group; extern const struct attribute_group amdgpu_gtt_mgr_attr_group; extern const struct attribute_group amdgpu_vbios_version_attr_group; static const struct attribute_group *amdgpu_sysfs_groups[] = { - &amdgpu_vram_mgr_attr_group, + &amdgpu_bar_mgr_attr_group, &amdgpu_gtt_mgr_attr_group, &amdgpu_vbios_version_attr_group, NULL, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 7aa7e52ca784..2ce11434fb22 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -650,7 +650,7 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) ui64 = ttm_resource_manager_usage(&adev->mman.vram_mgr.manager); return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; case AMDGPU_INFO_VIS_VRAM_USAGE: - ui64 = amdgpu_vram_mgr_vis_usage(&adev->mman.vram_mgr); + ui64 = amdgpu_bar_mgr_vis_usage(&adev->mman.vram_mgr); return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; case AMDGPU_INFO_GTT_USAGE: ui64 = ttm_resource_manager_usage(&adev->mman.gtt_mgr.manager); @@ -704,7 +704,7 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) atomic64_read(&adev->visible_pin_size), mem.vram.usable_heap_size); mem.cpu_accessible_vram.heap_usage = - amdgpu_vram_mgr_vis_usage(&adev->mman.vram_mgr); + amdgpu_bar_mgr_vis_usage(&adev->mman.vram_mgr); mem.cpu_accessible_vram.max_allocation = mem.cpu_accessible_vram.usable_heap_size * 3 / 4; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 25a68d8888e0..ca85d64a72c2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -958,7 +958,7 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain, domain = amdgpu_mem_type_to_domain(bo->tbo.resource->mem_type); if (domain == AMDGPU_GEM_DOMAIN_VRAM) { atomic64_add(amdgpu_bo_size(bo), &adev->vram_pin_size); - atomic64_add(amdgpu_vram_mgr_bo_visible_size(bo), + atomic64_add(amdgpu_bar_mgr_bo_visible_size(bo), &adev->visible_pin_size); } else if (domain == AMDGPU_GEM_DOMAIN_GTT) { atomic64_add(amdgpu_bo_size(bo), &adev->gart_pin_size); @@ -1009,7 +1009,7 @@ void amdgpu_bo_unpin(struct amdgpu_bo *bo) if (bo->tbo.resource->mem_type == TTM_PL_VRAM) { atomic64_sub(amdgpu_bo_size(bo), &adev->vram_pin_size); - atomic64_sub(amdgpu_vram_mgr_bo_visible_size(bo), + atomic64_sub(amdgpu_bar_mgr_bo_visible_size(bo), &adev->visible_pin_size); } else if (bo->tbo.resource->mem_type == TTM_PL_TT) { atomic64_sub(amdgpu_bo_size(bo), &adev->gart_pin_size); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c index ad490c1e2f57..4e64a035d49d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c @@ -1899,7 +1899,7 @@ static int amdgpu_ras_badpages_read(struct amdgpu_device *adev, .size = AMDGPU_GPU_PAGE_SIZE, .flags = AMDGPU_RAS_RETIRE_PAGE_RESERVED, }; - status = amdgpu_vram_mgr_query_page_status(&adev->mman.vram_mgr, + status = amdgpu_bar_mgr_query_page_status(&adev->mman.vram_mgr, data->bps[i].retired_page); if (status == -EBUSY) (*bps)[i].flags = AMDGPU_RAS_RETIRE_PAGE_PENDING; @@ -2012,7 +2012,7 @@ int amdgpu_ras_add_bad_pages(struct amdgpu_device *adev, goto out; } - amdgpu_vram_mgr_reserve_range(&adev->mman.vram_mgr, + amdgpu_bar_mgr_reserve_range(&adev->mman.vram_mgr, bps[i].retired_page << AMDGPU_GPU_PAGE_SHIFT, AMDGPU_GPU_PAGE_SIZE); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h index 5c4f93ee0c57..dd2b43acc600 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h @@ -68,7 +68,7 @@ static inline void amdgpu_res_first(struct ttm_resource *res, switch (cur->mem_type) { case TTM_PL_VRAM: - head = &to_amdgpu_vram_mgr_resource(res)->blocks; + head = &to_amdgpu_bar_mgr_resource(res)->blocks; block = list_first_entry_or_null(head, struct drm_buddy_block, @@ -76,16 +76,16 @@ static inline void amdgpu_res_first(struct ttm_resource *res, if (!block) goto fallback; - while (start >= amdgpu_vram_mgr_block_size(block)) { - start -= amdgpu_vram_mgr_block_size(block); + while (start >= amdgpu_bar_mgr_block_size(block)) { + start -= amdgpu_bar_mgr_block_size(block); next = block->link.next; if (next != head) block = list_entry(next, struct drm_buddy_block, link); } - cur->start = amdgpu_vram_mgr_block_start(block) + start; - cur->size = min(amdgpu_vram_mgr_block_size(block) - start, size); + cur->start = amdgpu_bar_mgr_block_start(block) + start; + cur->size = min(amdgpu_bar_mgr_block_size(block) - start, size); cur->remaining = size; cur->node = block; break; @@ -148,8 +148,8 @@ static inline void amdgpu_res_next(struct amdgpu_res_cursor *cur, uint64_t size) block = list_entry(next, struct drm_buddy_block, link); cur->node = block; - cur->start = amdgpu_vram_mgr_block_start(block); - cur->size = min(amdgpu_vram_mgr_block_size(block), cur->remaining); + cur->start = amdgpu_bar_mgr_block_start(block); + cur->size = min(amdgpu_bar_mgr_block_size(block), cur->remaining); break; case TTM_PL_TT: node = cur->node; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 55e0284b2bdd..668826653591 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -1735,7 +1735,7 @@ int amdgpu_ttm_init(struct amdgpu_device *adev) adev->mman.initialized = true; /* Initialize VRAM pool with all of VRAM divided into pages */ - r = amdgpu_vram_mgr_init(adev); + r = amdgpu_bar_mgr_init(adev, TTM_PL_VRAM); if (r) { DRM_ERROR("Failed initializing VRAM heap.\n"); return r; @@ -1911,7 +1911,7 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev) drm_dev_exit(idx); } - amdgpu_vram_mgr_fini(adev); + amdgpu_bar_mgr_fini(adev, TTM_PL_VRAM); amdgpu_gtt_mgr_fini(adev); amdgpu_preempt_mgr_fini(adev); ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_GDS); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index e2cd5894afc9..a918bbd67004 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -61,7 +61,7 @@ struct amdgpu_mman { /* Scheduler entity for buffer moves */ struct drm_sched_entity entity; - struct amdgpu_vram_mgr vram_mgr; + struct amdgpu_bar_mgr vram_mgr; struct amdgpu_gtt_mgr gtt_mgr; struct ttm_resource_manager preempt_mgr; @@ -107,29 +107,29 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size); void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev); int amdgpu_preempt_mgr_init(struct amdgpu_device *adev); void amdgpu_preempt_mgr_fini(struct amdgpu_device *adev); -int amdgpu_vram_mgr_init(struct amdgpu_device *adev); -void amdgpu_vram_mgr_fini(struct amdgpu_device *adev); +int amdgpu_bar_mgr_init(struct amdgpu_device *adev, u32 domain); +void amdgpu_bar_mgr_fini(struct amdgpu_device *adev, u32 domain); bool amdgpu_gtt_mgr_has_gart_addr(struct ttm_resource *mem); void amdgpu_gtt_mgr_recover(struct amdgpu_gtt_mgr *mgr); uint64_t amdgpu_preempt_mgr_usage(struct ttm_resource_manager *man); -u64 amdgpu_vram_mgr_bo_visible_size(struct amdgpu_bo *bo); -int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev, - struct ttm_resource *mem, - u64 offset, u64 size, - struct device *dev, - enum dma_data_direction dir, - struct sg_table **sgt); -void amdgpu_vram_mgr_free_sgt(struct device *dev, - enum dma_data_direction dir, - struct sg_table *sgt); -uint64_t amdgpu_vram_mgr_vis_usage(struct amdgpu_vram_mgr *mgr); -int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr, - uint64_t start, uint64_t size); -int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr, - uint64_t start); +u64 amdgpu_bar_mgr_bo_visible_size(struct amdgpu_bo *bo); +int amdgpu_bar_mgr_alloc_sgt(struct amdgpu_device *adev, + struct ttm_resource *mem, + u64 offset, u64 size, + struct device *dev, + enum dma_data_direction dir, + struct sg_table **sgt); +void amdgpu_bar_mgr_free_sgt(struct device *dev, + enum dma_data_direction dir, + struct sg_table *sgt); +uint64_t amdgpu_bar_mgr_vis_usage(struct amdgpu_bar_mgr *mgr); +int amdgpu_bar_mgr_reserve_range(struct amdgpu_bar_mgr *mgr, + uint64_t start, uint64_t size); +int amdgpu_bar_mgr_query_page_status(struct amdgpu_bar_mgr *mgr, + uint64_t start); int amdgpu_ttm_init(struct amdgpu_device *adev); void amdgpu_ttm_fini(struct amdgpu_device *adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c index 2994b9db196f..fc9edc3028b6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c @@ -599,7 +599,7 @@ static int amdgpu_virt_write_vf2pf_data(struct amdgpu_device *adev) vf2pf_info->fb_usage = ttm_resource_manager_usage(&adev->mman.vram_mgr.manager) >> 20; vf2pf_info->fb_vis_usage = - amdgpu_vram_mgr_vis_usage(&adev->mman.vram_mgr) >> 20; + amdgpu_bar_mgr_vis_usage(&adev->mman.vram_mgr) >> 20; vf2pf_info->fb_size = adev->gmc.real_vram_size >> 20; vf2pf_info->fb_vis_size = adev->gmc.visible_vram_size >> 20; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 9fa1d814508a..30d68e3a2469 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -31,46 +31,46 @@ #include "amdgpu_atomfirmware.h" #include "atom.h" -struct amdgpu_vram_reservation { +struct amdgpu_bar_reservation { u64 start; u64 size; struct list_head allocated; struct list_head blocks; }; -static inline struct amdgpu_vram_mgr * -to_vram_mgr(struct ttm_resource_manager *man) +static inline struct amdgpu_bar_mgr * +to_bar_mgr(struct ttm_resource_manager *man) { - return container_of(man, struct amdgpu_vram_mgr, manager); + return container_of(man, struct amdgpu_bar_mgr, manager); } static inline struct amdgpu_device * -to_amdgpu_device(struct amdgpu_vram_mgr *mgr) +to_amdgpu_device(struct amdgpu_bar_mgr *mgr) { return container_of(mgr, struct amdgpu_device, mman.vram_mgr); } static inline struct drm_buddy_block * -amdgpu_vram_mgr_first_block(struct list_head *list) +amdgpu_bar_mgr_first_block(struct list_head *list) { return list_first_entry_or_null(list, struct drm_buddy_block, link); } -static inline bool amdgpu_is_vram_mgr_blocks_contiguous(struct list_head *head) +static inline bool amdgpu_is_bar_mgr_blocks_contiguous(struct list_head *head) { struct drm_buddy_block *block; u64 start, size; - block = amdgpu_vram_mgr_first_block(head); + block = amdgpu_bar_mgr_first_block(head); if (!block) return false; while (head != block->link.next) { - start = amdgpu_vram_mgr_block_start(block); - size = amdgpu_vram_mgr_block_size(block); + start = amdgpu_bar_mgr_block_start(block); + size = amdgpu_bar_mgr_block_size(block); block = list_entry(block->link.next, struct drm_buddy_block, link); - if (start + size != amdgpu_vram_mgr_block_start(block)) + if (start + size != amdgpu_bar_mgr_block_start(block)) return false; } @@ -100,7 +100,7 @@ static ssize_t amdgpu_mem_info_vram_total_show(struct device *dev, * DOC: mem_info_vis_vram_total * * The amdgpu driver provides a sysfs API for reporting current total - * visible VRAM available on the device + * visible BAR available on the device * The file mem_info_vis_vram_total is used for this and returns the total * amount of visible VRAM in bytes */ @@ -148,7 +148,7 @@ static ssize_t amdgpu_mem_info_vis_vram_used_show(struct device *dev, struct amdgpu_device *adev = drm_to_adev(ddev); return sysfs_emit(buf, "%llu\n", - amdgpu_vram_mgr_vis_usage(&adev->mman.vram_mgr)); + amdgpu_bar_mgr_vis_usage(&adev->mman.vram_mgr)); } /** @@ -203,7 +203,7 @@ static DEVICE_ATTR(mem_info_vis_vram_used, S_IRUGO, static DEVICE_ATTR(mem_info_vram_vendor, S_IRUGO, amdgpu_mem_info_vram_vendor, NULL); -static struct attribute *amdgpu_vram_mgr_attributes[] = { +static struct attribute *amdgpu_bar_mgr_attributes[] = { &dev_attr_mem_info_vram_total.attr, &dev_attr_mem_info_vis_vram_total.attr, &dev_attr_mem_info_vram_used.attr, @@ -212,23 +212,23 @@ static struct attribute *amdgpu_vram_mgr_attributes[] = { NULL }; -const struct attribute_group amdgpu_vram_mgr_attr_group = { - .attrs = amdgpu_vram_mgr_attributes +const struct attribute_group amdgpu_bar_mgr_attr_group = { + .attrs = amdgpu_bar_mgr_attributes }; /** - * amdgpu_vram_mgr_vis_size - Calculate visible block size + * amdgpu_bar_mgr_vis_size - Calculate visible block size * * @adev: amdgpu_device pointer * @block: DRM BUDDY block structure * * Calculate how many bytes of the DRM BUDDY block are inside visible VRAM */ -static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev, +static u64 amdgpu_bar_mgr_vis_size(struct amdgpu_device *adev, struct drm_buddy_block *block) { - u64 start = amdgpu_vram_mgr_block_start(block); - u64 end = start + amdgpu_vram_mgr_block_size(block); + u64 start = amdgpu_bar_mgr_block_start(block); + u64 end = start + amdgpu_bar_mgr_block_size(block); if (start >= adev->gmc.visible_vram_size) return 0; @@ -238,18 +238,18 @@ static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev, } /** - * amdgpu_vram_mgr_bo_visible_size - CPU visible BO size + * amdgpu_bar_mgr_bo_visible_size - CPU visible BO size * * @bo: &amdgpu_bo buffer object (must be in VRAM) * * Returns: * How much of the given &amdgpu_bo buffer object lies in CPU visible VRAM. */ -u64 amdgpu_vram_mgr_bo_visible_size(struct amdgpu_bo *bo) +u64 amdgpu_bar_mgr_bo_visible_size(struct amdgpu_bo *bo) { struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); struct ttm_resource *res = bo->tbo.resource; - struct amdgpu_vram_mgr_resource *vres = to_amdgpu_vram_mgr_resource(res); + struct amdgpu_bar_mgr_resource *vres = to_amdgpu_bar_mgr_resource(res); struct drm_buddy_block *block; u64 usage = 0; @@ -260,18 +260,18 @@ u64 amdgpu_vram_mgr_bo_visible_size(struct amdgpu_bo *bo) return 0; list_for_each_entry(block, &vres->blocks, link) - usage += amdgpu_vram_mgr_vis_size(adev, block); + usage += amdgpu_bar_mgr_vis_size(adev, block); return usage; } /* Commit the reservation of VRAM pages */ -static void amdgpu_vram_mgr_do_reserve(struct ttm_resource_manager *man) +static void amdgpu_bar_mgr_do_reserve(struct ttm_resource_manager *man) { - struct amdgpu_vram_mgr *mgr = to_vram_mgr(man); + struct amdgpu_bar_mgr *mgr = to_bar_mgr(man); struct amdgpu_device *adev = to_amdgpu_device(mgr); struct drm_buddy *mm = &mgr->mm; - struct amdgpu_vram_reservation *rsv, *temp; + struct amdgpu_bar_reservation *rsv, *temp; struct drm_buddy_block *block; uint64_t vis_usage; @@ -281,14 +281,14 @@ static void amdgpu_vram_mgr_do_reserve(struct ttm_resource_manager *man) DRM_BUDDY_RANGE_ALLOCATION)) continue; - block = amdgpu_vram_mgr_first_block(&rsv->allocated); + block = amdgpu_bar_mgr_first_block(&rsv->allocated); if (!block) continue; dev_dbg(adev->dev, "Reservation 0x%llx - %lld, Succeeded\n", rsv->start, rsv->size); - vis_usage = amdgpu_vram_mgr_vis_size(adev, block); + vis_usage = amdgpu_bar_mgr_vis_size(adev, block); atomic64_add(vis_usage, &mgr->vis_usage); spin_lock(&man->bdev->lru_lock); man->usage += rsv->size; @@ -298,18 +298,18 @@ static void amdgpu_vram_mgr_do_reserve(struct ttm_resource_manager *man) } /** - * amdgpu_vram_mgr_reserve_range - Reserve a range from VRAM + * amdgpu_bar_mgr_reserve_range - Reserve a range from VRAM * - * @mgr: amdgpu_vram_mgr pointer + * @mgr: amdgpu_bar_mgr pointer * @start: start address of the range in VRAM * @size: size of the range * * Reserve memory from start address with the specified size in VRAM */ -int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr, +int amdgpu_bar_mgr_reserve_range(struct amdgpu_bar_mgr *mgr, uint64_t start, uint64_t size) { - struct amdgpu_vram_reservation *rsv; + struct amdgpu_bar_reservation *rsv; rsv = kzalloc(sizeof(*rsv), GFP_KERNEL); if (!rsv) @@ -323,16 +323,16 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr, mutex_lock(&mgr->lock); list_add_tail(&rsv->blocks, &mgr->reservations_pending); - amdgpu_vram_mgr_do_reserve(&mgr->manager); + amdgpu_bar_mgr_do_reserve(&mgr->manager); mutex_unlock(&mgr->lock); return 0; } /** - * amdgpu_vram_mgr_query_page_status - query the reservation status + * amdgpu_bar_mgr_query_page_status - query the reservation status * - * @mgr: amdgpu_vram_mgr pointer + * @mgr: amdgpu_bar_mgr pointer * @start: start address of a page in VRAM * * Returns: @@ -340,10 +340,10 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr, * 0: the page has been reserved * -ENOENT: the input page is not a reservation */ -int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr, +int amdgpu_bar_mgr_query_page_status(struct amdgpu_bar_mgr *mgr, uint64_t start) { - struct amdgpu_vram_reservation *rsv; + struct amdgpu_bar_reservation *rsv; int ret; mutex_lock(&mgr->lock); @@ -371,7 +371,7 @@ int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr, } /** - * amdgpu_vram_mgr_new - allocate new ranges + * amdgpu_bar_mgr_new - allocate new ranges * * @man: TTM memory type manager * @tbo: TTM BO we need this range for @@ -380,15 +380,15 @@ int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr, * * Allocate VRAM for the given BO. */ -static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, +static int amdgpu_bar_mgr_new(struct ttm_resource_manager *man, struct ttm_buffer_object *tbo, const struct ttm_place *place, struct ttm_resource **res) { u64 vis_usage = 0, max_bytes, cur_size, min_block_size; - struct amdgpu_vram_mgr *mgr = to_vram_mgr(man); + struct amdgpu_bar_mgr *mgr = to_bar_mgr(man); struct amdgpu_device *adev = to_amdgpu_device(mgr); - struct amdgpu_vram_mgr_resource *vres; + struct amdgpu_bar_mgr_resource *vres; u64 size, remaining_size, lpfn, fpfn; struct drm_buddy *mm = &mgr->mm; struct drm_buddy_block *block; @@ -512,7 +512,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, * Compute the original_size value by subtracting the * last block size with (aligned size - original size) */ - original_size = amdgpu_vram_mgr_block_size(block) - (size - cur_size); + original_size = amdgpu_bar_mgr_block_size(block) - (size - cur_size); } mutex_lock(&mgr->lock); @@ -529,8 +529,8 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, list_for_each_entry(block, &vres->blocks, link) { unsigned long start; - start = amdgpu_vram_mgr_block_start(block) + - amdgpu_vram_mgr_block_size(block); + start = amdgpu_bar_mgr_block_start(block) + + amdgpu_bar_mgr_block_size(block); start >>= PAGE_SHIFT; if (start > PFN_UP(vres->base.size)) @@ -539,10 +539,10 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, start = 0; vres->base.start = max(vres->base.start, start); - vis_usage += amdgpu_vram_mgr_vis_size(adev, block); + vis_usage += amdgpu_bar_mgr_vis_size(adev, block); } - if (amdgpu_is_vram_mgr_blocks_contiguous(&vres->blocks)) + if (amdgpu_is_bar_mgr_blocks_contiguous(&vres->blocks)) vres->base.placement |= TTM_PL_FLAG_CONTIGUOUS; if (adev->gmc.xgmi.connected_to_cpu) @@ -565,18 +565,18 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, } /** - * amdgpu_vram_mgr_del - free ranges + * amdgpu_bar_mgr_del - free ranges * * @man: TTM memory type manager * @res: TTM memory object * * Free the allocated VRAM again. */ -static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man, +static void amdgpu_bar_mgr_del(struct ttm_resource_manager *man, struct ttm_resource *res) { - struct amdgpu_vram_mgr_resource *vres = to_amdgpu_vram_mgr_resource(res); - struct amdgpu_vram_mgr *mgr = to_vram_mgr(man); + struct amdgpu_bar_mgr_resource *vres = to_amdgpu_bar_mgr_resource(res); + struct amdgpu_bar_mgr *mgr = to_bar_mgr(man); struct amdgpu_device *adev = to_amdgpu_device(mgr); struct drm_buddy *mm = &mgr->mm; struct drm_buddy_block *block; @@ -584,9 +584,9 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man, mutex_lock(&mgr->lock); list_for_each_entry(block, &vres->blocks, link) - vis_usage += amdgpu_vram_mgr_vis_size(adev, block); + vis_usage += amdgpu_bar_mgr_vis_size(adev, block); - amdgpu_vram_mgr_do_reserve(man); + amdgpu_bar_mgr_do_reserve(man); drm_buddy_free_list(mm, &vres->blocks); mutex_unlock(&mgr->lock); @@ -598,7 +598,7 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man, } /** - * amdgpu_vram_mgr_alloc_sgt - allocate and fill a sg table + * amdgpu_bar_mgr_alloc_sgt - allocate and fill a sg table * * @adev: amdgpu device pointer * @res: TTM memory object @@ -610,7 +610,7 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man, * * Allocate and fill a sg table from a VRAM allocation. */ -int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev, +int amdgpu_bar_mgr_alloc_sgt(struct amdgpu_device *adev, struct ttm_resource *res, u64 offset, u64 length, struct device *dev, @@ -685,7 +685,7 @@ int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev, } /** - * amdgpu_vram_mgr_free_sgt - allocate and fill a sg table + * amdgpu_bar_mgr_free_sgt - allocate and fill a sg table * * @dev: device pointer * @dir: data direction of resource to unmap @@ -693,7 +693,7 @@ int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev, * * Free a previously allocate sg table. */ -void amdgpu_vram_mgr_free_sgt(struct device *dev, +void amdgpu_bar_mgr_free_sgt(struct device *dev, enum dma_data_direction dir, struct sg_table *sgt) { @@ -709,19 +709,19 @@ void amdgpu_vram_mgr_free_sgt(struct device *dev, } /** - * amdgpu_vram_mgr_vis_usage - how many bytes are used in the visible part + * amdgpu_bar_mgr_vis_usage - how many bytes are used in the visible part * - * @mgr: amdgpu_vram_mgr pointer + * @mgr: amdgpu_bar_mgr pointer * * Returns how many bytes are used in the visible part of VRAM */ -uint64_t amdgpu_vram_mgr_vis_usage(struct amdgpu_vram_mgr *mgr) +uint64_t amdgpu_bar_mgr_vis_usage(struct amdgpu_bar_mgr *mgr) { return atomic64_read(&mgr->vis_usage); } /** - * amdgpu_vram_mgr_intersects - test each drm buddy block for intersection + * amdgpu_bar_mgr_intersects - test each drm buddy block for intersection * * @man: TTM memory type manager * @res: The resource to test @@ -730,20 +730,20 @@ uint64_t amdgpu_vram_mgr_vis_usage(struct amdgpu_vram_mgr *mgr) * * Test each drm buddy block for intersection for eviction decision. */ -static bool amdgpu_vram_mgr_intersects(struct ttm_resource_manager *man, +static bool amdgpu_bar_mgr_intersects(struct ttm_resource_manager *man, struct ttm_resource *res, const struct ttm_place *place, size_t size) { - struct amdgpu_vram_mgr_resource *mgr = to_amdgpu_vram_mgr_resource(res); + struct amdgpu_bar_mgr_resource *mgr = to_amdgpu_bar_mgr_resource(res); struct drm_buddy_block *block; /* Check each drm buddy block individually */ list_for_each_entry(block, &mgr->blocks, link) { unsigned long fpfn = - amdgpu_vram_mgr_block_start(block) >> PAGE_SHIFT; + amdgpu_bar_mgr_block_start(block) >> PAGE_SHIFT; unsigned long lpfn = fpfn + - (amdgpu_vram_mgr_block_size(block) >> PAGE_SHIFT); + (amdgpu_bar_mgr_block_size(block) >> PAGE_SHIFT); if (place->fpfn < lpfn && (!place->lpfn || place->lpfn > fpfn)) @@ -754,7 +754,7 @@ static bool amdgpu_vram_mgr_intersects(struct ttm_resource_manager *man, } /** - * amdgpu_vram_mgr_compatible - test each drm buddy block for compatibility + * amdgpu_bar_mgr_compatible - test each drm buddy block for compatibility * * @man: TTM memory type manager * @res: The resource to test @@ -763,20 +763,20 @@ static bool amdgpu_vram_mgr_intersects(struct ttm_resource_manager *man, * * Test each drm buddy block for placement compatibility. */ -static bool amdgpu_vram_mgr_compatible(struct ttm_resource_manager *man, +static bool amdgpu_bar_mgr_compatible(struct ttm_resource_manager *man, struct ttm_resource *res, const struct ttm_place *place, size_t size) { - struct amdgpu_vram_mgr_resource *mgr = to_amdgpu_vram_mgr_resource(res); + struct amdgpu_bar_mgr_resource *mgr = to_amdgpu_bar_mgr_resource(res); struct drm_buddy_block *block; /* Check each drm buddy block individually */ list_for_each_entry(block, &mgr->blocks, link) { unsigned long fpfn = - amdgpu_vram_mgr_block_start(block) >> PAGE_SHIFT; + amdgpu_bar_mgr_block_start(block) >> PAGE_SHIFT; unsigned long lpfn = fpfn + - (amdgpu_vram_mgr_block_size(block) >> PAGE_SHIFT); + (amdgpu_bar_mgr_block_size(block) >> PAGE_SHIFT); if (fpfn < place->fpfn || (place->lpfn && lpfn > place->lpfn)) @@ -787,22 +787,22 @@ static bool amdgpu_vram_mgr_compatible(struct ttm_resource_manager *man, } /** - * amdgpu_vram_mgr_debug - dump VRAM table + * amdgpu_bar_mgr_debug - dump VRAM table * * @man: TTM memory type manager * @printer: DRM printer to use * * Dump the table content using printk. */ -static void amdgpu_vram_mgr_debug(struct ttm_resource_manager *man, +static void amdgpu_bar_mgr_debug(struct ttm_resource_manager *man, struct drm_printer *printer) { - struct amdgpu_vram_mgr *mgr = to_vram_mgr(man); + struct amdgpu_bar_mgr *mgr = to_bar_mgr(man); struct drm_buddy *mm = &mgr->mm; struct drm_buddy_block *block; drm_printf(printer, " vis usage:%llu\n", - amdgpu_vram_mgr_vis_usage(mgr)); + amdgpu_bar_mgr_vis_usage(mgr)); mutex_lock(&mgr->lock); drm_printf(printer, "default_page_size: %lluKiB\n", @@ -816,31 +816,38 @@ static void amdgpu_vram_mgr_debug(struct ttm_resource_manager *man, mutex_unlock(&mgr->lock); } -static const struct ttm_resource_manager_func amdgpu_vram_mgr_func = { - .alloc = amdgpu_vram_mgr_new, - .free = amdgpu_vram_mgr_del, - .intersects = amdgpu_vram_mgr_intersects, - .compatible = amdgpu_vram_mgr_compatible, - .debug = amdgpu_vram_mgr_debug +static const struct ttm_resource_manager_func amdgpu_bar_mgr_func = { + .alloc = amdgpu_bar_mgr_new, + .free = amdgpu_bar_mgr_del, + .intersects = amdgpu_bar_mgr_intersects, + .compatible = amdgpu_bar_mgr_compatible, + .debug = amdgpu_bar_mgr_debug }; /** - * amdgpu_vram_mgr_init - init VRAM manager and DRM MM + * amdgpu_bar_mgr_init - init BAR manager and DRM MM * * @adev: amdgpu_device pointer + * @domain: memory domain to initialize * * Allocate and initialize the VRAM manager. */ -int amdgpu_vram_mgr_init(struct amdgpu_device *adev) +int amdgpu_bar_mgr_init(struct amdgpu_device *adev, u32 domain) { - struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; - struct ttm_resource_manager *man = &mgr->manager; + struct amdgpu_bar_mgr *mgr; + struct ttm_resource_manager *man; int err; + if (domain != TTM_PL_VRAM) + return -EINVAL; + + mgr = &adev->mman.vram_mgr; + man = &mgr->manager; + ttm_resource_manager_init(man, &adev->mman.bdev, adev->gmc.real_vram_size); - man->func = &amdgpu_vram_mgr_func; + man->func = &amdgpu_bar_mgr_func; err = drm_buddy_init(&mgr->mm, man->size, PAGE_SIZE); if (err) @@ -851,25 +858,32 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) INIT_LIST_HEAD(&mgr->reserved_pages); mgr->default_page_size = PAGE_SIZE; - ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, &mgr->manager); + ttm_set_driver_manager(&adev->mman.bdev, domain, &mgr->manager); ttm_resource_manager_set_used(man, true); return 0; } /** - * amdgpu_vram_mgr_fini - free and destroy VRAM manager + * amdgpu_bar_mgr_fini - free and destroy VRAM manager * * @adev: amdgpu_device pointer + * @domain: memory domain to destroy * - * Destroy and free the VRAM manager, returns -EBUSY if ranges are still + * Destroy and free the BAR manager, returns -EBUSY if ranges are still * allocated inside it. */ -void amdgpu_vram_mgr_fini(struct amdgpu_device *adev) +void amdgpu_bar_mgr_fini(struct amdgpu_device *adev, u32 domain) { - struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; - struct ttm_resource_manager *man = &mgr->manager; + struct amdgpu_bar_mgr *mgr; + struct ttm_resource_manager *man; int ret; - struct amdgpu_vram_reservation *rsv, *temp; + struct amdgpu_bar_reservation *rsv, *temp; + + if (domain != TTM_PL_VRAM) + return; + + mgr = &adev->mman.vram_mgr; + man = &mgr->manager; ttm_resource_manager_set_used(man, false); @@ -889,5 +903,5 @@ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev) mutex_unlock(&mgr->lock); ttm_resource_manager_cleanup(man); - ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, NULL); + ttm_set_driver_manager(&adev->mman.bdev, domain, NULL); } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h index 0e04e42cf809..241faba5ae55 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h @@ -21,12 +21,12 @@ * */ -#ifndef __AMDGPU_VRAM_MGR_H__ -#define __AMDGPU_VRAM_MGR_H__ +#ifndef __AMDGPU_BAR_MGR_H__ +#define __AMDGPU_BAR_MGR_H__ #include <drm/drm_buddy.h> -struct amdgpu_vram_mgr { +struct amdgpu_bar_mgr { struct ttm_resource_manager manager; struct drm_buddy mm; /* protects access to buffer objects */ @@ -37,26 +37,26 @@ struct amdgpu_vram_mgr { u64 default_page_size; }; -struct amdgpu_vram_mgr_resource { +struct amdgpu_bar_mgr_resource { struct ttm_resource base; struct list_head blocks; unsigned long flags; }; -static inline u64 amdgpu_vram_mgr_block_start(struct drm_buddy_block *block) +static inline u64 amdgpu_bar_mgr_block_start(struct drm_buddy_block *block) { return drm_buddy_block_offset(block); } -static inline u64 amdgpu_vram_mgr_block_size(struct drm_buddy_block *block) +static inline u64 amdgpu_bar_mgr_block_size(struct drm_buddy_block *block) { return (u64)PAGE_SIZE << drm_buddy_block_order(block); } -static inline struct amdgpu_vram_mgr_resource * -to_amdgpu_vram_mgr_resource(struct ttm_resource *res) +static inline struct amdgpu_bar_mgr_resource * +to_amdgpu_bar_mgr_resource(struct ttm_resource *res) { - return container_of(res, struct amdgpu_vram_mgr_resource, base); + return container_of(res, struct amdgpu_bar_mgr_resource, base); } #endif -- 2.34.1