From: Shashank Sharma <shashank.sharma@amd.com>
To: <amd-gfx@lists.freedesktop.org>
Cc: alexander.deucher@amd.com, christian.koenig@amd.com,
shashank.sharma@amd.com
Subject: [PATCH 05/13] drm/amdgpu: add doorbell support to amdgpu_bar_mgr
Date: Fri, 3 Feb 2023 20:08:22 +0100 [thread overview]
Message-ID: <20230203190836.1987-6-shashank.sharma@amd.com> (raw)
In-Reply-To: <20230203190836.1987-1-shashank.sharma@amd.com>
From: Alex Deucher <alexander.deucher@amd.com>
Adjust the code to handle doorbell BARs as well as VRAM.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Shashank Sharma <shashank.sharma@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_bar_mgr.c | 101 ++++++++++++++++----
drivers/gpu/drm/amd/amdgpu/amdgpu_bar_mgr.h | 1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 2 +
3 files changed, 85 insertions(+), 19 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bar_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bar_mgr.c
index 30d68e3a2469..0e0f212bd71c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bar_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bar_mgr.c
@@ -47,7 +47,10 @@ to_bar_mgr(struct ttm_resource_manager *man)
static inline struct amdgpu_device *
to_amdgpu_device(struct amdgpu_bar_mgr *mgr)
{
- return container_of(mgr, struct amdgpu_device, mman.vram_mgr);
+ if (mgr->domain == TTM_PL_VRAM)
+ return container_of(mgr, struct amdgpu_device, mman.vram_mgr);
+ else
+ return container_of(mgr, struct amdgpu_device, mman.doorbell_mgr);
}
static inline struct drm_buddy_block *
@@ -100,7 +103,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 BAR available on the device
+ * visible VRAM 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
*/
@@ -192,16 +195,56 @@ static ssize_t amdgpu_mem_info_vram_vendor(struct device *dev,
}
}
+/**
+ * DOC: mem_info_doorbell_total
+ *
+ * The amdgpu driver provides a sysfs API for reporting current total DOORBELL
+ * available on the device
+ * The file mem_info_vram_total is used for this and returns the total
+ * amount of DOORBELL in bytes
+ */
+static ssize_t amdgpu_mem_info_doorbell_total_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct drm_device *ddev = dev_get_drvdata(dev);
+ struct amdgpu_device *adev = drm_to_adev(ddev);
+
+ return sysfs_emit(buf, "%llu\n", adev->doorbell.size);
+}
+
+/**
+ * DOC: mem_info_doorbell_used
+ *
+ * The amdgpu driver provides a sysfs API for reporting current total DOORBELL
+ * available on the device
+ * The file mem_info_vram_used is used for this and returns the total
+ * amount of currently used DOORBELL in bytes
+ */
+static ssize_t amdgpu_mem_info_doorbell_used_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct drm_device *ddev = dev_get_drvdata(dev);
+ struct amdgpu_device *adev = drm_to_adev(ddev);
+ struct ttm_resource_manager *man = &adev->mman.doorbell_mgr.manager;
+
+ return sysfs_emit(buf, "%llu\n", ttm_resource_manager_usage(man));
+}
+
static DEVICE_ATTR(mem_info_vram_total, S_IRUGO,
amdgpu_mem_info_vram_total_show, NULL);
static DEVICE_ATTR(mem_info_vis_vram_total, S_IRUGO,
- amdgpu_mem_info_vis_vram_total_show,NULL);
+ amdgpu_mem_info_vis_vram_total_show, NULL);
static DEVICE_ATTR(mem_info_vram_used, S_IRUGO,
amdgpu_mem_info_vram_used_show, NULL);
static DEVICE_ATTR(mem_info_vis_vram_used, S_IRUGO,
amdgpu_mem_info_vis_vram_used_show, NULL);
static DEVICE_ATTR(mem_info_vram_vendor, S_IRUGO,
amdgpu_mem_info_vram_vendor, NULL);
+static DEVICE_ATTR(mem_info_doorbell_total, S_IRUGO,
+ amdgpu_mem_info_doorbell_total_show, NULL);
+static DEVICE_ATTR(mem_info_doorbell_used, S_IRUGO,
+ amdgpu_mem_info_doorbell_used_show, NULL);
static struct attribute *amdgpu_bar_mgr_attributes[] = {
&dev_attr_mem_info_vram_total.attr,
@@ -209,6 +252,8 @@ static struct attribute *amdgpu_bar_mgr_attributes[] = {
&dev_attr_mem_info_vram_used.attr,
&dev_attr_mem_info_vis_vram_used.attr,
&dev_attr_mem_info_vram_vendor.attr,
+ &dev_attr_mem_info_doorbell_total.attr,
+ &dev_attr_mem_info_doorbell_used.attr,
NULL
};
@@ -265,7 +310,7 @@ u64 amdgpu_bar_mgr_bo_visible_size(struct amdgpu_bo *bo)
return usage;
}
-/* Commit the reservation of VRAM pages */
+/* Commit the reservation of BAR pages */
static void amdgpu_bar_mgr_do_reserve(struct ttm_resource_manager *man)
{
struct amdgpu_bar_mgr *mgr = to_bar_mgr(man);
@@ -288,8 +333,10 @@ static void amdgpu_bar_mgr_do_reserve(struct ttm_resource_manager *man)
dev_dbg(adev->dev, "Reservation 0x%llx - %lld, Succeeded\n",
rsv->start, rsv->size);
- vis_usage = amdgpu_bar_mgr_vis_size(adev, block);
- atomic64_add(vis_usage, &mgr->vis_usage);
+ if (mgr->domain == TTM_PL_VRAM) {
+ 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;
spin_unlock(&man->bdev->lru_lock);
@@ -539,7 +586,8 @@ static int amdgpu_bar_mgr_new(struct ttm_resource_manager *man,
start = 0;
vres->base.start = max(vres->base.start, start);
- vis_usage += amdgpu_bar_mgr_vis_size(adev, block);
+ if (mgr->domain == TTM_PL_VRAM)
+ vis_usage += amdgpu_bar_mgr_vis_size(adev, block);
}
if (amdgpu_is_bar_mgr_blocks_contiguous(&vres->blocks))
@@ -550,7 +598,8 @@ static int amdgpu_bar_mgr_new(struct ttm_resource_manager *man,
else
vres->base.bus.caching = ttm_write_combined;
- atomic64_add(vis_usage, &mgr->vis_usage);
+ if (mgr->domain == TTM_PL_VRAM)
+ atomic64_add(vis_usage, &mgr->vis_usage);
*res = &vres->base;
return 0;
@@ -583,15 +632,18 @@ static void amdgpu_bar_mgr_del(struct ttm_resource_manager *man,
uint64_t vis_usage = 0;
mutex_lock(&mgr->lock);
- list_for_each_entry(block, &vres->blocks, link)
- vis_usage += amdgpu_bar_mgr_vis_size(adev, block);
+ if (mgr->domain == TTM_PL_VRAM) {
+ list_for_each_entry(block, &vres->blocks, link)
+ vis_usage += amdgpu_bar_mgr_vis_size(adev, block);
+ }
amdgpu_bar_mgr_do_reserve(man);
drm_buddy_free_list(mm, &vres->blocks);
mutex_unlock(&mgr->lock);
- atomic64_sub(vis_usage, &mgr->vis_usage);
+ if (mgr->domain == TTM_PL_VRAM)
+ atomic64_sub(vis_usage, &mgr->vis_usage);
ttm_resource_fini(man, res);
kfree(vres);
@@ -801,8 +853,9 @@ static void amdgpu_bar_mgr_debug(struct ttm_resource_manager *man,
struct drm_buddy *mm = &mgr->mm;
struct drm_buddy_block *block;
- drm_printf(printer, " vis usage:%llu\n",
- amdgpu_bar_mgr_vis_usage(mgr));
+ if (mgr->domain == TTM_PL_VRAM)
+ drm_printf(printer, " vis usage:%llu\n",
+ amdgpu_bar_mgr_vis_usage(mgr));
mutex_lock(&mgr->lock);
drm_printf(printer, "default_page_size: %lluKiB\n",
@@ -837,15 +890,22 @@ int amdgpu_bar_mgr_init(struct amdgpu_device *adev, u32 domain)
struct amdgpu_bar_mgr *mgr;
struct ttm_resource_manager *man;
int err;
+ u64 size;
- if (domain != TTM_PL_VRAM)
+ if (domain == TTM_PL_VRAM) {
+ mgr = &adev->mman.vram_mgr;
+ size = adev->gmc.real_vram_size;
+ } else if (domain == AMDGPU_PL_DOORBELL) {
+ mgr = &adev->mman.doorbell_mgr;
+ size = adev->doorbell.size;
+ } else {
return -EINVAL;
+ }
- mgr = &adev->mman.vram_mgr;
+ mgr->domain = domain;
man = &mgr->manager;
- ttm_resource_manager_init(man, &adev->mman.bdev,
- adev->gmc.real_vram_size);
+ ttm_resource_manager_init(man, &adev->mman.bdev, size);
man->func = &amdgpu_bar_mgr_func;
@@ -879,10 +939,13 @@ void amdgpu_bar_mgr_fini(struct amdgpu_device *adev, u32 domain)
int ret;
struct amdgpu_bar_reservation *rsv, *temp;
- if (domain != TTM_PL_VRAM)
+ if (domain == TTM_PL_VRAM)
+ mgr = &adev->mman.vram_mgr;
+ else if (domain == AMDGPU_PL_DOORBELL)
+ mgr = &adev->mman.doorbell_mgr;
+ else
return;
- mgr = &adev->mman.vram_mgr;
man = &mgr->manager;
ttm_resource_manager_set_used(man, false);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bar_mgr.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_bar_mgr.h
index 241faba5ae55..f989a6b918d9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bar_mgr.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bar_mgr.h
@@ -35,6 +35,7 @@ struct amdgpu_bar_mgr {
struct list_head reserved_pages;
atomic64_t vis_usage;
u64 default_page_size;
+ u32 domain;
};
struct amdgpu_bar_mgr_resource {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
index 020ebba5a51a..ea53aae3ee0b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
@@ -33,6 +33,7 @@
#define AMDGPU_PL_GWS (TTM_PL_PRIV + 1)
#define AMDGPU_PL_OA (TTM_PL_PRIV + 2)
#define AMDGPU_PL_PREEMPT (TTM_PL_PRIV + 3)
+#define AMDGPU_PL_DOORBELL (TTM_PL_PRIV + 4)
#define AMDGPU_GTT_MAX_TRANSFER_SIZE 512
#define AMDGPU_GTT_NUM_TRANSFER_WINDOWS 2
@@ -64,6 +65,7 @@ struct amdgpu_mman {
struct amdgpu_bar_mgr vram_mgr;
struct amdgpu_gtt_mgr gtt_mgr;
struct ttm_resource_manager preempt_mgr;
+ struct amdgpu_bar_mgr doorbell_mgr;
uint64_t stolen_vga_size;
struct amdgpu_bo *stolen_vga_memory;
--
2.34.1
next prev parent reply other threads:[~2023-02-03 19:09 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-03 19:08 [PATCH 00/13] Re-design doorbell framework for usermode queues Shashank Sharma
2023-02-03 19:08 ` [PATCH 01/13] drm/amdgpu: add UAPI for allocating doorbell memory Shashank Sharma
2023-02-06 11:19 ` Christian König
2023-02-06 15:31 ` Shashank Sharma
2023-02-03 19:08 ` [PATCH 02/13] drm/amdgpu: rename vram_mgr functions to bar_mgr Shashank Sharma
2023-02-06 11:20 ` Christian König
2023-02-06 15:34 ` Shashank Sharma
2023-02-06 16:03 ` Christian König
2023-02-06 16:17 ` Alex Deucher
2023-02-03 19:08 ` [PATCH 03/13] drm/amdgpu: rename amdgpu_vram_mgr.c/h to amdgpu_bar_mgr.c/h Shashank Sharma
2023-02-03 19:08 ` [PATCH 04/13] drm/amdgpu: replace aper_base_kaddr with vram_aper_base_kaddr Shashank Sharma
2023-02-06 11:21 ` Christian König
2023-02-03 19:08 ` Shashank Sharma [this message]
2023-02-03 19:08 ` [PATCH 06/13] drm/amdgpu: rename gmc.aper_base/size Shashank Sharma
2023-02-06 11:22 ` Christian König
2023-02-03 19:08 ` [PATCH 07/13] drm/amdgpu: store doorbell info in gmc structure Shashank Sharma
2023-02-06 11:23 ` Christian König
2023-02-03 19:08 ` [PATCH 08/13] drm/amdgpu: move doorbell ptr into mman structure Shashank Sharma
2023-02-06 11:24 ` Christian König
2023-02-03 19:08 ` [PATCH 09/13] drm/amdgpu: accommodate DOMAIN/PL_DOORBELL Shashank Sharma
2023-02-06 11:30 ` Christian König
2023-02-06 16:30 ` Alex Deucher
2023-02-03 19:08 ` [PATCH 09/14] drm/amdgpu: move doorbell aperture handling into ttm_init Shashank Sharma
2023-02-06 16:20 ` Christian König
2023-02-03 19:08 ` [PATCH 10/14] drm/amdgpu: accommodate DOMAIN/PL_DOORBELL Shashank Sharma
2023-02-03 19:08 ` [PATCH 10/13] drm/amdgpu: doorbell support in get_memory functions Shashank Sharma
2023-02-06 16:30 ` Christian König
2023-02-03 19:08 ` [PATCH 11/14] " Shashank Sharma
2023-02-03 19:08 ` [PATCH 11/13] drm/amdgpu: initialize doorbell memory pool Shashank Sharma
2023-02-03 19:08 ` [PATCH 12/13] drm/amdgpu: add domain info in bo_create_kernel_at Shashank Sharma
2023-02-06 16:51 ` Christian König
2023-02-06 17:01 ` Alex Deucher
2023-02-06 17:03 ` Christian König
2023-02-03 19:08 ` [PATCH 12/14] drm/amdgpu: initialize doorbell memory pool Shashank Sharma
2023-02-06 16:54 ` Christian König
2023-02-03 19:08 ` [PATCH 13/14] drm/amdgpu: add domain info in bo_create_kernel_at Shashank Sharma
2023-02-03 19:08 ` [PATCH 13/13] drm/amdgpu: introduce doorbell bo in kernel Shashank Sharma
2023-02-03 19:08 ` [PATCH 14/14] " Shashank Sharma
2023-02-06 16:57 ` Christian König
2023-02-06 17:19 ` Shashank Sharma
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230203190836.1987-6-shashank.sharma@amd.com \
--to=shashank.sharma@amd.com \
--cc=alexander.deucher@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=christian.koenig@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.