Skip to content

Commit 63503c8

Browse files
Jisheng Zhangbjorn-helgaas
authored andcommitted
PCI: designware: Consolidate outbound iATU programming functions
Currently, the outbound iATU programming functions are similar: the only difference is index, type, addr and size. Consolidate these functions into one. This saves about 1700 bytes in text: text data bss dec hex filename 9276 204 4 9484 250c pcie-designware.o-before 7532 204 4 7740 1e3c pcie-designware.o Signed-off-by: Jisheng Zhang <[email protected]> Signed-off-by: Bjorn Helgaas <[email protected]> Acked-by: Pratyush Anand <[email protected]>
1 parent 5b0f073 commit 63503c8

File tree

1 file changed

+39
-70
lines changed

1 file changed

+39
-70
lines changed

drivers/pci/host/pcie-designware.c

Lines changed: 39 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,21 @@ static int dw_pcie_wr_own_conf(struct pcie_port *pp, int where, int size,
152152
return ret;
153153
}
154154

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+
155170
static struct irq_chip dw_msi_irq_chip = {
156171
.name = "PCI-MSI",
157172
.irq_enable = pci_msi_unmask_irq,
@@ -517,68 +532,6 @@ int dw_pcie_host_init(struct pcie_port *pp)
517532
return 0;
518533
}
519534

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-
582535
static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus,
583536
u32 devfn, int where, int size, u32 *val)
584537
{
@@ -590,15 +543,23 @@ static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus,
590543
address = where & ~0x3;
591544

592545
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);
594549
ret = dw_pcie_cfg_read(pp->va_cfg0_base + address, where, size,
595550
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);
597554
} 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);
599558
ret = dw_pcie_cfg_read(pp->va_cfg1_base + address, where, size,
600559
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);
602563
}
603564

604565
return ret;
@@ -615,15 +576,23 @@ static int dw_pcie_wr_other_conf(struct pcie_port *pp, struct pci_bus *bus,
615576
address = where & ~0x3;
616577

617578
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);
619582
ret = dw_pcie_cfg_write(pp->va_cfg0_base + address, where, size,
620583
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);
622587
} 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);
624591
ret = dw_pcie_cfg_write(pp->va_cfg1_base + address, where, size,
625592
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);
627596
}
628597

629598
return ret;

0 commit comments

Comments
 (0)