PCI: endpoint: Differentiate between disabled and reserved BARs
Subsystems (22)
v4 cover PCI: endpoint: Differentiate between disabled and reserved BARs
Hello all,
This series was originally written in response to the patch series from Manikanta Maddireddy that was posted here:
https://lore.kernel.org/linux-pci/[email protected]/T/#t
Manikanta has reviewed this series and will send a small series on top of this one.
Changes since v3:
-Modified patch 1 to simply drop BAR_RESERVED for a BAR following an
only_64bit BAR (Manivannan).
-Added a patch from Manikanta, to make his follow-up series smaller,
since this series touches the same lines anyway.
Link to v3:
https://lore.kernel.org/linux-pci/[email protected]/
Koichiro Den (2):
PCI: endpoint: Describe reserved subregions within BARs
PCI: dw-rockchip: Describe RK3588 BAR4 DMA ctrl window
Manikanta Maddireddy (1):
PCI: endpoint: Allow only_64bit on BAR_RESERVED
Niklas Cassel (7):
PCI: endpoint: Do not mark the BAR succeeding a 64-bit BAR as
BAR_RESERVED
PCI: endpoint: Introduce pci_epc_bar_type BAR_DISABLED
PCI: dwc: Replace certain BAR_RESERVED with BAR_DISABLED in glue
drivers
PCI: dwc: Disable BARs in common code instead of in each glue driver
PCI: endpoint: pci-epf-test: Advertise reserved BARs
misc: pci_endpoint_test: Give reserved BARs a distinct error code
selftests: pci_endpoint: Skip reserved BARs
drivers/misc/pci_endpoint_test.c | 21 ++++++++- drivers/pci/controller/dwc/pci-dra7xx.c | 4 -- drivers/pci/controller/dwc/pci-imx6.c | 22 +++------ drivers/pci/controller/dwc/pci-keystone.c | 12 +++++ .../pci/controller/dwc/pci-layerscape-ep.c | 6 --- drivers/pci/controller/dwc/pcie-artpec6.c | 4 -- .../pci/controller/dwc/pcie-designware-ep.c | 24 ++++++++++ .../pci/controller/dwc/pcie-designware-plat.c | 10 ---- drivers/pci/controller/dwc/pcie-dw-rockchip.c | 23 ++++++---- drivers/pci/controller/dwc/pcie-keembay.c | 3 -- drivers/pci/controller/dwc/pcie-qcom-ep.c | 12 ----- drivers/pci/controller/dwc/pcie-rcar-gen4.c | 16 ++----- drivers/pci/controller/dwc/pcie-stm32-ep.c | 10 ---- drivers/pci/controller/dwc/pcie-tegra194.c | 19 ++------ drivers/pci/controller/dwc/pcie-uniphier-ep.c | 19 +------- drivers/pci/controller/pcie-rcar-ep.c | 3 -- drivers/pci/endpoint/functions/pci-epf-test.c | 24 ++++++++++ drivers/pci/endpoint/pci-epc-core.c | 5 +- include/linux/pci-epc.h | 46 +++++++++++++++---- .../pci_endpoint/pci_endpoint_test.c | 4 ++ 20 files changed, 154 insertions(+), 133 deletions(-)
base-commit: 0b74f7d72399d4c4422ed3d68ef28b3612f71e74
Signature · 1 line
2.53.0
PATCH v4 1/10 PCI: endpoint: Do not mark the BAR succeeding a 64-bit BAR as BAR_RESERVED
A BAR that can only be configured as a 64-bit BAR by an EPC driver can be marked as such using the "only_64bit" flag.
Currently, the documentation says that an EPC driver should explicitly mark the BAR succeeding an "only_64bit" BAR as BAR_RESERVED.
However, a 64-bit BAR will always take up two BARs. It is thus redundant to mark both BARs.
pci_epc_get_next_free_bar() already skips the BAR succeeding a "only_64bit" BAR, regardless if the succeeding BAR is marked as BAR_RESERVED or not.
Thus, drop the BAR_RESERVED for a BAR succeeding a "only_64bit" BAR.
No functional changes.
--- drivers/pci/controller/dwc/pci-layerscape-ep.c | 2 -- drivers/pci/controller/dwc/pcie-keembay.c | 3 --- drivers/pci/controller/dwc/pcie-qcom-ep.c | 2 -- drivers/pci/controller/dwc/pcie-tegra194.c | 1 - drivers/pci/controller/dwc/pcie-uniphier-ep.c | 5 ----- drivers/pci/controller/pcie-rcar-ep.c | 3 --- include/linux/pci-epc.h | 3 +-- 7 files changed, 1 insertion(+), 18 deletions(-)
drivers/pci/controller/dwc/pci-layerscape-ep.c +0 -2
@@ -251,9 +251,7 @@ static int __init ls_pcie_ep_probe(struct platform_device *pdev) pci->ops = pcie->drvdata->dw_pcie_ops; ls_epc->bar[BAR_2 ].only_64bit = true; - ls_epc->bar[BAR_3 ].type =BAR_RESERVED ; ls_epc->bar[BAR_4 ].only_64bit = true; - ls_epc->bar[BAR_5 ].type =BAR_RESERVED ; ls_epc->linkup_notifier = true; pcie->pci = pci;
drivers/pci/controller/dwc/pcie-keembay.c +0 -3
@@ -313,11 +313,8 @@ static const struct pci_epc_features keembay_pcie_epc_features = { .msi_capable = true, .msix_capable = true, .bar[BAR_0] = { .only_64bit = true, }, - .bar[BAR_1] = { .type = BAR_RESERVED, }, .bar[BAR_2] = { .only_64bit = true, }, - .bar[BAR_3] = { .type = BAR_RESERVED, }, .bar[BAR_4] = { .only_64bit = true, }, - .bar[BAR_5] = { .type = BAR_RESERVED, }, .align = SZ_16K, };
drivers/pci/controller/dwc/pcie-qcom-ep.c +0 -2
@@ -850,9 +850,7 @@ static const struct pci_epc_features qcom_pcie_epc_features = { .msi_capable = true, .align = SZ_4K, .bar[BAR_0] = { .only_64bit = true, }, - .bar[BAR_1] = { .type = BAR_RESERVED, }, .bar[BAR_2] = { .only_64bit = true, }, - .bar[BAR_3] = { .type = BAR_RESERVED, }, }; static const struct pci_epc_features *
drivers/pci/controller/dwc/pcie-tegra194.c +0 -1
@@ -1993,7 +1993,6 @@ static const struct pci_epc_features tegra_pcie_epc_features = { .msi_capable = true, .bar[BAR_0] = { .type = BAR_FIXED, .fixed_size = SZ_1M, .only_64bit = true, }, - .bar[BAR_1] = { .type = BAR_RESERVED, }, .bar[BAR_2] = { .type = BAR_RESERVED, }, .bar[BAR_3] = { .type = BAR_RESERVED, }, .bar[BAR_4] = { .type = BAR_RESERVED, },
drivers/pci/controller/dwc/pcie-uniphier-ep.c +0 -5
@@ -426,9 +426,7 @@ static const struct uniphier_pcie_ep_soc_data uniphier_pro5_data = { .msix_capable = false, .align = 1 << 16, .bar[BAR_0] = { .only_64bit = true, }, - .bar[BAR_1] = { .type = BAR_RESERVED, }, .bar[BAR_2] = { .only_64bit = true, }, - .bar[BAR_3] = { .type = BAR_RESERVED, }, .bar[BAR_4] = { .type = BAR_RESERVED, }, .bar[BAR_5] = { .type = BAR_RESERVED, }, },
@@ -445,11 +443,8 @@ static const struct uniphier_pcie_ep_soc_data uniphier_nx1_data = { .msix_capable = false, .align = 1 << 12, .bar[BAR_0] = { .only_64bit = true, }, - .bar[BAR_1] = { .type = BAR_RESERVED, }, .bar[BAR_2] = { .only_64bit = true, }, - .bar[BAR_3] = { .type = BAR_RESERVED, }, .bar[BAR_4] = { .only_64bit = true, }, - .bar[BAR_5] = { .type = BAR_RESERVED, }, }, };
drivers/pci/controller/pcie-rcar-ep.c +0 -3
@@ -440,13 +440,10 @@ static const struct pci_epc_features rcar_pcie_epc_features = {/* use 64-bit BARs so mark BAR[1,3,5] as reserved */ .bar[BAR_0] = { .type = BAR_FIXED, .fixed_size = 128, .only_64bit = true, }, - .bar[BAR_1] = { .type = BAR_RESERVED, }, .bar[BAR_2] = { .type = BAR_FIXED, .fixed_size = 256, .only_64bit = true, }, - .bar[BAR_3] = { .type = BAR_RESERVED, }, .bar[BAR_4] = { .type = BAR_FIXED, .fixed_size = 256, .only_64bit = true, }, - .bar[BAR_5] = { .type = BAR_RESERVED, }, }; static const struct pci_epc_features*
include/linux/pci-epc.h +1 -2
@@ -206,8 +206,7 @@ enum pci_epc_bar_type {* @fixed_size: the fixed size, only applicable if type is BAR_FIXED_MASK. * @only_64bit: if true, an EPF driver is not allowed to choose if this BAR * should be configured as 32-bit or 64-bit, the EPF driver must -* configure this BAR as 64-bit. Additionally, the BAR succeeding -* this BAR must be set to type BAR_RESERVED. +* configure this BAR as 64-bit. * * only_64bit should not be set on a BAR of type BAR_RESERVED. * (If BARx is a 64-bit BAR that an EPF driver is not allowed to
Signature · 1 line
2.53.0
PATCH v4 2/10 PCI: endpoint: Allow only_64bit on BAR_RESERVED
In reply to Niklas CasselFrom: Manikanta Maddireddy <[email protected]>
Remove the documentation that forbids setting only_64bit on a BAR of type BAR_RESERVED.
When a reserved BAR is 64-bit by default, setting only_64bit is the most accurate description. If we later add support to disable a reserved BAR (e.g. disable_bar() for BARs that were never set via set_bar()), the implementation will need to clear the adjacent BAR (upper 32 bits) as well; having only_64bit set documents that requirement.
--- include/linux/pci-epc.h | 5 ----- 1 file changed, 5 deletions(-)
include/linux/pci-epc.h +0 -5
@@ -207,11 +207,6 @@ enum pci_epc_bar_type {* @only_64bit: if true, an EPF driver is not allowed to choose if this BAR * should be configured as 32-bit or 64-bit, the EPF driver must * configure this BAR as 64-bit. -* -* only_64bit should not be set on a BAR of type BAR_RESERVED. -* (If BARx is a 64-bit BAR that an EPF driver is not allowed to -* touch, then both BARx and BARx+1 must be set to type -* BAR_RESERVED.) */ struct pci_epc_bar_desc {enum pci_epc_bar_type type;
Signature · 1 line
2.53.0
PATCH v4 3/10 PCI: endpoint: Describe reserved subregions within BARs
In reply to Niklas CasselFrom: Koichiro Den <[email protected]>
Some endpoint controllers expose platform-owned, fixed register windows within a BAR that EPF drivers must not reprogram (e.g. a BAR marked BAR_RESERVED). Even in that case, EPF drivers may need to reference a well-defined subset of that BAR, e.g. to reuse an integrated DMA controller MMIO window as a doorbell target.
Introduce struct pci_epc_bar_rsvd_region and extend struct pci_epc_bar_desc so EPC drivers can advertise such fixed subregions in a controller-agnostic way.
No functional change for existing users.
--- include/linux/pci-epc.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
include/linux/pci-epc.h +28 -0
@@ -200,6 +200,30 @@ enum pci_epc_bar_type { BAR_RESERVED, }; +/** +* enum pci_epc_bar_rsvd_region_type - type of a fixed subregion behind a BAR +* @PCI_EPC_BAR_RSVD_DMA_CTRL_MMIO: Integrated DMA controller MMIO window +* +* BARs marked BAR_RESERVED are owned by the SoC/EPC hardware and must not be +* reprogrammed by EPF drivers. Some of them still expose fixed subregions that +* EPFs may want to reference (e.g. embedded doorbell fallback). +*/ +enum pci_epc_bar_rsvd_region_type { +PCI_EPC_BAR_RSVD_DMA_CTRL_MMIO =0 , +}; + +/** +* struct pci_epc_bar_rsvd_region - fixed subregion behind a BAR +* @type: reserved region type +* @offset: offset within the BAR aperture +* @size: size of the reserved region +*/ +struct pci_epc_bar_rsvd_region { +enum pci_epc_bar_rsvd_region_type type; +resource_size_t offset; +resource_size_t size; +}; +/** * struct pci_epc_bar_desc - hardware description for a BAR * @type: the type of the BAR
@@ -207,11 +231,15 @@ enum pci_epc_bar_type {* @only_64bit: if true, an EPF driver is not allowed to choose if this BAR * should be configured as 32-bit or 64-bit, the EPF driver must * configure this BAR as 64-bit. +* @nr_rsvd_regions: number of fixed subregions described for BAR_RESERVED +* @rsvd_regions: fixed subregions behind BAR_RESERVED */ struct pci_epc_bar_desc {enum pci_epc_bar_type type;u64 fixed_size;bool only_64bit; +u8 nr_rsvd_regions; +const struct pci_epc_bar_rsvd_region *rsvd_regions; };/**
Signature · 1 line
2.53.0
PATCH v4 4/10 PCI: dw-rockchip: Describe RK3588 BAR4 DMA ctrl window
In reply to Niklas CasselFrom: Koichiro Den <[email protected]>
On RK3588 PCIe3_4L in EP mode, the integrated DMA controller registers are permanently mapped to BAR4 and must not be repurposed by EPF drivers.
When the remote peer needs to access these registers, it must use the fixed BAR4 window instead of creating another inbound mapping in a different BAR. Mixing the fixed window with an additional mapping can lead to incorrect behavior.
Advertise the DMA controller MMIO window as a reserved BAR subregion so EPF drivers can reuse it safely.
--- drivers/pci/controller/dwc/pcie-dw-rockchip.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/pci/controller/dwc/pcie-dw-rockchip.c +14 -1
@@ -403,6 +403,15 @@ static const struct pci_epc_features rockchip_pcie_epc_features_rk3568 = { .bar[BAR_5] = { .type = BAR_RESIZABLE, }, }; +static const struct pci_epc_bar_rsvd_region rk3588_bar4_rsvd[] = { + { +/* DMA_CAP (BAR4: DMA Port Logic Structure) */ + .type =PCI_EPC_BAR_RSVD_DMA_CTRL_MMIO , + .offset =0x0 , + .size =0x2000 , + }, +}; +/* * BAR4 on rk3588 exposes the ATU Port Logic Structure to the host regardless of * iATU settings for BAR4. This means that BAR4 cannot be used by an EPF driver,
@@ -420,7 +429,11 @@ static const struct pci_epc_features rockchip_pcie_epc_features_rk3588 = { .bar[BAR_1] = { .type = BAR_RESIZABLE, }, .bar[BAR_2] = { .type = BAR_RESIZABLE, }, .bar[BAR_3] = { .type = BAR_RESIZABLE, }, - .bar[BAR_4] = { .type = BAR_RESERVED, }, + .bar[BAR_4] = { + .type = BAR_RESERVED, + .nr_rsvd_regions = ARRAY_SIZE(rk3588_bar4_rsvd), + .rsvd_regions = rk3588_bar4_rsvd, + }, .bar[BAR_5] = { .type = BAR_RESIZABLE, }, };
Signature · 1 line
2.53.0
PATCH v4 5/10 PCI: endpoint: Introduce pci_epc_bar_type BAR_DISABLED
In reply to Niklas CasselAdd a pci_epc_bar_type BAR_DISABLED to more clearly differentiate from BAR_RESERVED.
This BAR type will only be used to describe a BAR that the EPC driver should disable, and will thus never be available to an EPF drive. (Unlike BAR_RESERVED, which will never be disabled by default by an EPC driver.)
--- drivers/pci/endpoint/pci-epc-core.c | 5 +++-- include/linux/pci-epc.h | 10 +++++++++- 2 files changed, 12 insertions(+), 3 deletions(-)
drivers/pci/endpoint/pci-epc-core.c +3 -2
@@ -103,8 +103,9 @@ enum pci_barno pci_epc_get_next_free_bar(const struct pci_epc_features bar++;for (i = bar; i <PCI_STD_NUM_BARS ; i++) { -/* If the BAR is not reserved, return it. */ -if (epc_features->bar[i].type !=BAR_RESERVED ) +/* If the BAR is not reserved or disabled, return it. */ +if (epc_features->bar[i].type !=BAR_RESERVED && + epc_features->bar[i].type !=BAR_DISABLED )return i; }
include/linux/pci-epc.h +9 -1
@@ -191,13 +191,21 @@ struct pci_epc {* @BAR_RESIZABLE: The BAR implements the PCI-SIG Resizable BAR Capability. * NOTE: An EPC driver can currently only set a single supported * size. -* @BAR_RESERVED: The BAR should not be touched by an EPF driver. +* @BAR_RESERVED: Used for HW-backed BARs (e.g. MSI-X table, DMA regs). The BAR +* should not be disabled by an EPC driver. The BAR should not be +* reprogrammed by an EPF driver. An EPF driver is allowed to +* disable the BAR if absolutely necessary. (However, right now +* there is no EPC operation to disable a BAR that has not been +* programmed using pci_epc_set_bar().) +* @BAR_DISABLED: The BAR should be disabled by an EPC driver. The BAR will be +* unavailable to an EPF driver. */ enum pci_epc_bar_type {BAR_PROGRAMMABLE =0 ,BAR_FIXED ,BAR_RESIZABLE ,BAR_RESERVED , +BAR_DISABLED , };/**
Signature · 1 line
2.53.0
PATCH v4 6/10 PCI: dwc: Replace certain BAR_RESERVED with BAR_DISABLED in glue drivers
In reply to Niklas CasselMost DWC based EPC glue drivers that have BARs marked as BAR_RESERVED in epc_features also call dw_pcie_ep_reset_bar() for these reserved BARs in ep->ops->init(). (The only exception is pci-keystone.c.)
An EPF driver will be able to get/enable BARs that have been disabled/reset using dw_pcie_ep_reset_bar(), except if the BAR is marked as BAR_RESERVED (see pci_epc_get_next_free_bar()).
Thus, all EPC drivers that have BARs marked as BAR_RESERVED in epc_features and call dw_pcie_ep_reset_bar(), should really have these BARs marked as BAR_DISABLED. If dw_pcie_ep_reset_bar() is not called by the glue driver, the BARs are kept as BAR_RESERVED.
No EPC drivers outside drivers/pci/controllers/dwc mark their BARs as BAR_RESERVED, so there is nothing to do in non-DWC based EPC drivers.
--- drivers/pci/controller/dwc/pci-imx6.c | 12 ++++++------ drivers/pci/controller/dwc/pci-keystone.c | 12 ++++++++++++ drivers/pci/controller/dwc/pcie-rcar-gen4.c | 6 +++--- drivers/pci/controller/dwc/pcie-tegra194.c | 8 ++++---- drivers/pci/controller/dwc/pcie-uniphier-ep.c | 4 ++-- 5 files changed, 27 insertions(+), 15 deletions(-)
drivers/pci/controller/dwc/pci-imx6.c +6 -6
@@ -1433,19 +1433,19 @@ static int imx_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no,static const struct pci_epc_features imx8m_pcie_epc_features = {DWC_EPC_COMMON_FEATURES , .msi_capable = true, - .bar[BAR_1 ] = { .type =BAR_RESERVED , }, - .bar[BAR_3 ] = { .type =BAR_RESERVED , }, + .bar[BAR_1 ] = { .type =BAR_DISABLED , }, + .bar[BAR_3 ] = { .type =BAR_DISABLED , }, .bar[BAR_4 ] = { .type =BAR_FIXED , .fixed_size =SZ_256 , }, - .bar[BAR_5 ] = { .type =BAR_RESERVED , }, + .bar[BAR_5 ] = { .type =BAR_DISABLED , }, .align =SZ_64K , };static const struct pci_epc_features imx8q_pcie_epc_features = {DWC_EPC_COMMON_FEATURES , .msi_capable = true, - .bar[BAR_1 ] = { .type =BAR_RESERVED , }, - .bar[BAR_3 ] = { .type =BAR_RESERVED , }, - .bar[BAR_5 ] = { .type =BAR_RESERVED , }, + .bar[BAR_1 ] = { .type =BAR_DISABLED , }, + .bar[BAR_3 ] = { .type =BAR_DISABLED , }, + .bar[BAR_5 ] = { .type =BAR_DISABLED , }, .align =SZ_64K , };
drivers/pci/controller/dwc/pci-keystone.c +12 -0
@@ -933,6 +933,18 @@ static const struct pci_epc_features ks_pcie_am654_epc_features = { DWC_EPC_COMMON_FEATURES, .msi_capable = true, .msix_capable = true, +/* +* TODO: This driver is the only DWC glue driver that had BAR_RESERVED +* BARs, but did not call dw_pcie_ep_reset_bar() for the reserved BARs. +* +* To not change the existing behavior, these BARs were not migrated to +* BAR_DISABLED. If this driver wants the BAR_RESERVED BARs to be +* disabled, it should migrate them to BAR_DISABLED. +* +* If they actually should be enabled, then the driver must also define +* what is behind these reserved BARs, see the definition of struct +* pci_epc_bar_rsvd_region. +*/ .bar[BAR_0] = { .type = BAR_RESERVED, }, .bar[BAR_1] = { .type = BAR_RESERVED, }, .bar[BAR_2] = { .type = BAR_RESIZABLE, },
drivers/pci/controller/dwc/pcie-rcar-gen4.c +3 -3
@@ -422,10 +422,10 @@ static int rcar_gen4_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no,static const struct pci_epc_features rcar_gen4_pcie_epc_features = {DWC_EPC_COMMON_FEATURES , .msi_capable = true, - .bar[BAR_1 ] = { .type =BAR_RESERVED , }, - .bar[BAR_3 ] = { .type =BAR_RESERVED , }, + .bar[BAR_1 ] = { .type =BAR_DISABLED , }, + .bar[BAR_3 ] = { .type =BAR_DISABLED , }, .bar[BAR_4 ] = { .type =BAR_FIXED , .fixed_size =256 }, - .bar[BAR_5 ] = { .type =BAR_RESERVED , }, + .bar[BAR_5 ] = { .type =BAR_DISABLED , }, .align =SZ_1M , };
drivers/pci/controller/dwc/pcie-tegra194.c +4 -4
@@ -1993,10 +1993,10 @@ static const struct pci_epc_features tegra_pcie_epc_features = { .msi_capable = true, .bar[BAR_0] = { .type = BAR_FIXED, .fixed_size = SZ_1M, .only_64bit = true, }, - .bar[BAR_2] = { .type = BAR_RESERVED, }, - .bar[BAR_3] = { .type = BAR_RESERVED, }, - .bar[BAR_4] = { .type = BAR_RESERVED, }, - .bar[BAR_5] = { .type = BAR_RESERVED, }, + .bar[BAR_2] = { .type = BAR_DISABLED, }, + .bar[BAR_3] = { .type = BAR_DISABLED, }, + .bar[BAR_4] = { .type = BAR_DISABLED, }, + .bar[BAR_5] = { .type = BAR_DISABLED, }, .align = SZ_64K, };
drivers/pci/controller/dwc/pcie-uniphier-ep.c +2 -2
@@ -427,8 +427,8 @@ static const struct uniphier_pcie_ep_soc_data uniphier_pro5_data = { .align = 1 << 16, .bar[BAR_0] = { .only_64bit = true, }, .bar[BAR_2] = { .only_64bit = true, }, - .bar[BAR_4] = { .type = BAR_RESERVED, }, - .bar[BAR_5] = { .type = BAR_RESERVED, }, + .bar[BAR_4] = { .type = BAR_DISABLED, }, + .bar[BAR_5] = { .type = BAR_DISABLED, }, }, };
Signature · 1 line
2.53.0
PATCH v4 7/10 PCI: dwc: Disable BARs in common code instead of in each glue driver
In reply to Niklas CasselThe current EPC core design relies on an EPC driver disabling all BARs by default. An EPF driver will then enable the BARs that it wants to enabled.
This design is there because there is no epc->ops->disable_bar(). (There is a epc->ops->clear_bar(), but that is only to disable a BAR that has been enabled using epc->ops->set_bar() first.)
By default, an EPF driver will not be able to get/enable BARs that are marked as BAR_RESERVED or BAR_DISABLED (see pci_epc_get_next_free_bar()).
Since the current EPC code design requires an EPC driver to disable all BARs by default, let's move this to DWC common code from each glue driver.
BAR_RESERVED BARs are not disabled by default because these BARs are hardware backed, and should only be disabled explicitly by an EPF driver if absolutely necessary for the EPF driver to function correctly. (This is similar to how e.g. NVMe may have vendor specific BARs outside of the mandatory BAR0 which contains the NVMe registers.)
Note that there is currently no EPC operation to disable a BAR that has not first been programmed using pci_epc_set_bar(). If an EPF driver ever wants to disable a BAR marked as BAR_RESERVED, a disable_bar() operation would have to be added first.
No functional changes intended.
--- drivers/pci/controller/dwc/pci-dra7xx.c | 4 ---- drivers/pci/controller/dwc/pci-imx6.c | 10 -------- .../pci/controller/dwc/pci-layerscape-ep.c | 4 ---- drivers/pci/controller/dwc/pcie-artpec6.c | 4 ---- .../pci/controller/dwc/pcie-designware-ep.c | 24 +++++++++++++++++++ .../pci/controller/dwc/pcie-designware-plat.c | 10 -------- drivers/pci/controller/dwc/pcie-dw-rockchip.c | 8 +------ drivers/pci/controller/dwc/pcie-qcom-ep.c | 10 -------- drivers/pci/controller/dwc/pcie-rcar-gen4.c | 10 -------- drivers/pci/controller/dwc/pcie-stm32-ep.c | 10 -------- drivers/pci/controller/dwc/pcie-tegra194.c | 10 -------- drivers/pci/controller/dwc/pcie-uniphier-ep.c | 10 -------- 12 files changed, 25 insertions(+), 89 deletions(-)
drivers/pci/controller/dwc/pci-dra7xx.c +0 -4
@@ -378,10 +378,6 @@ static void dra7xx_pcie_ep_init(struct dw_pcie_ep *ep) {struct dw_pcie *pci =to_dw_pcie_from_ep (ep);struct dra7xx_pcie *dra7xx =to_dra7xx_pcie (pci); -enum pci_barno bar; - -for (bar =0 ; bar <PCI_STD_NUM_BARS ; bar++) -dw_pcie_ep_reset_bar (pci, bar);dra7xx_pcie_enable_wrapper_interrupts (dra7xx); }
drivers/pci/controller/dwc/pci-imx6.c +0 -10
@@ -1401,15 +1401,6 @@ static const struct dw_pcie_ops dw_pcie_ops = { .stop_link = imx_pcie_stop_link, }; -static void imx_pcie_ep_init (struct dw_pcie_ep *ep) -{ -enum pci_barno bar; -struct dw_pcie *pci =to_dw_pcie_from_ep (ep); - -for (bar =BAR_0 ; bar <=BAR_5 ; bar++) -dw_pcie_ep_reset_bar (pci, bar); -} -static int imx_pcie_ep_raise_irq (struct dw_pcie_ep *ep,u8 func_no,unsigned int type,u16 interrupt_num) {
@@ -1478,7 +1469,6 @@ imx_pcie_ep_get_features(struct dw_pcie_ep *ep) }static const struct dw_pcie_ep_ops pcie_ep_ops = { - .init = imx_pcie_ep_init, .raise_irq = imx_pcie_ep_raise_irq, .get_features = imx_pcie_ep_get_features, };
drivers/pci/controller/dwc/pci-layerscape-ep.c +0 -4
@@ -152,15 +152,11 @@ static void ls_pcie_ep_init(struct dw_pcie_ep *ep)struct dw_pcie *pci =to_dw_pcie_from_ep (ep);struct ls_pcie_ep *pcie =to_ls_pcie_ep (pci);struct dw_pcie_ep_func *ep_func; -enum pci_barno bar; ep_func =dw_pcie_ep_get_func_from_ep (ep,0 );if (!ep_func)return ; -for (bar =0 ; bar <PCI_STD_NUM_BARS ; bar++) -dw_pcie_ep_reset_bar (pci, bar); - pcie->ls_epc->msi_capable = ep_func->msi_cap ? true : false; pcie->ls_epc->msix_capable = ep_func->msix_cap ? true : false; }
drivers/pci/controller/dwc/pcie-artpec6.c +0 -4
@@ -340,15 +340,11 @@ static void artpec6_pcie_ep_init(struct dw_pcie_ep *ep) {struct dw_pcie *pci =to_dw_pcie_from_ep (ep);struct artpec6_pcie *artpec6_pcie =to_artpec6_pcie (pci); -enum pci_barno bar;artpec6_pcie_assert_core_reset (artpec6_pcie);artpec6_pcie_init_phy (artpec6_pcie);artpec6_pcie_deassert_core_reset (artpec6_pcie);artpec6_pcie_wait_for_phy (artpec6_pcie); - -for (bar =0 ; bar <PCI_STD_NUM_BARS ; bar++) -dw_pcie_ep_reset_bar (pci, bar); } static int artpec6_pcie_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
drivers/pci/controller/dwc/pcie-designware-ep.c +24 -0
@@ -1114,6 +1114,28 @@ static void dw_pcie_ep_init_non_sticky_registers(struct dw_pcie *pci)dw_pcie_dbi_ro_wr_dis (pci); } +static void dw_pcie_ep_disable_bars (struct dw_pcie_ep *ep) +{ +struct dw_pcie *pci =to_dw_pcie_from_ep (ep); +enum pci_epc_bar_type bar_type; +enum pci_barno bar; + +for (bar =0 ; bar <PCI_STD_NUM_BARS ; bar++) { + bar_type =dw_pcie_ep_get_bar_type (ep, bar); + +/* +* Reserved BARs should not get disabled by default. All other +* BAR types are disabled by default. +* +* This is in line with the current EPC core design, where all +* BARs are disabled by default, and then the EPF driver enables +* the BARs it wishes to use. +*/ +if (bar_type !=BAR_RESERVED ) +dw_pcie_ep_reset_bar (pci, bar); + } +} +/** * dw_pcie_ep_init_registers - Initialize DWC EP specific registers * @ep: DWC EP device
@@ -1196,6 +1218,8 @@ int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)if (ep->ops->init) ep->ops->init (ep); +dw_pcie_ep_disable_bars (ep); +/* * PCIe r6.0, section 7.9.15 states that for endpoints that support * PTM, this capability structure is required in exactly one
drivers/pci/controller/dwc/pcie-designware-plat.c +0 -10
@@ -32,15 +32,6 @@ struct dw_plat_pcie_of_data {static const struct dw_pcie_host_ops dw_plat_pcie_host_ops = { }; -static void dw_plat_pcie_ep_init (struct dw_pcie_ep *ep) -{ -struct dw_pcie *pci =to_dw_pcie_from_ep (ep); -enum pci_barno bar; - -for (bar =0 ; bar <PCI_STD_NUM_BARS ; bar++) -dw_pcie_ep_reset_bar (pci, bar); -} -static int dw_plat_pcie_ep_raise_irq (struct dw_pcie_ep *ep,u8 func_no,unsigned int type,u16 interrupt_num) {
@@ -73,7 +64,6 @@ dw_plat_pcie_get_features(struct dw_pcie_ep *ep) }static const struct dw_pcie_ep_ops pcie_ep_ops = { - .init = dw_plat_pcie_ep_init, .raise_irq = dw_plat_pcie_ep_raise_irq, .get_features = dw_plat_pcie_get_features, };
drivers/pci/controller/dwc/pcie-dw-rockchip.c +1 -7
@@ -361,13 +361,9 @@ static void rockchip_pcie_ep_hide_broken_ats_cap_rk3588(struct dw_pcie_ep *ep)static void rockchip_pcie_ep_init (struct dw_pcie_ep *ep) {struct dw_pcie *pci =to_dw_pcie_from_ep (ep); -enum pci_barno bar;rockchip_pcie_enable_l0s (pci);rockchip_pcie_ep_hide_broken_ats_cap_rk3588 (ep); - -for (bar =0 ; bar <PCI_STD_NUM_BARS ; bar++) -dw_pcie_ep_reset_bar (pci, bar); }; static int rockchip_pcie_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
@@ -415,9 +411,7 @@ static const struct pci_epc_bar_rsvd_region rk3588_bar4_rsvd[] = {/* * BAR4 on rk3588 exposes the ATU Port Logic Structure to the host regardless of * iATU settings for BAR4. This means that BAR4 cannot be used by an EPF driver, -* so mark it as RESERVED. (rockchip_pcie_ep_init() will disable all BARs by -* default.) If the host could write to BAR4, the iATU settings (for all other -* BARs) would be overwritten, resulting in (all other BARs) no longer working. +* so mark it as RESERVED. */ static const struct pci_epc_features rockchip_pcie_epc_features_rk3588 = {DWC_EPC_COMMON_FEATURES ,
drivers/pci/controller/dwc/pcie-qcom-ep.c +0 -10
@@ -859,17 +859,7 @@ qcom_pcie_epc_get_features(struct dw_pcie_ep *pci_ep)return &qcom_pcie_epc_features; } -static void qcom_pcie_ep_init (struct dw_pcie_ep *ep) -{ -struct dw_pcie *pci =to_dw_pcie_from_ep (ep); -enum pci_barno bar; - -for (bar =BAR_0 ; bar <=BAR_5 ; bar++) -dw_pcie_ep_reset_bar (pci, bar); -} -static const struct dw_pcie_ep_ops pci_ep_ops = { - .init = qcom_pcie_ep_init, .raise_irq = qcom_pcie_ep_raise_irq, .get_features = qcom_pcie_epc_get_features, };
drivers/pci/controller/dwc/pcie-rcar-gen4.c +0 -10
@@ -386,15 +386,6 @@ static void rcar_gen4_pcie_ep_pre_init(struct dw_pcie_ep *ep)writel (PCIEDMAINTSTSEN_INIT , rcar->base +PCIEDMAINTSTSEN ); } -static void rcar_gen4_pcie_ep_init (struct dw_pcie_ep *ep) -{ -struct dw_pcie *pci =to_dw_pcie_from_ep (ep); -enum pci_barno bar; - -for (bar =0 ; bar <PCI_STD_NUM_BARS ; bar++) -dw_pcie_ep_reset_bar (pci, bar); -} -static void rcar_gen4_pcie_ep_deinit (struct rcar_gen4_pcie *rcar) {writel (0 , rcar->base +PCIEDMAINTSTSEN );
@@ -449,7 +440,6 @@ static unsigned int rcar_gen4_pcie_ep_get_dbi2_offset(struct dw_pcie_ep *ep,static const struct dw_pcie_ep_ops pcie_ep_ops = { .pre_init = rcar_gen4_pcie_ep_pre_init, - .init = rcar_gen4_pcie_ep_init, .raise_irq = rcar_gen4_pcie_ep_raise_irq, .get_features = rcar_gen4_pcie_ep_get_features, .get_dbi_offset = rcar_gen4_pcie_ep_get_dbi_offset,
drivers/pci/controller/dwc/pcie-stm32-ep.c +0 -10
@@ -28,15 +28,6 @@ struct stm32_pcie {unsigned int perst_irq; }; -static void stm32_pcie_ep_init (struct dw_pcie_ep *ep) -{ -struct dw_pcie *pci =to_dw_pcie_from_ep (ep); -enum pci_barno bar; - -for (bar =0 ; bar <PCI_STD_NUM_BARS ; bar++) -dw_pcie_ep_reset_bar (pci, bar); -} -static int stm32_pcie_start_link (struct dw_pcie *pci) {struct stm32_pcie *stm32_pcie =to_stm32_pcie (pci);
@@ -82,7 +73,6 @@ stm32_pcie_get_features(struct dw_pcie_ep *ep) }static const struct dw_pcie_ep_ops stm32_pcie_ep_ops = { - .init = stm32_pcie_ep_init, .raise_irq = stm32_pcie_raise_irq, .get_features = stm32_pcie_get_features, };
drivers/pci/controller/dwc/pcie-tegra194.c +0 -10
@@ -1923,15 +1923,6 @@ static irqreturn_t tegra_pcie_ep_pex_rst_irq(int irq, void *arg)return IRQ_HANDLED ; } -static void tegra_pcie_ep_init (struct dw_pcie_ep *ep) -{ -struct dw_pcie *pci =to_dw_pcie_from_ep (ep); -enum pci_barno bar; - -for (bar =0 ; bar <PCI_STD_NUM_BARS ; bar++) -dw_pcie_ep_reset_bar (pci, bar); -}; -static int tegra_pcie_ep_raise_intx_irq (struct tegra_pcie_dw *pcie,u16 irq) {/* Tegra194 supports only INTA */
@@ -2007,7 +1998,6 @@ tegra_pcie_ep_get_features(struct dw_pcie_ep *ep) }static const struct dw_pcie_ep_ops pcie_ep_ops = { - .init = tegra_pcie_ep_init, .raise_irq = tegra_pcie_ep_raise_irq, .get_features = tegra_pcie_ep_get_features, };
drivers/pci/controller/dwc/pcie-uniphier-ep.c +0 -10
@@ -203,15 +203,6 @@ static void uniphier_pcie_stop_link(struct dw_pcie *pci)uniphier_pcie_ltssm_enable (priv, false); } -static void uniphier_pcie_ep_init (struct dw_pcie_ep *ep) -{ -struct dw_pcie *pci =to_dw_pcie_from_ep (ep); -enum pci_barno bar; - -for (bar =BAR_0 ; bar <=BAR_5 ; bar++) -dw_pcie_ep_reset_bar (pci, bar); -} -static int uniphier_pcie_ep_raise_intx_irq (struct dw_pcie_ep *ep) {struct dw_pcie *pci =to_dw_pcie_from_ep (ep);
@@ -283,7 +274,6 @@ uniphier_pcie_get_features(struct dw_pcie_ep *ep) }static const struct dw_pcie_ep_ops uniphier_pcie_ep_ops = { - .init = uniphier_pcie_ep_init, .raise_irq = uniphier_pcie_ep_raise_irq, .get_features = uniphier_pcie_get_features, };
Signature · 1 line
2.53.0
PATCH v4 8/10 PCI: endpoint: pci-epf-test: Advertise reserved BARs
In reply to Niklas CasselAdvertise reserved BARs as reserved in the Capabilities register, such that the host side driver will be able to skip reserved BARs.
--- drivers/pci/endpoint/functions/pci-epf-test.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+)
drivers/pci/endpoint/functions/pci-epf-test.c +24 -0
@@ -65,6 +65,12 @@#define CAP_INTX BIT(3)#define CAP_SUBRANGE_MAPPING BIT(4)#define CAP_DYNAMIC_INBOUND_MAPPING BIT(5) +#define CAP_BAR0_RESERVED BIT(6) +#define CAP_BAR1_RESERVED BIT(7) +#define CAP_BAR2_RESERVED BIT(8) +#define CAP_BAR3_RESERVED BIT(9) +#define CAP_BAR4_RESERVED BIT(10) +#define CAP_BAR5_RESERVED BIT(11)#define PCI_EPF_TEST_BAR_SUBRANGE_NSUB 2
@@ -1112,6 +1118,24 @@ static void pci_epf_test_set_capabilities(struct pci_epf *epf) epf_test->epc_features->subrange_mapping) caps |=CAP_SUBRANGE_MAPPING ; +if (epf_test->epc_features->bar[BAR_0 ].type ==BAR_RESERVED ) + caps |=CAP_BAR0_RESERVED ; + +if (epf_test->epc_features->bar[BAR_1 ].type ==BAR_RESERVED ) + caps |=CAP_BAR1_RESERVED ; + +if (epf_test->epc_features->bar[BAR_2 ].type ==BAR_RESERVED ) + caps |=CAP_BAR2_RESERVED ; + +if (epf_test->epc_features->bar[BAR_3 ].type ==BAR_RESERVED ) + caps |=CAP_BAR3_RESERVED ; + +if (epf_test->epc_features->bar[BAR_4 ].type ==BAR_RESERVED ) + caps |=CAP_BAR4_RESERVED ; + +if (epf_test->epc_features->bar[BAR_5 ].type ==BAR_RESERVED ) + caps |=CAP_BAR5_RESERVED ; + reg->caps =cpu_to_le32 (caps); }
Signature · 1 line
2.53.0
PATCH v4 9/10 misc: pci_endpoint_test: Give reserved BARs a distinct error code
In reply to Niklas CasselGive reserved BARs a distinct error code, such that the pci_endpoint_test selftest will be able to skip test cases that are run against reserved BARs.
--- drivers/misc/pci_endpoint_test.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
drivers/misc/pci_endpoint_test.c +19 -2
@@ -85,6 +85,12 @@#define CAP_INTX BIT(3)#define CAP_SUBRANGE_MAPPING BIT(4)#define CAP_DYNAMIC_INBOUND_MAPPING BIT(5) +#define CAP_BAR0_RESERVED BIT(6) +#define CAP_BAR1_RESERVED BIT(7) +#define CAP_BAR2_RESERVED BIT(8) +#define CAP_BAR3_RESERVED BIT(9) +#define CAP_BAR4_RESERVED BIT(10) +#define CAP_BAR5_RESERVED BIT(11)#define PCI_ENDPOINT_TEST_DB_BAR 0x34#define PCI_ENDPOINT_TEST_DB_OFFSET 0x38
@@ -109,6 +115,7 @@#define PCI_DEVICE_ID_ROCKCHIP_RK3588 0x3588#define PCI_ENDPOINT_TEST_BAR_SUBRANGE_NSUB 2 +#define PCI_ENDPOINT_CAP_BAR0_RESERVED_BIT 6static DEFINE_IDA (pci_endpoint_test_ida);
@@ -276,6 +283,11 @@ static int pci_endpoint_test_request_irq(struct pci_endpoint_test *test)return ret; } +static bool bar_is_reserved (struct pci_endpoint_test *test,enum pci_barno bar) +{ +return test->ep_caps &BIT (bar +PCI_ENDPOINT_CAP_BAR0_RESERVED_BIT ); +} +static const u32 bar_test_pattern[] = {0xA0A0A0A0 ,0xA1A1A1A1 ,
@@ -404,7 +416,7 @@ static int pci_endpoint_test_bars(struct pci_endpoint_test *test)/* Write all BARs in order (without reading). */ for (bar =0 ; bar <PCI_STD_NUM_BARS ; bar++) -if (test->bar[bar]) +if (test->bar[bar] && !bar_is_reserved (test, bar))pci_endpoint_test_bars_write_bar (test, bar);/*
@@ -414,7 +426,7 @@ static int pci_endpoint_test_bars(struct pci_endpoint_test *test)* (Reading back the BAR directly after writing can not detect this.) */ for (bar =0 ; bar <PCI_STD_NUM_BARS ; bar++) { -if (test->bar[bar]) { +if (test->bar[bar] && !bar_is_reserved (test, bar)) { ret =pci_endpoint_test_bars_read_bar (test, bar);if (ret)return ret;
@@ -1143,6 +1155,11 @@ static long pci_endpoint_test_ioctl(struct file *file, unsigned int cmd,if (is_am654_pci_dev (pdev) && bar ==BAR_0 ) goto ret; +if (bar_is_reserved (test, bar)) { + ret = -ENOBUFS ; + goto ret; + } +if (cmd ==PCITEST_BAR ) ret =pci_endpoint_test_bar (test, bar);else
Signature · 1 line
2.53.0
Manivannan Sadhasivam
maintainerRe: [PATCH v4 09/10] misc: pci_endpoint_test: Give reserved BARs a distinct error code
Quoted 38 lines · Niklas Cassel
Give reserved BARs a distinct error code, such that the
pci_endpoint_testselftest will be able to skip test cases that are run against reserved BARs.Tested-by Manikanta Maddireddy <[email protected]>Reviewed-by Frank Li <[email protected]>Tested-by Koichiro Den <[email protected]>Signed-off-by Niklas Cassel <[email protected]>--- drivers/misc/pci_endpoint_test.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)drivers/misc/pci_endpoint_test.c +7
-0@@ -85,6 +85,12 @@#define CAP_INTX BIT(3)#define CAP_SUBRANGE_MAPPING BIT(4)#define CAP_DYNAMIC_INBOUND_MAPPING BIT(5) +#define CAP_BAR0_RESERVED BIT(6) +#define CAP_BAR1_RESERVED BIT(7) +#define CAP_BAR2_RESERVED BIT(8) +#define CAP_BAR3_RESERVED BIT(9) +#define CAP_BAR4_RESERVED BIT(10) +#define CAP_BAR5_RESERVED BIT(11)#define PCI_ENDPOINT_TEST_DB_BAR 0x34#define PCI_ENDPOINT_TEST_DB_OFFSET 0x38@@ -109,6 +115,7 @@#define PCI_DEVICE_ID_ROCKCHIP_RK3588 0x3588#define PCI_ENDPOINT_TEST_BAR_SUBRANGE_NSUB 2 +#define PCI_ENDPOINT_CAP_BAR0_RESERVED_BIT 6static DEFINE_IDA (pci_endpoint_test_ida);
drivers/misc/pci_endpoint_test.c static int pci_endpoint_test_request_irq(struct pci_endpoint_test *test) · line 288
Quoted 6 lines
drivers/misc/pci_endpoint_test.c +3
-0@@ -276,6 +283,11 @@ static int pci_endpoint_test_request_irq(struct pci_endpoint_test *test)return ret; } +static bool bar_is_reserved (struct pci_endpoint_test *test,enum pci_barno bar) +{ +return test->ep_caps &BIT (bar +PCI_ENDPOINT_CAP_BAR0_RESERVED_BIT );
I've replaced PCI_ENDPOINT_CAP_BAR0_RESERVED_BIT with __fls(CAP_BAR0_RESERVED) while applying.
- Mani
Signature · 1 line
மணிவண்ணன் சதாசிவம்
PATCH v4 10/10 selftests: pci_endpoint: Skip reserved BARs
In reply to Niklas CasselRunning a test against a reserved BAR will result in the pci-epf-test driver returning -ENOBUFS.
Make sure that the pci_endpoint_test selftest will return skip instead of failure or success for reserved BARs.
--- tools/testing/selftests/pci_endpoint/pci_endpoint_test.c | 4 ++++ 1 file changed, 4 insertions(+)
tools/testing/selftests/pci_endpoint/pci_endpoint_test.c +4 -0
@@ -67,6 +67,8 @@ TEST_F(pci_ep_bar, BAR_TEST)pci_ep_ioctl (PCITEST_BAR , variant->barno);if (ret == -ENODATA )SKIP (return,"BAR is disabled" ); +if (ret == -ENOBUFS ) +SKIP (return,"BAR is reserved" ); EXPECT_FALSE(ret) TH_LOG("Test failed for BAR%d", variant->barno); }
@@ -84,6 +86,8 @@ TEST_F(pci_ep_bar, BAR_SUBRANGE_TEST)SKIP (return,"BAR is test register space" );if (ret == -EOPNOTSUPP )SKIP (return,"Subrange map is not supported" ); +if (ret == -ENOBUFS ) +SKIP (return,"BAR is reserved" ); EXPECT_FALSE(ret) TH_LOG("Test failed for BAR%d", variant->barno); }
Signature · 1 line
2.53.0
Quoted 9 lines · Niklas Cassel
Hello all,
This series was originally written in response to the patch series from Manikanta Maddireddy that was posted here:
https://lore.kernel.org/linux-pci/[email protected]/T/#tManikanta has reviewed this series and will send a small series on top of this one.
Applied to pci/endpoint, thanks!
- Mani
Quoted 56 lines
Changes since v3:
(quoted diff) +0
-2-Modified patch 1 to simply drop BAR_RESERVED for a BAR following an only_64bit BAR (Manivannan). -Added a patch from Manikanta, to make his follow-up series smaller, since this series touches the same lines anyway.Link to v3:
https://lore.kernel.org/linux-pci/[email protected]/Koichiro Den (2):
PCI: endpoint: Describe reserved subregions within BARs
PCI: dw-rockchip: Describe RK3588 BAR4 DMA ctrl windowManikanta Maddireddy (1):
PCI: endpoint: Allowonly_64bitonBAR_RESERVEDNiklas Cassel (7):
PCI: endpoint: Do not mark the BAR succeeding a 64-bit BAR as
BAR_RESERVED
PCI: endpoint: Introducepci_epc_bar_typeBAR_DISABLED
PCI: dwc: Replace certainBAR_RESERVEDwithBAR_DISABLEDin glue
drivers
PCI: dwc: Disable BARs in common code instead of in each glue driver
PCI: endpoint: pci-epf-test: Advertise reserved BARs
misc:pci_endpoint_test: Give reserved BARs a distinct error code
selftests:pci_endpoint: Skip reserved BARsdrivers/misc/pci_endpoint_test.c | 21 ++++++++- drivers/pci/controller/dwc/pci-dra7xx.c | 4 -- drivers/pci/controller/dwc/pci-imx6.c | 22 +++------ drivers/pci/controller/dwc/pci-keystone.c | 12 +++++ .../pci/controller/dwc/pci-layerscape-ep.c | 6 --- drivers/pci/controller/dwc/pcie-artpec6.c | 4 -- .../pci/controller/dwc/pcie-designware-ep.c | 24 ++++++++++ .../pci/controller/dwc/pcie-designware-plat.c | 10 ---- drivers/pci/controller/dwc/pcie-dw-rockchip.c | 23 ++++++---- drivers/pci/controller/dwc/pcie-keembay.c | 3 -- drivers/pci/controller/dwc/pcie-qcom-ep.c | 12 ----- drivers/pci/controller/dwc/pcie-rcar-gen4.c | 16 ++----- drivers/pci/controller/dwc/pcie-stm32-ep.c | 10 ---- drivers/pci/controller/dwc/pcie-tegra194.c | 19 ++------ drivers/pci/controller/dwc/pcie-uniphier-ep.c | 19 +------- drivers/pci/controller/pcie-rcar-ep.c | 3 -- drivers/pci/endpoint/functions/pci-epf-test.c | 24 ++++++++++ drivers/pci/endpoint/pci-epc-core.c | 5 +- include/linux/pci-epc.h | 46 +++++++++++++++---- .../pci_endpoint/pci_endpoint_test.c | 4 ++ 20 files changed, 154 insertions(+), 133 deletions(-)base-commit:
0b74f7d72399d4c4422ed3d68ef28b3612f71e74Signature · 1 line
2.53.0
Signature · 1 line
மணிவண்ணன் சதாசிவம்