[PATCH 00/37] PCI: Support for configurable PCI endpoint

From: Kishon Vijay Abraham I
Date: Thu Jan 12 2017 - 05:27:47 EST


The RFC series that was sent before this patch series can be found at [1].
The patches are split here so that it can be better reviewed.

This main purpose of this patch series is to
*) add PCI endpoint core layer
*) modifie designware/dra7xx driver to be configured in EP mode
*) add a PCI endpoint *test* function driver and corresponding host
driver

Major Improvements from RFC:
*) support multi-function devices (hw supported not virtual)
*) Access host side buffers
*) Raise MSI interrupts
*) Add user space program to use the host side PCI driver
*) Adapt all other users of designware to use the new design (only
compile tested. Since I have only dra7xx boards, the new design
has only been tested in dra7xx. I'd require the help of others
to test the platforms they have access to).

This patch series has been developed on top of 4.10-rc1, [2] & [3]

[1] -> https://lwn.net/Articles/700605/
[2] -> https://lkml.org/lkml/2016/12/28/34
[3] -> https://lkml.org/lkml/2017/1/11/238

I've also pushed the tree to
git://git.ti.com/linux-phy/linux-phy.git pci_ep_v1

Using PCI EPF Test:
ON THE EP SIDE:
***************
/* EP function is configured using configfs */
# mount -t configfs none /sys/kernel/config

/* PCI EP core layer creates "pci_ep" entry in configfs */
# cd /sys/kernel/config/pci_ep/

/*
* This is the 1st step in creating an endpoint function. This
* creates the endpoint device.
*/
# mkdir dev

/*
* dev has 2 entries. *epc* for binding a EPC device and *epf*
* is a directory containing all the functions of the endpoint
*/
# ls dev
epc epf

/*
* This creates the endpoint function device *instance*. The string
* before the .<num> suffix will identify the driver this
* EP function will bind to.
* Just pci_epf_test is also valid. The .<num> suffix is used
* if there are multiple PCI controllers and all of them wants
* to use the same function.
*/
# mkdir dev/epf/pci_epf_test.0

/*
* When the above command is given, the function device will
* also be bound to a function driver. To find the list of
* function drivers available in the system, use the following
* command. To create a new driver, the following can be referred
* drivers/pci/endpoint/functions/pci-epf-test.c
*/
# ls /sys/bus/pci-epf/drivers
pci_epf_test

/* Now configure the endpoint function */
/* These are the fields that can be configured */
# ls dev/epf/pci_epf_test.0/
baseclass_code function progif_code subsys_id
cache_line_size interrupt_pin revid subsys_vendor_id
deviceid msi_interrupts subclass_code vendorid

/* The function driver will populate these fields with default values */
# cat dev/epf/pci_epf_test.0/vendorid
0xffff

# cat dev/epf/pci_epf_test.0/interrupt_pin
0x0001

/* The user can configure any of these fields */
# echo 0x104c > dev/epf/pci_epf_test.0/vendorid
# echo 16 > dev/epf/pci_epf_test.0/msi_interrupts

/*
* Next is binding this function driver to the controller driver. In
* order to find the possible controller drivers that this function
* driver can be bound to, the following sysfs entry can be used
*/
# ls /sys/class/pci_epc/
51000000.pci

/* Now bind the function driver to the controller driver */
# echo "51000000.pcie_ep" > epc
[ 494.743487] dra7-pcie 51000000.pcie: no free inbound window
[ 494.749367] pci_epf_test pci_epf_test.0: failed to set BAR4
[ 494.755238] dra7-pcie 51000000.pcie: no free inbound window
[ 494.761451] pci_epf_test pci_epf_test.0: failed to set BAR5

/*
* the above error messages are due to non availability of free
* inbound windows. So the function drivers in dra7xx can use
* only 4 (BAR0..BAR3) BARs
*/

/****** PCI endpoint is configured ******/

ON THE HOST SIDE:
*****************
# ./pcitest.sh
BAR tests

BAR0: OKAY
BAR1: OKAY
BAR2: OKAY
BAR3: OKAY
BAR4: NOT OKAY
BAR5: NOT OKAY

Interrupt tests

