X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fcommon%2Focteontx2%2Fotx2_dev.c;h=ce4f0e7ca9830f93ba11e9e507415e9a4b62ffae;hb=a4975cd20dca0aa7f96cd47b79144509e7599c66;hp=0fc799e4ab91d1a7bb3b3495faff3206df78f3a1;hpb=c261680cdb82996d30261c1eb4eb762c23ee842e;p=dpdk.git diff --git a/drivers/common/octeontx2/otx2_dev.c b/drivers/common/octeontx2/otx2_dev.c index 0fc799e4ab..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 @@ -900,6 +928,7 @@ 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; @@ -924,15 +953,18 @@ otx2_dev_priv_init(struct rte_pci_device *pci_dev, void *otx2_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; @@ -967,13 +999,15 @@ otx2_dev_priv_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; }