From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D5320A00C2; Wed, 2 Nov 2022 00:05:28 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 302FF41156; Wed, 2 Nov 2022 00:05:16 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id 1342240223 for ; Wed, 2 Nov 2022 00:05:10 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1667343911; x=1698879911; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=L/EpcjsXwF39f17Jzqw+4cdbCqn60Wv+TGHAwVts7v8=; b=lhh4lXe7PlN447rtiDVw56A8fluG2GCyoQvsdfsDooI9p6FYN2774P0F gI6W1M/dRW+75yDnL10Lct9k2H38I7K8DEqfzkb/LVa1HIufLr+dKHfFx xzRwDmi+IRFloR/DyRGllWU3AbY7/UqWOEwZe7Zu+zs8yW5zaYofqd0fh r64+Ic38NX7Sooa4CVIdl12bOWaGiMDm5RU7H78QDbwg9mS3OkYOiS84D 6P68e2d4QOSRu0x+ikC+4CmXgnefuK7++ww7QGByP6tG784S3X30mSUFo gm+puunuAqr1TJ8He1GTAjzdYYbjntP/1hamztqHVocv8x78zk9t0iSQg A==; X-IronPort-AV: E=McAfee;i="6500,9779,10518"; a="373484038" X-IronPort-AV: E=Sophos;i="5.95,232,1661842800"; d="scan'208";a="373484038" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Nov 2022 16:05:10 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10518"; a="585175100" X-IronPort-AV: E=Sophos;i="5.95,232,1661842800"; d="scan'208";a="585175100" Received: from unknown (HELO icx-npg-scs1-cp1.localdomain) ([10.233.180.245]) by orsmga003.jf.intel.com with ESMTP; 01 Nov 2022 16:05:09 -0700 From: Nicolas Chautru To: dev@dpdk.org, gakhil@marvell.com, maxime.coquelin@redhat.com, hernan.vargas@intel.com Cc: Nicolas Chautru Subject: [PATCH v1 3/6] baseband/acc: fix to acc200 access corner case Date: Tue, 1 Nov 2022 16:04:56 -0700 Message-Id: <20221101230459.50891-4-nicolas.chautru@intel.com> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20221101230459.50891-1-nicolas.chautru@intel.com> References: <20221101230459.50891-1-nicolas.chautru@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org To enforce safe access to the ACC200 device, the PMD requires to explicitly check that the device is in configured and enabled state prior to accessing queue resources. This is done by checking the Qmgr ingress queue status. Fixes: 40e3adbdd3 ("baseband/acc200: add queue configuration") Signed-off-by: Nicolas Chautru --- drivers/baseband/acc/rte_acc200_pmd.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/baseband/acc/rte_acc200_pmd.c b/drivers/baseband/acc/rte_acc200_pmd.c index 76a5986448..10511d8b56 100644 --- a/drivers/baseband/acc/rte_acc200_pmd.c +++ b/drivers/baseband/acc/rte_acc200_pmd.c @@ -172,6 +172,21 @@ updateQtop(uint8_t acc, uint8_t qg, struct rte_acc_conf *acc_conf, struct acc_de } } +/* Check device Qmgr is enabled for protection */ +static inline bool +acc200_check_device_enable(struct rte_bbdev *dev) +{ + uint32_t reg_aq, qg; + struct acc_device *d = dev->data->dev_private; + + for (qg = 0; qg < ACC200_NUM_QGRPS; qg++) { + reg_aq = acc_reg_read(d, queue_offset(d->pf_device, 0, qg, 0)); + if (reg_aq & ACC_QUEUE_ENABLE) + return true; + } + return false; +} + /* Fetch configuration enabled for the PF/VF using MMIO Read (slow). */ static inline void fetch_acc200_config(struct rte_bbdev *dev) @@ -190,6 +205,12 @@ fetch_acc200_config(struct rte_bbdev *dev) if (d->configured) return; + if (!acc200_check_device_enable(dev)) { + rte_bbdev_log(NOTICE, "%s has no queue enabled and can't be used.", + dev->data->name); + return; + } + /* Choose correct registry addresses for the device type. */ if (d->pf_device) reg_addr = &pf_reg_addr; @@ -454,6 +475,12 @@ acc200_setup_queues(struct rte_bbdev *dev, uint16_t num_queues, int socket_id) return -ENODEV; } + if (!acc200_check_device_enable(dev)) { + rte_bbdev_log(NOTICE, "%s has no queue enabled and can't be used.", + dev->data->name); + return -ENODEV; + } + alloc_sw_rings_min_mem(dev, d, num_queues, socket_id); /* If minimal memory space approach failed, then allocate -- 2.37.1