LEGACY IRQ: NOT OKAY
MSI1: OKAY
MSI2: OKAY
MSI3: OKAY
MSI4: OKAY
MSI5: OKAY
MSI6: OKAY
MSI7: OKAY
MSI8: OKAY
MSI9: OKAY
MSI10: OKAY
MSI11: OKAY
MSI12: OKAY
MSI13: OKAY
MSI14: OKAY
MSI15: OKAY
MSI16: OKAY
MSI17: NOT OKAY
MSI18: NOT OKAY
MSI19: NOT OKAY
MSI20: NOT OKAY
MSI21: NOT OKAY
MSI22: NOT OKAY
MSI23: NOT OKAY
MSI24: NOT OKAY
MSI25: NOT OKAY
MSI26: NOT OKAY
MSI27: NOT OKAY
MSI28: NOT OKAY
MSI29: NOT OKAY
MSI30: NOT OKAY
MSI31: NOT OKAY
MSI32: NOT OKAY

Read Tests

READ ( 1 bytes): OKAY
READ ( 1024 bytes): OKAY
READ ( 1025 bytes): OKAY
READ (1024000 bytes): OKAY
READ (1024001 bytes): OKAY

Write Tests

WRITE ( 1 bytes): OKAY
WRITE ( 1024 bytes): OKAY
WRITE ( 1025 bytes): OKAY
WRITE (1024000 bytes): OKAY
WRITE (1024001 bytes): OKAY

Copy Tests

COPY ( 1 bytes): OKAY
COPY ( 1024 bytes): OKAY
COPY ( 1025 bytes): OKAY
COPY (1024000 bytes): OKAY
COPY (1024001 bytes): OKAY

Kishon Vijay Abraham I (37):
PCI: dwc: dra7xx: Group all host related setup in add_pcie_port
PCI: dwc: designware: Add new *ops* for cpu addr fixup
PCI: dwc: dra7xx: Populate cpu_addr_fixup ops
PCI: dwc: designware: Move the register defines to designware header
file
PCI: dwc: Add platform_set_drvdata
PCI: dwc: Rename cfg_read/cfg_write to read/write
PCI: dwc: designware: Get device pointer at the start of
dw_pcie_host_init
PCI: dwc: Split *struct pcie_port* into host only and core structures
PCI: dwc: designware: Parse *num-lanes* property in dw_pcie_setup_rc
PCI: dwc: designware: Fix style errors in pcie-designware.c
PCI: dwc: Split pcie-designware.c into host and core files
PCI: dwc: Create a new config symbol to enable pci dwc host
PCI: dwc: Remove dependency of designware to CONFIG_PCI
PCI: endpoint: Add EP core layer to enable EP controller and EP
functions
Documentation: PCI: Guide to use PCI Endpoint Core Layer
PCI: endpoint: Introduce configfs entry for configuring EP functions
Documentation: PCI: Guide to use pci endpoint configfs
Documentation: PCI: Add specification for the *pci test* function
device
PCI: endpoint: functions: Add an EP function to test PCI
Documentation: PCI: Add binding documentation for pci-test endpoint
function
PCI: dwc: Modify dbi accessors to take dbi_base as argument
PCI: dwc: Modify dbi accessors to access data of 4/2/1 bytes
PCI: dwc: Add *ops* to start and stop pcie link
PCI: dwc: designware: Add EP mode support
dt-bindings: PCI: Add dt bindings for pci designware EP mode
PCI: dwc: dra7xx: Facilitate wrapper and msi interrupts to be enabled
independently
PCI: dwc: dra7xx: Add EP mode support
dt-bindings: PCI: dra7xx: Add dt bindings for pci dra7xx EP mode
PCI: dwc: dra7xx: Workaround for errata id i870
dt-bindings: PCI: dra7xx: Add dt bindings to enable legacy mode
misc: Add host side pci driver for pci test function device
Documentation: misc-devices: Add Documentation for pci-endpoint-test
driver
tools: PCI: Add a userspace tool to test PCI endpoint
tools: PCI: Add sample test script to invoke pcitest
MAINTAINERS: add PCI EP maintainer
ARM: DRA7: clockdomain: Change the CLKTRCTRL of CM_PCIE_CLKSTCTRL to
SW_WKUP
ARM: dts: DRA7: Add pcie1 dt node for EP mode

