Add support for CPM5 controller 1
Subsystems (5)
v3 cover Add support for CPM5 controller 1
This patch series introduces support for the second Root Port controller in the Xilinx Versal Premium CPM5 block. The Versal Premium platform features two Type-A Root Port controllers operating at Gen5 speed. However, the error interrupt registers and their corresponding bits are located at different offsets for Controller 0 and Controller 1.
To handle these differences, the series includes:
A new compatible string for the second Root Port controller in the device tree bindings.
Driver updates to manage platform-specific interrupt registers and offsets for both controllers using the new compatible string.
Thippeswamy Havalige (2):
dt-bindings: PCI: xilinx-cpm: Add compatible string for CPM5 host1
PCI: xilinx-cpm: Add support for Versal CPM5 Root Port controller 1
.../bindings/pci/xilinx-versal-cpm.yaml | 1 + drivers/pci/controller/pcie-xilinx-cpm.c | 50 +++++++++++++++---- 2 files changed, 40 insertions(+), 11 deletions(-)
Signature · 1 line
2.34.1
PATCH v3 1/2 dt-bindings: PCI: xilinx-cpm: Add compatible string for CPM5 host1
The Xilinx Versal premium series has CPM5 block which supports two typeA Root Port controller functionality at Gen5 speed.
Add compatible string to distinguish between two CPM5 rootport controller1. since Legacy and error interrupt register and bits for both the controllers are at different offsets.
---
changes in v3:
--------------
1. Modify compatible string.
--- Documentation/devicetree/bindings/pci/xilinx-versal-cpm.yaml | 1 + 1 file changed, 1 insertion(+)
Documentation/devicetree/bindings/pci/xilinx-versal-cpm.yaml +1 -0
@@ -17,6 +17,7 @@ properties: enum: - xlnx,versal-cpm-host-1.00 - xlnx,versal-cpm5-host + - xlnx,versal-cpm5-host1 reg: items:
Signature · 1 line
2.34.1
Re: [PATCH v3 1/2] dt-bindings: PCI: xilinx-cpm: Add compatible string for CPM5 host1
Quoted 8 lines · Thippeswamy Havalige
The Xilinx Versal premium series has CPM5 block which supports two typeA Root Port controller functionality at Gen5 speed.
Add compatible string to distinguish between two CPM5 rootport controller1. since Legacy and error interrupt register and bits for both the controllers are at different offsets.
Signed-off-by Thippeswamy Havalige <[email protected]>
Best regards,
Krzysztof
Re: [PATCH v3 1/2] dt-bindings: PCI: xilinx-cpm: Add compatible string for CPM5 host1
In reply to Thippeswamy HavaligeQuoted 8 lines · Thippeswamy Havalige
The Xilinx Versal premium series has CPM5 block which supports two typeA Root Port controller functionality at Gen5 speed.
Add compatible string to distinguish between two CPM5 rootport controller1. since Legacy and error interrupt register and bits for both the controllers are at different offsets.
Signed-off-by Thippeswamy Havalige <[email protected]>
- Mani
Quoted 23 lines
---
changes in v3:
--------------
1. Modify compatible string.--- Documentation/devicetree/bindings/pci/xilinx-versal-cpm.yaml | 1 + 1 file changed, 1 insertion(+)Documentation/devicetree/bindings/pci/xilinx-versal-cpm.yaml +1
-0@@ -17,6 +17,7 @@ properties: enum: - xlnx,versal-cpm-host-1.00 - xlnx,versal-cpm5-host + - xlnx,versal-cpm5-host1 reg: items:Signature · 1 line
2.34.1
Signature · 1 line
மணிவண்ணன் சதாசிவம்
PATCH v3 2/2 PCI: xilinx-cpm: Add support for Versal CPM5 Root Port controller 1
In reply to Thippeswamy HavaligeAdd support for the Xilinx Versal CPM5 Root Port Controller 1. The key difference between Controller 0 and Controller 1 lies in the platform-specific error interrupt bits, which are located at different register offsets.
To handle these differences, updated variant structure to hold the following platform-specific details:
- Interrupt status register offset (ir_status)
- Interrupt enable register offset (ir_enable)
- Miscellaneous interrupt values (ir_misc_value)
The driver differentiates between Controller 0 and Controller 1 using the compatible string in the device tree. This ensures that the appropriate register offsets are used for each controller, allowing for correct handling of platform-specific interrupts and initialization.
---
changes in v3:
--------------
1. Add kernel Documentation for variant structure.
2. Modify compatible string.
changes in v2:
--------------
1. Introduced new constants for Controller 1.
2. Extended the xilinx_cpm_variant structure to support
a. ir_status,
b. ir_enable, and
c. ir_misc_value for different controllers.
3. Updated IRQ handling and initialization to use the variant structure.
4. Added a new device tree match entry for Controller 1.
--- drivers/pci/controller/pcie-xilinx-cpm.c | 50 ++++++++++++++++++------ 1 file changed, 39 insertions(+), 11 deletions(-)
drivers/pci/controller/pcie-xilinx-cpm.c +39 -11
@@ -30,11 +30,14 @@#define XILINX_CPM_PCIE_REG_IDRN_MASK 0x00000E3C#define XILINX_CPM_PCIE_MISC_IR_STATUS 0x00000340#define XILINX_CPM_PCIE_MISC_IR_ENABLE 0x00000348 -#define XILINX_CPM_PCIE_MISC_IR_LOCAL BIT(1) +#define XILINX_CPM_PCIE0_MISC_IR_LOCAL BIT(1) +#define XILINX_CPM_PCIE1_MISC_IR_LOCAL BIT(2) -#define XILINX_CPM_PCIE_IR_STATUS 0x000002A0 -#define XILINX_CPM_PCIE_IR_ENABLE 0x000002A8 -#define XILINX_CPM_PCIE_IR_LOCAL BIT(0) +#define XILINX_CPM_PCIE0_IR_STATUS 0x000002A0 +#define XILINX_CPM_PCIE1_IR_STATUS 0x000002B4 +#define XILINX_CPM_PCIE0_IR_ENABLE 0x000002A8 +#define XILINX_CPM_PCIE1_IR_ENABLE 0x000002BC +#define XILINX_CPM_PCIE_IR_LOCAL BIT(0)#define IMR (x) BIT(XILINX_PCIE_INTR_ ##x)
@@ -80,14 +83,21 @@enum xilinx_cpm_version {CPM ,CPM5 , +CPM5_HOST1 , };/** * struct xilinx_cpm_variant - CPM variant information * @version: CPM version +* @ir_status: Offset for the error interrupt status register +* @ir_enable: Offset for the CPM5 local error interrupt enable register +* @ir_misc_value: A bitmask for the miscellaneous interrupt status */ struct xilinx_cpm_variant {enum xilinx_cpm_version version; +u32 ir_status; +u32 ir_enable; +u32 ir_misc_value; };/**
@@ -269,6 +279,7 @@ static void xilinx_cpm_pcie_event_flow(struct irq_desc *desc) {struct xilinx_cpm_pcie *port =irq_desc_get_handler_data (desc);struct irq_chip *chip =irq_desc_get_chip (desc); +const struct xilinx_cpm_variant *variant = port->variant;unsigned long val;int i;
@@ -279,11 +290,11 @@ static void xilinx_cpm_pcie_event_flow(struct irq_desc *desc)generic_handle_domain_irq (port->cpm_domain, i);pcie_write (port, val,XILINX_CPM_PCIE_REG_IDR ); -if (port->variant->version ==CPM5 ) { - val =readl_relaxed (port->cpm_base +XILINX_CPM_PCIE_IR_STATUS ); +if (variant->ir_status) { + val =readl_relaxed (port->cpm_base + variant->ir_status);if (val)writel_relaxed (val, port->cpm_base + -XILINX_CPM_PCIE_IR_STATUS ); + variant->ir_status); }/*
@@ -465,6 +476,8 @@ static int xilinx_cpm_setup_irq(struct xilinx_cpm_pcie *port)*/ static void xilinx_cpm_pcie_init_port (struct xilinx_cpm_pcie *port) { +const struct xilinx_cpm_variant *variant = port->variant; +if (cpm_pcie_link_up (port))dev_info (port->dev,"PCIe Link is UP\n" );else
@@ -483,15 +496,15 @@ static void xilinx_cpm_pcie_init_port(struct xilinx_cpm_pcie *port)* XILINX_CPM_PCIE_MISC_IR_ENABLE register is mapped to * CPM SLCR block. */ -writel (XILINX_CPM_PCIE_MISC_IR_LOCAL , +writel (variant->ir_misc_value, port->cpm_base +XILINX_CPM_PCIE_MISC_IR_ENABLE ); -if (port->variant->version ==CPM5 ) { +if (variant->ir_enable) {writel (XILINX_CPM_PCIE_IR_LOCAL , - port->cpm_base +XILINX_CPM_PCIE_IR_ENABLE ); + port->cpm_base + variant->ir_enable); } -/* Enable the Bridge enable bit */ +/* Set Bridge enable bit */ pcie_write (port,pcie_read (port,XILINX_CPM_PCIE_REG_RPSC ) |XILINX_CPM_PCIE_REG_RPSC_BEN ,XILINX_CPM_PCIE_REG_RPSC );
@@ -609,10 +622,21 @@ static int xilinx_cpm_pcie_probe(struct platform_device *pdev)static const struct xilinx_cpm_variant cpm_host = { .version =CPM , + .ir_misc_value =XILINX_CPM_PCIE0_MISC_IR_LOCAL , };static const struct xilinx_cpm_variant cpm5_host = { .version =CPM5 , + .ir_misc_value =XILINX_CPM_PCIE0_MISC_IR_LOCAL , + .ir_status =XILINX_CPM_PCIE0_IR_STATUS , + .ir_enable =XILINX_CPM_PCIE0_IR_ENABLE , +}; + +static const struct xilinx_cpm_variant cpm5_host1 = { + .version =CPM5_HOST1 , + .ir_misc_value =XILINX_CPM_PCIE1_MISC_IR_LOCAL , + .ir_status =XILINX_CPM_PCIE1_IR_STATUS , + .ir_enable =XILINX_CPM_PCIE1_IR_ENABLE , };static const struct of_device_id xilinx_cpm_pcie_of_match[] = {
@@ -624,6 +648,10 @@ static const struct of_device_id xilinx_cpm_pcie_of_match[] = { .compatible = "xlnx,versal-cpm5-host", .data = &cpm5_host, }, + { + .compatible = "xlnx,versal-cpm5-host1", + .data = &cpm5_host1, + }, {} };
Signature · 1 line
2.34.1
Re: [PATCH v3 2/2] PCI: xilinx-cpm: Add support for Versal CPM5 Root Port controller 1
Quoted 12 lines · Thippeswamy Havalige
Add support for the Xilinx Versal CPM5 Root Port Controller 1. The key difference between Controller 0 and Controller 1 lies in the platform-specific error interrupt bits, which are located at different register offsets.
To handle these differences, updated variant structure to hold the following platform-specific details:
- Interrupt status register offset (
ir_status)
- Interrupt enable register offset (ir_enable)
- Miscellaneous interrupt values (ir_misc_value)
Quoted 6 lines
The driver differentiates between Controller 0 and Controller 1 using the compatible string in the device tree. This ensures that the appropriate register offsets are used for each controller, allowing for correct handling of platform-specific interrupts and initialization.
Signed-off-by Thippeswamy Havalige <[email protected]>
- Mani
Quoted 151 lines
---
changes in v3:
--------------
1. Add kernel Documentation for variant structure.
2. Modify compatible string.
changes in v2:
--------------
1. Introduced new constants for Controller 1.
2. Extended thexilinx_cpm_variantstructure to support
a.ir_status,
b.ir_enable, and
c.ir_misc_valuefor different controllers.
3. Updated IRQ handling and initialization to use the variant structure.
4. Added a new device tree match entry for Controller 1.--- drivers/pci/controller/pcie-xilinx-cpm.c | 50 ++++++++++++++++++------ 1 file changed, 39 insertions(+), 11 deletions(-)drivers/pci/controller/pcie-xilinx-cpm.c +39
-11@@ -30,11 +30,14 @@#define XILINX_CPM_PCIE_REG_IDRN_MASK 0x00000E3C#define XILINX_CPM_PCIE_MISC_IR_STATUS 0x00000340#define XILINX_CPM_PCIE_MISC_IR_ENABLE 0x00000348 -#define XILINX_CPM_PCIE_MISC_IR_LOCAL BIT(1) +#define XILINX_CPM_PCIE0_MISC_IR_LOCAL BIT(1) +#define XILINX_CPM_PCIE1_MISC_IR_LOCAL BIT(2) -#define XILINX_CPM_PCIE_IR_STATUS 0x000002A0 -#define XILINX_CPM_PCIE_IR_ENABLE 0x000002A8 -#define XILINX_CPM_PCIE_IR_LOCAL BIT(0) +#define XILINX_CPM_PCIE0_IR_STATUS 0x000002A0 +#define XILINX_CPM_PCIE1_IR_STATUS 0x000002B4 +#define XILINX_CPM_PCIE0_IR_ENABLE 0x000002A8 +#define XILINX_CPM_PCIE1_IR_ENABLE 0x000002BC +#define XILINX_CPM_PCIE_IR_LOCAL BIT(0)#define IMR (x) BIT(XILINX_PCIE_INTR_ ##x)@@ -80,14 +83,21 @@enum xilinx_cpm_version {CPM ,CPM5 , +CPM5_HOST1 , };/** * struct xilinx_cpm_variant - CPM variant information * @version: CPM version +* @ir_status: Offset for the error interrupt status register +* @ir_enable: Offset for the CPM5 local error interrupt enable register +* @ir_misc_value: A bitmask for the miscellaneous interrupt status */ struct xilinx_cpm_variant {enum xilinx_cpm_version version; +u32 ir_status; +u32 ir_enable; +u32 ir_misc_value; };/** @@ -269,6 +279,7 @@ static void xilinx_cpm_pcie_event_flow(struct irq_desc *desc) {struct xilinx_cpm_pcie *port =irq_desc_get_handler_data (desc);struct irq_chip *chip =irq_desc_get_chip (desc); +const struct xilinx_cpm_variant *variant = port->variant;unsigned long val;int i;@@ -279,11 +290,11 @@ static void xilinx_cpm_pcie_event_flow(struct irq_desc *desc)generic_handle_domain_irq (port->cpm_domain, i);pcie_write (port, val,XILINX_CPM_PCIE_REG_IDR ); -if (port->variant->version ==CPM5 ) { - val =readl_relaxed (port->cpm_base +XILINX_CPM_PCIE_IR_STATUS ); +if (variant->ir_status) { + val =readl_relaxed (port->cpm_base + variant->ir_status);if (val)writel_relaxed (val, port->cpm_base + -XILINX_CPM_PCIE_IR_STATUS ); + variant->ir_status); }/* @@ -465,6 +476,8 @@ static int xilinx_cpm_setup_irq(struct xilinx_cpm_pcie *port)*/ static void xilinx_cpm_pcie_init_port (struct xilinx_cpm_pcie *port) { +const struct xilinx_cpm_variant *variant = port->variant; +if (cpm_pcie_link_up (port))dev_info (port->dev,"PCIe Link is UP\n" );else @@ -483,15 +496,15 @@ static void xilinx_cpm_pcie_init_port(struct xilinx_cpm_pcie *port)* XILINX_CPM_PCIE_MISC_IR_ENABLE register is mapped to * CPM SLCR block. */ -writel (XILINX_CPM_PCIE_MISC_IR_LOCAL , +writel (variant->ir_misc_value, port->cpm_base +XILINX_CPM_PCIE_MISC_IR_ENABLE ); -if (port->variant->version ==CPM5 ) { +if (variant->ir_enable) {writel (XILINX_CPM_PCIE_IR_LOCAL , - port->cpm_base +XILINX_CPM_PCIE_IR_ENABLE ); + port->cpm_base + variant->ir_enable); } -/* Enable the Bridge enable bit */ +/* Set Bridge enable bit */ pcie_write (port,pcie_read (port,XILINX_CPM_PCIE_REG_RPSC ) |XILINX_CPM_PCIE_REG_RPSC_BEN ,XILINX_CPM_PCIE_REG_RPSC );@@ -609,10 +622,21 @@ static int xilinx_cpm_pcie_probe(struct platform_device *pdev)static const struct xilinx_cpm_variant cpm_host = { .version =CPM , + .ir_misc_value =XILINX_CPM_PCIE0_MISC_IR_LOCAL , };static const struct xilinx_cpm_variant cpm5_host = { .version =CPM5 , + .ir_misc_value =XILINX_CPM_PCIE0_MISC_IR_LOCAL , + .ir_status =XILINX_CPM_PCIE0_IR_STATUS , + .ir_enable =XILINX_CPM_PCIE0_IR_ENABLE , +}; + +static const struct xilinx_cpm_variant cpm5_host1 = { + .version =CPM5_HOST1 , + .ir_misc_value =XILINX_CPM_PCIE1_MISC_IR_LOCAL , + .ir_status =XILINX_CPM_PCIE1_IR_STATUS , + .ir_enable =XILINX_CPM_PCIE1_IR_ENABLE , };static const struct of_device_id xilinx_cpm_pcie_of_match[] = {@@ -624,6 +648,10 @@ static const struct of_device_id xilinx_cpm_pcie_of_match[] = { .compatible = "xlnx,versal-cpm5-host", .data = &cpm5_host, }, + { + .compatible = "xlnx,versal-cpm5-host1", + .data = &cpm5_host1, + }, {} };Signature · 1 line
2.34.1
Signature · 1 line
மணிவண்ணன் சதாசிவம்
Krzysztof Wilczyński
AppliedHello,
Quoted 6 lines
This patch series introduces support for the second Root Port controller in the Xilinx Versal Premium CPM5 block. The Versal Premium platform features two Type-A Root Port controllers operating at Gen5 speed. However, the error interrupt registers and their corresponding bits are located at different offsets for Controller 0 and Controller 1.
Quoted 7 lines
To handle these differences, the series includes:
A new compatible string for the second Root Port controller in the device tree bindings.
Driver updates to manage platform-specific interrupt registers and offsets for both controllers using the new compatible string.
Applied to controller/xilinx-cpm, thank you!
[01/02] dt-bindings: PCI: xilinx-cpm: Add compatible string for CPM5 host1
https://git.kernel.org/pci/pci/c/5c911b4659d5
[02/02] PCI: xilinx-cpm: Add support for Versal CPM5 Root Port Controller 1
https://git.kernel.org/pci/pci/c/ Krzysztof