Lines Matching full:port
61 /* Root Port Error Register definitions */
66 /* Root Port Interrupt Register definitions */
69 /* Root Port Status/control Register definitions */
102 * struct pl_dma_pcie - PCIe port information
133 static inline u32 pcie_read(struct pl_dma_pcie *port, u32 reg) in pcie_read() argument
135 if (port->variant->version == QDMA) in pcie_read()
136 return readl(port->reg_base + reg + QDMA_BRIDGE_BASE_OFF); in pcie_read()
138 return readl(port->reg_base + reg); in pcie_read()
141 static inline void pcie_write(struct pl_dma_pcie *port, u32 val, u32 reg) in pcie_write() argument
143 if (port->variant->version == QDMA) in pcie_write()
144 writel(val, port->reg_base + reg + QDMA_BRIDGE_BASE_OFF); in pcie_write()
146 writel(val, port->reg_base + reg); in pcie_write()
149 static inline bool xilinx_pl_dma_pcie_link_up(struct pl_dma_pcie *port) in xilinx_pl_dma_pcie_link_up() argument
151 return (pcie_read(port, XILINX_PCIE_DMA_REG_PSCR) & in xilinx_pl_dma_pcie_link_up()
155 static void xilinx_pl_dma_pcie_clear_err_interrupts(struct pl_dma_pcie *port) in xilinx_pl_dma_pcie_clear_err_interrupts() argument
157 unsigned long val = pcie_read(port, XILINX_PCIE_DMA_REG_RPEFR); in xilinx_pl_dma_pcie_clear_err_interrupts()
160 dev_dbg(port->dev, "Requester ID %lu\n", in xilinx_pl_dma_pcie_clear_err_interrupts()
162 pcie_write(port, XILINX_PCIE_DMA_RPEFR_ALL_MASK, in xilinx_pl_dma_pcie_clear_err_interrupts()
170 struct pl_dma_pcie *port = bus->sysdata; in xilinx_pl_dma_pcie_valid_device() local
183 if (!xilinx_pl_dma_pcie_link_up(port)) in xilinx_pl_dma_pcie_valid_device()
186 /* Only one device down on each root port */ in xilinx_pl_dma_pcie_valid_device()
195 struct pl_dma_pcie *port = bus->sysdata; in xilinx_pl_dma_pcie_map_bus() local
200 if (port->variant->version == QDMA) in xilinx_pl_dma_pcie_map_bus()
201 return port->cfg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); in xilinx_pl_dma_pcie_map_bus()
203 return port->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); in xilinx_pl_dma_pcie_map_bus()
215 static void xilinx_pl_dma_pcie_enable_msi(struct pl_dma_pcie *port) in xilinx_pl_dma_pcie_enable_msi() argument
217 phys_addr_t msi_addr = port->phys_reg_base; in xilinx_pl_dma_pcie_enable_msi()
219 pcie_write(port, upper_32_bits(msi_addr), XILINX_PCIE_DMA_REG_MSIBASE1); in xilinx_pl_dma_pcie_enable_msi()
220 pcie_write(port, lower_32_bits(msi_addr), XILINX_PCIE_DMA_REG_MSIBASE2); in xilinx_pl_dma_pcie_enable_msi()
225 struct pl_dma_pcie *port = irq_data_get_irq_chip_data(data); in xilinx_mask_intx_irq() local
230 raw_spin_lock_irqsave(&port->lock, flags); in xilinx_mask_intx_irq()
231 val = pcie_read(port, XILINX_PCIE_DMA_REG_IDRN_MASK); in xilinx_mask_intx_irq()
232 pcie_write(port, (val & (~mask)), XILINX_PCIE_DMA_REG_IDRN_MASK); in xilinx_mask_intx_irq()
233 raw_spin_unlock_irqrestore(&port->lock, flags); in xilinx_mask_intx_irq()
238 struct pl_dma_pcie *port = irq_data_get_irq_chip_data(data); in xilinx_unmask_intx_irq() local
243 raw_spin_lock_irqsave(&port->lock, flags); in xilinx_unmask_intx_irq()
244 val = pcie_read(port, XILINX_PCIE_DMA_REG_IDRN_MASK); in xilinx_unmask_intx_irq()
245 pcie_write(port, (val | mask), XILINX_PCIE_DMA_REG_IDRN_MASK); in xilinx_unmask_intx_irq()
246 raw_spin_unlock_irqrestore(&port->lock, flags); in xilinx_unmask_intx_irq()
275 struct pl_dma_pcie *port = args; in xilinx_pl_dma_pcie_msi_handler_high() local
277 msi = &port->msi; in xilinx_pl_dma_pcie_msi_handler_high()
279 while ((status = pcie_read(port, XILINX_PCIE_DMA_REG_MSI_HI)) != 0) { in xilinx_pl_dma_pcie_msi_handler_high()
281 pcie_write(port, 1 << bit, XILINX_PCIE_DMA_REG_MSI_HI); in xilinx_pl_dma_pcie_msi_handler_high()
294 struct pl_dma_pcie *port = args; in xilinx_pl_dma_pcie_msi_handler_low() local
299 msi = &port->msi; in xilinx_pl_dma_pcie_msi_handler_low()
301 while ((status = pcie_read(port, XILINX_PCIE_DMA_REG_MSI_LOW)) != 0) { in xilinx_pl_dma_pcie_msi_handler_low()
303 pcie_write(port, 1 << bit, XILINX_PCIE_DMA_REG_MSI_LOW); in xilinx_pl_dma_pcie_msi_handler_low()
315 struct pl_dma_pcie *port = args; in xilinx_pl_dma_pcie_event_flow() local
319 val = pcie_read(port, XILINX_PCIE_DMA_REG_IDR); in xilinx_pl_dma_pcie_event_flow()
320 val &= pcie_read(port, XILINX_PCIE_DMA_REG_IMR); in xilinx_pl_dma_pcie_event_flow()
322 generic_handle_domain_irq(port->pldma_domain, i); in xilinx_pl_dma_pcie_event_flow()
324 pcie_write(port, val, XILINX_PCIE_DMA_REG_IDR); in xilinx_pl_dma_pcie_event_flow()
354 struct pl_dma_pcie *port = (struct pl_dma_pcie *)dev_id; in xilinx_pl_dma_pcie_intr_handler() local
355 struct device *dev = port->dev; in xilinx_pl_dma_pcie_intr_handler()
358 d = irq_domain_get_irq_data(port->pldma_domain, irq); in xilinx_pl_dma_pcie_intr_handler()
363 xilinx_pl_dma_pcie_clear_err_interrupts(port); in xilinx_pl_dma_pcie_intr_handler()
448 static void xilinx_pl_dma_pcie_free_irq_domains(struct pl_dma_pcie *port) in xilinx_pl_dma_pcie_free_irq_domains() argument
450 struct xilinx_msi *msi = &port->msi; in xilinx_pl_dma_pcie_free_irq_domains()
452 if (port->intx_domain) { in xilinx_pl_dma_pcie_free_irq_domains()
453 irq_domain_remove(port->intx_domain); in xilinx_pl_dma_pcie_free_irq_domains()
454 port->intx_domain = NULL; in xilinx_pl_dma_pcie_free_irq_domains()
468 static int xilinx_pl_dma_pcie_init_msi_irq_domain(struct pl_dma_pcie *port) in xilinx_pl_dma_pcie_init_msi_irq_domain() argument
470 struct device *dev = port->dev; in xilinx_pl_dma_pcie_init_msi_irq_domain()
471 struct xilinx_msi *msi = &port->msi; in xilinx_pl_dma_pcie_init_msi_irq_domain()
473 struct fwnode_handle *fwnode = of_node_to_fwnode(port->dev->of_node); in xilinx_pl_dma_pcie_init_msi_irq_domain()
476 &dev_msi_domain_ops, port); in xilinx_pl_dma_pcie_init_msi_irq_domain()
491 raw_spin_lock_init(&port->lock); in xilinx_pl_dma_pcie_init_msi_irq_domain()
492 xilinx_pl_dma_pcie_enable_msi(port); in xilinx_pl_dma_pcie_init_msi_irq_domain()
497 xilinx_pl_dma_pcie_free_irq_domains(port); in xilinx_pl_dma_pcie_init_msi_irq_domain()
513 struct pl_dma_pcie *port = args; in xilinx_pl_dma_pcie_intx_flow() local
516 pcie_read(port, XILINX_PCIE_DMA_REG_IDRN)); in xilinx_pl_dma_pcie_intx_flow()
519 generic_handle_domain_irq(port->intx_domain, i); in xilinx_pl_dma_pcie_intx_flow()
525 struct pl_dma_pcie *port = irq_data_get_irq_chip_data(d); in xilinx_pl_dma_pcie_mask_event_irq() local
528 raw_spin_lock(&port->lock); in xilinx_pl_dma_pcie_mask_event_irq()
529 val = pcie_read(port, XILINX_PCIE_DMA_REG_IMR); in xilinx_pl_dma_pcie_mask_event_irq()
531 pcie_write(port, val, XILINX_PCIE_DMA_REG_IMR); in xilinx_pl_dma_pcie_mask_event_irq()
532 raw_spin_unlock(&port->lock); in xilinx_pl_dma_pcie_mask_event_irq()
537 struct pl_dma_pcie *port = irq_data_get_irq_chip_data(d); in xilinx_pl_dma_pcie_unmask_event_irq() local
540 raw_spin_lock(&port->lock); in xilinx_pl_dma_pcie_unmask_event_irq()
541 val = pcie_read(port, XILINX_PCIE_DMA_REG_IMR); in xilinx_pl_dma_pcie_unmask_event_irq()
543 pcie_write(port, val, XILINX_PCIE_DMA_REG_IMR); in xilinx_pl_dma_pcie_unmask_event_irq()
544 raw_spin_unlock(&port->lock); in xilinx_pl_dma_pcie_unmask_event_irq()
570 * @port: PCIe port information
574 static int xilinx_pl_dma_pcie_init_irq_domain(struct pl_dma_pcie *port) in xilinx_pl_dma_pcie_init_irq_domain() argument
576 struct device *dev = port->dev; in xilinx_pl_dma_pcie_init_irq_domain()
588 port->pldma_domain = irq_domain_add_linear(pcie_intc_node, 32, in xilinx_pl_dma_pcie_init_irq_domain()
589 &event_domain_ops, port); in xilinx_pl_dma_pcie_init_irq_domain()
590 if (!port->pldma_domain) in xilinx_pl_dma_pcie_init_irq_domain()
593 irq_domain_update_bus_token(port->pldma_domain, DOMAIN_BUS_NEXUS); in xilinx_pl_dma_pcie_init_irq_domain()
595 port->intx_domain = irq_domain_add_linear(pcie_intc_node, PCI_NUM_INTX, in xilinx_pl_dma_pcie_init_irq_domain()
596 &intx_domain_ops, port); in xilinx_pl_dma_pcie_init_irq_domain()
597 if (!port->intx_domain) { in xilinx_pl_dma_pcie_init_irq_domain()
602 irq_domain_update_bus_token(port->intx_domain, DOMAIN_BUS_WIRED); in xilinx_pl_dma_pcie_init_irq_domain()
604 ret = xilinx_pl_dma_pcie_init_msi_irq_domain(port); in xilinx_pl_dma_pcie_init_irq_domain()
606 irq_domain_remove(port->intx_domain); in xilinx_pl_dma_pcie_init_irq_domain()
611 raw_spin_lock_init(&port->lock); in xilinx_pl_dma_pcie_init_irq_domain()
616 static int xilinx_pl_dma_pcie_setup_irq(struct pl_dma_pcie *port) in xilinx_pl_dma_pcie_setup_irq() argument
618 struct device *dev = port->dev; in xilinx_pl_dma_pcie_setup_irq()
622 port->irq = platform_get_irq(pdev, 0); in xilinx_pl_dma_pcie_setup_irq()
623 if (port->irq < 0) in xilinx_pl_dma_pcie_setup_irq()
624 return port->irq; in xilinx_pl_dma_pcie_setup_irq()
632 irq = irq_create_mapping(port->pldma_domain, i); in xilinx_pl_dma_pcie_setup_irq()
641 intr_cause[i].sym, port); in xilinx_pl_dma_pcie_setup_irq()
648 port->intx_irq = irq_create_mapping(port->pldma_domain, in xilinx_pl_dma_pcie_setup_irq()
650 if (!port->intx_irq) { in xilinx_pl_dma_pcie_setup_irq()
655 err = devm_request_irq(dev, port->intx_irq, xilinx_pl_dma_pcie_intx_flow, in xilinx_pl_dma_pcie_setup_irq()
656 IRQF_SHARED | IRQF_NO_THREAD, NULL, port); in xilinx_pl_dma_pcie_setup_irq()
658 dev_err(dev, "Failed to request INTx IRQ %d\n", port->intx_irq); in xilinx_pl_dma_pcie_setup_irq()
662 err = devm_request_irq(dev, port->irq, xilinx_pl_dma_pcie_event_flow, in xilinx_pl_dma_pcie_setup_irq()
663 IRQF_SHARED | IRQF_NO_THREAD, NULL, port); in xilinx_pl_dma_pcie_setup_irq()
665 dev_err(dev, "Failed to request event IRQ %d\n", port->irq); in xilinx_pl_dma_pcie_setup_irq()
672 static void xilinx_pl_dma_pcie_init_port(struct pl_dma_pcie *port) in xilinx_pl_dma_pcie_init_port() argument
674 if (xilinx_pl_dma_pcie_link_up(port)) in xilinx_pl_dma_pcie_init_port()
675 dev_info(port->dev, "PCIe Link is UP\n"); in xilinx_pl_dma_pcie_init_port()
677 dev_info(port->dev, "PCIe Link is DOWN\n"); in xilinx_pl_dma_pcie_init_port()
680 pcie_write(port, ~XILINX_PCIE_DMA_IDR_ALL_MASK, in xilinx_pl_dma_pcie_init_port()
684 pcie_write(port, pcie_read(port, XILINX_PCIE_DMA_REG_IDR) & in xilinx_pl_dma_pcie_init_port()
689 pcie_write(port, XILINX_PCIE_DMA_IDR_ALL_MASK, in xilinx_pl_dma_pcie_init_port()
691 pcie_write(port, XILINX_PCIE_DMA_IDR_ALL_MASK, in xilinx_pl_dma_pcie_init_port()
695 pcie_write(port, pcie_read(port, XILINX_PCIE_DMA_REG_RPSC) | in xilinx_pl_dma_pcie_init_port()
700 static int xilinx_request_msi_irq(struct pl_dma_pcie *port) in xilinx_request_msi_irq() argument
702 struct device *dev = port->dev; in xilinx_request_msi_irq()
706 port->msi.irq_msi0 = platform_get_irq_byname(pdev, "msi0"); in xilinx_request_msi_irq()
707 if (port->msi.irq_msi0 <= 0) in xilinx_request_msi_irq()
708 return port->msi.irq_msi0; in xilinx_request_msi_irq()
710 ret = devm_request_irq(dev, port->msi.irq_msi0, xilinx_pl_dma_pcie_msi_handler_low, in xilinx_request_msi_irq()
712 port); in xilinx_request_msi_irq()
718 port->msi.irq_msi1 = platform_get_irq_byname(pdev, "msi1"); in xilinx_request_msi_irq()
719 if (port->msi.irq_msi1 <= 0) in xilinx_request_msi_irq()
720 return port->msi.irq_msi1; in xilinx_request_msi_irq()
722 ret = devm_request_irq(dev, port->msi.irq_msi1, xilinx_pl_dma_pcie_msi_handler_high, in xilinx_request_msi_irq()
724 port); in xilinx_request_msi_irq()
733 static int xilinx_pl_dma_pcie_parse_dt(struct pl_dma_pcie *port, in xilinx_pl_dma_pcie_parse_dt() argument
736 struct device *dev = port->dev; in xilinx_pl_dma_pcie_parse_dt()
746 port->phys_reg_base = res->start; in xilinx_pl_dma_pcie_parse_dt()
748 port->cfg = pci_ecam_create(dev, res, bus_range, &xilinx_pl_dma_pcie_ops); in xilinx_pl_dma_pcie_parse_dt()
749 if (IS_ERR(port->cfg)) in xilinx_pl_dma_pcie_parse_dt()
750 return PTR_ERR(port->cfg); in xilinx_pl_dma_pcie_parse_dt()
752 port->reg_base = port->cfg->win; in xilinx_pl_dma_pcie_parse_dt()
754 if (port->variant->version == QDMA) { in xilinx_pl_dma_pcie_parse_dt()
755 port->cfg_base = port->cfg->win; in xilinx_pl_dma_pcie_parse_dt()
757 port->reg_base = devm_ioremap_resource(dev, res); in xilinx_pl_dma_pcie_parse_dt()
758 if (IS_ERR(port->reg_base)) in xilinx_pl_dma_pcie_parse_dt()
759 return PTR_ERR(port->reg_base); in xilinx_pl_dma_pcie_parse_dt()
760 port->phys_reg_base = res->start; in xilinx_pl_dma_pcie_parse_dt()
763 err = xilinx_request_msi_irq(port); in xilinx_pl_dma_pcie_parse_dt()
765 pci_ecam_free(port->cfg); in xilinx_pl_dma_pcie_parse_dt()
775 struct pl_dma_pcie *port; in xilinx_pl_dma_pcie_probe() local
780 bridge = devm_pci_alloc_host_bridge(dev, sizeof(*port)); in xilinx_pl_dma_pcie_probe()
784 port = pci_host_bridge_priv(bridge); in xilinx_pl_dma_pcie_probe()
786 port->dev = dev; in xilinx_pl_dma_pcie_probe()
792 port->variant = of_device_get_match_data(dev); in xilinx_pl_dma_pcie_probe()
794 err = xilinx_pl_dma_pcie_parse_dt(port, bus->res); in xilinx_pl_dma_pcie_probe()
800 xilinx_pl_dma_pcie_init_port(port); in xilinx_pl_dma_pcie_probe()
802 err = xilinx_pl_dma_pcie_init_irq_domain(port); in xilinx_pl_dma_pcie_probe()
806 err = xilinx_pl_dma_pcie_setup_irq(port); in xilinx_pl_dma_pcie_probe()
808 bridge->sysdata = port; in xilinx_pl_dma_pcie_probe()
818 xilinx_pl_dma_pcie_free_irq_domains(port); in xilinx_pl_dma_pcie_probe()
821 pci_ecam_free(port->cfg); in xilinx_pl_dma_pcie_probe()