X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fcommon%2Focteontx2%2Fotx2_dev.c;h=ce4f0e7ca9830f93ba11e9e507415e9a4b62ffae;hb=ac6deebb588aea78791d4985a5b85df1879dbc69;hp=3b51fa93ad298230209fdf65c1753bae5dce0b43;hpb=6670c8cbfe2c768a9ec74218be7f0705e5771547;p=dpdk.git diff --git a/drivers/common/octeontx2/otx2_dev.c b/drivers/common/octeontx2/otx2_dev.c index 3b51fa93ad..ce4f0e7ca9 100644 --- a/drivers/common/octeontx2/otx2_dev.c +++ b/drivers/common/octeontx2/otx2_dev.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "otx2_dev.h" #include "otx2_mbox.h" @@ -34,10 +35,11 @@ mbox_mem_map(off_t off, size_t size) if (mem_fd < 0) goto error; - va = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, off); + va = rte_mem_map(NULL, size, RTE_PROT_READ | RTE_PROT_WRITE, + RTE_MAP_SHARED, mem_fd, off); close(mem_fd); - if (va == MAP_FAILED) + if (va == NULL) otx2_err("Failed to mmap sz=0x%zx, fd=%d, off=%jd", size, mem_fd, (intmax_t)off); error: @@ -48,7 +50,7 @@ static void mbox_mem_unmap(void *va, size_t size) { if (va) - munmap(va, size); + rte_mem_unmap(va, size); } static int @@ -161,6 +163,35 @@ af_pf_wait_msg(struct otx2_dev *dev, uint16_t vf, int num_msg) rsp->rc = msg->rc; rsp->pcifunc = msg->pcifunc; + /* Whenever a PF comes up, AF sends the link status to it but + * when VF comes up no such event is sent to respective VF. + * Using MBOX_MSG_NIX_LF_START_RX response from AF for the + * purpose and send the link status of PF to VF. + */ + if (msg->id == MBOX_MSG_NIX_LF_START_RX) { + /* Send link status to VF */ + struct cgx_link_user_info linfo; + struct mbox_msghdr *vf_msg; + size_t sz; + + /* Get the link status */ + if (dev->ops && dev->ops->link_status_get) + dev->ops->link_status_get(dev, &linfo); + + sz = RTE_ALIGN(otx2_mbox_id2size( + MBOX_MSG_CGX_LINK_EVENT), MBOX_MSG_ALIGN); + /* Prepare the message to be sent */ + vf_msg = otx2_mbox_alloc_msg(&dev->mbox_vfpf_up, vf, + sz); + otx2_mbox_req_init(MBOX_MSG_CGX_LINK_EVENT, vf_msg); + memcpy((uint8_t *)vf_msg + sizeof(struct mbox_msghdr), + &linfo, sizeof(struct cgx_link_user_info)); + + vf_msg->rc = msg->rc; + vf_msg->pcifunc = msg->pcifunc; + /* Send to VF */ + otx2_mbox_msg_send(&dev->mbox_vfpf_up, vf); + } offset = mbox->rx_start + msg->next_msgoff; } rte_spinlock_unlock(&mdev->mbox_lock); @@ -577,17 +608,16 @@ otx2_pf_vf_mbox_irq(void *param) intr = otx2_read64(dev->bar2 + RVU_VF_INT); if (intr == 0) - return; + otx2_base_dbg("Proceeding to check mbox UP messages if any"); otx2_write64(intr, dev->bar2 + RVU_VF_INT); otx2_base_dbg("Irq 0x%" PRIx64 "(pf:%d,vf:%d)", intr, dev->pf, dev->vf); - if (intr) { - /* First process all configuration messages */ - otx2_process_msgs(dev, dev->mbox); - /* Process Uplink messages */ - otx2_process_msgs_up(dev, &dev->mbox_up); - } + /* First process all configuration messages */ + otx2_process_msgs(dev, dev->mbox); + + /* Process Uplink messages */ + otx2_process_msgs_up(dev, &dev->mbox_up); } static void @@ -598,18 +628,16 @@ otx2_af_pf_mbox_irq(void *param) intr = otx2_read64(dev->bar2 + RVU_PF_INT); if (intr == 0) - return; + otx2_base_dbg("Proceeding to check mbox UP messages if any"); otx2_write64(intr, dev->bar2 + RVU_PF_INT); - otx2_base_dbg("Irq 0x%" PRIx64 "(pf:%d,vf:%d)", intr, dev->pf, dev->vf); - if (intr) { - /* First process all configuration messages */ - otx2_process_msgs(dev, dev->mbox); - /* Process Uplink messages */ - otx2_process_msgs_up(dev, &dev->mbox_up); - } + /* First process all configuration messages */ + otx2_process_msgs(dev, dev->mbox); + + /* Process Uplink messages */ + otx2_process_msgs_up(dev, &dev->mbox_up); } static int @@ -791,9 +819,8 @@ otx2_pf_vf_flr_irq(void *param) if (!(intr & (1ULL << vf))) continue; - vf = 64 * i + vf; otx2_base_dbg("FLR: i :%d intr: 0x%" PRIx64 ", vf-%d", - i, intr, vf); + i, intr, (64 * i + vf)); /* Clear interrupt */ otx2_write64(BIT_ULL(vf), bar2 + RVU_PF_VFFLR_INTX(i)); /* Disable the interrupt */ @@ -875,20 +902,9 @@ otx2_dev_active_vfs(void *otx2_dev) return count; } -static void -otx2_update_pass_hwcap(struct rte_pci_device *pci_dev, struct otx2_dev *dev) -{ - RTE_SET_USED(pci_dev); - - /* Update this logic when we have A1 */ - dev->hwcap |= OTX2_HWCAP_F_A0; -} - static void otx2_update_vf_hwcap(struct rte_pci_device *pci_dev, struct otx2_dev *dev) { - dev->hwcap = 0; - switch (pci_dev->id.device_id) { case PCI_DEVID_OCTEONTX2_RVU_PF: break; @@ -897,6 +913,7 @@ otx2_update_vf_hwcap(struct rte_pci_device *pci_dev, struct otx2_dev *dev) case PCI_DEVID_OCTEONTX2_RVU_CPT_VF: case PCI_DEVID_OCTEONTX2_RVU_AF_VF: case PCI_DEVID_OCTEONTX2_RVU_VF: + case PCI_DEVID_OCTEONTX2_RVU_SDP_VF: dev->hwcap |= OTX2_HWCAP_F_VF; break; } @@ -907,10 +924,11 @@ otx2_update_vf_hwcap(struct rte_pci_device *pci_dev, struct otx2_dev *dev) * Initialize the otx2 device */ int -otx2_dev_init(struct rte_pci_device *pci_dev, void *otx2_dev) +otx2_dev_priv_init(struct rte_pci_device *pci_dev, void *otx2_dev) { int up_direction = MBOX_DIR_PFAF_UP; int rc, direction = MBOX_DIR_PFAF; + uint64_t intr_offset = RVU_PF_INT; struct otx2_dev *dev = otx2_dev; uintptr_t bar2, bar4; uint64_t bar4_addr; @@ -931,20 +949,22 @@ otx2_dev_init(struct rte_pci_device *pci_dev, void *otx2_dev) dev->bar4 = bar4; otx2_update_vf_hwcap(pci_dev, dev); - otx2_update_pass_hwcap(pci_dev, dev); if (otx2_dev_is_vf(dev)) { direction = MBOX_DIR_VFPF; up_direction = MBOX_DIR_VFPF_UP; + intr_offset = RVU_VF_INT; } /* Initialize the local mbox */ - rc = otx2_mbox_init(&dev->mbox_local, bar4, bar2, direction, 1); + rc = otx2_mbox_init(&dev->mbox_local, bar4, bar2, direction, 1, + intr_offset); if (rc) goto error; dev->mbox = &dev->mbox_local; - rc = otx2_mbox_init(&dev->mbox_up, bar4, bar2, up_direction, 1); + rc = otx2_mbox_init(&dev->mbox_up, bar4, bar2, up_direction, 1, + intr_offset); if (rc) goto error; @@ -979,13 +999,15 @@ otx2_dev_init(struct rte_pci_device *pci_dev, void *otx2_dev) } /* Init mbox object */ rc = otx2_mbox_init(&dev->mbox_vfpf, (uintptr_t)hwbase, - bar2, MBOX_DIR_PFVF, pci_dev->max_vfs); + bar2, MBOX_DIR_PFVF, pci_dev->max_vfs, + intr_offset); if (rc) goto iounmap; /* PF -> VF UP messages */ rc = otx2_mbox_init(&dev->mbox_vfpf_up, (uintptr_t)hwbase, - bar2, MBOX_DIR_PFVF_UP, pci_dev->max_vfs); + bar2, MBOX_DIR_PFVF_UP, pci_dev->max_vfs, + intr_offset); if (rc) goto mbox_fini; }