Lines Matching refs:pcie
122 static inline void cra_writel(struct altera_pcie *pcie, const u32 value, in cra_writel() argument
125 writel_relaxed(value, pcie->cra_base + reg); in cra_writel()
128 static inline u32 cra_readl(struct altera_pcie *pcie, const u32 reg) in cra_readl() argument
130 return readl_relaxed(pcie->cra_base + reg); in cra_readl()
133 static void tlp_write_tx(struct altera_pcie *pcie, in tlp_write_tx() argument
136 cra_writel(pcie, tlp_rp_regdata->reg0, RP_TX_REG0); in tlp_write_tx()
137 cra_writel(pcie, tlp_rp_regdata->reg1, RP_TX_REG1); in tlp_write_tx()
138 cra_writel(pcie, tlp_rp_regdata->ctrl, RP_TX_CNTRL); in tlp_write_tx()
141 static bool altera_pcie_link_is_up(struct altera_pcie *pcie) in altera_pcie_link_is_up() argument
143 return !!(cra_readl(pcie, RP_LTSSM) & LTSSM_L0); in altera_pcie_link_is_up()
146 static bool altera_pcie_valid_config(struct altera_pcie *pcie, in altera_pcie_valid_config() argument
150 if (bus->number != pcie->root_bus_nr) { in altera_pcie_valid_config()
151 if (!altera_pcie_link_is_up(pcie)) in altera_pcie_valid_config()
156 if (bus->number == pcie->root_bus_nr && dev > 0) in altera_pcie_valid_config()
163 if (bus->primary == pcie->root_bus_nr && dev > 0) in altera_pcie_valid_config()
169 static int tlp_read_packet(struct altera_pcie *pcie, u32 *value) in tlp_read_packet() argument
182 ctrl = cra_readl(pcie, RP_RXCPL_STATUS); in tlp_read_packet()
184 reg0 = cra_readl(pcie, RP_RXCPL_REG0); in tlp_read_packet()
185 reg1 = cra_readl(pcie, RP_RXCPL_REG1); in tlp_read_packet()
208 static void tlp_write_packet(struct altera_pcie *pcie, u32 *headers, in tlp_write_packet() argument
216 tlp_write_tx(pcie, &tlp_rp_regdata); in tlp_write_packet()
222 tlp_write_tx(pcie, &tlp_rp_regdata); in tlp_write_packet()
232 tlp_write_tx(pcie, &tlp_rp_regdata); in tlp_write_packet()
235 static int tlp_cfg_dword_read(struct altera_pcie *pcie, u8 bus, u32 devfn, in tlp_cfg_dword_read() argument
240 if (bus == pcie->root_bus_nr) in tlp_cfg_dword_read()
245 headers[1] = TLP_CFG_DW1(TLP_REQ_ID(pcie->root_bus_nr, RP_DEVFN), in tlp_cfg_dword_read()
249 tlp_write_packet(pcie, headers, 0, false); in tlp_cfg_dword_read()
251 return tlp_read_packet(pcie, value); in tlp_cfg_dword_read()
254 static int tlp_cfg_dword_write(struct altera_pcie *pcie, u8 bus, u32 devfn, in tlp_cfg_dword_write() argument
260 if (bus == pcie->root_bus_nr) in tlp_cfg_dword_write()
265 headers[1] = TLP_CFG_DW1(TLP_REQ_ID(pcie->root_bus_nr, RP_DEVFN), in tlp_cfg_dword_write()
271 tlp_write_packet(pcie, headers, value, true); in tlp_cfg_dword_write()
273 tlp_write_packet(pcie, headers, value, false); in tlp_cfg_dword_write()
275 ret = tlp_read_packet(pcie, NULL); in tlp_cfg_dword_write()
283 if ((bus == pcie->root_bus_nr) && (where == PCI_PRIMARY_BUS)) in tlp_cfg_dword_write()
284 pcie->root_bus_nr = (u8)(value); in tlp_cfg_dword_write()
292 struct altera_pcie *pcie = bus->sysdata; in altera_pcie_cfg_read() local
300 if (!altera_pcie_valid_config(pcie, bus, PCI_SLOT(devfn))) { in altera_pcie_cfg_read()
317 ret = tlp_cfg_dword_read(pcie, bus->number, devfn, in altera_pcie_cfg_read()
340 struct altera_pcie *pcie = bus->sysdata; in altera_pcie_cfg_write() local
348 if (!altera_pcie_valid_config(pcie, bus, PCI_SLOT(devfn))) in altera_pcie_cfg_write()
366 return tlp_cfg_dword_write(pcie, bus->number, devfn, in altera_pcie_cfg_write()
391 struct altera_pcie *pcie; in altera_pcie_isr() local
397 pcie = irq_desc_get_handler_data(desc); in altera_pcie_isr()
399 while ((status = cra_readl(pcie, P2A_INT_STATUS) in altera_pcie_isr()
403 cra_writel(pcie, 1 << bit, P2A_INT_STATUS); in altera_pcie_isr()
405 virq = irq_find_mapping(pcie->irq_domain, bit + 1); in altera_pcie_isr()
409 dev_err(&pcie->pdev->dev, in altera_pcie_isr()
417 static void altera_pcie_release_of_pci_ranges(struct altera_pcie *pcie) in altera_pcie_release_of_pci_ranges() argument
419 pci_free_resource_list(&pcie->resources); in altera_pcie_release_of_pci_ranges()
422 static int altera_pcie_parse_request_of_pci_ranges(struct altera_pcie *pcie) in altera_pcie_parse_request_of_pci_ranges() argument
425 struct device *dev = &pcie->pdev->dev; in altera_pcie_parse_request_of_pci_ranges()
429 err = of_pci_get_host_bridge_resources(np, 0, 0xff, &pcie->resources, in altera_pcie_parse_request_of_pci_ranges()
434 resource_list_for_each_entry(win, &pcie->resources) { in altera_pcie_parse_request_of_pci_ranges()
460 altera_pcie_release_of_pci_ranges(pcie); in altera_pcie_parse_request_of_pci_ranges()
464 static int altera_pcie_init_irq_domain(struct altera_pcie *pcie) in altera_pcie_init_irq_domain() argument
466 struct device *dev = &pcie->pdev->dev; in altera_pcie_init_irq_domain()
470 pcie->irq_domain = irq_domain_add_linear(node, INTX_NUM + 1, in altera_pcie_init_irq_domain()
471 &intx_domain_ops, pcie); in altera_pcie_init_irq_domain()
472 if (!pcie->irq_domain) { in altera_pcie_init_irq_domain()
480 static int altera_pcie_parse_dt(struct altera_pcie *pcie) in altera_pcie_parse_dt() argument
483 struct platform_device *pdev = pcie->pdev; in altera_pcie_parse_dt()
491 pcie->cra_base = devm_ioremap_resource(&pdev->dev, cra); in altera_pcie_parse_dt()
492 if (IS_ERR(pcie->cra_base)) { in altera_pcie_parse_dt()
494 return PTR_ERR(pcie->cra_base); in altera_pcie_parse_dt()
498 pcie->irq = platform_get_irq(pdev, 0); in altera_pcie_parse_dt()
499 if (pcie->irq <= 0) { in altera_pcie_parse_dt()
500 dev_err(&pdev->dev, "failed to get IRQ: %d\n", pcie->irq); in altera_pcie_parse_dt()
504 irq_set_chained_handler_and_data(pcie->irq, altera_pcie_isr, pcie); in altera_pcie_parse_dt()
511 struct altera_pcie *pcie; in altera_pcie_probe() local
516 pcie = devm_kzalloc(&pdev->dev, sizeof(*pcie), GFP_KERNEL); in altera_pcie_probe()
517 if (!pcie) in altera_pcie_probe()
520 pcie->pdev = pdev; in altera_pcie_probe()
522 ret = altera_pcie_parse_dt(pcie); in altera_pcie_probe()
528 INIT_LIST_HEAD(&pcie->resources); in altera_pcie_probe()
530 ret = altera_pcie_parse_request_of_pci_ranges(pcie); in altera_pcie_probe()
536 ret = altera_pcie_init_irq_domain(pcie); in altera_pcie_probe()
543 cra_writel(pcie, P2A_INT_STS_ALL, P2A_INT_STATUS); in altera_pcie_probe()
545 cra_writel(pcie, P2A_INT_ENA_ALL, P2A_INT_ENABLE); in altera_pcie_probe()
547 bus = pci_scan_root_bus(&pdev->dev, pcie->root_bus_nr, &altera_pcie_ops, in altera_pcie_probe()
548 pcie, &pcie->resources); in altera_pcie_probe()
561 platform_set_drvdata(pdev, pcie); in altera_pcie_probe()