Lines Matching +full:pci +full:- +full:domain

1 // SPDX-License-Identifier: GPL-2.0
19 #include "../../pci.h"
20 #include "pcie-designware.h"
43 .name = "PCI-MSI",
62 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_handle_msi_irq() local
64 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_handle_msi_irq()
67 status = dw_pcie_readl_dbi(pci, PCIE_MSI_INTR0_STATUS + in dw_handle_msi_irq()
77 generic_handle_domain_irq(pp->irq_domain, in dw_handle_msi_irq()
104 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_setup_msi_msg() local
107 msi_target = (u64)pp->msi_data; in dw_pci_setup_msi_msg()
109 msg->address_lo = lower_32_bits(msi_target); in dw_pci_setup_msi_msg()
110 msg->address_hi = upper_32_bits(msi_target); in dw_pci_setup_msi_msg()
112 msg->data = d->hwirq; in dw_pci_setup_msi_msg()
114 dev_dbg(pci->dev, "msi#%d address_hi %#x address_lo %#x\n", in dw_pci_setup_msi_msg()
115 (int)d->hwirq, msg->address_hi, msg->address_lo); in dw_pci_setup_msi_msg()
121 return -EINVAL; in dw_pci_msi_set_affinity()
127 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_mask() local
131 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pci_bottom_mask()
133 ctrl = d->hwirq / MAX_MSI_IRQS_PER_CTRL; in dw_pci_bottom_mask()
135 bit = d->hwirq % MAX_MSI_IRQS_PER_CTRL; in dw_pci_bottom_mask()
137 pp->irq_mask[ctrl] |= BIT(bit); in dw_pci_bottom_mask()
138 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK + res, pp->irq_mask[ctrl]); in dw_pci_bottom_mask()
140 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pci_bottom_mask()
146 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_unmask() local
150 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pci_bottom_unmask()
152 ctrl = d->hwirq / MAX_MSI_IRQS_PER_CTRL; in dw_pci_bottom_unmask()
154 bit = d->hwirq % MAX_MSI_IRQS_PER_CTRL; in dw_pci_bottom_unmask()
156 pp->irq_mask[ctrl] &= ~BIT(bit); in dw_pci_bottom_unmask()
157 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK + res, pp->irq_mask[ctrl]); in dw_pci_bottom_unmask()
159 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pci_bottom_unmask()
165 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_ack() local
168 ctrl = d->hwirq / MAX_MSI_IRQS_PER_CTRL; in dw_pci_bottom_ack()
170 bit = d->hwirq % MAX_MSI_IRQS_PER_CTRL; in dw_pci_bottom_ack()
172 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_STATUS + res, BIT(bit)); in dw_pci_bottom_ack()
176 .name = "DWPCI-MSI",
184 static int dw_pcie_irq_domain_alloc(struct irq_domain *domain, in dw_pcie_irq_domain_alloc() argument
188 struct pcie_port *pp = domain->host_data; in dw_pcie_irq_domain_alloc()
193 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pcie_irq_domain_alloc()
195 bit = bitmap_find_free_region(pp->msi_irq_in_use, pp->num_vectors, in dw_pcie_irq_domain_alloc()
198 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pcie_irq_domain_alloc()
201 return -ENOSPC; in dw_pcie_irq_domain_alloc()
204 irq_domain_set_info(domain, virq + i, bit + i, in dw_pcie_irq_domain_alloc()
205 pp->msi_irq_chip, in dw_pcie_irq_domain_alloc()
212 static void dw_pcie_irq_domain_free(struct irq_domain *domain, in dw_pcie_irq_domain_free() argument
215 struct irq_data *d = irq_domain_get_irq_data(domain, virq); in dw_pcie_irq_domain_free()
216 struct pcie_port *pp = domain->host_data; in dw_pcie_irq_domain_free()
219 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pcie_irq_domain_free()
221 bitmap_release_region(pp->msi_irq_in_use, d->hwirq, in dw_pcie_irq_domain_free()
224 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pcie_irq_domain_free()
234 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_allocate_domains() local
235 struct fwnode_handle *fwnode = of_node_to_fwnode(pci->dev->of_node); in dw_pcie_allocate_domains()
237 pp->irq_domain = irq_domain_create_linear(fwnode, pp->num_vectors, in dw_pcie_allocate_domains()
239 if (!pp->irq_domain) { in dw_pcie_allocate_domains()
240 dev_err(pci->dev, "Failed to create IRQ domain\n"); in dw_pcie_allocate_domains()
241 return -ENOMEM; in dw_pcie_allocate_domains()
244 irq_domain_update_bus_token(pp->irq_domain, DOMAIN_BUS_NEXUS); in dw_pcie_allocate_domains()
246 pp->msi_domain = pci_msi_create_irq_domain(fwnode, in dw_pcie_allocate_domains()
248 pp->irq_domain); in dw_pcie_allocate_domains()
249 if (!pp->msi_domain) { in dw_pcie_allocate_domains()
250 dev_err(pci->dev, "Failed to create MSI domain\n"); in dw_pcie_allocate_domains()
251 irq_domain_remove(pp->irq_domain); in dw_pcie_allocate_domains()
252 return -ENOMEM; in dw_pcie_allocate_domains()
260 if (pp->msi_irq) in dw_pcie_free_msi()
261 irq_set_chained_handler_and_data(pp->msi_irq, NULL, NULL); in dw_pcie_free_msi()
263 irq_domain_remove(pp->msi_domain); in dw_pcie_free_msi()
264 irq_domain_remove(pp->irq_domain); in dw_pcie_free_msi()
266 if (pp->msi_data) { in dw_pcie_free_msi()
267 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_free_msi() local
268 struct device *dev = pci->dev; in dw_pcie_free_msi()
270 dma_unmap_single_attrs(dev, pp->msi_data, sizeof(pp->msi_msg), in dw_pcie_free_msi()
277 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_msi_init() local
278 u64 msi_target = (u64)pp->msi_data; in dw_pcie_msi_init()
280 if (!pci_msi_enabled() || !pp->has_msi_ctrl) in dw_pcie_msi_init()
284 dw_pcie_writel_dbi(pci, PCIE_MSI_ADDR_LO, lower_32_bits(msi_target)); in dw_pcie_msi_init()
285 dw_pcie_writel_dbi(pci, PCIE_MSI_ADDR_HI, upper_32_bits(msi_target)); in dw_pcie_msi_init()
290 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_init() local
291 struct device *dev = pci->dev; in dw_pcie_host_init()
292 struct device_node *np = dev->of_node; in dw_pcie_host_init()
299 raw_spin_lock_init(&pci->pp.lock); in dw_pcie_host_init()
303 pp->cfg0_size = resource_size(cfg_res); in dw_pcie_host_init()
304 pp->cfg0_base = cfg_res->start; in dw_pcie_host_init()
306 pp->va_cfg0_base = devm_pci_remap_cfg_resource(dev, cfg_res); in dw_pcie_host_init()
307 if (IS_ERR(pp->va_cfg0_base)) in dw_pcie_host_init()
308 return PTR_ERR(pp->va_cfg0_base); in dw_pcie_host_init()
311 return -ENODEV; in dw_pcie_host_init()
314 if (!pci->dbi_base) { in dw_pcie_host_init()
316 pci->dbi_base = devm_pci_remap_cfg_resource(dev, dbi_res); in dw_pcie_host_init()
317 if (IS_ERR(pci->dbi_base)) in dw_pcie_host_init()
318 return PTR_ERR(pci->dbi_base); in dw_pcie_host_init()
323 return -ENOMEM; in dw_pcie_host_init()
325 pp->bridge = bridge; in dw_pcie_host_init()
328 win = resource_list_first_type(&bridge->windows, IORESOURCE_IO); in dw_pcie_host_init()
330 pp->io_size = resource_size(win->res); in dw_pcie_host_init()
331 pp->io_bus_addr = win->res->start - win->offset; in dw_pcie_host_init()
332 pp->io_base = pci_pio_to_address(win->res->start); in dw_pcie_host_init()
335 if (pci->link_gen < 1) in dw_pcie_host_init()
336 pci->link_gen = of_pci_get_max_link_speed(np); in dw_pcie_host_init()
339 pp->has_msi_ctrl = !(pp->ops->msi_host_init || in dw_pcie_host_init()
340 of_property_read_bool(np, "msi-parent") || in dw_pcie_host_init()
341 of_property_read_bool(np, "msi-map")); in dw_pcie_host_init()
343 if (!pp->num_vectors) { in dw_pcie_host_init()
344 pp->num_vectors = MSI_DEF_NUM_VECTORS; in dw_pcie_host_init()
345 } else if (pp->num_vectors > MAX_MSI_IRQS) { in dw_pcie_host_init()
347 return -EINVAL; in dw_pcie_host_init()
350 if (pp->ops->msi_host_init) { in dw_pcie_host_init()
351 ret = pp->ops->msi_host_init(pp); in dw_pcie_host_init()
354 } else if (pp->has_msi_ctrl) { in dw_pcie_host_init()
355 if (!pp->msi_irq) { in dw_pcie_host_init()
356 pp->msi_irq = platform_get_irq_byname_optional(pdev, "msi"); in dw_pcie_host_init()
357 if (pp->msi_irq < 0) { in dw_pcie_host_init()
358 pp->msi_irq = platform_get_irq(pdev, 0); in dw_pcie_host_init()
359 if (pp->msi_irq < 0) in dw_pcie_host_init()
360 return pp->msi_irq; in dw_pcie_host_init()
364 pp->msi_irq_chip = &dw_pci_msi_bottom_irq_chip; in dw_pcie_host_init()
370 if (pp->msi_irq > 0) in dw_pcie_host_init()
371 irq_set_chained_handler_and_data(pp->msi_irq, in dw_pcie_host_init()
375 ret = dma_set_mask(pci->dev, DMA_BIT_MASK(32)); in dw_pcie_host_init()
377 …dev_warn(pci->dev, "Failed to set DMA mask to 32-bit. Devices with only 32-bit MSI support may not… in dw_pcie_host_init()
379 pp->msi_data = dma_map_single_attrs(pci->dev, &pp->msi_msg, in dw_pcie_host_init()
380 sizeof(pp->msi_msg), in dw_pcie_host_init()
383 if (dma_mapping_error(pci->dev, pp->msi_data)) { in dw_pcie_host_init()
384 dev_err(pci->dev, "Failed to map MSI data\n"); in dw_pcie_host_init()
385 pp->msi_data = 0; in dw_pcie_host_init()
392 bridge->ops = &dw_pcie_ops; in dw_pcie_host_init()
393 bridge->child_ops = &dw_child_pcie_ops; in dw_pcie_host_init()
395 if (pp->ops->host_init) { in dw_pcie_host_init()
396 ret = pp->ops->host_init(pp); in dw_pcie_host_init()
400 dw_pcie_iatu_detect(pci); in dw_pcie_host_init()
404 if (!dw_pcie_link_up(pci) && pci->ops && pci->ops->start_link) { in dw_pcie_host_init()
405 ret = pci->ops->start_link(pci); in dw_pcie_host_init()
411 dw_pcie_wait_for_link(pci); in dw_pcie_host_init()
413 bridge->sysdata = pp; in dw_pcie_host_init()
420 if (pp->has_msi_ctrl) in dw_pcie_host_init()
428 pci_stop_root_bus(pp->bridge->bus); in dw_pcie_host_deinit()
429 pci_remove_root_bus(pp->bridge->bus); in dw_pcie_host_deinit()
430 if (pp->has_msi_ctrl) in dw_pcie_host_deinit()
440 struct pcie_port *pp = bus->sysdata; in dw_pcie_other_conf_map_bus()
441 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_other_conf_map_bus() local
446 * SError upon PCI configuration transactions issued when the link in dw_pcie_other_conf_map_bus()
451 if (!dw_pcie_link_up(pci)) in dw_pcie_other_conf_map_bus()
454 busdev = PCIE_ATU_BUS(bus->number) | PCIE_ATU_DEV(PCI_SLOT(devfn)) | in dw_pcie_other_conf_map_bus()
457 if (pci_is_root_bus(bus->parent)) in dw_pcie_other_conf_map_bus()
463 dw_pcie_prog_outbound_atu(pci, 0, type, pp->cfg0_base, busdev, pp->cfg0_size); in dw_pcie_other_conf_map_bus()
465 return pp->va_cfg0_base + where; in dw_pcie_other_conf_map_bus()
472 struct pcie_port *pp = bus->sysdata; in dw_pcie_rd_other_conf()
473 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_rd_other_conf() local
477 if (!ret && pci->io_cfg_atu_shared) in dw_pcie_rd_other_conf()
478 dw_pcie_prog_outbound_atu(pci, 0, PCIE_ATU_TYPE_IO, pp->io_base, in dw_pcie_rd_other_conf()
479 pp->io_bus_addr, pp->io_size); in dw_pcie_rd_other_conf()
488 struct pcie_port *pp = bus->sysdata; in dw_pcie_wr_other_conf()
489 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_wr_other_conf() local
493 if (!ret && pci->io_cfg_atu_shared) in dw_pcie_wr_other_conf()
494 dw_pcie_prog_outbound_atu(pci, 0, PCIE_ATU_TYPE_IO, pp->io_base, in dw_pcie_wr_other_conf()
495 pp->io_bus_addr, pp->io_size); in dw_pcie_wr_other_conf()
508 struct pcie_port *pp = bus->sysdata; in dw_pcie_own_conf_map_bus()
509 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_own_conf_map_bus() local
514 return pci->dbi_base + where; in dw_pcie_own_conf_map_bus()
528 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_setup_rc() local
531 * Enable DBI read-only registers for writing/updating configuration. in dw_pcie_setup_rc()
534 dw_pcie_dbi_ro_wr_en(pci); in dw_pcie_setup_rc()
536 dw_pcie_setup(pci); in dw_pcie_setup_rc()
538 if (pp->has_msi_ctrl) { in dw_pcie_setup_rc()
539 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_pcie_setup_rc()
543 pp->irq_mask[ctrl] = ~0; in dw_pcie_setup_rc()
544 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK + in dw_pcie_setup_rc()
546 pp->irq_mask[ctrl]); in dw_pcie_setup_rc()
547 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_ENABLE + in dw_pcie_setup_rc()
556 dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_0, 0x00000004); in dw_pcie_setup_rc()
557 dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_1, 0x00000000); in dw_pcie_setup_rc()
560 val = dw_pcie_readl_dbi(pci, PCI_INTERRUPT_LINE); in dw_pcie_setup_rc()
563 dw_pcie_writel_dbi(pci, PCI_INTERRUPT_LINE, val); in dw_pcie_setup_rc()
566 val = dw_pcie_readl_dbi(pci, PCI_PRIMARY_BUS); in dw_pcie_setup_rc()
569 dw_pcie_writel_dbi(pci, PCI_PRIMARY_BUS, val); in dw_pcie_setup_rc()
572 val = dw_pcie_readl_dbi(pci, PCI_COMMAND); in dw_pcie_setup_rc()
576 dw_pcie_writel_dbi(pci, PCI_COMMAND, val); in dw_pcie_setup_rc()
579 for (i = 0; i < pci->num_ob_windows; i++) in dw_pcie_setup_rc()
580 dw_pcie_disable_atu(pci, i, DW_PCIE_REGION_OUTBOUND); in dw_pcie_setup_rc()
587 if (pp->bridge->child_ops == &dw_child_pcie_ops) { in dw_pcie_setup_rc()
592 resource_list_for_each_entry(entry, &pp->bridge->windows) { in dw_pcie_setup_rc()
593 if (resource_type(entry->res) != IORESOURCE_MEM) in dw_pcie_setup_rc()
596 if (pci->num_ob_windows <= ++atu_idx) in dw_pcie_setup_rc()
599 dw_pcie_prog_outbound_atu(pci, atu_idx, in dw_pcie_setup_rc()
600 PCIE_ATU_TYPE_MEM, entry->res->start, in dw_pcie_setup_rc()
601 entry->res->start - entry->offset, in dw_pcie_setup_rc()
602 resource_size(entry->res)); in dw_pcie_setup_rc()
605 if (pp->io_size) { in dw_pcie_setup_rc()
606 if (pci->num_ob_windows > ++atu_idx) in dw_pcie_setup_rc()
607 dw_pcie_prog_outbound_atu(pci, atu_idx, in dw_pcie_setup_rc()
608 PCIE_ATU_TYPE_IO, pp->io_base, in dw_pcie_setup_rc()
609 pp->io_bus_addr, pp->io_size); in dw_pcie_setup_rc()
611 pci->io_cfg_atu_shared = true; in dw_pcie_setup_rc()
614 if (pci->num_ob_windows <= atu_idx) in dw_pcie_setup_rc()
615 dev_warn(pci->dev, "Resources exceed number of ATU entries (%d)", in dw_pcie_setup_rc()
616 pci->num_ob_windows); in dw_pcie_setup_rc()
619 dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_0, 0); in dw_pcie_setup_rc()
622 dw_pcie_writew_dbi(pci, PCI_CLASS_DEVICE, PCI_CLASS_BRIDGE_PCI); in dw_pcie_setup_rc()
624 val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL); in dw_pcie_setup_rc()
626 dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val); in dw_pcie_setup_rc()
628 dw_pcie_dbi_ro_wr_dis(pci); in dw_pcie_setup_rc()