* [RFC PATCH 0/3] PCI: Enable 10-bit tags support for PCIe devices
@ 2021-01-09 9:11 Dongdong Liu
2021-01-09 9:11 ` [RFC PATCH 1/3] PCI: Add 10-Bit Tag register definitions Dongdong Liu
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Dongdong Liu @ 2021-01-09 9:11 UTC (permalink / raw)
To: helgaas, linux-pci
10-Bit Tag capability, introduced in PCIe-4.0 increases the total Tag
field size from 8 bits to 10 bits.
For platforms where the RC supports 10-Bit Tag Completer capability,
it is highly recommended for platform firmware or operating software
that configures PCIe hierarchies to Set the 10-Bit Tag Requester Enable
bit automatically in Endpoints with 10-Bit Tag Requester capability. This
enables the important class of 10-Bit Tag capable adapters that send
Memory Read Requests only to host memory.
This patchset is to enable 10-bits for PCIe EP devices.
Dongdong Liu (3):
PCI: Add 10-Bit Tag register definitions
PCI: Enable 10-bit tags support for PCIe devices
PCI/IOV: Enable 10-bit tags support for PCIe VF devices
drivers/pci/iov.c | 8 ++++++++
drivers/pci/probe.c | 39 +++++++++++++++++++++++++++++++++++++++
include/linux/pci.h | 1 +
include/uapi/linux/pci_regs.h | 5 +++++
4 files changed, 53 insertions(+)
--
1.9.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [RFC PATCH 1/3] PCI: Add 10-Bit Tag register definitions
2021-01-09 9:11 [RFC PATCH 0/3] PCI: Enable 10-bit tags support for PCIe devices Dongdong Liu
@ 2021-01-09 9:11 ` Dongdong Liu
2021-01-09 9:11 ` [RFC PATCH 2/3] PCI: Enable 10-bit tags support for PCIe devices Dongdong Liu
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Dongdong Liu @ 2021-01-09 9:11 UTC (permalink / raw)
To: helgaas, linux-pci
Add 10-Bit Tag register definitions for use in subsequen patches.
See the PCIe 5.0 spec, sec 7.5.3.15 and 9.3.3.2.
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
---
include/uapi/linux/pci_regs.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
index e709ae8..cf1ddb8 100644
--- a/include/uapi/linux/pci_regs.h
+++ b/include/uapi/linux/pci_regs.h
@@ -648,6 +648,8 @@
#define PCI_EXP_DEVCAP2_ATOMIC_COMP64 0x00000100 /* 64b AtomicOp completion */
#define PCI_EXP_DEVCAP2_ATOMIC_COMP128 0x00000200 /* 128b AtomicOp completion */
#define PCI_EXP_DEVCAP2_LTR 0x00000800 /* Latency tolerance reporting */
+#define PCI_EXP_DEVCAP2_10BIT_TAG_COMP 0x00010000 /* 10-Bit Tag Completer Supported */
+#define PCI_EXP_DEVCAP2_10BIT_TAG_REQ 0x00020000 /* 10-Bit Tag Requester Supported */
#define PCI_EXP_DEVCAP2_OBFF_MASK 0x000c0000 /* OBFF support mechanism */
#define PCI_EXP_DEVCAP2_OBFF_MSG 0x00040000 /* New message signaling */
#define PCI_EXP_DEVCAP2_OBFF_WAKE 0x00080000 /* Re-use WAKE# for OBFF */
@@ -661,6 +663,7 @@
#define PCI_EXP_DEVCTL2_IDO_REQ_EN 0x0100 /* Allow IDO for requests */
#define PCI_EXP_DEVCTL2_IDO_CMP_EN 0x0200 /* Allow IDO for completions */
#define PCI_EXP_DEVCTL2_LTR_EN 0x0400 /* Enable LTR mechanism */
+#define PCI_EXP_DEVCTL2_10BIT_TAG_REQ_EN 0x1000 /* 10-Bit Tag Requester Enable */
#define PCI_EXP_DEVCTL2_OBFF_MSGA_EN 0x2000 /* Enable OBFF Message type A */
#define PCI_EXP_DEVCTL2_OBFF_MSGB_EN 0x4000 /* Enable OBFF Message type B */
#define PCI_EXP_DEVCTL2_OBFF_WAKE_EN 0x6000 /* OBFF using WAKE# signaling */
@@ -931,6 +934,7 @@
/* Single Root I/O Virtualization */
#define PCI_SRIOV_CAP 0x04 /* SR-IOV Capabilities */
#define PCI_SRIOV_CAP_VFM 0x00000001 /* VF Migration Capable */
+#define PCI_SRIOV_CAP_VF_10BIT_TAG_REQ 0x00000004 /* VF 10-Bit Tag Requester Supported */
#define PCI_SRIOV_CAP_INTR(x) ((x) >> 21) /* Interrupt Message Number */
#define PCI_SRIOV_CTRL 0x08 /* SR-IOV Control */
#define PCI_SRIOV_CTRL_VFE 0x0001 /* VF Enable */
@@ -938,6 +942,7 @@
#define PCI_SRIOV_CTRL_INTR 0x0004 /* VF Migration Interrupt Enable */
#define PCI_SRIOV_CTRL_MSE 0x0008 /* VF Memory Space Enable */
#define PCI_SRIOV_CTRL_ARI 0x0010 /* ARI Capable Hierarchy */
+#define PCI_SRIOV_CTRL_VF_10BIT_TAG_REQ_EN 0x0020 /* VF 10-Bit Tag Requester Enable */
#define PCI_SRIOV_STATUS 0x0a /* SR-IOV Status */
#define PCI_SRIOV_STATUS_VFM 0x0001 /* VF Migration Status */
#define PCI_SRIOV_INITIAL_VF 0x0c /* Initial VFs */
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [RFC PATCH 2/3] PCI: Enable 10-bit tags support for PCIe devices
2021-01-09 9:11 [RFC PATCH 0/3] PCI: Enable 10-bit tags support for PCIe devices Dongdong Liu
2021-01-09 9:11 ` [RFC PATCH 1/3] PCI: Add 10-Bit Tag register definitions Dongdong Liu
@ 2021-01-09 9:11 ` Dongdong Liu
2021-01-09 9:11 ` [RFC PATCH 3/3] PCI/IOV: Enable 10-bit tags support for PCIe VF devices Dongdong Liu
2021-02-09 13:18 ` [RFC PATCH 0/3] PCI: Enable 10-bit tags support for PCIe devices Dongdong Liu
3 siblings, 0 replies; 5+ messages in thread
From: Dongdong Liu @ 2021-01-09 9:11 UTC (permalink / raw)
To: helgaas, linux-pci
10-Bit Tag capability, introduced in PCIe-4.0 increases the total Tag
field size from 8 bits to 10 bits.
For platforms where the RC supports 10-Bit Tag Completer capability,
it is highly recommended for platform firmware or operating software
that configures PCIe hierarchies to Set the 10-Bit Tag Requester Enable
bit automatically in Endpoints with 10-Bit Tag Requester capability. This
enables the important class of 10-Bit Tag capable adapters that send
Memory Read Requests only to host memory.
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
---
drivers/pci/probe.c | 39 +++++++++++++++++++++++++++++++++++++++
include/linux/pci.h | 1 +
2 files changed, 40 insertions(+)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 953f15a..611acce 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2051,6 +2051,44 @@ int pci_configure_extended_tags(struct pci_dev *dev, void *ign)
return 0;
}
+static void pci_configure_10bit_tags(struct pci_dev *dev)
+{
+ u32 cap;
+ int ret;
+ struct pci_dev *bridge;
+
+ if (!pci_is_pcie(dev))
+ return;
+
+ ret = pcie_capability_read_dword(dev, PCI_EXP_DEVCAP2, &cap);
+ if (ret)
+ return;
+
+ if (!(cap & PCI_EXP_DEVCAP2_10BIT_TAG_COMP))
+ return;
+
+ if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) {
+ dev->ext_10bit_tag_comp_path = 1;
+ return;
+ }
+
+ bridge = pci_upstream_bridge(dev);
+ if (bridge && bridge->ext_10bit_tag_comp_path)
+ dev->ext_10bit_tag_comp_path = 1;
+
+ /* 10-Bit Tag Requester Enable in Device Control 2 Register is RsvdP for VF */
+ if (dev->is_virtfn)
+ return;
+
+ if (pci_pcie_type(dev) == PCI_EXP_TYPE_ENDPOINT &&
+ dev->ext_10bit_tag_comp_path == 1) {
+ if (cap & PCI_EXP_DEVCAP2_10BIT_TAG_REQ)
+ pcie_capability_set_word(dev, PCI_EXP_DEVCTL2,
+ PCI_EXP_DEVCTL2_10BIT_TAG_REQ_EN);
+ return;
+ }
+}
+
/**
* pcie_relaxed_ordering_enabled - Probe for PCIe relaxed ordering enable
* @dev: PCI device to query
@@ -2190,6 +2228,7 @@ static void pci_configure_device(struct pci_dev *dev)
{
pci_configure_mps(dev);
pci_configure_extended_tags(dev, NULL);
+ pci_configure_10bit_tags(dev);
pci_configure_relaxed_ordering(dev);
pci_configure_ltr(dev);
pci_configure_eetlp_prefix(dev);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index b32126d..a6dfa2f 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -390,6 +390,7 @@ struct pci_dev {
#endif
unsigned int eetlp_prefix_path:1; /* End-to-End TLP Prefix */
+ unsigned int ext_10bit_tag_comp_path:1; /* 10-Bit Tag Completer Supported from root to here */
pci_channel_state_t error_state; /* Current connectivity state */
struct device dev; /* Generic device interface */
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [RFC PATCH 3/3] PCI/IOV: Enable 10-bit tags support for PCIe VF devices
2021-01-09 9:11 [RFC PATCH 0/3] PCI: Enable 10-bit tags support for PCIe devices Dongdong Liu
2021-01-09 9:11 ` [RFC PATCH 1/3] PCI: Add 10-Bit Tag register definitions Dongdong Liu
2021-01-09 9:11 ` [RFC PATCH 2/3] PCI: Enable 10-bit tags support for PCIe devices Dongdong Liu
@ 2021-01-09 9:11 ` Dongdong Liu
2021-02-09 13:18 ` [RFC PATCH 0/3] PCI: Enable 10-bit tags support for PCIe devices Dongdong Liu
3 siblings, 0 replies; 5+ messages in thread
From: Dongdong Liu @ 2021-01-09 9:11 UTC (permalink / raw)
To: helgaas, linux-pci
Enable VF 10-Bit Tag Requester when it's upstream component support
10-bit Tag Completer.
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
---
drivers/pci/iov.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index 4afd4ee..9bff76b 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -537,6 +537,10 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
pci_iov_set_numvfs(dev, nr_virtfn);
iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE;
+ if ((iov->cap & PCI_SRIOV_CAP_VF_10BIT_TAG_REQ) &&
+ dev->ext_10bit_tag_comp_path)
+ iov->ctrl |= PCI_SRIOV_CTRL_VF_10BIT_TAG_REQ_EN;
+
pci_cfg_access_lock(dev);
pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
msleep(100);
@@ -553,6 +557,8 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
err_pcibios:
iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE);
+ if (iov->ctrl & PCI_SRIOV_CTRL_VF_10BIT_TAG_REQ_EN)
+ iov->ctrl &= ~PCI_SRIOV_CTRL_VF_10BIT_TAG_REQ_EN;
pci_cfg_access_lock(dev);
pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
ssleep(1);
@@ -585,6 +591,8 @@ static void sriov_disable(struct pci_dev *dev)
sriov_del_vfs(dev);
iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE);
+ if (iov->ctrl & PCI_SRIOV_CTRL_VF_10BIT_TAG_REQ_EN)
+ iov->ctrl &= ~PCI_SRIOV_CTRL_VF_10BIT_TAG_REQ_EN;
pci_cfg_access_lock(dev);
pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
ssleep(1);
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [RFC PATCH 0/3] PCI: Enable 10-bit tags support for PCIe devices
2021-01-09 9:11 [RFC PATCH 0/3] PCI: Enable 10-bit tags support for PCIe devices Dongdong Liu
` (2 preceding siblings ...)
2021-01-09 9:11 ` [RFC PATCH 3/3] PCI/IOV: Enable 10-bit tags support for PCIe VF devices Dongdong Liu
@ 2021-02-09 13:18 ` Dongdong Liu
3 siblings, 0 replies; 5+ messages in thread
From: Dongdong Liu @ 2021-02-09 13:18 UTC (permalink / raw)
To: helgaas, linux-pci
kindly ping :)
On 2021/1/9 17:11, Dongdong Liu wrote:
> 10-Bit Tag capability, introduced in PCIe-4.0 increases the total Tag
> field size from 8 bits to 10 bits.
>
> For platforms where the RC supports 10-Bit Tag Completer capability,
> it is highly recommended for platform firmware or operating software
> that configures PCIe hierarchies to Set the 10-Bit Tag Requester Enable
> bit automatically in Endpoints with 10-Bit Tag Requester capability. This
> enables the important class of 10-Bit Tag capable adapters that send
> Memory Read Requests only to host memory.
>
> This patchset is to enable 10-bits for PCIe EP devices.
>
> Dongdong Liu (3):
> PCI: Add 10-Bit Tag register definitions
> PCI: Enable 10-bit tags support for PCIe devices
> PCI/IOV: Enable 10-bit tags support for PCIe VF devices
>
> drivers/pci/iov.c | 8 ++++++++
> drivers/pci/probe.c | 39 +++++++++++++++++++++++++++++++++++++++
> include/linux/pci.h | 1 +
> include/uapi/linux/pci_regs.h | 5 +++++
> 4 files changed, 53 insertions(+)
>
> --
> 1.9.1
>
> .
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-02-09 13:19 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-09 9:11 [RFC PATCH 0/3] PCI: Enable 10-bit tags support for PCIe devices Dongdong Liu
2021-01-09 9:11 ` [RFC PATCH 1/3] PCI: Add 10-Bit Tag register definitions Dongdong Liu
2021-01-09 9:11 ` [RFC PATCH 2/3] PCI: Enable 10-bit tags support for PCIe devices Dongdong Liu
2021-01-09 9:11 ` [RFC PATCH 3/3] PCI/IOV: Enable 10-bit tags support for PCIe VF devices Dongdong Liu
2021-02-09 13:18 ` [RFC PATCH 0/3] PCI: Enable 10-bit tags support for PCIe devices Dongdong Liu
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.