@@ -36,7 +36,8 @@ use crate::driver::{AsahiDevRef, AsahiDevice};
3636use crate :: fw:: channels:: { ChannelErrorType , PipeType } ;
3737use crate :: fw:: types:: { U32 , U64 } ;
3838use crate :: {
39- alloc, buffer, channel, event, fw, gem, hw, initdata, mem, mmu, queue, regs, workqueue,
39+ alloc, buffer, channel, crashdump, event, fw, gem, hw, initdata, mem, mmu, queue, regs,
40+ workqueue,
4041} ;
4142
4243const DEBUG_CLASS : DebugFlags = DebugFlags :: Gpu ;
@@ -330,11 +331,15 @@ impl rtkit::Operations for GpuManager::ver {
330331 ch. event . poll ( ) ;
331332 }
332333
333- fn crashed ( data : <Self :: Data as ForeignOwnable >:: Borrowed < ' _ > , _crashlog : Option < & [ u8 ] > ) {
334+ fn crashed ( data : <Self :: Data as ForeignOwnable >:: Borrowed < ' _ > , crashlog : Option < & [ u8 ] > ) {
334335 let dev = & data. dev ;
335336
336337 data. crashed . store ( true , Ordering :: Relaxed ) ;
337338
339+ if let Err ( e) = data. generate_crashdump ( crashlog) {
340+ dev_err ! ( dev. as_ref( ) , "Could not dump kernel VM pages: {:?}\n " , e) ;
341+ }
342+
338343 if debug_enabled ( DebugFlags :: OopsOnGpuCrash ) {
339344 panic ! ( "GPU firmware crashed" ) ;
340345 } else {
@@ -1117,6 +1122,23 @@ impl GpuManager::ver {
11171122
11181123 Ok ( ( ) )
11191124 }
1125+
1126+ fn generate_crashdump ( & self , crashlog : Option < & [ u8 ] > ) -> Result {
1127+ // Lock the allocators, to block kernel/FW memory mutations (mostly)
1128+ let kalloc = self . alloc ( ) ;
1129+ let pages = self . uat . dump_kernel_pages ( ) ?;
1130+ core:: mem:: drop ( kalloc) ;
1131+
1132+ let mut crashdump = crashdump:: CrashDumpBuilder :: new ( pages) ?;
1133+ let initdata_addr = self . initdata . gpu_va ( ) . get ( ) ;
1134+ crashdump. add_agx_info ( self . cfg , & self . dyncfg , initdata_addr) ?;
1135+ if let Some ( crashlog) = crashlog {
1136+ crashdump. add_crashlog ( crashlog) ?;
1137+ }
1138+ let crashdump = crashdump. finalize ( ) ;
1139+
1140+ Ok ( ( ) )
1141+ }
11201142}
11211143
11221144#[ versions( AGX ) ]
0 commit comments