25
25
#define MC_PCIE1_BRIDGE_ADDR 0x00008000u
26
26
#define MC_PCIE1_CTRL_ADDR 0x0000a000u
27
27
28
- #define MC_PCIE_BRIDGE_ADDR (MC_PCIE1_BRIDGE_ADDR)
29
- #define MC_PCIE_CTRL_ADDR (MC_PCIE1_CTRL_ADDR)
30
-
31
28
/* PCIe Controller Phy Regs */
32
29
#define SEC_ERROR_EVENT_CNT 0x20
33
30
#define DED_ERROR_EVENT_CNT 0x24
128
125
[EVENT_LOCAL_ ## x] = { __stringify(x), s }
129
126
130
127
#define PCIE_EVENT (x ) \
131
- .base = MC_PCIE_CTRL_ADDR, \
132
128
.offset = PCIE_EVENT_INT, \
133
129
.mask_offset = PCIE_EVENT_INT, \
134
130
.mask_high = 1, \
135
131
.mask = PCIE_EVENT_INT_ ## x ## _INT, \
136
132
.enb_mask = PCIE_EVENT_INT_ENB_MASK
137
133
138
134
#define SEC_EVENT (x ) \
139
- .base = MC_PCIE_CTRL_ADDR, \
140
135
.offset = SEC_ERROR_INT, \
141
136
.mask_offset = SEC_ERROR_INT_MASK, \
142
137
.mask = SEC_ERROR_INT_ ## x ## _INT, \
143
138
.mask_high = 1, \
144
139
.enb_mask = 0
145
140
146
141
#define DED_EVENT (x ) \
147
- .base = MC_PCIE_CTRL_ADDR, \
148
142
.offset = DED_ERROR_INT, \
149
143
.mask_offset = DED_ERROR_INT_MASK, \
150
144
.mask_high = 1, \
151
145
.mask = DED_ERROR_INT_ ## x ## _INT, \
152
146
.enb_mask = 0
153
147
154
148
#define LOCAL_EVENT (x ) \
155
- .base = MC_PCIE_BRIDGE_ADDR, \
156
149
.offset = ISTATUS_LOCAL, \
157
150
.mask_offset = IMASK_LOCAL, \
158
151
.mask_high = 0, \
@@ -179,7 +172,8 @@ struct event_map {
179
172
180
173
struct mc_pcie {
181
174
struct plda_pcie_rp plda ;
182
- void __iomem * axi_base_addr ;
175
+ void __iomem * bridge_base_addr ;
176
+ void __iomem * ctrl_base_addr ;
183
177
};
184
178
185
179
struct cause {
@@ -253,7 +247,6 @@ static struct event_map local_status_to_event[] = {
253
247
};
254
248
255
249
static struct {
256
- u32 base ;
257
250
u32 offset ;
258
251
u32 mask ;
259
252
u32 shift ;
@@ -325,8 +318,7 @@ static inline u32 reg_to_event(u32 reg, struct event_map field)
325
318
326
319
static u32 pcie_events (struct mc_pcie * port )
327
320
{
328
- void __iomem * ctrl_base_addr = port -> axi_base_addr + MC_PCIE_CTRL_ADDR ;
329
- u32 reg = readl_relaxed (ctrl_base_addr + PCIE_EVENT_INT );
321
+ u32 reg = readl_relaxed (port -> ctrl_base_addr + PCIE_EVENT_INT );
330
322
u32 val = 0 ;
331
323
int i ;
332
324
@@ -338,8 +330,7 @@ static u32 pcie_events(struct mc_pcie *port)
338
330
339
331
static u32 sec_errors (struct mc_pcie * port )
340
332
{
341
- void __iomem * ctrl_base_addr = port -> axi_base_addr + MC_PCIE_CTRL_ADDR ;
342
- u32 reg = readl_relaxed (ctrl_base_addr + SEC_ERROR_INT );
333
+ u32 reg = readl_relaxed (port -> ctrl_base_addr + SEC_ERROR_INT );
343
334
u32 val = 0 ;
344
335
int i ;
345
336
@@ -351,8 +342,7 @@ static u32 sec_errors(struct mc_pcie *port)
351
342
352
343
static u32 ded_errors (struct mc_pcie * port )
353
344
{
354
- void __iomem * ctrl_base_addr = port -> axi_base_addr + MC_PCIE_CTRL_ADDR ;
355
- u32 reg = readl_relaxed (ctrl_base_addr + DED_ERROR_INT );
345
+ u32 reg = readl_relaxed (port -> ctrl_base_addr + DED_ERROR_INT );
356
346
u32 val = 0 ;
357
347
int i ;
358
348
@@ -364,8 +354,7 @@ static u32 ded_errors(struct mc_pcie *port)
364
354
365
355
static u32 local_events (struct mc_pcie * port )
366
356
{
367
- void __iomem * bridge_base_addr = port -> axi_base_addr + MC_PCIE_BRIDGE_ADDR ;
368
- u32 reg = readl_relaxed (bridge_base_addr + ISTATUS_LOCAL );
357
+ u32 reg = readl_relaxed (port -> bridge_base_addr + ISTATUS_LOCAL );
369
358
u32 val = 0 ;
370
359
int i ;
371
360
@@ -412,8 +401,12 @@ static void mc_ack_event_irq(struct irq_data *data)
412
401
void __iomem * addr ;
413
402
u32 mask ;
414
403
415
- addr = mc_port -> axi_base_addr + event_descs [event ].base +
416
- event_descs [event ].offset ;
404
+ if (event_descs [event ].offset == ISTATUS_LOCAL )
405
+ addr = mc_port -> bridge_base_addr ;
406
+ else
407
+ addr = mc_port -> ctrl_base_addr ;
408
+
409
+ addr += event_descs [event ].offset ;
417
410
mask = event_descs [event ].mask ;
418
411
mask |= event_descs [event ].enb_mask ;
419
412
@@ -429,8 +422,12 @@ static void mc_mask_event_irq(struct irq_data *data)
429
422
u32 mask ;
430
423
u32 val ;
431
424
432
- addr = mc_port -> axi_base_addr + event_descs [event ].base +
433
- event_descs [event ].mask_offset ;
425
+ if (event_descs [event ].offset == ISTATUS_LOCAL )
426
+ addr = mc_port -> bridge_base_addr ;
427
+ else
428
+ addr = mc_port -> ctrl_base_addr ;
429
+
430
+ addr += event_descs [event ].mask_offset ;
434
431
mask = event_descs [event ].mask ;
435
432
if (event_descs [event ].enb_mask ) {
436
433
mask <<= PCIE_EVENT_INT_ENB_SHIFT ;
@@ -460,8 +457,12 @@ static void mc_unmask_event_irq(struct irq_data *data)
460
457
u32 mask ;
461
458
u32 val ;
462
459
463
- addr = mc_port -> axi_base_addr + event_descs [event ].base +
464
- event_descs [event ].mask_offset ;
460
+ if (event_descs [event ].offset == ISTATUS_LOCAL )
461
+ addr = mc_port -> bridge_base_addr ;
462
+ else
463
+ addr = mc_port -> ctrl_base_addr ;
464
+
465
+ addr += event_descs [event ].mask_offset ;
465
466
mask = event_descs [event ].mask ;
466
467
467
468
if (event_descs [event ].enb_mask )
@@ -554,49 +555,43 @@ static const struct plda_event mc_event = {
554
555
555
556
static inline void mc_clear_secs (struct mc_pcie * port )
556
557
{
557
- void __iomem * ctrl_base_addr = port -> axi_base_addr + MC_PCIE_CTRL_ADDR ;
558
-
559
- writel_relaxed (SEC_ERROR_INT_ALL_RAM_SEC_ERR_INT , ctrl_base_addr +
560
- SEC_ERROR_INT );
561
- writel_relaxed (0 , ctrl_base_addr + SEC_ERROR_EVENT_CNT );
558
+ writel_relaxed (SEC_ERROR_INT_ALL_RAM_SEC_ERR_INT ,
559
+ port -> ctrl_base_addr + SEC_ERROR_INT );
560
+ writel_relaxed (0 , port -> ctrl_base_addr + SEC_ERROR_EVENT_CNT );
562
561
}
563
562
564
563
static inline void mc_clear_deds (struct mc_pcie * port )
565
564
{
566
- void __iomem * ctrl_base_addr = port -> axi_base_addr + MC_PCIE_CTRL_ADDR ;
567
-
568
- writel_relaxed (DED_ERROR_INT_ALL_RAM_DED_ERR_INT , ctrl_base_addr +
569
- DED_ERROR_INT );
570
- writel_relaxed (0 , ctrl_base_addr + DED_ERROR_EVENT_CNT );
565
+ writel_relaxed (DED_ERROR_INT_ALL_RAM_DED_ERR_INT ,
566
+ port -> ctrl_base_addr + DED_ERROR_INT );
567
+ writel_relaxed (0 , port -> ctrl_base_addr + DED_ERROR_EVENT_CNT );
571
568
}
572
569
573
570
static void mc_disable_interrupts (struct mc_pcie * port )
574
571
{
575
- void __iomem * bridge_base_addr = port -> axi_base_addr + MC_PCIE_BRIDGE_ADDR ;
576
- void __iomem * ctrl_base_addr = port -> axi_base_addr + MC_PCIE_CTRL_ADDR ;
577
572
u32 val ;
578
573
579
574
/* Ensure ECC bypass is enabled */
580
575
val = ECC_CONTROL_TX_RAM_ECC_BYPASS |
581
576
ECC_CONTROL_RX_RAM_ECC_BYPASS |
582
577
ECC_CONTROL_PCIE2AXI_RAM_ECC_BYPASS |
583
578
ECC_CONTROL_AXI2PCIE_RAM_ECC_BYPASS ;
584
- writel_relaxed (val , ctrl_base_addr + ECC_CONTROL );
579
+ writel_relaxed (val , port -> ctrl_base_addr + ECC_CONTROL );
585
580
586
581
/* Disable SEC errors and clear any outstanding */
587
- writel_relaxed (SEC_ERROR_INT_ALL_RAM_SEC_ERR_INT , ctrl_base_addr +
588
- SEC_ERROR_INT_MASK );
582
+ writel_relaxed (SEC_ERROR_INT_ALL_RAM_SEC_ERR_INT ,
583
+ port -> ctrl_base_addr + SEC_ERROR_INT_MASK );
589
584
mc_clear_secs (port );
590
585
591
586
/* Disable DED errors and clear any outstanding */
592
- writel_relaxed (DED_ERROR_INT_ALL_RAM_DED_ERR_INT , ctrl_base_addr +
593
- DED_ERROR_INT_MASK );
587
+ writel_relaxed (DED_ERROR_INT_ALL_RAM_DED_ERR_INT ,
588
+ port -> ctrl_base_addr + DED_ERROR_INT_MASK );
594
589
mc_clear_deds (port );
595
590
596
591
/* Disable local interrupts and clear any outstanding */
597
- writel_relaxed (0 , bridge_base_addr + IMASK_LOCAL );
598
- writel_relaxed (GENMASK (31 , 0 ), bridge_base_addr + ISTATUS_LOCAL );
599
- writel_relaxed (GENMASK (31 , 0 ), bridge_base_addr + ISTATUS_MSI );
592
+ writel_relaxed (0 , port -> bridge_base_addr + IMASK_LOCAL );
593
+ writel_relaxed (GENMASK (31 , 0 ), port -> bridge_base_addr + ISTATUS_LOCAL );
594
+ writel_relaxed (GENMASK (31 , 0 ), port -> bridge_base_addr + ISTATUS_MSI );
600
595
601
596
/* Disable PCIe events and clear any outstanding */
602
597
val = PCIE_EVENT_INT_L2_EXIT_INT |
@@ -605,24 +600,22 @@ static void mc_disable_interrupts(struct mc_pcie *port)
605
600
PCIE_EVENT_INT_L2_EXIT_INT_MASK |
606
601
PCIE_EVENT_INT_HOTRST_EXIT_INT_MASK |
607
602
PCIE_EVENT_INT_DLUP_EXIT_INT_MASK ;
608
- writel_relaxed (val , ctrl_base_addr + PCIE_EVENT_INT );
603
+ writel_relaxed (val , port -> ctrl_base_addr + PCIE_EVENT_INT );
609
604
610
605
/* Disable host interrupts and clear any outstanding */
611
- writel_relaxed (0 , bridge_base_addr + IMASK_HOST );
612
- writel_relaxed (GENMASK (31 , 0 ), bridge_base_addr + ISTATUS_HOST );
606
+ writel_relaxed (0 , port -> bridge_base_addr + IMASK_HOST );
607
+ writel_relaxed (GENMASK (31 , 0 ), port -> bridge_base_addr + ISTATUS_HOST );
613
608
}
614
609
615
610
static int mc_platform_init (struct pci_config_window * cfg )
616
611
{
617
612
struct device * dev = cfg -> parent ;
618
613
struct platform_device * pdev = to_platform_device (dev );
619
614
struct pci_host_bridge * bridge = platform_get_drvdata (pdev );
620
- void __iomem * bridge_base_addr =
621
- port -> axi_base_addr + MC_PCIE_BRIDGE_ADDR ;
622
615
int ret ;
623
616
624
617
/* Configure address translation table 0 for PCIe config space */
625
- plda_pcie_setup_window (bridge_base_addr , 0 , cfg -> res .start ,
618
+ plda_pcie_setup_window (port -> bridge_base_addr , 0 , cfg -> res .start ,
626
619
cfg -> res .start ,
627
620
resource_size (& cfg -> res ));
628
621
@@ -649,7 +642,7 @@ static int mc_platform_init(struct pci_config_window *cfg)
649
642
static int mc_host_probe (struct platform_device * pdev )
650
643
{
651
644
struct device * dev = & pdev -> dev ;
652
- void __iomem * bridge_base_addr ;
645
+ void __iomem * apb_base_addr ;
653
646
struct plda_pcie_rp * plda ;
654
647
int ret ;
655
648
u32 val ;
@@ -661,30 +654,45 @@ static int mc_host_probe(struct platform_device *pdev)
661
654
plda = & port -> plda ;
662
655
plda -> dev = dev ;
663
656
664
- port -> axi_base_addr = devm_platform_ioremap_resource (pdev , 1 );
665
- if (IS_ERR (port -> axi_base_addr ))
666
- return PTR_ERR (port -> axi_base_addr );
657
+ port -> bridge_base_addr = devm_platform_ioremap_resource_byname (pdev ,
658
+ "bridge" );
659
+ port -> ctrl_base_addr = devm_platform_ioremap_resource_byname (pdev ,
660
+ "ctrl" );
661
+ if (!IS_ERR (port -> bridge_base_addr ) && !IS_ERR (port -> ctrl_base_addr ))
662
+ goto addrs_set ;
663
+
664
+ /*
665
+ * The original, incorrect, binding that lumped the control and
666
+ * bridge addresses together still needs to be handled by the driver.
667
+ */
668
+ apb_base_addr = devm_platform_ioremap_resource_byname (pdev , "apb" );
669
+ if (IS_ERR (apb_base_addr ))
670
+ return dev_err_probe (dev , PTR_ERR (apb_base_addr ),
671
+ "both legacy apb register and ctrl/bridge regions missing" );
672
+
673
+ port -> bridge_base_addr = apb_base_addr + MC_PCIE1_BRIDGE_ADDR ;
674
+ port -> ctrl_base_addr = apb_base_addr + MC_PCIE1_CTRL_ADDR ;
667
675
676
+ addrs_set :
668
677
mc_disable_interrupts (port );
669
678
670
- bridge_base_addr = port -> axi_base_addr + MC_PCIE_BRIDGE_ADDR ;
671
- plda -> bridge_addr = bridge_base_addr ;
679
+ plda -> bridge_addr = port -> bridge_base_addr ;
672
680
plda -> num_events = NUM_EVENTS ;
673
681
674
682
/* Allow enabling MSI by disabling MSI-X */
675
- val = readl (bridge_base_addr + PCIE_PCI_IRQ_DW0 );
683
+ val = readl (port -> bridge_base_addr + PCIE_PCI_IRQ_DW0 );
676
684
val &= ~MSIX_CAP_MASK ;
677
- writel (val , bridge_base_addr + PCIE_PCI_IRQ_DW0 );
685
+ writel (val , port -> bridge_base_addr + PCIE_PCI_IRQ_DW0 );
678
686
679
687
/* Pick num vectors from bitfile programmed onto FPGA fabric */
680
- val = readl (bridge_base_addr + PCIE_PCI_IRQ_DW0 );
688
+ val = readl (port -> bridge_base_addr + PCIE_PCI_IRQ_DW0 );
681
689
val &= NUM_MSI_MSGS_MASK ;
682
690
val >>= NUM_MSI_MSGS_SHIFT ;
683
691
684
692
plda -> msi .num_vectors = 1 << val ;
685
693
686
694
/* Pick vector address from design */
687
- plda -> msi .vector_phy = readl_relaxed (bridge_base_addr + IMSI_ADDR );
695
+ plda -> msi .vector_phy = readl_relaxed (port -> bridge_base_addr + IMSI_ADDR );
688
696
689
697
ret = mc_pcie_init_clks (dev );
690
698
if (ret ) {
0 commit comments