Torsten Duwe 57cdfd
From a9dc0d966605377e9aa512efdcaf9653f40cc2d5 Mon Sep 17 00:00:00 2001
Torsten Duwe 57cdfd
From: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 57cdfd
Date: Thu, 16 Dec 2021 09:13:31 +0000
Torsten Duwe 57cdfd
Subject: [PATCH] crypto: qat - add PFVF support to the GEN4 host driver
Torsten Duwe 57cdfd
Git-commit: a9dc0d966605377e9aa512efdcaf9653f40cc2d5
Torsten Duwe 57cdfd
Patch-mainline: v5.17-rc1
Torsten Duwe 57cdfd
References: jsc#PED-1073
Torsten Duwe 57cdfd
Torsten Duwe 57cdfd
So far PFVF support for GEN4 devices has been kept effectively disabled
Torsten Duwe 57cdfd
due to lack of support. This patch adds all the GEN4 specific logic to
Torsten Duwe 57cdfd
make PFVF fully functional on PF.
Torsten Duwe 57cdfd
Torsten Duwe 57cdfd
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 57cdfd
Co-developed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 57cdfd
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 57cdfd
Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
Torsten Duwe 57cdfd
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe 57cdfd
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe 57cdfd
Torsten Duwe 57cdfd
---
Torsten Duwe 57cdfd
 .../crypto/qat/qat_4xxx/adf_4xxx_hw_data.c    |  10 +-
Torsten Duwe 57cdfd
 drivers/crypto/qat/qat_common/Makefile        |   2 +-
Torsten Duwe 57cdfd
 drivers/crypto/qat/qat_common/adf_gen4_pfvf.c | 148 ++++++++++++++++++
Torsten Duwe 57cdfd
 drivers/crypto/qat/qat_common/adf_gen4_pfvf.h |  17 ++
Torsten Duwe 57cdfd
 drivers/crypto/qat/qat_common/adf_pfvf_msg.h  |  29 +++-
Torsten Duwe 57cdfd
 5 files changed, 196 insertions(+), 10 deletions(-)
Torsten Duwe 57cdfd
 create mode 100644 drivers/crypto/qat/qat_common/adf_gen4_pfvf.c
Torsten Duwe 57cdfd
 create mode 100644 drivers/crypto/qat/qat_common/adf_gen4_pfvf.h
Torsten Duwe 57cdfd
Torsten Duwe 57cdfd
diff --git a/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.c b/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.c
Torsten Duwe 57cdfd
index 67cd20f443ab4..ef71aa4efd646 100644
Torsten Duwe 57cdfd
--- a/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.c
Torsten Duwe 57cdfd
+++ b/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.c
Torsten Duwe 57cdfd
@@ -4,6 +4,7 @@
Torsten Duwe 57cdfd
 #include <adf_accel_devices.h>
Torsten Duwe 57cdfd
 #include <adf_common_drv.h>
Torsten Duwe 57cdfd
 #include <adf_gen4_hw_data.h>
Torsten Duwe 57cdfd
+#include <adf_gen4_pfvf.h>
Torsten Duwe 57cdfd
 #include "adf_4xxx_hw_data.h"
Torsten Duwe 57cdfd
 #include "icp_qat_hw.h"
Torsten Duwe 57cdfd
 
Torsten Duwe 57cdfd
@@ -228,12 +229,6 @@ static u32 uof_get_ae_mask(u32 obj_num)
Torsten Duwe 57cdfd
 	return adf_4xxx_fw_config[obj_num].ae_mask;
Torsten Duwe 57cdfd
 }
Torsten Duwe 57cdfd
 
Torsten Duwe 57cdfd
-static u32 get_vf2pf_sources(void __iomem *pmisc_addr)
Torsten Duwe 57cdfd
-{
Torsten Duwe 57cdfd
-	/* For the moment do not report vf2pf sources */
Torsten Duwe 57cdfd
-	return 0;
Torsten Duwe 57cdfd
-}
Torsten Duwe 57cdfd
-
Torsten Duwe 57cdfd
 void adf_init_hw_data_4xxx(struct adf_hw_device_data *hw_data)
