nvk/nvkmd: Add a mechanism to track and look up nvkmd_mems
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31394>
This commit is contained in:
committed by
Marge Bot
parent
f63ec91b52
commit
7b6b2f9501
@@ -26,6 +26,9 @@ nvkmd_nouveau_create_dev(struct nvkmd_pdev *_pdev,
|
||||
dev->base.va_start = 0;
|
||||
dev->base.va_end = NOUVEAU_WS_DEVICE_KERNEL_RESERVATION_START;
|
||||
|
||||
list_inithead(&dev->base.mems);
|
||||
simple_mtx_init(&dev->base.mems_mutex, mtx_plain);
|
||||
|
||||
drmDevicePtr drm_device = NULL;
|
||||
int ret = drmGetDeviceFromDevId(pdev->base.drm.render_dev, 0, &drm_device);
|
||||
if (ret != 0) {
|
||||
|
||||
@@ -8,6 +8,60 @@
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
void
|
||||
nvkmd_dev_track_mem(struct nvkmd_dev *dev,
|
||||
struct nvkmd_mem *mem)
|
||||
{
|
||||
if (mem->link.next == NULL) {
|
||||
simple_mtx_lock(&dev->mems_mutex);
|
||||
list_addtail(&mem->link, &dev->mems);
|
||||
simple_mtx_unlock(&dev->mems_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nvkmd_dev_untrack_mem(struct nvkmd_dev *dev,
|
||||
struct nvkmd_mem *mem)
|
||||
{
|
||||
if (mem->link.next != NULL) {
|
||||
simple_mtx_lock(&dev->mems_mutex);
|
||||
list_del(&mem->link);
|
||||
simple_mtx_unlock(&dev->mems_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
static struct nvkmd_mem *
|
||||
nvkmd_dev_lookup_mem_by_va_locked(struct nvkmd_dev *dev,
|
||||
uint64_t addr,
|
||||
uint64_t *offset_out)
|
||||
{
|
||||
list_for_each_entry(struct nvkmd_mem, mem, &dev->mems, link) {
|
||||
if (mem->va == NULL || addr < mem->va->addr)
|
||||
continue;
|
||||
|
||||
const uint64_t offset = addr - mem->va->addr;
|
||||
if (offset < mem->va->size_B) {
|
||||
if (offset_out != NULL)
|
||||
*offset_out = offset;
|
||||
return nvkmd_mem_ref(mem);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct nvkmd_mem *
|
||||
nvkmd_dev_lookup_mem_by_va(struct nvkmd_dev *dev,
|
||||
uint64_t addr,
|
||||
uint64_t *offset_out)
|
||||
{
|
||||
simple_mtx_lock(&dev->mems_mutex);
|
||||
struct nvkmd_mem *mem =
|
||||
nvkmd_dev_lookup_mem_by_va_locked(dev, addr, offset_out);
|
||||
simple_mtx_unlock(&dev->mems_mutex);
|
||||
return mem;
|
||||
}
|
||||
|
||||
void
|
||||
nvkmd_mem_init(struct nvkmd_dev *dev,
|
||||
struct nvkmd_mem *mem,
|
||||
@@ -215,6 +269,8 @@ nvkmd_mem_unref(struct nvkmd_mem *mem)
|
||||
if (mem->map != NULL)
|
||||
mem->ops->unmap(mem, 0, mem->map);
|
||||
|
||||
nvkmd_dev_untrack_mem(mem->dev, mem);
|
||||
|
||||
mem->ops->free(mem);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#define NVKMD_H 1
|
||||
|
||||
#include "nv_device_info.h"
|
||||
#include "util/list.h"
|
||||
#include "util/simple_mtx.h"
|
||||
#include "util/u_atomic.h"
|
||||
|
||||
@@ -194,6 +195,9 @@ struct nvkmd_dev {
|
||||
* allocated within this range.
|
||||
*/
|
||||
uint64_t va_start, va_end;
|
||||
|
||||
struct list_head mems;
|
||||
simple_mtx_t mems_mutex;
|
||||
};
|
||||
|
||||
struct nvkmd_mem_ops {
|
||||
@@ -226,6 +230,9 @@ struct nvkmd_mem {
|
||||
const struct nvkmd_mem_ops *ops;
|
||||
struct nvkmd_dev *dev;
|
||||
|
||||
/* Optional link in nvkmd_dev::mems */
|
||||
struct list_head link;
|
||||
|
||||
uint32_t refcnt;
|
||||
|
||||
enum nvkmd_mem_flags flags;
|
||||
@@ -440,6 +447,15 @@ nvkmd_dev_alloc_mapped_mem(struct nvkmd_dev *dev,
|
||||
enum nvkmd_mem_map_flags map_flags,
|
||||
struct nvkmd_mem **mem_out);
|
||||
|
||||
void
|
||||
nvkmd_dev_track_mem(struct nvkmd_dev *dev,
|
||||
struct nvkmd_mem *mem);
|
||||
|
||||
struct nvkmd_mem *
|
||||
nvkmd_dev_lookup_mem_by_va(struct nvkmd_dev *dev,
|
||||
uint64_t addr,
|
||||
uint64_t *offset_out);
|
||||
|
||||
static inline VkResult MUST_CHECK
|
||||
nvkmd_dev_import_dma_buf(struct nvkmd_dev *dev,
|
||||
struct vk_object_base *log_obj,
|
||||
|
||||
Reference in New Issue
Block a user