@@ -1000,7 +1000,7 @@ r535_gsp_rpc_get_gsp_static_info(struct nvkm_gsp *gsp)
1000
1000
}
1001
1001
1002
1002
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 )
1004
1004
{
1005
1005
if (mem -> data ) {
1006
1006
/*
@@ -1009,19 +1009,35 @@ nvkm_gsp_mem_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_mem *mem)
1009
1009
*/
1010
1010
memset (mem -> data , 0xFF , mem -> size );
1011
1011
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
+
1013
1015
memset (mem , 0 , sizeof (* mem ));
1014
1016
}
1015
1017
}
1016
1018
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
+ */
1017
1031
static int
1018
1032
nvkm_gsp_mem_ctor (struct nvkm_gsp * gsp , size_t size , struct nvkm_gsp_mem * mem )
1019
1033
{
1020
- mem -> size = size ;
1021
1034
mem -> data = dma_alloc_coherent (gsp -> subdev .device -> dev , size , & mem -> addr , GFP_KERNEL );
1022
1035
if (WARN_ON (!mem -> data ))
1023
1036
return - ENOMEM ;
1024
1037
1038
+ mem -> size = size ;
1039
+ mem -> dev = get_device (gsp -> subdev .device -> dev );
1040
+
1025
1041
return 0 ;
1026
1042
}
1027
1043
@@ -1054,8 +1070,8 @@ r535_gsp_postinit(struct nvkm_gsp *gsp)
1054
1070
nvkm_wr32 (device , 0x110004 , 0x00000040 );
1055
1071
1056
1072
/* 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 );
1059
1075
1060
1076
return ret ;
1061
1077
}
@@ -2234,8 +2250,8 @@ static void
2234
2250
nvkm_gsp_radix3_dtor (struct nvkm_gsp * gsp , struct nvkm_gsp_radix3 * rx3 )
2235
2251
{
2236
2252
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 );
2239
2255
}
2240
2256
2241
2257
/**
@@ -2323,9 +2339,9 @@ nvkm_gsp_radix3_sg(struct nvkm_gsp *gsp, struct sg_table *sgt, u64 size,
2323
2339
2324
2340
if (ret ) {
2325
2341
lvl2_fail :
2326
- nvkm_gsp_mem_dtor (gsp , & rx3 -> lvl1 );
2342
+ nvkm_gsp_mem_dtor (& rx3 -> lvl1 );
2327
2343
lvl1_fail :
2328
- nvkm_gsp_mem_dtor (gsp , & rx3 -> lvl0 );
2344
+ nvkm_gsp_mem_dtor (& rx3 -> lvl0 );
2329
2345
}
2330
2346
2331
2347
return ret ;
@@ -2417,7 +2433,7 @@ r535_gsp_init(struct nvkm_gsp *gsp)
2417
2433
2418
2434
done :
2419
2435
if (gsp -> sr .meta .data ) {
2420
- nvkm_gsp_mem_dtor (gsp , & gsp -> sr .meta );
2436
+ nvkm_gsp_mem_dtor (& gsp -> sr .meta );
2421
2437
nvkm_gsp_radix3_dtor (gsp , & gsp -> sr .radix3 );
2422
2438
nvkm_gsp_sg_free (gsp -> subdev .device , & gsp -> sr .sgt );
2423
2439
return ret ;
@@ -2498,7 +2514,7 @@ r535_gsp_dtor(struct nvkm_gsp *gsp)
2498
2514
mutex_destroy (& gsp -> client_id .mutex );
2499
2515
2500
2516
nvkm_gsp_radix3_dtor (gsp , & gsp -> radix3 );
2501
- nvkm_gsp_mem_dtor (gsp , & gsp -> sig );
2517
+ nvkm_gsp_mem_dtor (& gsp -> sig );
2502
2518
nvkm_firmware_dtor (& gsp -> fw );
2503
2519
2504
2520
nvkm_falcon_fw_dtor (& gsp -> booter .unload );
@@ -2509,12 +2525,12 @@ r535_gsp_dtor(struct nvkm_gsp *gsp)
2509
2525
2510
2526
r535_gsp_dtor_fws (gsp );
2511
2527
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 );
2518
2534
}
2519
2535
2520
2536
int
0 commit comments