Lines Matching refs:pcie

44 #define S10_RP_CFG_ADDR(pcie, reg)	\
45 (((pcie)->hip_base) + (reg) + (1 << 20))
46 #define S10_RP_SECONDARY(pcie) \
47 readb(S10_RP_CFG_ADDR(pcie, PCI_SECONDARY_BUS))
59 #define TLP_CFG_DW0(pcie, cfg) \
62 #define TLP_CFG_DW1(pcie, tag, be) \
63 (((TLP_REQ_ID(pcie->root_bus_nr, RP_DEVFN)) << 16) | (tag << 8) | (be))
98 int (*tlp_read_pkt)(struct altera_pcie *pcie, u32 *value);
99 void (*tlp_write_pkt)(struct altera_pcie *pcie, u32 *headers,
101 bool (*get_link_status)(struct altera_pcie *pcie);
102 int (*rp_read_cfg)(struct altera_pcie *pcie, int where,
104 int (*rp_write_cfg)(struct altera_pcie *pcie, u8 busno,
124 static inline void cra_writel(struct altera_pcie *pcie, const u32 value,
127 writel_relaxed(value, pcie->cra_base + reg);
130 static inline u32 cra_readl(struct altera_pcie *pcie, const u32 reg)
132 return readl_relaxed(pcie->cra_base + reg);
135 static bool altera_pcie_link_up(struct altera_pcie *pcie)
137 return !!((cra_readl(pcie, RP_LTSSM) & RP_LTSSM_MASK) == LTSSM_L0);
140 static bool s10_altera_pcie_link_up(struct altera_pcie *pcie)
142 void __iomem *addr = S10_RP_CFG_ADDR(pcie,
143 pcie->pcie_data->cap_offset +
168 static void tlp_write_tx(struct altera_pcie *pcie,
171 cra_writel(pcie, tlp_rp_regdata->reg0, RP_TX_REG0);
172 cra_writel(pcie, tlp_rp_regdata->reg1, RP_TX_REG1);
173 cra_writel(pcie, tlp_rp_regdata->ctrl, RP_TX_CNTRL);
176 static void s10_tlp_write_tx(struct altera_pcie *pcie, u32 reg0, u32 ctrl)
178 cra_writel(pcie, reg0, RP_TX_REG0);
179 cra_writel(pcie, ctrl, S10_RP_TX_CNTRL);
182 static bool altera_pcie_valid_device(struct altera_pcie *pcie,
186 if (bus->number != pcie->root_bus_nr) {
187 if (!pcie->pcie_data->ops->get_link_status(pcie))
192 if (bus->number == pcie->root_bus_nr && dev > 0)
198 static int tlp_read_packet(struct altera_pcie *pcie, u32 *value)
211 ctrl = cra_readl(pcie, RP_RXCPL_STATUS);
213 reg0 = cra_readl(pcie, RP_RXCPL_REG0);
214 reg1 = cra_readl(pcie, RP_RXCPL_REG1);
237 static int s10_tlp_read_packet(struct altera_pcie *pcie, u32 *value)
243 struct device *dev = &pcie->pdev->dev;
246 ctrl = cra_readl(pcie, S10_RP_RXCPL_STATUS);
249 dw[0] = cra_readl(pcie, S10_RP_RXCPL_REG);
264 ctrl = cra_readl(pcie, S10_RP_RXCPL_STATUS);
265 dw[count++] = cra_readl(pcie, S10_RP_RXCPL_REG);
284 static void tlp_write_packet(struct altera_pcie *pcie, u32 *headers,
292 tlp_write_tx(pcie, &tlp_rp_regdata);
298 tlp_write_tx(pcie, &tlp_rp_regdata);
308 tlp_write_tx(pcie, &tlp_rp_regdata);
311 static void s10_tlp_write_packet(struct altera_pcie *pcie, u32 *headers,
314 s10_tlp_write_tx(pcie, headers[0], RP_TX_SOP);
315 s10_tlp_write_tx(pcie, headers[1], 0);
316 s10_tlp_write_tx(pcie, headers[2], 0);
317 s10_tlp_write_tx(pcie, data, RP_TX_EOP);
320 static void get_tlp_header(struct altera_pcie *pcie, u8 bus, u32 devfn,
324 u8 cfg0 = read ? pcie->pcie_data->cfgrd0 : pcie->pcie_data->cfgwr0;
325 u8 cfg1 = read ? pcie->pcie_data->cfgrd1 : pcie->pcie_data->cfgwr1;
328 if (pcie->pcie_data->version == ALTERA_PCIE_V1)
329 cfg = (bus == pcie->root_bus_nr) ? cfg0 : cfg1;
331 cfg = (bus > S10_RP_SECONDARY(pcie)) ? cfg0 : cfg1;
333 headers[0] = TLP_CFG_DW0(pcie, cfg);
334 headers[1] = TLP_CFG_DW1(pcie, tag, byte_en);
338 static int tlp_cfg_dword_read(struct altera_pcie *pcie, u8 bus, u32 devfn,
343 get_tlp_header(pcie, bus, devfn, where, byte_en, true,
346 pcie->pcie_data->ops->tlp_write_pkt(pcie, headers, 0, false);
348 return pcie->pcie_data->ops->tlp_read_pkt(pcie, value);
351 static int tlp_cfg_dword_write(struct altera_pcie *pcie, u8 bus, u32 devfn,
357 get_tlp_header(pcie, bus, devfn, where, byte_en, false,
362 pcie->pcie_data->ops->tlp_write_pkt(pcie, headers,
365 pcie->pcie_data->ops->tlp_write_pkt(pcie, headers,
368 ret = pcie->pcie_data->ops->tlp_read_pkt(pcie, NULL);
376 if ((bus == pcie->root_bus_nr) && (where == PCI_PRIMARY_BUS))
377 pcie->root_bus_nr = (u8)(value);
382 static int s10_rp_read_cfg(struct altera_pcie *pcie, int where,
385 void __iomem *addr = S10_RP_CFG_ADDR(pcie, where);
402 static int s10_rp_write_cfg(struct altera_pcie *pcie, u8 busno,
405 void __iomem *addr = S10_RP_CFG_ADDR(pcie, where);
423 if (busno == pcie->root_bus_nr && where == PCI_PRIMARY_BUS)
424 pcie->root_bus_nr = value & 0xff;
429 static int _altera_pcie_cfg_read(struct altera_pcie *pcie, u8 busno,
437 if (busno == pcie->root_bus_nr && pcie->pcie_data->ops->rp_read_cfg)
438 return pcie->pcie_data->ops->rp_read_cfg(pcie, where,
453 ret = tlp_cfg_dword_read(pcie, busno, devfn,
473 static int _altera_pcie_cfg_write(struct altera_pcie *pcie, u8 busno,
481 if (busno == pcie->root_bus_nr && pcie->pcie_data->ops->rp_write_cfg)
482 return pcie->pcie_data->ops->rp_write_cfg(pcie, busno,
500 return tlp_cfg_dword_write(pcie, busno, devfn, (where & ~DWORD_MASK),
507 struct altera_pcie *pcie = bus->sysdata;
512 if (!altera_pcie_valid_device(pcie, bus, PCI_SLOT(devfn)))
515 return _altera_pcie_cfg_read(pcie, bus->number, devfn, where, size,
522 struct altera_pcie *pcie = bus->sysdata;
527 if (!altera_pcie_valid_device(pcie, bus, PCI_SLOT(devfn)))
530 return _altera_pcie_cfg_write(pcie, bus->number, devfn, where, size,
539 static int altera_read_cap_word(struct altera_pcie *pcie, u8 busno,
545 ret = _altera_pcie_cfg_read(pcie, busno, devfn,
546 pcie->pcie_data->cap_offset + offset,
553 static int altera_write_cap_word(struct altera_pcie *pcie, u8 busno,
556 return _altera_pcie_cfg_write(pcie, busno, devfn,
557 pcie->pcie_data->cap_offset + offset,
562 static void altera_wait_link_retrain(struct altera_pcie *pcie)
564 struct device *dev = &pcie->pdev->dev;
571 altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
586 if (pcie->pcie_data->ops->get_link_status(pcie))
597 static void altera_pcie_retrain(struct altera_pcie *pcie)
601 if (!pcie->pcie_data->ops->get_link_status(pcie))
608 altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN, PCI_EXP_LNKCAP,
613 altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN, PCI_EXP_LNKSTA,
616 altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
619 altera_write_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
622 altera_wait_link_retrain(pcie);
642 struct altera_pcie *pcie;
649 pcie = irq_desc_get_handler_data(desc);
650 dev = &pcie->pdev->dev;
652 while ((status = cra_readl(pcie, P2A_INT_STATUS)
656 cra_writel(pcie, 1 << bit, P2A_INT_STATUS);
658 ret = generic_handle_domain_irq(pcie->irq_domain, bit);
667 static int altera_pcie_init_irq_domain(struct altera_pcie *pcie)
669 struct device *dev = &pcie->pdev->dev;
673 pcie->irq_domain = irq_domain_add_linear(node, PCI_NUM_INTX,
674 &intx_domain_ops, pcie);
675 if (!pcie->irq_domain) {
683 static void altera_pcie_irq_teardown(struct altera_pcie *pcie)
685 irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
686 irq_domain_remove(pcie->irq_domain);
687 irq_dispose_mapping(pcie->irq);
690 static int altera_pcie_parse_dt(struct altera_pcie *pcie)
692 struct platform_device *pdev = pcie->pdev;
694 pcie->cra_base = devm_platform_ioremap_resource_byname(pdev, "Cra");
695 if (IS_ERR(pcie->cra_base))
696 return PTR_ERR(pcie->cra_base);
698 if (pcie->pcie_data->version == ALTERA_PCIE_V2) {
699 pcie->hip_base =
701 if (IS_ERR(pcie->hip_base))
702 return PTR_ERR(pcie->hip_base);
706 pcie->irq = platform_get_irq(pdev, 0);
707 if (pcie->irq < 0)
708 return pcie->irq;
710 irq_set_chained_handler_and_data(pcie->irq, altera_pcie_isr, pcie);
714 static void altera_pcie_host_init(struct altera_pcie *pcie)
716 altera_pcie_retrain(pcie);
754 {.compatible = "altr,pcie-root-port-1.0",
756 {.compatible = "altr,pcie-root-port-2.0",
764 struct altera_pcie *pcie;
769 bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
773 pcie = pci_host_bridge_priv(bridge);
774 pcie->pdev = pdev;
775 platform_set_drvdata(pdev, pcie);
781 pcie->pcie_data = data;
783 ret = altera_pcie_parse_dt(pcie);
789 ret = altera_pcie_init_irq_domain(pcie);
796 cra_writel(pcie, P2A_INT_STS_ALL, P2A_INT_STATUS);
798 cra_writel(pcie, P2A_INT_ENA_ALL, P2A_INT_ENABLE);
799 altera_pcie_host_init(pcie);
801 bridge->sysdata = pcie;
802 bridge->busnr = pcie->root_bus_nr;
810 struct altera_pcie *pcie = platform_get_drvdata(pdev);
811 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
815 altera_pcie_irq_teardown(pcie);
822 .name = "altera-pcie",