@@ -997,6 +997,32 @@ r535_gsp_rpc_get_gsp_static_info(struct nvkm_gsp *gsp)
997997 return 0 ;
998998}
999999
1000+ static void
1001+ nvkm_gsp_mem_dtor (struct nvkm_gsp * gsp , struct nvkm_gsp_mem * mem )
1002+ {
1003+ if (mem -> data ) {
1004+ /*
1005+ * Poison the buffer to catch any unexpected access from
1006+ * GSP-RM if the buffer was prematurely freed.
1007+ */
1008+ memset (mem -> data , 0xFF , mem -> size );
1009+
1010+ dma_free_coherent (gsp -> subdev .device -> dev , mem -> size , mem -> data , mem -> addr );
1011+ memset (mem , 0 , sizeof (* mem ));
1012+ }
1013+ }
1014+
1015+ static int
1016+ nvkm_gsp_mem_ctor (struct nvkm_gsp * gsp , size_t size , struct nvkm_gsp_mem * mem )
1017+ {
1018+ mem -> size = size ;
1019+ mem -> data = dma_alloc_coherent (gsp -> subdev .device -> dev , size , & mem -> addr , GFP_KERNEL );
1020+ if (WARN_ON (!mem -> data ))
1021+ return - ENOMEM ;
1022+
1023+ return 0 ;
1024+ }
1025+
10001026static int
10011027r535_gsp_postinit (struct nvkm_gsp * gsp )
10021028{
@@ -1024,6 +1050,13 @@ r535_gsp_postinit(struct nvkm_gsp *gsp)
10241050
10251051 nvkm_inth_allow (& gsp -> subdev .inth );
10261052 nvkm_wr32 (device , 0x110004 , 0x00000040 );
1053+
1054+ /* Release the DMA buffers that were needed only for boot and init */
1055+ nvkm_gsp_mem_dtor (gsp , & gsp -> boot .fw );
1056+ nvkm_gsp_mem_dtor (gsp , & gsp -> libos );
1057+ nvkm_gsp_mem_dtor (gsp , & gsp -> rmargs );
1058+ nvkm_gsp_mem_dtor (gsp , & gsp -> wpr_meta );
1059+
10271060 return ret ;
10281061}
10291062
@@ -1532,27 +1565,6 @@ r535_gsp_msg_run_cpu_sequencer(void *priv, u32 fn, void *repv, u32 repc)
15321565 return 0 ;
15331566}
15341567
1535- static void
1536- nvkm_gsp_mem_dtor (struct nvkm_gsp * gsp , struct nvkm_gsp_mem * mem )
1537- {
1538- if (mem -> data ) {
1539- dma_free_coherent (gsp -> subdev .device -> dev , mem -> size , mem -> data , mem -> addr );
1540- mem -> data = NULL ;
1541- }
1542- }
1543-
1544- static int
1545- nvkm_gsp_mem_ctor (struct nvkm_gsp * gsp , u32 size , struct nvkm_gsp_mem * mem )
1546- {
1547- mem -> size = size ;
1548- mem -> data = dma_alloc_coherent (gsp -> subdev .device -> dev , size , & mem -> addr , GFP_KERNEL );
1549- if (WARN_ON (!mem -> data ))
1550- return - ENOMEM ;
1551-
1552- return 0 ;
1553- }
1554-
1555-
15561568static int
15571569r535_gsp_booter_unload (struct nvkm_gsp * gsp , u32 mbox0 , u32 mbox1 )
15581570{
@@ -1938,20 +1950,20 @@ nvkm_gsp_radix3_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_radix3 *rx3)
19381950 * See kgspCreateRadix3_IMPL
19391951 */
19401952static int
1941- nvkm_gsp_radix3_sg (struct nvkm_device * device , struct sg_table * sgt , u64 size ,
1953+ nvkm_gsp_radix3_sg (struct nvkm_gsp * gsp , struct sg_table * sgt , u64 size ,
19421954 struct nvkm_gsp_radix3 * rx3 )
19431955{
19441956 u64 addr ;
19451957
19461958 for (int i = ARRAY_SIZE (rx3 -> mem ) - 1 ; i >= 0 ; i -- ) {
19471959 u64 * ptes ;
1948- int idx ;
1960+ size_t bufsize ;
1961+ int ret , idx ;
19491962
1950- rx3 -> mem [i ].size = ALIGN ((size / GSP_PAGE_SIZE ) * sizeof (u64 ), GSP_PAGE_SIZE );
1951- rx3 -> mem [i ].data = dma_alloc_coherent (device -> dev , rx3 -> mem [i ].size ,
1952- & rx3 -> mem [i ].addr , GFP_KERNEL );
1953- if (WARN_ON (!rx3 -> mem [i ].data ))
1954- return - ENOMEM ;
1963+ bufsize = ALIGN ((size / GSP_PAGE_SIZE ) * sizeof (u64 ), GSP_PAGE_SIZE );
1964+ ret = nvkm_gsp_mem_ctor (gsp , bufsize , & rx3 -> mem [i ]);
1965+ if (ret )
1966+ return ret ;
19551967
19561968 ptes = rx3 -> mem [i ].data ;
19571969 if (i == 2 ) {
@@ -1991,7 +2003,7 @@ r535_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
19912003 if (ret )
19922004 return ret ;
19932005
1994- ret = nvkm_gsp_radix3_sg (gsp -> subdev . device , & gsp -> sr .sgt , len , & gsp -> sr .radix3 );
2006+ ret = nvkm_gsp_radix3_sg (gsp , & gsp -> sr .sgt , len , & gsp -> sr .radix3 );
19952007 if (ret )
19962008 return ret ;
19972009
@@ -2150,6 +2162,11 @@ r535_gsp_dtor(struct nvkm_gsp *gsp)
21502162 mutex_destroy (& gsp -> cmdq .mutex );
21512163
21522164 r535_gsp_dtor_fws (gsp );
2165+
2166+ nvkm_gsp_mem_dtor (gsp , & gsp -> shm .mem );
2167+ nvkm_gsp_mem_dtor (gsp , & gsp -> loginit );
2168+ nvkm_gsp_mem_dtor (gsp , & gsp -> logintr );
2169+ nvkm_gsp_mem_dtor (gsp , & gsp -> logrm );
21532170}
21542171
21552172int
@@ -2194,7 +2211,7 @@ r535_gsp_oneinit(struct nvkm_gsp *gsp)
21942211 memcpy (gsp -> sig .data , data , size );
21952212
21962213 /* Build radix3 page table for ELF image. */
2197- ret = nvkm_gsp_radix3_sg (device , & gsp -> fw .mem .sgt , gsp -> fw .len , & gsp -> radix3 );
2214+ ret = nvkm_gsp_radix3_sg (gsp , & gsp -> fw .mem .sgt , gsp -> fw .len , & gsp -> radix3 );
21982215 if (ret )
21992216 return ret ;
22002217
0 commit comments