@@ -152,6 +152,21 @@ static int dw_pcie_wr_own_conf(struct pcie_port *pp, int where, int size,
152
152
return ret ;
153
153
}
154
154
155
+ static void dw_pcie_prog_outbound_atu (struct pcie_port * pp , int index ,
156
+ int type , u64 cpu_addr , u64 pci_addr , u32 size )
157
+ {
158
+ dw_pcie_writel_rc (pp , PCIE_ATU_REGION_OUTBOUND | index ,
159
+ PCIE_ATU_VIEWPORT );
160
+ dw_pcie_writel_rc (pp , lower_32_bits (cpu_addr ), PCIE_ATU_LOWER_BASE );
161
+ dw_pcie_writel_rc (pp , upper_32_bits (cpu_addr ), PCIE_ATU_UPPER_BASE );
162
+ dw_pcie_writel_rc (pp , lower_32_bits (cpu_addr + size - 1 ),
163
+ PCIE_ATU_LIMIT );
164
+ dw_pcie_writel_rc (pp , lower_32_bits (pci_addr ), PCIE_ATU_LOWER_TARGET );
165
+ dw_pcie_writel_rc (pp , upper_32_bits (pci_addr ), PCIE_ATU_UPPER_TARGET );
166
+ dw_pcie_writel_rc (pp , type , PCIE_ATU_CR1 );
167
+ dw_pcie_writel_rc (pp , PCIE_ATU_ENABLE , PCIE_ATU_CR2 );
168
+ }
169
+
155
170
static struct irq_chip dw_msi_irq_chip = {
156
171
.name = "PCI-MSI" ,
157
172
.irq_enable = pci_msi_unmask_irq ,
@@ -517,68 +532,6 @@ int dw_pcie_host_init(struct pcie_port *pp)
517
532
return 0 ;
518
533
}
519
534
520
- static void dw_pcie_prog_viewport_cfg0 (struct pcie_port * pp , u32 busdev )
521
- {
522
- /* Program viewport 0 : OUTBOUND : CFG0 */
523
- dw_pcie_writel_rc (pp , PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0 ,
524
- PCIE_ATU_VIEWPORT );
525
- dw_pcie_writel_rc (pp , pp -> cfg0_mod_base , PCIE_ATU_LOWER_BASE );
526
- dw_pcie_writel_rc (pp , (pp -> cfg0_mod_base >> 32 ), PCIE_ATU_UPPER_BASE );
527
- dw_pcie_writel_rc (pp , pp -> cfg0_mod_base + pp -> cfg0_size - 1 ,
528
- PCIE_ATU_LIMIT );
529
- dw_pcie_writel_rc (pp , busdev , PCIE_ATU_LOWER_TARGET );
530
- dw_pcie_writel_rc (pp , 0 , PCIE_ATU_UPPER_TARGET );
531
- dw_pcie_writel_rc (pp , PCIE_ATU_TYPE_CFG0 , PCIE_ATU_CR1 );
532
- dw_pcie_writel_rc (pp , PCIE_ATU_ENABLE , PCIE_ATU_CR2 );
533
- }
534
-
535
- static void dw_pcie_prog_viewport_cfg1 (struct pcie_port * pp , u32 busdev )
536
- {
537
- /* Program viewport 1 : OUTBOUND : CFG1 */
538
- dw_pcie_writel_rc (pp , PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1 ,
539
- PCIE_ATU_VIEWPORT );
540
- dw_pcie_writel_rc (pp , PCIE_ATU_TYPE_CFG1 , PCIE_ATU_CR1 );
541
- dw_pcie_writel_rc (pp , pp -> cfg1_mod_base , PCIE_ATU_LOWER_BASE );
542
- dw_pcie_writel_rc (pp , (pp -> cfg1_mod_base >> 32 ), PCIE_ATU_UPPER_BASE );
543
- dw_pcie_writel_rc (pp , pp -> cfg1_mod_base + pp -> cfg1_size - 1 ,
544
- PCIE_ATU_LIMIT );
545
- dw_pcie_writel_rc (pp , busdev , PCIE_ATU_LOWER_TARGET );
546
- dw_pcie_writel_rc (pp , 0 , PCIE_ATU_UPPER_TARGET );
547
- dw_pcie_writel_rc (pp , PCIE_ATU_ENABLE , PCIE_ATU_CR2 );
548
- }
549
-
550
- static void dw_pcie_prog_viewport_mem_outbound (struct pcie_port * pp )
551
- {
552
- /* Program viewport 0 : OUTBOUND : MEM */
553
- dw_pcie_writel_rc (pp , PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0 ,
554
- PCIE_ATU_VIEWPORT );
555
- dw_pcie_writel_rc (pp , PCIE_ATU_TYPE_MEM , PCIE_ATU_CR1 );
556
- dw_pcie_writel_rc (pp , pp -> mem_mod_base , PCIE_ATU_LOWER_BASE );
557
- dw_pcie_writel_rc (pp , (pp -> mem_mod_base >> 32 ), PCIE_ATU_UPPER_BASE );
558
- dw_pcie_writel_rc (pp , pp -> mem_mod_base + pp -> mem_size - 1 ,
559
- PCIE_ATU_LIMIT );
560
- dw_pcie_writel_rc (pp , pp -> mem_bus_addr , PCIE_ATU_LOWER_TARGET );
561
- dw_pcie_writel_rc (pp , upper_32_bits (pp -> mem_bus_addr ),
562
- PCIE_ATU_UPPER_TARGET );
563
- dw_pcie_writel_rc (pp , PCIE_ATU_ENABLE , PCIE_ATU_CR2 );
564
- }
565
-
566
- static void dw_pcie_prog_viewport_io_outbound (struct pcie_port * pp )
567
- {
568
- /* Program viewport 1 : OUTBOUND : IO */
569
- dw_pcie_writel_rc (pp , PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1 ,
570
- PCIE_ATU_VIEWPORT );
571
- dw_pcie_writel_rc (pp , PCIE_ATU_TYPE_IO , PCIE_ATU_CR1 );
572
- dw_pcie_writel_rc (pp , pp -> io_mod_base , PCIE_ATU_LOWER_BASE );
573
- dw_pcie_writel_rc (pp , (pp -> io_mod_base >> 32 ), PCIE_ATU_UPPER_BASE );
574
- dw_pcie_writel_rc (pp , pp -> io_mod_base + pp -> io_size - 1 ,
575
- PCIE_ATU_LIMIT );
576
- dw_pcie_writel_rc (pp , pp -> io_bus_addr , PCIE_ATU_LOWER_TARGET );
577
- dw_pcie_writel_rc (pp , upper_32_bits (pp -> io_bus_addr ),
578
- PCIE_ATU_UPPER_TARGET );
579
- dw_pcie_writel_rc (pp , PCIE_ATU_ENABLE , PCIE_ATU_CR2 );
580
- }
581
-
582
535
static int dw_pcie_rd_other_conf (struct pcie_port * pp , struct pci_bus * bus ,
583
536
u32 devfn , int where , int size , u32 * val )
584
537
{
@@ -590,15 +543,23 @@ static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus,
590
543
address = where & ~0x3 ;
591
544
592
545
if (bus -> parent -> number == pp -> root_bus_nr ) {
593
- dw_pcie_prog_viewport_cfg0 (pp , busdev );
546
+ dw_pcie_prog_outbound_atu (pp , PCIE_ATU_REGION_INDEX0 ,
547
+ PCIE_ATU_TYPE_CFG0 , pp -> cfg0_mod_base ,
548
+ busdev , pp -> cfg0_size );
594
549
ret = dw_pcie_cfg_read (pp -> va_cfg0_base + address , where , size ,
595
550
val );
596
- dw_pcie_prog_viewport_mem_outbound (pp );
551
+ dw_pcie_prog_outbound_atu (pp , PCIE_ATU_REGION_INDEX0 ,
552
+ PCIE_ATU_TYPE_MEM , pp -> mem_mod_base ,
553
+ pp -> mem_bus_addr , pp -> mem_size );
597
554
} else {
598
- dw_pcie_prog_viewport_cfg1 (pp , busdev );
555
+ dw_pcie_prog_outbound_atu (pp , PCIE_ATU_REGION_INDEX1 ,
556
+ PCIE_ATU_TYPE_CFG1 , pp -> cfg1_mod_base ,
557
+ busdev , pp -> cfg1_size );
599
558
ret = dw_pcie_cfg_read (pp -> va_cfg1_base + address , where , size ,
600
559
val );
601
- dw_pcie_prog_viewport_io_outbound (pp );
560
+ dw_pcie_prog_outbound_atu (pp , PCIE_ATU_REGION_INDEX1 ,
561
+ PCIE_ATU_TYPE_IO , pp -> io_mod_base ,
562
+ pp -> io_bus_addr , pp -> io_size );
602
563
}
603
564
604
565
return ret ;
@@ -615,15 +576,23 @@ static int dw_pcie_wr_other_conf(struct pcie_port *pp, struct pci_bus *bus,
615
576
address = where & ~0x3 ;
616
577
617
578
if (bus -> parent -> number == pp -> root_bus_nr ) {
618
- dw_pcie_prog_viewport_cfg0 (pp , busdev );
579
+ dw_pcie_prog_outbound_atu (pp , PCIE_ATU_REGION_INDEX0 ,
580
+ PCIE_ATU_TYPE_CFG0 , pp -> cfg0_mod_base ,
581
+ busdev , pp -> cfg0_size );
619
582
ret = dw_pcie_cfg_write (pp -> va_cfg0_base + address , where , size ,
620
583
val );
621
- dw_pcie_prog_viewport_mem_outbound (pp );
584
+ dw_pcie_prog_outbound_atu (pp , PCIE_ATU_REGION_INDEX0 ,
585
+ PCIE_ATU_TYPE_MEM , pp -> mem_mod_base ,
586
+ pp -> mem_bus_addr , pp -> mem_size );
622
587
} else {
623
- dw_pcie_prog_viewport_cfg1 (pp , busdev );
588
+ dw_pcie_prog_outbound_atu (pp , PCIE_ATU_REGION_INDEX1 ,
589
+ PCIE_ATU_TYPE_CFG1 , pp -> cfg1_mod_base ,
590
+ busdev , pp -> cfg1_size );
624
591
ret = dw_pcie_cfg_write (pp -> va_cfg1_base + address , where , size ,
625
592
val );
626
- dw_pcie_prog_viewport_io_outbound (pp );
593
+ dw_pcie_prog_outbound_atu (pp , PCIE_ATU_REGION_INDEX1 ,
594
+ PCIE_ATU_TYPE_IO , pp -> io_mod_base ,
595
+ pp -> io_bus_addr , pp -> io_size );
627
596
}
628
597
629
598
return ret ;
0 commit comments