Lines Matching refs:pcie

45 #define S10_RP_CFG_ADDR(pcie, reg)	\
46 (((pcie)->hip_base) + (reg) + (1 << 20))
47 #define S10_RP_SECONDARY(pcie) \
48 readb(S10_RP_CFG_ADDR(pcie, PCI_SECONDARY_BUS))
60 #define TLP_CFG_DW0(pcie, cfg) \
63 #define TLP_CFG_DW1(pcie, tag, be) \
64 (((TLP_REQ_ID(pcie->root_bus_nr, RP_DEVFN)) << 16) | (tag << 8) | (be))
99 int (*tlp_read_pkt)(struct altera_pcie *pcie, u32 *value);
100 void (*tlp_write_pkt)(struct altera_pcie *pcie, u32 *headers,
102 bool (*get_link_status)(struct altera_pcie *pcie);
103 int (*rp_read_cfg)(struct altera_pcie *pcie, int where,
105 int (*rp_write_cfg)(struct altera_pcie *pcie, u8 busno,
125 static inline void cra_writel(struct altera_pcie *pcie, const u32 value,
128 writel_relaxed(value, pcie->cra_base + reg);
131 static inline u32 cra_readl(struct altera_pcie *pcie, const u32 reg)
133 return readl_relaxed(pcie->cra_base + reg);
136 static bool altera_pcie_link_up(struct altera_pcie *pcie)
138 return !!((cra_readl(pcie, RP_LTSSM) & RP_LTSSM_MASK) == LTSSM_L0);
141 static bool s10_altera_pcie_link_up(struct altera_pcie *pcie)
143 void __iomem *addr = S10_RP_CFG_ADDR(pcie,
144 pcie->pcie_data->cap_offset +
169 static void tlp_write_tx(struct altera_pcie *pcie,
172 cra_writel(pcie, tlp_rp_regdata->reg0, RP_TX_REG0);
173 cra_writel(pcie, tlp_rp_regdata->reg1, RP_TX_REG1);
174 cra_writel(pcie, tlp_rp_regdata->ctrl, RP_TX_CNTRL);
177 static void s10_tlp_write_tx(struct altera_pcie *pcie, u32 reg0, u32 ctrl)
179 cra_writel(pcie, reg0, RP_TX_REG0);
180 cra_writel(pcie, ctrl, S10_RP_TX_CNTRL);
183 static bool altera_pcie_valid_device(struct altera_pcie *pcie,
187 if (bus->number != pcie->root_bus_nr) {
188 if (!pcie->pcie_data->ops->get_link_status(pcie))
193 if (bus->number == pcie->root_bus_nr && dev > 0)
199 static int tlp_read_packet(struct altera_pcie *pcie, u32 *value)
212 ctrl = cra_readl(pcie, RP_RXCPL_STATUS);
214 reg0 = cra_readl(pcie, RP_RXCPL_REG0);
215 reg1 = cra_readl(pcie, RP_RXCPL_REG1);
238 static int s10_tlp_read_packet(struct altera_pcie *pcie, u32 *value)
244 struct device *dev = &pcie->pdev->dev;
247 ctrl = cra_readl(pcie, S10_RP_RXCPL_STATUS);
250 dw[0] = cra_readl(pcie, S10_RP_RXCPL_REG);
265 ctrl = cra_readl(pcie, S10_RP_RXCPL_STATUS);
266 dw[count++] = cra_readl(pcie, S10_RP_RXCPL_REG);
285 static void tlp_write_packet(struct altera_pcie *pcie, u32 *headers,
293 tlp_write_tx(pcie, &tlp_rp_regdata);
299 tlp_write_tx(pcie, &tlp_rp_regdata);
309 tlp_write_tx(pcie, &tlp_rp_regdata);
312 static void s10_tlp_write_packet(struct altera_pcie *pcie, u32 *headers,
315 s10_tlp_write_tx(pcie, headers[0], RP_TX_SOP);
316 s10_tlp_write_tx(pcie, headers[1], 0);
317 s10_tlp_write_tx(pcie, headers[2], 0);
318 s10_tlp_write_tx(pcie, data, RP_TX_EOP);
321 static void get_tlp_header(struct altera_pcie *pcie, u8 bus, u32 devfn,
325 u8 cfg0 = read ? pcie->pcie_data->cfgrd0 : pcie->pcie_data->cfgwr0;
326 u8 cfg1 = read ? pcie->pcie_data->cfgrd1 : pcie->pcie_data->cfgwr1;
329 if (pcie->pcie_data->version == ALTERA_PCIE_V1)
330 cfg = (bus == pcie->root_bus_nr) ? cfg0 : cfg1;
332 cfg = (bus > S10_RP_SECONDARY(pcie)) ? cfg0 : cfg1;
334 headers[0] = TLP_CFG_DW0(pcie, cfg);
335 headers[1] = TLP_CFG_DW1(pcie, tag, byte_en);
339 static int tlp_cfg_dword_read(struct altera_pcie *pcie, u8 bus, u32 devfn,
344 get_tlp_header(pcie, bus, devfn, where, byte_en, true,
347 pcie->pcie_data->ops->tlp_write_pkt(pcie, headers, 0, false);
349 return pcie->pcie_data->ops->tlp_read_pkt(pcie, value);
352 static int tlp_cfg_dword_write(struct altera_pcie *pcie, u8 bus, u32 devfn,
358 get_tlp_header(pcie, bus, devfn, where, byte_en, false,
363 pcie->pcie_data->ops->tlp_write_pkt(pcie, headers,
366 pcie->pcie_data->ops->tlp_write_pkt(pcie, headers,
369 ret = pcie->pcie_data->ops->tlp_read_pkt(pcie, NULL);
377 if ((bus == pcie->root_bus_nr) && (where == PCI_PRIMARY_BUS))
378 pcie->root_bus_nr = (u8)(value);
383 static int s10_rp_read_cfg(struct altera_pcie *pcie, int where,
386 void __iomem *addr = S10_RP_CFG_ADDR(pcie, where);
403 static int s10_rp_write_cfg(struct altera_pcie *pcie, u8 busno,
406 void __iomem *addr = S10_RP_CFG_ADDR(pcie, where);
424 if (busno == pcie->root_bus_nr && where == PCI_PRIMARY_BUS)
425 pcie->root_bus_nr = value & 0xff;
430 static int _altera_pcie_cfg_read(struct altera_pcie *pcie, u8 busno,
438 if (busno == pcie->root_bus_nr && pcie->pcie_data->ops->rp_read_cfg)
439 return pcie->pcie_data->ops->rp_read_cfg(pcie, where,
454 ret = tlp_cfg_dword_read(pcie, busno, devfn,
474 static int _altera_pcie_cfg_write(struct altera_pcie *pcie, u8 busno,
482 if (busno == pcie->root_bus_nr && pcie->pcie_data->ops->rp_write_cfg)
483 return pcie->pcie_data->ops->rp_write_cfg(pcie, busno,
501 return tlp_cfg_dword_write(pcie, busno, devfn, (where & ~DWORD_MASK),
508 struct altera_pcie *pcie = bus->sysdata;
513 if (!altera_pcie_valid_device(pcie, bus, PCI_SLOT(devfn))) {
518 return _altera_pcie_cfg_read(pcie, bus->number, devfn, where, size,
525 struct altera_pcie *pcie = bus->sysdata;
530 if (!altera_pcie_valid_device(pcie, bus, PCI_SLOT(devfn)))
533 return _altera_pcie_cfg_write(pcie, bus->number, devfn, where, size,
542 static int altera_read_cap_word(struct altera_pcie *pcie, u8 busno,
548 ret = _altera_pcie_cfg_read(pcie, busno, devfn,
549 pcie->pcie_data->cap_offset + offset,
556 static int altera_write_cap_word(struct altera_pcie *pcie, u8 busno,
559 return _altera_pcie_cfg_write(pcie, busno, devfn,
560 pcie->pcie_data->cap_offset + offset,
565 static void altera_wait_link_retrain(struct altera_pcie *pcie)
567 struct device *dev = &pcie->pdev->dev;
574 altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
589 if (pcie->pcie_data->ops->get_link_status(pcie))
600 static void altera_pcie_retrain(struct altera_pcie *pcie)
604 if (!pcie->pcie_data->ops->get_link_status(pcie))
611 altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN, PCI_EXP_LNKCAP,
616 altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN, PCI_EXP_LNKSTA,
619 altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
622 altera_write_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
625 altera_wait_link_retrain(pcie);
645 struct altera_pcie *pcie;
652 pcie = irq_desc_get_handler_data(desc);
653 dev = &pcie->pdev->dev;
655 while ((status = cra_readl(pcie, P2A_INT_STATUS)
659 cra_writel(pcie, 1 << bit, P2A_INT_STATUS);
661 virq = irq_find_mapping(pcie->irq_domain, bit);
672 static int altera_pcie_init_irq_domain(struct altera_pcie *pcie)
674 struct device *dev = &pcie->pdev->dev;
678 pcie->irq_domain = irq_domain_add_linear(node, PCI_NUM_INTX,
679 &intx_domain_ops, pcie);
680 if (!pcie->irq_domain) {
688 static void altera_pcie_irq_teardown(struct altera_pcie *pcie)
690 irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
691 irq_domain_remove(pcie->irq_domain);
692 irq_dispose_mapping(pcie->irq);
695 static int altera_pcie_parse_dt(struct altera_pcie *pcie)
697 struct platform_device *pdev = pcie->pdev;
699 pcie->cra_base = devm_platform_ioremap_resource_byname(pdev, "Cra");
700 if (IS_ERR(pcie->cra_base))
701 return PTR_ERR(pcie->cra_base);
703 if (pcie->pcie_data->version == ALTERA_PCIE_V2) {
704 pcie->hip_base =
706 if (IS_ERR(pcie->hip_base))
707 return PTR_ERR(pcie->hip_base);
711 pcie->irq = platform_get_irq(pdev, 0);
712 if (pcie->irq < 0)
713 return pcie->irq;
715 irq_set_chained_handler_and_data(pcie->irq, altera_pcie_isr, pcie);
719 static void altera_pcie_host_init(struct altera_pcie *pcie)
721 altera_pcie_retrain(pcie);
759 {.compatible = "altr,pcie-root-port-1.0",
761 {.compatible = "altr,pcie-root-port-2.0",
769 struct altera_pcie *pcie;
774 bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
778 pcie = pci_host_bridge_priv(bridge);
779 pcie->pdev = pdev;
780 platform_set_drvdata(pdev, pcie);
786 pcie->pcie_data = match->data;
788 ret = altera_pcie_parse_dt(pcie);
794 ret = altera_pcie_init_irq_domain(pcie);
801 cra_writel(pcie, P2A_INT_STS_ALL, P2A_INT_STATUS);
803 cra_writel(pcie, P2A_INT_ENA_ALL, P2A_INT_ENABLE);
804 altera_pcie_host_init(pcie);
806 bridge->sysdata = pcie;
807 bridge->busnr = pcie->root_bus_nr;
815 struct altera_pcie *pcie = platform_get_drvdata(pdev);
816 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
820 altera_pcie_irq_teardown(pcie);
829 .name = "altera-pcie",