[PATCH] drm/nouveau: retain device pointer in nvkm_gsp_mem object
Danilo Krummrich
dakr at redhat.com
Tue Feb 27 14:23:25 UTC 2024
Hi Timur,
On 2/26/24 22:04, Timur Tabi wrote:
> Store the struct device pointer used to allocate the DMA buffer in
> the nvkm_gsp_mem object. This allows nvkm_gsp_mem_dtor() to release
> the buffer without needing the nvkm_gsp. This is needed so that
> we can retain DMA buffers even after the nvkm_gsp object is deleted.
Considering "[v4][RFC] drm/nouveau: expose GSP-RM logging buffers via
debugfs", I don't see where this one is needed.
Do I miss anything?
- Danilo
>
> Signed-off-by: Timur Tabi <ttabi at nvidia.com>
> ---
> .../gpu/drm/nouveau/include/nvkm/subdev/gsp.h | 1 +
> .../gpu/drm/nouveau/nvkm/subdev/gsp/r535.c | 30 ++++++++++---------
> 2 files changed, 17 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h
> index 3fbc57b16a05..a9be0d86e412 100644
> --- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h
> +++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h
> @@ -9,6 +9,7 @@
> #define GSP_PAGE_SIZE BIT(GSP_PAGE_SHIFT)
>
> struct nvkm_gsp_mem {
> + struct device *dev;
> size_t size;
> void *data;
> dma_addr_t addr;
> diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c
> index 40757a21e150..1eb1bc5df39a 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c
> @@ -1000,7 +1000,7 @@ r535_gsp_rpc_get_gsp_static_info(struct nvkm_gsp *gsp)
> }
>
> static void
> -nvkm_gsp_mem_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_mem *mem)
> +nvkm_gsp_mem_dtor(struct nvkm_gsp_mem *mem)
> {
> if (mem->data) {
> /*
> @@ -1009,7 +1009,7 @@ nvkm_gsp_mem_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_mem *mem)
> */
> memset(mem->data, 0xFF, mem->size);
>
> - dma_free_coherent(gsp->subdev.device->dev, mem->size, mem->data, mem->addr);
> + dma_free_coherent(mem->dev, mem->size, mem->data, mem->addr);
> memset(mem, 0, sizeof(*mem));
> }
> }
> @@ -1017,11 +1017,13 @@ nvkm_gsp_mem_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_mem *mem)
> static int
> nvkm_gsp_mem_ctor(struct nvkm_gsp *gsp, size_t size, struct nvkm_gsp_mem *mem)
> {
> - mem->size = size;
> mem->data = dma_alloc_coherent(gsp->subdev.device->dev, size, &mem->addr, GFP_KERNEL);
> if (WARN_ON(!mem->data))
> return -ENOMEM;
>
> + mem->size = size;
> + mem->dev = gsp->subdev.device->dev;
> +
> return 0;
> }
>
> @@ -1054,10 +1056,10 @@ r535_gsp_postinit(struct nvkm_gsp *gsp)
> nvkm_wr32(device, 0x110004, 0x00000040);
>
> /* Release the DMA buffers that were needed only for boot and init */
> - nvkm_gsp_mem_dtor(gsp, &gsp->boot.fw);
> - nvkm_gsp_mem_dtor(gsp, &gsp->libos);
> - nvkm_gsp_mem_dtor(gsp, &gsp->rmargs);
> - nvkm_gsp_mem_dtor(gsp, &gsp->wpr_meta);
> + nvkm_gsp_mem_dtor(&gsp->boot.fw);
> + nvkm_gsp_mem_dtor(&gsp->libos);
> + nvkm_gsp_mem_dtor(&gsp->rmargs);
> + nvkm_gsp_mem_dtor(&gsp->wpr_meta);
>
> return ret;
> }
> @@ -2249,7 +2251,7 @@ static void
> nvkm_gsp_radix3_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_radix3 *rx3)
> {
> for (int i = ARRAY_SIZE(rx3->mem) - 1; i >= 0; i--)
> - nvkm_gsp_mem_dtor(gsp, &rx3->mem[i]);
> + nvkm_gsp_mem_dtor(&rx3->mem[i]);
> }
>
> /**
> @@ -2407,7 +2409,7 @@ r535_gsp_init(struct nvkm_gsp *gsp)
>
> done:
> if (gsp->sr.meta.data) {
> - nvkm_gsp_mem_dtor(gsp, &gsp->sr.meta);
> + nvkm_gsp_mem_dtor(&gsp->sr.meta);
> nvkm_gsp_radix3_dtor(gsp, &gsp->sr.radix3);
> nvkm_gsp_sg_free(gsp->subdev.device, &gsp->sr.sgt);
> return ret;
> @@ -2488,7 +2490,7 @@ r535_gsp_dtor(struct nvkm_gsp *gsp)
> mutex_destroy(&gsp->client_id.mutex);
>
> nvkm_gsp_radix3_dtor(gsp, &gsp->radix3);
> - nvkm_gsp_mem_dtor(gsp, &gsp->sig);
> + nvkm_gsp_mem_dtor(&gsp->sig);
> nvkm_firmware_dtor(&gsp->fw);
>
> nvkm_falcon_fw_dtor(&gsp->booter.unload);
> @@ -2499,10 +2501,10 @@ r535_gsp_dtor(struct nvkm_gsp *gsp)
>
> r535_gsp_dtor_fws(gsp);
>
> - nvkm_gsp_mem_dtor(gsp, &gsp->shm.mem);
> - nvkm_gsp_mem_dtor(gsp, &gsp->loginit);
> - nvkm_gsp_mem_dtor(gsp, &gsp->logintr);
> - nvkm_gsp_mem_dtor(gsp, &gsp->logrm);
> + nvkm_gsp_mem_dtor(&gsp->shm.mem);
> + nvkm_gsp_mem_dtor(&gsp->loginit);
> + nvkm_gsp_mem_dtor(&gsp->logintr);
> + nvkm_gsp_mem_dtor(&gsp->logrm);
> }
>
> int
More information about the Nouveau
mailing list