@@ -250,6 +250,46 @@ impl super::Queue::ver {
250
250
return Err ( EINVAL ) ;
251
251
}
252
252
253
+ let mut unks: uapi:: drm_asahi_cmd_render_unknowns = Default :: default ( ) ;
254
+
255
+ let mut ext_ptr = cmdbuf. extensions ;
256
+ while ext_ptr != 0 {
257
+ let ext_type = u32:: from_ne_bytes (
258
+ unsafe { UserSlicePtr :: new ( ext_ptr as usize as * mut _ , 4 ) }
259
+ . read_all ( ) ?
260
+ . try_into ( )
261
+ . or ( Err ( EINVAL ) ) ?,
262
+ ) ;
263
+
264
+ match ext_type {
265
+ uapi:: ASAHI_RENDER_EXT_UNKNOWNS => {
266
+ if !debug_enabled ( debug:: DebugFlags :: AllowUnknownOverrides ) {
267
+ return Err ( EINVAL ) ;
268
+ }
269
+ let mut ext_reader = unsafe {
270
+ UserSlicePtr :: new (
271
+ ext_ptr as usize as * mut _ ,
272
+ core:: mem:: size_of :: < uapi:: drm_asahi_cmd_render_unknowns > ( ) ,
273
+ )
274
+ . reader ( )
275
+ } ;
276
+ unsafe {
277
+ ext_reader. read_raw (
278
+ & mut unks as * mut _ as * mut u8 ,
279
+ core:: mem:: size_of :: < uapi:: drm_asahi_cmd_render_unknowns > ( ) ,
280
+ ) ?;
281
+ }
282
+
283
+ ext_ptr = unks. next ;
284
+ }
285
+ _ => return Err ( EINVAL ) ,
286
+ }
287
+ }
288
+
289
+ if unks. pad != 0 {
290
+ return Err ( EINVAL ) ;
291
+ }
292
+
253
293
let dev = self . dev . data ( ) ;
254
294
let gpu = match dev. gpu . as_any ( ) . downcast_ref :: < gpu:: GpuManager :: ver > ( ) {
255
295
Some ( gpu) => gpu,
@@ -272,7 +312,7 @@ impl super::Queue::ver {
272
312
}
273
313
274
314
#[ ver( G != G14 ) ]
275
- let tiling_control = {
315
+ let mut tiling_control = {
276
316
let render_cfg = gpu. get_cfg ( ) . render ;
277
317
let mut tiling_control = render_cfg. tiling_control ;
278
318
@@ -395,7 +435,7 @@ impl super::Queue::ver {
395
435
GFP_KERNEL ,
396
436
) ?;
397
437
398
- let unk1 = false ;
438
+ let unk1 = unks . flags & uapi :: ASAHI_RENDER_UNK_UNK1 as u64 != 0 ;
399
439
400
440
let mut tile_config: u64 = 0 ;
401
441
if !unk1 {
@@ -418,7 +458,7 @@ impl super::Queue::ver {
418
458
} ;
419
459
420
460
#[ ver( G >= G14X ) ]
421
- let frg_tilecfg = 0x0000000_00036011
461
+ let mut frg_tilecfg = 0x0000000_00036011
422
462
| ( ( ( tile_info. tiles_x - 1 ) as u64 ) << 44 )
423
463
| ( ( ( tile_info. tiles_y - 1 ) as u64 ) << 53 )
424
464
| ( if unk1 { 0 } else { 0x20_00000000 } )
@@ -455,6 +495,85 @@ impl super::Queue::ver {
455
495
#[ ver( V >= V13_0B4 ) ]
456
496
let count_vtx = count_frag + 1 ;
457
497
498
+ // Unknowns handling
499
+
500
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_TILE_CONFIG as u64 != 0 {
501
+ tile_config = unks. tile_config ;
502
+ }
503
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_UTILE_CONFIG as u64 != 0 {
504
+ utile_config = unks. utile_config as u32 ;
505
+ }
506
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_AUX_FB_UNK as u64 == 0 {
507
+ unks. aux_fb_unk = 0x100000 ;
508
+ }
509
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_G14_UNK as u64 == 0 {
510
+ unks. g14_unk = 0x4040404 ;
511
+ }
512
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_FRG_UNK_140 as u64 == 0 {
513
+ unks. frg_unk_140 = 0x8c60 ;
514
+ }
515
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_FRG_UNK_158 as u64 == 0 {
516
+ unks. frg_unk_158 = 0x1c ;
517
+ }
518
+ #[ ver( G >= G14X ) ]
519
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_FRG_TILECFG as u64 != 0 {
520
+ frg_tilecfg = unks. frg_tilecfg ;
521
+ }
522
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_LOAD_BGOBJVALS as u64 == 0 {
523
+ unks. load_bgobjvals = cmdbuf. isp_bgobjvals . into ( ) ;
524
+ #[ ver( G < G14X ) ]
525
+ unks. load_bgobjvals |= 0x400 ;
526
+ }
527
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_FRG_UNK_38 as u64 == 0 {
528
+ unks. frg_unk_38 = 0 ;
529
+ }
530
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_FRG_UNK_3C as u64 == 0 {
531
+ unks. frg_unk_3c = 1 ;
532
+ }
533
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_RELOAD_ZLSCTRL as u64 == 0 {
534
+ unks. reload_zlsctrl = cmdbuf. zls_ctrl ;
535
+ }
536
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_UNK_BUF_10 as u64 == 0 {
537
+ #[ ver( G < G14X ) ]
538
+ unks. unk_buf_10 = 1 ;
539
+ #[ ver( G >= G14X ) ]
540
+ unks. unk_buf_10 = 0 ;
541
+ }
542
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_FRG_UNK_MASK as u64 == 0 {
543
+ unks. frg_unk_mask = 0xffffffff ;
544
+ }
545
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_IOGPU_UNK54 == 0 {
546
+ unks. iogpu_unk54 = 0x3a0012006b0003 ;
547
+ }
548
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_IOGPU_UNK56 == 0 {
549
+ unks. iogpu_unk56 = 1 ;
550
+ }
551
+ #[ ver( G != G14 ) ]
552
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_TILING_CONTROL != 0 {
553
+ tiling_control = unks. tiling_control as u32 ;
554
+ }
555
+ #[ ver( G != G14 ) ]
556
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_TILING_CONTROL_2 == 0 {
557
+ #[ ver( G < G14X ) ]
558
+ unks. tiling_control_2 = 0 ;
559
+ #[ ver( G >= G14X ) ]
560
+ unks. tiling_control_2 = 4 ;
561
+ }
562
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_VTX_UNK_F0 == 0 {
563
+ unks. vtx_unk_f0 = 0x1c ;
564
+ #[ ver( G < G14X ) ]
565
+ unks. vtx_unk_f0 += align ( tile_info. meta1_blocks , 4 ) as u64 ;
566
+ }
567
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_VTX_UNK_F8 == 0 {
568
+ unks. vtx_unk_f8 = 0x8c60 ;
569
+ }
570
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_VTX_UNK_118 == 0 {
571
+ unks. vtx_unk_118 = 0x1c ;
572
+ }
573
+ if unks. flags & uapi:: ASAHI_RENDER_UNK_SET_VTX_UNK_MASK == 0 {
574
+ unks. vtx_unk_mask = 0xffffffff ;
575
+ }
576
+
458
577
mod_dev_dbg ! ( self . dev, "[Submission {}] Create Frag\n " , id) ;
459
578
let frag = GpuObject :: new_init_prealloc (
460
579
kalloc. gpu_ro . alloc_object ( ) ?,
@@ -614,7 +733,7 @@ impl super::Queue::ver {
614
733
width : cmdbuf. fb_width ,
615
734
height : cmdbuf. fb_height ,
616
735
#[ ver( V >= V13_0B4 ) ]
617
- unk3 : U64 ( 0x100000 ) ,
736
+ unk3 : U64 ( unks . aux_fb_unk ) ,
618
737
} ;
619
738
620
739
try_init ! ( fw:: fragment:: raw:: RunFragment :: ver {
@@ -656,7 +775,7 @@ impl super::Queue::ver {
656
775
visibility_result_buffer: U64 ( cmdbuf. visibility_result_buffer) ,
657
776
zls_ctrl: U64 ( cmdbuf. zls_ctrl) ,
658
777
#[ ver( G >= G14 ) ]
659
- unk_58_g14_0: U64 ( 0x4040404 ) ,
778
+ unk_58_g14_0: U64 ( unks . g14_unk ) ,
660
779
#[ ver( G >= G14 ) ]
661
780
unk_58_g14_8: U64 ( 0 ) ,
662
781
depth_buffer_ptr1: U64 ( cmdbuf. depth_buffer_load) ,
@@ -682,10 +801,10 @@ impl super::Queue::ver {
682
801
aux_fb: inner. aux_fb. gpu_pointer( ) ,
683
802
unk_108: Default :: default ( ) ,
684
803
pipeline_base: U64 ( 0x11_00000000 ) ,
685
- unk_140: U64 ( 0x8c60 ) ,
804
+ unk_140: U64 ( unks . frg_unk_140 ) ,
686
805
unk_148: U64 ( 0x0 ) ,
687
806
unk_150: U64 ( 0x0 ) ,
688
- unk_158: U64 ( 0x1c ) ,
807
+ unk_158: U64 ( unks . frg_unk_158 ) ,
689
808
unk_160: U64 ( 0 ) ,
690
809
__pad: Default :: default ( ) ,
691
810
#[ ver( V < V13_0B4 ) ]
@@ -707,10 +826,10 @@ impl super::Queue::ver {
707
826
tib_blocks: cmdbuf. tib_blocks,
708
827
isp_bgobjdepth: cmdbuf. isp_bgobjdepth,
709
828
// TODO: does this flag need to be exposed to userspace?
710
- isp_bgobjvals: cmdbuf . isp_bgobjvals | 0x400 ,
711
- unk_38: 0 ,
712
- unk_3c: 1 ,
713
- unk_40: 0 ,
829
+ isp_bgobjvals: unks . load_bgobjvals as u32 ,
830
+ unk_38: unks . frg_unk_38 as u32 ,
831
+ unk_3c: unks . frg_unk_3c as u32 ,
832
+ unk_40: unks . frg_unk_40 as u32 ,
714
833
__pad: Default :: default ( ) ,
715
834
} ) ,
716
835
#[ ver( G >= G14X ) ]
@@ -747,14 +866,14 @@ impl super::Queue::ver {
747
866
0x15211 ,
748
867
( ( cmdbuf. fb_height as u64 ) << 32 ) | cmdbuf. fb_width as u64 ,
749
868
) ; // aux_fb_info.{width, heigh
750
- r. add( 0x15049 , aux_fb_info . unk3 ) ; // s2.aux_fb_info.unk3
869
+ r. add( 0x15049 , unks . aux_fb_unk ) ; // s2.aux_fb_info.unk3
751
870
r. add( 0x10051 , cmdbuf. tib_blocks. into( ) ) ; // s1.unk_2c
752
871
r. add( 0x15321 , cmdbuf. depth_dimensions. into( ) ) ; // ISP_ZLS_PIXELS
753
872
r. add( 0x15301 , cmdbuf. isp_bgobjdepth. into( ) ) ; // ISP_BGOBJDEPTH
754
- r. add( 0x15309 , cmdbuf . isp_bgobjvals . into ( ) | 0x400 ) ; // ISP_BGOBJVALS
873
+ r. add( 0x15309 , unks . load_bgobjvals ) ; // ISP_BGOBJVALS
755
874
r. add( 0x15311 , cmdbuf. visibility_result_buffer) ; // ISP_OCLQRY_BASE
756
875
r. add( 0x15319 , cmdbuf. zls_ctrl) ; // ISP_ZLSCTL
757
- r. add( 0x15349 , 0x4040404 ) ; // s2.unk_58_g14_0
876
+ r. add( 0x15349 , unks . g14_unk ) ; // s2.unk_58_g14_0
758
877
r. add( 0x15351 , 0 ) ; // s2.unk_58_g14_8
759
878
r. add( 0x15329 , cmdbuf. depth_buffer_load) ; // ISP_ZLOAD_BASE
760
879
r. add( 0x15331 , cmdbuf. depth_buffer_store) ; // ISP_ZSTORE_BASE
@@ -789,7 +908,7 @@ impl super::Queue::ver {
789
908
r. add( 0x16020 , 0 ) ;
790
909
r. add( 0x16461 , inner. aux_fb. gpu_pointer( ) . into( ) ) ;
791
910
r. add( 0x16090 , inner. aux_fb. gpu_pointer( ) . into( ) ) ;
792
- r. add( 0x120a1 , 0x1c ) ;
911
+ r. add( 0x120a1 , unks . frg_unk_158 ) ;
793
912
r. add( 0x160a8 , 0 ) ;
794
913
r. add( 0x16068 , frg_tilecfg) ;
795
914
r. add( 0x160b8 , 0x0 ) ;
@@ -826,9 +945,9 @@ impl super::Queue::ver {
826
945
pipeline_bind: U64 ( cmdbuf. partial_reload_pipeline_bind as u64 ) ,
827
946
address: U64 ( cmdbuf. partial_reload_pipeline as u64 ) ,
828
947
} ,
829
- zls_ctrl: U64 ( cmdbuf . zls_ctrl ) ,
948
+ zls_ctrl: U64 ( unks . reload_zlsctrl ) ,
830
949
#[ ver( G >= G14X ) ]
831
- unk_290: U64 ( 0x4040404 ) ,
950
+ unk_290: U64 ( unks . g14_unk ) ,
832
951
#[ ver( G < G14X ) ]
833
952
unk_290: U64 ( 0x0 ) ,
834
953
depth_buffer_ptr1: U64 ( cmdbuf. depth_buffer_load) ,
@@ -881,7 +1000,7 @@ impl super::Queue::ver {
881
1000
unk_10: 0x0 , // fixed
882
1001
encoder_id: cmdbuf. encoder_id,
883
1002
unk_18: 0x0 , // fixed
884
- unk_mask: 0xffffffff ,
1003
+ unk_mask: unks . frg_unk_mask as u32 ,
885
1004
sampler_array: U64 ( 0 ) ,
886
1005
sampler_count: 0 ,
887
1006
sampler_max: 0 ,
@@ -1152,9 +1271,8 @@ impl super::Queue::ver {
1152
1271
tvb_cluster_tilemaps: inner. scene. cluster_tilemaps_pointer( ) ,
1153
1272
tpc: inner. scene. tpc_pointer( ) ,
1154
1273
tvb_heapmeta: inner. scene. tvb_heapmeta_pointer( ) . or( 0x8000_0000_0000_0000 ) ,
1155
- iogpu_unk_54: 0x6b0003 , // fixed
1156
- iogpu_unk_55: 0x3a0012 , // fixed
1157
- iogpu_unk_56: U64 ( 0x1 ) , // fixed
1274
+ iogpu_unk_54: U64 ( unks. iogpu_unk54) , // fixed
1275
+ iogpu_unk_56: U64 ( unks. iogpu_unk56) , // fixed
1158
1276
#[ ver( G < G14 ) ]
1159
1277
tvb_cluster_meta1: inner
1160
1278
. scene
@@ -1183,7 +1301,7 @@ impl super::Queue::ver {
1183
1301
#[ ver( G < G14 ) ]
1184
1302
tiling_control,
1185
1303
#[ ver( G < G14 ) ]
1186
- unk_ac: 0 , // fixed
1304
+ unk_ac: unks . tiling_control_2 as u32 , // fixed
1187
1305
unk_b0: Default :: default ( ) , // fixed
1188
1306
pipeline_base: U64 ( 0x11_00000000 ) ,
1189
1307
#[ ver( G < G14 ) ]
@@ -1192,10 +1310,10 @@ impl super::Queue::ver {
1192
1310
. meta_4_pointer( )
1193
1311
. map( |x| x. or( 0x3000_0000_0000_0000 ) ) ,
1194
1312
#[ ver( G < G14 ) ]
1195
- unk_f0: U64 ( 0x1c + align ( tile_info . meta1_blocks , 4 ) as u64 ) ,
1196
- unk_f8: U64 ( 0x8c60 ) , // fixed
1313
+ unk_f0: U64 ( unks . vtx_unk_f0 ) ,
1314
+ unk_f8: U64 ( unks . vtx_unk_f8 ) , // fixed
1197
1315
unk_100: Default :: default ( ) , // fixed
1198
- unk_118: 0x1c , // fixed
1316
+ unk_118: unks . vtx_unk_118 as u32 , // fixed
1199
1317
__pad: Default :: default ( ) ,
1200
1318
} ) ,
1201
1319
#[ ver( G < G14X ) ]
@@ -1223,8 +1341,8 @@ impl super::Queue::ver {
1223
1341
. into( ) ;
1224
1342
r. add( 0x1c031 , tvb_heapmeta_ptr) ;
1225
1343
r. add( 0x1c9c0 , tvb_heapmeta_ptr) ;
1226
- r. add( 0x1c051 , 0x3a0012006b0003 ) ; // iogpu_unk_54/55
1227
- r. add( 0x1c061 , 1 ) ; // iogpu_unk_56
1344
+ r. add( 0x1c051 , unks . iogpu_unk54 ) ; // iogpu_unk_54/55
1345
+ r. add( 0x1c061 , unks . iogpu_unk56 ) ; // iogpu_unk_56
1228
1346
r. add( 0x10149 , utile_config. into( ) ) ; // s2.unk_48 utile_config
1229
1347
r. add( 0x10139 , cmdbuf. ppp_multisamplectl) ; // PPP_MULTISAMPLECTL
1230
1348
r. add( 0x10111 , inner. scene. preempt_buf_1_pointer( ) . into( ) ) ;
@@ -1252,7 +1370,7 @@ impl super::Queue::ver {
1252
1370
inner. scene. meta_3_pointer( ) . map_or( 0 , |a| a. into( ) ) ,
1253
1371
) ; // tvb_cluster_meta3
1254
1372
r. add( 0x1c890 , tiling_control. into( ) ) ; // tvb_tiling_control
1255
- r. add( 0x1c918 , 4 ) ;
1373
+ r. add( 0x1c918 , unks . tiling_control_2 ) ;
1256
1374
r. add( 0x1c079 , inner. scene. tvb_heapmeta_pointer( ) . into( ) ) ;
1257
1375
r. add( 0x1c9d8 , inner. scene. tvb_heapmeta_pointer( ) . into( ) ) ;
1258
1376
r. add( 0x1c089 , 0 ) ;
@@ -1261,7 +1379,7 @@ impl super::Queue::ver {
1261
1379
inner. scene. meta_4_pointer( ) . map_or( 0 , |a| a. into( ) ) ;
1262
1380
r. add( 0x16c41 , cl_meta_4_pointer) ; // tvb_cluster_meta4
1263
1381
r. add( 0x1ca40 , cl_meta_4_pointer) ; // tvb_cluster_meta4
1264
- r. add( 0x1c9a8 , 0x1c ) ; // + meta1_blocks? min_free_tvb_pages?
1382
+ r. add( 0x1c9a8 , unks . vtx_unk_f0 ) ; // + meta1_blocks? min_free_tvb_pages?
1265
1383
r. add(
1266
1384
0x1c920 ,
1267
1385
inner. scene. meta_1_pointer( ) . map_or( 0 , |a| a. into( ) ) ,
@@ -1292,7 +1410,7 @@ impl super::Queue::ver {
1292
1410
r. add( 0x1c0a9 , tile_info. params. tpc_stride. into( ) ) ; // TE_TPC
1293
1411
r. add( 0x10171 , tile_info. params. unk_24. into( ) ) ;
1294
1412
r. add( 0x10169 , tile_info. params. unk_28. into( ) ) ; // TA_RENDER_TARGET_MAX
1295
- r. add( 0x12099 , 0x1c ) ;
1413
+ r. add( 0x12099 , unks . vtx_unk_118 ) ;
1296
1414
r. add( 0x1c9e8 , 0 ) ;
1297
1415
/*
1298
1416
r.add(0x10209, 0x100); // Some kind of counter?? Does this matter?
@@ -1335,7 +1453,7 @@ impl super::Queue::ver {
1335
1453
unk_10: 0x0 , // fixed
1336
1454
encoder_id: cmdbuf. encoder_id,
1337
1455
unk_18: 0x0 , // fixed
1338
- unk_mask: 0xffffffff ,
1456
+ unk_mask: unks . vtx_unk_mask as u32 ,
1339
1457
sampler_array: U64 ( 0 ) ,
1340
1458
sampler_count: 0 ,
1341
1459
sampler_max: 0 ,
0 commit comments