Torsten Duwe 57cdfd
 {
Torsten Duwe 57cdfd
 	hw_data->dev_class = &adf_4xxx_class;
Torsten Duwe 57cdfd
@@ -278,12 +273,11 @@ void adf_init_hw_data_4xxx(struct adf_hw_device_data *hw_data)
Torsten Duwe 57cdfd
 	hw_data->uof_get_ae_mask = uof_get_ae_mask;
Torsten Duwe 57cdfd
 	hw_data->set_msix_rttable = set_msix_default_rttable;
Torsten Duwe 57cdfd
 	hw_data->set_ssm_wdtimer = adf_gen4_set_ssm_wdtimer;
Torsten Duwe 57cdfd
-	hw_data->pfvf_ops.enable_comms = adf_pfvf_comms_disabled;
Torsten Duwe 57cdfd
-	hw_data->pfvf_ops.get_vf2pf_sources = get_vf2pf_sources;
Torsten Duwe 57cdfd
 	hw_data->disable_iov = adf_disable_sriov;
Torsten Duwe 57cdfd
 	hw_data->ring_pair_reset = adf_gen4_ring_pair_reset;
Torsten Duwe 57cdfd
 
Torsten Duwe 57cdfd
 	adf_gen4_init_hw_csr_ops(&hw_data->csr_ops);
Torsten Duwe 57cdfd
+	adf_gen4_init_pf_pfvf_ops(&hw_data->pfvf_ops);
Torsten Duwe 57cdfd
 }
Torsten Duwe 57cdfd
 
Torsten Duwe 57cdfd
 void adf_clean_hw_data_4xxx(struct adf_hw_device_data *hw_data)
Torsten Duwe 57cdfd
diff --git a/drivers/crypto/qat/qat_common/Makefile b/drivers/crypto/qat/qat_common/Makefile
Torsten Duwe 57cdfd
index 80f6cb424753c..7e191a42a5c7e 100644
Torsten Duwe 57cdfd
--- a/drivers/crypto/qat/qat_common/Makefile
Torsten Duwe 57cdfd
+++ b/drivers/crypto/qat/qat_common/Makefile
Torsten Duwe 57cdfd
@@ -22,4 +22,4 @@ intel_qat-$(CONFIG_DEBUG_FS) += adf_transport_debug.o
Torsten Duwe 57cdfd
 intel_qat-$(CONFIG_PCI_IOV) += adf_sriov.o adf_vf_isr.o adf_pfvf_utils.o \
Torsten Duwe 57cdfd
 			       adf_pfvf_pf_msg.o adf_pfvf_pf_proto.o \
Torsten Duwe 57cdfd
 			       adf_pfvf_vf_msg.o adf_pfvf_vf_proto.o \
