Skip to content

Commit 7c995e2

Browse files
ttabiDanilo Krummrich
authored andcommitted
drm/nouveau: retain device pointer in nvkm_gsp_mem object
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. Signed-off-by: Timur Tabi <[email protected]> Signed-off-by: Danilo Krummrich <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 97118a1 commit 7c995e2

File tree

2 files changed

+34
-17
lines changed
  • drivers/gpu/drm/nouveau

2 files changed

+34
-17
lines changed

drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#define GSP_PAGE_SIZE BIT(GSP_PAGE_SHIFT)
1010

1111
struct nvkm_gsp_mem {
12+
struct device *dev;
1213
size_t size;
1314
void *data;
1415
dma_addr_t addr;

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,7 +1000,7 @@ r535_gsp_rpc_get_gsp_static_info(struct nvkm_gsp *gsp)
10001000
}
10011001

10021002
static void
1003-
nvkm_gsp_mem_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_mem *mem)
1003+
nvkm_gsp_mem_dtor(struct nvkm_gsp_mem *mem)
10041004
{
10051005
if (mem->data) {
10061006
/*
@@ -1009,19 +1009,35 @@ nvkm_gsp_mem_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_mem *mem)
10091009
*/
10101010
memset(mem->data, 0xFF, mem->size);
10111011

1012-
dma_free_coherent(gsp->subdev.device->dev, mem->size, mem->data, mem->addr);
1012+
dma_free_coherent(mem->dev, mem->size, mem->data, mem->addr);
1013+
put_device(mem->dev);
1014+
10131015
memset(mem, 0, sizeof(*mem));
10141016
}
10151017
}
10161018

1019+
/**
1020+
* nvkm_gsp_mem_ctor - constructor for nvkm_gsp_mem objects
1021+
* @gsp: gsp pointer
1022+
* @size: number of bytes to allocate
1023+
* @mem: nvkm_gsp_mem object to initialize
1024+
*
1025+
* Allocates a block of memory for use with GSP.
1026+
*
1027+
* This memory block can potentially out-live the driver's remove() callback,
1028+
* so we take a device reference to ensure its lifetime. The reference is
1029+
* dropped in the destructor.
1030+
*/
10171031
static int
10181032
nvkm_gsp_mem_ctor(struct nvkm_gsp *gsp, size_t size, struct nvkm_gsp_mem *mem)
10191033
{
1020-
mem->size = size;
10211034
mem->data = dma_alloc_coherent(gsp->subdev.device->dev, size, &mem->addr, GFP_KERNEL);
10221035
if (WARN_ON(!mem->data))
10231036
return -ENOMEM;
10241037

1038+
mem->size = size;
1039+
mem->dev = get_device(gsp->subdev.device->dev);
1040+
10251041
return 0;
10261042
}
10271043

@@ -1054,8 +1070,8 @@ r535_gsp_postinit(struct nvkm_gsp *gsp)
10541070
nvkm_wr32(device, 0x110004, 0x00000040);
10551071

10561072
/* Release the DMA buffers that were needed only for boot and init */
1057-
nvkm_gsp_mem_dtor(gsp, &gsp->boot.fw);
1058-
nvkm_gsp_mem_dtor(gsp, &gsp->libos);
1073+
nvkm_gsp_mem_dtor(&gsp->boot.fw);
1074+
nvkm_gsp_mem_dtor(&gsp->libos);
10591075

10601076
return ret;
10611077
}
@@ -2234,8 +2250,8 @@ static void
22342250
nvkm_gsp_radix3_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_radix3 *rx3)
22352251
{
22362252
nvkm_gsp_sg_free(gsp->subdev.device, &rx3->lvl2);
2237-
nvkm_gsp_mem_dtor(gsp, &rx3->lvl1);
2238-
nvkm_gsp_mem_dtor(gsp, &rx3->lvl0);
2253+
nvkm_gsp_mem_dtor(&rx3->lvl1);
2254+
nvkm_gsp_mem_dtor(&rx3->lvl0);
22392255
}
22402256

22412257
/**
@@ -2323,9 +2339,9 @@ nvkm_gsp_radix3_sg(struct nvkm_gsp *gsp, struct sg_table *sgt, u64 size,
23232339

23242340
if (ret) {
23252341
lvl2_fail:
2326-
nvkm_gsp_mem_dtor(gsp, &rx3->lvl1);
2342+
nvkm_gsp_mem_dtor(&rx3->lvl1);
23272343
lvl1_fail:
2328-
nvkm_gsp_mem_dtor(gsp, &rx3->lvl0);
2344+
nvkm_gsp_mem_dtor(&rx3->lvl0);
23292345
}
23302346

23312347
return ret;
@@ -2417,7 +2433,7 @@ r535_gsp_init(struct nvkm_gsp *gsp)
24172433

24182434
done:
24192435
if (gsp->sr.meta.data) {
2420-
nvkm_gsp_mem_dtor(gsp, &gsp->sr.meta);
2436+
nvkm_gsp_mem_dtor(&gsp->sr.meta);
24212437
nvkm_gsp_radix3_dtor(gsp, &gsp->sr.radix3);
24222438
nvkm_gsp_sg_free(gsp->subdev.device, &gsp->sr.sgt);
24232439
return ret;
@@ -2498,7 +2514,7 @@ r535_gsp_dtor(struct nvkm_gsp *gsp)
24982514
mutex_destroy(&gsp->client_id.mutex);
24992515

25002516
nvkm_gsp_radix3_dtor(gsp, &gsp->radix3);
2501-
nvkm_gsp_mem_dtor(gsp, &gsp->sig);
2517+
nvkm_gsp_mem_dtor(&gsp->sig);
25022518
nvkm_firmware_dtor(&gsp->fw);
25032519

25042520
nvkm_falcon_fw_dtor(&gsp->booter.unload);
@@ -2509,12 +2525,12 @@ r535_gsp_dtor(struct nvkm_gsp *gsp)
25092525

25102526
r535_gsp_dtor_fws(gsp);
25112527

2512-
nvkm_gsp_mem_dtor(gsp, &gsp->rmargs);
2513-
nvkm_gsp_mem_dtor(gsp, &gsp->wpr_meta);
2514-
nvkm_gsp_mem_dtor(gsp, &gsp->shm.mem);
2515-
nvkm_gsp_mem_dtor(gsp, &gsp->loginit);
2516-
nvkm_gsp_mem_dtor(gsp, &gsp->logintr);
2517-
nvkm_gsp_mem_dtor(gsp, &gsp->logrm);
2528+
nvkm_gsp_mem_dtor(&gsp->rmargs);
2529+
nvkm_gsp_mem_dtor(&gsp->wpr_meta);
2530+
nvkm_gsp_mem_dtor(&gsp->shm.mem);
2531+
nvkm_gsp_mem_dtor(&gsp->loginit);
2532+
nvkm_gsp_mem_dtor(&gsp->logintr);
2533+
nvkm_gsp_mem_dtor(&gsp->logrm);
25182534
}
25192535

25202536
int

0 commit comments

Comments
 (0)