10dc1cffaSAnkur Dwivedi /* SPDX-License-Identifier: BSD-3-Clause 20dc1cffaSAnkur Dwivedi * Copyright(c) 2018 Cavium, Inc 30dc1cffaSAnkur Dwivedi */ 40961348fSMurthy NSSR #include <assert.h> 50dc1cffaSAnkur Dwivedi #include <string.h> 60906b99fSMurthy NSSR #include <unistd.h> 70dc1cffaSAnkur Dwivedi 884eb02f7SAnkur Dwivedi #include <rte_branch_prediction.h> 90dc1cffaSAnkur Dwivedi #include <rte_common.h> 10ec54bc9dSAnoob Joseph #include <rte_cryptodev.h> 110961348fSMurthy NSSR #include <rte_errno.h> 12ec54bc9dSAnoob Joseph #include <rte_mempool.h> 130961348fSMurthy NSSR #include <rte_memzone.h> 14acbaf3ceSAnoob Joseph #include <rte_string_fns.h> 150dc1cffaSAnkur Dwivedi 160dc1cffaSAnkur Dwivedi #include "otx_cryptodev_hw_access.h" 17ae500541SMurthy NSSR #include "otx_cryptodev_mbox.h" 180dc1cffaSAnkur Dwivedi 190dc1cffaSAnkur Dwivedi #include "cpt_pmd_logs.h" 20ec54bc9dSAnoob Joseph #include "cpt_pmd_ops_helper.h" 2184eb02f7SAnkur Dwivedi #include "cpt_hw_types.h" 2284eb02f7SAnkur Dwivedi 23ec54bc9dSAnoob Joseph #define METABUF_POOL_CACHE_SIZE 512 24ec54bc9dSAnoob Joseph 2584eb02f7SAnkur Dwivedi /* 2684eb02f7SAnkur Dwivedi * VF HAL functions 2784eb02f7SAnkur Dwivedi * Access its own BAR0/4 registers by passing VF number as 0. 2884eb02f7SAnkur Dwivedi * OS/PCI maps them accordingly. 2984eb02f7SAnkur Dwivedi */ 300dc1cffaSAnkur Dwivedi 310dc1cffaSAnkur Dwivedi static int 320dc1cffaSAnkur Dwivedi otx_cpt_vf_init(struct cpt_vf *cptvf) 330dc1cffaSAnkur Dwivedi { 340dc1cffaSAnkur Dwivedi int ret = 0; 350dc1cffaSAnkur Dwivedi 36ae500541SMurthy NSSR /* Check ready with PF */ 37ae500541SMurthy NSSR /* Gets chip ID / device Id from PF if ready */ 38ae500541SMurthy NSSR ret = otx_cpt_check_pf_ready(cptvf); 39ae500541SMurthy NSSR if (ret) { 40ae500541SMurthy NSSR CPT_LOG_ERR("%s: PF not responding to READY msg", 41ae500541SMurthy NSSR cptvf->dev_name); 42ae500541SMurthy NSSR ret = -EBUSY; 43ae500541SMurthy NSSR goto exit; 44ae500541SMurthy NSSR } 45ae500541SMurthy NSSR 460dc1cffaSAnkur Dwivedi CPT_LOG_DP_DEBUG("%s: %s done", cptvf->dev_name, __func__); 470dc1cffaSAnkur Dwivedi 48ae500541SMurthy NSSR exit: 490dc1cffaSAnkur Dwivedi return ret; 500dc1cffaSAnkur Dwivedi } 510dc1cffaSAnkur Dwivedi 5284eb02f7SAnkur Dwivedi /* 5384eb02f7SAnkur Dwivedi * Read Interrupt status of the VF 5484eb02f7SAnkur Dwivedi * 5584eb02f7SAnkur Dwivedi * @param cptvf cptvf structure 5684eb02f7SAnkur Dwivedi */ 5784eb02f7SAnkur Dwivedi static uint64_t 5884eb02f7SAnkur Dwivedi otx_cpt_read_vf_misc_intr_status(struct cpt_vf *cptvf) 5984eb02f7SAnkur Dwivedi { 6084eb02f7SAnkur Dwivedi return CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), CPTX_VQX_MISC_INT(0, 0)); 6184eb02f7SAnkur Dwivedi } 6284eb02f7SAnkur Dwivedi 6384eb02f7SAnkur Dwivedi /* 6484eb02f7SAnkur Dwivedi * Clear mailbox interrupt of the VF 6584eb02f7SAnkur Dwivedi * 6684eb02f7SAnkur Dwivedi * @param cptvf cptvf structure 6784eb02f7SAnkur Dwivedi */ 6884eb02f7SAnkur Dwivedi static void 6984eb02f7SAnkur Dwivedi otx_cpt_clear_mbox_intr(struct cpt_vf *cptvf) 7084eb02f7SAnkur Dwivedi { 7184eb02f7SAnkur Dwivedi cptx_vqx_misc_int_t vqx_misc_int; 7284eb02f7SAnkur Dwivedi 7384eb02f7SAnkur Dwivedi vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), 7484eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0)); 7584eb02f7SAnkur Dwivedi /* W1C for the VF */ 7684eb02f7SAnkur Dwivedi vqx_misc_int.s.mbox = 1; 7784eb02f7SAnkur Dwivedi CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 7884eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u); 7984eb02f7SAnkur Dwivedi } 8084eb02f7SAnkur Dwivedi 8184eb02f7SAnkur Dwivedi /* 8284eb02f7SAnkur Dwivedi * Clear instruction NCB read error interrupt of the VF 8384eb02f7SAnkur Dwivedi * 8484eb02f7SAnkur Dwivedi * @param cptvf cptvf structure 8584eb02f7SAnkur Dwivedi */ 8684eb02f7SAnkur Dwivedi static void 8784eb02f7SAnkur Dwivedi otx_cpt_clear_irde_intr(struct cpt_vf *cptvf) 8884eb02f7SAnkur Dwivedi { 8984eb02f7SAnkur Dwivedi cptx_vqx_misc_int_t vqx_misc_int; 9084eb02f7SAnkur Dwivedi 9184eb02f7SAnkur Dwivedi vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), 9284eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0)); 9384eb02f7SAnkur Dwivedi /* W1C for the VF */ 9484eb02f7SAnkur Dwivedi vqx_misc_int.s.irde = 1; 9584eb02f7SAnkur Dwivedi CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 9684eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u); 9784eb02f7SAnkur Dwivedi } 9884eb02f7SAnkur Dwivedi 9984eb02f7SAnkur Dwivedi /* 10084eb02f7SAnkur Dwivedi * Clear NCB result write response error interrupt of the VF 10184eb02f7SAnkur Dwivedi * 10284eb02f7SAnkur Dwivedi * @param cptvf cptvf structure 10384eb02f7SAnkur Dwivedi */ 10484eb02f7SAnkur Dwivedi static void 10584eb02f7SAnkur Dwivedi otx_cpt_clear_nwrp_intr(struct cpt_vf *cptvf) 10684eb02f7SAnkur Dwivedi { 10784eb02f7SAnkur Dwivedi cptx_vqx_misc_int_t vqx_misc_int; 10884eb02f7SAnkur Dwivedi 10984eb02f7SAnkur Dwivedi vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), 11084eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0)); 11184eb02f7SAnkur Dwivedi /* W1C for the VF */ 11284eb02f7SAnkur Dwivedi vqx_misc_int.s.nwrp = 1; 11384eb02f7SAnkur Dwivedi CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 11484eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u); 11584eb02f7SAnkur Dwivedi } 11684eb02f7SAnkur Dwivedi 11784eb02f7SAnkur Dwivedi /* 11884eb02f7SAnkur Dwivedi * Clear swerr interrupt of the VF 11984eb02f7SAnkur Dwivedi * 12084eb02f7SAnkur Dwivedi * @param cptvf cptvf structure 12184eb02f7SAnkur Dwivedi */ 12284eb02f7SAnkur Dwivedi static void 12384eb02f7SAnkur Dwivedi otx_cpt_clear_swerr_intr(struct cpt_vf *cptvf) 12484eb02f7SAnkur Dwivedi { 12584eb02f7SAnkur Dwivedi cptx_vqx_misc_int_t vqx_misc_int; 12684eb02f7SAnkur Dwivedi 12784eb02f7SAnkur Dwivedi vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), 12884eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0)); 12984eb02f7SAnkur Dwivedi /* W1C for the VF */ 13084eb02f7SAnkur Dwivedi vqx_misc_int.s.swerr = 1; 13184eb02f7SAnkur Dwivedi CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 13284eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u); 13384eb02f7SAnkur Dwivedi } 13484eb02f7SAnkur Dwivedi 13584eb02f7SAnkur Dwivedi /* 13684eb02f7SAnkur Dwivedi * Clear hwerr interrupt of the VF 13784eb02f7SAnkur Dwivedi * 13884eb02f7SAnkur Dwivedi * @param cptvf cptvf structure 13984eb02f7SAnkur Dwivedi */ 14084eb02f7SAnkur Dwivedi static void 14184eb02f7SAnkur Dwivedi otx_cpt_clear_hwerr_intr(struct cpt_vf *cptvf) 14284eb02f7SAnkur Dwivedi { 14384eb02f7SAnkur Dwivedi cptx_vqx_misc_int_t vqx_misc_int; 14484eb02f7SAnkur Dwivedi 14584eb02f7SAnkur Dwivedi vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), 14684eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0)); 14784eb02f7SAnkur Dwivedi /* W1C for the VF */ 14884eb02f7SAnkur Dwivedi vqx_misc_int.s.hwerr = 1; 14984eb02f7SAnkur Dwivedi CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 15084eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u); 15184eb02f7SAnkur Dwivedi } 15284eb02f7SAnkur Dwivedi 15384eb02f7SAnkur Dwivedi /* 15484eb02f7SAnkur Dwivedi * Clear translation fault interrupt of the VF 15584eb02f7SAnkur Dwivedi * 15684eb02f7SAnkur Dwivedi * @param cptvf cptvf structure 15784eb02f7SAnkur Dwivedi */ 15884eb02f7SAnkur Dwivedi static void 15984eb02f7SAnkur Dwivedi otx_cpt_clear_fault_intr(struct cpt_vf *cptvf) 16084eb02f7SAnkur Dwivedi { 16184eb02f7SAnkur Dwivedi cptx_vqx_misc_int_t vqx_misc_int; 16284eb02f7SAnkur Dwivedi 16384eb02f7SAnkur Dwivedi vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), 16484eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0)); 16584eb02f7SAnkur Dwivedi /* W1C for the VF */ 16684eb02f7SAnkur Dwivedi vqx_misc_int.s.fault = 1; 16784eb02f7SAnkur Dwivedi CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 16884eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u); 16984eb02f7SAnkur Dwivedi } 17084eb02f7SAnkur Dwivedi 17184eb02f7SAnkur Dwivedi /* 17284eb02f7SAnkur Dwivedi * Clear doorbell overflow interrupt of the VF 17384eb02f7SAnkur Dwivedi * 17484eb02f7SAnkur Dwivedi * @param cptvf cptvf structure 17584eb02f7SAnkur Dwivedi */ 17684eb02f7SAnkur Dwivedi static void 17784eb02f7SAnkur Dwivedi otx_cpt_clear_dovf_intr(struct cpt_vf *cptvf) 17884eb02f7SAnkur Dwivedi { 17984eb02f7SAnkur Dwivedi cptx_vqx_misc_int_t vqx_misc_int; 18084eb02f7SAnkur Dwivedi 18184eb02f7SAnkur Dwivedi vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), 18284eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0)); 18384eb02f7SAnkur Dwivedi /* W1C for the VF */ 18484eb02f7SAnkur Dwivedi vqx_misc_int.s.dovf = 1; 18584eb02f7SAnkur Dwivedi CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 18684eb02f7SAnkur Dwivedi CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u); 18784eb02f7SAnkur Dwivedi } 18884eb02f7SAnkur Dwivedi 1890961348fSMurthy NSSR /* Write to VQX_CTL register 1900961348fSMurthy NSSR */ 1910961348fSMurthy NSSR static void 1920961348fSMurthy NSSR otx_cpt_write_vq_ctl(struct cpt_vf *cptvf, bool val) 1930961348fSMurthy NSSR { 1940961348fSMurthy NSSR cptx_vqx_ctl_t vqx_ctl; 1950961348fSMurthy NSSR 1960961348fSMurthy NSSR vqx_ctl.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), 1970961348fSMurthy NSSR CPTX_VQX_CTL(0, 0)); 1980961348fSMurthy NSSR vqx_ctl.s.ena = val; 1990961348fSMurthy NSSR CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 2000961348fSMurthy NSSR CPTX_VQX_CTL(0, 0), vqx_ctl.u); 2010961348fSMurthy NSSR } 2020961348fSMurthy NSSR 2030961348fSMurthy NSSR /* Write to VQX_INPROG register 2040961348fSMurthy NSSR */ 2050961348fSMurthy NSSR static void 2060961348fSMurthy NSSR otx_cpt_write_vq_inprog(struct cpt_vf *cptvf, uint8_t val) 2070961348fSMurthy NSSR { 2080961348fSMurthy NSSR cptx_vqx_inprog_t vqx_inprg; 2090961348fSMurthy NSSR 2100961348fSMurthy NSSR vqx_inprg.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), 2110961348fSMurthy NSSR CPTX_VQX_INPROG(0, 0)); 2120961348fSMurthy NSSR vqx_inprg.s.inflight = val; 2130961348fSMurthy NSSR CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 2140961348fSMurthy NSSR CPTX_VQX_INPROG(0, 0), vqx_inprg.u); 2150961348fSMurthy NSSR } 2160961348fSMurthy NSSR 2170961348fSMurthy NSSR /* Write to VQX_DONE_WAIT NUMWAIT register 2180961348fSMurthy NSSR */ 2190961348fSMurthy NSSR static void 2200961348fSMurthy NSSR otx_cpt_write_vq_done_numwait(struct cpt_vf *cptvf, uint32_t val) 2210961348fSMurthy NSSR { 2220961348fSMurthy NSSR cptx_vqx_done_wait_t vqx_dwait; 2230961348fSMurthy NSSR 2240961348fSMurthy NSSR vqx_dwait.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), 2250961348fSMurthy NSSR CPTX_VQX_DONE_WAIT(0, 0)); 2260961348fSMurthy NSSR vqx_dwait.s.num_wait = val; 2270961348fSMurthy NSSR CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 2280961348fSMurthy NSSR CPTX_VQX_DONE_WAIT(0, 0), vqx_dwait.u); 2290961348fSMurthy NSSR } 2300961348fSMurthy NSSR 2310961348fSMurthy NSSR /* Write to VQX_DONE_WAIT NUM_WAIT register 2320961348fSMurthy NSSR */ 2330961348fSMurthy NSSR static void 2340961348fSMurthy NSSR otx_cpt_write_vq_done_timewait(struct cpt_vf *cptvf, uint16_t val) 2350961348fSMurthy NSSR { 2360961348fSMurthy NSSR cptx_vqx_done_wait_t vqx_dwait; 2370961348fSMurthy NSSR 2380961348fSMurthy NSSR vqx_dwait.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), 2390961348fSMurthy NSSR CPTX_VQX_DONE_WAIT(0, 0)); 2400961348fSMurthy NSSR vqx_dwait.s.time_wait = val; 2410961348fSMurthy NSSR CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 2420961348fSMurthy NSSR CPTX_VQX_DONE_WAIT(0, 0), vqx_dwait.u); 2430961348fSMurthy NSSR } 2440961348fSMurthy NSSR 2450961348fSMurthy NSSR /* Write to VQX_SADDR register 2460961348fSMurthy NSSR */ 2470961348fSMurthy NSSR static void 2480961348fSMurthy NSSR otx_cpt_write_vq_saddr(struct cpt_vf *cptvf, uint64_t val) 2490961348fSMurthy NSSR { 2500961348fSMurthy NSSR cptx_vqx_saddr_t vqx_saddr; 2510961348fSMurthy NSSR 2520961348fSMurthy NSSR vqx_saddr.u = val; 2530961348fSMurthy NSSR CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf), 2540961348fSMurthy NSSR CPTX_VQX_SADDR(0, 0), vqx_saddr.u); 2550961348fSMurthy NSSR } 2560961348fSMurthy NSSR 2570961348fSMurthy NSSR static void 2580961348fSMurthy NSSR otx_cpt_vfvq_init(struct cpt_vf *cptvf) 2590961348fSMurthy NSSR { 2600961348fSMurthy NSSR uint64_t base_addr = 0; 2610961348fSMurthy NSSR 2620961348fSMurthy NSSR /* Disable the VQ */ 2630961348fSMurthy NSSR otx_cpt_write_vq_ctl(cptvf, 0); 2640961348fSMurthy NSSR 2650961348fSMurthy NSSR /* Reset the doorbell */ 2660961348fSMurthy NSSR otx_cpt_write_vq_doorbell(cptvf, 0); 2670961348fSMurthy NSSR /* Clear inflight */ 2680961348fSMurthy NSSR otx_cpt_write_vq_inprog(cptvf, 0); 2690961348fSMurthy NSSR 2700961348fSMurthy NSSR /* Write VQ SADDR */ 2710961348fSMurthy NSSR base_addr = (uint64_t)(cptvf->cqueue.chead[0].dma_addr); 2720961348fSMurthy NSSR otx_cpt_write_vq_saddr(cptvf, base_addr); 2730961348fSMurthy NSSR 2740961348fSMurthy NSSR /* Configure timerhold / coalescence */ 2750961348fSMurthy NSSR otx_cpt_write_vq_done_timewait(cptvf, CPT_TIMER_THOLD); 2760961348fSMurthy NSSR otx_cpt_write_vq_done_numwait(cptvf, CPT_COUNT_THOLD); 2770961348fSMurthy NSSR 2780961348fSMurthy NSSR /* Enable the VQ */ 2790961348fSMurthy NSSR otx_cpt_write_vq_ctl(cptvf, 1); 2800961348fSMurthy NSSR } 2810961348fSMurthy NSSR 2820961348fSMurthy NSSR static int 2830961348fSMurthy NSSR cpt_vq_init(struct cpt_vf *cptvf, uint8_t group) 2840961348fSMurthy NSSR { 2850961348fSMurthy NSSR int err; 2860961348fSMurthy NSSR 2870961348fSMurthy NSSR /* Convey VQ LEN to PF */ 2880961348fSMurthy NSSR err = otx_cpt_send_vq_size_msg(cptvf); 2890961348fSMurthy NSSR if (err) { 2900961348fSMurthy NSSR CPT_LOG_ERR("%s: PF not responding to QLEN msg", 2910961348fSMurthy NSSR cptvf->dev_name); 2920961348fSMurthy NSSR err = -EBUSY; 2930961348fSMurthy NSSR goto cleanup; 2940961348fSMurthy NSSR } 2950961348fSMurthy NSSR 2960961348fSMurthy NSSR /* CPT VF device initialization */ 2970961348fSMurthy NSSR otx_cpt_vfvq_init(cptvf); 2980961348fSMurthy NSSR 2990961348fSMurthy NSSR /* Send msg to PF to assign currnet Q to required group */ 3000961348fSMurthy NSSR cptvf->vfgrp = group; 3010961348fSMurthy NSSR err = otx_cpt_send_vf_grp_msg(cptvf, group); 3020961348fSMurthy NSSR if (err) { 3030961348fSMurthy NSSR CPT_LOG_ERR("%s: PF not responding to VF_GRP msg", 3040961348fSMurthy NSSR cptvf->dev_name); 3050961348fSMurthy NSSR err = -EBUSY; 3060961348fSMurthy NSSR goto cleanup; 3070961348fSMurthy NSSR } 3080961348fSMurthy NSSR 3090961348fSMurthy NSSR CPT_LOG_DP_DEBUG("%s: %s done", cptvf->dev_name, __func__); 3100961348fSMurthy NSSR return 0; 3110961348fSMurthy NSSR 3120961348fSMurthy NSSR cleanup: 3130961348fSMurthy NSSR return err; 3140961348fSMurthy NSSR } 3150961348fSMurthy NSSR 3160dc1cffaSAnkur Dwivedi void 3170dc1cffaSAnkur Dwivedi otx_cpt_poll_misc(struct cpt_vf *cptvf) 3180dc1cffaSAnkur Dwivedi { 31984eb02f7SAnkur Dwivedi uint64_t intr; 32084eb02f7SAnkur Dwivedi 32184eb02f7SAnkur Dwivedi intr = otx_cpt_read_vf_misc_intr_status(cptvf); 32284eb02f7SAnkur Dwivedi 32384eb02f7SAnkur Dwivedi if (!intr) 32484eb02f7SAnkur Dwivedi return; 32584eb02f7SAnkur Dwivedi 32684eb02f7SAnkur Dwivedi /* Check for MISC interrupt types */ 32784eb02f7SAnkur Dwivedi if (likely(intr & CPT_VF_INTR_MBOX_MASK)) { 32884eb02f7SAnkur Dwivedi CPT_LOG_DP_DEBUG("%s: Mailbox interrupt 0x%lx on CPT VF %d", 32984eb02f7SAnkur Dwivedi cptvf->dev_name, (unsigned int long)intr, cptvf->vfid); 330ae500541SMurthy NSSR otx_cpt_handle_mbox_intr(cptvf); 33184eb02f7SAnkur Dwivedi otx_cpt_clear_mbox_intr(cptvf); 33284eb02f7SAnkur Dwivedi } else if (unlikely(intr & CPT_VF_INTR_IRDE_MASK)) { 33384eb02f7SAnkur Dwivedi otx_cpt_clear_irde_intr(cptvf); 33484eb02f7SAnkur Dwivedi CPT_LOG_DP_DEBUG("%s: Instruction NCB read error interrupt " 33584eb02f7SAnkur Dwivedi "0x%lx on CPT VF %d", cptvf->dev_name, 33684eb02f7SAnkur Dwivedi (unsigned int long)intr, cptvf->vfid); 33784eb02f7SAnkur Dwivedi } else if (unlikely(intr & CPT_VF_INTR_NWRP_MASK)) { 33884eb02f7SAnkur Dwivedi otx_cpt_clear_nwrp_intr(cptvf); 33984eb02f7SAnkur Dwivedi CPT_LOG_DP_DEBUG("%s: NCB response write error interrupt 0x%lx" 34084eb02f7SAnkur Dwivedi " on CPT VF %d", cptvf->dev_name, 34184eb02f7SAnkur Dwivedi (unsigned int long)intr, cptvf->vfid); 34284eb02f7SAnkur Dwivedi } else if (unlikely(intr & CPT_VF_INTR_SWERR_MASK)) { 34384eb02f7SAnkur Dwivedi otx_cpt_clear_swerr_intr(cptvf); 34484eb02f7SAnkur Dwivedi CPT_LOG_DP_DEBUG("%s: Software error interrupt 0x%lx on CPT VF " 34584eb02f7SAnkur Dwivedi "%d", cptvf->dev_name, (unsigned int long)intr, 34684eb02f7SAnkur Dwivedi cptvf->vfid); 34784eb02f7SAnkur Dwivedi } else if (unlikely(intr & CPT_VF_INTR_HWERR_MASK)) { 34884eb02f7SAnkur Dwivedi otx_cpt_clear_hwerr_intr(cptvf); 34984eb02f7SAnkur Dwivedi CPT_LOG_DP_DEBUG("%s: Hardware error interrupt 0x%lx on CPT VF " 35084eb02f7SAnkur Dwivedi "%d", cptvf->dev_name, (unsigned int long)intr, 35184eb02f7SAnkur Dwivedi cptvf->vfid); 35284eb02f7SAnkur Dwivedi } else if (unlikely(intr & CPT_VF_INTR_FAULT_MASK)) { 35384eb02f7SAnkur Dwivedi otx_cpt_clear_fault_intr(cptvf); 35484eb02f7SAnkur Dwivedi CPT_LOG_DP_DEBUG("%s: Translation fault interrupt 0x%lx on CPT VF " 35584eb02f7SAnkur Dwivedi "%d", cptvf->dev_name, (unsigned int long)intr, 35684eb02f7SAnkur Dwivedi cptvf->vfid); 35784eb02f7SAnkur Dwivedi } else if (unlikely(intr & CPT_VF_INTR_DOVF_MASK)) { 35884eb02f7SAnkur Dwivedi otx_cpt_clear_dovf_intr(cptvf); 35984eb02f7SAnkur Dwivedi CPT_LOG_DP_DEBUG("%s: Doorbell overflow interrupt 0x%lx on CPT VF " 36084eb02f7SAnkur Dwivedi "%d", cptvf->dev_name, (unsigned int long)intr, 36184eb02f7SAnkur Dwivedi cptvf->vfid); 36284eb02f7SAnkur Dwivedi } else 36384eb02f7SAnkur Dwivedi CPT_LOG_DP_ERR("%s: Unhandled interrupt 0x%lx in CPT VF %d", 36484eb02f7SAnkur Dwivedi cptvf->dev_name, (unsigned int long)intr, 36584eb02f7SAnkur Dwivedi cptvf->vfid); 3660dc1cffaSAnkur Dwivedi } 3670dc1cffaSAnkur Dwivedi 3680dc1cffaSAnkur Dwivedi int 3690dc1cffaSAnkur Dwivedi otx_cpt_hw_init(struct cpt_vf *cptvf, void *pdev, void *reg_base, char *name) 3700dc1cffaSAnkur Dwivedi { 3710dc1cffaSAnkur Dwivedi memset(cptvf, 0, sizeof(struct cpt_vf)); 3720dc1cffaSAnkur Dwivedi 3730dc1cffaSAnkur Dwivedi /* Bar0 base address */ 3740dc1cffaSAnkur Dwivedi cptvf->reg_base = reg_base; 375acbaf3ceSAnoob Joseph 376acbaf3ceSAnoob Joseph /* Save device name */ 377acbaf3ceSAnoob Joseph strlcpy(cptvf->dev_name, name, (sizeof(cptvf->dev_name))); 3780dc1cffaSAnkur Dwivedi 3790dc1cffaSAnkur Dwivedi cptvf->pdev = pdev; 3800dc1cffaSAnkur Dwivedi 3810dc1cffaSAnkur Dwivedi /* To clear if there are any pending mbox msgs */ 3820dc1cffaSAnkur Dwivedi otx_cpt_poll_misc(cptvf); 3830dc1cffaSAnkur Dwivedi 3840dc1cffaSAnkur Dwivedi if (otx_cpt_vf_init(cptvf)) { 3850dc1cffaSAnkur Dwivedi CPT_LOG_ERR("Failed to initialize CPT VF device"); 3860dc1cffaSAnkur Dwivedi return -1; 3870dc1cffaSAnkur Dwivedi } 3880dc1cffaSAnkur Dwivedi 38913d711f3SKanaka Durga Kotamarthy /* Gets device type */ 39013d711f3SKanaka Durga Kotamarthy if (otx_cpt_get_dev_type(cptvf)) { 39113d711f3SKanaka Durga Kotamarthy CPT_LOG_ERR("Failed to get device type"); 39213d711f3SKanaka Durga Kotamarthy return -1; 39313d711f3SKanaka Durga Kotamarthy } 39413d711f3SKanaka Durga Kotamarthy 3950dc1cffaSAnkur Dwivedi return 0; 3960dc1cffaSAnkur Dwivedi } 397273487f7SAnoob Joseph 398273487f7SAnoob Joseph int 399273487f7SAnoob Joseph otx_cpt_deinit_device(void *dev) 400273487f7SAnoob Joseph { 401273487f7SAnoob Joseph struct cpt_vf *cptvf = (struct cpt_vf *)dev; 402273487f7SAnoob Joseph 403273487f7SAnoob Joseph /* Do misc work one last time */ 404273487f7SAnoob Joseph otx_cpt_poll_misc(cptvf); 405273487f7SAnoob Joseph 406273487f7SAnoob Joseph return 0; 407273487f7SAnoob Joseph } 4080906b99fSMurthy NSSR 409ec54bc9dSAnoob Joseph static int 410ec54bc9dSAnoob Joseph otx_cpt_metabuf_mempool_create(const struct rte_cryptodev *dev, 411ec54bc9dSAnoob Joseph struct cpt_instance *instance, uint8_t qp_id, 41226f556b3SAnoob Joseph unsigned int nb_elements) 413ec54bc9dSAnoob Joseph { 414ec54bc9dSAnoob Joseph char mempool_name[RTE_MEMPOOL_NAMESIZE]; 415ec54bc9dSAnoob Joseph struct cpt_qp_meta_info *meta_info; 416ec54bc9dSAnoob Joseph struct rte_mempool *pool; 417fadc1ea1SKanaka Durga Kotamarthy int max_mlen = 0; 418fadc1ea1SKanaka Durga Kotamarthy int sg_mlen = 0; 419fadc1ea1SKanaka Durga Kotamarthy int lb_mlen = 0; 42026f556b3SAnoob Joseph int mb_pool_sz; 421fadc1ea1SKanaka Durga Kotamarthy int ret; 422fadc1ea1SKanaka Durga Kotamarthy 423fadc1ea1SKanaka Durga Kotamarthy /* 424fadc1ea1SKanaka Durga Kotamarthy * Calculate metabuf length required. The 'crypto_octeontx' device 425fadc1ea1SKanaka Durga Kotamarthy * would be either SYMMETRIC or ASYMMETRIC. 426fadc1ea1SKanaka Durga Kotamarthy */ 427fadc1ea1SKanaka Durga Kotamarthy 428fadc1ea1SKanaka Durga Kotamarthy if (dev->feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) { 429ec54bc9dSAnoob Joseph 430ec54bc9dSAnoob Joseph /* Get meta len for scatter gather mode */ 431ec54bc9dSAnoob Joseph sg_mlen = cpt_pmd_ops_helper_get_mlen_sg_mode(); 432ec54bc9dSAnoob Joseph 433ec54bc9dSAnoob Joseph /* Extra 32B saved for future considerations */ 434ec54bc9dSAnoob Joseph sg_mlen += 4 * sizeof(uint64_t); 435ec54bc9dSAnoob Joseph 436ec54bc9dSAnoob Joseph /* Get meta len for linear buffer (direct) mode */ 437ec54bc9dSAnoob Joseph lb_mlen = cpt_pmd_ops_helper_get_mlen_direct_mode(); 438ec54bc9dSAnoob Joseph 439ec54bc9dSAnoob Joseph /* Extra 32B saved for future considerations */ 440ec54bc9dSAnoob Joseph lb_mlen += 4 * sizeof(uint64_t); 441ec54bc9dSAnoob Joseph 442ec54bc9dSAnoob Joseph /* Check max requirement for meta buffer */ 443ec54bc9dSAnoob Joseph max_mlen = RTE_MAX(lb_mlen, sg_mlen); 444fadc1ea1SKanaka Durga Kotamarthy } else { 445fadc1ea1SKanaka Durga Kotamarthy 446fadc1ea1SKanaka Durga Kotamarthy /* Asymmetric device */ 447fadc1ea1SKanaka Durga Kotamarthy 448fadc1ea1SKanaka Durga Kotamarthy /* Get meta len for asymmetric operations */ 449fadc1ea1SKanaka Durga Kotamarthy max_mlen = cpt_pmd_ops_helper_asym_get_mlen(); 450fadc1ea1SKanaka Durga Kotamarthy } 451ec54bc9dSAnoob Joseph 452ec54bc9dSAnoob Joseph /* Allocate mempool */ 453ec54bc9dSAnoob Joseph 454ec54bc9dSAnoob Joseph snprintf(mempool_name, RTE_MEMPOOL_NAMESIZE, "otx_cpt_mb_%u:%u", 455ec54bc9dSAnoob Joseph dev->data->dev_id, qp_id); 456ec54bc9dSAnoob Joseph 45726f556b3SAnoob Joseph mb_pool_sz = RTE_MAX(nb_elements, (METABUF_POOL_CACHE_SIZE * rte_lcore_count())); 45826f556b3SAnoob Joseph 45926f556b3SAnoob Joseph pool = rte_mempool_create_empty(mempool_name, mb_pool_sz, max_mlen, 460ec54bc9dSAnoob Joseph METABUF_POOL_CACHE_SIZE, 0, 461ec54bc9dSAnoob Joseph rte_socket_id(), 0); 462ec54bc9dSAnoob Joseph 463ec54bc9dSAnoob Joseph if (pool == NULL) { 464ec54bc9dSAnoob Joseph CPT_LOG_ERR("Could not create mempool for metabuf"); 465ec54bc9dSAnoob Joseph return rte_errno; 466ec54bc9dSAnoob Joseph } 467ec54bc9dSAnoob Joseph 468ec54bc9dSAnoob Joseph ret = rte_mempool_set_ops_byname(pool, RTE_MBUF_DEFAULT_MEMPOOL_OPS, 469ec54bc9dSAnoob Joseph NULL); 470ec54bc9dSAnoob Joseph if (ret) { 471ec54bc9dSAnoob Joseph CPT_LOG_ERR("Could not set mempool ops"); 472ec54bc9dSAnoob Joseph goto mempool_free; 473ec54bc9dSAnoob Joseph } 474ec54bc9dSAnoob Joseph 475ec54bc9dSAnoob Joseph ret = rte_mempool_populate_default(pool); 476ec54bc9dSAnoob Joseph if (ret <= 0) { 477ec54bc9dSAnoob Joseph CPT_LOG_ERR("Could not populate metabuf pool"); 478ec54bc9dSAnoob Joseph goto mempool_free; 479ec54bc9dSAnoob Joseph } 480ec54bc9dSAnoob Joseph 481ec54bc9dSAnoob Joseph meta_info = &instance->meta_info; 482ec54bc9dSAnoob Joseph 483ec54bc9dSAnoob Joseph meta_info->pool = pool; 484ec54bc9dSAnoob Joseph meta_info->lb_mlen = lb_mlen; 485ec54bc9dSAnoob Joseph meta_info->sg_mlen = sg_mlen; 486ec54bc9dSAnoob Joseph 487ec54bc9dSAnoob Joseph return 0; 488ec54bc9dSAnoob Joseph 489ec54bc9dSAnoob Joseph mempool_free: 490ec54bc9dSAnoob Joseph rte_mempool_free(pool); 491ec54bc9dSAnoob Joseph return ret; 492ec54bc9dSAnoob Joseph } 493ec54bc9dSAnoob Joseph 494ec54bc9dSAnoob Joseph static void 495ec54bc9dSAnoob Joseph otx_cpt_metabuf_mempool_destroy(struct cpt_instance *instance) 496ec54bc9dSAnoob Joseph { 497ec54bc9dSAnoob Joseph struct cpt_qp_meta_info *meta_info = &instance->meta_info; 498ec54bc9dSAnoob Joseph 499ec54bc9dSAnoob Joseph rte_mempool_free(meta_info->pool); 500ec54bc9dSAnoob Joseph 501ec54bc9dSAnoob Joseph meta_info->pool = NULL; 502ec54bc9dSAnoob Joseph meta_info->lb_mlen = 0; 503ec54bc9dSAnoob Joseph meta_info->sg_mlen = 0; 504ec54bc9dSAnoob Joseph } 505ec54bc9dSAnoob Joseph 5060906b99fSMurthy NSSR int 507ec54bc9dSAnoob Joseph otx_cpt_get_resource(const struct rte_cryptodev *dev, uint8_t group, 508ec54bc9dSAnoob Joseph struct cpt_instance **instance, uint16_t qp_id) 5090961348fSMurthy NSSR { 5100961348fSMurthy NSSR int ret = -ENOENT, len, qlen, i; 5110961348fSMurthy NSSR int chunk_len, chunks, chunk_size; 512ec54bc9dSAnoob Joseph struct cpt_vf *cptvf = dev->data->dev_private; 5130961348fSMurthy NSSR struct cpt_instance *cpt_instance; 5140961348fSMurthy NSSR struct command_chunk *chunk_head = NULL, *chunk_prev = NULL; 5150961348fSMurthy NSSR struct command_chunk *chunk = NULL; 5160961348fSMurthy NSSR uint8_t *mem; 5170961348fSMurthy NSSR const struct rte_memzone *rz; 5180961348fSMurthy NSSR uint64_t dma_addr = 0, alloc_len, used_len; 5190961348fSMurthy NSSR uint64_t *next_ptr; 5200961348fSMurthy NSSR uint64_t pg_sz = sysconf(_SC_PAGESIZE); 5210961348fSMurthy NSSR 5220961348fSMurthy NSSR CPT_LOG_DP_DEBUG("Initializing cpt resource %s", cptvf->dev_name); 5230961348fSMurthy NSSR 5240961348fSMurthy NSSR cpt_instance = &cptvf->instance; 5250961348fSMurthy NSSR 5260961348fSMurthy NSSR memset(&cptvf->cqueue, 0, sizeof(cptvf->cqueue)); 5270961348fSMurthy NSSR memset(&cptvf->pqueue, 0, sizeof(cptvf->pqueue)); 5280961348fSMurthy NSSR 5290961348fSMurthy NSSR /* Chunks are of fixed size buffers */ 530*c9902a15SDavid George 531*c9902a15SDavid George qlen = DEFAULT_CMD_QLEN; 5320961348fSMurthy NSSR chunks = DEFAULT_CMD_QCHUNKS; 5330961348fSMurthy NSSR chunk_len = DEFAULT_CMD_QCHUNK_SIZE; 5340961348fSMurthy NSSR /* Chunk size includes 8 bytes of next chunk ptr */ 5350961348fSMurthy NSSR chunk_size = chunk_len * CPT_INST_SIZE + CPT_NEXT_CHUNK_PTR_SIZE; 5360961348fSMurthy NSSR 5370961348fSMurthy NSSR /* For command chunk structures */ 5380961348fSMurthy NSSR len = chunks * RTE_ALIGN(sizeof(struct command_chunk), 8); 5390961348fSMurthy NSSR 5400961348fSMurthy NSSR /* For pending queue */ 541*c9902a15SDavid George len += qlen * RTE_ALIGN(sizeof(cptvf->pqueue.rid_queue[0]), 8); 5420961348fSMurthy NSSR 5430961348fSMurthy NSSR /* So that instruction queues start as pg size aligned */ 5440961348fSMurthy NSSR len = RTE_ALIGN(len, pg_sz); 5450961348fSMurthy NSSR 5460961348fSMurthy NSSR /* For Instruction queues */ 5470961348fSMurthy NSSR len += chunks * RTE_ALIGN(chunk_size, 128); 5480961348fSMurthy NSSR 5490961348fSMurthy NSSR /* Wastage after instruction queues */ 5500961348fSMurthy NSSR len = RTE_ALIGN(len, pg_sz); 5510961348fSMurthy NSSR 5520961348fSMurthy NSSR rz = rte_memzone_reserve_aligned(cptvf->dev_name, len, cptvf->node, 5530961348fSMurthy NSSR RTE_MEMZONE_SIZE_HINT_ONLY | 5540961348fSMurthy NSSR RTE_MEMZONE_256MB, 5550961348fSMurthy NSSR RTE_CACHE_LINE_SIZE); 5560961348fSMurthy NSSR if (!rz) { 5570961348fSMurthy NSSR ret = rte_errno; 558ec54bc9dSAnoob Joseph goto exit; 5590961348fSMurthy NSSR } 5600961348fSMurthy NSSR 5610961348fSMurthy NSSR mem = rz->addr; 56272f82c43SThomas Monjalon dma_addr = rz->iova; 5630961348fSMurthy NSSR alloc_len = len; 5640961348fSMurthy NSSR 5650961348fSMurthy NSSR memset(mem, 0, len); 5660961348fSMurthy NSSR 5670961348fSMurthy NSSR cpt_instance->rsvd = (uintptr_t)rz; 5680961348fSMurthy NSSR 569ec54bc9dSAnoob Joseph ret = otx_cpt_metabuf_mempool_create(dev, cpt_instance, qp_id, qlen); 570ec54bc9dSAnoob Joseph if (ret) { 571ec54bc9dSAnoob Joseph CPT_LOG_ERR("Could not create mempool for metabuf"); 572ec54bc9dSAnoob Joseph goto memzone_free; 573ec54bc9dSAnoob Joseph } 574ec54bc9dSAnoob Joseph 5750961348fSMurthy NSSR /* Pending queue setup */ 576*c9902a15SDavid George cptvf->pqueue.rid_queue = (void **)mem; 5770961348fSMurthy NSSR 578*c9902a15SDavid George mem += qlen * RTE_ALIGN(sizeof(cptvf->pqueue.rid_queue[0]), 8); 579*c9902a15SDavid George len -= qlen * RTE_ALIGN(sizeof(cptvf->pqueue.rid_queue[0]), 8); 580*c9902a15SDavid George dma_addr += qlen * RTE_ALIGN(sizeof(cptvf->pqueue.rid_queue[0]), 8); 5810961348fSMurthy NSSR 5820961348fSMurthy NSSR /* Alignment wastage */ 5830961348fSMurthy NSSR used_len = alloc_len - len; 5840961348fSMurthy NSSR mem += RTE_ALIGN(used_len, pg_sz) - used_len; 5850961348fSMurthy NSSR len -= RTE_ALIGN(used_len, pg_sz) - used_len; 5860961348fSMurthy NSSR dma_addr += RTE_ALIGN(used_len, pg_sz) - used_len; 5870961348fSMurthy NSSR 5880961348fSMurthy NSSR /* Init instruction queues */ 5890961348fSMurthy NSSR chunk_head = &cptvf->cqueue.chead[0]; 5900961348fSMurthy NSSR i = qlen; 5910961348fSMurthy NSSR 5920961348fSMurthy NSSR chunk_prev = NULL; 5930961348fSMurthy NSSR for (i = 0; i < DEFAULT_CMD_QCHUNKS; i++) { 5940961348fSMurthy NSSR int csize; 5950961348fSMurthy NSSR 5960961348fSMurthy NSSR chunk = &cptvf->cqueue.chead[i]; 5970961348fSMurthy NSSR chunk->head = mem; 5980961348fSMurthy NSSR chunk->dma_addr = dma_addr; 5990961348fSMurthy NSSR 6000961348fSMurthy NSSR csize = RTE_ALIGN(chunk_size, 128); 6010961348fSMurthy NSSR mem += csize; 6020961348fSMurthy NSSR dma_addr += csize; 6030961348fSMurthy NSSR len -= csize; 6040961348fSMurthy NSSR 6050961348fSMurthy NSSR if (chunk_prev) { 6060961348fSMurthy NSSR next_ptr = (uint64_t *)(chunk_prev->head + 6070961348fSMurthy NSSR chunk_size - 8); 6080961348fSMurthy NSSR *next_ptr = (uint64_t)chunk->dma_addr; 6090961348fSMurthy NSSR } 6100961348fSMurthy NSSR chunk_prev = chunk; 6110961348fSMurthy NSSR } 6120961348fSMurthy NSSR /* Circular loop */ 6130961348fSMurthy NSSR next_ptr = (uint64_t *)(chunk_prev->head + chunk_size - 8); 6140961348fSMurthy NSSR *next_ptr = (uint64_t)chunk_head->dma_addr; 6150961348fSMurthy NSSR 6160961348fSMurthy NSSR assert(!len); 6170961348fSMurthy NSSR 6180961348fSMurthy NSSR /* This is used for CPT(0)_PF_Q(0..15)_CTL.size config */ 6190961348fSMurthy NSSR cptvf->qsize = chunk_size / 8; 6200961348fSMurthy NSSR cptvf->cqueue.qhead = chunk_head->head; 6210961348fSMurthy NSSR cptvf->cqueue.idx = 0; 6220961348fSMurthy NSSR cptvf->cqueue.cchunk = 0; 6230961348fSMurthy NSSR 6240961348fSMurthy NSSR if (cpt_vq_init(cptvf, group)) { 6250961348fSMurthy NSSR CPT_LOG_ERR("Failed to initialize CPT VQ of device %s", 6260961348fSMurthy NSSR cptvf->dev_name); 6270961348fSMurthy NSSR ret = -EBUSY; 628ec54bc9dSAnoob Joseph goto mempool_destroy; 6290961348fSMurthy NSSR } 6300961348fSMurthy NSSR 6310961348fSMurthy NSSR *instance = cpt_instance; 6320961348fSMurthy NSSR 6330961348fSMurthy NSSR CPT_LOG_DP_DEBUG("Crypto device (%s) initialized", cptvf->dev_name); 6340961348fSMurthy NSSR 6350961348fSMurthy NSSR return 0; 636ec54bc9dSAnoob Joseph 637ec54bc9dSAnoob Joseph mempool_destroy: 638ec54bc9dSAnoob Joseph otx_cpt_metabuf_mempool_destroy(cpt_instance); 639ec54bc9dSAnoob Joseph memzone_free: 6400961348fSMurthy NSSR rte_memzone_free(rz); 641ec54bc9dSAnoob Joseph exit: 6420961348fSMurthy NSSR *instance = NULL; 6430961348fSMurthy NSSR return ret; 6440961348fSMurthy NSSR } 6450961348fSMurthy NSSR 6460961348fSMurthy NSSR int 6470961348fSMurthy NSSR otx_cpt_put_resource(struct cpt_instance *instance) 6480961348fSMurthy NSSR { 6490961348fSMurthy NSSR struct cpt_vf *cptvf = (struct cpt_vf *)instance; 6500961348fSMurthy NSSR struct rte_memzone *rz; 6510961348fSMurthy NSSR 6520961348fSMurthy NSSR if (!cptvf) { 6530961348fSMurthy NSSR CPT_LOG_ERR("Invalid CPTVF handle"); 6540961348fSMurthy NSSR return -EINVAL; 6550961348fSMurthy NSSR } 6560961348fSMurthy NSSR 6570961348fSMurthy NSSR CPT_LOG_DP_DEBUG("Releasing cpt device %s", cptvf->dev_name); 6580961348fSMurthy NSSR 659ec54bc9dSAnoob Joseph otx_cpt_metabuf_mempool_destroy(instance); 660ec54bc9dSAnoob Joseph 6610961348fSMurthy NSSR rz = (struct rte_memzone *)instance->rsvd; 6620961348fSMurthy NSSR rte_memzone_free(rz); 6630961348fSMurthy NSSR return 0; 6640961348fSMurthy NSSR } 6650961348fSMurthy NSSR 6660961348fSMurthy NSSR int 6670906b99fSMurthy NSSR otx_cpt_start_device(void *dev) 6680906b99fSMurthy NSSR { 6690906b99fSMurthy NSSR int rc; 6700906b99fSMurthy NSSR struct cpt_vf *cptvf = (struct cpt_vf *)dev; 6710906b99fSMurthy NSSR 6720906b99fSMurthy NSSR rc = otx_cpt_send_vf_up(cptvf); 6730906b99fSMurthy NSSR if (rc) { 6740906b99fSMurthy NSSR CPT_LOG_ERR("Failed to mark CPT VF device %s UP, rc = %d", 6750906b99fSMurthy NSSR cptvf->dev_name, rc); 6760906b99fSMurthy NSSR return -EFAULT; 6770906b99fSMurthy NSSR } 6780906b99fSMurthy NSSR 6790906b99fSMurthy NSSR return 0; 6800906b99fSMurthy NSSR } 6810906b99fSMurthy NSSR 6820906b99fSMurthy NSSR void 6830906b99fSMurthy NSSR otx_cpt_stop_device(void *dev) 6840906b99fSMurthy NSSR { 6850906b99fSMurthy NSSR int rc; 6860906b99fSMurthy NSSR uint32_t pending, retries = 5; 6870906b99fSMurthy NSSR struct cpt_vf *cptvf = (struct cpt_vf *)dev; 6880906b99fSMurthy NSSR 6890906b99fSMurthy NSSR /* Wait for pending entries to complete */ 6900906b99fSMurthy NSSR pending = otx_cpt_read_vq_doorbell(cptvf); 6910906b99fSMurthy NSSR while (pending) { 6920906b99fSMurthy NSSR CPT_LOG_DP_DEBUG("%s: Waiting for pending %u cmds to complete", 6930906b99fSMurthy NSSR cptvf->dev_name, pending); 6940906b99fSMurthy NSSR sleep(1); 6950906b99fSMurthy NSSR pending = otx_cpt_read_vq_doorbell(cptvf); 6960906b99fSMurthy NSSR retries--; 6970906b99fSMurthy NSSR if (!retries) 6980906b99fSMurthy NSSR break; 6990906b99fSMurthy NSSR } 7000906b99fSMurthy NSSR 7010906b99fSMurthy NSSR if (!retries && pending) { 7020906b99fSMurthy NSSR CPT_LOG_ERR("%s: Timeout waiting for commands(%u)", 7030906b99fSMurthy NSSR cptvf->dev_name, pending); 7040906b99fSMurthy NSSR return; 7050906b99fSMurthy NSSR } 7060906b99fSMurthy NSSR 7070906b99fSMurthy NSSR rc = otx_cpt_send_vf_down(cptvf); 7080906b99fSMurthy NSSR if (rc) { 7090906b99fSMurthy NSSR CPT_LOG_ERR("Failed to bring down vf %s, rc %d", 7100906b99fSMurthy NSSR cptvf->dev_name, rc); 7110906b99fSMurthy NSSR return; 7120906b99fSMurthy NSSR } 7130906b99fSMurthy NSSR } 714