Documentation/PCI/00-INDEX | 8 +
.../PCI/endpoint/function/binding/pci-test.txt | 17 +
Documentation/PCI/endpoint/pci-endpoint-cfs.txt | 84 ++
Documentation/PCI/endpoint/pci-endpoint.txt | 190 +++++
Documentation/PCI/endpoint/pci-test-function.txt | 66 ++
.../devicetree/bindings/pci/designware-pcie.txt | 26 +-
Documentation/devicetree/bindings/pci/ti-pci.txt | 41 +-
Documentation/misc-devices/pci-endpoint-test.txt | 35 +
MAINTAINERS | 9 +
arch/arm/boot/dts/am572x-idk.dts | 7 +-
arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi | 7 +-
arch/arm/boot/dts/dra7-evm.dts | 4 +
arch/arm/boot/dts/dra7.dtsi | 22 +-
arch/arm/boot/dts/dra72-evm-common.dtsi | 4 +
arch/arm/mach-omap2/clockdomains7xx_data.c | 2 +-
drivers/Makefile | 5 +
drivers/misc/Kconfig | 7 +
drivers/misc/Makefile | 1 +
drivers/misc/pci_endpoint_test.c | 533 ++++++++++++
drivers/pci/Kconfig | 1 +
drivers/pci/Makefile | 3 -
drivers/pci/dwc/Kconfig | 73 +-
drivers/pci/dwc/Makefile | 6 +-
drivers/pci/dwc/pci-dra7xx.c | 372 +++++++--
drivers/pci/dwc/pci-exynos.c | 83 +-
drivers/pci/dwc/pci-imx6.c | 142 ++--
drivers/pci/dwc/pci-keystone-dw.c | 91 +-
drivers/pci/dwc/pci-keystone.c | 56 +-
drivers/pci/dwc/pci-keystone.h | 4 +-
drivers/pci/dwc/pci-layerscape.c | 93 ++-
drivers/pci/dwc/pcie-armada8k.c | 92 ++-
drivers/pci/dwc/pcie-artpec6.c | 51 +-
drivers/pci/dwc/pcie-designware-ep.c | 342 ++++++++
drivers/pci/dwc/pcie-designware-host.c | 620 ++++++++++++++
drivers/pci/dwc/pcie-designware-plat.c | 29 +-
drivers/pci/dwc/pcie-designware.c | 868 ++++----------------
drivers/pci/dwc/pcie-designware.h | 254 +++++-
drivers/pci/dwc/pcie-hisi.c | 60 +-
drivers/pci/dwc/pcie-qcom.c | 72 +-
drivers/pci/dwc/pcie-spear13xx.c | 85 +-
drivers/pci/endpoint/Kconfig | 25 +
drivers/pci/endpoint/Makefile | 7 +
drivers/pci/endpoint/functions/Kconfig | 12 +
drivers/pci/endpoint/functions/Makefile | 5 +
drivers/pci/endpoint/functions/pci-epf-test.c | 513 ++++++++++++
drivers/pci/endpoint/pci-ep-cfs.c | 427 ++++++++++
drivers/pci/endpoint/pci-epc-core.c | 548 ++++++++++++
drivers/pci/endpoint/pci-epc-mem.c | 143 ++++
drivers/pci/endpoint/pci-epf-core.c | 347 ++++++++
include/linux/mod_devicetable.h | 10 +
include/linux/pci-epc.h | 141 ++++
include/linux/pci-epf.h | 160 ++++
include/uapi/linux/Kbuild | 1 +
include/uapi/linux/pcitest.h | 19 +
tools/pci/pcitest.c | 186 +++++
tools/pci/pcitest.sh | 56 ++
56 files changed, 5880 insertions(+), 1185 deletions(-)
create mode 100644 Documentation/PCI/endpoint/function/binding/pci-test.txt
create mode 100644 Documentation/PCI/endpoint/pci-endpoint-cfs.txt
create mode 100644 Documentation/PCI/endpoint/pci-endpoint.txt
create mode 100644 Documentation/PCI/endpoint/pci-test-function.txt
create mode 100644 Documentation/misc-devices/pci-endpoint-test.txt
create mode 100644 drivers/misc/pci_endpoint_test.c
create mode 100644 drivers/pci/dwc/pcie-designware-ep.c
create mode 100644 drivers/pci/dwc/pcie-designware-host.c
create mode 100644 drivers/pci/endpoint/Kconfig
create mode 100644 drivers/pci/endpoint/Makefile
create mode 100644 drivers/pci/endpoint/functions/Kconfig
create mode 100644 drivers/pci/endpoint/functions/Makefile
create mode 100644 drivers/pci/endpoint/functions/pci-epf-test.c
create mode 100644 drivers/pci/endpoint/pci-ep-cfs.c
create mode 100644 drivers/pci/endpoint/pci-epc-core.c
create mode 100644 drivers/pci/endpoint/pci-epc-mem.c
create mode 100644 drivers/pci/endpoint/pci-epf-core.c
create mode 100644 include/linux/pci-epc.h
create mode 100644 include/linux/pci-epf.h
create mode 100644 include/uapi/linux/pcitest.h
create mode 100644 tools/pci/pcitest.c
create mode 100644 tools/pci/pcitest.sh

--
1.7.9.5