@@ -1000,7 +1000,7 @@ r535_gsp_rpc_get_gsp_static_info(struct nvkm_gsp *gsp)
10001000}
10011001
10021002static 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+ */
10171031static int
10181032nvkm_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
22342250nvkm_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 ) {
23252341lvl2_fail :
2326- nvkm_gsp_mem_dtor (gsp , & rx3 -> lvl1 );
2342+ nvkm_gsp_mem_dtor (& rx3 -> lvl1 );
23272343lvl1_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
24182434done :
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
25202536int
0 commit comments