From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 92D6CA04DD; Wed, 28 Oct 2020 13:45:57 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6AECDCA65; Wed, 28 Oct 2020 13:45:56 +0100 (CET) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id E3BA7C9C0 for ; Wed, 28 Oct 2020 13:45:53 +0100 (CET) IronPort-SDR: QqLcBIicYCraxa1pJfNQB/+Xwy1VzM54Wxxufycg0kIWJ2Lef69tVAWUWAtqfl6bXMxCBy8qMT WCdAgbUtCzuA== X-IronPort-AV: E=McAfee;i="6000,8403,9787"; a="168347150" X-IronPort-AV: E=Sophos;i="5.77,426,1596524400"; d="scan'208";a="168347150" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Oct 2020 05:45:51 -0700 IronPort-SDR: OXcEOHP3VEqHUjvPRgIWcW7jPrOxodKOleigyPpT2xvJvDiIqgg97NhtY4HVAz3KlDC4zJtFko W5vNoChWAAbg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,426,1596524400"; d="scan'208";a="355884589" Received: from silpixa00399126.ir.intel.com ([10.237.222.4]) by fmsmga002.fm.intel.com with ESMTP; 28 Oct 2020 05:45:50 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: kevin.laatz@intel.com, Bruce Richardson Date: Wed, 28 Oct 2020 12:45:34 +0000 Message-Id: <20201028124534.913207-1-bruce.richardson@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH] raw/ioat: fix work-queue config size X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" According to latest DSA spec[1], the work-queue config register size should be based off a value read from the WQ capabilities register. Update driver to read this value and base the start of each WQ config off that value. Fixes: ff06fa2cf3ba ("raw/ioat: probe idxd PCI") Signed-off-by: Bruce Richardson [1] https://software.intel.com/content/www/us/en/develop/download/intel-data-streaming-accelerator-preliminary-architecture-specification.html --- drivers/raw/ioat/idxd_pci.c | 19 +++++++++++++------ drivers/raw/ioat/ioat_private.h | 4 +++- drivers/raw/ioat/ioat_spec.h | 5 +---- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/drivers/raw/ioat/idxd_pci.c b/drivers/raw/ioat/idxd_pci.c index d4d87b199d..99ecfbbb48 100644 --- a/drivers/raw/ioat/idxd_pci.c +++ b/drivers/raw/ioat/idxd_pci.c @@ -44,10 +44,16 @@ idxd_pci_dev_command(struct idxd_rawdev *idxd, enum rte_idxd_cmds command) return err_code & CMDSTATUS_ERR_MASK; } +static uint32_t * +idxd_get_wq_cfg(struct idxd_pci_common *pci, uint8_t wq_idx) +{ + return RTE_PTR_ADD(pci->wq_regs_base, wq_idx << (5 + pci->wq_cfg_sz)); +} + static int idxd_is_wq_enabled(struct idxd_rawdev *idxd) { - uint32_t state = idxd->u.pci->wq_regs[idxd->qid].wqcfg[WQ_STATE_IDX]; + uint32_t state = idxd_get_wq_cfg(idxd->u.pci, idxd->qid)[WQ_STATE_IDX]; return ((state >> WQ_STATE_SHIFT) & WQ_STATE_MASK) == 0x1; } @@ -137,8 +143,9 @@ init_pci_device(struct rte_pci_device *dev, struct idxd_rawdev *idxd) grp_offset = (uint16_t)pci->regs->offsets[0]; pci->grp_regs = RTE_PTR_ADD(pci->regs, grp_offset * 0x100); wq_offset = (uint16_t)(pci->regs->offsets[0] >> 16); - pci->wq_regs = RTE_PTR_ADD(pci->regs, wq_offset * 0x100); + pci->wq_regs_base = RTE_PTR_ADD(pci->regs, wq_offset * 0x100); pci->portals = dev->mem_resource[2].addr; + pci->wq_cfg_sz = (pci->regs->wqcap >> 24) & 0x0F; /* sanity check device status */ if (pci->regs->gensts & GENSTS_DEV_STATE_MASK) { @@ -169,7 +176,7 @@ init_pci_device(struct rte_pci_device *dev, struct idxd_rawdev *idxd) pci->grp_regs[i].grpwqcfg[0] = 0; } for (i = 0; i < nb_wqs; i++) - pci->wq_regs[i].wqcfg[0] = 0; + idxd_get_wq_cfg(pci, i)[0] = 0; /* put each engine into a separate group to avoid reordering */ if (nb_groups > nb_engines) @@ -194,10 +201,10 @@ init_pci_device(struct rte_pci_device *dev, struct idxd_rawdev *idxd) i, i % nb_groups); pci->grp_regs[i % nb_groups].grpwqcfg[0] |= (1ULL << i); /* now configure it, in terms of size, max batch, mode */ - pci->wq_regs[i].wqcfg[WQ_SIZE_IDX] = wq_size; - pci->wq_regs[i].wqcfg[WQ_MODE_IDX] = (1 << WQ_PRIORITY_SHIFT) | + idxd_get_wq_cfg(pci, i)[WQ_SIZE_IDX] = wq_size; + idxd_get_wq_cfg(pci, i)[WQ_MODE_IDX] = (1 << WQ_PRIORITY_SHIFT) | WQ_MODE_DEDICATED; - pci->wq_regs[i].wqcfg[WQ_SIZES_IDX] = lg2_max_copy_size | + idxd_get_wq_cfg(pci, i)[WQ_SIZES_IDX] = lg2_max_copy_size | (lg2_max_batch << WQ_BATCH_SZ_SHIFT); } diff --git a/drivers/raw/ioat/ioat_private.h b/drivers/raw/ioat/ioat_private.h index a74bc0422f..6c423811ec 100644 --- a/drivers/raw/ioat/ioat_private.h +++ b/drivers/raw/ioat/ioat_private.h @@ -30,8 +30,10 @@ extern int ioat_pmd_logtype; struct idxd_pci_common { rte_spinlock_t lk; + + uint8_t wq_cfg_sz; volatile struct rte_idxd_bar0 *regs; - volatile struct rte_idxd_wqcfg *wq_regs; + volatile uint32_t *wq_regs_base; volatile struct rte_idxd_grpcfg *grp_regs; volatile void *portals; }; diff --git a/drivers/raw/ioat/ioat_spec.h b/drivers/raw/ioat/ioat_spec.h index 1aa768b9ae..6aa467e4cb 100644 --- a/drivers/raw/ioat/ioat_spec.h +++ b/drivers/raw/ioat/ioat_spec.h @@ -302,10 +302,7 @@ struct rte_idxd_bar0 { uint64_t __rte_aligned(0x20) swerror[4]; /* offset 0xC0 */ }; -struct rte_idxd_wqcfg { - uint32_t wqcfg[8] __rte_aligned(32); /* 32-byte register */ -}; - +/* workqueue config is provided by array of uint32_t. */ #define WQ_SIZE_IDX 0 /* size is in first 32-bit value */ #define WQ_THRESHOLD_IDX 1 /* WQ threshold second 32-bits */ #define WQ_MODE_IDX 2 /* WQ mode and other flags */ -- 2.25.1