46
46
* +---------------------------------------+
47
47
* | padding |
48
48
* +---------------------------------------+ <== 4K aligned
49
+ * | w/a KLVs |
50
+ * +---------------------------------------+
51
+ * | padding |
52
+ * +---------------------------------------+ <== 4K aligned
49
53
* | capture lists |
50
54
* +---------------------------------------+
51
55
* | padding |
@@ -88,6 +92,11 @@ static u32 guc_ads_golden_ctxt_size(struct intel_guc *guc)
88
92
return PAGE_ALIGN (guc -> ads_golden_ctxt_size );
89
93
}
90
94
95
+ static u32 guc_ads_waklv_size (struct intel_guc * guc )
96
+ {
97
+ return PAGE_ALIGN (guc -> ads_waklv_size );
98
+ }
99
+
91
100
static u32 guc_ads_capture_size (struct intel_guc * guc )
92
101
{
93
102
return PAGE_ALIGN (guc -> ads_capture_size );
@@ -113,7 +122,7 @@ static u32 guc_ads_golden_ctxt_offset(struct intel_guc *guc)
113
122
return PAGE_ALIGN (offset );
114
123
}
115
124
116
- static u32 guc_ads_capture_offset (struct intel_guc * guc )
125
+ static u32 guc_ads_waklv_offset (struct intel_guc * guc )
117
126
{
118
127
u32 offset ;
119
128
@@ -123,6 +132,16 @@ static u32 guc_ads_capture_offset(struct intel_guc *guc)
123
132
return PAGE_ALIGN (offset );
124
133
}
125
134
135
+ static u32 guc_ads_capture_offset (struct intel_guc * guc )
136
+ {
137
+ u32 offset ;
138
+
139
+ offset = guc_ads_waklv_offset (guc ) +
140
+ guc_ads_waklv_size (guc );
141
+
142
+ return PAGE_ALIGN (offset );
143
+ }
144
+
126
145
static u32 guc_ads_private_data_offset (struct intel_guc * guc )
127
146
{
128
147
u32 offset ;
@@ -796,6 +815,49 @@ guc_capture_prep_lists(struct intel_guc *guc)
796
815
return PAGE_ALIGN (total_size );
797
816
}
798
817
818
+ static void guc_waklv_init (struct intel_guc * guc )
819
+ {
820
+ struct intel_gt * gt = guc_to_gt (guc );
821
+ u32 offset , addr_ggtt , remain , size ;
822
+
823
+ if (!intel_uc_uses_guc_submission (& gt -> uc ))
824
+ return ;
825
+
826
+ if (GUC_FIRMWARE_VER (guc ) < MAKE_GUC_VER (70 , 10 , 0 ))
827
+ return ;
828
+
829
+ GEM_BUG_ON (iosys_map_is_null (& guc -> ads_map ));
830
+ offset = guc_ads_waklv_offset (guc );
831
+ remain = guc_ads_waklv_size (guc );
832
+
833
+ /*
834
+ * Add workarounds here:
835
+ *
836
+ * if (want_wa_<name>) {
837
+ * size = guc_waklv_<name>(guc, offset, remain);
838
+ * offset += size;
839
+ * remain -= size;
840
+ * }
841
+ */
842
+
843
+ size = guc_ads_waklv_size (guc ) - remain ;
844
+ if (!size )
845
+ return ;
846
+
847
+ offset = guc_ads_waklv_offset (guc );
848
+ addr_ggtt = intel_guc_ggtt_offset (guc , guc -> ads_vma ) + offset ;
849
+
850
+ ads_blob_write (guc , ads .wa_klv_addr_lo , addr_ggtt );
851
+ ads_blob_write (guc , ads .wa_klv_addr_hi , 0 );
852
+ ads_blob_write (guc , ads .wa_klv_size , size );
853
+ }
854
+
855
+ static int guc_prep_waklv (struct intel_guc * guc )
856
+ {
857
+ /* Fudge something chunky for now: */
858
+ return PAGE_SIZE ;
859
+ }
860
+
799
861
static void __guc_ads_init (struct intel_guc * guc )
800
862
{
801
863
struct intel_gt * gt = guc_to_gt (guc );
@@ -843,6 +905,9 @@ static void __guc_ads_init(struct intel_guc *guc)
843
905
/* MMIO save/restore list */
844
906
guc_mmio_reg_state_init (guc );
845
907
908
+ /* Workaround KLV list */
909
+ guc_waklv_init (guc );
910
+
846
911
/* Private Data */
847
912
ads_blob_write (guc , ads .private_data , base +
848
913
guc_ads_private_data_offset (guc ));
@@ -886,6 +951,12 @@ int intel_guc_ads_create(struct intel_guc *guc)
886
951
return ret ;
887
952
guc -> ads_capture_size = ret ;
888
953
954
+ /* And don't forget the workaround KLVs: */
955
+ ret = guc_prep_waklv (guc );
956
+ if (ret < 0 )
957
+ return ret ;
958
+ guc -> ads_waklv_size = ret ;
959
+
889
960
/* Now the total size can be determined: */
890
961
size = guc_ads_blob_size (guc );
891
962
0 commit comments