|
Torsten Duwe |
3416f8 |
From 49c43538ce05115e3fe12752dc77aa1deed3b0d2 Mon Sep 17 00:00:00 2001
|
|
Torsten Duwe |
3416f8 |
From: Marco Chiappero <marco.chiappero@intel.com>
|
|
Torsten Duwe |
3416f8 |
Date: Wed, 17 Nov 2021 14:30:49 +0000
|
|
Torsten Duwe |
3416f8 |
Subject: [PATCH] crypto: qat - abstract PFVF send function
|
|
Torsten Duwe |
3416f8 |
Git-commit: 49c43538ce05115e3fe12752dc77aa1deed3b0d2
|
|
Torsten Duwe |
3416f8 |
Patch-mainline: v5.17-rc1
|
|
Torsten Duwe |
3416f8 |
References: jsc#PED-1073
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
Make the PFVF send function device specific.
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
This is in preparation for the introduction of PFVF support in the
|
|
Torsten Duwe |
3416f8 |
qat_4xxx driver since the send logic differs between QAT GEN2 and
|
|
Torsten Duwe |
3416f8 |
QAT GEN4 devices.
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
|
|
Torsten Duwe |
3416f8 |
Co-developed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
|
|
Torsten Duwe |
3416f8 |
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
|
|
Torsten Duwe |
3416f8 |
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
|
Torsten Duwe |
3416f8 |
Signed-off-by: Torsten Duwe <duwe@suse.de>
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
---
|
|
Torsten Duwe |
3416f8 |
.../crypto/qat/qat_common/adf_accel_devices.h | 1 +
|
|
Torsten Duwe |
3416f8 |
drivers/crypto/qat/qat_common/adf_gen2_pfvf.c | 97 +++++++++++++++++++
|
|
Torsten Duwe |
3416f8 |
drivers/crypto/qat/qat_common/adf_pf2vf_msg.c | 92 +-----------------
|
|
Torsten Duwe |
3416f8 |
drivers/crypto/qat/qat_common/adf_pf2vf_msg.h | 3 +-
|
|
Torsten Duwe |
3416f8 |
4 files changed, 102 insertions(+), 91 deletions(-)
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
diff --git a/drivers/crypto/qat/qat_common/adf_accel_devices.h b/drivers/crypto/qat/qat_common/adf_accel_devices.h
|
|
Torsten Duwe |
3416f8 |
index d9b2cc935b616..8938149590833 100644
|
|
Torsten Duwe |
3416f8 |
--- a/drivers/crypto/qat/qat_common/adf_accel_devices.h
|
|
Torsten Duwe |
3416f8 |
+++ b/drivers/crypto/qat/qat_common/adf_accel_devices.h
|
|
Torsten Duwe |
3416f8 |
@@ -154,6 +154,7 @@ struct adf_pfvf_ops {
|
|
Torsten Duwe |
3416f8 |
u32 (*get_vf2pf_sources)(void __iomem *pmisc_addr);
|
|
Torsten Duwe |
3416f8 |
void (*enable_vf2pf_interrupts)(void __iomem *pmisc_addr, u32 vf_mask);
|
|
Torsten Duwe |
3416f8 |
void (*disable_vf2pf_interrupts)(void __iomem *pmisc_addr, u32 vf_mask);
|
|
Torsten Duwe |
3416f8 |
+ int (*send_msg)(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr);
|
|
Torsten Duwe |
3416f8 |
};
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
struct adf_hw_device_data {
|
|
Torsten Duwe |
3416f8 |
diff --git a/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c b/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c
|
|
Torsten Duwe |
3416f8 |
index 2f27146bb7c6e..5eba042d453b7 100644
|
|
Torsten Duwe |
3416f8 |
--- a/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c
|
|
Torsten Duwe |
3416f8 |
+++ b/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c
|
|
Torsten Duwe |
3416f8 |
@@ -1,9 +1,12 @@
|
|
Torsten Duwe |
3416f8 |
// SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
|
|
Torsten Duwe |
3416f8 |
/* Copyright(c) 2021 Intel Corporation */
|
|
Torsten Duwe |
3416f8 |
+#include <linux/delay.h>
|
|
Torsten Duwe |
3416f8 |
+#include <linux/mutex.h>
|
|
Torsten Duwe |
3416f8 |
#include <linux/types.h>
|
|
Torsten Duwe |
3416f8 |
#include "adf_accel_devices.h"
|
|
Torsten Duwe |
3416f8 |
#include "adf_common_drv.h"
|
|
Torsten Duwe |
3416f8 |
#include "adf_gen2_pfvf.h"
|
|
Torsten Duwe |
3416f8 |
+#include "adf_pf2vf_msg.h"
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
/* VF2PF interrupts */
|
|
Torsten Duwe |
3416f8 |
#define ADF_GEN2_ERR_REG_VF2PF(vf_src) (((vf_src) & 0x01FFFE00) >> 9)
|
|
Torsten Duwe |
3416f8 |
@@ -12,6 +15,12 @@
|
|
Torsten Duwe |
3416f8 |
#define ADF_GEN2_PF_PF2VF_OFFSET(i) (0x3A000 + 0x280 + ((i) * 0x04))
|
|
Torsten Duwe |
3416f8 |
#define ADF_GEN2_VF_PF2VF_OFFSET 0x200
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
+#define ADF_PFVF_MSG_ACK_DELAY 2
|
|
Torsten Duwe |
3416f8 |
+#define ADF_PFVF_MSG_ACK_MAX_RETRY 100
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+#define ADF_PFVF_MSG_RETRY_DELAY 5
|
|
Torsten Duwe |
3416f8 |
+#define ADF_PFVF_MSG_MAX_RETRIES 3
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
static u32 adf_gen2_pf_get_pfvf_offset(u32 i)
|
|
Torsten Duwe |
3416f8 |
{
|
|
Torsten Duwe |
3416f8 |
return ADF_GEN2_PF_PF2VF_OFFSET(i);
|
|
Torsten Duwe |
3416f8 |
@@ -61,6 +70,92 @@ static void adf_gen2_disable_vf2pf_interrupts(void __iomem *pmisc_addr,
|
|
Torsten Duwe |
3416f8 |
}
|
|
Torsten Duwe |
3416f8 |
}
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
+static int adf_gen2_pfvf_send(struct adf_accel_dev *accel_dev, u32 msg,
|
|
Torsten Duwe |
3416f8 |
+ u8 vf_nr)
|
|
Torsten Duwe |
3416f8 |
+{
|
|
Torsten Duwe |
3416f8 |
+ struct adf_accel_pci *pci_info = &accel_dev->accel_pci_dev;
|
|
Torsten Duwe |
3416f8 |
+ struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
|
Torsten Duwe |
3416f8 |
+ void __iomem *pmisc_bar_addr =
|
|
Torsten Duwe |
3416f8 |
+ pci_info->pci_bars[hw_data->get_misc_bar_id(hw_data)].virt_addr;
|
|
Torsten Duwe |
3416f8 |
+ u32 val, pfvf_offset, count = 0;
|
|
Torsten Duwe |
3416f8 |
+ u32 local_in_use_mask, local_in_use_pattern;
|
|
Torsten Duwe |
3416f8 |
+ u32 remote_in_use_mask, remote_in_use_pattern;
|
|
Torsten Duwe |
3416f8 |
+ struct mutex *lock; /* lock preventing concurrent acces of CSR */
|
|
Torsten Duwe |
3416f8 |
+ unsigned int retries = ADF_PFVF_MSG_MAX_RETRIES;
|
|
Torsten Duwe |
3416f8 |
+ u32 int_bit;
|
|
Torsten Duwe |
3416f8 |
+ int ret;
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+ if (accel_dev->is_vf) {
|
|
Torsten Duwe |
3416f8 |
+ pfvf_offset = GET_PFVF_OPS(accel_dev)->get_vf2pf_offset(0);
|
|
Torsten Duwe |
3416f8 |
+ lock = &accel_dev->vf.vf2pf_lock;
|
|
Torsten Duwe |
3416f8 |
+ local_in_use_mask = ADF_VF2PF_IN_USE_BY_VF_MASK;
|
|
Torsten Duwe |
3416f8 |
+ local_in_use_pattern = ADF_VF2PF_IN_USE_BY_VF;
|
|
Torsten Duwe |
3416f8 |
+ remote_in_use_mask = ADF_PF2VF_IN_USE_BY_PF_MASK;
|
|
Torsten Duwe |
3416f8 |
+ remote_in_use_pattern = ADF_PF2VF_IN_USE_BY_PF;
|
|
Torsten Duwe |
3416f8 |
+ int_bit = ADF_VF2PF_INT;
|
|
Torsten Duwe |
3416f8 |
+ } else {
|
|
Torsten Duwe |
3416f8 |
+ pfvf_offset = GET_PFVF_OPS(accel_dev)->get_pf2vf_offset(vf_nr);
|
|
Torsten Duwe |
3416f8 |
+ lock = &accel_dev->pf.vf_info[vf_nr].pf2vf_lock;
|
|
Torsten Duwe |
3416f8 |
+ local_in_use_mask = ADF_PF2VF_IN_USE_BY_PF_MASK;
|
|
Torsten Duwe |
3416f8 |
+ local_in_use_pattern = ADF_PF2VF_IN_USE_BY_PF;
|
|
Torsten Duwe |
3416f8 |
+ remote_in_use_mask = ADF_VF2PF_IN_USE_BY_VF_MASK;
|
|
Torsten Duwe |
3416f8 |
+ remote_in_use_pattern = ADF_VF2PF_IN_USE_BY_VF;
|
|
Torsten Duwe |
3416f8 |
+ int_bit = ADF_PF2VF_INT;
|
|
Torsten Duwe |
3416f8 |
+ }
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+ msg &= ~local_in_use_mask;
|
|
Torsten Duwe |
3416f8 |
+ msg |= local_in_use_pattern;
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+ mutex_lock(lock);
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+start:
|
|
Torsten Duwe |
3416f8 |
+ ret = 0;
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+ /* Check if the PFVF CSR is in use by remote function */
|
|
Torsten Duwe |
3416f8 |
+ val = ADF_CSR_RD(pmisc_bar_addr, pfvf_offset);
|
|
Torsten Duwe |
3416f8 |
+ if ((val & remote_in_use_mask) == remote_in_use_pattern) {
|
|
Torsten Duwe |
3416f8 |
+ dev_dbg(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
3416f8 |
+ "PFVF CSR in use by remote function\n");
|
|
Torsten Duwe |
3416f8 |
+ goto retry;
|
|
Torsten Duwe |
3416f8 |
+ }
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+ /* Attempt to get ownership of the PFVF CSR */
|
|
Torsten Duwe |
3416f8 |
+ ADF_CSR_WR(pmisc_bar_addr, pfvf_offset, msg | int_bit);
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+ /* Wait for confirmation from remote func it received the message */
|
|
Torsten Duwe |
3416f8 |
+ do {
|
|
Torsten Duwe |
3416f8 |
+ msleep(ADF_PFVF_MSG_ACK_DELAY);
|
|
Torsten Duwe |
3416f8 |
+ val = ADF_CSR_RD(pmisc_bar_addr, pfvf_offset);
|
|
Torsten Duwe |
3416f8 |
+ } while ((val & int_bit) && (count++ < ADF_PFVF_MSG_ACK_MAX_RETRY));
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+ if (val & int_bit) {
|
|
Torsten Duwe |
3416f8 |
+ dev_dbg(&GET_DEV(accel_dev), "ACK not received from remote\n");
|
|
Torsten Duwe |
3416f8 |
+ val &= ~int_bit;
|
|
Torsten Duwe |
3416f8 |
+ ret = -EIO;
|
|
Torsten Duwe |
3416f8 |
+ }
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+ if (val != msg) {
|
|
Torsten Duwe |
3416f8 |
+ dev_dbg(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
3416f8 |
+ "Collision - PFVF CSR overwritten by remote function\n");
|
|
Torsten Duwe |
3416f8 |
+ goto retry;
|
|
Torsten Duwe |
3416f8 |
+ }
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+ /* Finished with the PFVF CSR; relinquish it and leave msg in CSR */
|
|
Torsten Duwe |
3416f8 |
+ ADF_CSR_WR(pmisc_bar_addr, pfvf_offset, val & ~local_in_use_mask);
|
|
Torsten Duwe |
3416f8 |
+out:
|
|
Torsten Duwe |
3416f8 |
+ mutex_unlock(lock);
|
|
Torsten Duwe |
3416f8 |
+ return ret;
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
+retry:
|
|
Torsten Duwe |
3416f8 |
+ if (--retries) {
|
|
Torsten Duwe |
3416f8 |
+ msleep(ADF_PFVF_MSG_RETRY_DELAY);
|
|
Torsten Duwe |
3416f8 |
+ goto start;
|
|
Torsten Duwe |
3416f8 |
+ } else {
|
|
Torsten Duwe |
3416f8 |
+ ret = -EBUSY;
|
|
Torsten Duwe |
3416f8 |
+ goto out;
|
|
Torsten Duwe |
3416f8 |
+ }
|
|
Torsten Duwe |
3416f8 |
+}
|
|
Torsten Duwe |
3416f8 |
+
|
|
Torsten Duwe |
3416f8 |
void adf_gen2_init_pf_pfvf_ops(struct adf_pfvf_ops *pfvf_ops)
|
|
Torsten Duwe |
3416f8 |
{
|
|
Torsten Duwe |
3416f8 |
pfvf_ops->enable_comms = adf_enable_pf2vf_comms;
|
|
Torsten Duwe |
3416f8 |
@@ -69,6 +164,7 @@ void adf_gen2_init_pf_pfvf_ops(struct adf_pfvf_ops *pfvf_ops)
|
|
Torsten Duwe |
3416f8 |
pfvf_ops->get_vf2pf_sources = adf_gen2_get_vf2pf_sources;
|
|
Torsten Duwe |
3416f8 |
pfvf_ops->enable_vf2pf_interrupts = adf_gen2_enable_vf2pf_interrupts;
|
|
Torsten Duwe |
3416f8 |
pfvf_ops->disable_vf2pf_interrupts = adf_gen2_disable_vf2pf_interrupts;
|
|
Torsten Duwe |
3416f8 |
+ pfvf_ops->send_msg = adf_gen2_pfvf_send;
|
|
Torsten Duwe |
3416f8 |
}
|
|
Torsten Duwe |
3416f8 |
EXPORT_SYMBOL_GPL(adf_gen2_init_pf_pfvf_ops);
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
@@ -77,5 +173,6 @@ void adf_gen2_init_vf_pfvf_ops(struct adf_pfvf_ops *pfvf_ops)
|
|
Torsten Duwe |
3416f8 |
pfvf_ops->enable_comms = adf_enable_vf2pf_comms;
|
|
Torsten Duwe |
3416f8 |
pfvf_ops->get_pf2vf_offset = adf_gen2_vf_get_pfvf_offset;
|
|
Torsten Duwe |
3416f8 |
pfvf_ops->get_vf2pf_offset = adf_gen2_vf_get_pfvf_offset;
|
|
Torsten Duwe |
3416f8 |
+ pfvf_ops->send_msg = adf_gen2_pfvf_send;
|
|
Torsten Duwe |
3416f8 |
}
|
|
Torsten Duwe |
3416f8 |
EXPORT_SYMBOL_GPL(adf_gen2_init_vf_pfvf_ops);
|
|
Torsten Duwe |
3416f8 |
diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
|
|
Torsten Duwe |
3416f8 |
index c420ec03081b4..074e521ed9e88 100644
|
|
Torsten Duwe |
3416f8 |
--- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
|
|
Torsten Duwe |
3416f8 |
+++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
|
|
Torsten Duwe |
3416f8 |
@@ -1,6 +1,5 @@
|
|
Torsten Duwe |
3416f8 |
// SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
|
|
Torsten Duwe |
3416f8 |
/* Copyright(c) 2015 - 2020 Intel Corporation */
|
|
Torsten Duwe |
3416f8 |
-#include <linux/delay.h>
|
|
Torsten Duwe |
3416f8 |
#include "adf_accel_devices.h"
|
|
Torsten Duwe |
3416f8 |
#include "adf_common_drv.h"
|
|
Torsten Duwe |
3416f8 |
#include "adf_pf2vf_msg.h"
|
|
Torsten Duwe |
3416f8 |
@@ -8,97 +7,10 @@
|
|
Torsten Duwe |
3416f8 |
#define ADF_PFVF_MSG_COLLISION_DETECT_DELAY 10
|
|
Torsten Duwe |
3416f8 |
#define ADF_PFVF_MSG_ACK_DELAY 2
|
|
Torsten Duwe |
3416f8 |
#define ADF_PFVF_MSG_ACK_MAX_RETRY 100
|
|
Torsten Duwe |
3416f8 |
-#define ADF_PFVF_MSG_RETRY_DELAY 5
|
|
Torsten Duwe |
3416f8 |
-#define ADF_PFVF_MSG_MAX_RETRIES 3
|
|
Torsten Duwe |
3416f8 |
#define ADF_PFVF_MSG_RESP_TIMEOUT (ADF_PFVF_MSG_ACK_DELAY * \
|
|
Torsten Duwe |
3416f8 |
ADF_PFVF_MSG_ACK_MAX_RETRY + \
|
|
Torsten Duwe |
3416f8 |
ADF_PFVF_MSG_COLLISION_DETECT_DELAY)
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
-static int adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr)
|
|
Torsten Duwe |
3416f8 |
-{
|
|
Torsten Duwe |
3416f8 |
- struct adf_accel_pci *pci_info = &accel_dev->accel_pci_dev;
|
|
Torsten Duwe |
3416f8 |
- struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
|
Torsten Duwe |
3416f8 |
- void __iomem *pmisc_bar_addr =
|
|
Torsten Duwe |
3416f8 |
- pci_info->pci_bars[hw_data->get_misc_bar_id(hw_data)].virt_addr;
|
|
Torsten Duwe |
3416f8 |
- u32 val, pf2vf_offset, count = 0;
|
|
Torsten Duwe |
3416f8 |
- u32 local_in_use_mask, local_in_use_pattern;
|
|
Torsten Duwe |
3416f8 |
- u32 remote_in_use_mask, remote_in_use_pattern;
|
|
Torsten Duwe |
3416f8 |
- struct mutex *lock; /* lock preventing concurrent acces of CSR */
|
|
Torsten Duwe |
3416f8 |
- unsigned int retries = ADF_PFVF_MSG_MAX_RETRIES;
|
|
Torsten Duwe |
3416f8 |
- u32 int_bit;
|
|
Torsten Duwe |
3416f8 |
- int ret;
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
- if (accel_dev->is_vf) {
|
|
Torsten Duwe |
3416f8 |
- pf2vf_offset = hw_data->pfvf_ops.get_vf2pf_offset(0);
|
|
Torsten Duwe |
3416f8 |
- lock = &accel_dev->vf.vf2pf_lock;
|
|
Torsten Duwe |
3416f8 |
- local_in_use_mask = ADF_VF2PF_IN_USE_BY_VF_MASK;
|
|
Torsten Duwe |
3416f8 |
- local_in_use_pattern = ADF_VF2PF_IN_USE_BY_VF;
|
|
Torsten Duwe |
3416f8 |
- remote_in_use_mask = ADF_PF2VF_IN_USE_BY_PF_MASK;
|
|
Torsten Duwe |
3416f8 |
- remote_in_use_pattern = ADF_PF2VF_IN_USE_BY_PF;
|
|
Torsten Duwe |
3416f8 |
- int_bit = ADF_VF2PF_INT;
|
|
Torsten Duwe |
3416f8 |
- } else {
|
|
Torsten Duwe |
3416f8 |
- pf2vf_offset = hw_data->pfvf_ops.get_pf2vf_offset(vf_nr);
|
|
Torsten Duwe |
3416f8 |
- lock = &accel_dev->pf.vf_info[vf_nr].pf2vf_lock;
|
|
Torsten Duwe |
3416f8 |
- local_in_use_mask = ADF_PF2VF_IN_USE_BY_PF_MASK;
|
|
Torsten Duwe |
3416f8 |
- local_in_use_pattern = ADF_PF2VF_IN_USE_BY_PF;
|
|
Torsten Duwe |
3416f8 |
- remote_in_use_mask = ADF_VF2PF_IN_USE_BY_VF_MASK;
|
|
Torsten Duwe |
3416f8 |
- remote_in_use_pattern = ADF_VF2PF_IN_USE_BY_VF;
|
|
Torsten Duwe |
3416f8 |
- int_bit = ADF_PF2VF_INT;
|
|
Torsten Duwe |
3416f8 |
- }
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
- msg &= ~local_in_use_mask;
|
|
Torsten Duwe |
3416f8 |
- msg |= local_in_use_pattern;
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
- mutex_lock(lock);
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
-start:
|
|
Torsten Duwe |
3416f8 |
- ret = 0;
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
- /* Check if the PFVF CSR is in use by remote function */
|
|
Torsten Duwe |
3416f8 |
- val = ADF_CSR_RD(pmisc_bar_addr, pf2vf_offset);
|
|
Torsten Duwe |
3416f8 |
- if ((val & remote_in_use_mask) == remote_in_use_pattern) {
|
|
Torsten Duwe |
3416f8 |
- dev_dbg(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
3416f8 |
- "PFVF CSR in use by remote function\n");
|
|
Torsten Duwe |
3416f8 |
- goto retry;
|
|
Torsten Duwe |
3416f8 |
- }
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
- /* Attempt to get ownership of the PFVF CSR */
|
|
Torsten Duwe |
3416f8 |
- ADF_CSR_WR(pmisc_bar_addr, pf2vf_offset, msg | int_bit);
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
- /* Wait for confirmation from remote func it received the message */
|
|
Torsten Duwe |
3416f8 |
- do {
|
|
Torsten Duwe |
3416f8 |
- msleep(ADF_PFVF_MSG_ACK_DELAY);
|
|
Torsten Duwe |
3416f8 |
- val = ADF_CSR_RD(pmisc_bar_addr, pf2vf_offset);
|
|
Torsten Duwe |
3416f8 |
- } while ((val & int_bit) && (count++ < ADF_PFVF_MSG_ACK_MAX_RETRY));
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
- if (val & int_bit) {
|
|
Torsten Duwe |
3416f8 |
- dev_dbg(&GET_DEV(accel_dev), "ACK not received from remote\n");
|
|
Torsten Duwe |
3416f8 |
- val &= ~int_bit;
|
|
Torsten Duwe |
3416f8 |
- ret = -EIO;
|
|
Torsten Duwe |
3416f8 |
- }
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
- if (val != msg) {
|
|
Torsten Duwe |
3416f8 |
- dev_dbg(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
3416f8 |
- "Collision - PFVF CSR overwritten by remote function\n");
|
|
Torsten Duwe |
3416f8 |
- goto retry;
|
|
Torsten Duwe |
3416f8 |
- }
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
- /* Finished with the PFVF CSR; relinquish it and leave msg in CSR */
|
|
Torsten Duwe |
3416f8 |
- ADF_CSR_WR(pmisc_bar_addr, pf2vf_offset, val & ~local_in_use_mask);
|
|
Torsten Duwe |
3416f8 |
-out:
|
|
Torsten Duwe |
3416f8 |
- mutex_unlock(lock);
|
|
Torsten Duwe |
3416f8 |
- return ret;
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
-retry:
|
|
Torsten Duwe |
3416f8 |
- if (--retries) {
|
|
Torsten Duwe |
3416f8 |
- msleep(ADF_PFVF_MSG_RETRY_DELAY);
|
|
Torsten Duwe |
3416f8 |
- goto start;
|
|
Torsten Duwe |
3416f8 |
- } else {
|
|
Torsten Duwe |
3416f8 |
- ret = -EBUSY;
|
|
Torsten Duwe |
3416f8 |
- goto out;
|
|
Torsten Duwe |
3416f8 |
- }
|
|
Torsten Duwe |
3416f8 |
-}
|
|
Torsten Duwe |
3416f8 |
-
|
|
Torsten Duwe |
3416f8 |
/**
|
|
Torsten Duwe |
3416f8 |
* adf_send_pf2vf_msg() - send PF to VF message
|
|
Torsten Duwe |
3416f8 |
* @accel_dev: Pointer to acceleration device
|
|
Torsten Duwe |
3416f8 |
@@ -111,7 +23,7 @@ retry:
|
|
Torsten Duwe |
3416f8 |
*/
|
|
Torsten Duwe |
3416f8 |
static int adf_send_pf2vf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr, u32 msg)
|
|
Torsten Duwe |
3416f8 |
{
|
|
Torsten Duwe |
3416f8 |
- return adf_iov_putmsg(accel_dev, msg, vf_nr);
|
|
Torsten Duwe |
3416f8 |
+ return GET_PFVF_OPS(accel_dev)->send_msg(accel_dev, msg, vf_nr);
|
|
Torsten Duwe |
3416f8 |
}
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
/**
|
|
Torsten Duwe |
3416f8 |
@@ -125,7 +37,7 @@ static int adf_send_pf2vf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr, u32 msg
|
|
Torsten Duwe |
3416f8 |
*/
|
|
Torsten Duwe |
3416f8 |
int adf_send_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 msg)
|
|
Torsten Duwe |
3416f8 |
{
|
|
Torsten Duwe |
3416f8 |
- return adf_iov_putmsg(accel_dev, msg, 0);
|
|
Torsten Duwe |
3416f8 |
+ return GET_PFVF_OPS(accel_dev)->send_msg(accel_dev, msg, 0);
|
|
Torsten Duwe |
3416f8 |
}
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
/**
|
|
Torsten Duwe |
3416f8 |
diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.h b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.h
|
|
Torsten Duwe |
3416f8 |
index a7d8f83673453..73eb8f13ad095 100644
|
|
Torsten Duwe |
3416f8 |
--- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.h
|
|
Torsten Duwe |
3416f8 |
+++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.h
|
|
Torsten Duwe |
3416f8 |
@@ -49,7 +49,8 @@
|
|
Torsten Duwe |
3416f8 |
*
|
|
Torsten Duwe |
3416f8 |
* When a PF or VF attempts to send a message in the lower or upper 16 bits,
|
|
Torsten Duwe |
3416f8 |
* respectively, the other 16 bits are written to first with a defined
|
|
Torsten Duwe |
3416f8 |
- * IN_USE_BY pattern as part of a collision control scheme (see adf_iov_putmsg).
|
|
Torsten Duwe |
3416f8 |
+ * IN_USE_BY pattern as part of a collision control scheme (see function
|
|
Torsten Duwe |
3416f8 |
+ * adf_gen2_pfvf_send() in adf_pf2vf_msg.c).
|
|
Torsten Duwe |
3416f8 |
*/
|
|
Torsten Duwe |
3416f8 |
|
|
Torsten Duwe |
3416f8 |
#define ADF_PFVF_COMPAT_THIS_VERSION 0x1 /* PF<->VF compat */
|
|
Torsten Duwe |
3416f8 |
--
|
|
Torsten Duwe |
3416f8 |
2.35.3
|
|
Torsten Duwe |
3416f8 |
|