diff options
-rw-r--r-- | drivers/pci/host/pcie-designware.c | 135 |
1 files changed, 55 insertions, 80 deletions
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index 77b0c257f215..c10e9ac9bbbc 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c | |||
@@ -99,22 +99,20 @@ int cfg_write(void __iomem *addr, int where, int size, u32 val) | |||
99 | return PCIBIOS_SUCCESSFUL; | 99 | return PCIBIOS_SUCCESSFUL; |
100 | } | 100 | } |
101 | 101 | ||
102 | static inline void dw_pcie_readl_rc(struct pcie_port *pp, | 102 | static inline void dw_pcie_readl_rc(struct pcie_port *pp, u32 reg, u32 *val) |
103 | void __iomem *dbi_addr, u32 *val) | ||
104 | { | 103 | { |
105 | if (pp->ops->readl_rc) | 104 | if (pp->ops->readl_rc) |
106 | pp->ops->readl_rc(pp, dbi_addr, val); | 105 | pp->ops->readl_rc(pp, pp->dbi_base + reg, val); |
107 | else | 106 | else |
108 | *val = readl(dbi_addr); | 107 | *val = readl(pp->dbi_base + reg); |
109 | } | 108 | } |
110 | 109 | ||
111 | static inline void dw_pcie_writel_rc(struct pcie_port *pp, | 110 | static inline void dw_pcie_writel_rc(struct pcie_port *pp, u32 val, u32 reg) |
112 | u32 val, void __iomem *dbi_addr) | ||
113 | { | 111 | { |
114 | if (pp->ops->writel_rc) | 112 | if (pp->ops->writel_rc) |
115 | pp->ops->writel_rc(pp, val, dbi_addr); | 113 | pp->ops->writel_rc(pp, val, pp->dbi_base + reg); |
116 | else | 114 | else |
117 | writel(val, dbi_addr); | 115 | writel(val, pp->dbi_base + reg); |
118 | } | 116 | } |
119 | 117 | ||
120 | int dw_pcie_rd_own_conf(struct pcie_port *pp, int where, int size, | 118 | int dw_pcie_rd_own_conf(struct pcie_port *pp, int where, int size, |
@@ -251,86 +249,64 @@ int __init dw_pcie_host_init(struct pcie_port *pp) | |||
251 | 249 | ||
252 | static void dw_pcie_prog_viewport_cfg0(struct pcie_port *pp, u32 busdev) | 250 | static void dw_pcie_prog_viewport_cfg0(struct pcie_port *pp, u32 busdev) |
253 | { | 251 | { |
254 | u32 val; | ||
255 | void __iomem *dbi_base = pp->dbi_base; | ||
256 | |||
257 | /* Program viewport 0 : OUTBOUND : CFG0 */ | 252 | /* Program viewport 0 : OUTBOUND : CFG0 */ |
258 | val = PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0; | 253 | dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0, |
259 | dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_VIEWPORT); | 254 | PCIE_ATU_VIEWPORT); |
260 | dw_pcie_writel_rc(pp, pp->cfg0_base, dbi_base + PCIE_ATU_LOWER_BASE); | 255 | dw_pcie_writel_rc(pp, pp->cfg0_base, PCIE_ATU_LOWER_BASE); |
261 | dw_pcie_writel_rc(pp, (pp->cfg0_base >> 32), | 256 | dw_pcie_writel_rc(pp, (pp->cfg0_base >> 32), PCIE_ATU_UPPER_BASE); |
262 | dbi_base + PCIE_ATU_UPPER_BASE); | ||
263 | dw_pcie_writel_rc(pp, pp->cfg0_base + pp->config.cfg0_size - 1, | 257 | dw_pcie_writel_rc(pp, pp->cfg0_base + pp->config.cfg0_size - 1, |
264 | dbi_base + PCIE_ATU_LIMIT); | 258 | PCIE_ATU_LIMIT); |
265 | dw_pcie_writel_rc(pp, busdev, dbi_base + PCIE_ATU_LOWER_TARGET); | 259 | dw_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET); |
266 | dw_pcie_writel_rc(pp, 0, dbi_base + PCIE_ATU_UPPER_TARGET); | 260 | dw_pcie_writel_rc(pp, 0, PCIE_ATU_UPPER_TARGET); |
267 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG0, dbi_base + PCIE_ATU_CR1); | 261 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG0, PCIE_ATU_CR1); |
268 | val = PCIE_ATU_ENABLE; | 262 | dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2); |
269 | dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_CR2); | ||
270 | } | 263 | } |
271 | 264 | ||
272 | static void dw_pcie_prog_viewport_cfg1(struct pcie_port *pp, u32 busdev) | 265 | static void dw_pcie_prog_viewport_cfg1(struct pcie_port *pp, u32 busdev) |
273 | { | 266 | { |
274 | u32 val; | ||
275 | void __iomem *dbi_base = pp->dbi_base; | ||
276 | |||
277 | /* Program viewport 1 : OUTBOUND : CFG1 */ | 267 | /* Program viewport 1 : OUTBOUND : CFG1 */ |
278 | val = PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1; | 268 | dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1, |
279 | dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_VIEWPORT); | 269 | PCIE_ATU_VIEWPORT); |
280 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG1, dbi_base + PCIE_ATU_CR1); | 270 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG1, PCIE_ATU_CR1); |
281 | val = PCIE_ATU_ENABLE; | 271 | dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2); |
282 | dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_CR2); | 272 | dw_pcie_writel_rc(pp, pp->cfg1_base, PCIE_ATU_LOWER_BASE); |
283 | dw_pcie_writel_rc(pp, pp->cfg1_base, dbi_base + PCIE_ATU_LOWER_BASE); | 273 | dw_pcie_writel_rc(pp, (pp->cfg1_base >> 32), PCIE_ATU_UPPER_BASE); |
284 | dw_pcie_writel_rc(pp, (pp->cfg1_base >> 32), | ||
285 | dbi_base + PCIE_ATU_UPPER_BASE); | ||
286 | dw_pcie_writel_rc(pp, pp->cfg1_base + pp->config.cfg1_size - 1, | 274 | dw_pcie_writel_rc(pp, pp->cfg1_base + pp->config.cfg1_size - 1, |
287 | dbi_base + PCIE_ATU_LIMIT); | 275 | PCIE_ATU_LIMIT); |
288 | dw_pcie_writel_rc(pp, busdev, dbi_base + PCIE_ATU_LOWER_TARGET); | 276 | dw_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET); |
289 | dw_pcie_writel_rc(pp, 0, dbi_base + PCIE_ATU_UPPER_TARGET); | 277 | dw_pcie_writel_rc(pp, 0, PCIE_ATU_UPPER_TARGET); |
290 | } | 278 | } |
291 | 279 | ||
292 | static void dw_pcie_prog_viewport_mem_outbound(struct pcie_port *pp) | 280 | static void dw_pcie_prog_viewport_mem_outbound(struct pcie_port *pp) |
293 | { | 281 | { |
294 | u32 val; | ||
295 | void __iomem *dbi_base = pp->dbi_base; | ||
296 | |||
297 | /* Program viewport 0 : OUTBOUND : MEM */ | 282 | /* Program viewport 0 : OUTBOUND : MEM */ |
298 | val = PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0; | 283 | dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0, |
299 | dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_VIEWPORT); | 284 | PCIE_ATU_VIEWPORT); |
300 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_MEM, dbi_base + PCIE_ATU_CR1); | 285 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_MEM, PCIE_ATU_CR1); |
301 | val = PCIE_ATU_ENABLE; | 286 | dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2); |
302 | dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_CR2); | 287 | dw_pcie_writel_rc(pp, pp->mem_base, PCIE_ATU_LOWER_BASE); |
303 | dw_pcie_writel_rc(pp, pp->mem_base, dbi_base + PCIE_ATU_LOWER_BASE); | 288 | dw_pcie_writel_rc(pp, (pp->mem_base >> 32), PCIE_ATU_UPPER_BASE); |
304 | dw_pcie_writel_rc(pp, (pp->mem_base >> 32), | ||
305 | dbi_base + PCIE_ATU_UPPER_BASE); | ||
306 | dw_pcie_writel_rc(pp, pp->mem_base + pp->config.mem_size - 1, | 289 | dw_pcie_writel_rc(pp, pp->mem_base + pp->config.mem_size - 1, |
307 | dbi_base + PCIE_ATU_LIMIT); | 290 | PCIE_ATU_LIMIT); |
308 | dw_pcie_writel_rc(pp, pp->config.mem_bus_addr, | 291 | dw_pcie_writel_rc(pp, pp->config.mem_bus_addr, PCIE_ATU_LOWER_TARGET); |
309 | dbi_base + PCIE_ATU_LOWER_TARGET); | ||
310 | dw_pcie_writel_rc(pp, upper_32_bits(pp->config.mem_bus_addr), | 292 | dw_pcie_writel_rc(pp, upper_32_bits(pp->config.mem_bus_addr), |
311 | dbi_base + PCIE_ATU_UPPER_TARGET); | 293 | PCIE_ATU_UPPER_TARGET); |
312 | } | 294 | } |
313 | 295 | ||
314 | static void dw_pcie_prog_viewport_io_outbound(struct pcie_port *pp) | 296 | static void dw_pcie_prog_viewport_io_outbound(struct pcie_port *pp) |
315 | { | 297 | { |
316 | u32 val; | ||
317 | void __iomem *dbi_base = pp->dbi_base; | ||
318 | |||
319 | /* Program viewport 1 : OUTBOUND : IO */ | 298 | /* Program viewport 1 : OUTBOUND : IO */ |
320 | val = PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1; | 299 | dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1, |
321 | dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_VIEWPORT); | 300 | PCIE_ATU_VIEWPORT); |
322 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_IO, dbi_base + PCIE_ATU_CR1); | 301 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_IO, PCIE_ATU_CR1); |
323 | val = PCIE_ATU_ENABLE; | 302 | dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2); |
324 | dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_CR2); | 303 | dw_pcie_writel_rc(pp, pp->io_base, PCIE_ATU_LOWER_BASE); |
325 | dw_pcie_writel_rc(pp, pp->io_base, dbi_base + PCIE_ATU_LOWER_BASE); | 304 | dw_pcie_writel_rc(pp, (pp->io_base >> 32), PCIE_ATU_UPPER_BASE); |
326 | dw_pcie_writel_rc(pp, (pp->io_base >> 32), | ||
327 | dbi_base + PCIE_ATU_UPPER_BASE); | ||
328 | dw_pcie_writel_rc(pp, pp->io_base + pp->config.io_size - 1, | 305 | dw_pcie_writel_rc(pp, pp->io_base + pp->config.io_size - 1, |
329 | dbi_base + PCIE_ATU_LIMIT); | 306 | PCIE_ATU_LIMIT); |
330 | dw_pcie_writel_rc(pp, pp->config.io_bus_addr, | 307 | dw_pcie_writel_rc(pp, pp->config.io_bus_addr, PCIE_ATU_LOWER_TARGET); |
331 | dbi_base + PCIE_ATU_LOWER_TARGET); | ||
332 | dw_pcie_writel_rc(pp, upper_32_bits(pp->config.io_bus_addr), | 308 | dw_pcie_writel_rc(pp, upper_32_bits(pp->config.io_bus_addr), |
333 | dbi_base + PCIE_ATU_UPPER_TARGET); | 309 | PCIE_ATU_UPPER_TARGET); |
334 | } | 310 | } |
335 | 311 | ||
336 | static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus, | 312 | static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus, |
@@ -518,13 +494,12 @@ static struct hw_pci dw_pci = { | |||
518 | void dw_pcie_setup_rc(struct pcie_port *pp) | 494 | void dw_pcie_setup_rc(struct pcie_port *pp) |
519 | { | 495 | { |
520 | struct pcie_port_info *config = &pp->config; | 496 | struct pcie_port_info *config = &pp->config; |
521 | void __iomem *dbi_base = pp->dbi_base; | ||
522 | u32 val; | 497 | u32 val; |
523 | u32 membase; | 498 | u32 membase; |
524 | u32 memlimit; | 499 | u32 memlimit; |
525 | 500 | ||
526 | /* set the number of lines as 4 */ | 501 | /* set the number of lines as 4 */ |
527 | dw_pcie_readl_rc(pp, dbi_base + PCIE_PORT_LINK_CONTROL, &val); | 502 | dw_pcie_readl_rc(pp, PCIE_PORT_LINK_CONTROL, &val); |
528 | val &= ~PORT_LINK_MODE_MASK; | 503 | val &= ~PORT_LINK_MODE_MASK; |
529 | switch (pp->lanes) { | 504 | switch (pp->lanes) { |
530 | case 1: | 505 | case 1: |
@@ -537,10 +512,10 @@ void dw_pcie_setup_rc(struct pcie_port *pp) | |||
537 | val |= PORT_LINK_MODE_4_LANES; | 512 | val |= PORT_LINK_MODE_4_LANES; |
538 | break; | 513 | break; |
539 | } | 514 | } |
540 | dw_pcie_writel_rc(pp, val, dbi_base + PCIE_PORT_LINK_CONTROL); | 515 | dw_pcie_writel_rc(pp, val, PCIE_PORT_LINK_CONTROL); |
541 | 516 | ||
542 | /* set link width speed control register */ | 517 | /* set link width speed control register */ |
543 | dw_pcie_readl_rc(pp, dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL, &val); | 518 | dw_pcie_readl_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, &val); |
544 | val &= ~PORT_LOGIC_LINK_WIDTH_MASK; | 519 | val &= ~PORT_LOGIC_LINK_WIDTH_MASK; |
545 | switch (pp->lanes) { | 520 | switch (pp->lanes) { |
546 | case 1: | 521 | case 1: |
@@ -553,36 +528,36 @@ void dw_pcie_setup_rc(struct pcie_port *pp) | |||
553 | val |= PORT_LOGIC_LINK_WIDTH_4_LANES; | 528 | val |= PORT_LOGIC_LINK_WIDTH_4_LANES; |
554 | break; | 529 | break; |
555 | } | 530 | } |
556 | dw_pcie_writel_rc(pp, val, dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL); | 531 | dw_pcie_writel_rc(pp, val, PCIE_LINK_WIDTH_SPEED_CONTROL); |
557 | 532 | ||
558 | /* setup RC BARs */ | 533 | /* setup RC BARs */ |
559 | dw_pcie_writel_rc(pp, 0x00000004, dbi_base + PCI_BASE_ADDRESS_0); | 534 | dw_pcie_writel_rc(pp, 0x00000004, PCI_BASE_ADDRESS_0); |
560 | dw_pcie_writel_rc(pp, 0x00000004, dbi_base + PCI_BASE_ADDRESS_1); | 535 | dw_pcie_writel_rc(pp, 0x00000004, PCI_BASE_ADDRESS_1); |
561 | 536 | ||
562 | /* setup interrupt pins */ | 537 | /* setup interrupt pins */ |
563 | dw_pcie_readl_rc(pp, dbi_base + PCI_INTERRUPT_LINE, &val); | 538 | dw_pcie_readl_rc(pp, PCI_INTERRUPT_LINE, &val); |
564 | val &= 0xffff00ff; | 539 | val &= 0xffff00ff; |
565 | val |= 0x00000100; | 540 | val |= 0x00000100; |
566 | dw_pcie_writel_rc(pp, val, dbi_base + PCI_INTERRUPT_LINE); | 541 | dw_pcie_writel_rc(pp, val, PCI_INTERRUPT_LINE); |
567 | 542 | ||
568 | /* setup bus numbers */ | 543 | /* setup bus numbers */ |
569 | dw_pcie_readl_rc(pp, dbi_base + PCI_PRIMARY_BUS, &val); | 544 | dw_pcie_readl_rc(pp, PCI_PRIMARY_BUS, &val); |
570 | val &= 0xff000000; | 545 | val &= 0xff000000; |
571 | val |= 0x00010100; | 546 | val |= 0x00010100; |
572 | dw_pcie_writel_rc(pp, val, dbi_base + PCI_PRIMARY_BUS); | 547 | dw_pcie_writel_rc(pp, val, PCI_PRIMARY_BUS); |
573 | 548 | ||
574 | /* setup memory base, memory limit */ | 549 | /* setup memory base, memory limit */ |
575 | membase = ((u32)pp->mem_base & 0xfff00000) >> 16; | 550 | membase = ((u32)pp->mem_base & 0xfff00000) >> 16; |
576 | memlimit = (config->mem_size + (u32)pp->mem_base) & 0xfff00000; | 551 | memlimit = (config->mem_size + (u32)pp->mem_base) & 0xfff00000; |
577 | val = memlimit | membase; | 552 | val = memlimit | membase; |
578 | dw_pcie_writel_rc(pp, val, dbi_base + PCI_MEMORY_BASE); | 553 | dw_pcie_writel_rc(pp, val, PCI_MEMORY_BASE); |
579 | 554 | ||
580 | /* setup command register */ | 555 | /* setup command register */ |
581 | dw_pcie_readl_rc(pp, dbi_base + PCI_COMMAND, &val); | 556 | dw_pcie_readl_rc(pp, PCI_COMMAND, &val); |
582 | val &= 0xffff0000; | 557 | val &= 0xffff0000; |
583 | val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | | 558 | val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | |
584 | PCI_COMMAND_MASTER | PCI_COMMAND_SERR; | 559 | PCI_COMMAND_MASTER | PCI_COMMAND_SERR; |
585 | dw_pcie_writel_rc(pp, val, dbi_base + PCI_COMMAND); | 560 | dw_pcie_writel_rc(pp, val, PCI_COMMAND); |
586 | } | 561 | } |
587 | 562 | ||
588 | MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>"); | 563 | MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>"); |