1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (c) 2019 HiSilicon Limited. */ 3 #include <asm/page.h> 4 #include <linux/acpi.h> 5 #include <linux/aer.h> 6 #include <linux/bitmap.h> 7 #include <linux/dma-mapping.h> 8 #include <linux/idr.h> 9 #include <linux/io.h> 10 #include <linux/irqreturn.h> 11 #include <linux/log2.h> 12 #include <linux/pm_runtime.h> 13 #include <linux/seq_file.h> 14 #include <linux/slab.h> 15 #include <linux/uacce.h> 16 #include <linux/uaccess.h> 17 #include <uapi/misc/uacce/hisi_qm.h> 18 #include <linux/hisi_acc_qm.h> 19 20 /* eq/aeq irq enable */ 21 #define QM_VF_AEQ_INT_SOURCE 0x0 22 #define QM_VF_AEQ_INT_MASK 0x4 23 #define QM_VF_EQ_INT_SOURCE 0x8 24 #define QM_VF_EQ_INT_MASK 0xc 25 26 #define QM_IRQ_VECTOR_MASK GENMASK(15, 0) 27 #define QM_IRQ_TYPE_MASK GENMASK(15, 0) 28 #define QM_IRQ_TYPE_SHIFT 16 29 #define QM_ABN_IRQ_TYPE_MASK GENMASK(7, 0) 30 31 /* mailbox */ 32 #define QM_MB_PING_ALL_VFS 0xffff 33 #define QM_MB_CMD_DATA_SHIFT 32 34 #define QM_MB_CMD_DATA_MASK GENMASK(31, 0) 35 #define QM_MB_STATUS_MASK GENMASK(12, 9) 36 37 /* sqc shift */ 38 #define QM_SQ_HOP_NUM_SHIFT 0 39 #define QM_SQ_PAGE_SIZE_SHIFT 4 40 #define QM_SQ_BUF_SIZE_SHIFT 8 41 #define QM_SQ_SQE_SIZE_SHIFT 12 42 #define QM_SQ_PRIORITY_SHIFT 0 43 #define QM_SQ_ORDERS_SHIFT 4 44 #define QM_SQ_TYPE_SHIFT 8 45 #define QM_QC_PASID_ENABLE 0x1 46 #define QM_QC_PASID_ENABLE_SHIFT 7 47 48 #define QM_SQ_TYPE_MASK GENMASK(3, 0) 49 #define QM_SQ_TAIL_IDX(sqc) ((le16_to_cpu((sqc)->w11) >> 6) & 0x1) 50 51 /* cqc shift */ 52 #define QM_CQ_HOP_NUM_SHIFT 0 53 #define QM_CQ_PAGE_SIZE_SHIFT 4 54 #define QM_CQ_BUF_SIZE_SHIFT 8 55 #define QM_CQ_CQE_SIZE_SHIFT 12 56 #define QM_CQ_PHASE_SHIFT 0 57 #define QM_CQ_FLAG_SHIFT 1 58 59 #define QM_CQE_PHASE(cqe) (le16_to_cpu((cqe)->w7) & 0x1) 60 #define QM_QC_CQE_SIZE 4 61 #define QM_CQ_TAIL_IDX(cqc) ((le16_to_cpu((cqc)->w11) >> 6) & 0x1) 62 63 /* eqc shift */ 64 #define QM_EQE_AEQE_SIZE (2UL << 12) 65 #define QM_EQC_PHASE_SHIFT 16 66 67 #define QM_EQE_PHASE(eqe) ((le32_to_cpu((eqe)->dw0) >> 16) & 0x1) 68 #define QM_EQE_CQN_MASK GENMASK(15, 0) 69 70 #define QM_AEQE_PHASE(aeqe) ((le32_to_cpu((aeqe)->dw0) >> 16) & 0x1) 71 #define QM_AEQE_TYPE_SHIFT 17 72 #define QM_AEQE_CQN_MASK GENMASK(15, 0) 73 #define QM_CQ_OVERFLOW 0 74 #define QM_EQ_OVERFLOW 1 75 #define QM_CQE_ERROR 2 76 77 #define QM_XQ_DEPTH_SHIFT 16 78 #define QM_XQ_DEPTH_MASK GENMASK(15, 0) 79 80 #define QM_DOORBELL_CMD_SQ 0 81 #define QM_DOORBELL_CMD_CQ 1 82 #define QM_DOORBELL_CMD_EQ 2 83 #define QM_DOORBELL_CMD_AEQ 3 84 85 #define QM_DOORBELL_BASE_V1 0x340 86 #define QM_DB_CMD_SHIFT_V1 16 87 #define QM_DB_INDEX_SHIFT_V1 32 88 #define QM_DB_PRIORITY_SHIFT_V1 48 89 #define QM_PAGE_SIZE 0x0034 90 #define QM_QP_DB_INTERVAL 0x10000 91 92 #define QM_MEM_START_INIT 0x100040 93 #define QM_MEM_INIT_DONE 0x100044 94 #define QM_VFT_CFG_RDY 0x10006c 95 #define QM_VFT_CFG_OP_WR 0x100058 96 #define QM_VFT_CFG_TYPE 0x10005c 97 #define QM_SQC_VFT 0x0 98 #define QM_CQC_VFT 0x1 99 #define QM_VFT_CFG 0x100060 100 #define QM_VFT_CFG_OP_ENABLE 0x100054 101 #define QM_PM_CTRL 0x100148 102 #define QM_IDLE_DISABLE BIT(9) 103 104 #define QM_VFT_CFG_DATA_L 0x100064 105 #define QM_VFT_CFG_DATA_H 0x100068 106 #define QM_SQC_VFT_BUF_SIZE (7ULL << 8) 107 #define QM_SQC_VFT_SQC_SIZE (5ULL << 12) 108 #define QM_SQC_VFT_INDEX_NUMBER (1ULL << 16) 109 #define QM_SQC_VFT_START_SQN_SHIFT 28 110 #define QM_SQC_VFT_VALID (1ULL << 44) 111 #define QM_SQC_VFT_SQN_SHIFT 45 112 #define QM_CQC_VFT_BUF_SIZE (7ULL << 8) 113 #define QM_CQC_VFT_SQC_SIZE (5ULL << 12) 114 #define QM_CQC_VFT_INDEX_NUMBER (1ULL << 16) 115 #define QM_CQC_VFT_VALID (1ULL << 28) 116 117 #define QM_SQC_VFT_BASE_SHIFT_V2 28 118 #define QM_SQC_VFT_BASE_MASK_V2 GENMASK(15, 0) 119 #define QM_SQC_VFT_NUM_SHIFT_V2 45 120 #define QM_SQC_VFT_NUM_MASK_v2 GENMASK(9, 0) 121 122 #define QM_DFX_CNT_CLR_CE 0x100118 123 124 #define QM_ABNORMAL_INT_SOURCE 0x100000 125 #define QM_ABNORMAL_INT_MASK 0x100004 126 #define QM_ABNORMAL_INT_MASK_VALUE 0x7fff 127 #define QM_ABNORMAL_INT_STATUS 0x100008 128 #define QM_ABNORMAL_INT_SET 0x10000c 129 #define QM_ABNORMAL_INF00 0x100010 130 #define QM_FIFO_OVERFLOW_TYPE 0xc0 131 #define QM_FIFO_OVERFLOW_TYPE_SHIFT 6 132 #define QM_FIFO_OVERFLOW_VF 0x3f 133 #define QM_ABNORMAL_INF01 0x100014 134 #define QM_DB_TIMEOUT_TYPE 0xc0 135 #define QM_DB_TIMEOUT_TYPE_SHIFT 6 136 #define QM_DB_TIMEOUT_VF 0x3f 137 #define QM_RAS_CE_ENABLE 0x1000ec 138 #define QM_RAS_FE_ENABLE 0x1000f0 139 #define QM_RAS_NFE_ENABLE 0x1000f4 140 #define QM_RAS_CE_THRESHOLD 0x1000f8 141 #define QM_RAS_CE_TIMES_PER_IRQ 1 142 #define QM_OOO_SHUTDOWN_SEL 0x1040f8 143 #define QM_ECC_MBIT BIT(2) 144 #define QM_DB_TIMEOUT BIT(10) 145 #define QM_OF_FIFO_OF BIT(11) 146 147 #define QM_RESET_WAIT_TIMEOUT 400 148 #define QM_PEH_VENDOR_ID 0x1000d8 149 #define ACC_VENDOR_ID_VALUE 0x5a5a 150 #define QM_PEH_DFX_INFO0 0x1000fc 151 #define QM_PEH_DFX_INFO1 0x100100 152 #define QM_PEH_DFX_MASK (BIT(0) | BIT(2)) 153 #define QM_PEH_MSI_FINISH_MASK GENMASK(19, 16) 154 #define ACC_PEH_SRIOV_CTRL_VF_MSE_SHIFT 3 155 #define ACC_PEH_MSI_DISABLE GENMASK(31, 0) 156 #define ACC_MASTER_GLOBAL_CTRL_SHUTDOWN 0x1 157 #define ACC_MASTER_TRANS_RETURN_RW 3 158 #define ACC_MASTER_TRANS_RETURN 0x300150 159 #define ACC_MASTER_GLOBAL_CTRL 0x300000 160 #define ACC_AM_CFG_PORT_WR_EN 0x30001c 161 #define QM_RAS_NFE_MBIT_DISABLE ~QM_ECC_MBIT 162 #define ACC_AM_ROB_ECC_INT_STS 0x300104 163 #define ACC_ROB_ECC_ERR_MULTPL BIT(1) 164 #define QM_MSI_CAP_ENABLE BIT(16) 165 166 /* interfunction communication */ 167 #define QM_IFC_READY_STATUS 0x100128 168 #define QM_IFC_C_STS_M 0x10012C 169 #define QM_IFC_INT_SET_P 0x100130 170 #define QM_IFC_INT_CFG 0x100134 171 #define QM_IFC_INT_SOURCE_P 0x100138 172 #define QM_IFC_INT_SOURCE_V 0x0020 173 #define QM_IFC_INT_MASK 0x0024 174 #define QM_IFC_INT_STATUS 0x0028 175 #define QM_IFC_INT_SET_V 0x002C 176 #define QM_IFC_SEND_ALL_VFS GENMASK(6, 0) 177 #define QM_IFC_INT_SOURCE_CLR GENMASK(63, 0) 178 #define QM_IFC_INT_SOURCE_MASK BIT(0) 179 #define QM_IFC_INT_DISABLE BIT(0) 180 #define QM_IFC_INT_STATUS_MASK BIT(0) 181 #define QM_IFC_INT_SET_MASK BIT(0) 182 #define QM_WAIT_DST_ACK 10 183 #define QM_MAX_PF_WAIT_COUNT 10 184 #define QM_MAX_VF_WAIT_COUNT 40 185 #define QM_VF_RESET_WAIT_US 20000 186 #define QM_VF_RESET_WAIT_CNT 3000 187 #define QM_VF_RESET_WAIT_TIMEOUT_US \ 188 (QM_VF_RESET_WAIT_US * QM_VF_RESET_WAIT_CNT) 189 190 #define QM_DFX_MB_CNT_VF 0x104010 191 #define QM_DFX_DB_CNT_VF 0x104020 192 #define QM_DFX_SQE_CNT_VF_SQN 0x104030 193 #define QM_DFX_CQE_CNT_VF_CQN 0x104040 194 #define QM_DFX_QN_SHIFT 16 195 #define CURRENT_FUN_MASK GENMASK(5, 0) 196 #define CURRENT_Q_MASK GENMASK(31, 16) 197 198 #define POLL_PERIOD 10 199 #define POLL_TIMEOUT 1000 200 #define WAIT_PERIOD_US_MAX 200 201 #define WAIT_PERIOD_US_MIN 100 202 #define MAX_WAIT_COUNTS 1000 203 #define QM_CACHE_WB_START 0x204 204 #define QM_CACHE_WB_DONE 0x208 205 #define QM_FUNC_CAPS_REG 0x3100 206 #define QM_CAPBILITY_VERSION GENMASK(7, 0) 207 208 #define PCI_BAR_2 2 209 #define PCI_BAR_4 4 210 #define QM_SQE_DATA_ALIGN_MASK GENMASK(6, 0) 211 #define QMC_ALIGN(sz) ALIGN(sz, 32) 212 213 #define QM_DBG_READ_LEN 256 214 #define QM_DBG_WRITE_LEN 1024 215 #define QM_DBG_TMP_BUF_LEN 22 216 #define QM_PCI_COMMAND_INVALID ~0 217 #define QM_RESET_STOP_TX_OFFSET 1 218 #define QM_RESET_STOP_RX_OFFSET 2 219 220 #define WAIT_PERIOD 20 221 #define REMOVE_WAIT_DELAY 10 222 #define QM_SQE_ADDR_MASK GENMASK(7, 0) 223 224 #define QM_DRIVER_REMOVING 0 225 #define QM_RST_SCHED 1 226 #define QM_RESETTING 2 227 #define QM_QOS_PARAM_NUM 2 228 #define QM_QOS_VAL_NUM 1 229 #define QM_QOS_BDF_PARAM_NUM 4 230 #define QM_QOS_MAX_VAL 1000 231 #define QM_QOS_RATE 100 232 #define QM_QOS_EXPAND_RATE 1000 233 #define QM_SHAPER_CIR_B_MASK GENMASK(7, 0) 234 #define QM_SHAPER_CIR_U_MASK GENMASK(10, 8) 235 #define QM_SHAPER_CIR_S_MASK GENMASK(14, 11) 236 #define QM_SHAPER_FACTOR_CIR_U_SHIFT 8 237 #define QM_SHAPER_FACTOR_CIR_S_SHIFT 11 238 #define QM_SHAPER_FACTOR_CBS_B_SHIFT 15 239 #define QM_SHAPER_FACTOR_CBS_S_SHIFT 19 240 #define QM_SHAPER_CBS_B 1 241 #define QM_SHAPER_CBS_S 16 242 #define QM_SHAPER_VFT_OFFSET 6 243 #define WAIT_FOR_QOS_VF 100 244 #define QM_QOS_MIN_ERROR_RATE 5 245 #define QM_QOS_TYPICAL_NUM 8 246 #define QM_SHAPER_MIN_CBS_S 8 247 #define QM_QOS_TICK 0x300U 248 #define QM_QOS_DIVISOR_CLK 0x1f40U 249 #define QM_QOS_MAX_CIR_B 200 250 #define QM_QOS_MIN_CIR_B 100 251 #define QM_QOS_MAX_CIR_U 6 252 #define QM_QOS_MAX_CIR_S 11 253 #define QM_DFX_BASE 0x0100000 254 #define QM_DFX_STATE1 0x0104000 255 #define QM_DFX_STATE2 0x01040C8 256 #define QM_DFX_COMMON 0x0000 257 #define QM_DFX_BASE_LEN 0x5A 258 #define QM_DFX_STATE1_LEN 0x2E 259 #define QM_DFX_STATE2_LEN 0x11 260 #define QM_DFX_COMMON_LEN 0xC3 261 #define QM_DFX_REGS_LEN 4UL 262 #define QM_AUTOSUSPEND_DELAY 3000 263 264 #define QM_MK_CQC_DW3_V1(hop_num, pg_sz, buf_sz, cqe_sz) \ 265 (((hop_num) << QM_CQ_HOP_NUM_SHIFT) | \ 266 ((pg_sz) << QM_CQ_PAGE_SIZE_SHIFT) | \ 267 ((buf_sz) << QM_CQ_BUF_SIZE_SHIFT) | \ 268 ((cqe_sz) << QM_CQ_CQE_SIZE_SHIFT)) 269 270 #define QM_MK_CQC_DW3_V2(cqe_sz, cq_depth) \ 271 ((((u32)cq_depth) - 1) | ((cqe_sz) << QM_CQ_CQE_SIZE_SHIFT)) 272 273 #define QM_MK_SQC_W13(priority, orders, alg_type) \ 274 (((priority) << QM_SQ_PRIORITY_SHIFT) | \ 275 ((orders) << QM_SQ_ORDERS_SHIFT) | \ 276 (((alg_type) & QM_SQ_TYPE_MASK) << QM_SQ_TYPE_SHIFT)) 277 278 #define QM_MK_SQC_DW3_V1(hop_num, pg_sz, buf_sz, sqe_sz) \ 279 (((hop_num) << QM_SQ_HOP_NUM_SHIFT) | \ 280 ((pg_sz) << QM_SQ_PAGE_SIZE_SHIFT) | \ 281 ((buf_sz) << QM_SQ_BUF_SIZE_SHIFT) | \ 282 ((u32)ilog2(sqe_sz) << QM_SQ_SQE_SIZE_SHIFT)) 283 284 #define QM_MK_SQC_DW3_V2(sqe_sz, sq_depth) \ 285 ((((u32)sq_depth) - 1) | ((u32)ilog2(sqe_sz) << QM_SQ_SQE_SIZE_SHIFT)) 286 287 #define INIT_QC_COMMON(qc, base, pasid) do { \ 288 (qc)->head = 0; \ 289 (qc)->tail = 0; \ 290 (qc)->base_l = cpu_to_le32(lower_32_bits(base)); \ 291 (qc)->base_h = cpu_to_le32(upper_32_bits(base)); \ 292 (qc)->dw3 = 0; \ 293 (qc)->w8 = 0; \ 294 (qc)->rsvd0 = 0; \ 295 (qc)->pasid = cpu_to_le16(pasid); \ 296 (qc)->w11 = 0; \ 297 (qc)->rsvd1 = 0; \ 298 } while (0) 299 300 enum vft_type { 301 SQC_VFT = 0, 302 CQC_VFT, 303 SHAPER_VFT, 304 }; 305 306 enum acc_err_result { 307 ACC_ERR_NONE, 308 ACC_ERR_NEED_RESET, 309 ACC_ERR_RECOVERED, 310 }; 311 312 enum qm_alg_type { 313 ALG_TYPE_0, 314 ALG_TYPE_1, 315 }; 316 317 enum qm_mb_cmd { 318 QM_PF_FLR_PREPARE = 0x01, 319 QM_PF_SRST_PREPARE, 320 QM_PF_RESET_DONE, 321 QM_VF_PREPARE_DONE, 322 QM_VF_PREPARE_FAIL, 323 QM_VF_START_DONE, 324 QM_VF_START_FAIL, 325 QM_PF_SET_QOS, 326 QM_VF_GET_QOS, 327 }; 328 329 enum qm_basic_type { 330 QM_TOTAL_QP_NUM_CAP = 0x0, 331 QM_FUNC_MAX_QP_CAP, 332 QM_XEQ_DEPTH_CAP, 333 QM_QP_DEPTH_CAP, 334 QM_EQ_IRQ_TYPE_CAP, 335 QM_AEQ_IRQ_TYPE_CAP, 336 QM_ABN_IRQ_TYPE_CAP, 337 QM_PF2VF_IRQ_TYPE_CAP, 338 QM_PF_IRQ_NUM_CAP, 339 QM_VF_IRQ_NUM_CAP, 340 }; 341 342 static const struct hisi_qm_cap_info qm_cap_info_comm[] = { 343 {QM_SUPPORT_DB_ISOLATION, 0x30, 0, BIT(0), 0x0, 0x0, 0x0}, 344 {QM_SUPPORT_FUNC_QOS, 0x3100, 0, BIT(8), 0x0, 0x0, 0x1}, 345 {QM_SUPPORT_STOP_QP, 0x3100, 0, BIT(9), 0x0, 0x0, 0x1}, 346 {QM_SUPPORT_MB_COMMAND, 0x3100, 0, BIT(11), 0x0, 0x0, 0x1}, 347 {QM_SUPPORT_SVA_PREFETCH, 0x3100, 0, BIT(14), 0x0, 0x0, 0x1}, 348 }; 349 350 static const struct hisi_qm_cap_info qm_cap_info_pf[] = { 351 {QM_SUPPORT_RPM, 0x3100, 0, BIT(13), 0x0, 0x0, 0x1}, 352 }; 353 354 static const struct hisi_qm_cap_info qm_cap_info_vf[] = { 355 {QM_SUPPORT_RPM, 0x3100, 0, BIT(12), 0x0, 0x0, 0x0}, 356 }; 357 358 static const struct hisi_qm_cap_info qm_basic_info[] = { 359 {QM_TOTAL_QP_NUM_CAP, 0x100158, 0, GENMASK(10, 0), 0x1000, 0x400, 0x400}, 360 {QM_FUNC_MAX_QP_CAP, 0x100158, 11, GENMASK(10, 0), 0x1000, 0x400, 0x400}, 361 {QM_XEQ_DEPTH_CAP, 0x3104, 0, GENMASK(15, 0), 0x800, 0x4000800, 0x4000800}, 362 {QM_QP_DEPTH_CAP, 0x3108, 0, GENMASK(31, 0), 0x4000400, 0x4000400, 0x4000400}, 363 {QM_EQ_IRQ_TYPE_CAP, 0x310c, 0, GENMASK(31, 0), 0x10000, 0x10000, 0x10000}, 364 {QM_AEQ_IRQ_TYPE_CAP, 0x3110, 0, GENMASK(31, 0), 0x0, 0x10001, 0x10001}, 365 {QM_ABN_IRQ_TYPE_CAP, 0x3114, 0, GENMASK(31, 0), 0x0, 0x10003, 0x10003}, 366 {QM_PF2VF_IRQ_TYPE_CAP, 0x3118, 0, GENMASK(31, 0), 0x0, 0x0, 0x10002}, 367 {QM_PF_IRQ_NUM_CAP, 0x311c, 16, GENMASK(15, 0), 0x1, 0x4, 0x4}, 368 {QM_VF_IRQ_NUM_CAP, 0x311c, 0, GENMASK(15, 0), 0x1, 0x2, 0x3}, 369 }; 370 371 struct qm_cqe { 372 __le32 rsvd0; 373 __le16 cmd_id; 374 __le16 rsvd1; 375 __le16 sq_head; 376 __le16 sq_num; 377 __le16 rsvd2; 378 __le16 w7; 379 }; 380 381 struct qm_eqe { 382 __le32 dw0; 383 }; 384 385 struct qm_aeqe { 386 __le32 dw0; 387 }; 388 389 struct qm_sqc { 390 __le16 head; 391 __le16 tail; 392 __le32 base_l; 393 __le32 base_h; 394 __le32 dw3; 395 __le16 w8; 396 __le16 rsvd0; 397 __le16 pasid; 398 __le16 w11; 399 __le16 cq_num; 400 __le16 w13; 401 __le32 rsvd1; 402 }; 403 404 struct qm_cqc { 405 __le16 head; 406 __le16 tail; 407 __le32 base_l; 408 __le32 base_h; 409 __le32 dw3; 410 __le16 w8; 411 __le16 rsvd0; 412 __le16 pasid; 413 __le16 w11; 414 __le32 dw6; 415 __le32 rsvd1; 416 }; 417 418 struct qm_eqc { 419 __le16 head; 420 __le16 tail; 421 __le32 base_l; 422 __le32 base_h; 423 __le32 dw3; 424 __le32 rsvd[2]; 425 __le32 dw6; 426 }; 427 428 struct qm_aeqc { 429 __le16 head; 430 __le16 tail; 431 __le32 base_l; 432 __le32 base_h; 433 __le32 dw3; 434 __le32 rsvd[2]; 435 __le32 dw6; 436 }; 437 438 struct qm_mailbox { 439 __le16 w0; 440 __le16 queue_num; 441 __le32 base_l; 442 __le32 base_h; 443 __le32 rsvd; 444 }; 445 446 struct qm_doorbell { 447 __le16 queue_num; 448 __le16 cmd; 449 __le16 index; 450 __le16 priority; 451 }; 452 453 struct hisi_qm_resource { 454 struct hisi_qm *qm; 455 int distance; 456 struct list_head list; 457 }; 458 459 struct hisi_qm_hw_ops { 460 int (*get_vft)(struct hisi_qm *qm, u32 *base, u32 *number); 461 void (*qm_db)(struct hisi_qm *qm, u16 qn, 462 u8 cmd, u16 index, u8 priority); 463 int (*debug_init)(struct hisi_qm *qm); 464 void (*hw_error_init)(struct hisi_qm *qm); 465 void (*hw_error_uninit)(struct hisi_qm *qm); 466 enum acc_err_result (*hw_error_handle)(struct hisi_qm *qm); 467 int (*set_msi)(struct hisi_qm *qm, bool set); 468 }; 469 470 struct qm_dfx_item { 471 const char *name; 472 u32 offset; 473 }; 474 475 static struct qm_dfx_item qm_dfx_files[] = { 476 {"err_irq", offsetof(struct qm_dfx, err_irq_cnt)}, 477 {"aeq_irq", offsetof(struct qm_dfx, aeq_irq_cnt)}, 478 {"abnormal_irq", offsetof(struct qm_dfx, abnormal_irq_cnt)}, 479 {"create_qp_err", offsetof(struct qm_dfx, create_qp_err_cnt)}, 480 {"mb_err", offsetof(struct qm_dfx, mb_err_cnt)}, 481 }; 482 483 static const char * const qm_debug_file_name[] = { 484 [CURRENT_QM] = "current_qm", 485 [CURRENT_Q] = "current_q", 486 [CLEAR_ENABLE] = "clear_enable", 487 }; 488 489 struct hisi_qm_hw_error { 490 u32 int_msk; 491 const char *msg; 492 }; 493 494 static const struct hisi_qm_hw_error qm_hw_error[] = { 495 { .int_msk = BIT(0), .msg = "qm_axi_rresp" }, 496 { .int_msk = BIT(1), .msg = "qm_axi_bresp" }, 497 { .int_msk = BIT(2), .msg = "qm_ecc_mbit" }, 498 { .int_msk = BIT(3), .msg = "qm_ecc_1bit" }, 499 { .int_msk = BIT(4), .msg = "qm_acc_get_task_timeout" }, 500 { .int_msk = BIT(5), .msg = "qm_acc_do_task_timeout" }, 501 { .int_msk = BIT(6), .msg = "qm_acc_wb_not_ready_timeout" }, 502 { .int_msk = BIT(7), .msg = "qm_sq_cq_vf_invalid" }, 503 { .int_msk = BIT(8), .msg = "qm_cq_vf_invalid" }, 504 { .int_msk = BIT(9), .msg = "qm_sq_vf_invalid" }, 505 { .int_msk = BIT(10), .msg = "qm_db_timeout" }, 506 { .int_msk = BIT(11), .msg = "qm_of_fifo_of" }, 507 { .int_msk = BIT(12), .msg = "qm_db_random_invalid" }, 508 { .int_msk = BIT(13), .msg = "qm_mailbox_timeout" }, 509 { .int_msk = BIT(14), .msg = "qm_flr_timeout" }, 510 { /* sentinel */ } 511 }; 512 513 /* define the QM's dfx regs region and region length */ 514 static struct dfx_diff_registers qm_diff_regs[] = { 515 { 516 .reg_offset = QM_DFX_BASE, 517 .reg_len = QM_DFX_BASE_LEN, 518 }, { 519 .reg_offset = QM_DFX_STATE1, 520 .reg_len = QM_DFX_STATE1_LEN, 521 }, { 522 .reg_offset = QM_DFX_STATE2, 523 .reg_len = QM_DFX_STATE2_LEN, 524 }, { 525 .reg_offset = QM_DFX_COMMON, 526 .reg_len = QM_DFX_COMMON_LEN, 527 }, 528 }; 529 530 static const char * const qm_db_timeout[] = { 531 "sq", "cq", "eq", "aeq", 532 }; 533 534 static const char * const qm_fifo_overflow[] = { 535 "cq", "eq", "aeq", 536 }; 537 538 static const char * const qm_s[] = { 539 "init", "start", "close", "stop", 540 }; 541 542 static const char * const qp_s[] = { 543 "none", "init", "start", "stop", "close", 544 }; 545 546 struct qm_typical_qos_table { 547 u32 start; 548 u32 end; 549 u32 val; 550 }; 551 552 /* the qos step is 100 */ 553 static struct qm_typical_qos_table shaper_cir_s[] = { 554 {100, 100, 4}, 555 {200, 200, 3}, 556 {300, 500, 2}, 557 {600, 1000, 1}, 558 {1100, 100000, 0}, 559 }; 560 561 static struct qm_typical_qos_table shaper_cbs_s[] = { 562 {100, 200, 9}, 563 {300, 500, 11}, 564 {600, 1000, 12}, 565 {1100, 10000, 16}, 566 {10100, 25000, 17}, 567 {25100, 50000, 18}, 568 {50100, 100000, 19} 569 }; 570 571 static void qm_irqs_unregister(struct hisi_qm *qm); 572 573 static bool qm_avail_state(struct hisi_qm *qm, enum qm_state new) 574 { 575 enum qm_state curr = atomic_read(&qm->status.flags); 576 bool avail = false; 577 578 switch (curr) { 579 case QM_INIT: 580 if (new == QM_START || new == QM_CLOSE) 581 avail = true; 582 break; 583 case QM_START: 584 if (new == QM_STOP) 585 avail = true; 586 break; 587 case QM_STOP: 588 if (new == QM_CLOSE || new == QM_START) 589 avail = true; 590 break; 591 default: 592 break; 593 } 594 595 dev_dbg(&qm->pdev->dev, "change qm state from %s to %s\n", 596 qm_s[curr], qm_s[new]); 597 598 if (!avail) 599 dev_warn(&qm->pdev->dev, "Can not change qm state from %s to %s\n", 600 qm_s[curr], qm_s[new]); 601 602 return avail; 603 } 604 605 static bool qm_qp_avail_state(struct hisi_qm *qm, struct hisi_qp *qp, 606 enum qp_state new) 607 { 608 enum qm_state qm_curr = atomic_read(&qm->status.flags); 609 enum qp_state qp_curr = 0; 610 bool avail = false; 611 612 if (qp) 613 qp_curr = atomic_read(&qp->qp_status.flags); 614 615 switch (new) { 616 case QP_INIT: 617 if (qm_curr == QM_START || qm_curr == QM_INIT) 618 avail = true; 619 break; 620 case QP_START: 621 if ((qm_curr == QM_START && qp_curr == QP_INIT) || 622 (qm_curr == QM_START && qp_curr == QP_STOP)) 623 avail = true; 624 break; 625 case QP_STOP: 626 if ((qm_curr == QM_START && qp_curr == QP_START) || 627 (qp_curr == QP_INIT)) 628 avail = true; 629 break; 630 case QP_CLOSE: 631 if ((qm_curr == QM_START && qp_curr == QP_INIT) || 632 (qm_curr == QM_START && qp_curr == QP_STOP) || 633 (qm_curr == QM_STOP && qp_curr == QP_STOP) || 634 (qm_curr == QM_STOP && qp_curr == QP_INIT)) 635 avail = true; 636 break; 637 default: 638 break; 639 } 640 641 dev_dbg(&qm->pdev->dev, "change qp state from %s to %s in QM %s\n", 642 qp_s[qp_curr], qp_s[new], qm_s[qm_curr]); 643 644 if (!avail) 645 dev_warn(&qm->pdev->dev, 646 "Can not change qp state from %s to %s in QM %s\n", 647 qp_s[qp_curr], qp_s[new], qm_s[qm_curr]); 648 649 return avail; 650 } 651 652 static u32 qm_get_hw_error_status(struct hisi_qm *qm) 653 { 654 return readl(qm->io_base + QM_ABNORMAL_INT_STATUS); 655 } 656 657 static u32 qm_get_dev_err_status(struct hisi_qm *qm) 658 { 659 return qm->err_ini->get_dev_hw_err_status(qm); 660 } 661 662 /* Check if the error causes the master ooo block */ 663 static bool qm_check_dev_error(struct hisi_qm *qm) 664 { 665 u32 val, dev_val; 666 667 if (qm->fun_type == QM_HW_VF) 668 return false; 669 670 val = qm_get_hw_error_status(qm) & qm->err_info.qm_shutdown_mask; 671 dev_val = qm_get_dev_err_status(qm) & qm->err_info.dev_shutdown_mask; 672 673 return val || dev_val; 674 } 675 676 static int qm_wait_reset_finish(struct hisi_qm *qm) 677 { 678 int delay = 0; 679 680 /* All reset requests need to be queued for processing */ 681 while (test_and_set_bit(QM_RESETTING, &qm->misc_ctl)) { 682 msleep(++delay); 683 if (delay > QM_RESET_WAIT_TIMEOUT) 684 return -EBUSY; 685 } 686 687 return 0; 688 } 689 690 static int qm_reset_prepare_ready(struct hisi_qm *qm) 691 { 692 struct pci_dev *pdev = qm->pdev; 693 struct hisi_qm *pf_qm = pci_get_drvdata(pci_physfn(pdev)); 694 695 /* 696 * PF and VF on host doesnot support resetting at the 697 * same time on Kunpeng920. 698 */ 699 if (qm->ver < QM_HW_V3) 700 return qm_wait_reset_finish(pf_qm); 701 702 return qm_wait_reset_finish(qm); 703 } 704 705 static void qm_reset_bit_clear(struct hisi_qm *qm) 706 { 707 struct pci_dev *pdev = qm->pdev; 708 struct hisi_qm *pf_qm = pci_get_drvdata(pci_physfn(pdev)); 709 710 if (qm->ver < QM_HW_V3) 711 clear_bit(QM_RESETTING, &pf_qm->misc_ctl); 712 713 clear_bit(QM_RESETTING, &qm->misc_ctl); 714 } 715 716 static void qm_mb_pre_init(struct qm_mailbox *mailbox, u8 cmd, 717 u64 base, u16 queue, bool op) 718 { 719 mailbox->w0 = cpu_to_le16((cmd) | 720 ((op) ? 0x1 << QM_MB_OP_SHIFT : 0) | 721 (0x1 << QM_MB_BUSY_SHIFT)); 722 mailbox->queue_num = cpu_to_le16(queue); 723 mailbox->base_l = cpu_to_le32(lower_32_bits(base)); 724 mailbox->base_h = cpu_to_le32(upper_32_bits(base)); 725 mailbox->rsvd = 0; 726 } 727 728 /* return 0 mailbox ready, -ETIMEDOUT hardware timeout */ 729 int hisi_qm_wait_mb_ready(struct hisi_qm *qm) 730 { 731 u32 val; 732 733 return readl_relaxed_poll_timeout(qm->io_base + QM_MB_CMD_SEND_BASE, 734 val, !((val >> QM_MB_BUSY_SHIFT) & 735 0x1), POLL_PERIOD, POLL_TIMEOUT); 736 } 737 EXPORT_SYMBOL_GPL(hisi_qm_wait_mb_ready); 738 739 /* 128 bit should be written to hardware at one time to trigger a mailbox */ 740 static void qm_mb_write(struct hisi_qm *qm, const void *src) 741 { 742 void __iomem *fun_base = qm->io_base + QM_MB_CMD_SEND_BASE; 743 unsigned long tmp0 = 0, tmp1 = 0; 744 745 if (!IS_ENABLED(CONFIG_ARM64)) { 746 memcpy_toio(fun_base, src, 16); 747 dma_wmb(); 748 return; 749 } 750 751 asm volatile("ldp %0, %1, %3\n" 752 "stp %0, %1, %2\n" 753 "dmb oshst\n" 754 : "=&r" (tmp0), 755 "=&r" (tmp1), 756 "+Q" (*((char __iomem *)fun_base)) 757 : "Q" (*((char *)src)) 758 : "memory"); 759 } 760 761 static int qm_mb_nolock(struct hisi_qm *qm, struct qm_mailbox *mailbox) 762 { 763 int ret; 764 u32 val; 765 766 if (unlikely(hisi_qm_wait_mb_ready(qm))) { 767 dev_err(&qm->pdev->dev, "QM mailbox is busy to start!\n"); 768 ret = -EBUSY; 769 goto mb_busy; 770 } 771 772 qm_mb_write(qm, mailbox); 773 774 if (unlikely(hisi_qm_wait_mb_ready(qm))) { 775 dev_err(&qm->pdev->dev, "QM mailbox operation timeout!\n"); 776 ret = -ETIMEDOUT; 777 goto mb_busy; 778 } 779 780 val = readl(qm->io_base + QM_MB_CMD_SEND_BASE); 781 if (val & QM_MB_STATUS_MASK) { 782 dev_err(&qm->pdev->dev, "QM mailbox operation failed!\n"); 783 ret = -EIO; 784 goto mb_busy; 785 } 786 787 return 0; 788 789 mb_busy: 790 atomic64_inc(&qm->debug.dfx.mb_err_cnt); 791 return ret; 792 } 793 794 int hisi_qm_mb(struct hisi_qm *qm, u8 cmd, dma_addr_t dma_addr, u16 queue, 795 bool op) 796 { 797 struct qm_mailbox mailbox; 798 int ret; 799 800 dev_dbg(&qm->pdev->dev, "QM mailbox request to q%u: %u-%llx\n", 801 queue, cmd, (unsigned long long)dma_addr); 802 803 qm_mb_pre_init(&mailbox, cmd, dma_addr, queue, op); 804 805 mutex_lock(&qm->mailbox_lock); 806 ret = qm_mb_nolock(qm, &mailbox); 807 mutex_unlock(&qm->mailbox_lock); 808 809 return ret; 810 } 811 EXPORT_SYMBOL_GPL(hisi_qm_mb); 812 813 static void qm_db_v1(struct hisi_qm *qm, u16 qn, u8 cmd, u16 index, u8 priority) 814 { 815 u64 doorbell; 816 817 doorbell = qn | ((u64)cmd << QM_DB_CMD_SHIFT_V1) | 818 ((u64)index << QM_DB_INDEX_SHIFT_V1) | 819 ((u64)priority << QM_DB_PRIORITY_SHIFT_V1); 820 821 writeq(doorbell, qm->io_base + QM_DOORBELL_BASE_V1); 822 } 823 824 static void qm_db_v2(struct hisi_qm *qm, u16 qn, u8 cmd, u16 index, u8 priority) 825 { 826 void __iomem *io_base = qm->io_base; 827 u16 randata = 0; 828 u64 doorbell; 829 830 if (cmd == QM_DOORBELL_CMD_SQ || cmd == QM_DOORBELL_CMD_CQ) 831 io_base = qm->db_io_base + (u64)qn * qm->db_interval + 832 QM_DOORBELL_SQ_CQ_BASE_V2; 833 else 834 io_base += QM_DOORBELL_EQ_AEQ_BASE_V2; 835 836 doorbell = qn | ((u64)cmd << QM_DB_CMD_SHIFT_V2) | 837 ((u64)randata << QM_DB_RAND_SHIFT_V2) | 838 ((u64)index << QM_DB_INDEX_SHIFT_V2) | 839 ((u64)priority << QM_DB_PRIORITY_SHIFT_V2); 840 841 writeq(doorbell, io_base); 842 } 843 844 static void qm_db(struct hisi_qm *qm, u16 qn, u8 cmd, u16 index, u8 priority) 845 { 846 dev_dbg(&qm->pdev->dev, "QM doorbell request: qn=%u, cmd=%u, index=%u\n", 847 qn, cmd, index); 848 849 qm->ops->qm_db(qm, qn, cmd, index, priority); 850 } 851 852 static void qm_disable_clock_gate(struct hisi_qm *qm) 853 { 854 u32 val; 855 856 /* if qm enables clock gating in Kunpeng930, qos will be inaccurate. */ 857 if (qm->ver < QM_HW_V3) 858 return; 859 860 val = readl(qm->io_base + QM_PM_CTRL); 861 val |= QM_IDLE_DISABLE; 862 writel(val, qm->io_base + QM_PM_CTRL); 863 } 864 865 static int qm_dev_mem_reset(struct hisi_qm *qm) 866 { 867 u32 val; 868 869 writel(0x1, qm->io_base + QM_MEM_START_INIT); 870 return readl_relaxed_poll_timeout(qm->io_base + QM_MEM_INIT_DONE, val, 871 val & BIT(0), POLL_PERIOD, 872 POLL_TIMEOUT); 873 } 874 875 /** 876 * hisi_qm_get_hw_info() - Get device information. 877 * @qm: The qm which want to get information. 878 * @info_table: Array for storing device information. 879 * @index: Index in info_table. 880 * @is_read: Whether read from reg, 0: not support read from reg. 881 * 882 * This function returns device information the caller needs. 883 */ 884 u32 hisi_qm_get_hw_info(struct hisi_qm *qm, 885 const struct hisi_qm_cap_info *info_table, 886 u32 index, bool is_read) 887 { 888 u32 val; 889 890 switch (qm->ver) { 891 case QM_HW_V1: 892 return info_table[index].v1_val; 893 case QM_HW_V2: 894 return info_table[index].v2_val; 895 default: 896 if (!is_read) 897 return info_table[index].v3_val; 898 899 val = readl(qm->io_base + info_table[index].offset); 900 return (val >> info_table[index].shift) & info_table[index].mask; 901 } 902 } 903 EXPORT_SYMBOL_GPL(hisi_qm_get_hw_info); 904 905 static void qm_get_xqc_depth(struct hisi_qm *qm, u16 *low_bits, 906 u16 *high_bits, enum qm_basic_type type) 907 { 908 u32 depth; 909 910 depth = hisi_qm_get_hw_info(qm, qm_basic_info, type, qm->cap_ver); 911 *low_bits = depth & QM_XQ_DEPTH_MASK; 912 *high_bits = (depth >> QM_XQ_DEPTH_SHIFT) & QM_XQ_DEPTH_MASK; 913 } 914 915 static u32 qm_get_irq_num(struct hisi_qm *qm) 916 { 917 if (qm->fun_type == QM_HW_PF) 918 return hisi_qm_get_hw_info(qm, qm_basic_info, QM_PF_IRQ_NUM_CAP, qm->cap_ver); 919 920 return hisi_qm_get_hw_info(qm, qm_basic_info, QM_VF_IRQ_NUM_CAP, qm->cap_ver); 921 } 922 923 static int qm_pm_get_sync(struct hisi_qm *qm) 924 { 925 struct device *dev = &qm->pdev->dev; 926 int ret; 927 928 if (!test_bit(QM_SUPPORT_RPM, &qm->caps)) 929 return 0; 930 931 ret = pm_runtime_resume_and_get(dev); 932 if (ret < 0) { 933 dev_err(dev, "failed to get_sync(%d).\n", ret); 934 return ret; 935 } 936 937 return 0; 938 } 939 940 static void qm_pm_put_sync(struct hisi_qm *qm) 941 { 942 struct device *dev = &qm->pdev->dev; 943 944 if (!test_bit(QM_SUPPORT_RPM, &qm->caps)) 945 return; 946 947 pm_runtime_mark_last_busy(dev); 948 pm_runtime_put_autosuspend(dev); 949 } 950 951 static void qm_cq_head_update(struct hisi_qp *qp) 952 { 953 if (qp->qp_status.cq_head == qp->cq_depth - 1) { 954 qp->qp_status.cqc_phase = !qp->qp_status.cqc_phase; 955 qp->qp_status.cq_head = 0; 956 } else { 957 qp->qp_status.cq_head++; 958 } 959 } 960 961 static void qm_poll_req_cb(struct hisi_qp *qp) 962 { 963 struct qm_cqe *cqe = qp->cqe + qp->qp_status.cq_head; 964 struct hisi_qm *qm = qp->qm; 965 966 while (QM_CQE_PHASE(cqe) == qp->qp_status.cqc_phase) { 967 dma_rmb(); 968 qp->req_cb(qp, qp->sqe + qm->sqe_size * 969 le16_to_cpu(cqe->sq_head)); 970 qm_cq_head_update(qp); 971 cqe = qp->cqe + qp->qp_status.cq_head; 972 qm_db(qm, qp->qp_id, QM_DOORBELL_CMD_CQ, 973 qp->qp_status.cq_head, 0); 974 atomic_dec(&qp->qp_status.used); 975 } 976 977 /* set c_flag */ 978 qm_db(qm, qp->qp_id, QM_DOORBELL_CMD_CQ, qp->qp_status.cq_head, 1); 979 } 980 981 static int qm_get_complete_eqe_num(struct hisi_qm_poll_data *poll_data) 982 { 983 struct hisi_qm *qm = poll_data->qm; 984 struct qm_eqe *eqe = qm->eqe + qm->status.eq_head; 985 u16 eq_depth = qm->eq_depth; 986 int eqe_num = 0; 987 u16 cqn; 988 989 while (QM_EQE_PHASE(eqe) == qm->status.eqc_phase) { 990 cqn = le32_to_cpu(eqe->dw0) & QM_EQE_CQN_MASK; 991 poll_data->qp_finish_id[eqe_num] = cqn; 992 eqe_num++; 993 994 if (qm->status.eq_head == eq_depth - 1) { 995 qm->status.eqc_phase = !qm->status.eqc_phase; 996 eqe = qm->eqe; 997 qm->status.eq_head = 0; 998 } else { 999 eqe++; 1000 qm->status.eq_head++; 1001 } 1002 1003 if (eqe_num == (eq_depth >> 1) - 1) 1004 break; 1005 } 1006 1007 qm_db(qm, 0, QM_DOORBELL_CMD_EQ, qm->status.eq_head, 0); 1008 1009 return eqe_num; 1010 } 1011 1012 static void qm_work_process(struct work_struct *work) 1013 { 1014 struct hisi_qm_poll_data *poll_data = 1015 container_of(work, struct hisi_qm_poll_data, work); 1016 struct hisi_qm *qm = poll_data->qm; 1017 struct hisi_qp *qp; 1018 int eqe_num, i; 1019 1020 /* Get qp id of completed tasks and re-enable the interrupt. */ 1021 eqe_num = qm_get_complete_eqe_num(poll_data); 1022 for (i = eqe_num - 1; i >= 0; i--) { 1023 qp = &qm->qp_array[poll_data->qp_finish_id[i]]; 1024 if (unlikely(atomic_read(&qp->qp_status.flags) == QP_STOP)) 1025 continue; 1026 1027 if (qp->event_cb) { 1028 qp->event_cb(qp); 1029 continue; 1030 } 1031 1032 if (likely(qp->req_cb)) 1033 qm_poll_req_cb(qp); 1034 } 1035 } 1036 1037 static bool do_qm_irq(struct hisi_qm *qm) 1038 { 1039 struct qm_eqe *eqe = qm->eqe + qm->status.eq_head; 1040 struct hisi_qm_poll_data *poll_data; 1041 u16 cqn; 1042 1043 if (!readl(qm->io_base + QM_VF_EQ_INT_SOURCE)) 1044 return false; 1045 1046 if (QM_EQE_PHASE(eqe) == qm->status.eqc_phase) { 1047 cqn = le32_to_cpu(eqe->dw0) & QM_EQE_CQN_MASK; 1048 poll_data = &qm->poll_data[cqn]; 1049 queue_work(qm->wq, &poll_data->work); 1050 1051 return true; 1052 } 1053 1054 return false; 1055 } 1056 1057 static irqreturn_t qm_irq(int irq, void *data) 1058 { 1059 struct hisi_qm *qm = data; 1060 bool ret; 1061 1062 ret = do_qm_irq(qm); 1063 if (ret) 1064 return IRQ_HANDLED; 1065 1066 atomic64_inc(&qm->debug.dfx.err_irq_cnt); 1067 qm_db(qm, 0, QM_DOORBELL_CMD_EQ, qm->status.eq_head, 0); 1068 1069 return IRQ_NONE; 1070 } 1071 1072 static irqreturn_t qm_mb_cmd_irq(int irq, void *data) 1073 { 1074 struct hisi_qm *qm = data; 1075 u32 val; 1076 1077 val = readl(qm->io_base + QM_IFC_INT_STATUS); 1078 val &= QM_IFC_INT_STATUS_MASK; 1079 if (!val) 1080 return IRQ_NONE; 1081 1082 schedule_work(&qm->cmd_process); 1083 1084 return IRQ_HANDLED; 1085 } 1086 1087 static void qm_set_qp_disable(struct hisi_qp *qp, int offset) 1088 { 1089 u32 *addr; 1090 1091 if (qp->is_in_kernel) 1092 return; 1093 1094 addr = (u32 *)(qp->qdma.va + qp->qdma.size) - offset; 1095 *addr = 1; 1096 1097 /* make sure setup is completed */ 1098 smp_wmb(); 1099 } 1100 1101 static void qm_disable_qp(struct hisi_qm *qm, u32 qp_id) 1102 { 1103 struct hisi_qp *qp = &qm->qp_array[qp_id]; 1104 1105 qm_set_qp_disable(qp, QM_RESET_STOP_TX_OFFSET); 1106 hisi_qm_stop_qp(qp); 1107 qm_set_qp_disable(qp, QM_RESET_STOP_RX_OFFSET); 1108 } 1109 1110 static void qm_reset_function(struct hisi_qm *qm) 1111 { 1112 struct hisi_qm *pf_qm = pci_get_drvdata(pci_physfn(qm->pdev)); 1113 struct device *dev = &qm->pdev->dev; 1114 int ret; 1115 1116 if (qm_check_dev_error(pf_qm)) 1117 return; 1118 1119 ret = qm_reset_prepare_ready(qm); 1120 if (ret) { 1121 dev_err(dev, "reset function not ready\n"); 1122 return; 1123 } 1124 1125 ret = hisi_qm_stop(qm, QM_FLR); 1126 if (ret) { 1127 dev_err(dev, "failed to stop qm when reset function\n"); 1128 goto clear_bit; 1129 } 1130 1131 ret = hisi_qm_start(qm); 1132 if (ret) 1133 dev_err(dev, "failed to start qm when reset function\n"); 1134 1135 clear_bit: 1136 qm_reset_bit_clear(qm); 1137 } 1138 1139 static irqreturn_t qm_aeq_thread(int irq, void *data) 1140 { 1141 struct hisi_qm *qm = data; 1142 struct qm_aeqe *aeqe = qm->aeqe + qm->status.aeq_head; 1143 u16 aeq_depth = qm->aeq_depth; 1144 u32 type, qp_id; 1145 1146 while (QM_AEQE_PHASE(aeqe) == qm->status.aeqc_phase) { 1147 type = le32_to_cpu(aeqe->dw0) >> QM_AEQE_TYPE_SHIFT; 1148 qp_id = le32_to_cpu(aeqe->dw0) & QM_AEQE_CQN_MASK; 1149 1150 switch (type) { 1151 case QM_EQ_OVERFLOW: 1152 dev_err(&qm->pdev->dev, "eq overflow, reset function\n"); 1153 qm_reset_function(qm); 1154 return IRQ_HANDLED; 1155 case QM_CQ_OVERFLOW: 1156 dev_err(&qm->pdev->dev, "cq overflow, stop qp(%u)\n", 1157 qp_id); 1158 fallthrough; 1159 case QM_CQE_ERROR: 1160 qm_disable_qp(qm, qp_id); 1161 break; 1162 default: 1163 dev_err(&qm->pdev->dev, "unknown error type %u\n", 1164 type); 1165 break; 1166 } 1167 1168 if (qm->status.aeq_head == aeq_depth - 1) { 1169 qm->status.aeqc_phase = !qm->status.aeqc_phase; 1170 aeqe = qm->aeqe; 1171 qm->status.aeq_head = 0; 1172 } else { 1173 aeqe++; 1174 qm->status.aeq_head++; 1175 } 1176 } 1177 1178 qm_db(qm, 0, QM_DOORBELL_CMD_AEQ, qm->status.aeq_head, 0); 1179 1180 return IRQ_HANDLED; 1181 } 1182 1183 static irqreturn_t qm_aeq_irq(int irq, void *data) 1184 { 1185 struct hisi_qm *qm = data; 1186 1187 atomic64_inc(&qm->debug.dfx.aeq_irq_cnt); 1188 if (!readl(qm->io_base + QM_VF_AEQ_INT_SOURCE)) 1189 return IRQ_NONE; 1190 1191 return IRQ_WAKE_THREAD; 1192 } 1193 1194 static void qm_init_qp_status(struct hisi_qp *qp) 1195 { 1196 struct hisi_qp_status *qp_status = &qp->qp_status; 1197 1198 qp_status->sq_tail = 0; 1199 qp_status->cq_head = 0; 1200 qp_status->cqc_phase = true; 1201 atomic_set(&qp_status->used, 0); 1202 } 1203 1204 static void qm_init_prefetch(struct hisi_qm *qm) 1205 { 1206 struct device *dev = &qm->pdev->dev; 1207 u32 page_type = 0x0; 1208 1209 if (!test_bit(QM_SUPPORT_SVA_PREFETCH, &qm->caps)) 1210 return; 1211 1212 switch (PAGE_SIZE) { 1213 case SZ_4K: 1214 page_type = 0x0; 1215 break; 1216 case SZ_16K: 1217 page_type = 0x1; 1218 break; 1219 case SZ_64K: 1220 page_type = 0x2; 1221 break; 1222 default: 1223 dev_err(dev, "system page size is not support: %lu, default set to 4KB", 1224 PAGE_SIZE); 1225 } 1226 1227 writel(page_type, qm->io_base + QM_PAGE_SIZE); 1228 } 1229 1230 /* 1231 * acc_shaper_para_calc() Get the IR value by the qos formula, the return value 1232 * is the expected qos calculated. 1233 * the formula: 1234 * IR = X Mbps if ir = 1 means IR = 100 Mbps, if ir = 10000 means = 10Gbps 1235 * 1236 * IR_b * (2 ^ IR_u) * 8000 1237 * IR(Mbps) = ------------------------- 1238 * Tick * (2 ^ IR_s) 1239 */ 1240 static u32 acc_shaper_para_calc(u64 cir_b, u64 cir_u, u64 cir_s) 1241 { 1242 return ((cir_b * QM_QOS_DIVISOR_CLK) * (1 << cir_u)) / 1243 (QM_QOS_TICK * (1 << cir_s)); 1244 } 1245 1246 static u32 acc_shaper_calc_cbs_s(u32 ir) 1247 { 1248 int table_size = ARRAY_SIZE(shaper_cbs_s); 1249 int i; 1250 1251 for (i = 0; i < table_size; i++) { 1252 if (ir >= shaper_cbs_s[i].start && ir <= shaper_cbs_s[i].end) 1253 return shaper_cbs_s[i].val; 1254 } 1255 1256 return QM_SHAPER_MIN_CBS_S; 1257 } 1258 1259 static u32 acc_shaper_calc_cir_s(u32 ir) 1260 { 1261 int table_size = ARRAY_SIZE(shaper_cir_s); 1262 int i; 1263 1264 for (i = 0; i < table_size; i++) { 1265 if (ir >= shaper_cir_s[i].start && ir <= shaper_cir_s[i].end) 1266 return shaper_cir_s[i].val; 1267 } 1268 1269 return 0; 1270 } 1271 1272 static int qm_get_shaper_para(u32 ir, struct qm_shaper_factor *factor) 1273 { 1274 u32 cir_b, cir_u, cir_s, ir_calc; 1275 u32 error_rate; 1276 1277 factor->cbs_s = acc_shaper_calc_cbs_s(ir); 1278 cir_s = acc_shaper_calc_cir_s(ir); 1279 1280 for (cir_b = QM_QOS_MIN_CIR_B; cir_b <= QM_QOS_MAX_CIR_B; cir_b++) { 1281 for (cir_u = 0; cir_u <= QM_QOS_MAX_CIR_U; cir_u++) { 1282 ir_calc = acc_shaper_para_calc(cir_b, cir_u, cir_s); 1283 1284 error_rate = QM_QOS_EXPAND_RATE * (u32)abs(ir_calc - ir) / ir; 1285 if (error_rate <= QM_QOS_MIN_ERROR_RATE) { 1286 factor->cir_b = cir_b; 1287 factor->cir_u = cir_u; 1288 factor->cir_s = cir_s; 1289 return 0; 1290 } 1291 } 1292 } 1293 1294 return -EINVAL; 1295 } 1296 1297 static void qm_vft_data_cfg(struct hisi_qm *qm, enum vft_type type, u32 base, 1298 u32 number, struct qm_shaper_factor *factor) 1299 { 1300 u64 tmp = 0; 1301 1302 if (number > 0) { 1303 switch (type) { 1304 case SQC_VFT: 1305 if (qm->ver == QM_HW_V1) { 1306 tmp = QM_SQC_VFT_BUF_SIZE | 1307 QM_SQC_VFT_SQC_SIZE | 1308 QM_SQC_VFT_INDEX_NUMBER | 1309 QM_SQC_VFT_VALID | 1310 (u64)base << QM_SQC_VFT_START_SQN_SHIFT; 1311 } else { 1312 tmp = (u64)base << QM_SQC_VFT_START_SQN_SHIFT | 1313 QM_SQC_VFT_VALID | 1314 (u64)(number - 1) << QM_SQC_VFT_SQN_SHIFT; 1315 } 1316 break; 1317 case CQC_VFT: 1318 if (qm->ver == QM_HW_V1) { 1319 tmp = QM_CQC_VFT_BUF_SIZE | 1320 QM_CQC_VFT_SQC_SIZE | 1321 QM_CQC_VFT_INDEX_NUMBER | 1322 QM_CQC_VFT_VALID; 1323 } else { 1324 tmp = QM_CQC_VFT_VALID; 1325 } 1326 break; 1327 case SHAPER_VFT: 1328 if (factor) { 1329 tmp = factor->cir_b | 1330 (factor->cir_u << QM_SHAPER_FACTOR_CIR_U_SHIFT) | 1331 (factor->cir_s << QM_SHAPER_FACTOR_CIR_S_SHIFT) | 1332 (QM_SHAPER_CBS_B << QM_SHAPER_FACTOR_CBS_B_SHIFT) | 1333 (factor->cbs_s << QM_SHAPER_FACTOR_CBS_S_SHIFT); 1334 } 1335 break; 1336 } 1337 } 1338 1339 writel(lower_32_bits(tmp), qm->io_base + QM_VFT_CFG_DATA_L); 1340 writel(upper_32_bits(tmp), qm->io_base + QM_VFT_CFG_DATA_H); 1341 } 1342 1343 static int qm_set_vft_common(struct hisi_qm *qm, enum vft_type type, 1344 u32 fun_num, u32 base, u32 number) 1345 { 1346 struct qm_shaper_factor *factor = NULL; 1347 unsigned int val; 1348 int ret; 1349 1350 if (type == SHAPER_VFT && test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps)) 1351 factor = &qm->factor[fun_num]; 1352 1353 ret = readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val, 1354 val & BIT(0), POLL_PERIOD, 1355 POLL_TIMEOUT); 1356 if (ret) 1357 return ret; 1358 1359 writel(0x0, qm->io_base + QM_VFT_CFG_OP_WR); 1360 writel(type, qm->io_base + QM_VFT_CFG_TYPE); 1361 if (type == SHAPER_VFT) 1362 fun_num |= base << QM_SHAPER_VFT_OFFSET; 1363 1364 writel(fun_num, qm->io_base + QM_VFT_CFG); 1365 1366 qm_vft_data_cfg(qm, type, base, number, factor); 1367 1368 writel(0x0, qm->io_base + QM_VFT_CFG_RDY); 1369 writel(0x1, qm->io_base + QM_VFT_CFG_OP_ENABLE); 1370 1371 return readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val, 1372 val & BIT(0), POLL_PERIOD, 1373 POLL_TIMEOUT); 1374 } 1375 1376 static int qm_shaper_init_vft(struct hisi_qm *qm, u32 fun_num) 1377 { 1378 u32 qos = qm->factor[fun_num].func_qos; 1379 int ret, i; 1380 1381 ret = qm_get_shaper_para(qos * QM_QOS_RATE, &qm->factor[fun_num]); 1382 if (ret) { 1383 dev_err(&qm->pdev->dev, "failed to calculate shaper parameter!\n"); 1384 return ret; 1385 } 1386 writel(qm->type_rate, qm->io_base + QM_SHAPER_CFG); 1387 for (i = ALG_TYPE_0; i <= ALG_TYPE_1; i++) { 1388 /* The base number of queue reuse for different alg type */ 1389 ret = qm_set_vft_common(qm, SHAPER_VFT, fun_num, i, 1); 1390 if (ret) 1391 return ret; 1392 } 1393 1394 return 0; 1395 } 1396 1397 /* The config should be conducted after qm_dev_mem_reset() */ 1398 static int qm_set_sqc_cqc_vft(struct hisi_qm *qm, u32 fun_num, u32 base, 1399 u32 number) 1400 { 1401 int ret, i; 1402 1403 for (i = SQC_VFT; i <= CQC_VFT; i++) { 1404 ret = qm_set_vft_common(qm, i, fun_num, base, number); 1405 if (ret) 1406 return ret; 1407 } 1408 1409 /* init default shaper qos val */ 1410 if (test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps)) { 1411 ret = qm_shaper_init_vft(qm, fun_num); 1412 if (ret) 1413 goto back_sqc_cqc; 1414 } 1415 1416 return 0; 1417 back_sqc_cqc: 1418 for (i = SQC_VFT; i <= CQC_VFT; i++) 1419 qm_set_vft_common(qm, i, fun_num, 0, 0); 1420 1421 return ret; 1422 } 1423 1424 static int qm_get_vft_v2(struct hisi_qm *qm, u32 *base, u32 *number) 1425 { 1426 u64 sqc_vft; 1427 int ret; 1428 1429 ret = hisi_qm_mb(qm, QM_MB_CMD_SQC_VFT_V2, 0, 0, 1); 1430 if (ret) 1431 return ret; 1432 1433 sqc_vft = readl(qm->io_base + QM_MB_CMD_DATA_ADDR_L) | 1434 ((u64)readl(qm->io_base + QM_MB_CMD_DATA_ADDR_H) << 32); 1435 *base = QM_SQC_VFT_BASE_MASK_V2 & (sqc_vft >> QM_SQC_VFT_BASE_SHIFT_V2); 1436 *number = (QM_SQC_VFT_NUM_MASK_v2 & 1437 (sqc_vft >> QM_SQC_VFT_NUM_SHIFT_V2)) + 1; 1438 1439 return 0; 1440 } 1441 1442 static int qm_get_vf_qp_num(struct hisi_qm *qm, u32 fun_num) 1443 { 1444 u32 remain_q_num, vfq_num; 1445 u32 num_vfs = qm->vfs_num; 1446 1447 vfq_num = (qm->ctrl_qp_num - qm->qp_num) / num_vfs; 1448 if (vfq_num >= qm->max_qp_num) 1449 return qm->max_qp_num; 1450 1451 remain_q_num = (qm->ctrl_qp_num - qm->qp_num) % num_vfs; 1452 if (vfq_num + remain_q_num <= qm->max_qp_num) 1453 return fun_num == num_vfs ? vfq_num + remain_q_num : vfq_num; 1454 1455 /* 1456 * if vfq_num + remain_q_num > max_qp_num, the last VFs, 1457 * each with one more queue. 1458 */ 1459 return fun_num + remain_q_num > num_vfs ? vfq_num + 1 : vfq_num; 1460 } 1461 1462 static struct hisi_qm *file_to_qm(struct debugfs_file *file) 1463 { 1464 struct qm_debug *debug = file->debug; 1465 1466 return container_of(debug, struct hisi_qm, debug); 1467 } 1468 1469 static u32 current_q_read(struct hisi_qm *qm) 1470 { 1471 return readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) >> QM_DFX_QN_SHIFT; 1472 } 1473 1474 static int current_q_write(struct hisi_qm *qm, u32 val) 1475 { 1476 u32 tmp; 1477 1478 if (val >= qm->debug.curr_qm_qp_num) 1479 return -EINVAL; 1480 1481 tmp = val << QM_DFX_QN_SHIFT | 1482 (readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) & CURRENT_FUN_MASK); 1483 writel(tmp, qm->io_base + QM_DFX_SQE_CNT_VF_SQN); 1484 1485 tmp = val << QM_DFX_QN_SHIFT | 1486 (readl(qm->io_base + QM_DFX_CQE_CNT_VF_CQN) & CURRENT_FUN_MASK); 1487 writel(tmp, qm->io_base + QM_DFX_CQE_CNT_VF_CQN); 1488 1489 return 0; 1490 } 1491 1492 static u32 clear_enable_read(struct hisi_qm *qm) 1493 { 1494 return readl(qm->io_base + QM_DFX_CNT_CLR_CE); 1495 } 1496 1497 /* rd_clr_ctrl 1 enable read clear, otherwise 0 disable it */ 1498 static int clear_enable_write(struct hisi_qm *qm, u32 rd_clr_ctrl) 1499 { 1500 if (rd_clr_ctrl > 1) 1501 return -EINVAL; 1502 1503 writel(rd_clr_ctrl, qm->io_base + QM_DFX_CNT_CLR_CE); 1504 1505 return 0; 1506 } 1507 1508 static u32 current_qm_read(struct hisi_qm *qm) 1509 { 1510 return readl(qm->io_base + QM_DFX_MB_CNT_VF); 1511 } 1512 1513 static int current_qm_write(struct hisi_qm *qm, u32 val) 1514 { 1515 u32 tmp; 1516 1517 if (val > qm->vfs_num) 1518 return -EINVAL; 1519 1520 /* According PF or VF Dev ID to calculation curr_qm_qp_num and store */ 1521 if (!val) 1522 qm->debug.curr_qm_qp_num = qm->qp_num; 1523 else 1524 qm->debug.curr_qm_qp_num = qm_get_vf_qp_num(qm, val); 1525 1526 writel(val, qm->io_base + QM_DFX_MB_CNT_VF); 1527 writel(val, qm->io_base + QM_DFX_DB_CNT_VF); 1528 1529 tmp = val | 1530 (readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) & CURRENT_Q_MASK); 1531 writel(tmp, qm->io_base + QM_DFX_SQE_CNT_VF_SQN); 1532 1533 tmp = val | 1534 (readl(qm->io_base + QM_DFX_CQE_CNT_VF_CQN) & CURRENT_Q_MASK); 1535 writel(tmp, qm->io_base + QM_DFX_CQE_CNT_VF_CQN); 1536 1537 return 0; 1538 } 1539 1540 static ssize_t qm_debug_read(struct file *filp, char __user *buf, 1541 size_t count, loff_t *pos) 1542 { 1543 struct debugfs_file *file = filp->private_data; 1544 enum qm_debug_file index = file->index; 1545 struct hisi_qm *qm = file_to_qm(file); 1546 char tbuf[QM_DBG_TMP_BUF_LEN]; 1547 u32 val; 1548 int ret; 1549 1550 ret = hisi_qm_get_dfx_access(qm); 1551 if (ret) 1552 return ret; 1553 1554 mutex_lock(&file->lock); 1555 switch (index) { 1556 case CURRENT_QM: 1557 val = current_qm_read(qm); 1558 break; 1559 case CURRENT_Q: 1560 val = current_q_read(qm); 1561 break; 1562 case CLEAR_ENABLE: 1563 val = clear_enable_read(qm); 1564 break; 1565 default: 1566 goto err_input; 1567 } 1568 mutex_unlock(&file->lock); 1569 1570 hisi_qm_put_dfx_access(qm); 1571 ret = scnprintf(tbuf, QM_DBG_TMP_BUF_LEN, "%u\n", val); 1572 return simple_read_from_buffer(buf, count, pos, tbuf, ret); 1573 1574 err_input: 1575 mutex_unlock(&file->lock); 1576 hisi_qm_put_dfx_access(qm); 1577 return -EINVAL; 1578 } 1579 1580 static ssize_t qm_debug_write(struct file *filp, const char __user *buf, 1581 size_t count, loff_t *pos) 1582 { 1583 struct debugfs_file *file = filp->private_data; 1584 enum qm_debug_file index = file->index; 1585 struct hisi_qm *qm = file_to_qm(file); 1586 unsigned long val; 1587 char tbuf[QM_DBG_TMP_BUF_LEN]; 1588 int len, ret; 1589 1590 if (*pos != 0) 1591 return 0; 1592 1593 if (count >= QM_DBG_TMP_BUF_LEN) 1594 return -ENOSPC; 1595 1596 len = simple_write_to_buffer(tbuf, QM_DBG_TMP_BUF_LEN - 1, pos, buf, 1597 count); 1598 if (len < 0) 1599 return len; 1600 1601 tbuf[len] = '\0'; 1602 if (kstrtoul(tbuf, 0, &val)) 1603 return -EFAULT; 1604 1605 ret = hisi_qm_get_dfx_access(qm); 1606 if (ret) 1607 return ret; 1608 1609 mutex_lock(&file->lock); 1610 switch (index) { 1611 case CURRENT_QM: 1612 ret = current_qm_write(qm, val); 1613 break; 1614 case CURRENT_Q: 1615 ret = current_q_write(qm, val); 1616 break; 1617 case CLEAR_ENABLE: 1618 ret = clear_enable_write(qm, val); 1619 break; 1620 default: 1621 ret = -EINVAL; 1622 } 1623 mutex_unlock(&file->lock); 1624 1625 hisi_qm_put_dfx_access(qm); 1626 1627 if (ret) 1628 return ret; 1629 1630 return count; 1631 } 1632 1633 static const struct file_operations qm_debug_fops = { 1634 .owner = THIS_MODULE, 1635 .open = simple_open, 1636 .read = qm_debug_read, 1637 .write = qm_debug_write, 1638 }; 1639 1640 #define CNT_CYC_REGS_NUM 10 1641 static const struct debugfs_reg32 qm_dfx_regs[] = { 1642 /* XXX_CNT are reading clear register */ 1643 {"QM_ECC_1BIT_CNT ", 0x104000ull}, 1644 {"QM_ECC_MBIT_CNT ", 0x104008ull}, 1645 {"QM_DFX_MB_CNT ", 0x104018ull}, 1646 {"QM_DFX_DB_CNT ", 0x104028ull}, 1647 {"QM_DFX_SQE_CNT ", 0x104038ull}, 1648 {"QM_DFX_CQE_CNT ", 0x104048ull}, 1649 {"QM_DFX_SEND_SQE_TO_ACC_CNT ", 0x104050ull}, 1650 {"QM_DFX_WB_SQE_FROM_ACC_CNT ", 0x104058ull}, 1651 {"QM_DFX_ACC_FINISH_CNT ", 0x104060ull}, 1652 {"QM_DFX_CQE_ERR_CNT ", 0x1040b4ull}, 1653 {"QM_DFX_FUNS_ACTIVE_ST ", 0x200ull}, 1654 {"QM_ECC_1BIT_INF ", 0x104004ull}, 1655 {"QM_ECC_MBIT_INF ", 0x10400cull}, 1656 {"QM_DFX_ACC_RDY_VLD0 ", 0x1040a0ull}, 1657 {"QM_DFX_ACC_RDY_VLD1 ", 0x1040a4ull}, 1658 {"QM_DFX_AXI_RDY_VLD ", 0x1040a8ull}, 1659 {"QM_DFX_FF_ST0 ", 0x1040c8ull}, 1660 {"QM_DFX_FF_ST1 ", 0x1040ccull}, 1661 {"QM_DFX_FF_ST2 ", 0x1040d0ull}, 1662 {"QM_DFX_FF_ST3 ", 0x1040d4ull}, 1663 {"QM_DFX_FF_ST4 ", 0x1040d8ull}, 1664 {"QM_DFX_FF_ST5 ", 0x1040dcull}, 1665 {"QM_DFX_FF_ST6 ", 0x1040e0ull}, 1666 {"QM_IN_IDLE_ST ", 0x1040e4ull}, 1667 }; 1668 1669 static const struct debugfs_reg32 qm_vf_dfx_regs[] = { 1670 {"QM_DFX_FUNS_ACTIVE_ST ", 0x200ull}, 1671 }; 1672 1673 /** 1674 * hisi_qm_regs_dump() - Dump registers's value. 1675 * @s: debugfs file handle. 1676 * @regset: accelerator registers information. 1677 * 1678 * Dump accelerator registers. 1679 */ 1680 void hisi_qm_regs_dump(struct seq_file *s, struct debugfs_regset32 *regset) 1681 { 1682 struct pci_dev *pdev = to_pci_dev(regset->dev); 1683 struct hisi_qm *qm = pci_get_drvdata(pdev); 1684 const struct debugfs_reg32 *regs = regset->regs; 1685 int regs_len = regset->nregs; 1686 int i, ret; 1687 u32 val; 1688 1689 ret = hisi_qm_get_dfx_access(qm); 1690 if (ret) 1691 return; 1692 1693 for (i = 0; i < regs_len; i++) { 1694 val = readl(regset->base + regs[i].offset); 1695 seq_printf(s, "%s= 0x%08x\n", regs[i].name, val); 1696 } 1697 1698 hisi_qm_put_dfx_access(qm); 1699 } 1700 EXPORT_SYMBOL_GPL(hisi_qm_regs_dump); 1701 1702 static int qm_regs_show(struct seq_file *s, void *unused) 1703 { 1704 struct hisi_qm *qm = s->private; 1705 struct debugfs_regset32 regset; 1706 1707 if (qm->fun_type == QM_HW_PF) { 1708 regset.regs = qm_dfx_regs; 1709 regset.nregs = ARRAY_SIZE(qm_dfx_regs); 1710 } else { 1711 regset.regs = qm_vf_dfx_regs; 1712 regset.nregs = ARRAY_SIZE(qm_vf_dfx_regs); 1713 } 1714 1715 regset.base = qm->io_base; 1716 regset.dev = &qm->pdev->dev; 1717 1718 hisi_qm_regs_dump(s, ®set); 1719 1720 return 0; 1721 } 1722 1723 DEFINE_SHOW_ATTRIBUTE(qm_regs); 1724 1725 static struct dfx_diff_registers *dfx_regs_init(struct hisi_qm *qm, 1726 const struct dfx_diff_registers *cregs, int reg_len) 1727 { 1728 struct dfx_diff_registers *diff_regs; 1729 u32 j, base_offset; 1730 int i; 1731 1732 diff_regs = kcalloc(reg_len, sizeof(*diff_regs), GFP_KERNEL); 1733 if (!diff_regs) 1734 return ERR_PTR(-ENOMEM); 1735 1736 for (i = 0; i < reg_len; i++) { 1737 if (!cregs[i].reg_len) 1738 continue; 1739 1740 diff_regs[i].reg_offset = cregs[i].reg_offset; 1741 diff_regs[i].reg_len = cregs[i].reg_len; 1742 diff_regs[i].regs = kcalloc(QM_DFX_REGS_LEN, cregs[i].reg_len, 1743 GFP_KERNEL); 1744 if (!diff_regs[i].regs) 1745 goto alloc_error; 1746 1747 for (j = 0; j < diff_regs[i].reg_len; j++) { 1748 base_offset = diff_regs[i].reg_offset + 1749 j * QM_DFX_REGS_LEN; 1750 diff_regs[i].regs[j] = readl(qm->io_base + base_offset); 1751 } 1752 } 1753 1754 return diff_regs; 1755 1756 alloc_error: 1757 while (i > 0) { 1758 i--; 1759 kfree(diff_regs[i].regs); 1760 } 1761 kfree(diff_regs); 1762 return ERR_PTR(-ENOMEM); 1763 } 1764 1765 static void dfx_regs_uninit(struct hisi_qm *qm, 1766 struct dfx_diff_registers *dregs, int reg_len) 1767 { 1768 int i; 1769 1770 /* Setting the pointer is NULL to prevent double free */ 1771 for (i = 0; i < reg_len; i++) { 1772 kfree(dregs[i].regs); 1773 dregs[i].regs = NULL; 1774 } 1775 kfree(dregs); 1776 dregs = NULL; 1777 } 1778 1779 /** 1780 * hisi_qm_diff_regs_init() - Allocate memory for registers. 1781 * @qm: device qm handle. 1782 * @dregs: diff registers handle. 1783 * @reg_len: diff registers region length. 1784 */ 1785 int hisi_qm_diff_regs_init(struct hisi_qm *qm, 1786 struct dfx_diff_registers *dregs, int reg_len) 1787 { 1788 if (!qm || !dregs || reg_len <= 0) 1789 return -EINVAL; 1790 1791 if (qm->fun_type != QM_HW_PF) 1792 return 0; 1793 1794 qm->debug.qm_diff_regs = dfx_regs_init(qm, qm_diff_regs, 1795 ARRAY_SIZE(qm_diff_regs)); 1796 if (IS_ERR(qm->debug.qm_diff_regs)) 1797 return PTR_ERR(qm->debug.qm_diff_regs); 1798 1799 qm->debug.acc_diff_regs = dfx_regs_init(qm, dregs, reg_len); 1800 if (IS_ERR(qm->debug.acc_diff_regs)) { 1801 dfx_regs_uninit(qm, qm->debug.qm_diff_regs, 1802 ARRAY_SIZE(qm_diff_regs)); 1803 return PTR_ERR(qm->debug.acc_diff_regs); 1804 } 1805 1806 return 0; 1807 } 1808 EXPORT_SYMBOL_GPL(hisi_qm_diff_regs_init); 1809 1810 /** 1811 * hisi_qm_diff_regs_uninit() - Free memory for registers. 1812 * @qm: device qm handle. 1813 * @reg_len: diff registers region length. 1814 */ 1815 void hisi_qm_diff_regs_uninit(struct hisi_qm *qm, int reg_len) 1816 { 1817 if (!qm || reg_len <= 0 || qm->fun_type != QM_HW_PF) 1818 return; 1819 1820 dfx_regs_uninit(qm, qm->debug.acc_diff_regs, reg_len); 1821 dfx_regs_uninit(qm, qm->debug.qm_diff_regs, ARRAY_SIZE(qm_diff_regs)); 1822 } 1823 EXPORT_SYMBOL_GPL(hisi_qm_diff_regs_uninit); 1824 1825 /** 1826 * hisi_qm_acc_diff_regs_dump() - Dump registers's value. 1827 * @qm: device qm handle. 1828 * @s: Debugfs file handle. 1829 * @dregs: diff registers handle. 1830 * @regs_len: diff registers region length. 1831 */ 1832 void hisi_qm_acc_diff_regs_dump(struct hisi_qm *qm, struct seq_file *s, 1833 struct dfx_diff_registers *dregs, int regs_len) 1834 { 1835 u32 j, val, base_offset; 1836 int i, ret; 1837 1838 if (!qm || !s || !dregs || regs_len <= 0) 1839 return; 1840 1841 ret = hisi_qm_get_dfx_access(qm); 1842 if (ret) 1843 return; 1844 1845 down_read(&qm->qps_lock); 1846 for (i = 0; i < regs_len; i++) { 1847 if (!dregs[i].reg_len) 1848 continue; 1849 1850 for (j = 0; j < dregs[i].reg_len; j++) { 1851 base_offset = dregs[i].reg_offset + j * QM_DFX_REGS_LEN; 1852 val = readl(qm->io_base + base_offset); 1853 if (val != dregs[i].regs[j]) 1854 seq_printf(s, "0x%08x = 0x%08x ---> 0x%08x\n", 1855 base_offset, dregs[i].regs[j], val); 1856 } 1857 } 1858 up_read(&qm->qps_lock); 1859 1860 hisi_qm_put_dfx_access(qm); 1861 } 1862 EXPORT_SYMBOL_GPL(hisi_qm_acc_diff_regs_dump); 1863 1864 static int qm_diff_regs_show(struct seq_file *s, void *unused) 1865 { 1866 struct hisi_qm *qm = s->private; 1867 1868 hisi_qm_acc_diff_regs_dump(qm, s, qm->debug.qm_diff_regs, 1869 ARRAY_SIZE(qm_diff_regs)); 1870 1871 return 0; 1872 } 1873 DEFINE_SHOW_ATTRIBUTE(qm_diff_regs); 1874 1875 static ssize_t qm_cmd_read(struct file *filp, char __user *buffer, 1876 size_t count, loff_t *pos) 1877 { 1878 char buf[QM_DBG_READ_LEN]; 1879 int len; 1880 1881 len = scnprintf(buf, QM_DBG_READ_LEN, "%s\n", 1882 "Please echo help to cmd to get help information"); 1883 1884 return simple_read_from_buffer(buffer, count, pos, buf, len); 1885 } 1886 1887 static void *qm_ctx_alloc(struct hisi_qm *qm, size_t ctx_size, 1888 dma_addr_t *dma_addr) 1889 { 1890 struct device *dev = &qm->pdev->dev; 1891 void *ctx_addr; 1892 1893 ctx_addr = kzalloc(ctx_size, GFP_KERNEL); 1894 if (!ctx_addr) 1895 return ERR_PTR(-ENOMEM); 1896 1897 *dma_addr = dma_map_single(dev, ctx_addr, ctx_size, DMA_FROM_DEVICE); 1898 if (dma_mapping_error(dev, *dma_addr)) { 1899 dev_err(dev, "DMA mapping error!\n"); 1900 kfree(ctx_addr); 1901 return ERR_PTR(-ENOMEM); 1902 } 1903 1904 return ctx_addr; 1905 } 1906 1907 static void qm_ctx_free(struct hisi_qm *qm, size_t ctx_size, 1908 const void *ctx_addr, dma_addr_t *dma_addr) 1909 { 1910 struct device *dev = &qm->pdev->dev; 1911 1912 dma_unmap_single(dev, *dma_addr, ctx_size, DMA_FROM_DEVICE); 1913 kfree(ctx_addr); 1914 } 1915 1916 static void dump_show(struct hisi_qm *qm, void *info, 1917 unsigned int info_size, char *info_name) 1918 { 1919 struct device *dev = &qm->pdev->dev; 1920 u8 *info_curr = info; 1921 u32 i; 1922 #define BYTE_PER_DW 4 1923 1924 dev_info(dev, "%s DUMP\n", info_name); 1925 for (i = 0; i < info_size; i += BYTE_PER_DW, info_curr += BYTE_PER_DW) { 1926 pr_info("DW%u: %02X%02X %02X%02X\n", i / BYTE_PER_DW, 1927 *(info_curr + 3), *(info_curr + 2), *(info_curr + 1), *(info_curr)); 1928 } 1929 } 1930 1931 static int qm_dump_sqc_raw(struct hisi_qm *qm, dma_addr_t dma_addr, u16 qp_id) 1932 { 1933 return hisi_qm_mb(qm, QM_MB_CMD_SQC, dma_addr, qp_id, 1); 1934 } 1935 1936 static int qm_dump_cqc_raw(struct hisi_qm *qm, dma_addr_t dma_addr, u16 qp_id) 1937 { 1938 return hisi_qm_mb(qm, QM_MB_CMD_CQC, dma_addr, qp_id, 1); 1939 } 1940 1941 static int qm_sqc_dump(struct hisi_qm *qm, const char *s) 1942 { 1943 struct device *dev = &qm->pdev->dev; 1944 struct qm_sqc *sqc, *sqc_curr; 1945 dma_addr_t sqc_dma; 1946 u32 qp_id; 1947 int ret; 1948 1949 if (!s) 1950 return -EINVAL; 1951 1952 ret = kstrtou32(s, 0, &qp_id); 1953 if (ret || qp_id >= qm->qp_num) { 1954 dev_err(dev, "Please input qp num (0-%u)", qm->qp_num - 1); 1955 return -EINVAL; 1956 } 1957 1958 sqc = qm_ctx_alloc(qm, sizeof(*sqc), &sqc_dma); 1959 if (IS_ERR(sqc)) 1960 return PTR_ERR(sqc); 1961 1962 ret = qm_dump_sqc_raw(qm, sqc_dma, qp_id); 1963 if (ret) { 1964 down_read(&qm->qps_lock); 1965 if (qm->sqc) { 1966 sqc_curr = qm->sqc + qp_id; 1967 1968 dump_show(qm, sqc_curr, sizeof(*sqc), "SOFT SQC"); 1969 } 1970 up_read(&qm->qps_lock); 1971 1972 goto free_ctx; 1973 } 1974 1975 dump_show(qm, sqc, sizeof(*sqc), "SQC"); 1976 1977 free_ctx: 1978 qm_ctx_free(qm, sizeof(*sqc), sqc, &sqc_dma); 1979 return 0; 1980 } 1981 1982 static int qm_cqc_dump(struct hisi_qm *qm, const char *s) 1983 { 1984 struct device *dev = &qm->pdev->dev; 1985 struct qm_cqc *cqc, *cqc_curr; 1986 dma_addr_t cqc_dma; 1987 u32 qp_id; 1988 int ret; 1989 1990 if (!s) 1991 return -EINVAL; 1992 1993 ret = kstrtou32(s, 0, &qp_id); 1994 if (ret || qp_id >= qm->qp_num) { 1995 dev_err(dev, "Please input qp num (0-%u)", qm->qp_num - 1); 1996 return -EINVAL; 1997 } 1998 1999 cqc = qm_ctx_alloc(qm, sizeof(*cqc), &cqc_dma); 2000 if (IS_ERR(cqc)) 2001 return PTR_ERR(cqc); 2002 2003 ret = qm_dump_cqc_raw(qm, cqc_dma, qp_id); 2004 if (ret) { 2005 down_read(&qm->qps_lock); 2006 if (qm->cqc) { 2007 cqc_curr = qm->cqc + qp_id; 2008 2009 dump_show(qm, cqc_curr, sizeof(*cqc), "SOFT CQC"); 2010 } 2011 up_read(&qm->qps_lock); 2012 2013 goto free_ctx; 2014 } 2015 2016 dump_show(qm, cqc, sizeof(*cqc), "CQC"); 2017 2018 free_ctx: 2019 qm_ctx_free(qm, sizeof(*cqc), cqc, &cqc_dma); 2020 return 0; 2021 } 2022 2023 static int qm_eqc_aeqc_dump(struct hisi_qm *qm, char *s, size_t size, 2024 int cmd, char *name) 2025 { 2026 struct device *dev = &qm->pdev->dev; 2027 dma_addr_t xeqc_dma; 2028 void *xeqc; 2029 int ret; 2030 2031 if (strsep(&s, " ")) { 2032 dev_err(dev, "Please do not input extra characters!\n"); 2033 return -EINVAL; 2034 } 2035 2036 xeqc = qm_ctx_alloc(qm, size, &xeqc_dma); 2037 if (IS_ERR(xeqc)) 2038 return PTR_ERR(xeqc); 2039 2040 ret = hisi_qm_mb(qm, cmd, xeqc_dma, 0, 1); 2041 if (ret) 2042 goto err_free_ctx; 2043 2044 dump_show(qm, xeqc, size, name); 2045 2046 err_free_ctx: 2047 qm_ctx_free(qm, size, xeqc, &xeqc_dma); 2048 return ret; 2049 } 2050 2051 static int q_dump_param_parse(struct hisi_qm *qm, char *s, 2052 u32 *e_id, u32 *q_id, u16 q_depth) 2053 { 2054 struct device *dev = &qm->pdev->dev; 2055 unsigned int qp_num = qm->qp_num; 2056 char *presult; 2057 int ret; 2058 2059 presult = strsep(&s, " "); 2060 if (!presult) { 2061 dev_err(dev, "Please input qp number!\n"); 2062 return -EINVAL; 2063 } 2064 2065 ret = kstrtou32(presult, 0, q_id); 2066 if (ret || *q_id >= qp_num) { 2067 dev_err(dev, "Please input qp num (0-%u)", qp_num - 1); 2068 return -EINVAL; 2069 } 2070 2071 presult = strsep(&s, " "); 2072 if (!presult) { 2073 dev_err(dev, "Please input sqe number!\n"); 2074 return -EINVAL; 2075 } 2076 2077 ret = kstrtou32(presult, 0, e_id); 2078 if (ret || *e_id >= q_depth) { 2079 dev_err(dev, "Please input sqe num (0-%u)", q_depth - 1); 2080 return -EINVAL; 2081 } 2082 2083 if (strsep(&s, " ")) { 2084 dev_err(dev, "Please do not input extra characters!\n"); 2085 return -EINVAL; 2086 } 2087 2088 return 0; 2089 } 2090 2091 static int qm_sq_dump(struct hisi_qm *qm, char *s) 2092 { 2093 u16 sq_depth = qm->qp_array->cq_depth; 2094 void *sqe, *sqe_curr; 2095 struct hisi_qp *qp; 2096 u32 qp_id, sqe_id; 2097 int ret; 2098 2099 ret = q_dump_param_parse(qm, s, &sqe_id, &qp_id, sq_depth); 2100 if (ret) 2101 return ret; 2102 2103 sqe = kzalloc(qm->sqe_size * sq_depth, GFP_KERNEL); 2104 if (!sqe) 2105 return -ENOMEM; 2106 2107 qp = &qm->qp_array[qp_id]; 2108 memcpy(sqe, qp->sqe, qm->sqe_size * sq_depth); 2109 sqe_curr = sqe + (u32)(sqe_id * qm->sqe_size); 2110 memset(sqe_curr + qm->debug.sqe_mask_offset, QM_SQE_ADDR_MASK, 2111 qm->debug.sqe_mask_len); 2112 2113 dump_show(qm, sqe_curr, qm->sqe_size, "SQE"); 2114 2115 kfree(sqe); 2116 2117 return 0; 2118 } 2119 2120 static int qm_cq_dump(struct hisi_qm *qm, char *s) 2121 { 2122 struct qm_cqe *cqe_curr; 2123 struct hisi_qp *qp; 2124 u32 qp_id, cqe_id; 2125 int ret; 2126 2127 ret = q_dump_param_parse(qm, s, &cqe_id, &qp_id, qm->qp_array->cq_depth); 2128 if (ret) 2129 return ret; 2130 2131 qp = &qm->qp_array[qp_id]; 2132 cqe_curr = qp->cqe + cqe_id; 2133 dump_show(qm, cqe_curr, sizeof(struct qm_cqe), "CQE"); 2134 2135 return 0; 2136 } 2137 2138 static int qm_eq_aeq_dump(struct hisi_qm *qm, const char *s, 2139 size_t size, char *name) 2140 { 2141 struct device *dev = &qm->pdev->dev; 2142 void *xeqe; 2143 u32 xeqe_id; 2144 int ret; 2145 2146 if (!s) 2147 return -EINVAL; 2148 2149 ret = kstrtou32(s, 0, &xeqe_id); 2150 if (ret) 2151 return -EINVAL; 2152 2153 if (!strcmp(name, "EQE") && xeqe_id >= qm->eq_depth) { 2154 dev_err(dev, "Please input eqe num (0-%u)", qm->eq_depth - 1); 2155 return -EINVAL; 2156 } else if (!strcmp(name, "AEQE") && xeqe_id >= qm->aeq_depth) { 2157 dev_err(dev, "Please input aeqe num (0-%u)", qm->eq_depth - 1); 2158 return -EINVAL; 2159 } 2160 2161 down_read(&qm->qps_lock); 2162 2163 if (qm->eqe && !strcmp(name, "EQE")) { 2164 xeqe = qm->eqe + xeqe_id; 2165 } else if (qm->aeqe && !strcmp(name, "AEQE")) { 2166 xeqe = qm->aeqe + xeqe_id; 2167 } else { 2168 ret = -EINVAL; 2169 goto err_unlock; 2170 } 2171 2172 dump_show(qm, xeqe, size, name); 2173 2174 err_unlock: 2175 up_read(&qm->qps_lock); 2176 return ret; 2177 } 2178 2179 static int qm_dbg_help(struct hisi_qm *qm, char *s) 2180 { 2181 struct device *dev = &qm->pdev->dev; 2182 2183 if (strsep(&s, " ")) { 2184 dev_err(dev, "Please do not input extra characters!\n"); 2185 return -EINVAL; 2186 } 2187 2188 dev_info(dev, "available commands:\n"); 2189 dev_info(dev, "sqc <num>\n"); 2190 dev_info(dev, "cqc <num>\n"); 2191 dev_info(dev, "eqc\n"); 2192 dev_info(dev, "aeqc\n"); 2193 dev_info(dev, "sq <num> <e>\n"); 2194 dev_info(dev, "cq <num> <e>\n"); 2195 dev_info(dev, "eq <e>\n"); 2196 dev_info(dev, "aeq <e>\n"); 2197 2198 return 0; 2199 } 2200 2201 static int qm_cmd_write_dump(struct hisi_qm *qm, const char *cmd_buf) 2202 { 2203 struct device *dev = &qm->pdev->dev; 2204 char *presult, *s, *s_tmp; 2205 int ret; 2206 2207 s = kstrdup(cmd_buf, GFP_KERNEL); 2208 if (!s) 2209 return -ENOMEM; 2210 2211 s_tmp = s; 2212 presult = strsep(&s, " "); 2213 if (!presult) { 2214 ret = -EINVAL; 2215 goto err_buffer_free; 2216 } 2217 2218 if (!strcmp(presult, "sqc")) 2219 ret = qm_sqc_dump(qm, s); 2220 else if (!strcmp(presult, "cqc")) 2221 ret = qm_cqc_dump(qm, s); 2222 else if (!strcmp(presult, "eqc")) 2223 ret = qm_eqc_aeqc_dump(qm, s, sizeof(struct qm_eqc), 2224 QM_MB_CMD_EQC, "EQC"); 2225 else if (!strcmp(presult, "aeqc")) 2226 ret = qm_eqc_aeqc_dump(qm, s, sizeof(struct qm_aeqc), 2227 QM_MB_CMD_AEQC, "AEQC"); 2228 else if (!strcmp(presult, "sq")) 2229 ret = qm_sq_dump(qm, s); 2230 else if (!strcmp(presult, "cq")) 2231 ret = qm_cq_dump(qm, s); 2232 else if (!strcmp(presult, "eq")) 2233 ret = qm_eq_aeq_dump(qm, s, sizeof(struct qm_eqe), "EQE"); 2234 else if (!strcmp(presult, "aeq")) 2235 ret = qm_eq_aeq_dump(qm, s, sizeof(struct qm_aeqe), "AEQE"); 2236 else if (!strcmp(presult, "help")) 2237 ret = qm_dbg_help(qm, s); 2238 else 2239 ret = -EINVAL; 2240 2241 if (ret) 2242 dev_info(dev, "Please echo help\n"); 2243 2244 err_buffer_free: 2245 kfree(s_tmp); 2246 2247 return ret; 2248 } 2249 2250 static ssize_t qm_cmd_write(struct file *filp, const char __user *buffer, 2251 size_t count, loff_t *pos) 2252 { 2253 struct hisi_qm *qm = filp->private_data; 2254 char *cmd_buf, *cmd_buf_tmp; 2255 int ret; 2256 2257 if (*pos) 2258 return 0; 2259 2260 ret = hisi_qm_get_dfx_access(qm); 2261 if (ret) 2262 return ret; 2263 2264 /* Judge if the instance is being reset. */ 2265 if (unlikely(atomic_read(&qm->status.flags) == QM_STOP)) { 2266 ret = 0; 2267 goto put_dfx_access; 2268 } 2269 2270 if (count > QM_DBG_WRITE_LEN) { 2271 ret = -ENOSPC; 2272 goto put_dfx_access; 2273 } 2274 2275 cmd_buf = memdup_user_nul(buffer, count); 2276 if (IS_ERR(cmd_buf)) { 2277 ret = PTR_ERR(cmd_buf); 2278 goto put_dfx_access; 2279 } 2280 2281 cmd_buf_tmp = strchr(cmd_buf, '\n'); 2282 if (cmd_buf_tmp) { 2283 *cmd_buf_tmp = '\0'; 2284 count = cmd_buf_tmp - cmd_buf + 1; 2285 } 2286 2287 ret = qm_cmd_write_dump(qm, cmd_buf); 2288 if (ret) { 2289 kfree(cmd_buf); 2290 goto put_dfx_access; 2291 } 2292 2293 kfree(cmd_buf); 2294 2295 ret = count; 2296 2297 put_dfx_access: 2298 hisi_qm_put_dfx_access(qm); 2299 return ret; 2300 } 2301 2302 static const struct file_operations qm_cmd_fops = { 2303 .owner = THIS_MODULE, 2304 .open = simple_open, 2305 .read = qm_cmd_read, 2306 .write = qm_cmd_write, 2307 }; 2308 2309 static void qm_create_debugfs_file(struct hisi_qm *qm, struct dentry *dir, 2310 enum qm_debug_file index) 2311 { 2312 struct debugfs_file *file = qm->debug.files + index; 2313 2314 debugfs_create_file(qm_debug_file_name[index], 0600, dir, file, 2315 &qm_debug_fops); 2316 2317 file->index = index; 2318 mutex_init(&file->lock); 2319 file->debug = &qm->debug; 2320 } 2321 2322 static void qm_hw_error_init_v1(struct hisi_qm *qm) 2323 { 2324 writel(QM_ABNORMAL_INT_MASK_VALUE, qm->io_base + QM_ABNORMAL_INT_MASK); 2325 } 2326 2327 static void qm_hw_error_cfg(struct hisi_qm *qm) 2328 { 2329 struct hisi_qm_err_info *err_info = &qm->err_info; 2330 2331 qm->error_mask = err_info->nfe | err_info->ce | err_info->fe; 2332 /* clear QM hw residual error source */ 2333 writel(qm->error_mask, qm->io_base + QM_ABNORMAL_INT_SOURCE); 2334 2335 /* configure error type */ 2336 writel(err_info->ce, qm->io_base + QM_RAS_CE_ENABLE); 2337 writel(QM_RAS_CE_TIMES_PER_IRQ, qm->io_base + QM_RAS_CE_THRESHOLD); 2338 writel(err_info->nfe, qm->io_base + QM_RAS_NFE_ENABLE); 2339 writel(err_info->fe, qm->io_base + QM_RAS_FE_ENABLE); 2340 } 2341 2342 static void qm_hw_error_init_v2(struct hisi_qm *qm) 2343 { 2344 u32 irq_unmask; 2345 2346 qm_hw_error_cfg(qm); 2347 2348 irq_unmask = ~qm->error_mask; 2349 irq_unmask &= readl(qm->io_base + QM_ABNORMAL_INT_MASK); 2350 writel(irq_unmask, qm->io_base + QM_ABNORMAL_INT_MASK); 2351 } 2352 2353 static void qm_hw_error_uninit_v2(struct hisi_qm *qm) 2354 { 2355 u32 irq_mask = qm->error_mask; 2356 2357 irq_mask |= readl(qm->io_base + QM_ABNORMAL_INT_MASK); 2358 writel(irq_mask, qm->io_base + QM_ABNORMAL_INT_MASK); 2359 } 2360 2361 static void qm_hw_error_init_v3(struct hisi_qm *qm) 2362 { 2363 u32 irq_unmask; 2364 2365 qm_hw_error_cfg(qm); 2366 2367 /* enable close master ooo when hardware error happened */ 2368 writel(qm->err_info.qm_shutdown_mask, qm->io_base + QM_OOO_SHUTDOWN_SEL); 2369 2370 irq_unmask = ~qm->error_mask; 2371 irq_unmask &= readl(qm->io_base + QM_ABNORMAL_INT_MASK); 2372 writel(irq_unmask, qm->io_base + QM_ABNORMAL_INT_MASK); 2373 } 2374 2375 static void qm_hw_error_uninit_v3(struct hisi_qm *qm) 2376 { 2377 u32 irq_mask = qm->error_mask; 2378 2379 irq_mask |= readl(qm->io_base + QM_ABNORMAL_INT_MASK); 2380 writel(irq_mask, qm->io_base + QM_ABNORMAL_INT_MASK); 2381 2382 /* disable close master ooo when hardware error happened */ 2383 writel(0x0, qm->io_base + QM_OOO_SHUTDOWN_SEL); 2384 } 2385 2386 static void qm_log_hw_error(struct hisi_qm *qm, u32 error_status) 2387 { 2388 const struct hisi_qm_hw_error *err; 2389 struct device *dev = &qm->pdev->dev; 2390 u32 reg_val, type, vf_num; 2391 int i; 2392 2393 for (i = 0; i < ARRAY_SIZE(qm_hw_error); i++) { 2394 err = &qm_hw_error[i]; 2395 if (!(err->int_msk & error_status)) 2396 continue; 2397 2398 dev_err(dev, "%s [error status=0x%x] found\n", 2399 err->msg, err->int_msk); 2400 2401 if (err->int_msk & QM_DB_TIMEOUT) { 2402 reg_val = readl(qm->io_base + QM_ABNORMAL_INF01); 2403 type = (reg_val & QM_DB_TIMEOUT_TYPE) >> 2404 QM_DB_TIMEOUT_TYPE_SHIFT; 2405 vf_num = reg_val & QM_DB_TIMEOUT_VF; 2406 dev_err(dev, "qm %s doorbell timeout in function %u\n", 2407 qm_db_timeout[type], vf_num); 2408 } else if (err->int_msk & QM_OF_FIFO_OF) { 2409 reg_val = readl(qm->io_base + QM_ABNORMAL_INF00); 2410 type = (reg_val & QM_FIFO_OVERFLOW_TYPE) >> 2411 QM_FIFO_OVERFLOW_TYPE_SHIFT; 2412 vf_num = reg_val & QM_FIFO_OVERFLOW_VF; 2413 2414 if (type < ARRAY_SIZE(qm_fifo_overflow)) 2415 dev_err(dev, "qm %s fifo overflow in function %u\n", 2416 qm_fifo_overflow[type], vf_num); 2417 else 2418 dev_err(dev, "unknown error type\n"); 2419 } 2420 } 2421 } 2422 2423 static enum acc_err_result qm_hw_error_handle_v2(struct hisi_qm *qm) 2424 { 2425 u32 error_status, tmp; 2426 2427 /* read err sts */ 2428 tmp = readl(qm->io_base + QM_ABNORMAL_INT_STATUS); 2429 error_status = qm->error_mask & tmp; 2430 2431 if (error_status) { 2432 if (error_status & QM_ECC_MBIT) 2433 qm->err_status.is_qm_ecc_mbit = true; 2434 2435 qm_log_hw_error(qm, error_status); 2436 if (error_status & qm->err_info.qm_reset_mask) 2437 return ACC_ERR_NEED_RESET; 2438 2439 writel(error_status, qm->io_base + QM_ABNORMAL_INT_SOURCE); 2440 writel(qm->err_info.nfe, qm->io_base + QM_RAS_NFE_ENABLE); 2441 } 2442 2443 return ACC_ERR_RECOVERED; 2444 } 2445 2446 static int qm_get_mb_cmd(struct hisi_qm *qm, u64 *msg, u16 fun_num) 2447 { 2448 struct qm_mailbox mailbox; 2449 int ret; 2450 2451 qm_mb_pre_init(&mailbox, QM_MB_CMD_DST, 0, fun_num, 0); 2452 mutex_lock(&qm->mailbox_lock); 2453 ret = qm_mb_nolock(qm, &mailbox); 2454 if (ret) 2455 goto err_unlock; 2456 2457 *msg = readl(qm->io_base + QM_MB_CMD_DATA_ADDR_L) | 2458 ((u64)readl(qm->io_base + QM_MB_CMD_DATA_ADDR_H) << 32); 2459 2460 err_unlock: 2461 mutex_unlock(&qm->mailbox_lock); 2462 return ret; 2463 } 2464 2465 static void qm_clear_cmd_interrupt(struct hisi_qm *qm, u64 vf_mask) 2466 { 2467 u32 val; 2468 2469 if (qm->fun_type == QM_HW_PF) 2470 writeq(vf_mask, qm->io_base + QM_IFC_INT_SOURCE_P); 2471 2472 val = readl(qm->io_base + QM_IFC_INT_SOURCE_V); 2473 val |= QM_IFC_INT_SOURCE_MASK; 2474 writel(val, qm->io_base + QM_IFC_INT_SOURCE_V); 2475 } 2476 2477 static void qm_handle_vf_msg(struct hisi_qm *qm, u32 vf_id) 2478 { 2479 struct device *dev = &qm->pdev->dev; 2480 u32 cmd; 2481 u64 msg; 2482 int ret; 2483 2484 ret = qm_get_mb_cmd(qm, &msg, vf_id); 2485 if (ret) { 2486 dev_err(dev, "failed to get msg from VF(%u)!\n", vf_id); 2487 return; 2488 } 2489 2490 cmd = msg & QM_MB_CMD_DATA_MASK; 2491 switch (cmd) { 2492 case QM_VF_PREPARE_FAIL: 2493 dev_err(dev, "failed to stop VF(%u)!\n", vf_id); 2494 break; 2495 case QM_VF_START_FAIL: 2496 dev_err(dev, "failed to start VF(%u)!\n", vf_id); 2497 break; 2498 case QM_VF_PREPARE_DONE: 2499 case QM_VF_START_DONE: 2500 break; 2501 default: 2502 dev_err(dev, "unsupported cmd %u sent by VF(%u)!\n", cmd, vf_id); 2503 break; 2504 } 2505 } 2506 2507 static int qm_wait_vf_prepare_finish(struct hisi_qm *qm) 2508 { 2509 struct device *dev = &qm->pdev->dev; 2510 u32 vfs_num = qm->vfs_num; 2511 int cnt = 0; 2512 int ret = 0; 2513 u64 val; 2514 u32 i; 2515 2516 if (!qm->vfs_num || !test_bit(QM_SUPPORT_MB_COMMAND, &qm->caps)) 2517 return 0; 2518 2519 while (true) { 2520 val = readq(qm->io_base + QM_IFC_INT_SOURCE_P); 2521 /* All VFs send command to PF, break */ 2522 if ((val & GENMASK(vfs_num, 1)) == GENMASK(vfs_num, 1)) 2523 break; 2524 2525 if (++cnt > QM_MAX_PF_WAIT_COUNT) { 2526 ret = -EBUSY; 2527 break; 2528 } 2529 2530 msleep(QM_WAIT_DST_ACK); 2531 } 2532 2533 /* PF check VFs msg */ 2534 for (i = 1; i <= vfs_num; i++) { 2535 if (val & BIT(i)) 2536 qm_handle_vf_msg(qm, i); 2537 else 2538 dev_err(dev, "VF(%u) not ping PF!\n", i); 2539 } 2540 2541 /* PF clear interrupt to ack VFs */ 2542 qm_clear_cmd_interrupt(qm, val); 2543 2544 return ret; 2545 } 2546 2547 static void qm_trigger_vf_interrupt(struct hisi_qm *qm, u32 fun_num) 2548 { 2549 u32 val; 2550 2551 val = readl(qm->io_base + QM_IFC_INT_CFG); 2552 val &= ~QM_IFC_SEND_ALL_VFS; 2553 val |= fun_num; 2554 writel(val, qm->io_base + QM_IFC_INT_CFG); 2555 2556 val = readl(qm->io_base + QM_IFC_INT_SET_P); 2557 val |= QM_IFC_INT_SET_MASK; 2558 writel(val, qm->io_base + QM_IFC_INT_SET_P); 2559 } 2560 2561 static void qm_trigger_pf_interrupt(struct hisi_qm *qm) 2562 { 2563 u32 val; 2564 2565 val = readl(qm->io_base + QM_IFC_INT_SET_V); 2566 val |= QM_IFC_INT_SET_MASK; 2567 writel(val, qm->io_base + QM_IFC_INT_SET_V); 2568 } 2569 2570 static int qm_ping_single_vf(struct hisi_qm *qm, u64 cmd, u32 fun_num) 2571 { 2572 struct device *dev = &qm->pdev->dev; 2573 struct qm_mailbox mailbox; 2574 int cnt = 0; 2575 u64 val; 2576 int ret; 2577 2578 qm_mb_pre_init(&mailbox, QM_MB_CMD_SRC, cmd, fun_num, 0); 2579 mutex_lock(&qm->mailbox_lock); 2580 ret = qm_mb_nolock(qm, &mailbox); 2581 if (ret) { 2582 dev_err(dev, "failed to send command to vf(%u)!\n", fun_num); 2583 goto err_unlock; 2584 } 2585 2586 qm_trigger_vf_interrupt(qm, fun_num); 2587 while (true) { 2588 msleep(QM_WAIT_DST_ACK); 2589 val = readq(qm->io_base + QM_IFC_READY_STATUS); 2590 /* if VF respond, PF notifies VF successfully. */ 2591 if (!(val & BIT(fun_num))) 2592 goto err_unlock; 2593 2594 if (++cnt > QM_MAX_PF_WAIT_COUNT) { 2595 dev_err(dev, "failed to get response from VF(%u)!\n", fun_num); 2596 ret = -ETIMEDOUT; 2597 break; 2598 } 2599 } 2600 2601 err_unlock: 2602 mutex_unlock(&qm->mailbox_lock); 2603 return ret; 2604 } 2605 2606 static int qm_ping_all_vfs(struct hisi_qm *qm, u64 cmd) 2607 { 2608 struct device *dev = &qm->pdev->dev; 2609 u32 vfs_num = qm->vfs_num; 2610 struct qm_mailbox mailbox; 2611 u64 val = 0; 2612 int cnt = 0; 2613 int ret; 2614 u32 i; 2615 2616 qm_mb_pre_init(&mailbox, QM_MB_CMD_SRC, cmd, QM_MB_PING_ALL_VFS, 0); 2617 mutex_lock(&qm->mailbox_lock); 2618 /* PF sends command to all VFs by mailbox */ 2619 ret = qm_mb_nolock(qm, &mailbox); 2620 if (ret) { 2621 dev_err(dev, "failed to send command to VFs!\n"); 2622 mutex_unlock(&qm->mailbox_lock); 2623 return ret; 2624 } 2625 2626 qm_trigger_vf_interrupt(qm, QM_IFC_SEND_ALL_VFS); 2627 while (true) { 2628 msleep(QM_WAIT_DST_ACK); 2629 val = readq(qm->io_base + QM_IFC_READY_STATUS); 2630 /* If all VFs acked, PF notifies VFs successfully. */ 2631 if (!(val & GENMASK(vfs_num, 1))) { 2632 mutex_unlock(&qm->mailbox_lock); 2633 return 0; 2634 } 2635 2636 if (++cnt > QM_MAX_PF_WAIT_COUNT) 2637 break; 2638 } 2639 2640 mutex_unlock(&qm->mailbox_lock); 2641 2642 /* Check which vf respond timeout. */ 2643 for (i = 1; i <= vfs_num; i++) { 2644 if (val & BIT(i)) 2645 dev_err(dev, "failed to get response from VF(%u)!\n", i); 2646 } 2647 2648 return -ETIMEDOUT; 2649 } 2650 2651 static int qm_ping_pf(struct hisi_qm *qm, u64 cmd) 2652 { 2653 struct qm_mailbox mailbox; 2654 int cnt = 0; 2655 u32 val; 2656 int ret; 2657 2658 qm_mb_pre_init(&mailbox, QM_MB_CMD_SRC, cmd, 0, 0); 2659 mutex_lock(&qm->mailbox_lock); 2660 ret = qm_mb_nolock(qm, &mailbox); 2661 if (ret) { 2662 dev_err(&qm->pdev->dev, "failed to send command to PF!\n"); 2663 goto unlock; 2664 } 2665 2666 qm_trigger_pf_interrupt(qm); 2667 /* Waiting for PF response */ 2668 while (true) { 2669 msleep(QM_WAIT_DST_ACK); 2670 val = readl(qm->io_base + QM_IFC_INT_SET_V); 2671 if (!(val & QM_IFC_INT_STATUS_MASK)) 2672 break; 2673 2674 if (++cnt > QM_MAX_VF_WAIT_COUNT) { 2675 ret = -ETIMEDOUT; 2676 break; 2677 } 2678 } 2679 2680 unlock: 2681 mutex_unlock(&qm->mailbox_lock); 2682 return ret; 2683 } 2684 2685 static int qm_stop_qp(struct hisi_qp *qp) 2686 { 2687 return hisi_qm_mb(qp->qm, QM_MB_CMD_STOP_QP, 0, qp->qp_id, 0); 2688 } 2689 2690 static int qm_set_msi(struct hisi_qm *qm, bool set) 2691 { 2692 struct pci_dev *pdev = qm->pdev; 2693 2694 if (set) { 2695 pci_write_config_dword(pdev, pdev->msi_cap + PCI_MSI_MASK_64, 2696 0); 2697 } else { 2698 pci_write_config_dword(pdev, pdev->msi_cap + PCI_MSI_MASK_64, 2699 ACC_PEH_MSI_DISABLE); 2700 if (qm->err_status.is_qm_ecc_mbit || 2701 qm->err_status.is_dev_ecc_mbit) 2702 return 0; 2703 2704 mdelay(1); 2705 if (readl(qm->io_base + QM_PEH_DFX_INFO0)) 2706 return -EFAULT; 2707 } 2708 2709 return 0; 2710 } 2711 2712 static void qm_wait_msi_finish(struct hisi_qm *qm) 2713 { 2714 struct pci_dev *pdev = qm->pdev; 2715 u32 cmd = ~0; 2716 int cnt = 0; 2717 u32 val; 2718 int ret; 2719 2720 while (true) { 2721 pci_read_config_dword(pdev, pdev->msi_cap + 2722 PCI_MSI_PENDING_64, &cmd); 2723 if (!cmd) 2724 break; 2725 2726 if (++cnt > MAX_WAIT_COUNTS) { 2727 pci_warn(pdev, "failed to empty MSI PENDING!\n"); 2728 break; 2729 } 2730 2731 udelay(1); 2732 } 2733 2734 ret = readl_relaxed_poll_timeout(qm->io_base + QM_PEH_DFX_INFO0, 2735 val, !(val & QM_PEH_DFX_MASK), 2736 POLL_PERIOD, POLL_TIMEOUT); 2737 if (ret) 2738 pci_warn(pdev, "failed to empty PEH MSI!\n"); 2739 2740 ret = readl_relaxed_poll_timeout(qm->io_base + QM_PEH_DFX_INFO1, 2741 val, !(val & QM_PEH_MSI_FINISH_MASK), 2742 POLL_PERIOD, POLL_TIMEOUT); 2743 if (ret) 2744 pci_warn(pdev, "failed to finish MSI operation!\n"); 2745 } 2746 2747 static int qm_set_msi_v3(struct hisi_qm *qm, bool set) 2748 { 2749 struct pci_dev *pdev = qm->pdev; 2750 int ret = -ETIMEDOUT; 2751 u32 cmd, i; 2752 2753 pci_read_config_dword(pdev, pdev->msi_cap, &cmd); 2754 if (set) 2755 cmd |= QM_MSI_CAP_ENABLE; 2756 else 2757 cmd &= ~QM_MSI_CAP_ENABLE; 2758 2759 pci_write_config_dword(pdev, pdev->msi_cap, cmd); 2760 if (set) { 2761 for (i = 0; i < MAX_WAIT_COUNTS; i++) { 2762 pci_read_config_dword(pdev, pdev->msi_cap, &cmd); 2763 if (cmd & QM_MSI_CAP_ENABLE) 2764 return 0; 2765 2766 udelay(1); 2767 } 2768 } else { 2769 udelay(WAIT_PERIOD_US_MIN); 2770 qm_wait_msi_finish(qm); 2771 ret = 0; 2772 } 2773 2774 return ret; 2775 } 2776 2777 static const struct hisi_qm_hw_ops qm_hw_ops_v1 = { 2778 .qm_db = qm_db_v1, 2779 .hw_error_init = qm_hw_error_init_v1, 2780 .set_msi = qm_set_msi, 2781 }; 2782 2783 static const struct hisi_qm_hw_ops qm_hw_ops_v2 = { 2784 .get_vft = qm_get_vft_v2, 2785 .qm_db = qm_db_v2, 2786 .hw_error_init = qm_hw_error_init_v2, 2787 .hw_error_uninit = qm_hw_error_uninit_v2, 2788 .hw_error_handle = qm_hw_error_handle_v2, 2789 .set_msi = qm_set_msi, 2790 }; 2791 2792 static const struct hisi_qm_hw_ops qm_hw_ops_v3 = { 2793 .get_vft = qm_get_vft_v2, 2794 .qm_db = qm_db_v2, 2795 .hw_error_init = qm_hw_error_init_v3, 2796 .hw_error_uninit = qm_hw_error_uninit_v3, 2797 .hw_error_handle = qm_hw_error_handle_v2, 2798 .set_msi = qm_set_msi_v3, 2799 }; 2800 2801 static void *qm_get_avail_sqe(struct hisi_qp *qp) 2802 { 2803 struct hisi_qp_status *qp_status = &qp->qp_status; 2804 u16 sq_tail = qp_status->sq_tail; 2805 2806 if (unlikely(atomic_read(&qp->qp_status.used) == qp->sq_depth - 1)) 2807 return NULL; 2808 2809 return qp->sqe + sq_tail * qp->qm->sqe_size; 2810 } 2811 2812 static void hisi_qm_unset_hw_reset(struct hisi_qp *qp) 2813 { 2814 u64 *addr; 2815 2816 /* Use last 64 bits of DUS to reset status. */ 2817 addr = (u64 *)(qp->qdma.va + qp->qdma.size) - QM_RESET_STOP_TX_OFFSET; 2818 *addr = 0; 2819 } 2820 2821 static struct hisi_qp *qm_create_qp_nolock(struct hisi_qm *qm, u8 alg_type) 2822 { 2823 struct device *dev = &qm->pdev->dev; 2824 struct hisi_qp *qp; 2825 int qp_id; 2826 2827 if (!qm_qp_avail_state(qm, NULL, QP_INIT)) 2828 return ERR_PTR(-EPERM); 2829 2830 if (qm->qp_in_used == qm->qp_num) { 2831 dev_info_ratelimited(dev, "All %u queues of QM are busy!\n", 2832 qm->qp_num); 2833 atomic64_inc(&qm->debug.dfx.create_qp_err_cnt); 2834 return ERR_PTR(-EBUSY); 2835 } 2836 2837 qp_id = idr_alloc_cyclic(&qm->qp_idr, NULL, 0, qm->qp_num, GFP_ATOMIC); 2838 if (qp_id < 0) { 2839 dev_info_ratelimited(dev, "All %u queues of QM are busy!\n", 2840 qm->qp_num); 2841 atomic64_inc(&qm->debug.dfx.create_qp_err_cnt); 2842 return ERR_PTR(-EBUSY); 2843 } 2844 2845 qp = &qm->qp_array[qp_id]; 2846 hisi_qm_unset_hw_reset(qp); 2847 memset(qp->cqe, 0, sizeof(struct qm_cqe) * qp->cq_depth); 2848 2849 qp->event_cb = NULL; 2850 qp->req_cb = NULL; 2851 qp->qp_id = qp_id; 2852 qp->alg_type = alg_type; 2853 qp->is_in_kernel = true; 2854 qm->qp_in_used++; 2855 atomic_set(&qp->qp_status.flags, QP_INIT); 2856 2857 return qp; 2858 } 2859 2860 /** 2861 * hisi_qm_create_qp() - Create a queue pair from qm. 2862 * @qm: The qm we create a qp from. 2863 * @alg_type: Accelerator specific algorithm type in sqc. 2864 * 2865 * return created qp, -EBUSY if all qps in qm allocated, -ENOMEM if allocating 2866 * qp memory fails. 2867 */ 2868 static struct hisi_qp *hisi_qm_create_qp(struct hisi_qm *qm, u8 alg_type) 2869 { 2870 struct hisi_qp *qp; 2871 int ret; 2872 2873 ret = qm_pm_get_sync(qm); 2874 if (ret) 2875 return ERR_PTR(ret); 2876 2877 down_write(&qm->qps_lock); 2878 qp = qm_create_qp_nolock(qm, alg_type); 2879 up_write(&qm->qps_lock); 2880 2881 if (IS_ERR(qp)) 2882 qm_pm_put_sync(qm); 2883 2884 return qp; 2885 } 2886 2887 /** 2888 * hisi_qm_release_qp() - Release a qp back to its qm. 2889 * @qp: The qp we want to release. 2890 * 2891 * This function releases the resource of a qp. 2892 */ 2893 static void hisi_qm_release_qp(struct hisi_qp *qp) 2894 { 2895 struct hisi_qm *qm = qp->qm; 2896 2897 down_write(&qm->qps_lock); 2898 2899 if (!qm_qp_avail_state(qm, qp, QP_CLOSE)) { 2900 up_write(&qm->qps_lock); 2901 return; 2902 } 2903 2904 qm->qp_in_used--; 2905 idr_remove(&qm->qp_idr, qp->qp_id); 2906 2907 up_write(&qm->qps_lock); 2908 2909 qm_pm_put_sync(qm); 2910 } 2911 2912 static int qm_sq_ctx_cfg(struct hisi_qp *qp, int qp_id, u32 pasid) 2913 { 2914 struct hisi_qm *qm = qp->qm; 2915 struct device *dev = &qm->pdev->dev; 2916 enum qm_hw_ver ver = qm->ver; 2917 struct qm_sqc *sqc; 2918 dma_addr_t sqc_dma; 2919 int ret; 2920 2921 sqc = kzalloc(sizeof(struct qm_sqc), GFP_KERNEL); 2922 if (!sqc) 2923 return -ENOMEM; 2924 2925 INIT_QC_COMMON(sqc, qp->sqe_dma, pasid); 2926 if (ver == QM_HW_V1) { 2927 sqc->dw3 = cpu_to_le32(QM_MK_SQC_DW3_V1(0, 0, 0, qm->sqe_size)); 2928 sqc->w8 = cpu_to_le16(qp->sq_depth - 1); 2929 } else { 2930 sqc->dw3 = cpu_to_le32(QM_MK_SQC_DW3_V2(qm->sqe_size, qp->sq_depth)); 2931 sqc->w8 = 0; /* rand_qc */ 2932 } 2933 sqc->cq_num = cpu_to_le16(qp_id); 2934 sqc->w13 = cpu_to_le16(QM_MK_SQC_W13(0, 1, qp->alg_type)); 2935 2936 if (ver >= QM_HW_V3 && qm->use_sva && !qp->is_in_kernel) 2937 sqc->w11 = cpu_to_le16(QM_QC_PASID_ENABLE << 2938 QM_QC_PASID_ENABLE_SHIFT); 2939 2940 sqc_dma = dma_map_single(dev, sqc, sizeof(struct qm_sqc), 2941 DMA_TO_DEVICE); 2942 if (dma_mapping_error(dev, sqc_dma)) { 2943 kfree(sqc); 2944 return -ENOMEM; 2945 } 2946 2947 ret = hisi_qm_mb(qm, QM_MB_CMD_SQC, sqc_dma, qp_id, 0); 2948 dma_unmap_single(dev, sqc_dma, sizeof(struct qm_sqc), DMA_TO_DEVICE); 2949 kfree(sqc); 2950 2951 return ret; 2952 } 2953 2954 static int qm_cq_ctx_cfg(struct hisi_qp *qp, int qp_id, u32 pasid) 2955 { 2956 struct hisi_qm *qm = qp->qm; 2957 struct device *dev = &qm->pdev->dev; 2958 enum qm_hw_ver ver = qm->ver; 2959 struct qm_cqc *cqc; 2960 dma_addr_t cqc_dma; 2961 int ret; 2962 2963 cqc = kzalloc(sizeof(struct qm_cqc), GFP_KERNEL); 2964 if (!cqc) 2965 return -ENOMEM; 2966 2967 INIT_QC_COMMON(cqc, qp->cqe_dma, pasid); 2968 if (ver == QM_HW_V1) { 2969 cqc->dw3 = cpu_to_le32(QM_MK_CQC_DW3_V1(0, 0, 0, 2970 QM_QC_CQE_SIZE)); 2971 cqc->w8 = cpu_to_le16(qp->cq_depth - 1); 2972 } else { 2973 cqc->dw3 = cpu_to_le32(QM_MK_CQC_DW3_V2(QM_QC_CQE_SIZE, qp->cq_depth)); 2974 cqc->w8 = 0; /* rand_qc */ 2975 } 2976 cqc->dw6 = cpu_to_le32(1 << QM_CQ_PHASE_SHIFT | 1 << QM_CQ_FLAG_SHIFT); 2977 2978 if (ver >= QM_HW_V3 && qm->use_sva && !qp->is_in_kernel) 2979 cqc->w11 = cpu_to_le16(QM_QC_PASID_ENABLE); 2980 2981 cqc_dma = dma_map_single(dev, cqc, sizeof(struct qm_cqc), 2982 DMA_TO_DEVICE); 2983 if (dma_mapping_error(dev, cqc_dma)) { 2984 kfree(cqc); 2985 return -ENOMEM; 2986 } 2987 2988 ret = hisi_qm_mb(qm, QM_MB_CMD_CQC, cqc_dma, qp_id, 0); 2989 dma_unmap_single(dev, cqc_dma, sizeof(struct qm_cqc), DMA_TO_DEVICE); 2990 kfree(cqc); 2991 2992 return ret; 2993 } 2994 2995 static int qm_qp_ctx_cfg(struct hisi_qp *qp, int qp_id, u32 pasid) 2996 { 2997 int ret; 2998 2999 qm_init_qp_status(qp); 3000 3001 ret = qm_sq_ctx_cfg(qp, qp_id, pasid); 3002 if (ret) 3003 return ret; 3004 3005 return qm_cq_ctx_cfg(qp, qp_id, pasid); 3006 } 3007 3008 static int qm_start_qp_nolock(struct hisi_qp *qp, unsigned long arg) 3009 { 3010 struct hisi_qm *qm = qp->qm; 3011 struct device *dev = &qm->pdev->dev; 3012 int qp_id = qp->qp_id; 3013 u32 pasid = arg; 3014 int ret; 3015 3016 if (!qm_qp_avail_state(qm, qp, QP_START)) 3017 return -EPERM; 3018 3019 ret = qm_qp_ctx_cfg(qp, qp_id, pasid); 3020 if (ret) 3021 return ret; 3022 3023 atomic_set(&qp->qp_status.flags, QP_START); 3024 dev_dbg(dev, "queue %d started\n", qp_id); 3025 3026 return 0; 3027 } 3028 3029 /** 3030 * hisi_qm_start_qp() - Start a qp into running. 3031 * @qp: The qp we want to start to run. 3032 * @arg: Accelerator specific argument. 3033 * 3034 * After this function, qp can receive request from user. Return 0 if 3035 * successful, Return -EBUSY if failed. 3036 */ 3037 int hisi_qm_start_qp(struct hisi_qp *qp, unsigned long arg) 3038 { 3039 struct hisi_qm *qm = qp->qm; 3040 int ret; 3041 3042 down_write(&qm->qps_lock); 3043 ret = qm_start_qp_nolock(qp, arg); 3044 up_write(&qm->qps_lock); 3045 3046 return ret; 3047 } 3048 EXPORT_SYMBOL_GPL(hisi_qm_start_qp); 3049 3050 /** 3051 * qp_stop_fail_cb() - call request cb. 3052 * @qp: stopped failed qp. 3053 * 3054 * Callback function should be called whether task completed or not. 3055 */ 3056 static void qp_stop_fail_cb(struct hisi_qp *qp) 3057 { 3058 int qp_used = atomic_read(&qp->qp_status.used); 3059 u16 cur_tail = qp->qp_status.sq_tail; 3060 u16 sq_depth = qp->sq_depth; 3061 u16 cur_head = (cur_tail + sq_depth - qp_used) % sq_depth; 3062 struct hisi_qm *qm = qp->qm; 3063 u16 pos; 3064 int i; 3065 3066 for (i = 0; i < qp_used; i++) { 3067 pos = (i + cur_head) % sq_depth; 3068 qp->req_cb(qp, qp->sqe + (u32)(qm->sqe_size * pos)); 3069 atomic_dec(&qp->qp_status.used); 3070 } 3071 } 3072 3073 /** 3074 * qm_drain_qp() - Drain a qp. 3075 * @qp: The qp we want to drain. 3076 * 3077 * Determine whether the queue is cleared by judging the tail pointers of 3078 * sq and cq. 3079 */ 3080 static int qm_drain_qp(struct hisi_qp *qp) 3081 { 3082 size_t size = sizeof(struct qm_sqc) + sizeof(struct qm_cqc); 3083 struct hisi_qm *qm = qp->qm; 3084 struct device *dev = &qm->pdev->dev; 3085 struct qm_sqc *sqc; 3086 struct qm_cqc *cqc; 3087 dma_addr_t dma_addr; 3088 int ret = 0, i = 0; 3089 void *addr; 3090 3091 /* No need to judge if master OOO is blocked. */ 3092 if (qm_check_dev_error(qm)) 3093 return 0; 3094 3095 /* Kunpeng930 supports drain qp by device */ 3096 if (test_bit(QM_SUPPORT_STOP_QP, &qm->caps)) { 3097 ret = qm_stop_qp(qp); 3098 if (ret) 3099 dev_err(dev, "Failed to stop qp(%u)!\n", qp->qp_id); 3100 return ret; 3101 } 3102 3103 addr = qm_ctx_alloc(qm, size, &dma_addr); 3104 if (IS_ERR(addr)) { 3105 dev_err(dev, "Failed to alloc ctx for sqc and cqc!\n"); 3106 return -ENOMEM; 3107 } 3108 3109 while (++i) { 3110 ret = qm_dump_sqc_raw(qm, dma_addr, qp->qp_id); 3111 if (ret) { 3112 dev_err_ratelimited(dev, "Failed to dump sqc!\n"); 3113 break; 3114 } 3115 sqc = addr; 3116 3117 ret = qm_dump_cqc_raw(qm, (dma_addr + sizeof(struct qm_sqc)), 3118 qp->qp_id); 3119 if (ret) { 3120 dev_err_ratelimited(dev, "Failed to dump cqc!\n"); 3121 break; 3122 } 3123 cqc = addr + sizeof(struct qm_sqc); 3124 3125 if ((sqc->tail == cqc->tail) && 3126 (QM_SQ_TAIL_IDX(sqc) == QM_CQ_TAIL_IDX(cqc))) 3127 break; 3128 3129 if (i == MAX_WAIT_COUNTS) { 3130 dev_err(dev, "Fail to empty queue %u!\n", qp->qp_id); 3131 ret = -EBUSY; 3132 break; 3133 } 3134 3135 usleep_range(WAIT_PERIOD_US_MIN, WAIT_PERIOD_US_MAX); 3136 } 3137 3138 qm_ctx_free(qm, size, addr, &dma_addr); 3139 3140 return ret; 3141 } 3142 3143 static int qm_stop_qp_nolock(struct hisi_qp *qp) 3144 { 3145 struct device *dev = &qp->qm->pdev->dev; 3146 int ret; 3147 3148 /* 3149 * It is allowed to stop and release qp when reset, If the qp is 3150 * stopped when reset but still want to be released then, the 3151 * is_resetting flag should be set negative so that this qp will not 3152 * be restarted after reset. 3153 */ 3154 if (atomic_read(&qp->qp_status.flags) == QP_STOP) { 3155 qp->is_resetting = false; 3156 return 0; 3157 } 3158 3159 if (!qm_qp_avail_state(qp->qm, qp, QP_STOP)) 3160 return -EPERM; 3161 3162 atomic_set(&qp->qp_status.flags, QP_STOP); 3163 3164 ret = qm_drain_qp(qp); 3165 if (ret) 3166 dev_err(dev, "Failed to drain out data for stopping!\n"); 3167 3168 3169 flush_workqueue(qp->qm->wq); 3170 if (unlikely(qp->is_resetting && atomic_read(&qp->qp_status.used))) 3171 qp_stop_fail_cb(qp); 3172 3173 dev_dbg(dev, "stop queue %u!", qp->qp_id); 3174 3175 return 0; 3176 } 3177 3178 /** 3179 * hisi_qm_stop_qp() - Stop a qp in qm. 3180 * @qp: The qp we want to stop. 3181 * 3182 * This function is reverse of hisi_qm_start_qp. Return 0 if successful. 3183 */ 3184 int hisi_qm_stop_qp(struct hisi_qp *qp) 3185 { 3186 int ret; 3187 3188 down_write(&qp->qm->qps_lock); 3189 ret = qm_stop_qp_nolock(qp); 3190 up_write(&qp->qm->qps_lock); 3191 3192 return ret; 3193 } 3194 EXPORT_SYMBOL_GPL(hisi_qm_stop_qp); 3195 3196 /** 3197 * hisi_qp_send() - Queue up a task in the hardware queue. 3198 * @qp: The qp in which to put the message. 3199 * @msg: The message. 3200 * 3201 * This function will return -EBUSY if qp is currently full, and -EAGAIN 3202 * if qp related qm is resetting. 3203 * 3204 * Note: This function may run with qm_irq_thread and ACC reset at same time. 3205 * It has no race with qm_irq_thread. However, during hisi_qp_send, ACC 3206 * reset may happen, we have no lock here considering performance. This 3207 * causes current qm_db sending fail or can not receive sended sqe. QM 3208 * sync/async receive function should handle the error sqe. ACC reset 3209 * done function should clear used sqe to 0. 3210 */ 3211 int hisi_qp_send(struct hisi_qp *qp, const void *msg) 3212 { 3213 struct hisi_qp_status *qp_status = &qp->qp_status; 3214 u16 sq_tail = qp_status->sq_tail; 3215 u16 sq_tail_next = (sq_tail + 1) % qp->sq_depth; 3216 void *sqe = qm_get_avail_sqe(qp); 3217 3218 if (unlikely(atomic_read(&qp->qp_status.flags) == QP_STOP || 3219 atomic_read(&qp->qm->status.flags) == QM_STOP || 3220 qp->is_resetting)) { 3221 dev_info_ratelimited(&qp->qm->pdev->dev, "QP is stopped or resetting\n"); 3222 return -EAGAIN; 3223 } 3224 3225 if (!sqe) 3226 return -EBUSY; 3227 3228 memcpy(sqe, msg, qp->qm->sqe_size); 3229 3230 qm_db(qp->qm, qp->qp_id, QM_DOORBELL_CMD_SQ, sq_tail_next, 0); 3231 atomic_inc(&qp->qp_status.used); 3232 qp_status->sq_tail = sq_tail_next; 3233 3234 return 0; 3235 } 3236 EXPORT_SYMBOL_GPL(hisi_qp_send); 3237 3238 static void hisi_qm_cache_wb(struct hisi_qm *qm) 3239 { 3240 unsigned int val; 3241 3242 if (qm->ver == QM_HW_V1) 3243 return; 3244 3245 writel(0x1, qm->io_base + QM_CACHE_WB_START); 3246 if (readl_relaxed_poll_timeout(qm->io_base + QM_CACHE_WB_DONE, 3247 val, val & BIT(0), POLL_PERIOD, 3248 POLL_TIMEOUT)) 3249 dev_err(&qm->pdev->dev, "QM writeback sqc cache fail!\n"); 3250 } 3251 3252 static void qm_qp_event_notifier(struct hisi_qp *qp) 3253 { 3254 wake_up_interruptible(&qp->uacce_q->wait); 3255 } 3256 3257 /* This function returns free number of qp in qm. */ 3258 static int hisi_qm_get_available_instances(struct uacce_device *uacce) 3259 { 3260 struct hisi_qm *qm = uacce->priv; 3261 int ret; 3262 3263 down_read(&qm->qps_lock); 3264 ret = qm->qp_num - qm->qp_in_used; 3265 up_read(&qm->qps_lock); 3266 3267 return ret; 3268 } 3269 3270 static void hisi_qm_set_hw_reset(struct hisi_qm *qm, int offset) 3271 { 3272 int i; 3273 3274 for (i = 0; i < qm->qp_num; i++) 3275 qm_set_qp_disable(&qm->qp_array[i], offset); 3276 } 3277 3278 static int hisi_qm_uacce_get_queue(struct uacce_device *uacce, 3279 unsigned long arg, 3280 struct uacce_queue *q) 3281 { 3282 struct hisi_qm *qm = uacce->priv; 3283 struct hisi_qp *qp; 3284 u8 alg_type = 0; 3285 3286 qp = hisi_qm_create_qp(qm, alg_type); 3287 if (IS_ERR(qp)) 3288 return PTR_ERR(qp); 3289 3290 q->priv = qp; 3291 q->uacce = uacce; 3292 qp->uacce_q = q; 3293 qp->event_cb = qm_qp_event_notifier; 3294 qp->pasid = arg; 3295 qp->is_in_kernel = false; 3296 3297 return 0; 3298 } 3299 3300 static void hisi_qm_uacce_put_queue(struct uacce_queue *q) 3301 { 3302 struct hisi_qp *qp = q->priv; 3303 3304 hisi_qm_release_qp(qp); 3305 } 3306 3307 /* map sq/cq/doorbell to user space */ 3308 static int hisi_qm_uacce_mmap(struct uacce_queue *q, 3309 struct vm_area_struct *vma, 3310 struct uacce_qfile_region *qfr) 3311 { 3312 struct hisi_qp *qp = q->priv; 3313 struct hisi_qm *qm = qp->qm; 3314 resource_size_t phys_base = qm->db_phys_base + 3315 qp->qp_id * qm->db_interval; 3316 size_t sz = vma->vm_end - vma->vm_start; 3317 struct pci_dev *pdev = qm->pdev; 3318 struct device *dev = &pdev->dev; 3319 unsigned long vm_pgoff; 3320 int ret; 3321 3322 switch (qfr->type) { 3323 case UACCE_QFRT_MMIO: 3324 if (qm->ver == QM_HW_V1) { 3325 if (sz > PAGE_SIZE * QM_DOORBELL_PAGE_NR) 3326 return -EINVAL; 3327 } else if (!test_bit(QM_SUPPORT_DB_ISOLATION, &qm->caps)) { 3328 if (sz > PAGE_SIZE * (QM_DOORBELL_PAGE_NR + 3329 QM_DOORBELL_SQ_CQ_BASE_V2 / PAGE_SIZE)) 3330 return -EINVAL; 3331 } else { 3332 if (sz > qm->db_interval) 3333 return -EINVAL; 3334 } 3335 3336 vma->vm_flags |= VM_IO; 3337 3338 return remap_pfn_range(vma, vma->vm_start, 3339 phys_base >> PAGE_SHIFT, 3340 sz, pgprot_noncached(vma->vm_page_prot)); 3341 case UACCE_QFRT_DUS: 3342 if (sz != qp->qdma.size) 3343 return -EINVAL; 3344 3345 /* 3346 * dma_mmap_coherent() requires vm_pgoff as 0 3347 * restore vm_pfoff to initial value for mmap() 3348 */ 3349 vm_pgoff = vma->vm_pgoff; 3350 vma->vm_pgoff = 0; 3351 ret = dma_mmap_coherent(dev, vma, qp->qdma.va, 3352 qp->qdma.dma, sz); 3353 vma->vm_pgoff = vm_pgoff; 3354 return ret; 3355 3356 default: 3357 return -EINVAL; 3358 } 3359 } 3360 3361 static int hisi_qm_uacce_start_queue(struct uacce_queue *q) 3362 { 3363 struct hisi_qp *qp = q->priv; 3364 3365 return hisi_qm_start_qp(qp, qp->pasid); 3366 } 3367 3368 static void hisi_qm_uacce_stop_queue(struct uacce_queue *q) 3369 { 3370 hisi_qm_stop_qp(q->priv); 3371 } 3372 3373 static int hisi_qm_is_q_updated(struct uacce_queue *q) 3374 { 3375 struct hisi_qp *qp = q->priv; 3376 struct qm_cqe *cqe = qp->cqe + qp->qp_status.cq_head; 3377 int updated = 0; 3378 3379 while (QM_CQE_PHASE(cqe) == qp->qp_status.cqc_phase) { 3380 /* make sure to read data from memory */ 3381 dma_rmb(); 3382 qm_cq_head_update(qp); 3383 cqe = qp->cqe + qp->qp_status.cq_head; 3384 updated = 1; 3385 } 3386 3387 return updated; 3388 } 3389 3390 static void qm_set_sqctype(struct uacce_queue *q, u16 type) 3391 { 3392 struct hisi_qm *qm = q->uacce->priv; 3393 struct hisi_qp *qp = q->priv; 3394 3395 down_write(&qm->qps_lock); 3396 qp->alg_type = type; 3397 up_write(&qm->qps_lock); 3398 } 3399 3400 static long hisi_qm_uacce_ioctl(struct uacce_queue *q, unsigned int cmd, 3401 unsigned long arg) 3402 { 3403 struct hisi_qp *qp = q->priv; 3404 struct hisi_qp_info qp_info; 3405 struct hisi_qp_ctx qp_ctx; 3406 3407 if (cmd == UACCE_CMD_QM_SET_QP_CTX) { 3408 if (copy_from_user(&qp_ctx, (void __user *)arg, 3409 sizeof(struct hisi_qp_ctx))) 3410 return -EFAULT; 3411 3412 if (qp_ctx.qc_type != 0 && qp_ctx.qc_type != 1) 3413 return -EINVAL; 3414 3415 qm_set_sqctype(q, qp_ctx.qc_type); 3416 qp_ctx.id = qp->qp_id; 3417 3418 if (copy_to_user((void __user *)arg, &qp_ctx, 3419 sizeof(struct hisi_qp_ctx))) 3420 return -EFAULT; 3421 3422 return 0; 3423 } else if (cmd == UACCE_CMD_QM_SET_QP_INFO) { 3424 if (copy_from_user(&qp_info, (void __user *)arg, 3425 sizeof(struct hisi_qp_info))) 3426 return -EFAULT; 3427 3428 qp_info.sqe_size = qp->qm->sqe_size; 3429 qp_info.sq_depth = qp->sq_depth; 3430 qp_info.cq_depth = qp->cq_depth; 3431 3432 if (copy_to_user((void __user *)arg, &qp_info, 3433 sizeof(struct hisi_qp_info))) 3434 return -EFAULT; 3435 3436 return 0; 3437 } 3438 3439 return -EINVAL; 3440 } 3441 3442 static const struct uacce_ops uacce_qm_ops = { 3443 .get_available_instances = hisi_qm_get_available_instances, 3444 .get_queue = hisi_qm_uacce_get_queue, 3445 .put_queue = hisi_qm_uacce_put_queue, 3446 .start_queue = hisi_qm_uacce_start_queue, 3447 .stop_queue = hisi_qm_uacce_stop_queue, 3448 .mmap = hisi_qm_uacce_mmap, 3449 .ioctl = hisi_qm_uacce_ioctl, 3450 .is_q_updated = hisi_qm_is_q_updated, 3451 }; 3452 3453 static int qm_alloc_uacce(struct hisi_qm *qm) 3454 { 3455 struct pci_dev *pdev = qm->pdev; 3456 struct uacce_device *uacce; 3457 unsigned long mmio_page_nr; 3458 unsigned long dus_page_nr; 3459 u16 sq_depth, cq_depth; 3460 struct uacce_interface interface = { 3461 .flags = UACCE_DEV_SVA, 3462 .ops = &uacce_qm_ops, 3463 }; 3464 int ret; 3465 3466 ret = strscpy(interface.name, dev_driver_string(&pdev->dev), 3467 sizeof(interface.name)); 3468 if (ret < 0) 3469 return -ENAMETOOLONG; 3470 3471 uacce = uacce_alloc(&pdev->dev, &interface); 3472 if (IS_ERR(uacce)) 3473 return PTR_ERR(uacce); 3474 3475 if (uacce->flags & UACCE_DEV_SVA) { 3476 qm->use_sva = true; 3477 } else { 3478 /* only consider sva case */ 3479 uacce_remove(uacce); 3480 qm->uacce = NULL; 3481 return -EINVAL; 3482 } 3483 3484 uacce->is_vf = pdev->is_virtfn; 3485 uacce->priv = qm; 3486 3487 if (qm->ver == QM_HW_V1) 3488 uacce->api_ver = HISI_QM_API_VER_BASE; 3489 else if (qm->ver == QM_HW_V2) 3490 uacce->api_ver = HISI_QM_API_VER2_BASE; 3491 else 3492 uacce->api_ver = HISI_QM_API_VER3_BASE; 3493 3494 if (qm->ver == QM_HW_V1) 3495 mmio_page_nr = QM_DOORBELL_PAGE_NR; 3496 else if (!test_bit(QM_SUPPORT_DB_ISOLATION, &qm->caps)) 3497 mmio_page_nr = QM_DOORBELL_PAGE_NR + 3498 QM_DOORBELL_SQ_CQ_BASE_V2 / PAGE_SIZE; 3499 else 3500 mmio_page_nr = qm->db_interval / PAGE_SIZE; 3501 3502 qm_get_xqc_depth(qm, &sq_depth, &cq_depth, QM_QP_DEPTH_CAP); 3503 3504 /* Add one more page for device or qp status */ 3505 dus_page_nr = (PAGE_SIZE - 1 + qm->sqe_size * sq_depth + 3506 sizeof(struct qm_cqe) * cq_depth + PAGE_SIZE) >> 3507 PAGE_SHIFT; 3508 3509 uacce->qf_pg_num[UACCE_QFRT_MMIO] = mmio_page_nr; 3510 uacce->qf_pg_num[UACCE_QFRT_DUS] = dus_page_nr; 3511 3512 qm->uacce = uacce; 3513 3514 return 0; 3515 } 3516 3517 /** 3518 * qm_frozen() - Try to froze QM to cut continuous queue request. If 3519 * there is user on the QM, return failure without doing anything. 3520 * @qm: The qm needed to be fronzen. 3521 * 3522 * This function frozes QM, then we can do SRIOV disabling. 3523 */ 3524 static int qm_frozen(struct hisi_qm *qm) 3525 { 3526 if (test_bit(QM_DRIVER_REMOVING, &qm->misc_ctl)) 3527 return 0; 3528 3529 down_write(&qm->qps_lock); 3530 3531 if (!qm->qp_in_used) { 3532 qm->qp_in_used = qm->qp_num; 3533 up_write(&qm->qps_lock); 3534 set_bit(QM_DRIVER_REMOVING, &qm->misc_ctl); 3535 return 0; 3536 } 3537 3538 up_write(&qm->qps_lock); 3539 3540 return -EBUSY; 3541 } 3542 3543 static int qm_try_frozen_vfs(struct pci_dev *pdev, 3544 struct hisi_qm_list *qm_list) 3545 { 3546 struct hisi_qm *qm, *vf_qm; 3547 struct pci_dev *dev; 3548 int ret = 0; 3549 3550 if (!qm_list || !pdev) 3551 return -EINVAL; 3552 3553 /* Try to frozen all the VFs as disable SRIOV */ 3554 mutex_lock(&qm_list->lock); 3555 list_for_each_entry(qm, &qm_list->list, list) { 3556 dev = qm->pdev; 3557 if (dev == pdev) 3558 continue; 3559 if (pci_physfn(dev) == pdev) { 3560 vf_qm = pci_get_drvdata(dev); 3561 ret = qm_frozen(vf_qm); 3562 if (ret) 3563 goto frozen_fail; 3564 } 3565 } 3566 3567 frozen_fail: 3568 mutex_unlock(&qm_list->lock); 3569 3570 return ret; 3571 } 3572 3573 /** 3574 * hisi_qm_wait_task_finish() - Wait until the task is finished 3575 * when removing the driver. 3576 * @qm: The qm needed to wait for the task to finish. 3577 * @qm_list: The list of all available devices. 3578 */ 3579 void hisi_qm_wait_task_finish(struct hisi_qm *qm, struct hisi_qm_list *qm_list) 3580 { 3581 while (qm_frozen(qm) || 3582 ((qm->fun_type == QM_HW_PF) && 3583 qm_try_frozen_vfs(qm->pdev, qm_list))) { 3584 msleep(WAIT_PERIOD); 3585 } 3586 3587 while (test_bit(QM_RST_SCHED, &qm->misc_ctl) || 3588 test_bit(QM_RESETTING, &qm->misc_ctl)) 3589 msleep(WAIT_PERIOD); 3590 3591 udelay(REMOVE_WAIT_DELAY); 3592 } 3593 EXPORT_SYMBOL_GPL(hisi_qm_wait_task_finish); 3594 3595 static void hisi_qp_memory_uninit(struct hisi_qm *qm, int num) 3596 { 3597 struct device *dev = &qm->pdev->dev; 3598 struct qm_dma *qdma; 3599 int i; 3600 3601 for (i = num - 1; i >= 0; i--) { 3602 qdma = &qm->qp_array[i].qdma; 3603 dma_free_coherent(dev, qdma->size, qdma->va, qdma->dma); 3604 kfree(qm->poll_data[i].qp_finish_id); 3605 } 3606 3607 kfree(qm->poll_data); 3608 kfree(qm->qp_array); 3609 } 3610 3611 static int hisi_qp_memory_init(struct hisi_qm *qm, size_t dma_size, int id, 3612 u16 sq_depth, u16 cq_depth) 3613 { 3614 struct device *dev = &qm->pdev->dev; 3615 size_t off = qm->sqe_size * sq_depth; 3616 struct hisi_qp *qp; 3617 int ret = -ENOMEM; 3618 3619 qm->poll_data[id].qp_finish_id = kcalloc(qm->qp_num, sizeof(u16), 3620 GFP_KERNEL); 3621 if (!qm->poll_data[id].qp_finish_id) 3622 return -ENOMEM; 3623 3624 qp = &qm->qp_array[id]; 3625 qp->qdma.va = dma_alloc_coherent(dev, dma_size, &qp->qdma.dma, 3626 GFP_KERNEL); 3627 if (!qp->qdma.va) 3628 goto err_free_qp_finish_id; 3629 3630 qp->sqe = qp->qdma.va; 3631 qp->sqe_dma = qp->qdma.dma; 3632 qp->cqe = qp->qdma.va + off; 3633 qp->cqe_dma = qp->qdma.dma + off; 3634 qp->qdma.size = dma_size; 3635 qp->sq_depth = sq_depth; 3636 qp->cq_depth = cq_depth; 3637 qp->qm = qm; 3638 qp->qp_id = id; 3639 3640 return 0; 3641 3642 err_free_qp_finish_id: 3643 kfree(qm->poll_data[id].qp_finish_id); 3644 return ret; 3645 } 3646 3647 static void hisi_qm_pre_init(struct hisi_qm *qm) 3648 { 3649 struct pci_dev *pdev = qm->pdev; 3650 3651 if (qm->ver == QM_HW_V1) 3652 qm->ops = &qm_hw_ops_v1; 3653 else if (qm->ver == QM_HW_V2) 3654 qm->ops = &qm_hw_ops_v2; 3655 else 3656 qm->ops = &qm_hw_ops_v3; 3657 3658 pci_set_drvdata(pdev, qm); 3659 mutex_init(&qm->mailbox_lock); 3660 init_rwsem(&qm->qps_lock); 3661 qm->qp_in_used = 0; 3662 qm->misc_ctl = false; 3663 if (test_bit(QM_SUPPORT_RPM, &qm->caps)) { 3664 if (!acpi_device_power_manageable(ACPI_COMPANION(&pdev->dev))) 3665 dev_info(&pdev->dev, "_PS0 and _PR0 are not defined"); 3666 } 3667 } 3668 3669 static void qm_cmd_uninit(struct hisi_qm *qm) 3670 { 3671 u32 val; 3672 3673 if (!test_bit(QM_SUPPORT_MB_COMMAND, &qm->caps)) 3674 return; 3675 3676 val = readl(qm->io_base + QM_IFC_INT_MASK); 3677 val |= QM_IFC_INT_DISABLE; 3678 writel(val, qm->io_base + QM_IFC_INT_MASK); 3679 } 3680 3681 static void qm_cmd_init(struct hisi_qm *qm) 3682 { 3683 u32 val; 3684 3685 if (!test_bit(QM_SUPPORT_MB_COMMAND, &qm->caps)) 3686 return; 3687 3688 /* Clear communication interrupt source */ 3689 qm_clear_cmd_interrupt(qm, QM_IFC_INT_SOURCE_CLR); 3690 3691 /* Enable pf to vf communication reg. */ 3692 val = readl(qm->io_base + QM_IFC_INT_MASK); 3693 val &= ~QM_IFC_INT_DISABLE; 3694 writel(val, qm->io_base + QM_IFC_INT_MASK); 3695 } 3696 3697 static void qm_put_pci_res(struct hisi_qm *qm) 3698 { 3699 struct pci_dev *pdev = qm->pdev; 3700 3701 if (test_bit(QM_SUPPORT_DB_ISOLATION, &qm->caps)) 3702 iounmap(qm->db_io_base); 3703 3704 iounmap(qm->io_base); 3705 pci_release_mem_regions(pdev); 3706 } 3707 3708 static void hisi_qm_pci_uninit(struct hisi_qm *qm) 3709 { 3710 struct pci_dev *pdev = qm->pdev; 3711 3712 pci_free_irq_vectors(pdev); 3713 qm_put_pci_res(qm); 3714 pci_disable_device(pdev); 3715 } 3716 3717 static void hisi_qm_set_state(struct hisi_qm *qm, u8 state) 3718 { 3719 if (qm->ver > QM_HW_V2 && qm->fun_type == QM_HW_VF) 3720 writel(state, qm->io_base + QM_VF_STATE); 3721 } 3722 3723 static void qm_last_regs_uninit(struct hisi_qm *qm) 3724 { 3725 struct qm_debug *debug = &qm->debug; 3726 3727 if (qm->fun_type == QM_HW_VF || !debug->qm_last_words) 3728 return; 3729 3730 kfree(debug->qm_last_words); 3731 debug->qm_last_words = NULL; 3732 } 3733 3734 static void hisi_qm_unint_work(struct hisi_qm *qm) 3735 { 3736 destroy_workqueue(qm->wq); 3737 } 3738 3739 static void hisi_qm_memory_uninit(struct hisi_qm *qm) 3740 { 3741 struct device *dev = &qm->pdev->dev; 3742 3743 hisi_qp_memory_uninit(qm, qm->qp_num); 3744 if (qm->qdma.va) { 3745 hisi_qm_cache_wb(qm); 3746 dma_free_coherent(dev, qm->qdma.size, 3747 qm->qdma.va, qm->qdma.dma); 3748 } 3749 3750 idr_destroy(&qm->qp_idr); 3751 3752 if (test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps)) 3753 kfree(qm->factor); 3754 } 3755 3756 /** 3757 * hisi_qm_uninit() - Uninitialize qm. 3758 * @qm: The qm needed uninit. 3759 * 3760 * This function uninits qm related device resources. 3761 */ 3762 void hisi_qm_uninit(struct hisi_qm *qm) 3763 { 3764 qm_last_regs_uninit(qm); 3765 3766 qm_cmd_uninit(qm); 3767 hisi_qm_unint_work(qm); 3768 down_write(&qm->qps_lock); 3769 3770 if (!qm_avail_state(qm, QM_CLOSE)) { 3771 up_write(&qm->qps_lock); 3772 return; 3773 } 3774 3775 hisi_qm_memory_uninit(qm); 3776 hisi_qm_set_state(qm, QM_NOT_READY); 3777 up_write(&qm->qps_lock); 3778 3779 qm_irqs_unregister(qm); 3780 hisi_qm_pci_uninit(qm); 3781 if (qm->use_sva) { 3782 uacce_remove(qm->uacce); 3783 qm->uacce = NULL; 3784 } 3785 } 3786 EXPORT_SYMBOL_GPL(hisi_qm_uninit); 3787 3788 /** 3789 * hisi_qm_get_vft() - Get vft from a qm. 3790 * @qm: The qm we want to get its vft. 3791 * @base: The base number of queue in vft. 3792 * @number: The number of queues in vft. 3793 * 3794 * We can allocate multiple queues to a qm by configuring virtual function 3795 * table. We get related configures by this function. Normally, we call this 3796 * function in VF driver to get the queue information. 3797 * 3798 * qm hw v1 does not support this interface. 3799 */ 3800 static int hisi_qm_get_vft(struct hisi_qm *qm, u32 *base, u32 *number) 3801 { 3802 if (!base || !number) 3803 return -EINVAL; 3804 3805 if (!qm->ops->get_vft) { 3806 dev_err(&qm->pdev->dev, "Don't support vft read!\n"); 3807 return -EINVAL; 3808 } 3809 3810 return qm->ops->get_vft(qm, base, number); 3811 } 3812 3813 /** 3814 * hisi_qm_set_vft() - Set vft to a qm. 3815 * @qm: The qm we want to set its vft. 3816 * @fun_num: The function number. 3817 * @base: The base number of queue in vft. 3818 * @number: The number of queues in vft. 3819 * 3820 * This function is alway called in PF driver, it is used to assign queues 3821 * among PF and VFs. 3822 * 3823 * Assign queues A~B to PF: hisi_qm_set_vft(qm, 0, A, B - A + 1) 3824 * Assign queues A~B to VF: hisi_qm_set_vft(qm, 2, A, B - A + 1) 3825 * (VF function number 0x2) 3826 */ 3827 static int hisi_qm_set_vft(struct hisi_qm *qm, u32 fun_num, u32 base, 3828 u32 number) 3829 { 3830 u32 max_q_num = qm->ctrl_qp_num; 3831 3832 if (base >= max_q_num || number > max_q_num || 3833 (base + number) > max_q_num) 3834 return -EINVAL; 3835 3836 return qm_set_sqc_cqc_vft(qm, fun_num, base, number); 3837 } 3838 3839 static void qm_init_eq_aeq_status(struct hisi_qm *qm) 3840 { 3841 struct hisi_qm_status *status = &qm->status; 3842 3843 status->eq_head = 0; 3844 status->aeq_head = 0; 3845 status->eqc_phase = true; 3846 status->aeqc_phase = true; 3847 } 3848 3849 static void qm_enable_eq_aeq_interrupts(struct hisi_qm *qm) 3850 { 3851 /* Clear eq/aeq interrupt source */ 3852 qm_db(qm, 0, QM_DOORBELL_CMD_AEQ, qm->status.aeq_head, 0); 3853 qm_db(qm, 0, QM_DOORBELL_CMD_EQ, qm->status.eq_head, 0); 3854 3855 writel(0x0, qm->io_base + QM_VF_EQ_INT_MASK); 3856 writel(0x0, qm->io_base + QM_VF_AEQ_INT_MASK); 3857 } 3858 3859 static void qm_disable_eq_aeq_interrupts(struct hisi_qm *qm) 3860 { 3861 writel(0x1, qm->io_base + QM_VF_EQ_INT_MASK); 3862 writel(0x1, qm->io_base + QM_VF_AEQ_INT_MASK); 3863 } 3864 3865 static int qm_eq_ctx_cfg(struct hisi_qm *qm) 3866 { 3867 struct device *dev = &qm->pdev->dev; 3868 struct qm_eqc *eqc; 3869 dma_addr_t eqc_dma; 3870 int ret; 3871 3872 eqc = kzalloc(sizeof(struct qm_eqc), GFP_KERNEL); 3873 if (!eqc) 3874 return -ENOMEM; 3875 3876 eqc->base_l = cpu_to_le32(lower_32_bits(qm->eqe_dma)); 3877 eqc->base_h = cpu_to_le32(upper_32_bits(qm->eqe_dma)); 3878 if (qm->ver == QM_HW_V1) 3879 eqc->dw3 = cpu_to_le32(QM_EQE_AEQE_SIZE); 3880 eqc->dw6 = cpu_to_le32(((u32)qm->eq_depth - 1) | (1 << QM_EQC_PHASE_SHIFT)); 3881 3882 eqc_dma = dma_map_single(dev, eqc, sizeof(struct qm_eqc), 3883 DMA_TO_DEVICE); 3884 if (dma_mapping_error(dev, eqc_dma)) { 3885 kfree(eqc); 3886 return -ENOMEM; 3887 } 3888 3889 ret = hisi_qm_mb(qm, QM_MB_CMD_EQC, eqc_dma, 0, 0); 3890 dma_unmap_single(dev, eqc_dma, sizeof(struct qm_eqc), DMA_TO_DEVICE); 3891 kfree(eqc); 3892 3893 return ret; 3894 } 3895 3896 static int qm_aeq_ctx_cfg(struct hisi_qm *qm) 3897 { 3898 struct device *dev = &qm->pdev->dev; 3899 struct qm_aeqc *aeqc; 3900 dma_addr_t aeqc_dma; 3901 int ret; 3902 3903 aeqc = kzalloc(sizeof(struct qm_aeqc), GFP_KERNEL); 3904 if (!aeqc) 3905 return -ENOMEM; 3906 3907 aeqc->base_l = cpu_to_le32(lower_32_bits(qm->aeqe_dma)); 3908 aeqc->base_h = cpu_to_le32(upper_32_bits(qm->aeqe_dma)); 3909 aeqc->dw6 = cpu_to_le32(((u32)qm->aeq_depth - 1) | (1 << QM_EQC_PHASE_SHIFT)); 3910 3911 aeqc_dma = dma_map_single(dev, aeqc, sizeof(struct qm_aeqc), 3912 DMA_TO_DEVICE); 3913 if (dma_mapping_error(dev, aeqc_dma)) { 3914 kfree(aeqc); 3915 return -ENOMEM; 3916 } 3917 3918 ret = hisi_qm_mb(qm, QM_MB_CMD_AEQC, aeqc_dma, 0, 0); 3919 dma_unmap_single(dev, aeqc_dma, sizeof(struct qm_aeqc), DMA_TO_DEVICE); 3920 kfree(aeqc); 3921 3922 return ret; 3923 } 3924 3925 static int qm_eq_aeq_ctx_cfg(struct hisi_qm *qm) 3926 { 3927 struct device *dev = &qm->pdev->dev; 3928 int ret; 3929 3930 qm_init_eq_aeq_status(qm); 3931 3932 ret = qm_eq_ctx_cfg(qm); 3933 if (ret) { 3934 dev_err(dev, "Set eqc failed!\n"); 3935 return ret; 3936 } 3937 3938 return qm_aeq_ctx_cfg(qm); 3939 } 3940 3941 static int __hisi_qm_start(struct hisi_qm *qm) 3942 { 3943 int ret; 3944 3945 WARN_ON(!qm->qdma.va); 3946 3947 if (qm->fun_type == QM_HW_PF) { 3948 ret = hisi_qm_set_vft(qm, 0, qm->qp_base, qm->qp_num); 3949 if (ret) 3950 return ret; 3951 } 3952 3953 ret = qm_eq_aeq_ctx_cfg(qm); 3954 if (ret) 3955 return ret; 3956 3957 ret = hisi_qm_mb(qm, QM_MB_CMD_SQC_BT, qm->sqc_dma, 0, 0); 3958 if (ret) 3959 return ret; 3960 3961 ret = hisi_qm_mb(qm, QM_MB_CMD_CQC_BT, qm->cqc_dma, 0, 0); 3962 if (ret) 3963 return ret; 3964 3965 qm_init_prefetch(qm); 3966 qm_enable_eq_aeq_interrupts(qm); 3967 3968 return 0; 3969 } 3970 3971 /** 3972 * hisi_qm_start() - start qm 3973 * @qm: The qm to be started. 3974 * 3975 * This function starts a qm, then we can allocate qp from this qm. 3976 */ 3977 int hisi_qm_start(struct hisi_qm *qm) 3978 { 3979 struct device *dev = &qm->pdev->dev; 3980 int ret = 0; 3981 3982 down_write(&qm->qps_lock); 3983 3984 if (!qm_avail_state(qm, QM_START)) { 3985 up_write(&qm->qps_lock); 3986 return -EPERM; 3987 } 3988 3989 dev_dbg(dev, "qm start with %u queue pairs\n", qm->qp_num); 3990 3991 if (!qm->qp_num) { 3992 dev_err(dev, "qp_num should not be 0\n"); 3993 ret = -EINVAL; 3994 goto err_unlock; 3995 } 3996 3997 ret = __hisi_qm_start(qm); 3998 if (!ret) 3999 atomic_set(&qm->status.flags, QM_START); 4000 4001 hisi_qm_set_state(qm, QM_READY); 4002 err_unlock: 4003 up_write(&qm->qps_lock); 4004 return ret; 4005 } 4006 EXPORT_SYMBOL_GPL(hisi_qm_start); 4007 4008 static int qm_restart(struct hisi_qm *qm) 4009 { 4010 struct device *dev = &qm->pdev->dev; 4011 struct hisi_qp *qp; 4012 int ret, i; 4013 4014 ret = hisi_qm_start(qm); 4015 if (ret < 0) 4016 return ret; 4017 4018 down_write(&qm->qps_lock); 4019 for (i = 0; i < qm->qp_num; i++) { 4020 qp = &qm->qp_array[i]; 4021 if (atomic_read(&qp->qp_status.flags) == QP_STOP && 4022 qp->is_resetting == true) { 4023 ret = qm_start_qp_nolock(qp, 0); 4024 if (ret < 0) { 4025 dev_err(dev, "Failed to start qp%d!\n", i); 4026 4027 up_write(&qm->qps_lock); 4028 return ret; 4029 } 4030 qp->is_resetting = false; 4031 } 4032 } 4033 up_write(&qm->qps_lock); 4034 4035 return 0; 4036 } 4037 4038 /* Stop started qps in reset flow */ 4039 static int qm_stop_started_qp(struct hisi_qm *qm) 4040 { 4041 struct device *dev = &qm->pdev->dev; 4042 struct hisi_qp *qp; 4043 int i, ret; 4044 4045 for (i = 0; i < qm->qp_num; i++) { 4046 qp = &qm->qp_array[i]; 4047 if (qp && atomic_read(&qp->qp_status.flags) == QP_START) { 4048 qp->is_resetting = true; 4049 ret = qm_stop_qp_nolock(qp); 4050 if (ret < 0) { 4051 dev_err(dev, "Failed to stop qp%d!\n", i); 4052 return ret; 4053 } 4054 } 4055 } 4056 4057 return 0; 4058 } 4059 4060 4061 /** 4062 * qm_clear_queues() - Clear all queues memory in a qm. 4063 * @qm: The qm in which the queues will be cleared. 4064 * 4065 * This function clears all queues memory in a qm. Reset of accelerator can 4066 * use this to clear queues. 4067 */ 4068 static void qm_clear_queues(struct hisi_qm *qm) 4069 { 4070 struct hisi_qp *qp; 4071 int i; 4072 4073 for (i = 0; i < qm->qp_num; i++) { 4074 qp = &qm->qp_array[i]; 4075 if (qp->is_in_kernel && qp->is_resetting) 4076 memset(qp->qdma.va, 0, qp->qdma.size); 4077 } 4078 4079 memset(qm->qdma.va, 0, qm->qdma.size); 4080 } 4081 4082 /** 4083 * hisi_qm_stop() - Stop a qm. 4084 * @qm: The qm which will be stopped. 4085 * @r: The reason to stop qm. 4086 * 4087 * This function stops qm and its qps, then qm can not accept request. 4088 * Related resources are not released at this state, we can use hisi_qm_start 4089 * to let qm start again. 4090 */ 4091 int hisi_qm_stop(struct hisi_qm *qm, enum qm_stop_reason r) 4092 { 4093 struct device *dev = &qm->pdev->dev; 4094 int ret = 0; 4095 4096 down_write(&qm->qps_lock); 4097 4098 qm->status.stop_reason = r; 4099 if (!qm_avail_state(qm, QM_STOP)) { 4100 ret = -EPERM; 4101 goto err_unlock; 4102 } 4103 4104 if (qm->status.stop_reason == QM_SOFT_RESET || 4105 qm->status.stop_reason == QM_FLR) { 4106 hisi_qm_set_hw_reset(qm, QM_RESET_STOP_TX_OFFSET); 4107 ret = qm_stop_started_qp(qm); 4108 if (ret < 0) { 4109 dev_err(dev, "Failed to stop started qp!\n"); 4110 goto err_unlock; 4111 } 4112 hisi_qm_set_hw_reset(qm, QM_RESET_STOP_RX_OFFSET); 4113 } 4114 4115 qm_disable_eq_aeq_interrupts(qm); 4116 if (qm->fun_type == QM_HW_PF) { 4117 ret = hisi_qm_set_vft(qm, 0, 0, 0); 4118 if (ret < 0) { 4119 dev_err(dev, "Failed to set vft!\n"); 4120 ret = -EBUSY; 4121 goto err_unlock; 4122 } 4123 } 4124 4125 qm_clear_queues(qm); 4126 atomic_set(&qm->status.flags, QM_STOP); 4127 4128 err_unlock: 4129 up_write(&qm->qps_lock); 4130 return ret; 4131 } 4132 EXPORT_SYMBOL_GPL(hisi_qm_stop); 4133 4134 static ssize_t qm_status_read(struct file *filp, char __user *buffer, 4135 size_t count, loff_t *pos) 4136 { 4137 struct hisi_qm *qm = filp->private_data; 4138 char buf[QM_DBG_READ_LEN]; 4139 int val, len; 4140 4141 val = atomic_read(&qm->status.flags); 4142 len = scnprintf(buf, QM_DBG_READ_LEN, "%s\n", qm_s[val]); 4143 4144 return simple_read_from_buffer(buffer, count, pos, buf, len); 4145 } 4146 4147 static const struct file_operations qm_status_fops = { 4148 .owner = THIS_MODULE, 4149 .open = simple_open, 4150 .read = qm_status_read, 4151 }; 4152 4153 static int qm_debugfs_atomic64_set(void *data, u64 val) 4154 { 4155 if (val) 4156 return -EINVAL; 4157 4158 atomic64_set((atomic64_t *)data, 0); 4159 4160 return 0; 4161 } 4162 4163 static int qm_debugfs_atomic64_get(void *data, u64 *val) 4164 { 4165 *val = atomic64_read((atomic64_t *)data); 4166 4167 return 0; 4168 } 4169 4170 DEFINE_DEBUGFS_ATTRIBUTE(qm_atomic64_ops, qm_debugfs_atomic64_get, 4171 qm_debugfs_atomic64_set, "%llu\n"); 4172 4173 static void qm_hw_error_init(struct hisi_qm *qm) 4174 { 4175 if (!qm->ops->hw_error_init) { 4176 dev_err(&qm->pdev->dev, "QM doesn't support hw error handling!\n"); 4177 return; 4178 } 4179 4180 qm->ops->hw_error_init(qm); 4181 } 4182 4183 static void qm_hw_error_uninit(struct hisi_qm *qm) 4184 { 4185 if (!qm->ops->hw_error_uninit) { 4186 dev_err(&qm->pdev->dev, "Unexpected QM hw error uninit!\n"); 4187 return; 4188 } 4189 4190 qm->ops->hw_error_uninit(qm); 4191 } 4192 4193 static enum acc_err_result qm_hw_error_handle(struct hisi_qm *qm) 4194 { 4195 if (!qm->ops->hw_error_handle) { 4196 dev_err(&qm->pdev->dev, "QM doesn't support hw error report!\n"); 4197 return ACC_ERR_NONE; 4198 } 4199 4200 return qm->ops->hw_error_handle(qm); 4201 } 4202 4203 /** 4204 * hisi_qm_dev_err_init() - Initialize device error configuration. 4205 * @qm: The qm for which we want to do error initialization. 4206 * 4207 * Initialize QM and device error related configuration. 4208 */ 4209 void hisi_qm_dev_err_init(struct hisi_qm *qm) 4210 { 4211 if (qm->fun_type == QM_HW_VF) 4212 return; 4213 4214 qm_hw_error_init(qm); 4215 4216 if (!qm->err_ini->hw_err_enable) { 4217 dev_err(&qm->pdev->dev, "Device doesn't support hw error init!\n"); 4218 return; 4219 } 4220 qm->err_ini->hw_err_enable(qm); 4221 } 4222 EXPORT_SYMBOL_GPL(hisi_qm_dev_err_init); 4223 4224 /** 4225 * hisi_qm_dev_err_uninit() - Uninitialize device error configuration. 4226 * @qm: The qm for which we want to do error uninitialization. 4227 * 4228 * Uninitialize QM and device error related configuration. 4229 */ 4230 void hisi_qm_dev_err_uninit(struct hisi_qm *qm) 4231 { 4232 if (qm->fun_type == QM_HW_VF) 4233 return; 4234 4235 qm_hw_error_uninit(qm); 4236 4237 if (!qm->err_ini->hw_err_disable) { 4238 dev_err(&qm->pdev->dev, "Unexpected device hw error uninit!\n"); 4239 return; 4240 } 4241 qm->err_ini->hw_err_disable(qm); 4242 } 4243 EXPORT_SYMBOL_GPL(hisi_qm_dev_err_uninit); 4244 4245 /** 4246 * hisi_qm_free_qps() - free multiple queue pairs. 4247 * @qps: The queue pairs need to be freed. 4248 * @qp_num: The num of queue pairs. 4249 */ 4250 void hisi_qm_free_qps(struct hisi_qp **qps, int qp_num) 4251 { 4252 int i; 4253 4254 if (!qps || qp_num <= 0) 4255 return; 4256 4257 for (i = qp_num - 1; i >= 0; i--) 4258 hisi_qm_release_qp(qps[i]); 4259 } 4260 EXPORT_SYMBOL_GPL(hisi_qm_free_qps); 4261 4262 static void free_list(struct list_head *head) 4263 { 4264 struct hisi_qm_resource *res, *tmp; 4265 4266 list_for_each_entry_safe(res, tmp, head, list) { 4267 list_del(&res->list); 4268 kfree(res); 4269 } 4270 } 4271 4272 static int hisi_qm_sort_devices(int node, struct list_head *head, 4273 struct hisi_qm_list *qm_list) 4274 { 4275 struct hisi_qm_resource *res, *tmp; 4276 struct hisi_qm *qm; 4277 struct list_head *n; 4278 struct device *dev; 4279 int dev_node; 4280 4281 list_for_each_entry(qm, &qm_list->list, list) { 4282 dev = &qm->pdev->dev; 4283 4284 dev_node = dev_to_node(dev); 4285 if (dev_node < 0) 4286 dev_node = 0; 4287 4288 res = kzalloc(sizeof(*res), GFP_KERNEL); 4289 if (!res) 4290 return -ENOMEM; 4291 4292 res->qm = qm; 4293 res->distance = node_distance(dev_node, node); 4294 n = head; 4295 list_for_each_entry(tmp, head, list) { 4296 if (res->distance < tmp->distance) { 4297 n = &tmp->list; 4298 break; 4299 } 4300 } 4301 list_add_tail(&res->list, n); 4302 } 4303 4304 return 0; 4305 } 4306 4307 /** 4308 * hisi_qm_alloc_qps_node() - Create multiple queue pairs. 4309 * @qm_list: The list of all available devices. 4310 * @qp_num: The number of queue pairs need created. 4311 * @alg_type: The algorithm type. 4312 * @node: The numa node. 4313 * @qps: The queue pairs need created. 4314 * 4315 * This function will sort all available device according to numa distance. 4316 * Then try to create all queue pairs from one device, if all devices do 4317 * not meet the requirements will return error. 4318 */ 4319 int hisi_qm_alloc_qps_node(struct hisi_qm_list *qm_list, int qp_num, 4320 u8 alg_type, int node, struct hisi_qp **qps) 4321 { 4322 struct hisi_qm_resource *tmp; 4323 int ret = -ENODEV; 4324 LIST_HEAD(head); 4325 int i; 4326 4327 if (!qps || !qm_list || qp_num <= 0) 4328 return -EINVAL; 4329 4330 mutex_lock(&qm_list->lock); 4331 if (hisi_qm_sort_devices(node, &head, qm_list)) { 4332 mutex_unlock(&qm_list->lock); 4333 goto err; 4334 } 4335 4336 list_for_each_entry(tmp, &head, list) { 4337 for (i = 0; i < qp_num; i++) { 4338 qps[i] = hisi_qm_create_qp(tmp->qm, alg_type); 4339 if (IS_ERR(qps[i])) { 4340 hisi_qm_free_qps(qps, i); 4341 break; 4342 } 4343 } 4344 4345 if (i == qp_num) { 4346 ret = 0; 4347 break; 4348 } 4349 } 4350 4351 mutex_unlock(&qm_list->lock); 4352 if (ret) 4353 pr_info("Failed to create qps, node[%d], alg[%u], qp[%d]!\n", 4354 node, alg_type, qp_num); 4355 4356 err: 4357 free_list(&head); 4358 return ret; 4359 } 4360 EXPORT_SYMBOL_GPL(hisi_qm_alloc_qps_node); 4361 4362 static int qm_vf_q_assign(struct hisi_qm *qm, u32 num_vfs) 4363 { 4364 u32 remain_q_num, vfs_q_num, act_q_num, q_num, i, j; 4365 u32 max_qp_num = qm->max_qp_num; 4366 u32 q_base = qm->qp_num; 4367 int ret; 4368 4369 if (!num_vfs) 4370 return -EINVAL; 4371 4372 vfs_q_num = qm->ctrl_qp_num - qm->qp_num; 4373 4374 /* If vfs_q_num is less than num_vfs, return error. */ 4375 if (vfs_q_num < num_vfs) 4376 return -EINVAL; 4377 4378 q_num = vfs_q_num / num_vfs; 4379 remain_q_num = vfs_q_num % num_vfs; 4380 4381 for (i = num_vfs; i > 0; i--) { 4382 /* 4383 * if q_num + remain_q_num > max_qp_num in last vf, divide the 4384 * remaining queues equally. 4385 */ 4386 if (i == num_vfs && q_num + remain_q_num <= max_qp_num) { 4387 act_q_num = q_num + remain_q_num; 4388 remain_q_num = 0; 4389 } else if (remain_q_num > 0) { 4390 act_q_num = q_num + 1; 4391 remain_q_num--; 4392 } else { 4393 act_q_num = q_num; 4394 } 4395 4396 act_q_num = min_t(int, act_q_num, max_qp_num); 4397 ret = hisi_qm_set_vft(qm, i, q_base, act_q_num); 4398 if (ret) { 4399 for (j = num_vfs; j > i; j--) 4400 hisi_qm_set_vft(qm, j, 0, 0); 4401 return ret; 4402 } 4403 q_base += act_q_num; 4404 } 4405 4406 return 0; 4407 } 4408 4409 static int qm_clear_vft_config(struct hisi_qm *qm) 4410 { 4411 int ret; 4412 u32 i; 4413 4414 for (i = 1; i <= qm->vfs_num; i++) { 4415 ret = hisi_qm_set_vft(qm, i, 0, 0); 4416 if (ret) 4417 return ret; 4418 } 4419 qm->vfs_num = 0; 4420 4421 return 0; 4422 } 4423 4424 static int qm_func_shaper_enable(struct hisi_qm *qm, u32 fun_index, u32 qos) 4425 { 4426 struct device *dev = &qm->pdev->dev; 4427 u32 ir = qos * QM_QOS_RATE; 4428 int ret, total_vfs, i; 4429 4430 total_vfs = pci_sriov_get_totalvfs(qm->pdev); 4431 if (fun_index > total_vfs) 4432 return -EINVAL; 4433 4434 qm->factor[fun_index].func_qos = qos; 4435 4436 ret = qm_get_shaper_para(ir, &qm->factor[fun_index]); 4437 if (ret) { 4438 dev_err(dev, "failed to calculate shaper parameter!\n"); 4439 return -EINVAL; 4440 } 4441 4442 for (i = ALG_TYPE_0; i <= ALG_TYPE_1; i++) { 4443 /* The base number of queue reuse for different alg type */ 4444 ret = qm_set_vft_common(qm, SHAPER_VFT, fun_index, i, 1); 4445 if (ret) { 4446 dev_err(dev, "type: %d, failed to set shaper vft!\n", i); 4447 return -EINVAL; 4448 } 4449 } 4450 4451 return 0; 4452 } 4453 4454 static u32 qm_get_shaper_vft_qos(struct hisi_qm *qm, u32 fun_index) 4455 { 4456 u64 cir_u = 0, cir_b = 0, cir_s = 0; 4457 u64 shaper_vft, ir_calc, ir; 4458 unsigned int val; 4459 u32 error_rate; 4460 int ret; 4461 4462 ret = readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val, 4463 val & BIT(0), POLL_PERIOD, 4464 POLL_TIMEOUT); 4465 if (ret) 4466 return 0; 4467 4468 writel(0x1, qm->io_base + QM_VFT_CFG_OP_WR); 4469 writel(SHAPER_VFT, qm->io_base + QM_VFT_CFG_TYPE); 4470 writel(fun_index, qm->io_base + QM_VFT_CFG); 4471 4472 writel(0x0, qm->io_base + QM_VFT_CFG_RDY); 4473 writel(0x1, qm->io_base + QM_VFT_CFG_OP_ENABLE); 4474 4475 ret = readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val, 4476 val & BIT(0), POLL_PERIOD, 4477 POLL_TIMEOUT); 4478 if (ret) 4479 return 0; 4480 4481 shaper_vft = readl(qm->io_base + QM_VFT_CFG_DATA_L) | 4482 ((u64)readl(qm->io_base + QM_VFT_CFG_DATA_H) << 32); 4483 4484 cir_b = shaper_vft & QM_SHAPER_CIR_B_MASK; 4485 cir_u = shaper_vft & QM_SHAPER_CIR_U_MASK; 4486 cir_u = cir_u >> QM_SHAPER_FACTOR_CIR_U_SHIFT; 4487 4488 cir_s = shaper_vft & QM_SHAPER_CIR_S_MASK; 4489 cir_s = cir_s >> QM_SHAPER_FACTOR_CIR_S_SHIFT; 4490 4491 ir_calc = acc_shaper_para_calc(cir_b, cir_u, cir_s); 4492 4493 ir = qm->factor[fun_index].func_qos * QM_QOS_RATE; 4494 4495 error_rate = QM_QOS_EXPAND_RATE * (u32)abs(ir_calc - ir) / ir; 4496 if (error_rate > QM_QOS_MIN_ERROR_RATE) { 4497 pci_err(qm->pdev, "error_rate: %u, get function qos is error!\n", error_rate); 4498 return 0; 4499 } 4500 4501 return ir; 4502 } 4503 4504 static void qm_vf_get_qos(struct hisi_qm *qm, u32 fun_num) 4505 { 4506 struct device *dev = &qm->pdev->dev; 4507 u64 mb_cmd; 4508 u32 qos; 4509 int ret; 4510 4511 qos = qm_get_shaper_vft_qos(qm, fun_num); 4512 if (!qos) { 4513 dev_err(dev, "function(%u) failed to get qos by PF!\n", fun_num); 4514 return; 4515 } 4516 4517 mb_cmd = QM_PF_SET_QOS | (u64)qos << QM_MB_CMD_DATA_SHIFT; 4518 ret = qm_ping_single_vf(qm, mb_cmd, fun_num); 4519 if (ret) 4520 dev_err(dev, "failed to send cmd to VF(%u)!\n", fun_num); 4521 } 4522 4523 static int qm_vf_read_qos(struct hisi_qm *qm) 4524 { 4525 int cnt = 0; 4526 int ret = -EINVAL; 4527 4528 /* reset mailbox qos val */ 4529 qm->mb_qos = 0; 4530 4531 /* vf ping pf to get function qos */ 4532 ret = qm_ping_pf(qm, QM_VF_GET_QOS); 4533 if (ret) { 4534 pci_err(qm->pdev, "failed to send cmd to PF to get qos!\n"); 4535 return ret; 4536 } 4537 4538 while (true) { 4539 msleep(QM_WAIT_DST_ACK); 4540 if (qm->mb_qos) 4541 break; 4542 4543 if (++cnt > QM_MAX_VF_WAIT_COUNT) { 4544 pci_err(qm->pdev, "PF ping VF timeout!\n"); 4545 return -ETIMEDOUT; 4546 } 4547 } 4548 4549 return ret; 4550 } 4551 4552 static ssize_t qm_algqos_read(struct file *filp, char __user *buf, 4553 size_t count, loff_t *pos) 4554 { 4555 struct hisi_qm *qm = filp->private_data; 4556 char tbuf[QM_DBG_READ_LEN]; 4557 u32 qos_val, ir; 4558 int ret; 4559 4560 ret = hisi_qm_get_dfx_access(qm); 4561 if (ret) 4562 return ret; 4563 4564 /* Mailbox and reset cannot be operated at the same time */ 4565 if (test_and_set_bit(QM_RESETTING, &qm->misc_ctl)) { 4566 pci_err(qm->pdev, "dev resetting, read alg qos failed!\n"); 4567 ret = -EAGAIN; 4568 goto err_put_dfx_access; 4569 } 4570 4571 if (qm->fun_type == QM_HW_PF) { 4572 ir = qm_get_shaper_vft_qos(qm, 0); 4573 } else { 4574 ret = qm_vf_read_qos(qm); 4575 if (ret) 4576 goto err_get_status; 4577 ir = qm->mb_qos; 4578 } 4579 4580 qos_val = ir / QM_QOS_RATE; 4581 ret = scnprintf(tbuf, QM_DBG_READ_LEN, "%u\n", qos_val); 4582 4583 ret = simple_read_from_buffer(buf, count, pos, tbuf, ret); 4584 4585 err_get_status: 4586 clear_bit(QM_RESETTING, &qm->misc_ctl); 4587 err_put_dfx_access: 4588 hisi_qm_put_dfx_access(qm); 4589 return ret; 4590 } 4591 4592 static ssize_t qm_get_qos_value(struct hisi_qm *qm, const char *buf, 4593 unsigned long *val, 4594 unsigned int *fun_index) 4595 { 4596 struct bus_type *bus_type = qm->pdev->dev.bus; 4597 char tbuf_bdf[QM_DBG_READ_LEN] = {0}; 4598 char val_buf[QM_DBG_READ_LEN] = {0}; 4599 struct pci_dev *pdev; 4600 struct device *dev; 4601 int ret; 4602 4603 ret = sscanf(buf, "%s %s", tbuf_bdf, val_buf); 4604 if (ret != QM_QOS_PARAM_NUM) 4605 return -EINVAL; 4606 4607 ret = kstrtoul(val_buf, 10, val); 4608 if (ret || *val == 0 || *val > QM_QOS_MAX_VAL) { 4609 pci_err(qm->pdev, "input qos value is error, please set 1~1000!\n"); 4610 return -EINVAL; 4611 } 4612 4613 dev = bus_find_device_by_name(bus_type, NULL, tbuf_bdf); 4614 if (!dev) { 4615 pci_err(qm->pdev, "input pci bdf number is error!\n"); 4616 return -ENODEV; 4617 } 4618 4619 pdev = container_of(dev, struct pci_dev, dev); 4620 4621 *fun_index = pdev->devfn; 4622 4623 return 0; 4624 } 4625 4626 static ssize_t qm_algqos_write(struct file *filp, const char __user *buf, 4627 size_t count, loff_t *pos) 4628 { 4629 struct hisi_qm *qm = filp->private_data; 4630 char tbuf[QM_DBG_READ_LEN]; 4631 unsigned int fun_index; 4632 unsigned long val; 4633 int len, ret; 4634 4635 if (*pos != 0) 4636 return 0; 4637 4638 if (count >= QM_DBG_READ_LEN) 4639 return -ENOSPC; 4640 4641 len = simple_write_to_buffer(tbuf, QM_DBG_READ_LEN - 1, pos, buf, count); 4642 if (len < 0) 4643 return len; 4644 4645 tbuf[len] = '\0'; 4646 ret = qm_get_qos_value(qm, tbuf, &val, &fun_index); 4647 if (ret) 4648 return ret; 4649 4650 /* Mailbox and reset cannot be operated at the same time */ 4651 if (test_and_set_bit(QM_RESETTING, &qm->misc_ctl)) { 4652 pci_err(qm->pdev, "dev resetting, write alg qos failed!\n"); 4653 return -EAGAIN; 4654 } 4655 4656 ret = qm_pm_get_sync(qm); 4657 if (ret) { 4658 ret = -EINVAL; 4659 goto err_get_status; 4660 } 4661 4662 ret = qm_func_shaper_enable(qm, fun_index, val); 4663 if (ret) { 4664 pci_err(qm->pdev, "failed to enable function shaper!\n"); 4665 ret = -EINVAL; 4666 goto err_put_sync; 4667 } 4668 4669 pci_info(qm->pdev, "the qos value of function%u is set to %lu.\n", 4670 fun_index, val); 4671 ret = count; 4672 4673 err_put_sync: 4674 qm_pm_put_sync(qm); 4675 err_get_status: 4676 clear_bit(QM_RESETTING, &qm->misc_ctl); 4677 return ret; 4678 } 4679 4680 static const struct file_operations qm_algqos_fops = { 4681 .owner = THIS_MODULE, 4682 .open = simple_open, 4683 .read = qm_algqos_read, 4684 .write = qm_algqos_write, 4685 }; 4686 4687 /** 4688 * hisi_qm_set_algqos_init() - Initialize function qos debugfs files. 4689 * @qm: The qm for which we want to add debugfs files. 4690 * 4691 * Create function qos debugfs files, VF ping PF to get function qos. 4692 */ 4693 static void hisi_qm_set_algqos_init(struct hisi_qm *qm) 4694 { 4695 if (qm->fun_type == QM_HW_PF) 4696 debugfs_create_file("alg_qos", 0644, qm->debug.debug_root, 4697 qm, &qm_algqos_fops); 4698 else if (test_bit(QM_SUPPORT_MB_COMMAND, &qm->caps)) 4699 debugfs_create_file("alg_qos", 0444, qm->debug.debug_root, 4700 qm, &qm_algqos_fops); 4701 } 4702 4703 /** 4704 * hisi_qm_debug_init() - Initialize qm related debugfs files. 4705 * @qm: The qm for which we want to add debugfs files. 4706 * 4707 * Create qm related debugfs files. 4708 */ 4709 void hisi_qm_debug_init(struct hisi_qm *qm) 4710 { 4711 struct dfx_diff_registers *qm_regs = qm->debug.qm_diff_regs; 4712 struct qm_dfx *dfx = &qm->debug.dfx; 4713 struct dentry *qm_d; 4714 void *data; 4715 int i; 4716 4717 qm_d = debugfs_create_dir("qm", qm->debug.debug_root); 4718 qm->debug.qm_d = qm_d; 4719 4720 /* only show this in PF */ 4721 if (qm->fun_type == QM_HW_PF) { 4722 qm_create_debugfs_file(qm, qm->debug.debug_root, CURRENT_QM); 4723 for (i = CURRENT_Q; i < DEBUG_FILE_NUM; i++) 4724 qm_create_debugfs_file(qm, qm->debug.qm_d, i); 4725 } 4726 4727 if (qm_regs) 4728 debugfs_create_file("diff_regs", 0444, qm->debug.qm_d, 4729 qm, &qm_diff_regs_fops); 4730 4731 debugfs_create_file("regs", 0444, qm->debug.qm_d, qm, &qm_regs_fops); 4732 4733 debugfs_create_file("cmd", 0600, qm->debug.qm_d, qm, &qm_cmd_fops); 4734 4735 debugfs_create_file("status", 0444, qm->debug.qm_d, qm, 4736 &qm_status_fops); 4737 for (i = 0; i < ARRAY_SIZE(qm_dfx_files); i++) { 4738 data = (atomic64_t *)((uintptr_t)dfx + qm_dfx_files[i].offset); 4739 debugfs_create_file(qm_dfx_files[i].name, 4740 0644, 4741 qm_d, 4742 data, 4743 &qm_atomic64_ops); 4744 } 4745 4746 if (test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps)) 4747 hisi_qm_set_algqos_init(qm); 4748 } 4749 EXPORT_SYMBOL_GPL(hisi_qm_debug_init); 4750 4751 /** 4752 * hisi_qm_debug_regs_clear() - clear qm debug related registers. 4753 * @qm: The qm for which we want to clear its debug registers. 4754 */ 4755 void hisi_qm_debug_regs_clear(struct hisi_qm *qm) 4756 { 4757 const struct debugfs_reg32 *regs; 4758 int i; 4759 4760 /* clear current_qm */ 4761 writel(0x0, qm->io_base + QM_DFX_MB_CNT_VF); 4762 writel(0x0, qm->io_base + QM_DFX_DB_CNT_VF); 4763 4764 /* clear current_q */ 4765 writel(0x0, qm->io_base + QM_DFX_SQE_CNT_VF_SQN); 4766 writel(0x0, qm->io_base + QM_DFX_CQE_CNT_VF_CQN); 4767 4768 /* 4769 * these registers are reading and clearing, so clear them after 4770 * reading them. 4771 */ 4772 writel(0x1, qm->io_base + QM_DFX_CNT_CLR_CE); 4773 4774 regs = qm_dfx_regs; 4775 for (i = 0; i < CNT_CYC_REGS_NUM; i++) { 4776 readl(qm->io_base + regs->offset); 4777 regs++; 4778 } 4779 4780 /* clear clear_enable */ 4781 writel(0x0, qm->io_base + QM_DFX_CNT_CLR_CE); 4782 } 4783 EXPORT_SYMBOL_GPL(hisi_qm_debug_regs_clear); 4784 4785 static void hisi_qm_init_vf_qos(struct hisi_qm *qm, int total_func) 4786 { 4787 int i; 4788 4789 for (i = 1; i <= total_func; i++) 4790 qm->factor[i].func_qos = QM_QOS_MAX_VAL; 4791 } 4792 4793 /** 4794 * hisi_qm_sriov_enable() - enable virtual functions 4795 * @pdev: the PCIe device 4796 * @max_vfs: the number of virtual functions to enable 4797 * 4798 * Returns the number of enabled VFs. If there are VFs enabled already or 4799 * max_vfs is more than the total number of device can be enabled, returns 4800 * failure. 4801 */ 4802 int hisi_qm_sriov_enable(struct pci_dev *pdev, int max_vfs) 4803 { 4804 struct hisi_qm *qm = pci_get_drvdata(pdev); 4805 int pre_existing_vfs, num_vfs, total_vfs, ret; 4806 4807 ret = qm_pm_get_sync(qm); 4808 if (ret) 4809 return ret; 4810 4811 total_vfs = pci_sriov_get_totalvfs(pdev); 4812 pre_existing_vfs = pci_num_vf(pdev); 4813 if (pre_existing_vfs) { 4814 pci_err(pdev, "%d VFs already enabled. Please disable pre-enabled VFs!\n", 4815 pre_existing_vfs); 4816 goto err_put_sync; 4817 } 4818 4819 if (max_vfs > total_vfs) { 4820 pci_err(pdev, "%d VFs is more than total VFs %d!\n", max_vfs, total_vfs); 4821 ret = -ERANGE; 4822 goto err_put_sync; 4823 } 4824 4825 num_vfs = max_vfs; 4826 4827 if (test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps)) 4828 hisi_qm_init_vf_qos(qm, num_vfs); 4829 4830 ret = qm_vf_q_assign(qm, num_vfs); 4831 if (ret) { 4832 pci_err(pdev, "Can't assign queues for VF!\n"); 4833 goto err_put_sync; 4834 } 4835 4836 qm->vfs_num = num_vfs; 4837 4838 ret = pci_enable_sriov(pdev, num_vfs); 4839 if (ret) { 4840 pci_err(pdev, "Can't enable VF!\n"); 4841 qm_clear_vft_config(qm); 4842 goto err_put_sync; 4843 } 4844 4845 pci_info(pdev, "VF enabled, vfs_num(=%d)!\n", num_vfs); 4846 4847 return num_vfs; 4848 4849 err_put_sync: 4850 qm_pm_put_sync(qm); 4851 return ret; 4852 } 4853 EXPORT_SYMBOL_GPL(hisi_qm_sriov_enable); 4854 4855 /** 4856 * hisi_qm_sriov_disable - disable virtual functions 4857 * @pdev: the PCI device. 4858 * @is_frozen: true when all the VFs are frozen. 4859 * 4860 * Return failure if there are VFs assigned already or VF is in used. 4861 */ 4862 int hisi_qm_sriov_disable(struct pci_dev *pdev, bool is_frozen) 4863 { 4864 struct hisi_qm *qm = pci_get_drvdata(pdev); 4865 int ret; 4866 4867 if (pci_vfs_assigned(pdev)) { 4868 pci_err(pdev, "Failed to disable VFs as VFs are assigned!\n"); 4869 return -EPERM; 4870 } 4871 4872 /* While VF is in used, SRIOV cannot be disabled. */ 4873 if (!is_frozen && qm_try_frozen_vfs(pdev, qm->qm_list)) { 4874 pci_err(pdev, "Task is using its VF!\n"); 4875 return -EBUSY; 4876 } 4877 4878 pci_disable_sriov(pdev); 4879 4880 ret = qm_clear_vft_config(qm); 4881 if (ret) 4882 return ret; 4883 4884 qm_pm_put_sync(qm); 4885 4886 return 0; 4887 } 4888 EXPORT_SYMBOL_GPL(hisi_qm_sriov_disable); 4889 4890 /** 4891 * hisi_qm_sriov_configure - configure the number of VFs 4892 * @pdev: The PCI device 4893 * @num_vfs: The number of VFs need enabled 4894 * 4895 * Enable SR-IOV according to num_vfs, 0 means disable. 4896 */ 4897 int hisi_qm_sriov_configure(struct pci_dev *pdev, int num_vfs) 4898 { 4899 if (num_vfs == 0) 4900 return hisi_qm_sriov_disable(pdev, false); 4901 else 4902 return hisi_qm_sriov_enable(pdev, num_vfs); 4903 } 4904 EXPORT_SYMBOL_GPL(hisi_qm_sriov_configure); 4905 4906 static enum acc_err_result qm_dev_err_handle(struct hisi_qm *qm) 4907 { 4908 u32 err_sts; 4909 4910 if (!qm->err_ini->get_dev_hw_err_status) { 4911 dev_err(&qm->pdev->dev, "Device doesn't support get hw error status!\n"); 4912 return ACC_ERR_NONE; 4913 } 4914 4915 /* get device hardware error status */ 4916 err_sts = qm->err_ini->get_dev_hw_err_status(qm); 4917 if (err_sts) { 4918 if (err_sts & qm->err_info.ecc_2bits_mask) 4919 qm->err_status.is_dev_ecc_mbit = true; 4920 4921 if (qm->err_ini->log_dev_hw_err) 4922 qm->err_ini->log_dev_hw_err(qm, err_sts); 4923 4924 if (err_sts & qm->err_info.dev_reset_mask) 4925 return ACC_ERR_NEED_RESET; 4926 4927 if (qm->err_ini->clear_dev_hw_err_status) 4928 qm->err_ini->clear_dev_hw_err_status(qm, err_sts); 4929 } 4930 4931 return ACC_ERR_RECOVERED; 4932 } 4933 4934 static enum acc_err_result qm_process_dev_error(struct hisi_qm *qm) 4935 { 4936 enum acc_err_result qm_ret, dev_ret; 4937 4938 /* log qm error */ 4939 qm_ret = qm_hw_error_handle(qm); 4940 4941 /* log device error */ 4942 dev_ret = qm_dev_err_handle(qm); 4943 4944 return (qm_ret == ACC_ERR_NEED_RESET || 4945 dev_ret == ACC_ERR_NEED_RESET) ? 4946 ACC_ERR_NEED_RESET : ACC_ERR_RECOVERED; 4947 } 4948 4949 /** 4950 * hisi_qm_dev_err_detected() - Get device and qm error status then log it. 4951 * @pdev: The PCI device which need report error. 4952 * @state: The connectivity between CPU and device. 4953 * 4954 * We register this function into PCIe AER handlers, It will report device or 4955 * qm hardware error status when error occur. 4956 */ 4957 pci_ers_result_t hisi_qm_dev_err_detected(struct pci_dev *pdev, 4958 pci_channel_state_t state) 4959 { 4960 struct hisi_qm *qm = pci_get_drvdata(pdev); 4961 enum acc_err_result ret; 4962 4963 if (pdev->is_virtfn) 4964 return PCI_ERS_RESULT_NONE; 4965 4966 pci_info(pdev, "PCI error detected, state(=%u)!!\n", state); 4967 if (state == pci_channel_io_perm_failure) 4968 return PCI_ERS_RESULT_DISCONNECT; 4969 4970 ret = qm_process_dev_error(qm); 4971 if (ret == ACC_ERR_NEED_RESET) 4972 return PCI_ERS_RESULT_NEED_RESET; 4973 4974 return PCI_ERS_RESULT_RECOVERED; 4975 } 4976 EXPORT_SYMBOL_GPL(hisi_qm_dev_err_detected); 4977 4978 static int qm_check_req_recv(struct hisi_qm *qm) 4979 { 4980 struct pci_dev *pdev = qm->pdev; 4981 int ret; 4982 u32 val; 4983 4984 if (qm->ver >= QM_HW_V3) 4985 return 0; 4986 4987 writel(ACC_VENDOR_ID_VALUE, qm->io_base + QM_PEH_VENDOR_ID); 4988 ret = readl_relaxed_poll_timeout(qm->io_base + QM_PEH_VENDOR_ID, val, 4989 (val == ACC_VENDOR_ID_VALUE), 4990 POLL_PERIOD, POLL_TIMEOUT); 4991 if (ret) { 4992 dev_err(&pdev->dev, "Fails to read QM reg!\n"); 4993 return ret; 4994 } 4995 4996 writel(PCI_VENDOR_ID_HUAWEI, qm->io_base + QM_PEH_VENDOR_ID); 4997 ret = readl_relaxed_poll_timeout(qm->io_base + QM_PEH_VENDOR_ID, val, 4998 (val == PCI_VENDOR_ID_HUAWEI), 4999 POLL_PERIOD, POLL_TIMEOUT); 5000 if (ret) 5001 dev_err(&pdev->dev, "Fails to read QM reg in the second time!\n"); 5002 5003 return ret; 5004 } 5005 5006 static int qm_set_pf_mse(struct hisi_qm *qm, bool set) 5007 { 5008 struct pci_dev *pdev = qm->pdev; 5009 u16 cmd; 5010 int i; 5011 5012 pci_read_config_word(pdev, PCI_COMMAND, &cmd); 5013 if (set) 5014 cmd |= PCI_COMMAND_MEMORY; 5015 else 5016 cmd &= ~PCI_COMMAND_MEMORY; 5017 5018 pci_write_config_word(pdev, PCI_COMMAND, cmd); 5019 for (i = 0; i < MAX_WAIT_COUNTS; i++) { 5020 pci_read_config_word(pdev, PCI_COMMAND, &cmd); 5021 if (set == ((cmd & PCI_COMMAND_MEMORY) >> 1)) 5022 return 0; 5023 5024 udelay(1); 5025 } 5026 5027 return -ETIMEDOUT; 5028 } 5029 5030 static int qm_set_vf_mse(struct hisi_qm *qm, bool set) 5031 { 5032 struct pci_dev *pdev = qm->pdev; 5033 u16 sriov_ctrl; 5034 int pos; 5035 int i; 5036 5037 pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV); 5038 pci_read_config_word(pdev, pos + PCI_SRIOV_CTRL, &sriov_ctrl); 5039 if (set) 5040 sriov_ctrl |= PCI_SRIOV_CTRL_MSE; 5041 else 5042 sriov_ctrl &= ~PCI_SRIOV_CTRL_MSE; 5043 pci_write_config_word(pdev, pos + PCI_SRIOV_CTRL, sriov_ctrl); 5044 5045 for (i = 0; i < MAX_WAIT_COUNTS; i++) { 5046 pci_read_config_word(pdev, pos + PCI_SRIOV_CTRL, &sriov_ctrl); 5047 if (set == (sriov_ctrl & PCI_SRIOV_CTRL_MSE) >> 5048 ACC_PEH_SRIOV_CTRL_VF_MSE_SHIFT) 5049 return 0; 5050 5051 udelay(1); 5052 } 5053 5054 return -ETIMEDOUT; 5055 } 5056 5057 static int qm_vf_reset_prepare(struct hisi_qm *qm, 5058 enum qm_stop_reason stop_reason) 5059 { 5060 struct hisi_qm_list *qm_list = qm->qm_list; 5061 struct pci_dev *pdev = qm->pdev; 5062 struct pci_dev *virtfn; 5063 struct hisi_qm *vf_qm; 5064 int ret = 0; 5065 5066 mutex_lock(&qm_list->lock); 5067 list_for_each_entry(vf_qm, &qm_list->list, list) { 5068 virtfn = vf_qm->pdev; 5069 if (virtfn == pdev) 5070 continue; 5071 5072 if (pci_physfn(virtfn) == pdev) { 5073 /* save VFs PCIE BAR configuration */ 5074 pci_save_state(virtfn); 5075 5076 ret = hisi_qm_stop(vf_qm, stop_reason); 5077 if (ret) 5078 goto stop_fail; 5079 } 5080 } 5081 5082 stop_fail: 5083 mutex_unlock(&qm_list->lock); 5084 return ret; 5085 } 5086 5087 static int qm_try_stop_vfs(struct hisi_qm *qm, u64 cmd, 5088 enum qm_stop_reason stop_reason) 5089 { 5090 struct pci_dev *pdev = qm->pdev; 5091 int ret; 5092 5093 if (!qm->vfs_num) 5094 return 0; 5095 5096 /* Kunpeng930 supports to notify VFs to stop before PF reset */ 5097 if (test_bit(QM_SUPPORT_MB_COMMAND, &qm->caps)) { 5098 ret = qm_ping_all_vfs(qm, cmd); 5099 if (ret) 5100 pci_err(pdev, "failed to send cmd to all VFs before PF reset!\n"); 5101 } else { 5102 ret = qm_vf_reset_prepare(qm, stop_reason); 5103 if (ret) 5104 pci_err(pdev, "failed to prepare reset, ret = %d.\n", ret); 5105 } 5106 5107 return ret; 5108 } 5109 5110 static int qm_controller_reset_prepare(struct hisi_qm *qm) 5111 { 5112 struct pci_dev *pdev = qm->pdev; 5113 int ret; 5114 5115 ret = qm_reset_prepare_ready(qm); 5116 if (ret) { 5117 pci_err(pdev, "Controller reset not ready!\n"); 5118 return ret; 5119 } 5120 5121 /* PF obtains the information of VF by querying the register. */ 5122 qm_cmd_uninit(qm); 5123 5124 /* Whether VFs stop successfully, soft reset will continue. */ 5125 ret = qm_try_stop_vfs(qm, QM_PF_SRST_PREPARE, QM_SOFT_RESET); 5126 if (ret) 5127 pci_err(pdev, "failed to stop vfs by pf in soft reset.\n"); 5128 5129 ret = hisi_qm_stop(qm, QM_SOFT_RESET); 5130 if (ret) { 5131 pci_err(pdev, "Fails to stop QM!\n"); 5132 qm_reset_bit_clear(qm); 5133 return ret; 5134 } 5135 5136 ret = qm_wait_vf_prepare_finish(qm); 5137 if (ret) 5138 pci_err(pdev, "failed to stop by vfs in soft reset!\n"); 5139 5140 clear_bit(QM_RST_SCHED, &qm->misc_ctl); 5141 5142 return 0; 5143 } 5144 5145 static void qm_dev_ecc_mbit_handle(struct hisi_qm *qm) 5146 { 5147 u32 nfe_enb = 0; 5148 5149 /* Kunpeng930 hardware automatically close master ooo when NFE occurs */ 5150 if (qm->ver >= QM_HW_V3) 5151 return; 5152 5153 if (!qm->err_status.is_dev_ecc_mbit && 5154 qm->err_status.is_qm_ecc_mbit && 5155 qm->err_ini->close_axi_master_ooo) { 5156 5157 qm->err_ini->close_axi_master_ooo(qm); 5158 5159 } else if (qm->err_status.is_dev_ecc_mbit && 5160 !qm->err_status.is_qm_ecc_mbit && 5161 !qm->err_ini->close_axi_master_ooo) { 5162 5163 nfe_enb = readl(qm->io_base + QM_RAS_NFE_ENABLE); 5164 writel(nfe_enb & QM_RAS_NFE_MBIT_DISABLE, 5165 qm->io_base + QM_RAS_NFE_ENABLE); 5166 writel(QM_ECC_MBIT, qm->io_base + QM_ABNORMAL_INT_SET); 5167 } 5168 } 5169 5170 static int qm_soft_reset(struct hisi_qm *qm) 5171 { 5172 struct pci_dev *pdev = qm->pdev; 5173 int ret; 5174 u32 val; 5175 5176 /* Ensure all doorbells and mailboxes received by QM */ 5177 ret = qm_check_req_recv(qm); 5178 if (ret) 5179 return ret; 5180 5181 if (qm->vfs_num) { 5182 ret = qm_set_vf_mse(qm, false); 5183 if (ret) { 5184 pci_err(pdev, "Fails to disable vf MSE bit.\n"); 5185 return ret; 5186 } 5187 } 5188 5189 ret = qm->ops->set_msi(qm, false); 5190 if (ret) { 5191 pci_err(pdev, "Fails to disable PEH MSI bit.\n"); 5192 return ret; 5193 } 5194 5195 qm_dev_ecc_mbit_handle(qm); 5196 5197 /* OOO register set and check */ 5198 writel(ACC_MASTER_GLOBAL_CTRL_SHUTDOWN, 5199 qm->io_base + ACC_MASTER_GLOBAL_CTRL); 5200 5201 /* If bus lock, reset chip */ 5202 ret = readl_relaxed_poll_timeout(qm->io_base + ACC_MASTER_TRANS_RETURN, 5203 val, 5204 (val == ACC_MASTER_TRANS_RETURN_RW), 5205 POLL_PERIOD, POLL_TIMEOUT); 5206 if (ret) { 5207 pci_emerg(pdev, "Bus lock! Please reset system.\n"); 5208 return ret; 5209 } 5210 5211 if (qm->err_ini->close_sva_prefetch) 5212 qm->err_ini->close_sva_prefetch(qm); 5213 5214 ret = qm_set_pf_mse(qm, false); 5215 if (ret) { 5216 pci_err(pdev, "Fails to disable pf MSE bit.\n"); 5217 return ret; 5218 } 5219 5220 /* The reset related sub-control registers are not in PCI BAR */ 5221 if (ACPI_HANDLE(&pdev->dev)) { 5222 unsigned long long value = 0; 5223 acpi_status s; 5224 5225 s = acpi_evaluate_integer(ACPI_HANDLE(&pdev->dev), 5226 qm->err_info.acpi_rst, 5227 NULL, &value); 5228 if (ACPI_FAILURE(s)) { 5229 pci_err(pdev, "NO controller reset method!\n"); 5230 return -EIO; 5231 } 5232 5233 if (value) { 5234 pci_err(pdev, "Reset step %llu failed!\n", value); 5235 return -EIO; 5236 } 5237 } else { 5238 pci_err(pdev, "No reset method!\n"); 5239 return -EINVAL; 5240 } 5241 5242 return 0; 5243 } 5244 5245 static int qm_vf_reset_done(struct hisi_qm *qm) 5246 { 5247 struct hisi_qm_list *qm_list = qm->qm_list; 5248 struct pci_dev *pdev = qm->pdev; 5249 struct pci_dev *virtfn; 5250 struct hisi_qm *vf_qm; 5251 int ret = 0; 5252 5253 mutex_lock(&qm_list->lock); 5254 list_for_each_entry(vf_qm, &qm_list->list, list) { 5255 virtfn = vf_qm->pdev; 5256 if (virtfn == pdev) 5257 continue; 5258 5259 if (pci_physfn(virtfn) == pdev) { 5260 /* enable VFs PCIE BAR configuration */ 5261 pci_restore_state(virtfn); 5262 5263 ret = qm_restart(vf_qm); 5264 if (ret) 5265 goto restart_fail; 5266 } 5267 } 5268 5269 restart_fail: 5270 mutex_unlock(&qm_list->lock); 5271 return ret; 5272 } 5273 5274 static int qm_try_start_vfs(struct hisi_qm *qm, enum qm_mb_cmd cmd) 5275 { 5276 struct pci_dev *pdev = qm->pdev; 5277 int ret; 5278 5279 if (!qm->vfs_num) 5280 return 0; 5281 5282 ret = qm_vf_q_assign(qm, qm->vfs_num); 5283 if (ret) { 5284 pci_err(pdev, "failed to assign VFs, ret = %d.\n", ret); 5285 return ret; 5286 } 5287 5288 /* Kunpeng930 supports to notify VFs to start after PF reset. */ 5289 if (test_bit(QM_SUPPORT_MB_COMMAND, &qm->caps)) { 5290 ret = qm_ping_all_vfs(qm, cmd); 5291 if (ret) 5292 pci_warn(pdev, "failed to send cmd to all VFs after PF reset!\n"); 5293 } else { 5294 ret = qm_vf_reset_done(qm); 5295 if (ret) 5296 pci_warn(pdev, "failed to start vfs, ret = %d.\n", ret); 5297 } 5298 5299 return ret; 5300 } 5301 5302 static int qm_dev_hw_init(struct hisi_qm *qm) 5303 { 5304 return qm->err_ini->hw_init(qm); 5305 } 5306 5307 static void qm_restart_prepare(struct hisi_qm *qm) 5308 { 5309 u32 value; 5310 5311 if (qm->err_ini->open_sva_prefetch) 5312 qm->err_ini->open_sva_prefetch(qm); 5313 5314 if (qm->ver >= QM_HW_V3) 5315 return; 5316 5317 if (!qm->err_status.is_qm_ecc_mbit && 5318 !qm->err_status.is_dev_ecc_mbit) 5319 return; 5320 5321 /* temporarily close the OOO port used for PEH to write out MSI */ 5322 value = readl(qm->io_base + ACC_AM_CFG_PORT_WR_EN); 5323 writel(value & ~qm->err_info.msi_wr_port, 5324 qm->io_base + ACC_AM_CFG_PORT_WR_EN); 5325 5326 /* clear dev ecc 2bit error source if having */ 5327 value = qm_get_dev_err_status(qm) & qm->err_info.ecc_2bits_mask; 5328 if (value && qm->err_ini->clear_dev_hw_err_status) 5329 qm->err_ini->clear_dev_hw_err_status(qm, value); 5330 5331 /* clear QM ecc mbit error source */ 5332 writel(QM_ECC_MBIT, qm->io_base + QM_ABNORMAL_INT_SOURCE); 5333 5334 /* clear AM Reorder Buffer ecc mbit source */ 5335 writel(ACC_ROB_ECC_ERR_MULTPL, qm->io_base + ACC_AM_ROB_ECC_INT_STS); 5336 } 5337 5338 static void qm_restart_done(struct hisi_qm *qm) 5339 { 5340 u32 value; 5341 5342 if (qm->ver >= QM_HW_V3) 5343 goto clear_flags; 5344 5345 if (!qm->err_status.is_qm_ecc_mbit && 5346 !qm->err_status.is_dev_ecc_mbit) 5347 return; 5348 5349 /* open the OOO port for PEH to write out MSI */ 5350 value = readl(qm->io_base + ACC_AM_CFG_PORT_WR_EN); 5351 value |= qm->err_info.msi_wr_port; 5352 writel(value, qm->io_base + ACC_AM_CFG_PORT_WR_EN); 5353 5354 clear_flags: 5355 qm->err_status.is_qm_ecc_mbit = false; 5356 qm->err_status.is_dev_ecc_mbit = false; 5357 } 5358 5359 static int qm_controller_reset_done(struct hisi_qm *qm) 5360 { 5361 struct pci_dev *pdev = qm->pdev; 5362 int ret; 5363 5364 ret = qm->ops->set_msi(qm, true); 5365 if (ret) { 5366 pci_err(pdev, "Fails to enable PEH MSI bit!\n"); 5367 return ret; 5368 } 5369 5370 ret = qm_set_pf_mse(qm, true); 5371 if (ret) { 5372 pci_err(pdev, "Fails to enable pf MSE bit!\n"); 5373 return ret; 5374 } 5375 5376 if (qm->vfs_num) { 5377 ret = qm_set_vf_mse(qm, true); 5378 if (ret) { 5379 pci_err(pdev, "Fails to enable vf MSE bit!\n"); 5380 return ret; 5381 } 5382 } 5383 5384 ret = qm_dev_hw_init(qm); 5385 if (ret) { 5386 pci_err(pdev, "Failed to init device\n"); 5387 return ret; 5388 } 5389 5390 qm_restart_prepare(qm); 5391 hisi_qm_dev_err_init(qm); 5392 if (qm->err_ini->open_axi_master_ooo) 5393 qm->err_ini->open_axi_master_ooo(qm); 5394 5395 ret = qm_dev_mem_reset(qm); 5396 if (ret) { 5397 pci_err(pdev, "failed to reset device memory\n"); 5398 return ret; 5399 } 5400 5401 ret = qm_restart(qm); 5402 if (ret) { 5403 pci_err(pdev, "Failed to start QM!\n"); 5404 return ret; 5405 } 5406 5407 ret = qm_try_start_vfs(qm, QM_PF_RESET_DONE); 5408 if (ret) 5409 pci_err(pdev, "failed to start vfs by pf in soft reset.\n"); 5410 5411 ret = qm_wait_vf_prepare_finish(qm); 5412 if (ret) 5413 pci_err(pdev, "failed to start by vfs in soft reset!\n"); 5414 5415 qm_cmd_init(qm); 5416 qm_restart_done(qm); 5417 5418 qm_reset_bit_clear(qm); 5419 5420 return 0; 5421 } 5422 5423 static void qm_show_last_dfx_regs(struct hisi_qm *qm) 5424 { 5425 struct qm_debug *debug = &qm->debug; 5426 struct pci_dev *pdev = qm->pdev; 5427 u32 val; 5428 int i; 5429 5430 if (qm->fun_type == QM_HW_VF || !debug->qm_last_words) 5431 return; 5432 5433 for (i = 0; i < ARRAY_SIZE(qm_dfx_regs); i++) { 5434 val = readl_relaxed(qm->io_base + qm_dfx_regs[i].offset); 5435 if (debug->qm_last_words[i] != val) 5436 pci_info(pdev, "%s \t= 0x%08x => 0x%08x\n", 5437 qm_dfx_regs[i].name, debug->qm_last_words[i], val); 5438 } 5439 } 5440 5441 static int qm_controller_reset(struct hisi_qm *qm) 5442 { 5443 struct pci_dev *pdev = qm->pdev; 5444 int ret; 5445 5446 pci_info(pdev, "Controller resetting...\n"); 5447 5448 ret = qm_controller_reset_prepare(qm); 5449 if (ret) { 5450 hisi_qm_set_hw_reset(qm, QM_RESET_STOP_TX_OFFSET); 5451 hisi_qm_set_hw_reset(qm, QM_RESET_STOP_RX_OFFSET); 5452 clear_bit(QM_RST_SCHED, &qm->misc_ctl); 5453 return ret; 5454 } 5455 5456 qm_show_last_dfx_regs(qm); 5457 if (qm->err_ini->show_last_dfx_regs) 5458 qm->err_ini->show_last_dfx_regs(qm); 5459 5460 ret = qm_soft_reset(qm); 5461 if (ret) { 5462 pci_err(pdev, "Controller reset failed (%d)\n", ret); 5463 qm_reset_bit_clear(qm); 5464 return ret; 5465 } 5466 5467 ret = qm_controller_reset_done(qm); 5468 if (ret) { 5469 qm_reset_bit_clear(qm); 5470 return ret; 5471 } 5472 5473 pci_info(pdev, "Controller reset complete\n"); 5474 5475 return 0; 5476 } 5477 5478 /** 5479 * hisi_qm_dev_slot_reset() - slot reset 5480 * @pdev: the PCIe device 5481 * 5482 * This function offers QM relate PCIe device reset interface. Drivers which 5483 * use QM can use this function as slot_reset in its struct pci_error_handlers. 5484 */ 5485 pci_ers_result_t hisi_qm_dev_slot_reset(struct pci_dev *pdev) 5486 { 5487 struct hisi_qm *qm = pci_get_drvdata(pdev); 5488 int ret; 5489 5490 if (pdev->is_virtfn) 5491 return PCI_ERS_RESULT_RECOVERED; 5492 5493 /* reset pcie device controller */ 5494 ret = qm_controller_reset(qm); 5495 if (ret) { 5496 pci_err(pdev, "Controller reset failed (%d)\n", ret); 5497 return PCI_ERS_RESULT_DISCONNECT; 5498 } 5499 5500 return PCI_ERS_RESULT_RECOVERED; 5501 } 5502 EXPORT_SYMBOL_GPL(hisi_qm_dev_slot_reset); 5503 5504 void hisi_qm_reset_prepare(struct pci_dev *pdev) 5505 { 5506 struct hisi_qm *pf_qm = pci_get_drvdata(pci_physfn(pdev)); 5507 struct hisi_qm *qm = pci_get_drvdata(pdev); 5508 u32 delay = 0; 5509 int ret; 5510 5511 hisi_qm_dev_err_uninit(pf_qm); 5512 5513 /* 5514 * Check whether there is an ECC mbit error, If it occurs, need to 5515 * wait for soft reset to fix it. 5516 */ 5517 while (qm_check_dev_error(pf_qm)) { 5518 msleep(++delay); 5519 if (delay > QM_RESET_WAIT_TIMEOUT) 5520 return; 5521 } 5522 5523 ret = qm_reset_prepare_ready(qm); 5524 if (ret) { 5525 pci_err(pdev, "FLR not ready!\n"); 5526 return; 5527 } 5528 5529 /* PF obtains the information of VF by querying the register. */ 5530 if (qm->fun_type == QM_HW_PF) 5531 qm_cmd_uninit(qm); 5532 5533 ret = qm_try_stop_vfs(qm, QM_PF_FLR_PREPARE, QM_FLR); 5534 if (ret) 5535 pci_err(pdev, "failed to stop vfs by pf in FLR.\n"); 5536 5537 ret = hisi_qm_stop(qm, QM_FLR); 5538 if (ret) { 5539 pci_err(pdev, "Failed to stop QM, ret = %d.\n", ret); 5540 hisi_qm_set_hw_reset(qm, QM_RESET_STOP_TX_OFFSET); 5541 hisi_qm_set_hw_reset(qm, QM_RESET_STOP_RX_OFFSET); 5542 return; 5543 } 5544 5545 ret = qm_wait_vf_prepare_finish(qm); 5546 if (ret) 5547 pci_err(pdev, "failed to stop by vfs in FLR!\n"); 5548 5549 pci_info(pdev, "FLR resetting...\n"); 5550 } 5551 EXPORT_SYMBOL_GPL(hisi_qm_reset_prepare); 5552 5553 static bool qm_flr_reset_complete(struct pci_dev *pdev) 5554 { 5555 struct pci_dev *pf_pdev = pci_physfn(pdev); 5556 struct hisi_qm *qm = pci_get_drvdata(pf_pdev); 5557 u32 id; 5558 5559 pci_read_config_dword(qm->pdev, PCI_COMMAND, &id); 5560 if (id == QM_PCI_COMMAND_INVALID) { 5561 pci_err(pdev, "Device can not be used!\n"); 5562 return false; 5563 } 5564 5565 return true; 5566 } 5567 5568 void hisi_qm_reset_done(struct pci_dev *pdev) 5569 { 5570 struct hisi_qm *pf_qm = pci_get_drvdata(pci_physfn(pdev)); 5571 struct hisi_qm *qm = pci_get_drvdata(pdev); 5572 int ret; 5573 5574 if (qm->fun_type == QM_HW_PF) { 5575 ret = qm_dev_hw_init(qm); 5576 if (ret) { 5577 pci_err(pdev, "Failed to init PF, ret = %d.\n", ret); 5578 goto flr_done; 5579 } 5580 } 5581 5582 hisi_qm_dev_err_init(pf_qm); 5583 5584 ret = qm_restart(qm); 5585 if (ret) { 5586 pci_err(pdev, "Failed to start QM, ret = %d.\n", ret); 5587 goto flr_done; 5588 } 5589 5590 ret = qm_try_start_vfs(qm, QM_PF_RESET_DONE); 5591 if (ret) 5592 pci_err(pdev, "failed to start vfs by pf in FLR.\n"); 5593 5594 ret = qm_wait_vf_prepare_finish(qm); 5595 if (ret) 5596 pci_err(pdev, "failed to start by vfs in FLR!\n"); 5597 5598 flr_done: 5599 if (qm->fun_type == QM_HW_PF) 5600 qm_cmd_init(qm); 5601 5602 if (qm_flr_reset_complete(pdev)) 5603 pci_info(pdev, "FLR reset complete\n"); 5604 5605 qm_reset_bit_clear(qm); 5606 } 5607 EXPORT_SYMBOL_GPL(hisi_qm_reset_done); 5608 5609 static irqreturn_t qm_abnormal_irq(int irq, void *data) 5610 { 5611 struct hisi_qm *qm = data; 5612 enum acc_err_result ret; 5613 5614 atomic64_inc(&qm->debug.dfx.abnormal_irq_cnt); 5615 ret = qm_process_dev_error(qm); 5616 if (ret == ACC_ERR_NEED_RESET && 5617 !test_bit(QM_DRIVER_REMOVING, &qm->misc_ctl) && 5618 !test_and_set_bit(QM_RST_SCHED, &qm->misc_ctl)) 5619 schedule_work(&qm->rst_work); 5620 5621 return IRQ_HANDLED; 5622 } 5623 5624 5625 /** 5626 * hisi_qm_dev_shutdown() - Shutdown device. 5627 * @pdev: The device will be shutdown. 5628 * 5629 * This function will stop qm when OS shutdown or rebooting. 5630 */ 5631 void hisi_qm_dev_shutdown(struct pci_dev *pdev) 5632 { 5633 struct hisi_qm *qm = pci_get_drvdata(pdev); 5634 int ret; 5635 5636 ret = hisi_qm_stop(qm, QM_NORMAL); 5637 if (ret) 5638 dev_err(&pdev->dev, "Fail to stop qm in shutdown!\n"); 5639 } 5640 EXPORT_SYMBOL_GPL(hisi_qm_dev_shutdown); 5641 5642 static void hisi_qm_controller_reset(struct work_struct *rst_work) 5643 { 5644 struct hisi_qm *qm = container_of(rst_work, struct hisi_qm, rst_work); 5645 int ret; 5646 5647 ret = qm_pm_get_sync(qm); 5648 if (ret) { 5649 clear_bit(QM_RST_SCHED, &qm->misc_ctl); 5650 return; 5651 } 5652 5653 /* reset pcie device controller */ 5654 ret = qm_controller_reset(qm); 5655 if (ret) 5656 dev_err(&qm->pdev->dev, "controller reset failed (%d)\n", ret); 5657 5658 qm_pm_put_sync(qm); 5659 } 5660 5661 static void qm_pf_reset_vf_prepare(struct hisi_qm *qm, 5662 enum qm_stop_reason stop_reason) 5663 { 5664 enum qm_mb_cmd cmd = QM_VF_PREPARE_DONE; 5665 struct pci_dev *pdev = qm->pdev; 5666 int ret; 5667 5668 ret = qm_reset_prepare_ready(qm); 5669 if (ret) { 5670 dev_err(&pdev->dev, "reset prepare not ready!\n"); 5671 atomic_set(&qm->status.flags, QM_STOP); 5672 cmd = QM_VF_PREPARE_FAIL; 5673 goto err_prepare; 5674 } 5675 5676 ret = hisi_qm_stop(qm, stop_reason); 5677 if (ret) { 5678 dev_err(&pdev->dev, "failed to stop QM, ret = %d.\n", ret); 5679 atomic_set(&qm->status.flags, QM_STOP); 5680 cmd = QM_VF_PREPARE_FAIL; 5681 goto err_prepare; 5682 } else { 5683 goto out; 5684 } 5685 5686 err_prepare: 5687 hisi_qm_set_hw_reset(qm, QM_RESET_STOP_TX_OFFSET); 5688 hisi_qm_set_hw_reset(qm, QM_RESET_STOP_RX_OFFSET); 5689 out: 5690 pci_save_state(pdev); 5691 ret = qm_ping_pf(qm, cmd); 5692 if (ret) 5693 dev_warn(&pdev->dev, "PF responds timeout in reset prepare!\n"); 5694 } 5695 5696 static void qm_pf_reset_vf_done(struct hisi_qm *qm) 5697 { 5698 enum qm_mb_cmd cmd = QM_VF_START_DONE; 5699 struct pci_dev *pdev = qm->pdev; 5700 int ret; 5701 5702 pci_restore_state(pdev); 5703 ret = hisi_qm_start(qm); 5704 if (ret) { 5705 dev_err(&pdev->dev, "failed to start QM, ret = %d.\n", ret); 5706 cmd = QM_VF_START_FAIL; 5707 } 5708 5709 qm_cmd_init(qm); 5710 ret = qm_ping_pf(qm, cmd); 5711 if (ret) 5712 dev_warn(&pdev->dev, "PF responds timeout in reset done!\n"); 5713 5714 qm_reset_bit_clear(qm); 5715 } 5716 5717 static int qm_wait_pf_reset_finish(struct hisi_qm *qm) 5718 { 5719 struct device *dev = &qm->pdev->dev; 5720 u32 val, cmd; 5721 u64 msg; 5722 int ret; 5723 5724 /* Wait for reset to finish */ 5725 ret = readl_relaxed_poll_timeout(qm->io_base + QM_IFC_INT_SOURCE_V, val, 5726 val == BIT(0), QM_VF_RESET_WAIT_US, 5727 QM_VF_RESET_WAIT_TIMEOUT_US); 5728 /* hardware completion status should be available by this time */ 5729 if (ret) { 5730 dev_err(dev, "couldn't get reset done status from PF, timeout!\n"); 5731 return -ETIMEDOUT; 5732 } 5733 5734 /* 5735 * Whether message is got successfully, 5736 * VF needs to ack PF by clearing the interrupt. 5737 */ 5738 ret = qm_get_mb_cmd(qm, &msg, 0); 5739 qm_clear_cmd_interrupt(qm, 0); 5740 if (ret) { 5741 dev_err(dev, "failed to get msg from PF in reset done!\n"); 5742 return ret; 5743 } 5744 5745 cmd = msg & QM_MB_CMD_DATA_MASK; 5746 if (cmd != QM_PF_RESET_DONE) { 5747 dev_err(dev, "the cmd(%u) is not reset done!\n", cmd); 5748 ret = -EINVAL; 5749 } 5750 5751 return ret; 5752 } 5753 5754 static void qm_pf_reset_vf_process(struct hisi_qm *qm, 5755 enum qm_stop_reason stop_reason) 5756 { 5757 struct device *dev = &qm->pdev->dev; 5758 int ret; 5759 5760 dev_info(dev, "device reset start...\n"); 5761 5762 /* The message is obtained by querying the register during resetting */ 5763 qm_cmd_uninit(qm); 5764 qm_pf_reset_vf_prepare(qm, stop_reason); 5765 5766 ret = qm_wait_pf_reset_finish(qm); 5767 if (ret) 5768 goto err_get_status; 5769 5770 qm_pf_reset_vf_done(qm); 5771 5772 dev_info(dev, "device reset done.\n"); 5773 5774 return; 5775 5776 err_get_status: 5777 qm_cmd_init(qm); 5778 qm_reset_bit_clear(qm); 5779 } 5780 5781 static void qm_handle_cmd_msg(struct hisi_qm *qm, u32 fun_num) 5782 { 5783 struct device *dev = &qm->pdev->dev; 5784 u64 msg; 5785 u32 cmd; 5786 int ret; 5787 5788 /* 5789 * Get the msg from source by sending mailbox. Whether message is got 5790 * successfully, destination needs to ack source by clearing the interrupt. 5791 */ 5792 ret = qm_get_mb_cmd(qm, &msg, fun_num); 5793 qm_clear_cmd_interrupt(qm, BIT(fun_num)); 5794 if (ret) { 5795 dev_err(dev, "failed to get msg from source!\n"); 5796 return; 5797 } 5798 5799 cmd = msg & QM_MB_CMD_DATA_MASK; 5800 switch (cmd) { 5801 case QM_PF_FLR_PREPARE: 5802 qm_pf_reset_vf_process(qm, QM_FLR); 5803 break; 5804 case QM_PF_SRST_PREPARE: 5805 qm_pf_reset_vf_process(qm, QM_SOFT_RESET); 5806 break; 5807 case QM_VF_GET_QOS: 5808 qm_vf_get_qos(qm, fun_num); 5809 break; 5810 case QM_PF_SET_QOS: 5811 qm->mb_qos = msg >> QM_MB_CMD_DATA_SHIFT; 5812 break; 5813 default: 5814 dev_err(dev, "unsupported cmd %u sent by function(%u)!\n", cmd, fun_num); 5815 break; 5816 } 5817 } 5818 5819 static void qm_cmd_process(struct work_struct *cmd_process) 5820 { 5821 struct hisi_qm *qm = container_of(cmd_process, 5822 struct hisi_qm, cmd_process); 5823 u32 vfs_num = qm->vfs_num; 5824 u64 val; 5825 u32 i; 5826 5827 if (qm->fun_type == QM_HW_PF) { 5828 val = readq(qm->io_base + QM_IFC_INT_SOURCE_P); 5829 if (!val) 5830 return; 5831 5832 for (i = 1; i <= vfs_num; i++) { 5833 if (val & BIT(i)) 5834 qm_handle_cmd_msg(qm, i); 5835 } 5836 5837 return; 5838 } 5839 5840 qm_handle_cmd_msg(qm, 0); 5841 } 5842 5843 /** 5844 * hisi_qm_alg_register() - Register alg to crypto and add qm to qm_list. 5845 * @qm: The qm needs add. 5846 * @qm_list: The qm list. 5847 * 5848 * This function adds qm to qm list, and will register algorithm to 5849 * crypto when the qm list is empty. 5850 */ 5851 int hisi_qm_alg_register(struct hisi_qm *qm, struct hisi_qm_list *qm_list) 5852 { 5853 struct device *dev = &qm->pdev->dev; 5854 int flag = 0; 5855 int ret = 0; 5856 5857 mutex_lock(&qm_list->lock); 5858 if (list_empty(&qm_list->list)) 5859 flag = 1; 5860 list_add_tail(&qm->list, &qm_list->list); 5861 mutex_unlock(&qm_list->lock); 5862 5863 if (qm->ver <= QM_HW_V2 && qm->use_sva) { 5864 dev_info(dev, "HW V2 not both use uacce sva mode and hardware crypto algs.\n"); 5865 return 0; 5866 } 5867 5868 if (flag) { 5869 ret = qm_list->register_to_crypto(qm); 5870 if (ret) { 5871 mutex_lock(&qm_list->lock); 5872 list_del(&qm->list); 5873 mutex_unlock(&qm_list->lock); 5874 } 5875 } 5876 5877 return ret; 5878 } 5879 EXPORT_SYMBOL_GPL(hisi_qm_alg_register); 5880 5881 /** 5882 * hisi_qm_alg_unregister() - Unregister alg from crypto and delete qm from 5883 * qm list. 5884 * @qm: The qm needs delete. 5885 * @qm_list: The qm list. 5886 * 5887 * This function deletes qm from qm list, and will unregister algorithm 5888 * from crypto when the qm list is empty. 5889 */ 5890 void hisi_qm_alg_unregister(struct hisi_qm *qm, struct hisi_qm_list *qm_list) 5891 { 5892 mutex_lock(&qm_list->lock); 5893 list_del(&qm->list); 5894 mutex_unlock(&qm_list->lock); 5895 5896 if (qm->ver <= QM_HW_V2 && qm->use_sva) 5897 return; 5898 5899 if (list_empty(&qm_list->list)) 5900 qm_list->unregister_from_crypto(qm); 5901 } 5902 EXPORT_SYMBOL_GPL(hisi_qm_alg_unregister); 5903 5904 static void qm_unregister_abnormal_irq(struct hisi_qm *qm) 5905 { 5906 struct pci_dev *pdev = qm->pdev; 5907 u32 irq_vector, val; 5908 5909 if (qm->fun_type == QM_HW_VF) 5910 return; 5911 5912 val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_ABN_IRQ_TYPE_CAP, qm->cap_ver); 5913 if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) 5914 return; 5915 5916 irq_vector = val & QM_IRQ_VECTOR_MASK; 5917 free_irq(pci_irq_vector(pdev, irq_vector), qm); 5918 } 5919 5920 static int qm_register_abnormal_irq(struct hisi_qm *qm) 5921 { 5922 struct pci_dev *pdev = qm->pdev; 5923 u32 irq_vector, val; 5924 int ret; 5925 5926 if (qm->fun_type == QM_HW_VF) 5927 return 0; 5928 5929 val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_ABN_IRQ_TYPE_CAP, qm->cap_ver); 5930 if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) 5931 return 0; 5932 5933 irq_vector = val & QM_IRQ_VECTOR_MASK; 5934 ret = request_irq(pci_irq_vector(pdev, irq_vector), qm_abnormal_irq, 0, qm->dev_name, qm); 5935 if (ret) 5936 dev_err(&qm->pdev->dev, "failed to request abnormal irq, ret = %d", ret); 5937 5938 return ret; 5939 } 5940 5941 static void qm_unregister_mb_cmd_irq(struct hisi_qm *qm) 5942 { 5943 struct pci_dev *pdev = qm->pdev; 5944 u32 irq_vector, val; 5945 5946 val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_PF2VF_IRQ_TYPE_CAP, qm->cap_ver); 5947 if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) 5948 return; 5949 5950 irq_vector = val & QM_IRQ_VECTOR_MASK; 5951 free_irq(pci_irq_vector(pdev, irq_vector), qm); 5952 } 5953 5954 static int qm_register_mb_cmd_irq(struct hisi_qm *qm) 5955 { 5956 struct pci_dev *pdev = qm->pdev; 5957 u32 irq_vector, val; 5958 int ret; 5959 5960 val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_PF2VF_IRQ_TYPE_CAP, qm->cap_ver); 5961 if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) 5962 return 0; 5963 5964 irq_vector = val & QM_IRQ_VECTOR_MASK; 5965 ret = request_irq(pci_irq_vector(pdev, irq_vector), qm_mb_cmd_irq, 0, qm->dev_name, qm); 5966 if (ret) 5967 dev_err(&pdev->dev, "failed to request function communication irq, ret = %d", ret); 5968 5969 return ret; 5970 } 5971 5972 static void qm_unregister_aeq_irq(struct hisi_qm *qm) 5973 { 5974 struct pci_dev *pdev = qm->pdev; 5975 u32 irq_vector, val; 5976 5977 val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_AEQ_IRQ_TYPE_CAP, qm->cap_ver); 5978 if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) 5979 return; 5980 5981 irq_vector = val & QM_IRQ_VECTOR_MASK; 5982 free_irq(pci_irq_vector(pdev, irq_vector), qm); 5983 } 5984 5985 static int qm_register_aeq_irq(struct hisi_qm *qm) 5986 { 5987 struct pci_dev *pdev = qm->pdev; 5988 u32 irq_vector, val; 5989 int ret; 5990 5991 val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_AEQ_IRQ_TYPE_CAP, qm->cap_ver); 5992 if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) 5993 return 0; 5994 5995 irq_vector = val & QM_IRQ_VECTOR_MASK; 5996 ret = request_threaded_irq(pci_irq_vector(pdev, irq_vector), qm_aeq_irq, 5997 qm_aeq_thread, 0, qm->dev_name, qm); 5998 if (ret) 5999 dev_err(&pdev->dev, "failed to request eq irq, ret = %d", ret); 6000 6001 return ret; 6002 } 6003 6004 static void qm_unregister_eq_irq(struct hisi_qm *qm) 6005 { 6006 struct pci_dev *pdev = qm->pdev; 6007 u32 irq_vector, val; 6008 6009 val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_EQ_IRQ_TYPE_CAP, qm->cap_ver); 6010 if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) 6011 return; 6012 6013 irq_vector = val & QM_IRQ_VECTOR_MASK; 6014 free_irq(pci_irq_vector(pdev, irq_vector), qm); 6015 } 6016 6017 static int qm_register_eq_irq(struct hisi_qm *qm) 6018 { 6019 struct pci_dev *pdev = qm->pdev; 6020 u32 irq_vector, val; 6021 int ret; 6022 6023 val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_EQ_IRQ_TYPE_CAP, qm->cap_ver); 6024 if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) 6025 return 0; 6026 6027 irq_vector = val & QM_IRQ_VECTOR_MASK; 6028 ret = request_irq(pci_irq_vector(pdev, irq_vector), qm_irq, 0, qm->dev_name, qm); 6029 if (ret) 6030 dev_err(&pdev->dev, "failed to request eq irq, ret = %d", ret); 6031 6032 return ret; 6033 } 6034 6035 static void qm_irqs_unregister(struct hisi_qm *qm) 6036 { 6037 qm_unregister_mb_cmd_irq(qm); 6038 qm_unregister_abnormal_irq(qm); 6039 qm_unregister_aeq_irq(qm); 6040 qm_unregister_eq_irq(qm); 6041 } 6042 6043 static int qm_irqs_register(struct hisi_qm *qm) 6044 { 6045 int ret; 6046 6047 ret = qm_register_eq_irq(qm); 6048 if (ret) 6049 return ret; 6050 6051 ret = qm_register_aeq_irq(qm); 6052 if (ret) 6053 goto free_eq_irq; 6054 6055 ret = qm_register_abnormal_irq(qm); 6056 if (ret) 6057 goto free_aeq_irq; 6058 6059 ret = qm_register_mb_cmd_irq(qm); 6060 if (ret) 6061 goto free_abnormal_irq; 6062 6063 return 0; 6064 6065 free_abnormal_irq: 6066 qm_unregister_abnormal_irq(qm); 6067 free_aeq_irq: 6068 qm_unregister_aeq_irq(qm); 6069 free_eq_irq: 6070 qm_unregister_eq_irq(qm); 6071 return ret; 6072 } 6073 6074 static int qm_get_qp_num(struct hisi_qm *qm) 6075 { 6076 bool is_db_isolation; 6077 6078 /* VF's qp_num assigned by PF in v2, and VF can get qp_num by vft. */ 6079 if (qm->fun_type == QM_HW_VF) { 6080 if (qm->ver != QM_HW_V1) 6081 /* v2 starts to support get vft by mailbox */ 6082 return hisi_qm_get_vft(qm, &qm->qp_base, &qm->qp_num); 6083 6084 return 0; 6085 } 6086 6087 is_db_isolation = test_bit(QM_SUPPORT_DB_ISOLATION, &qm->caps); 6088 qm->ctrl_qp_num = hisi_qm_get_hw_info(qm, qm_basic_info, QM_TOTAL_QP_NUM_CAP, true); 6089 qm->max_qp_num = hisi_qm_get_hw_info(qm, qm_basic_info, 6090 QM_FUNC_MAX_QP_CAP, is_db_isolation); 6091 6092 /* check if qp number is valid */ 6093 if (qm->qp_num > qm->max_qp_num) { 6094 dev_err(&qm->pdev->dev, "qp num(%u) is more than max qp num(%u)!\n", 6095 qm->qp_num, qm->max_qp_num); 6096 return -EINVAL; 6097 } 6098 6099 return 0; 6100 } 6101 6102 static void qm_get_hw_caps(struct hisi_qm *qm) 6103 { 6104 const struct hisi_qm_cap_info *cap_info = qm->fun_type == QM_HW_PF ? 6105 qm_cap_info_pf : qm_cap_info_vf; 6106 u32 size = qm->fun_type == QM_HW_PF ? ARRAY_SIZE(qm_cap_info_pf) : 6107 ARRAY_SIZE(qm_cap_info_vf); 6108 u32 val, i; 6109 6110 /* Doorbell isolate register is a independent register. */ 6111 val = hisi_qm_get_hw_info(qm, qm_cap_info_comm, QM_SUPPORT_DB_ISOLATION, true); 6112 if (val) 6113 set_bit(QM_SUPPORT_DB_ISOLATION, &qm->caps); 6114 6115 if (qm->ver >= QM_HW_V3) { 6116 val = readl(qm->io_base + QM_FUNC_CAPS_REG); 6117 qm->cap_ver = val & QM_CAPBILITY_VERSION; 6118 } 6119 6120 /* Get PF/VF common capbility */ 6121 for (i = 1; i < ARRAY_SIZE(qm_cap_info_comm); i++) { 6122 val = hisi_qm_get_hw_info(qm, qm_cap_info_comm, i, qm->cap_ver); 6123 if (val) 6124 set_bit(qm_cap_info_comm[i].type, &qm->caps); 6125 } 6126 6127 /* Get PF/VF different capbility */ 6128 for (i = 0; i < size; i++) { 6129 val = hisi_qm_get_hw_info(qm, cap_info, i, qm->cap_ver); 6130 if (val) 6131 set_bit(cap_info[i].type, &qm->caps); 6132 } 6133 } 6134 6135 static int qm_get_pci_res(struct hisi_qm *qm) 6136 { 6137 struct pci_dev *pdev = qm->pdev; 6138 struct device *dev = &pdev->dev; 6139 int ret; 6140 6141 ret = pci_request_mem_regions(pdev, qm->dev_name); 6142 if (ret < 0) { 6143 dev_err(dev, "Failed to request mem regions!\n"); 6144 return ret; 6145 } 6146 6147 qm->phys_base = pci_resource_start(pdev, PCI_BAR_2); 6148 qm->io_base = ioremap(qm->phys_base, pci_resource_len(pdev, PCI_BAR_2)); 6149 if (!qm->io_base) { 6150 ret = -EIO; 6151 goto err_request_mem_regions; 6152 } 6153 6154 qm_get_hw_caps(qm); 6155 if (test_bit(QM_SUPPORT_DB_ISOLATION, &qm->caps)) { 6156 qm->db_interval = QM_QP_DB_INTERVAL; 6157 qm->db_phys_base = pci_resource_start(pdev, PCI_BAR_4); 6158 qm->db_io_base = ioremap(qm->db_phys_base, 6159 pci_resource_len(pdev, PCI_BAR_4)); 6160 if (!qm->db_io_base) { 6161 ret = -EIO; 6162 goto err_ioremap; 6163 } 6164 } else { 6165 qm->db_phys_base = qm->phys_base; 6166 qm->db_io_base = qm->io_base; 6167 qm->db_interval = 0; 6168 } 6169 6170 ret = qm_get_qp_num(qm); 6171 if (ret) 6172 goto err_db_ioremap; 6173 6174 return 0; 6175 6176 err_db_ioremap: 6177 if (test_bit(QM_SUPPORT_DB_ISOLATION, &qm->caps)) 6178 iounmap(qm->db_io_base); 6179 err_ioremap: 6180 iounmap(qm->io_base); 6181 err_request_mem_regions: 6182 pci_release_mem_regions(pdev); 6183 return ret; 6184 } 6185 6186 static int hisi_qm_pci_init(struct hisi_qm *qm) 6187 { 6188 struct pci_dev *pdev = qm->pdev; 6189 struct device *dev = &pdev->dev; 6190 unsigned int num_vec; 6191 int ret; 6192 6193 ret = pci_enable_device_mem(pdev); 6194 if (ret < 0) { 6195 dev_err(dev, "Failed to enable device mem!\n"); 6196 return ret; 6197 } 6198 6199 ret = qm_get_pci_res(qm); 6200 if (ret) 6201 goto err_disable_pcidev; 6202 6203 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)); 6204 if (ret < 0) 6205 goto err_get_pci_res; 6206 pci_set_master(pdev); 6207 6208 num_vec = qm_get_irq_num(qm); 6209 ret = pci_alloc_irq_vectors(pdev, num_vec, num_vec, PCI_IRQ_MSI); 6210 if (ret < 0) { 6211 dev_err(dev, "Failed to enable MSI vectors!\n"); 6212 goto err_get_pci_res; 6213 } 6214 6215 return 0; 6216 6217 err_get_pci_res: 6218 qm_put_pci_res(qm); 6219 err_disable_pcidev: 6220 pci_disable_device(pdev); 6221 return ret; 6222 } 6223 6224 static int hisi_qm_init_work(struct hisi_qm *qm) 6225 { 6226 int i; 6227 6228 for (i = 0; i < qm->qp_num; i++) 6229 INIT_WORK(&qm->poll_data[i].work, qm_work_process); 6230 6231 if (qm->fun_type == QM_HW_PF) 6232 INIT_WORK(&qm->rst_work, hisi_qm_controller_reset); 6233 6234 if (qm->ver > QM_HW_V2) 6235 INIT_WORK(&qm->cmd_process, qm_cmd_process); 6236 6237 qm->wq = alloc_workqueue("%s", WQ_HIGHPRI | WQ_MEM_RECLAIM | 6238 WQ_UNBOUND, num_online_cpus(), 6239 pci_name(qm->pdev)); 6240 if (!qm->wq) { 6241 pci_err(qm->pdev, "failed to alloc workqueue!\n"); 6242 return -ENOMEM; 6243 } 6244 6245 return 0; 6246 } 6247 6248 static int hisi_qp_alloc_memory(struct hisi_qm *qm) 6249 { 6250 struct device *dev = &qm->pdev->dev; 6251 u16 sq_depth, cq_depth; 6252 size_t qp_dma_size; 6253 int i, ret; 6254 6255 qm->qp_array = kcalloc(qm->qp_num, sizeof(struct hisi_qp), GFP_KERNEL); 6256 if (!qm->qp_array) 6257 return -ENOMEM; 6258 6259 qm->poll_data = kcalloc(qm->qp_num, sizeof(struct hisi_qm_poll_data), GFP_KERNEL); 6260 if (!qm->poll_data) { 6261 kfree(qm->qp_array); 6262 return -ENOMEM; 6263 } 6264 6265 qm_get_xqc_depth(qm, &sq_depth, &cq_depth, QM_QP_DEPTH_CAP); 6266 6267 /* one more page for device or qp statuses */ 6268 qp_dma_size = qm->sqe_size * sq_depth + sizeof(struct qm_cqe) * cq_depth; 6269 qp_dma_size = PAGE_ALIGN(qp_dma_size) + PAGE_SIZE; 6270 for (i = 0; i < qm->qp_num; i++) { 6271 qm->poll_data[i].qm = qm; 6272 ret = hisi_qp_memory_init(qm, qp_dma_size, i, sq_depth, cq_depth); 6273 if (ret) 6274 goto err_init_qp_mem; 6275 6276 dev_dbg(dev, "allocate qp dma buf size=%zx)\n", qp_dma_size); 6277 } 6278 6279 return 0; 6280 err_init_qp_mem: 6281 hisi_qp_memory_uninit(qm, i); 6282 6283 return ret; 6284 } 6285 6286 static int hisi_qm_memory_init(struct hisi_qm *qm) 6287 { 6288 struct device *dev = &qm->pdev->dev; 6289 int ret, total_func; 6290 size_t off = 0; 6291 6292 if (test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps)) { 6293 total_func = pci_sriov_get_totalvfs(qm->pdev) + 1; 6294 qm->factor = kcalloc(total_func, sizeof(struct qm_shaper_factor), GFP_KERNEL); 6295 if (!qm->factor) 6296 return -ENOMEM; 6297 6298 /* Only the PF value needs to be initialized */ 6299 qm->factor[0].func_qos = QM_QOS_MAX_VAL; 6300 } 6301 6302 #define QM_INIT_BUF(qm, type, num) do { \ 6303 (qm)->type = ((qm)->qdma.va + (off)); \ 6304 (qm)->type##_dma = (qm)->qdma.dma + (off); \ 6305 off += QMC_ALIGN(sizeof(struct qm_##type) * (num)); \ 6306 } while (0) 6307 6308 idr_init(&qm->qp_idr); 6309 qm_get_xqc_depth(qm, &qm->eq_depth, &qm->aeq_depth, QM_XEQ_DEPTH_CAP); 6310 qm->qdma.size = QMC_ALIGN(sizeof(struct qm_eqe) * qm->eq_depth) + 6311 QMC_ALIGN(sizeof(struct qm_aeqe) * qm->aeq_depth) + 6312 QMC_ALIGN(sizeof(struct qm_sqc) * qm->qp_num) + 6313 QMC_ALIGN(sizeof(struct qm_cqc) * qm->qp_num); 6314 qm->qdma.va = dma_alloc_coherent(dev, qm->qdma.size, &qm->qdma.dma, 6315 GFP_ATOMIC); 6316 dev_dbg(dev, "allocate qm dma buf size=%zx)\n", qm->qdma.size); 6317 if (!qm->qdma.va) { 6318 ret = -ENOMEM; 6319 goto err_destroy_idr; 6320 } 6321 6322 QM_INIT_BUF(qm, eqe, qm->eq_depth); 6323 QM_INIT_BUF(qm, aeqe, qm->aeq_depth); 6324 QM_INIT_BUF(qm, sqc, qm->qp_num); 6325 QM_INIT_BUF(qm, cqc, qm->qp_num); 6326 6327 ret = hisi_qp_alloc_memory(qm); 6328 if (ret) 6329 goto err_alloc_qp_array; 6330 6331 return 0; 6332 6333 err_alloc_qp_array: 6334 dma_free_coherent(dev, qm->qdma.size, qm->qdma.va, qm->qdma.dma); 6335 err_destroy_idr: 6336 idr_destroy(&qm->qp_idr); 6337 if (test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps)) 6338 kfree(qm->factor); 6339 6340 return ret; 6341 } 6342 6343 static void qm_last_regs_init(struct hisi_qm *qm) 6344 { 6345 int dfx_regs_num = ARRAY_SIZE(qm_dfx_regs); 6346 struct qm_debug *debug = &qm->debug; 6347 int i; 6348 6349 if (qm->fun_type == QM_HW_VF) 6350 return; 6351 6352 debug->qm_last_words = kcalloc(dfx_regs_num, sizeof(unsigned int), 6353 GFP_KERNEL); 6354 if (!debug->qm_last_words) 6355 return; 6356 6357 for (i = 0; i < dfx_regs_num; i++) { 6358 debug->qm_last_words[i] = readl_relaxed(qm->io_base + 6359 qm_dfx_regs[i].offset); 6360 } 6361 } 6362 6363 /** 6364 * hisi_qm_init() - Initialize configures about qm. 6365 * @qm: The qm needing init. 6366 * 6367 * This function init qm, then we can call hisi_qm_start to put qm into work. 6368 */ 6369 int hisi_qm_init(struct hisi_qm *qm) 6370 { 6371 struct pci_dev *pdev = qm->pdev; 6372 struct device *dev = &pdev->dev; 6373 int ret; 6374 6375 hisi_qm_pre_init(qm); 6376 6377 ret = hisi_qm_pci_init(qm); 6378 if (ret) 6379 return ret; 6380 6381 ret = qm_irqs_register(qm); 6382 if (ret) 6383 goto err_pci_init; 6384 6385 if (qm->fun_type == QM_HW_PF) { 6386 qm_disable_clock_gate(qm); 6387 ret = qm_dev_mem_reset(qm); 6388 if (ret) { 6389 dev_err(dev, "failed to reset device memory\n"); 6390 goto err_irq_register; 6391 } 6392 } 6393 6394 if (qm->mode == UACCE_MODE_SVA) { 6395 ret = qm_alloc_uacce(qm); 6396 if (ret < 0) 6397 dev_warn(dev, "fail to alloc uacce (%d)\n", ret); 6398 } 6399 6400 ret = hisi_qm_memory_init(qm); 6401 if (ret) 6402 goto err_alloc_uacce; 6403 6404 ret = hisi_qm_init_work(qm); 6405 if (ret) 6406 goto err_free_qm_memory; 6407 6408 qm_cmd_init(qm); 6409 atomic_set(&qm->status.flags, QM_INIT); 6410 6411 qm_last_regs_init(qm); 6412 6413 return 0; 6414 6415 err_free_qm_memory: 6416 hisi_qm_memory_uninit(qm); 6417 err_alloc_uacce: 6418 if (qm->use_sva) { 6419 uacce_remove(qm->uacce); 6420 qm->uacce = NULL; 6421 } 6422 err_irq_register: 6423 qm_irqs_unregister(qm); 6424 err_pci_init: 6425 hisi_qm_pci_uninit(qm); 6426 return ret; 6427 } 6428 EXPORT_SYMBOL_GPL(hisi_qm_init); 6429 6430 /** 6431 * hisi_qm_get_dfx_access() - Try to get dfx access. 6432 * @qm: pointer to accelerator device. 6433 * 6434 * Try to get dfx access, then user can get message. 6435 * 6436 * If device is in suspended, return failure, otherwise 6437 * bump up the runtime PM usage counter. 6438 */ 6439 int hisi_qm_get_dfx_access(struct hisi_qm *qm) 6440 { 6441 struct device *dev = &qm->pdev->dev; 6442 6443 if (pm_runtime_suspended(dev)) { 6444 dev_info(dev, "can not read/write - device in suspended.\n"); 6445 return -EAGAIN; 6446 } 6447 6448 return qm_pm_get_sync(qm); 6449 } 6450 EXPORT_SYMBOL_GPL(hisi_qm_get_dfx_access); 6451 6452 /** 6453 * hisi_qm_put_dfx_access() - Put dfx access. 6454 * @qm: pointer to accelerator device. 6455 * 6456 * Put dfx access, drop runtime PM usage counter. 6457 */ 6458 void hisi_qm_put_dfx_access(struct hisi_qm *qm) 6459 { 6460 qm_pm_put_sync(qm); 6461 } 6462 EXPORT_SYMBOL_GPL(hisi_qm_put_dfx_access); 6463 6464 /** 6465 * hisi_qm_pm_init() - Initialize qm runtime PM. 6466 * @qm: pointer to accelerator device. 6467 * 6468 * Function that initialize qm runtime PM. 6469 */ 6470 void hisi_qm_pm_init(struct hisi_qm *qm) 6471 { 6472 struct device *dev = &qm->pdev->dev; 6473 6474 if (!test_bit(QM_SUPPORT_RPM, &qm->caps)) 6475 return; 6476 6477 pm_runtime_set_autosuspend_delay(dev, QM_AUTOSUSPEND_DELAY); 6478 pm_runtime_use_autosuspend(dev); 6479 pm_runtime_put_noidle(dev); 6480 } 6481 EXPORT_SYMBOL_GPL(hisi_qm_pm_init); 6482 6483 /** 6484 * hisi_qm_pm_uninit() - Uninitialize qm runtime PM. 6485 * @qm: pointer to accelerator device. 6486 * 6487 * Function that uninitialize qm runtime PM. 6488 */ 6489 void hisi_qm_pm_uninit(struct hisi_qm *qm) 6490 { 6491 struct device *dev = &qm->pdev->dev; 6492 6493 if (!test_bit(QM_SUPPORT_RPM, &qm->caps)) 6494 return; 6495 6496 pm_runtime_get_noresume(dev); 6497 pm_runtime_dont_use_autosuspend(dev); 6498 } 6499 EXPORT_SYMBOL_GPL(hisi_qm_pm_uninit); 6500 6501 static int qm_prepare_for_suspend(struct hisi_qm *qm) 6502 { 6503 struct pci_dev *pdev = qm->pdev; 6504 int ret; 6505 u32 val; 6506 6507 ret = qm->ops->set_msi(qm, false); 6508 if (ret) { 6509 pci_err(pdev, "failed to disable MSI before suspending!\n"); 6510 return ret; 6511 } 6512 6513 /* shutdown OOO register */ 6514 writel(ACC_MASTER_GLOBAL_CTRL_SHUTDOWN, 6515 qm->io_base + ACC_MASTER_GLOBAL_CTRL); 6516 6517 ret = readl_relaxed_poll_timeout(qm->io_base + ACC_MASTER_TRANS_RETURN, 6518 val, 6519 (val == ACC_MASTER_TRANS_RETURN_RW), 6520 POLL_PERIOD, POLL_TIMEOUT); 6521 if (ret) { 6522 pci_emerg(pdev, "Bus lock! Please reset system.\n"); 6523 return ret; 6524 } 6525 6526 ret = qm_set_pf_mse(qm, false); 6527 if (ret) 6528 pci_err(pdev, "failed to disable MSE before suspending!\n"); 6529 6530 return ret; 6531 } 6532 6533 static int qm_rebuild_for_resume(struct hisi_qm *qm) 6534 { 6535 struct pci_dev *pdev = qm->pdev; 6536 int ret; 6537 6538 ret = qm_set_pf_mse(qm, true); 6539 if (ret) { 6540 pci_err(pdev, "failed to enable MSE after resuming!\n"); 6541 return ret; 6542 } 6543 6544 ret = qm->ops->set_msi(qm, true); 6545 if (ret) { 6546 pci_err(pdev, "failed to enable MSI after resuming!\n"); 6547 return ret; 6548 } 6549 6550 ret = qm_dev_hw_init(qm); 6551 if (ret) { 6552 pci_err(pdev, "failed to init device after resuming\n"); 6553 return ret; 6554 } 6555 6556 qm_cmd_init(qm); 6557 hisi_qm_dev_err_init(qm); 6558 qm_disable_clock_gate(qm); 6559 ret = qm_dev_mem_reset(qm); 6560 if (ret) 6561 pci_err(pdev, "failed to reset device memory\n"); 6562 6563 return ret; 6564 } 6565 6566 /** 6567 * hisi_qm_suspend() - Runtime suspend of given device. 6568 * @dev: device to suspend. 6569 * 6570 * Function that suspend the device. 6571 */ 6572 int hisi_qm_suspend(struct device *dev) 6573 { 6574 struct pci_dev *pdev = to_pci_dev(dev); 6575 struct hisi_qm *qm = pci_get_drvdata(pdev); 6576 int ret; 6577 6578 pci_info(pdev, "entering suspended state\n"); 6579 6580 ret = hisi_qm_stop(qm, QM_NORMAL); 6581 if (ret) { 6582 pci_err(pdev, "failed to stop qm(%d)\n", ret); 6583 return ret; 6584 } 6585 6586 ret = qm_prepare_for_suspend(qm); 6587 if (ret) 6588 pci_err(pdev, "failed to prepare suspended(%d)\n", ret); 6589 6590 return ret; 6591 } 6592 EXPORT_SYMBOL_GPL(hisi_qm_suspend); 6593 6594 /** 6595 * hisi_qm_resume() - Runtime resume of given device. 6596 * @dev: device to resume. 6597 * 6598 * Function that resume the device. 6599 */ 6600 int hisi_qm_resume(struct device *dev) 6601 { 6602 struct pci_dev *pdev = to_pci_dev(dev); 6603 struct hisi_qm *qm = pci_get_drvdata(pdev); 6604 int ret; 6605 6606 pci_info(pdev, "resuming from suspend state\n"); 6607 6608 ret = qm_rebuild_for_resume(qm); 6609 if (ret) { 6610 pci_err(pdev, "failed to rebuild resume(%d)\n", ret); 6611 return ret; 6612 } 6613 6614 ret = hisi_qm_start(qm); 6615 if (ret) 6616 pci_err(pdev, "failed to start qm(%d)\n", ret); 6617 6618 return ret; 6619 } 6620 EXPORT_SYMBOL_GPL(hisi_qm_resume); 6621 6622 MODULE_LICENSE("GPL v2"); 6623 MODULE_AUTHOR("Zhou Wang <wangzhou1@hisilicon.com>"); 6624 MODULE_DESCRIPTION("HiSilicon Accelerator queue manager driver"); 6625