Torsten Duwe 57cdfd
-			       adf_gen2_pfvf.o
Torsten Duwe 57cdfd
+			       adf_gen2_pfvf.o adf_gen4_pfvf.o
Torsten Duwe 57cdfd
diff --git a/drivers/crypto/qat/qat_common/adf_gen4_pfvf.c b/drivers/crypto/qat/qat_common/adf_gen4_pfvf.c
Torsten Duwe 57cdfd
new file mode 100644
Torsten Duwe 57cdfd
index 0000000000000..8efbedf63bc80
Torsten Duwe 57cdfd
--- /dev/null
Torsten Duwe 57cdfd
+++ b/drivers/crypto/qat/qat_common/adf_gen4_pfvf.c
Torsten Duwe 57cdfd
@@ -0,0 +1,148 @@
Torsten Duwe 57cdfd
+// SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
Torsten Duwe 57cdfd
+/* Copyright(c) 2021 Intel Corporation */
Torsten Duwe 57cdfd
+#include <linux/iopoll.h>
Torsten Duwe 57cdfd
+#include <linux/mutex.h>
Torsten Duwe 57cdfd
+#include <linux/types.h>
Torsten Duwe 57cdfd
+#include "adf_accel_devices.h"
Torsten Duwe 57cdfd
+#include "adf_common_drv.h"
Torsten Duwe 57cdfd
+#include "adf_gen4_pfvf.h"
Torsten Duwe 57cdfd
+#include "adf_pfvf_pf_proto.h"
Torsten Duwe 57cdfd
+#include "adf_pfvf_utils.h"
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+#define ADF_4XXX_MAX_NUM_VFS		16
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+#define ADF_4XXX_PF2VM_OFFSET(i)	(0x40B010 + ((i) * 0x20))
Torsten Duwe 57cdfd
+#define ADF_4XXX_VM2PF_OFFSET(i)	(0x40B014 + ((i) * 0x20))
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+/* VF2PF interrupt source registers */
Torsten Duwe 57cdfd
+#define ADF_4XXX_VM2PF_SOU(i)		(0x41A180 + ((i) * 4))
Torsten Duwe 57cdfd
+#define ADF_4XXX_VM2PF_MSK(i)		(0x41A1C0 + ((i) * 4))
Torsten Duwe 57cdfd
+#define ADF_4XXX_VM2PF_INT_EN_MSK	BIT(0)
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+#define ADF_PFVF_GEN4_MSGTYPE_SHIFT	2
Torsten Duwe 57cdfd
+#define ADF_PFVF_GEN4_MSGTYPE_MASK	0x3F
Torsten Duwe 57cdfd
+#define ADF_PFVF_GEN4_MSGDATA_SHIFT	8
Torsten Duwe 57cdfd
+#define ADF_PFVF_GEN4_MSGDATA_MASK	0xFFFFFF
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+static const struct pfvf_csr_format csr_gen4_fmt = {
Torsten Duwe 57cdfd
+	{ ADF_PFVF_GEN4_MSGTYPE_SHIFT, ADF_PFVF_GEN4_MSGTYPE_MASK },
Torsten Duwe 57cdfd
+	{ ADF_PFVF_GEN4_MSGDATA_SHIFT, ADF_PFVF_GEN4_MSGDATA_MASK },
Torsten Duwe 57cdfd
+};
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+static u32 adf_gen4_pf_get_pf2vf_offset(u32 i)
Torsten Duwe 57cdfd
+{
Torsten Duwe 57cdfd
+	return ADF_4XXX_PF2VM_OFFSET(i);
Torsten Duwe 57cdfd
+}
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+static u32 adf_gen4_pf_get_vf2pf_offset(u32 i)
Torsten Duwe 57cdfd
+{
Torsten Duwe 57cdfd
+	return ADF_4XXX_VM2PF_OFFSET(i);
Torsten Duwe 57cdfd
+}
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+static u32 adf_gen4_get_vf2pf_sources(void __iomem *pmisc_addr)
Torsten Duwe 57cdfd
+{
Torsten Duwe 57cdfd
+	int i;
Torsten Duwe 57cdfd
+	u32 sou, mask;
Torsten Duwe 57cdfd
+	int num_csrs = ADF_4XXX_MAX_NUM_VFS;
Torsten Duwe 57cdfd
+	u32 vf_mask = 0;
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	for (i = 0; i < num_csrs; i++) {
Torsten Duwe 57cdfd
+		sou = ADF_CSR_RD(pmisc_addr, ADF_4XXX_VM2PF_SOU(i));
Torsten Duwe 57cdfd
+		mask = ADF_CSR_RD(pmisc_addr, ADF_4XXX_VM2PF_MSK(i));
Torsten Duwe 57cdfd
+		sou &= ~mask;
Torsten Duwe 57cdfd
+		vf_mask |= sou << i;
Torsten Duwe 57cdfd
+	}
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	return vf_mask;
Torsten Duwe 57cdfd
+}
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+static void adf_gen4_enable_vf2pf_interrupts(void __iomem *pmisc_addr,
Torsten Duwe 57cdfd
+					     u32 vf_mask)
Torsten Duwe 57cdfd
+{
Torsten Duwe 57cdfd
+	int num_csrs = ADF_4XXX_MAX_NUM_VFS;
Torsten Duwe 57cdfd
+	unsigned long mask = vf_mask;
Torsten Duwe 57cdfd
+	unsigned int val;
Torsten Duwe 57cdfd
+	int i;
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	for_each_set_bit(i, &mask, num_csrs) {
Torsten Duwe 57cdfd
+		unsigned int offset = ADF_4XXX_VM2PF_MSK(i);
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+		val = ADF_CSR_RD(pmisc_addr, offset) & ~ADF_4XXX_VM2PF_INT_EN_MSK;
Torsten Duwe 57cdfd
+		ADF_CSR_WR(pmisc_addr, offset, val);
Torsten Duwe 57cdfd
+	}
Torsten Duwe 57cdfd
+}
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+static void adf_gen4_disable_vf2pf_interrupts(void __iomem *pmisc_addr,
Torsten Duwe 57cdfd
+					      u32 vf_mask)
Torsten Duwe 57cdfd
+{
Torsten Duwe 57cdfd
+	int num_csrs = ADF_4XXX_MAX_NUM_VFS;
Torsten Duwe 57cdfd
+	unsigned long mask = vf_mask;
Torsten Duwe 57cdfd
+	unsigned int val;
Torsten Duwe 57cdfd
+	int i;
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	for_each_set_bit(i, &mask, num_csrs) {
Torsten Duwe 57cdfd
+		unsigned int offset = ADF_4XXX_VM2PF_MSK(i);
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+		val = ADF_CSR_RD(pmisc_addr, offset) | ADF_4XXX_VM2PF_INT_EN_MSK;
Torsten Duwe 57cdfd
+		ADF_CSR_WR(pmisc_addr, offset, val);
Torsten Duwe 57cdfd
+	}
Torsten Duwe 57cdfd
+}
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+static int adf_gen4_pfvf_send(struct adf_accel_dev *accel_dev,
Torsten Duwe 57cdfd
+			      struct pfvf_message msg, u32 pfvf_offset,
Torsten Duwe 57cdfd
+			      struct mutex *csr_lock)
Torsten Duwe 57cdfd
+{
Torsten Duwe 57cdfd
+	void __iomem *pmisc_addr = adf_get_pmisc_base(accel_dev);
Torsten Duwe 57cdfd
+	u32 csr_val;
Torsten Duwe 57cdfd
+	int ret;
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	csr_val = adf_pfvf_csr_msg_of(accel_dev, msg, &csr_gen4_fmt);
Torsten Duwe 57cdfd
+	if (unlikely(!csr_val))
Torsten Duwe 57cdfd
+		return -EINVAL;
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	mutex_lock(csr_lock);
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	ADF_CSR_WR(pmisc_addr, pfvf_offset, csr_val | ADF_PFVF_INT);
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	/* Wait for confirmation from remote that it received the message */
Torsten Duwe 57cdfd
+	ret = read_poll_timeout(ADF_CSR_RD, csr_val, !(csr_val & ADF_PFVF_INT),
Torsten Duwe 57cdfd
+				ADF_PFVF_MSG_ACK_DELAY_US,
Torsten Duwe 57cdfd
+				ADF_PFVF_MSG_ACK_MAX_DELAY_US,
Torsten Duwe 57cdfd
+				true, pmisc_addr, pfvf_offset);
Torsten Duwe 57cdfd
+	if (ret < 0)
Torsten Duwe 57cdfd
+		dev_dbg(&GET_DEV(accel_dev), "ACK not received from remote\n");
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	mutex_unlock(csr_lock);
Torsten Duwe 57cdfd
+	return ret;
Torsten Duwe 57cdfd
+}
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+static struct pfvf_message adf_gen4_pfvf_recv(struct adf_accel_dev *accel_dev,
Torsten Duwe 57cdfd
+					      u32 pfvf_offset, u8 compat_ver)
Torsten Duwe 57cdfd
+{
Torsten Duwe 57cdfd
+	void __iomem *pmisc_addr = adf_get_pmisc_base(accel_dev);
Torsten Duwe 57cdfd
+	u32 csr_val;
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	/* Read message from the CSR */
Torsten Duwe 57cdfd
+	csr_val = ADF_CSR_RD(pmisc_addr, pfvf_offset);
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	/* We can now acknowledge the message reception by clearing the
Torsten Duwe 57cdfd
+	 * interrupt bit
Torsten Duwe 57cdfd
+	 */
Torsten Duwe 57cdfd
+	ADF_CSR_WR(pmisc_addr, pfvf_offset, csr_val & ~ADF_PFVF_INT);
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+	/* Return the pfvf_message format */
Torsten Duwe 57cdfd
+	return adf_pfvf_message_of(accel_dev, csr_val, &csr_gen4_fmt);
Torsten Duwe 57cdfd
+}
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+void adf_gen4_init_pf_pfvf_ops(struct adf_pfvf_ops *pfvf_ops)
Torsten Duwe 57cdfd
+{
Torsten Duwe 57cdfd
+	pfvf_ops->enable_comms = adf_enable_pf2vf_comms;
Torsten Duwe 57cdfd
+	pfvf_ops->get_pf2vf_offset = adf_gen4_pf_get_pf2vf_offset;
Torsten Duwe 57cdfd
+	pfvf_ops->get_vf2pf_offset = adf_gen4_pf_get_vf2pf_offset;
Torsten Duwe 57cdfd
+	pfvf_ops->get_vf2pf_sources = adf_gen4_get_vf2pf_sources;
Torsten Duwe 57cdfd
+	pfvf_ops->enable_vf2pf_interrupts = adf_gen4_enable_vf2pf_interrupts;
Torsten Duwe 57cdfd
+	pfvf_ops->disable_vf2pf_interrupts = adf_gen4_disable_vf2pf_interrupts;
Torsten Duwe 57cdfd
+	pfvf_ops->send_msg = adf_gen4_pfvf_send;
Torsten Duwe 57cdfd
+	pfvf_ops->recv_msg = adf_gen4_pfvf_recv;
Torsten Duwe 57cdfd
+}
Torsten Duwe 57cdfd
+EXPORT_SYMBOL_GPL(adf_gen4_init_pf_pfvf_ops);
Torsten Duwe 57cdfd
diff --git a/drivers/crypto/qat/qat_common/adf_gen4_pfvf.h b/drivers/crypto/qat/qat_common/adf_gen4_pfvf.h
Torsten Duwe 57cdfd
new file mode 100644
Torsten Duwe 57cdfd
index 0000000000000..17d1b774d4a8d
Torsten Duwe 57cdfd
--- /dev/null
Torsten Duwe 57cdfd
+++ b/drivers/crypto/qat/qat_common/adf_gen4_pfvf.h
Torsten Duwe 57cdfd
@@ -0,0 +1,17 @@
Torsten Duwe 57cdfd
+/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only) */
Torsten Duwe 57cdfd
+/* Copyright(c) 2021 Intel Corporation */
Torsten Duwe 57cdfd
+#ifndef ADF_GEN4_PFVF_H
Torsten Duwe 57cdfd
+#define ADF_GEN4_PFVF_H
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+#include "adf_accel_devices.h"
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+#ifdef CONFIG_PCI_IOV
Torsten Duwe 57cdfd
+void adf_gen4_init_pf_pfvf_ops(struct adf_pfvf_ops *pfvf_ops);
Torsten Duwe 57cdfd
+#else
Torsten Duwe 57cdfd
+static inline void adf_gen4_init_pf_pfvf_ops(struct adf_pfvf_ops *pfvf_ops)
Torsten Duwe 57cdfd
+{
Torsten Duwe 57cdfd
+	pfvf_ops->enable_comms = adf_pfvf_comms_disabled;
Torsten Duwe 57cdfd
+}
Torsten Duwe 57cdfd
+#endif
Torsten Duwe 57cdfd
+
Torsten Duwe 57cdfd
+#endif /* ADF_GEN4_PFVF_H */
Torsten Duwe 57cdfd
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_msg.h b/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe 57cdfd
index 1d3cad7d49995..f00e9e2c585b4 100644
Torsten Duwe 57cdfd
--- a/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe 57cdfd
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe 57cdfd
@@ -6,7 +6,8 @@
Torsten Duwe 57cdfd
 #include <linux/bits.h>
