13
13
#include <linux/uacce.h>
14
14
#include "hpre.h"
15
15
16
+ #define CAP_FILE_PERMISSION 0444
16
17
#define HPRE_CTRL_CNT_CLR_CE_BIT BIT(0)
17
18
#define HPRE_CTRL_CNT_CLR_CE 0x301000
18
19
#define HPRE_FSM_MAX_CNT 0x301008
@@ -203,7 +204,7 @@ static const struct hisi_qm_cap_info hpre_basic_info[] = {
203
204
{HPRE_RESET_MASK_CAP , 0x3134 , 0 , GENMASK (31 , 0 ), 0x0 , 0x3FFFFE , 0xBFFC3E },
204
205
{HPRE_OOO_SHUTDOWN_MASK_CAP , 0x3134 , 0 , GENMASK (31 , 0 ), 0x0 , 0x22 , 0xBFFC3E },
205
206
{HPRE_CE_MASK_CAP , 0x3138 , 0 , GENMASK (31 , 0 ), 0x0 , 0x1 , 0x1 },
206
- {HPRE_CLUSTER_NUM_CAP , 0x313c , 20 , GENMASK (3 , 0 ), 0x0 , 0x4 , 0x1 },
207
+ {HPRE_CLUSTER_NUM_CAP , 0x313c , 20 , GENMASK (3 , 0 ), 0x0 , 0x4 , 0x1 },
207
208
{HPRE_CORE_TYPE_NUM_CAP , 0x313c , 16 , GENMASK (3 , 0 ), 0x0 , 0x2 , 0x2 },
208
209
{HPRE_CORE_NUM_CAP , 0x313c , 8 , GENMASK (7 , 0 ), 0x0 , 0x8 , 0xA },
209
210
{HPRE_CLUSTER_CORE_NUM_CAP , 0x313c , 0 , GENMASK (7 , 0 ), 0x0 , 0x2 , 0xA },
@@ -222,18 +223,27 @@ static const struct hisi_qm_cap_info hpre_basic_info[] = {
222
223
{HPRE_CORE10_ALG_BITMAP_CAP , 0x3170 , 0 , GENMASK (31 , 0 ), 0x0 , 0x10 , 0x10 }
223
224
};
224
225
225
- enum hpre_pre_store_cap_idx {
226
- HPRE_CLUSTER_NUM_CAP_IDX = 0x0 ,
227
- HPRE_CORE_ENABLE_BITMAP_CAP_IDX ,
228
- HPRE_DRV_ALG_BITMAP_CAP_IDX ,
229
- HPRE_DEV_ALG_BITMAP_CAP_IDX ,
230
- };
231
-
232
- static const u32 hpre_pre_store_caps [] = {
233
- HPRE_CLUSTER_NUM_CAP ,
234
- HPRE_CORE_ENABLE_BITMAP_CAP ,
235
- HPRE_DRV_ALG_BITMAP_CAP ,
236
- HPRE_DEV_ALG_BITMAP_CAP ,
226
+ static const struct hisi_qm_cap_query_info hpre_cap_query_info [] = {
227
+ {QM_RAS_NFE_TYPE , "QM_RAS_NFE_TYPE " , 0x3124 , 0x0 , 0x1C37 , 0x7C37 },
228
+ {QM_RAS_NFE_RESET , "QM_RAS_NFE_RESET " , 0x3128 , 0x0 , 0xC77 , 0x6C77 },
229
+ {QM_RAS_CE_TYPE , "QM_RAS_CE_TYPE " , 0x312C , 0x0 , 0x8 , 0x8 },
230
+ {HPRE_RAS_NFE_TYPE , "HPRE_RAS_NFE_TYPE " , 0x3130 , 0x0 , 0x3FFFFE , 0x1FFFC3E },
231
+ {HPRE_RAS_NFE_RESET , "HPRE_RAS_NFE_RESET " , 0x3134 , 0x0 , 0x3FFFFE , 0xBFFC3E },
232
+ {HPRE_RAS_CE_TYPE , "HPRE_RAS_CE_TYPE " , 0x3138 , 0x0 , 0x1 , 0x1 },
233
+ {HPRE_CORE_INFO , "HPRE_CORE_INFO " , 0x313c , 0x0 , 0x420802 , 0x120A0A },
234
+ {HPRE_CORE_EN , "HPRE_CORE_EN " , 0x3140 , 0x0 , 0xF , 0x3FF },
235
+ {HPRE_DRV_ALG_BITMAP , "HPRE_DRV_ALG_BITMAP " , 0x3144 , 0x0 , 0x03 , 0x27 },
236
+ {HPRE_ALG_BITMAP , "HPRE_ALG_BITMAP " , 0x3148 , 0x0 , 0x03 , 0x7F },
237
+ {HPRE_CORE1_BITMAP_CAP , "HPRE_CORE1_BITMAP_CAP " , 0x314c , 0x0 , 0x7F , 0x7F },
238
+ {HPRE_CORE2_BITMAP_CAP , "HPRE_CORE2_BITMAP_CAP " , 0x3150 , 0x0 , 0x7F , 0x7F },
239
+ {HPRE_CORE3_BITMAP_CAP , "HPRE_CORE3_BITMAP_CAP " , 0x3154 , 0x0 , 0x7F , 0x7F },
240
+ {HPRE_CORE4_BITMAP_CAP , "HPRE_CORE4_BITMAP_CAP " , 0x3158 , 0x0 , 0x7F , 0x7F },
241
+ {HPRE_CORE5_BITMAP_CAP , "HPRE_CORE5_BITMAP_CAP " , 0x315c , 0x0 , 0x7F , 0x7F },
242
+ {HPRE_CORE6_BITMAP_CAP , "HPRE_CORE6_BITMAP_CAP " , 0x3160 , 0x0 , 0x7F , 0x7F },
243
+ {HPRE_CORE7_BITMAP_CAP , "HPRE_CORE7_BITMAP_CAP " , 0x3164 , 0x0 , 0x7F , 0x7F },
244
+ {HPRE_CORE8_BITMAP_CAP , "HPRE_CORE8_BITMAP_CAP " , 0x3168 , 0x0 , 0x7F , 0x7F },
245
+ {HPRE_CORE9_BITMAP_CAP , "HPRE_CORE9_BITMAP_CAP " , 0x316c , 0x0 , 0x10 , 0x10 },
246
+ {HPRE_CORE10_BITMAP_CAP , "HPRE_CORE10_BITMAP_CAP " , 0x3170 , 0x0 , 0x10 , 0x10 },
237
247
};
238
248
239
249
static const struct hpre_hw_error hpre_hw_errors [] = {
@@ -360,7 +370,7 @@ bool hpre_check_alg_support(struct hisi_qm *qm, u32 alg)
360
370
{
361
371
u32 cap_val ;
362
372
363
- cap_val = qm -> cap_tables .dev_cap_table [HPRE_DRV_ALG_BITMAP_CAP_IDX ].cap_val ;
373
+ cap_val = qm -> cap_tables .dev_cap_table [HPRE_DRV_ALG_BITMAP ].cap_val ;
364
374
if (alg & cap_val )
365
375
return true;
366
376
@@ -503,14 +513,17 @@ static int hpre_cfg_by_dsm(struct hisi_qm *qm)
503
513
static int hpre_set_cluster (struct hisi_qm * qm )
504
514
{
505
515
struct device * dev = & qm -> pdev -> dev ;
506
- unsigned long offset ;
507
516
u32 cluster_core_mask ;
517
+ unsigned long offset ;
518
+ u32 hpre_core_info ;
508
519
u8 clusters_num ;
509
520
u32 val = 0 ;
510
521
int ret , i ;
511
522
512
- cluster_core_mask = qm -> cap_tables .dev_cap_table [HPRE_CORE_ENABLE_BITMAP_CAP_IDX ].cap_val ;
513
- clusters_num = qm -> cap_tables .dev_cap_table [HPRE_CLUSTER_NUM_CAP_IDX ].cap_val ;
523
+ cluster_core_mask = qm -> cap_tables .dev_cap_table [HPRE_CORE_EN ].cap_val ;
524
+ hpre_core_info = qm -> cap_tables .dev_cap_table [HPRE_CORE_INFO ].cap_val ;
525
+ clusters_num = (hpre_core_info >> hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].shift ) &
526
+ hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].mask ;
514
527
for (i = 0 ; i < clusters_num ; i ++ ) {
515
528
offset = i * HPRE_CLSTR_ADDR_INTRVL ;
516
529
@@ -595,6 +608,7 @@ static void hpre_enable_clock_gate(struct hisi_qm *qm)
595
608
{
596
609
unsigned long offset ;
597
610
u8 clusters_num , i ;
611
+ u32 hpre_core_info ;
598
612
u32 val ;
599
613
600
614
if (qm -> ver < QM_HW_V3 )
@@ -608,7 +622,9 @@ static void hpre_enable_clock_gate(struct hisi_qm *qm)
608
622
val |= HPRE_PEH_CFG_AUTO_GATE_EN ;
609
623
writel (val , qm -> io_base + HPRE_PEH_CFG_AUTO_GATE );
610
624
611
- clusters_num = qm -> cap_tables .dev_cap_table [HPRE_CLUSTER_NUM_CAP_IDX ].cap_val ;
625
+ hpre_core_info = qm -> cap_tables .dev_cap_table [HPRE_CORE_INFO ].cap_val ;
626
+ clusters_num = (hpre_core_info >> hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].shift ) &
627
+ hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].mask ;
612
628
for (i = 0 ; i < clusters_num ; i ++ ) {
613
629
offset = (unsigned long )i * HPRE_CLSTR_ADDR_INTRVL ;
614
630
val = readl (qm -> io_base + offset + HPRE_CLUSTER_DYN_CTL );
@@ -625,6 +641,7 @@ static void hpre_disable_clock_gate(struct hisi_qm *qm)
625
641
{
626
642
unsigned long offset ;
627
643
u8 clusters_num , i ;
644
+ u32 hpre_core_info ;
628
645
u32 val ;
629
646
630
647
if (qm -> ver < QM_HW_V3 )
@@ -638,7 +655,9 @@ static void hpre_disable_clock_gate(struct hisi_qm *qm)
638
655
val &= ~HPRE_PEH_CFG_AUTO_GATE_EN ;
639
656
writel (val , qm -> io_base + HPRE_PEH_CFG_AUTO_GATE );
640
657
641
- clusters_num = qm -> cap_tables .dev_cap_table [HPRE_CLUSTER_NUM_CAP_IDX ].cap_val ;
658
+ hpre_core_info = qm -> cap_tables .dev_cap_table [HPRE_CORE_INFO ].cap_val ;
659
+ clusters_num = (hpre_core_info >> hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].shift ) &
660
+ hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].mask ;
642
661
for (i = 0 ; i < clusters_num ; i ++ ) {
643
662
offset = (unsigned long )i * HPRE_CLSTR_ADDR_INTRVL ;
644
663
val = readl (qm -> io_base + offset + HPRE_CLUSTER_DYN_CTL );
@@ -711,11 +730,14 @@ static int hpre_set_user_domain_and_cache(struct hisi_qm *qm)
711
730
static void hpre_cnt_regs_clear (struct hisi_qm * qm )
712
731
{
713
732
unsigned long offset ;
733
+ u32 hpre_core_info ;
714
734
u8 clusters_num ;
715
735
int i ;
716
736
717
737
/* clear clusterX/cluster_ctrl */
718
- clusters_num = qm -> cap_tables .dev_cap_table [HPRE_CLUSTER_NUM_CAP_IDX ].cap_val ;
738
+ hpre_core_info = qm -> cap_tables .dev_cap_table [HPRE_CORE_INFO ].cap_val ;
739
+ clusters_num = (hpre_core_info >> hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].shift ) &
740
+ hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].mask ;
719
741
for (i = 0 ; i < clusters_num ; i ++ ) {
720
742
offset = HPRE_CLSTR_BASE + i * HPRE_CLSTR_ADDR_INTRVL ;
721
743
writel (0x0 , qm -> io_base + offset + HPRE_CLUSTER_INQURY );
@@ -1007,10 +1029,13 @@ static int hpre_cluster_debugfs_init(struct hisi_qm *qm)
1007
1029
char buf [HPRE_DBGFS_VAL_MAX_LEN ];
1008
1030
struct debugfs_regset32 * regset ;
1009
1031
struct dentry * tmp_d ;
1032
+ u32 hpre_core_info ;
1010
1033
u8 clusters_num ;
1011
1034
int i , ret ;
1012
1035
1013
- clusters_num = qm -> cap_tables .dev_cap_table [HPRE_CLUSTER_NUM_CAP_IDX ].cap_val ;
1036
+ hpre_core_info = qm -> cap_tables .dev_cap_table [HPRE_CORE_INFO ].cap_val ;
1037
+ clusters_num = (hpre_core_info >> hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].shift ) &
1038
+ hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].mask ;
1014
1039
for (i = 0 ; i < clusters_num ; i ++ ) {
1015
1040
ret = snprintf (buf , HPRE_DBGFS_VAL_MAX_LEN , "cluster%d" , i );
1016
1041
if (ret >= HPRE_DBGFS_VAL_MAX_LEN )
@@ -1053,6 +1078,26 @@ static int hpre_ctrl_debug_init(struct hisi_qm *qm)
1053
1078
return hpre_cluster_debugfs_init (qm );
1054
1079
}
1055
1080
1081
+ static int hpre_cap_regs_show (struct seq_file * s , void * unused )
1082
+ {
1083
+ struct hisi_qm * qm = s -> private ;
1084
+ u32 i , size ;
1085
+
1086
+ size = qm -> cap_tables .qm_cap_size ;
1087
+ for (i = 0 ; i < size ; i ++ )
1088
+ seq_printf (s , "%s= 0x%08x\n" , qm -> cap_tables .qm_cap_table [i ].name ,
1089
+ qm -> cap_tables .qm_cap_table [i ].cap_val );
1090
+
1091
+ size = qm -> cap_tables .dev_cap_size ;
1092
+ for (i = 0 ; i < size ; i ++ )
1093
+ seq_printf (s , "%s= 0x%08x\n" , qm -> cap_tables .dev_cap_table [i ].name ,
1094
+ qm -> cap_tables .dev_cap_table [i ].cap_val );
1095
+
1096
+ return 0 ;
1097
+ }
1098
+
1099
+ DEFINE_SHOW_ATTRIBUTE (hpre_cap_regs );
1100
+
1056
1101
static void hpre_dfx_debug_init (struct hisi_qm * qm )
1057
1102
{
1058
1103
struct dfx_diff_registers * hpre_regs = qm -> debug .acc_diff_regs ;
@@ -1071,6 +1116,9 @@ static void hpre_dfx_debug_init(struct hisi_qm *qm)
1071
1116
if (qm -> fun_type == QM_HW_PF && hpre_regs )
1072
1117
debugfs_create_file ("diff_regs" , 0444 , parent ,
1073
1118
qm , & hpre_diff_regs_fops );
1119
+
1120
+ debugfs_create_file ("cap_regs" , CAP_FILE_PERMISSION ,
1121
+ qm -> debug .debug_root , qm , & hpre_cap_regs_fops );
1074
1122
}
1075
1123
1076
1124
static int hpre_debugfs_init (struct hisi_qm * qm )
@@ -1118,26 +1166,33 @@ static int hpre_pre_store_cap_reg(struct hisi_qm *qm)
1118
1166
{
1119
1167
struct hisi_qm_cap_record * hpre_cap ;
1120
1168
struct device * dev = & qm -> pdev -> dev ;
1169
+ u32 hpre_core_info ;
1170
+ u8 clusters_num ;
1121
1171
size_t i , size ;
1122
1172
1123
- size = ARRAY_SIZE (hpre_pre_store_caps );
1173
+ size = ARRAY_SIZE (hpre_cap_query_info );
1124
1174
hpre_cap = devm_kzalloc (dev , sizeof (* hpre_cap ) * size , GFP_KERNEL );
1125
1175
if (!hpre_cap )
1126
1176
return - ENOMEM ;
1127
1177
1128
1178
for (i = 0 ; i < size ; i ++ ) {
1129
- hpre_cap [i ].type = hpre_pre_store_caps [i ];
1130
- hpre_cap [i ].cap_val = hisi_qm_get_hw_info (qm , hpre_basic_info ,
1131
- hpre_pre_store_caps [i ], qm -> cap_ver );
1179
+ hpre_cap [i ].type = hpre_cap_query_info [i ].type ;
1180
+ hpre_cap [i ].name = hpre_cap_query_info [i ].name ;
1181
+ hpre_cap [i ].cap_val = hisi_qm_get_cap_value (qm , hpre_cap_query_info ,
1182
+ i , qm -> cap_ver );
1132
1183
}
1133
1184
1134
- if (hpre_cap [HPRE_CLUSTER_NUM_CAP_IDX ].cap_val > HPRE_CLUSTERS_NUM_MAX ) {
1185
+ hpre_core_info = hpre_cap [HPRE_CORE_INFO ].cap_val ;
1186
+ clusters_num = (hpre_core_info >> hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].shift ) &
1187
+ hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].mask ;
1188
+ if (clusters_num > HPRE_CLUSTERS_NUM_MAX ) {
1135
1189
dev_err (dev , "Device cluster num %u is out of range for driver supports %d!\n" ,
1136
- hpre_cap [ HPRE_CLUSTER_NUM_CAP_IDX ]. cap_val , HPRE_CLUSTERS_NUM_MAX );
1190
+ clusters_num , HPRE_CLUSTERS_NUM_MAX );
1137
1191
return - EINVAL ;
1138
1192
}
1139
1193
1140
1194
qm -> cap_tables .dev_cap_table = hpre_cap ;
1195
+ qm -> cap_tables .dev_cap_size = size ;
1141
1196
1142
1197
return 0 ;
1143
1198
}
@@ -1184,7 +1239,7 @@ static int hpre_qm_init(struct hisi_qm *qm, struct pci_dev *pdev)
1184
1239
return ret ;
1185
1240
}
1186
1241
1187
- alg_msk = qm -> cap_tables .dev_cap_table [HPRE_DEV_ALG_BITMAP_CAP_IDX ].cap_val ;
1242
+ alg_msk = qm -> cap_tables .dev_cap_table [HPRE_ALG_BITMAP ].cap_val ;
1188
1243
ret = hisi_qm_set_algs (qm , alg_msk , hpre_dev_algs , ARRAY_SIZE (hpre_dev_algs ));
1189
1244
if (ret ) {
1190
1245
pci_err (pdev , "Failed to set hpre algs!\n" );
@@ -1200,10 +1255,13 @@ static int hpre_show_last_regs_init(struct hisi_qm *qm)
1200
1255
int com_dfx_regs_num = ARRAY_SIZE (hpre_com_dfx_regs );
1201
1256
struct qm_debug * debug = & qm -> debug ;
1202
1257
void __iomem * io_base ;
1258
+ u32 hpre_core_info ;
1203
1259
u8 clusters_num ;
1204
1260
int i , j , idx ;
1205
1261
1206
- clusters_num = qm -> cap_tables .dev_cap_table [HPRE_CLUSTER_NUM_CAP_IDX ].cap_val ;
1262
+ hpre_core_info = qm -> cap_tables .dev_cap_table [HPRE_CORE_INFO ].cap_val ;
1263
+ clusters_num = (hpre_core_info >> hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].shift ) &
1264
+ hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].mask ;
1207
1265
debug -> last_words = kcalloc (cluster_dfx_regs_num * clusters_num +
1208
1266
com_dfx_regs_num , sizeof (unsigned int ), GFP_KERNEL );
1209
1267
if (!debug -> last_words )
@@ -1243,6 +1301,7 @@ static void hpre_show_last_dfx_regs(struct hisi_qm *qm)
1243
1301
struct qm_debug * debug = & qm -> debug ;
1244
1302
struct pci_dev * pdev = qm -> pdev ;
1245
1303
void __iomem * io_base ;
1304
+ u32 hpre_core_info ;
1246
1305
u8 clusters_num ;
1247
1306
int i , j , idx ;
1248
1307
u32 val ;
@@ -1258,7 +1317,9 @@ static void hpre_show_last_dfx_regs(struct hisi_qm *qm)
1258
1317
hpre_com_dfx_regs [i ].name , debug -> last_words [i ], val );
1259
1318
}
1260
1319
1261
- clusters_num = qm -> cap_tables .dev_cap_table [HPRE_CLUSTER_NUM_CAP_IDX ].cap_val ;
1320
+ hpre_core_info = qm -> cap_tables .dev_cap_table [HPRE_CORE_INFO ].cap_val ;
1321
+ clusters_num = (hpre_core_info >> hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].shift ) &
1322
+ hpre_basic_info [HPRE_CLUSTER_NUM_CAP ].mask ;
1262
1323
for (i = 0 ; i < clusters_num ; i ++ ) {
1263
1324
io_base = qm -> io_base + hpre_cluster_offsets [i ];
1264
1325
for (j = 0 ; j < cluster_dfx_regs_num ; j ++ ) {
0 commit comments