Lines Matching refs:port
138 u32 port; member
158 static inline void mvebu_writel(struct mvebu_pcie_port *port, u32 val, u32 reg) in mvebu_writel() argument
160 writel(val, port->base + reg); in mvebu_writel()
163 static inline u32 mvebu_readl(struct mvebu_pcie_port *port, u32 reg) in mvebu_readl() argument
165 return readl(port->base + reg); in mvebu_readl()
168 static inline bool mvebu_has_ioport(struct mvebu_pcie_port *port) in mvebu_has_ioport() argument
170 return port->io_target != -1 && port->io_attr != -1; in mvebu_has_ioport()
173 static bool mvebu_pcie_link_up(struct mvebu_pcie_port *port) in mvebu_pcie_link_up() argument
175 return !(mvebu_readl(port, PCIE_STAT_OFF) & PCIE_STAT_LINK_DOWN); in mvebu_pcie_link_up()
178 static void mvebu_pcie_set_local_bus_nr(struct mvebu_pcie_port *port, int nr) in mvebu_pcie_set_local_bus_nr() argument
182 stat = mvebu_readl(port, PCIE_STAT_OFF); in mvebu_pcie_set_local_bus_nr()
185 mvebu_writel(port, stat, PCIE_STAT_OFF); in mvebu_pcie_set_local_bus_nr()
188 static void mvebu_pcie_set_local_dev_nr(struct mvebu_pcie_port *port, int nr) in mvebu_pcie_set_local_dev_nr() argument
192 stat = mvebu_readl(port, PCIE_STAT_OFF); in mvebu_pcie_set_local_dev_nr()
195 mvebu_writel(port, stat, PCIE_STAT_OFF); in mvebu_pcie_set_local_dev_nr()
203 static void mvebu_pcie_setup_wins(struct mvebu_pcie_port *port) in mvebu_pcie_setup_wins() argument
213 mvebu_writel(port, 0, PCIE_BAR_CTRL_OFF(i)); in mvebu_pcie_setup_wins()
214 mvebu_writel(port, 0, PCIE_BAR_LO_OFF(i)); in mvebu_pcie_setup_wins()
215 mvebu_writel(port, 0, PCIE_BAR_HI_OFF(i)); in mvebu_pcie_setup_wins()
219 mvebu_writel(port, 0, PCIE_WIN04_CTRL_OFF(i)); in mvebu_pcie_setup_wins()
220 mvebu_writel(port, 0, PCIE_WIN04_BASE_OFF(i)); in mvebu_pcie_setup_wins()
221 mvebu_writel(port, 0, PCIE_WIN04_REMAP_OFF(i)); in mvebu_pcie_setup_wins()
224 mvebu_writel(port, 0, PCIE_WIN5_CTRL_OFF); in mvebu_pcie_setup_wins()
225 mvebu_writel(port, 0, PCIE_WIN5_BASE_OFF); in mvebu_pcie_setup_wins()
226 mvebu_writel(port, 0, PCIE_WIN5_REMAP_OFF); in mvebu_pcie_setup_wins()
233 mvebu_writel(port, cs->base & 0xffff0000, in mvebu_pcie_setup_wins()
235 mvebu_writel(port, 0, PCIE_WIN04_REMAP_OFF(i)); in mvebu_pcie_setup_wins()
236 mvebu_writel(port, in mvebu_pcie_setup_wins()
250 mvebu_writel(port, dram->cs[0].base, PCIE_BAR_LO_OFF(1)); in mvebu_pcie_setup_wins()
251 mvebu_writel(port, 0, PCIE_BAR_HI_OFF(1)); in mvebu_pcie_setup_wins()
252 mvebu_writel(port, ((size - 1) & 0xffff0000) | 1, in mvebu_pcie_setup_wins()
256 static void mvebu_pcie_setup_hw(struct mvebu_pcie_port *port) in mvebu_pcie_setup_hw() argument
261 mvebu_pcie_setup_wins(port); in mvebu_pcie_setup_hw()
264 cmd = mvebu_readl(port, PCIE_CMD_OFF); in mvebu_pcie_setup_hw()
268 mvebu_writel(port, cmd, PCIE_CMD_OFF); in mvebu_pcie_setup_hw()
271 mask = mvebu_readl(port, PCIE_MASK_OFF); in mvebu_pcie_setup_hw()
273 mvebu_writel(port, mask, PCIE_MASK_OFF); in mvebu_pcie_setup_hw()
276 static int mvebu_pcie_hw_rd_conf(struct mvebu_pcie_port *port, in mvebu_pcie_hw_rd_conf() argument
280 void __iomem *conf_data = port->base + PCIE_CONF_DATA_OFF; in mvebu_pcie_hw_rd_conf()
282 mvebu_writel(port, PCIE_CONF_ADDR(bus->number, devfn, where), in mvebu_pcie_hw_rd_conf()
300 static int mvebu_pcie_hw_wr_conf(struct mvebu_pcie_port *port, in mvebu_pcie_hw_wr_conf() argument
304 void __iomem *conf_data = port->base + PCIE_CONF_DATA_OFF; in mvebu_pcie_hw_wr_conf()
306 mvebu_writel(port, PCIE_CONF_ADDR(bus->number, devfn, where), in mvebu_pcie_hw_wr_conf()
330 static void mvebu_pcie_del_windows(struct mvebu_pcie_port *port, in mvebu_pcie_del_windows() argument
348 static void mvebu_pcie_add_windows(struct mvebu_pcie_port *port, in mvebu_pcie_add_windows() argument
364 dev_err(&port->pcie->pdev->dev, in mvebu_pcie_add_windows()
367 mvebu_pcie_del_windows(port, base - size_mapped, in mvebu_pcie_add_windows()
380 static void mvebu_pcie_handle_iobase_change(struct mvebu_pcie_port *port) in mvebu_pcie_handle_iobase_change() argument
385 if (port->bridge.iolimit < port->bridge.iobase || in mvebu_pcie_handle_iobase_change()
386 port->bridge.iolimitupper < port->bridge.iobaseupper || in mvebu_pcie_handle_iobase_change()
387 !(port->bridge.command & PCI_COMMAND_IO)) { in mvebu_pcie_handle_iobase_change()
390 if (port->iowin_base) { in mvebu_pcie_handle_iobase_change()
391 mvebu_pcie_del_windows(port, port->iowin_base, in mvebu_pcie_handle_iobase_change()
392 port->iowin_size); in mvebu_pcie_handle_iobase_change()
393 port->iowin_base = 0; in mvebu_pcie_handle_iobase_change()
394 port->iowin_size = 0; in mvebu_pcie_handle_iobase_change()
400 if (!mvebu_has_ioport(port)) { in mvebu_pcie_handle_iobase_change()
401 dev_WARN(&port->pcie->pdev->dev, in mvebu_pcie_handle_iobase_change()
413 iobase = ((port->bridge.iobase & 0xF0) << 8) | in mvebu_pcie_handle_iobase_change()
414 (port->bridge.iobaseupper << 16); in mvebu_pcie_handle_iobase_change()
415 port->iowin_base = port->pcie->io.start + iobase; in mvebu_pcie_handle_iobase_change()
416 port->iowin_size = ((0xFFF | ((port->bridge.iolimit & 0xF0) << 8) | in mvebu_pcie_handle_iobase_change()
417 (port->bridge.iolimitupper << 16)) - in mvebu_pcie_handle_iobase_change()
420 mvebu_pcie_add_windows(port, port->io_target, port->io_attr, in mvebu_pcie_handle_iobase_change()
421 port->iowin_base, port->iowin_size, in mvebu_pcie_handle_iobase_change()
425 static void mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port) in mvebu_pcie_handle_membase_change() argument
428 if (port->bridge.memlimit < port->bridge.membase || in mvebu_pcie_handle_membase_change()
429 !(port->bridge.command & PCI_COMMAND_MEMORY)) { in mvebu_pcie_handle_membase_change()
432 if (port->memwin_base) { in mvebu_pcie_handle_membase_change()
433 mvebu_pcie_del_windows(port, port->memwin_base, in mvebu_pcie_handle_membase_change()
434 port->memwin_size); in mvebu_pcie_handle_membase_change()
435 port->memwin_base = 0; in mvebu_pcie_handle_membase_change()
436 port->memwin_size = 0; in mvebu_pcie_handle_membase_change()
448 port->memwin_base = ((port->bridge.membase & 0xFFF0) << 16); in mvebu_pcie_handle_membase_change()
449 port->memwin_size = in mvebu_pcie_handle_membase_change()
450 (((port->bridge.memlimit & 0xFFF0) << 16) | 0xFFFFF) - in mvebu_pcie_handle_membase_change()
451 port->memwin_base + 1; in mvebu_pcie_handle_membase_change()
453 mvebu_pcie_add_windows(port, port->mem_target, port->mem_attr, in mvebu_pcie_handle_membase_change()
454 port->memwin_base, port->memwin_size, in mvebu_pcie_handle_membase_change()
462 static void mvebu_sw_pci_bridge_init(struct mvebu_pcie_port *port) in mvebu_sw_pci_bridge_init() argument
464 struct mvebu_sw_pci_bridge *bridge = &port->bridge; in mvebu_sw_pci_bridge_init()
470 bridge->device = mvebu_readl(port, PCIE_DEV_ID_OFF) >> 16; in mvebu_sw_pci_bridge_init()
471 bridge->revision = mvebu_readl(port, PCIE_DEV_REV_OFF) & 0xff; in mvebu_sw_pci_bridge_init()
487 static int mvebu_sw_pci_bridge_read(struct mvebu_pcie_port *port, in mvebu_sw_pci_bridge_read() argument
490 struct mvebu_sw_pci_bridge *bridge = &port->bridge; in mvebu_sw_pci_bridge_read()
523 if (!mvebu_has_ioport(port)) in mvebu_sw_pci_bridge_read()
563 *value = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_DEVCAP); in mvebu_sw_pci_bridge_read()
567 *value = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_DEVCTL) & in mvebu_sw_pci_bridge_read()
578 *value = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_LNKCAP) & in mvebu_sw_pci_bridge_read()
583 *value = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL); in mvebu_sw_pci_bridge_read()
599 *value = mvebu_readl(port, PCIE_RC_RTSTA); in mvebu_sw_pci_bridge_read()
628 static int mvebu_sw_pci_bridge_write(struct mvebu_pcie_port *port, in mvebu_sw_pci_bridge_write() argument
631 struct mvebu_sw_pci_bridge *bridge = &port->bridge; in mvebu_sw_pci_bridge_write()
644 err = mvebu_sw_pci_bridge_read(port, where & ~3, 4, ®); in mvebu_sw_pci_bridge_write()
655 if (!mvebu_has_ioport(port)) in mvebu_sw_pci_bridge_write()
660 mvebu_pcie_handle_iobase_change(port); in mvebu_sw_pci_bridge_write()
662 mvebu_pcie_handle_membase_change(port); in mvebu_sw_pci_bridge_write()
678 mvebu_pcie_handle_iobase_change(port); in mvebu_sw_pci_bridge_write()
684 mvebu_pcie_handle_membase_change(port); in mvebu_sw_pci_bridge_write()
690 mvebu_pcie_handle_iobase_change(port); in mvebu_sw_pci_bridge_write()
698 mvebu_pcie_set_local_bus_nr(port, bridge->secondary_bus); in mvebu_sw_pci_bridge_write()
718 mvebu_writel(port, value, PCIE_CAP_PCIEXP + PCI_EXP_DEVCTL); in mvebu_sw_pci_bridge_write()
739 mvebu_writel(port, value, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL); in mvebu_sw_pci_bridge_write()
743 mvebu_writel(port, value, PCIE_RC_RTSTA); in mvebu_sw_pci_bridge_write()
765 struct mvebu_pcie_port *port = &pcie->ports[i]; in mvebu_pcie_find_port() local
767 if (bus->number == 0 && port->devfn == devfn) in mvebu_pcie_find_port()
768 return port; in mvebu_pcie_find_port()
770 bus->number >= port->bridge.secondary_bus && in mvebu_pcie_find_port()
771 bus->number <= port->bridge.subordinate_bus) in mvebu_pcie_find_port()
772 return port; in mvebu_pcie_find_port()
783 struct mvebu_pcie_port *port; in mvebu_pcie_wr_conf() local
786 port = mvebu_pcie_find_port(pcie, bus, devfn); in mvebu_pcie_wr_conf()
787 if (!port) in mvebu_pcie_wr_conf()
792 return mvebu_sw_pci_bridge_write(port, where, size, val); in mvebu_pcie_wr_conf()
794 if (!mvebu_pcie_link_up(port)) in mvebu_pcie_wr_conf()
798 ret = mvebu_pcie_hw_wr_conf(port, bus, devfn, in mvebu_pcie_wr_conf()
809 struct mvebu_pcie_port *port; in mvebu_pcie_rd_conf() local
812 port = mvebu_pcie_find_port(pcie, bus, devfn); in mvebu_pcie_rd_conf()
813 if (!port) { in mvebu_pcie_rd_conf()
820 return mvebu_sw_pci_bridge_read(port, where, size, val); in mvebu_pcie_rd_conf()
822 if (!mvebu_pcie_link_up(port)) { in mvebu_pcie_rd_conf()
828 ret = mvebu_pcie_hw_rd_conf(port, bus, devfn, in mvebu_pcie_rd_conf()
862 struct mvebu_pcie_port *port = &pcie->ports[i]; in mvebu_pcie_setup() local
864 if (!port->base) in mvebu_pcie_setup()
866 mvebu_pcie_setup_hw(port); in mvebu_pcie_setup()
929 struct mvebu_pcie_port *port) in mvebu_pcie_map_registers() argument
1013 struct mvebu_pcie_port *port = pcie->ports + i; in mvebu_pcie_suspend() local
1014 port->saved_pcie_stat = mvebu_readl(port, PCIE_STAT_OFF); in mvebu_pcie_suspend()
1027 struct mvebu_pcie_port *port = pcie->ports + i; in mvebu_pcie_resume() local
1028 mvebu_writel(port, port->saved_pcie_stat, PCIE_STAT_OFF); in mvebu_pcie_resume()
1029 mvebu_pcie_setup_hw(port); in mvebu_pcie_resume()
1037 struct mvebu_pcie_port *port = data; in mvebu_pcie_port_clk_put() local
1039 clk_put(port->clk); in mvebu_pcie_port_clk_put()
1043 struct mvebu_pcie_port *port, struct device_node *child) in mvebu_pcie_parse_port() argument
1049 port->pcie = pcie; in mvebu_pcie_parse_port()
1051 if (of_property_read_u32(child, "marvell,pcie-port", &port->port)) { in mvebu_pcie_parse_port()
1057 if (of_property_read_u32(child, "marvell,pcie-lane", &port->lane)) in mvebu_pcie_parse_port()
1058 port->lane = 0; in mvebu_pcie_parse_port()
1060 port->name = devm_kasprintf(dev, GFP_KERNEL, "pcie%d.%d", port->port, in mvebu_pcie_parse_port()
1061 port->lane); in mvebu_pcie_parse_port()
1062 if (!port->name) { in mvebu_pcie_parse_port()
1067 port->devfn = of_pci_get_devfn(child); in mvebu_pcie_parse_port()
1068 if (port->devfn < 0) in mvebu_pcie_parse_port()
1071 ret = mvebu_get_tgt_attr(dev->of_node, port->devfn, IORESOURCE_MEM, in mvebu_pcie_parse_port()
1072 &port->mem_target, &port->mem_attr); in mvebu_pcie_parse_port()
1075 port->name); in mvebu_pcie_parse_port()
1080 mvebu_get_tgt_attr(dev->of_node, port->devfn, IORESOURCE_IO, in mvebu_pcie_parse_port()
1081 &port->io_target, &port->io_attr); in mvebu_pcie_parse_port()
1083 port->io_target = -1; in mvebu_pcie_parse_port()
1084 port->io_attr = -1; in mvebu_pcie_parse_port()
1096 port->reset_name = devm_kasprintf(dev, GFP_KERNEL, "%s-reset", in mvebu_pcie_parse_port()
1097 port->name); in mvebu_pcie_parse_port()
1098 if (!port->reset_name) { in mvebu_pcie_parse_port()
1113 port->reset_name); in mvebu_pcie_parse_port()
1120 port->reset_gpio = gpio_to_desc(reset_gpio); in mvebu_pcie_parse_port()
1123 port->clk = of_clk_get_by_name(child, NULL); in mvebu_pcie_parse_port()
1124 if (IS_ERR(port->clk)) { in mvebu_pcie_parse_port()
1125 dev_err(dev, "%s: cannot get clock\n", port->name); in mvebu_pcie_parse_port()
1129 ret = devm_add_action(dev, mvebu_pcie_port_clk_put, port); in mvebu_pcie_parse_port()
1131 clk_put(port->clk); in mvebu_pcie_parse_port()
1141 devm_kfree(dev, port->reset_name); in mvebu_pcie_parse_port()
1142 port->reset_name = NULL; in mvebu_pcie_parse_port()
1143 devm_kfree(dev, port->name); in mvebu_pcie_parse_port()
1144 port->name = NULL; in mvebu_pcie_parse_port()
1155 static int mvebu_pcie_powerup(struct mvebu_pcie_port *port) in mvebu_pcie_powerup() argument
1159 ret = clk_prepare_enable(port->clk); in mvebu_pcie_powerup()
1163 if (port->reset_gpio) { in mvebu_pcie_powerup()
1166 of_property_read_u32(port->dn, "reset-delay-us", in mvebu_pcie_powerup()
1171 gpiod_set_value_cansleep(port->reset_gpio, 0); in mvebu_pcie_powerup()
1182 static void mvebu_pcie_powerdown(struct mvebu_pcie_port *port) in mvebu_pcie_powerdown() argument
1184 if (port->reset_gpio) in mvebu_pcie_powerdown()
1185 gpiod_set_value_cansleep(port->reset_gpio, 1); in mvebu_pcie_powerdown()
1187 clk_disable_unprepare(port->clk); in mvebu_pcie_powerdown()
1240 struct mvebu_pcie_port *port = &pcie->ports[i]; in mvebu_pcie_probe() local
1242 ret = mvebu_pcie_parse_port(pcie, port, child); in mvebu_pcie_probe()
1250 port->dn = child; in mvebu_pcie_probe()
1256 struct mvebu_pcie_port *port = &pcie->ports[i]; in mvebu_pcie_probe() local
1258 child = port->dn; in mvebu_pcie_probe()
1262 ret = mvebu_pcie_powerup(port); in mvebu_pcie_probe()
1266 port->base = mvebu_pcie_map_registers(pdev, child, port); in mvebu_pcie_probe()
1267 if (IS_ERR(port->base)) { in mvebu_pcie_probe()
1269 port->name); in mvebu_pcie_probe()
1270 port->base = NULL; in mvebu_pcie_probe()
1271 mvebu_pcie_powerdown(port); in mvebu_pcie_probe()
1275 mvebu_pcie_set_local_dev_nr(port, 1); in mvebu_pcie_probe()
1276 mvebu_sw_pci_bridge_init(port); in mvebu_pcie_probe()