71
71
72
72
/* Phy Status/Control Register definitions */
73
73
#define XILINX_PCIE_DMA_REG_PSCR_LNKUP BIT(11)
74
+ #define QDMA_BRIDGE_BASE_OFF 0xcd8
74
75
75
76
/* Number of MSI IRQs */
76
77
#define XILINX_NUM_MSI_IRQS 64
77
78
79
+ enum xilinx_pl_dma_version {
80
+ XDMA ,
81
+ QDMA ,
82
+ };
83
+
84
+ /**
85
+ * struct xilinx_pl_dma_variant - PL DMA PCIe variant information
86
+ * @version: DMA version
87
+ */
88
+ struct xilinx_pl_dma_variant {
89
+ enum xilinx_pl_dma_version version ;
90
+ };
91
+
78
92
struct xilinx_msi {
79
93
struct irq_domain * msi_domain ;
80
94
unsigned long * bitmap ;
@@ -88,6 +102,7 @@ struct xilinx_msi {
88
102
* struct pl_dma_pcie - PCIe port information
89
103
* @dev: Device pointer
90
104
* @reg_base: IO Mapped Register Base
105
+ * @cfg_base: IO Mapped Configuration Base
91
106
* @irq: Interrupt number
92
107
* @cfg: Holds mappings of config space window
93
108
* @phys_reg_base: Physical address of reg base
@@ -97,10 +112,12 @@ struct xilinx_msi {
97
112
* @msi: MSI information
98
113
* @intx_irq: INTx error interrupt number
99
114
* @lock: Lock protecting shared register access
115
+ * @variant: PL DMA PCIe version check pointer
100
116
*/
101
117
struct pl_dma_pcie {
102
118
struct device * dev ;
103
119
void __iomem * reg_base ;
120
+ void __iomem * cfg_base ;
104
121
int irq ;
105
122
struct pci_config_window * cfg ;
106
123
phys_addr_t phys_reg_base ;
@@ -110,16 +127,23 @@ struct pl_dma_pcie {
110
127
struct xilinx_msi msi ;
111
128
int intx_irq ;
112
129
raw_spinlock_t lock ;
130
+ const struct xilinx_pl_dma_variant * variant ;
113
131
};
114
132
115
133
static inline u32 pcie_read (struct pl_dma_pcie * port , u32 reg )
116
134
{
135
+ if (port -> variant -> version == QDMA )
136
+ return readl (port -> reg_base + reg + QDMA_BRIDGE_BASE_OFF );
137
+
117
138
return readl (port -> reg_base + reg );
118
139
}
119
140
120
141
static inline void pcie_write (struct pl_dma_pcie * port , u32 val , u32 reg )
121
142
{
122
- writel (val , port -> reg_base + reg );
143
+ if (port -> variant -> version == QDMA )
144
+ writel (val , port -> reg_base + reg + QDMA_BRIDGE_BASE_OFF );
145
+ else
146
+ writel (val , port -> reg_base + reg );
123
147
}
124
148
125
149
static inline bool xilinx_pl_dma_pcie_link_up (struct pl_dma_pcie * port )
@@ -173,6 +197,9 @@ static void __iomem *xilinx_pl_dma_pcie_map_bus(struct pci_bus *bus,
173
197
if (!xilinx_pl_dma_pcie_valid_device (bus , devfn ))
174
198
return NULL ;
175
199
200
+ if (port -> variant -> version == QDMA )
201
+ return port -> cfg_base + PCIE_ECAM_OFFSET (bus -> number , devfn , where );
202
+
176
203
return port -> reg_base + PCIE_ECAM_OFFSET (bus -> number , devfn , where );
177
204
}
178
205
@@ -731,6 +758,15 @@ static int xilinx_pl_dma_pcie_parse_dt(struct pl_dma_pcie *port,
731
758
732
759
port -> reg_base = port -> cfg -> win ;
733
760
761
+ if (port -> variant -> version == QDMA ) {
762
+ port -> cfg_base = port -> cfg -> win ;
763
+ res = platform_get_resource_byname (pdev , IORESOURCE_MEM , "breg" );
764
+ port -> reg_base = devm_ioremap_resource (dev , res );
765
+ if (IS_ERR (port -> reg_base ))
766
+ return PTR_ERR (port -> reg_base );
767
+ port -> phys_reg_base = res -> start ;
768
+ }
769
+
734
770
err = xilinx_request_msi_irq (port );
735
771
if (err ) {
736
772
pci_ecam_free (port -> cfg );
@@ -760,6 +796,8 @@ static int xilinx_pl_dma_pcie_probe(struct platform_device *pdev)
760
796
if (!bus )
761
797
return - ENODEV ;
762
798
799
+ port -> variant = of_device_get_match_data (dev );
800
+
763
801
err = xilinx_pl_dma_pcie_parse_dt (port , bus -> res );
764
802
if (err ) {
765
803
dev_err (dev , "Parsing DT failed\n" );
@@ -791,9 +829,22 @@ static int xilinx_pl_dma_pcie_probe(struct platform_device *pdev)
791
829
return err ;
792
830
}
793
831
832
+ static const struct xilinx_pl_dma_variant xdma_host = {
833
+ .version = XDMA ,
834
+ };
835
+
836
+ static const struct xilinx_pl_dma_variant qdma_host = {
837
+ .version = QDMA ,
838
+ };
839
+
794
840
static const struct of_device_id xilinx_pl_dma_pcie_of_match [] = {
795
841
{
796
842
.compatible = "xlnx,xdma-host-3.00" ,
843
+ .data = & xdma_host ,
844
+ },
845
+ {
846
+ .compatible = "xlnx,qdma-host-3.00" ,
847
+ .data = & qdma_host ,
797
848
},
798
849
{}
799
850
};
0 commit comments