1 // SPDX-License-Identifier: GPL-2.0-only
3 #include <linux/delay.h>
4 #include <linux/firmware.h>
5 #include <linux/list.h>
6 #include <linux/module.h>
7 #include <linux/mutex.h>
9 #include <linux/pci_ids.h>
11 #include "nitrox_dev.h"
12 #include "nitrox_common.h"
13 #include "nitrox_csr.h"
14 #include "nitrox_hal.h"
15 #include "nitrox_isr.h"
16 #include "nitrox_debugfs.h"
18 #define CNN55XX_DEV_ID 0x12
20 #define DEFAULT_SE_GROUP 0
21 #define DEFAULT_AE_GROUP 0
23 #define DRIVER_VERSION "1.2"
24 #define CNN55XX_UCD_BLOCK_SIZE 32768
25 #define CNN55XX_MAX_UCODE_SIZE (CNN55XX_UCD_BLOCK_SIZE * 2)
26 #define FW_DIR "cavium/"
28 #define SE_FW FW_DIR "cnn55xx_se.fw"
30 #define AE_FW FW_DIR "cnn55xx_ae.fw"
32 static const char nitrox_driver_name
[] = "CNN55XX";
34 static LIST_HEAD(ndevlist
);
35 static DEFINE_MUTEX(devlist_lock
);
36 static unsigned int num_devices
;
39 * nitrox_pci_tbl - PCI Device ID Table
41 static const struct pci_device_id nitrox_pci_tbl
[] = {
42 {PCI_VDEVICE(CAVIUM
, CNN55XX_DEV_ID
), 0},
43 /* required last entry */
46 MODULE_DEVICE_TABLE(pci
, nitrox_pci_tbl
);
48 static unsigned int qlen
= DEFAULT_CMD_QLEN
;
49 module_param(qlen
, uint
, 0644);
50 MODULE_PARM_DESC(qlen
, "Command queue length - default 2048");
53 int nitrox_sriov_configure(struct pci_dev
*pdev
, int num_vfs
);
55 int nitrox_sriov_configure(struct pci_dev
*pdev
, int num_vfs
)
62 * struct ucode - Firmware Header
64 * @version: firmware version
65 * @code_size: code section size
71 char version
[VERSION_LEN
- 1];
78 * write_to_ucd_unit - Write Firmware to NITROX UCD unit
80 static void write_to_ucd_unit(struct nitrox_device
*ndev
, u32 ucode_size
,
81 u64
*ucode_data
, int block_num
)
99 * Total of 8 blocks, each size 32KB
102 /* set the block number */
103 offset
= UCD_UCODE_LOAD_BLOCK_NUM
;
104 nitrox_write_csr(ndev
, offset
, block_num
);
106 code_size
= roundup(ucode_size
, 16);
108 data
= ucode_data
[i
];
109 /* write 8 bytes at a time */
110 offset
= UCD_UCODE_LOAD_IDX_DATAX(i
);
111 nitrox_write_csr(ndev
, offset
, data
);
116 usleep_range(300, 400);
119 static int nitrox_load_fw(struct nitrox_device
*ndev
)
121 const struct firmware
*fw
;
126 union ucd_core_eid_ucode_block_num core_2_eid_val
;
127 union aqm_grp_execmsk_lo aqm_grp_execmask_lo
;
128 union aqm_grp_execmsk_hi aqm_grp_execmask_hi
;
133 dev_info(DEV(ndev
), "Loading firmware \"%s\"\n", fw_name
);
135 ret
= request_firmware(&fw
, fw_name
, DEV(ndev
));
137 dev_err(DEV(ndev
), "failed to get firmware %s\n", fw_name
);
141 ucode
= (struct ucode
*)fw
->data
;
143 ucode_size
= be32_to_cpu(ucode
->code_size
) * 2;
144 if (!ucode_size
|| ucode_size
> CNN55XX_MAX_UCODE_SIZE
) {
145 dev_err(DEV(ndev
), "Invalid ucode size: %u for firmware %s\n",
146 ucode_size
, fw_name
);
147 release_firmware(fw
);
150 ucode_data
= ucode
->code
;
152 /* copy the firmware version */
153 memcpy(&ndev
->hw
.fw_name
[0][0], ucode
->version
, (VERSION_LEN
- 2));
154 ndev
->hw
.fw_name
[0][VERSION_LEN
- 1] = '\0';
156 /* Load SE Firmware on UCD Block 0 */
157 write_to_ucd_unit(ndev
, ucode_size
, ucode_data
, 0);
159 release_firmware(fw
);
161 /* put all SE cores in DEFAULT_SE_GROUP */
162 offset
= POM_GRP_EXECMASKX(DEFAULT_SE_GROUP
);
163 nitrox_write_csr(ndev
, offset
, (~0ULL));
165 /* write block number and firmware length
166 * bit:<2:0> block number
167 * bit:3 is set SE uses 32KB microcode
168 * bit:3 is clear SE uses 64KB microcode
170 core_2_eid_val
.value
= 0ULL;
171 core_2_eid_val
.ucode_blk
= 0;
172 if (ucode_size
<= CNN55XX_UCD_BLOCK_SIZE
)
173 core_2_eid_val
.ucode_len
= 1;
175 core_2_eid_val
.ucode_len
= 0;
177 for (i
= 0; i
< ndev
->hw
.se_cores
; i
++) {
178 offset
= UCD_SE_EID_UCODE_BLOCK_NUMX(i
);
179 nitrox_write_csr(ndev
, offset
, core_2_eid_val
.value
);
184 dev_info(DEV(ndev
), "Loading firmware \"%s\"\n", fw_name
);
186 ret
= request_firmware(&fw
, fw_name
, DEV(ndev
));
188 dev_err(DEV(ndev
), "failed to get firmware %s\n", fw_name
);
192 ucode
= (struct ucode
*)fw
->data
;
194 ucode_size
= be32_to_cpu(ucode
->code_size
) * 2;
195 if (!ucode_size
|| ucode_size
> CNN55XX_MAX_UCODE_SIZE
) {
196 dev_err(DEV(ndev
), "Invalid ucode size: %u for firmware %s\n",
197 ucode_size
, fw_name
);
198 release_firmware(fw
);
201 ucode_data
= ucode
->code
;
203 /* copy the firmware version */
204 memcpy(&ndev
->hw
.fw_name
[1][0], ucode
->version
, (VERSION_LEN
- 2));
205 ndev
->hw
.fw_name
[1][VERSION_LEN
- 1] = '\0';
207 /* Load AE Firmware on UCD Block 2 */
208 write_to_ucd_unit(ndev
, ucode_size
, ucode_data
, 2);
210 release_firmware(fw
);
212 /* put all AE cores in DEFAULT_AE_GROUP */
213 offset
= AQM_GRP_EXECMSK_LOX(DEFAULT_AE_GROUP
);
214 aqm_grp_execmask_lo
.exec_0_to_39
= 0xFFFFFFFFFFULL
;
215 nitrox_write_csr(ndev
, offset
, aqm_grp_execmask_lo
.value
);
216 offset
= AQM_GRP_EXECMSK_HIX(DEFAULT_AE_GROUP
);
217 aqm_grp_execmask_hi
.exec_40_to_79
= 0xFFFFFFFFFFULL
;
218 nitrox_write_csr(ndev
, offset
, aqm_grp_execmask_hi
.value
);
220 /* write block number and firmware length
221 * bit:<2:0> block number
222 * bit:3 is set AE uses 32KB microcode
223 * bit:3 is clear AE uses 64KB microcode
225 core_2_eid_val
.value
= 0ULL;
226 core_2_eid_val
.ucode_blk
= 2;
227 if (ucode_size
<= CNN55XX_UCD_BLOCK_SIZE
)
228 core_2_eid_val
.ucode_len
= 1;
230 core_2_eid_val
.ucode_len
= 0;
232 for (i
= 0; i
< ndev
->hw
.ae_cores
; i
++) {
233 offset
= UCD_AE_EID_UCODE_BLOCK_NUMX(i
);
234 nitrox_write_csr(ndev
, offset
, core_2_eid_val
.value
);
241 * nitrox_add_to_devlist - add NITROX device to global device list
242 * @ndev: NITROX device
244 static int nitrox_add_to_devlist(struct nitrox_device
*ndev
)
246 struct nitrox_device
*dev
;
249 INIT_LIST_HEAD(&ndev
->list
);
250 refcount_set(&ndev
->refcnt
, 1);
252 mutex_lock(&devlist_lock
);
253 list_for_each_entry(dev
, &ndevlist
, list
) {
259 ndev
->idx
= num_devices
++;
260 list_add_tail(&ndev
->list
, &ndevlist
);
262 mutex_unlock(&devlist_lock
);
267 * nitrox_remove_from_devlist - remove NITROX device from
269 * @ndev: NITROX device
271 static void nitrox_remove_from_devlist(struct nitrox_device
*ndev
)
273 mutex_lock(&devlist_lock
);
274 list_del(&ndev
->list
);
276 mutex_unlock(&devlist_lock
);
279 struct nitrox_device
*nitrox_get_first_device(void)
281 struct nitrox_device
*ndev
= NULL
;
283 mutex_lock(&devlist_lock
);
284 list_for_each_entry(ndev
, &ndevlist
, list
) {
285 if (nitrox_ready(ndev
))
288 mutex_unlock(&devlist_lock
);
292 refcount_inc(&ndev
->refcnt
);
293 /* barrier to sync with other cpus */
294 smp_mb__after_atomic();
298 void nitrox_put_device(struct nitrox_device
*ndev
)
303 refcount_dec(&ndev
->refcnt
);
304 /* barrier to sync with other cpus */
305 smp_mb__after_atomic();
308 static int nitrox_device_flr(struct pci_dev
*pdev
)
312 pos
= pci_save_state(pdev
);
314 dev_err(&pdev
->dev
, "Failed to save pci state\n");
318 /* check flr support */
319 if (pcie_has_flr(pdev
))
322 pci_restore_state(pdev
);
327 static int nitrox_pf_sw_init(struct nitrox_device
*ndev
)
331 err
= nitrox_common_sw_init(ndev
);
335 err
= nitrox_register_interrupts(ndev
);
337 nitrox_common_sw_cleanup(ndev
);
342 static void nitrox_pf_sw_cleanup(struct nitrox_device
*ndev
)
344 nitrox_unregister_interrupts(ndev
);
345 nitrox_common_sw_cleanup(ndev
);
349 * nitrox_bist_check - Check NITORX BIST registers status
350 * @ndev: NITROX device
352 static int nitrox_bist_check(struct nitrox_device
*ndev
)
357 for (i
= 0; i
< NR_CLUSTERS
; i
++) {
358 value
+= nitrox_read_csr(ndev
, EMU_BIST_STATUSX(i
));
359 value
+= nitrox_read_csr(ndev
, EFL_CORE_BIST_REGX(i
));
361 value
+= nitrox_read_csr(ndev
, UCD_BIST_STATUS
);
362 value
+= nitrox_read_csr(ndev
, NPS_CORE_BIST_REG
);
363 value
+= nitrox_read_csr(ndev
, NPS_CORE_NPC_BIST_REG
);
364 value
+= nitrox_read_csr(ndev
, NPS_PKT_SLC_BIST_REG
);
365 value
+= nitrox_read_csr(ndev
, NPS_PKT_IN_BIST_REG
);
366 value
+= nitrox_read_csr(ndev
, POM_BIST_REG
);
367 value
+= nitrox_read_csr(ndev
, BMI_BIST_REG
);
368 value
+= nitrox_read_csr(ndev
, EFL_TOP_BIST_STAT
);
369 value
+= nitrox_read_csr(ndev
, BMO_BIST_REG
);
370 value
+= nitrox_read_csr(ndev
, LBC_BIST_STATUS
);
371 value
+= nitrox_read_csr(ndev
, PEM_BIST_STATUSX(0));
377 static int nitrox_pf_hw_init(struct nitrox_device
*ndev
)
381 err
= nitrox_bist_check(ndev
);
383 dev_err(&ndev
->pdev
->dev
, "BIST check failed\n");
386 /* get cores information */
387 nitrox_get_hwinfo(ndev
);
389 nitrox_config_nps_core_unit(ndev
);
390 nitrox_config_aqm_unit(ndev
);
391 nitrox_config_nps_pkt_unit(ndev
);
392 nitrox_config_pom_unit(ndev
);
393 nitrox_config_efl_unit(ndev
);
394 /* configure IO units */
395 nitrox_config_bmi_unit(ndev
);
396 nitrox_config_bmo_unit(ndev
);
397 /* configure Local Buffer Cache */
398 nitrox_config_lbc_unit(ndev
);
399 nitrox_config_rand_unit(ndev
);
401 /* load firmware on cores */
402 err
= nitrox_load_fw(ndev
);
406 nitrox_config_emu_unit(ndev
);
412 * nitrox_probe - NITROX Initialization function.
413 * @pdev: PCI device information struct
414 * @id: entry in nitrox_pci_tbl
416 * Return: 0, if the driver is bound to the device, or
417 * a negative error if there is failure.
419 static int nitrox_probe(struct pci_dev
*pdev
,
420 const struct pci_device_id
*id
)
422 struct nitrox_device
*ndev
;
425 dev_info_once(&pdev
->dev
, "%s driver version %s\n",
426 nitrox_driver_name
, DRIVER_VERSION
);
428 err
= pci_enable_device_mem(pdev
);
433 err
= nitrox_device_flr(pdev
);
435 dev_err(&pdev
->dev
, "FLR failed\n");
436 pci_disable_device(pdev
);
440 if (!dma_set_mask_and_coherent(&pdev
->dev
, DMA_BIT_MASK(64))) {
441 dev_dbg(&pdev
->dev
, "DMA to 64-BIT address\n");
443 err
= dma_set_mask_and_coherent(&pdev
->dev
, DMA_BIT_MASK(32));
445 dev_err(&pdev
->dev
, "DMA configuration failed\n");
446 pci_disable_device(pdev
);
451 err
= pci_request_mem_regions(pdev
, nitrox_driver_name
);
453 pci_disable_device(pdev
);
456 pci_set_master(pdev
);
458 ndev
= kzalloc(sizeof(*ndev
), GFP_KERNEL
);
464 pci_set_drvdata(pdev
, ndev
);
467 /* add to device list */
468 nitrox_add_to_devlist(ndev
);
470 ndev
->hw
.vendor_id
= pdev
->vendor
;
471 ndev
->hw
.device_id
= pdev
->device
;
472 ndev
->hw
.revision_id
= pdev
->revision
;
473 /* command timeout in jiffies */
474 ndev
->timeout
= msecs_to_jiffies(CMD_TIMEOUT
);
475 ndev
->node
= dev_to_node(&pdev
->dev
);
476 if (ndev
->node
== NUMA_NO_NODE
)
479 ndev
->bar_addr
= ioremap(pci_resource_start(pdev
, 0),
480 pci_resource_len(pdev
, 0));
481 if (!ndev
->bar_addr
) {
485 /* allocate command queus based on cpus, max queues are 64 */
486 ndev
->nr_queues
= min_t(u32
, MAX_PF_QUEUES
, num_online_cpus());
489 err
= nitrox_pf_sw_init(ndev
);
493 err
= nitrox_pf_hw_init(ndev
);
497 nitrox_debugfs_init(ndev
);
499 /* clear the statistics */
500 atomic64_set(&ndev
->stats
.posted
, 0);
501 atomic64_set(&ndev
->stats
.completed
, 0);
502 atomic64_set(&ndev
->stats
.dropped
, 0);
504 atomic_set(&ndev
->state
, __NDEV_READY
);
505 /* barrier to sync with other cpus */
506 smp_mb__after_atomic();
508 err
= nitrox_crypto_register();
515 nitrox_debugfs_exit(ndev
);
516 atomic_set(&ndev
->state
, __NDEV_NOT_READY
);
517 /* barrier to sync with other cpus */
518 smp_mb__after_atomic();
520 nitrox_pf_sw_cleanup(ndev
);
522 nitrox_remove_from_devlist(ndev
);
524 pci_set_drvdata(pdev
, NULL
);
526 pci_release_mem_regions(pdev
);
527 pci_disable_device(pdev
);
532 * nitrox_remove - Unbind the driver from the device.
533 * @pdev: PCI device information struct
535 static void nitrox_remove(struct pci_dev
*pdev
)
537 struct nitrox_device
*ndev
= pci_get_drvdata(pdev
);
542 if (!refcount_dec_and_test(&ndev
->refcnt
)) {
543 dev_err(DEV(ndev
), "Device refcnt not zero (%d)\n",
544 refcount_read(&ndev
->refcnt
));
548 dev_info(DEV(ndev
), "Removing Device %x:%x\n",
549 ndev
->hw
.vendor_id
, ndev
->hw
.device_id
);
551 atomic_set(&ndev
->state
, __NDEV_NOT_READY
);
552 /* barrier to sync with other cpus */
553 smp_mb__after_atomic();
555 nitrox_remove_from_devlist(ndev
);
557 #ifdef CONFIG_PCI_IOV
559 nitrox_sriov_configure(pdev
, 0);
561 nitrox_crypto_unregister();
562 nitrox_debugfs_exit(ndev
);
563 nitrox_pf_sw_cleanup(ndev
);
565 iounmap(ndev
->bar_addr
);
568 pci_set_drvdata(pdev
, NULL
);
569 pci_release_mem_regions(pdev
);
570 pci_disable_device(pdev
);
573 static void nitrox_shutdown(struct pci_dev
*pdev
)
575 pci_set_drvdata(pdev
, NULL
);
576 pci_release_mem_regions(pdev
);
577 pci_disable_device(pdev
);
580 static struct pci_driver nitrox_driver
= {
581 .name
= nitrox_driver_name
,
582 .id_table
= nitrox_pci_tbl
,
583 .probe
= nitrox_probe
,
584 .remove
= nitrox_remove
,
585 .shutdown
= nitrox_shutdown
,
586 #ifdef CONFIG_PCI_IOV
587 .sriov_configure
= nitrox_sriov_configure
,
591 module_pci_driver(nitrox_driver
);
593 MODULE_AUTHOR("Srikanth Jampala <Jampala.Srikanth@cavium.com>");
594 MODULE_DESCRIPTION("Cavium CNN55XX PF Driver" DRIVER_VERSION
" ");
595 MODULE_LICENSE("GPL");
596 MODULE_VERSION(DRIVER_VERSION
);
597 MODULE_FIRMWARE(SE_FW
);