Torsten Duwe 57cdfd
 
Torsten Duwe 57cdfd
 /*
Torsten Duwe 57cdfd
- * PF<->VF Messaging
Torsten Duwe 57cdfd
+ * PF<->VF Gen2 Messaging format
Torsten Duwe 57cdfd
+ *
Torsten Duwe 57cdfd
  * The PF has an array of 32-bit PF2VF registers, one for each VF.  The
Torsten Duwe 57cdfd
  * PF can access all these registers; each VF can access only the one
Torsten Duwe 57cdfd
  * register associated with that particular VF.
Torsten Duwe 57cdfd
@@ -53,6 +54,32 @@
Torsten Duwe 57cdfd
  * respectively, the other 16 bits are written to first with a defined
Torsten Duwe 57cdfd
  * IN_USE_BY pattern as part of a collision control scheme (see function
Torsten Duwe 57cdfd
  * adf_gen2_pfvf_send() in adf_pf2vf_msg.c).
Torsten Duwe 57cdfd
+ *
Torsten Duwe 57cdfd
+ *
Torsten Duwe 57cdfd
+ * PF<->VF Gen4 Messaging format
Torsten Duwe 57cdfd
+ *
Torsten Duwe 57cdfd
+ * Similarly to the gen2 messaging format, 32-bit long registers are used for
Torsten Duwe 57cdfd
+ * communication between PF and VFs. However, each VF and PF share a pair of
Torsten Duwe 57cdfd
+ * 32-bits register to avoid collisions: one for PV to VF messages and one
Torsten Duwe 57cdfd
+ * for VF to PF messages.
Torsten Duwe 57cdfd
+ *
Torsten Duwe 57cdfd
+ * Both the Interrupt bit and the Message Origin bit retain the same position
Torsten Duwe 57cdfd
+ * and meaning, although non-system messages are now deprecated and not
Torsten Duwe 57cdfd
+ * expected.
Torsten Duwe 57cdfd
+ *
Torsten Duwe 57cdfd
+ *  31 30              9  8  7  6  5  4  3  2  1  0
Torsten Duwe 57cdfd
+ *  _______________________________________________
Torsten Duwe 57cdfd
+ * |  |  |   . . .   |  |  |  |  |  |  |  |  |  |  |
Torsten Duwe 57cdfd
+ * +-----------------------------------------------+
Torsten Duwe 57cdfd
+ *  \_____________________/ \_______________/  ^  ^
Torsten Duwe 57cdfd
+ *             ^                     ^         |  |
Torsten Duwe 57cdfd
+ *             |                     |         |  PF/VF Int
Torsten Duwe 57cdfd
+ *             |                     |         Message Origin
Torsten Duwe 57cdfd
+ *             |                     Message Type
Torsten Duwe 57cdfd
+ *             Message-specific Data/Reserved
Torsten Duwe 57cdfd
+ *
Torsten Duwe 57cdfd
+ * For both formats, the message reception is acknowledged by lowering the
Torsten Duwe 57cdfd
+ * interrupt bit on the register where the message was sent.
Torsten Duwe 57cdfd
  */
Torsten Duwe 57cdfd
 
Torsten Duwe 57cdfd
 /* PFVF message common bits */
Torsten Duwe 57cdfd
-- 
Torsten Duwe 57cdfd
2.35.3
Torsten Duwe 57cdfd