Lines Matching full:pp

49 irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp)  in dw_handle_msi_irq()  argument
55 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_handle_msi_irq()
57 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_handle_msi_irq()
70 generic_handle_domain_irq(pp->irq_domain, in dw_handle_msi_irq()
84 struct dw_pcie_rp *pp; in dw_chained_msi_isr() local
88 pp = irq_desc_get_handler_data(desc); in dw_chained_msi_isr()
89 dw_handle_msi_irq(pp); in dw_chained_msi_isr()
96 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_setup_msi_msg() local
97 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_setup_msi_msg()
100 msi_target = (u64)pp->msi_data; in dw_pci_setup_msi_msg()
113 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_mask() local
114 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_mask()
118 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pci_bottom_mask()
124 pp->irq_mask[ctrl] |= BIT(bit); in dw_pci_bottom_mask()
125 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK + res, pp->irq_mask[ctrl]); in dw_pci_bottom_mask()
127 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pci_bottom_mask()
132 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_unmask() local
133 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_unmask()
137 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pci_bottom_unmask()
143 pp->irq_mask[ctrl] &= ~BIT(bit); in dw_pci_bottom_unmask()
144 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK + res, pp->irq_mask[ctrl]); in dw_pci_bottom_unmask()
146 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pci_bottom_unmask()
151 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_ack() local
152 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_ack()
174 struct dw_pcie_rp *pp = domain->host_data; in dw_pcie_irq_domain_alloc() local
179 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pcie_irq_domain_alloc()
181 bit = bitmap_find_free_region(pp->msi_irq_in_use, pp->num_vectors, in dw_pcie_irq_domain_alloc()
184 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pcie_irq_domain_alloc()
191 pp->msi_irq_chip, in dw_pcie_irq_domain_alloc()
192 pp, handle_edge_irq, in dw_pcie_irq_domain_alloc()
202 struct dw_pcie_rp *pp = domain->host_data; in dw_pcie_irq_domain_free() local
205 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pcie_irq_domain_free()
207 bitmap_release_region(pp->msi_irq_in_use, d->hwirq, in dw_pcie_irq_domain_free()
210 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pcie_irq_domain_free()
218 int dw_pcie_allocate_domains(struct dw_pcie_rp *pp) in dw_pcie_allocate_domains() argument
220 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_allocate_domains()
224 .size = pp->num_vectors, in dw_pcie_allocate_domains()
225 .host_data = pp, in dw_pcie_allocate_domains()
228 pp->irq_domain = msi_create_parent_irq_domain(&info, &dw_pcie_msi_parent_ops); in dw_pcie_allocate_domains()
229 if (!pp->irq_domain) { in dw_pcie_allocate_domains()
237 void dw_pcie_free_msi(struct dw_pcie_rp *pp) in dw_pcie_free_msi() argument
242 if (pp->msi_irq[ctrl] > 0) in dw_pcie_free_msi()
243 irq_set_chained_handler_and_data(pp->msi_irq[ctrl], in dw_pcie_free_msi()
247 irq_domain_remove(pp->irq_domain); in dw_pcie_free_msi()
251 void dw_pcie_msi_init(struct dw_pcie_rp *pp) in dw_pcie_msi_init() argument
253 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_msi_init()
254 u64 msi_target = (u64)pp->msi_data; in dw_pcie_msi_init()
257 if (!pci_msi_enabled() || !pp->has_msi_ctrl) in dw_pcie_msi_init()
260 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_pcie_msi_init()
266 pp->irq_mask[ctrl]); in dw_pcie_msi_init()
278 static int dw_pcie_parse_split_msi_irq(struct dw_pcie_rp *pp) in dw_pcie_parse_split_msi_irq() argument
280 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_parse_split_msi_irq()
299 pp->msi_irq[ctrl] = irq; in dw_pcie_parse_split_msi_irq()
307 if (pp->num_vectors > max_vectors) { in dw_pcie_parse_split_msi_irq()
310 pp->num_vectors = max_vectors; in dw_pcie_parse_split_msi_irq()
312 if (!pp->num_vectors) in dw_pcie_parse_split_msi_irq()
313 pp->num_vectors = max_vectors; in dw_pcie_parse_split_msi_irq()
318 int dw_pcie_msi_host_init(struct dw_pcie_rp *pp) in dw_pcie_msi_host_init() argument
320 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_msi_host_init()
328 pp->irq_mask[ctrl] = ~0; in dw_pcie_msi_host_init()
330 if (!pp->msi_irq[0]) { in dw_pcie_msi_host_init()
331 ret = dw_pcie_parse_split_msi_irq(pp); in dw_pcie_msi_host_init()
336 if (!pp->num_vectors) in dw_pcie_msi_host_init()
337 pp->num_vectors = MSI_DEF_NUM_VECTORS; in dw_pcie_msi_host_init()
338 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_pcie_msi_host_init()
340 if (!pp->msi_irq[0]) { in dw_pcie_msi_host_init()
341 pp->msi_irq[0] = platform_get_irq_byname_optional(pdev, "msi"); in dw_pcie_msi_host_init()
342 if (pp->msi_irq[0] < 0) { in dw_pcie_msi_host_init()
343 pp->msi_irq[0] = platform_get_irq(pdev, 0); in dw_pcie_msi_host_init()
344 if (pp->msi_irq[0] < 0) in dw_pcie_msi_host_init()
345 return pp->msi_irq[0]; in dw_pcie_msi_host_init()
349 dev_dbg(dev, "Using %d MSI vectors\n", pp->num_vectors); in dw_pcie_msi_host_init()
351 pp->msi_irq_chip = &dw_pci_msi_bottom_irq_chip; in dw_pcie_msi_host_init()
353 ret = dw_pcie_allocate_domains(pp); in dw_pcie_msi_host_init()
358 if (pp->msi_irq[ctrl] > 0) in dw_pcie_msi_host_init()
359 irq_set_chained_handler_and_data(pp->msi_irq[ctrl], in dw_pcie_msi_host_init()
360 dw_chained_msi_isr, pp); in dw_pcie_msi_host_init()
375 msi_vaddr = dmam_alloc_coherent(dev, sizeof(u64), &pp->msi_data, in dw_pcie_msi_host_init()
381 msi_vaddr = dmam_alloc_coherent(dev, sizeof(u64), &pp->msi_data, in dw_pcie_msi_host_init()
385 dw_pcie_free_msi(pp); in dw_pcie_msi_host_init()
394 static void dw_pcie_host_request_msg_tlp_res(struct dw_pcie_rp *pp) in dw_pcie_host_request_msg_tlp_res() argument
396 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_request_msg_tlp_res()
400 win = resource_list_first_type(&pp->bridge->windows, IORESOURCE_MEM); in dw_pcie_host_request_msg_tlp_res()
416 pp->msg_res = res; in dw_pcie_host_request_msg_tlp_res()
420 static int dw_pcie_config_ecam_iatu(struct dw_pcie_rp *pp) in dw_pcie_config_ecam_iatu() argument
422 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_config_ecam_iatu()
428 bus = resource_list_first_type(&pp->bridge->windows, IORESOURCE_BUS); in dw_pcie_config_ecam_iatu()
438 atu.parent_bus_addr = pp->cfg0_base + SZ_1M; in dw_pcie_config_ecam_iatu()
454 atu.parent_bus_addr = pp->cfg0_base + SZ_2M; in dw_pcie_config_ecam_iatu()
461 static int dw_pcie_create_ecam_window(struct dw_pcie_rp *pp, struct resource *res) in dw_pcie_create_ecam_window() argument
463 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_create_ecam_window()
467 bus = resource_list_first_type(&pp->bridge->windows, IORESOURCE_BUS); in dw_pcie_create_ecam_window()
471 pp->cfg = pci_ecam_create(dev, res, bus->res, &pci_generic_ecam_ops); in dw_pcie_create_ecam_window()
472 if (IS_ERR(pp->cfg)) in dw_pcie_create_ecam_window()
473 return PTR_ERR(pp->cfg); in dw_pcie_create_ecam_window()
478 static bool dw_pcie_ecam_enabled(struct dw_pcie_rp *pp, struct resource *config_res) in dw_pcie_ecam_enabled() argument
484 if (pp->native_ecam) in dw_pcie_ecam_enabled()
497 bus_range = resource_list_first_type(&pp->bridge->windows, IORESOURCE_BUS)->res; in dw_pcie_ecam_enabled()
506 static int dw_pcie_host_get_resources(struct dw_pcie_rp *pp) in dw_pcie_host_get_resources() argument
508 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_get_resources()
521 pp->cfg0_size = resource_size(res); in dw_pcie_host_get_resources()
522 pp->cfg0_base = res->start; in dw_pcie_host_get_resources()
524 pp->ecam_enabled = dw_pcie_ecam_enabled(pp, res); in dw_pcie_host_get_resources()
525 if (pp->ecam_enabled) { in dw_pcie_host_get_resources()
526 ret = dw_pcie_create_ecam_window(pp, res); in dw_pcie_host_get_resources()
530 pp->bridge->ops = &dw_pcie_ecam_ops; in dw_pcie_host_get_resources()
531 pp->bridge->sysdata = pp->cfg; in dw_pcie_host_get_resources()
532 pp->cfg->priv = pp; in dw_pcie_host_get_resources()
534 pp->va_cfg0_base = devm_pci_remap_cfg_resource(dev, res); in dw_pcie_host_get_resources()
535 if (IS_ERR(pp->va_cfg0_base)) in dw_pcie_host_get_resources()
536 return PTR_ERR(pp->va_cfg0_base); in dw_pcie_host_get_resources()
539 pp->bridge->ops = &dw_pcie_ops; in dw_pcie_host_get_resources()
540 pp->bridge->child_ops = &dw_child_pcie_ops; in dw_pcie_host_get_resources()
541 pp->bridge->sysdata = pp; in dw_pcie_host_get_resources()
546 if (pp->cfg) in dw_pcie_host_get_resources()
547 pci_ecam_free(pp->cfg); in dw_pcie_host_get_resources()
552 win = resource_list_first_type(&pp->bridge->windows, IORESOURCE_IO); in dw_pcie_host_get_resources()
554 pp->io_size = resource_size(win->res); in dw_pcie_host_get_resources()
555 pp->io_bus_addr = win->res->start - win->offset; in dw_pcie_host_get_resources()
556 pp->io_base = pci_pio_to_address(win->res->start); in dw_pcie_host_get_resources()
560 * visconti_pcie_cpu_addr_fixup() uses pp->io_base, so we have to in dw_pcie_host_get_resources()
561 * call dw_pcie_parent_bus_offset() after setting pp->io_base. in dw_pcie_host_get_resources()
564 pp->cfg0_base); in dw_pcie_host_get_resources()
568 int dw_pcie_host_init(struct dw_pcie_rp *pp) in dw_pcie_host_init() argument
570 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_init()
576 raw_spin_lock_init(&pp->lock); in dw_pcie_host_init()
582 pp->bridge = bridge; in dw_pcie_host_init()
584 ret = dw_pcie_host_get_resources(pp); in dw_pcie_host_init()
588 if (pp->ops->init) { in dw_pcie_host_init()
589 ret = pp->ops->init(pp); in dw_pcie_host_init()
595 pp->has_msi_ctrl = !(pp->ops->msi_init || in dw_pcie_host_init()
603 if (!pp->has_msi_ctrl && !pp->num_vectors) { in dw_pcie_host_init()
604 pp->num_vectors = MSI_DEF_NUM_VECTORS; in dw_pcie_host_init()
605 } else if (pp->num_vectors > MAX_MSI_IRQS) { in dw_pcie_host_init()
611 if (pp->ops->msi_init) { in dw_pcie_host_init()
612 ret = pp->ops->msi_init(pp); in dw_pcie_host_init()
615 } else if (pp->has_msi_ctrl) { in dw_pcie_host_init()
616 ret = dw_pcie_msi_host_init(pp); in dw_pcie_host_init()
629 ret = of_pci_get_equalization_presets(dev, &pp->presets, pci->num_lanes); in dw_pcie_host_init()
633 if (pp->ecam_enabled) { in dw_pcie_host_init()
634 ret = dw_pcie_config_ecam_iatu(pp); in dw_pcie_host_init()
650 if (pp->use_atu_msg) in dw_pcie_host_init()
651 dw_pcie_host_request_msg_tlp_res(pp); in dw_pcie_host_init()
657 ret = dw_pcie_setup_rc(pp); in dw_pcie_host_init()
672 if (!pp->use_linkup_irq) in dw_pcie_host_init()
680 if (pp->ops->post_init) in dw_pcie_host_init()
681 pp->ops->post_init(pp); in dw_pcie_host_init()
694 if (pp->has_msi_ctrl) in dw_pcie_host_init()
695 dw_pcie_free_msi(pp); in dw_pcie_host_init()
698 if (pp->ops->deinit) in dw_pcie_host_init()
699 pp->ops->deinit(pp); in dw_pcie_host_init()
702 if (pp->cfg) in dw_pcie_host_init()
703 pci_ecam_free(pp->cfg); in dw_pcie_host_init()
709 void dw_pcie_host_deinit(struct dw_pcie_rp *pp) in dw_pcie_host_deinit() argument
711 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_deinit()
715 pci_stop_root_bus(pp->bridge->bus); in dw_pcie_host_deinit()
716 pci_remove_root_bus(pp->bridge->bus); in dw_pcie_host_deinit()
722 if (pp->has_msi_ctrl) in dw_pcie_host_deinit()
723 dw_pcie_free_msi(pp); in dw_pcie_host_deinit()
725 if (pp->ops->deinit) in dw_pcie_host_deinit()
726 pp->ops->deinit(pp); in dw_pcie_host_deinit()
728 if (pp->cfg) in dw_pcie_host_deinit()
729 pci_ecam_free(pp->cfg); in dw_pcie_host_deinit()
736 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_other_conf_map_bus() local
737 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_other_conf_map_bus()
762 atu.parent_bus_addr = pp->cfg0_base - pci->parent_bus_offset; in dw_pcie_other_conf_map_bus()
764 atu.size = pp->cfg0_size; in dw_pcie_other_conf_map_bus()
770 return pp->va_cfg0_base + where; in dw_pcie_other_conf_map_bus()
776 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_rd_other_conf() local
777 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_rd_other_conf()
785 if (pp->cfg0_io_shared) { in dw_pcie_rd_other_conf()
787 atu.parent_bus_addr = pp->io_base - pci->parent_bus_offset; in dw_pcie_rd_other_conf()
788 atu.pci_addr = pp->io_bus_addr; in dw_pcie_rd_other_conf()
789 atu.size = pp->io_size; in dw_pcie_rd_other_conf()
802 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_wr_other_conf() local
803 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_wr_other_conf()
811 if (pp->cfg0_io_shared) { in dw_pcie_wr_other_conf()
813 atu.parent_bus_addr = pp->io_base - pci->parent_bus_offset; in dw_pcie_wr_other_conf()
814 atu.pci_addr = pp->io_bus_addr; in dw_pcie_wr_other_conf()
815 atu.size = pp->io_size; in dw_pcie_wr_other_conf()
833 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_own_conf_map_bus() local
834 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_own_conf_map_bus()
846 struct dw_pcie_rp *pp = cfg->priv; in dw_pcie_ecam_conf_map_bus() local
847 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_ecam_conf_map_bus()
871 static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp) in dw_pcie_iatu_setup() argument
873 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_iatu_setup()
895 resource_list_for_each_entry(entry, &pp->bridge->windows) { in dw_pcie_iatu_setup()
908 if (pp->msg_res && pp->msg_res->parent == entry->res) in dw_pcie_iatu_setup()
910 resource_size(pp->msg_res); in dw_pcie_iatu_setup()
922 if (pp->io_size) { in dw_pcie_iatu_setup()
926 atu.parent_bus_addr = pp->io_base - pci->parent_bus_offset; in dw_pcie_iatu_setup()
927 atu.pci_addr = pp->io_bus_addr; in dw_pcie_iatu_setup()
928 atu.size = pp->io_size; in dw_pcie_iatu_setup()
937 pp->cfg0_io_shared = true; in dw_pcie_iatu_setup()
945 pp->msg_atu_index = i; in dw_pcie_iatu_setup()
948 resource_list_for_each_entry(entry, &pp->bridge->dma_ranges) { in dw_pcie_iatu_setup()
973 static void dw_pcie_program_presets(struct dw_pcie_rp *pp, enum pci_bus_speed speed) in dw_pcie_program_presets() argument
975 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_program_presets()
982 presets = (u8 *)pp->presets.eq_presets_8gts; in dw_pcie_program_presets()
988 presets = pp->presets.eq_presets_Ngts[EQ_PRESET_TYPE_16GTS - 1]; in dw_pcie_program_presets()
993 presets = pp->presets.eq_presets_Ngts[EQ_PRESET_TYPE_32GTS - 1]; in dw_pcie_program_presets()
998 presets = pp->presets.eq_presets_Ngts[EQ_PRESET_TYPE_64GTS - 1]; in dw_pcie_program_presets()
1021 static void dw_pcie_config_presets(struct dw_pcie_rp *pp) in dw_pcie_config_presets() argument
1023 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_config_presets()
1032 dw_pcie_program_presets(pp, PCIE_SPEED_8_0GT); in dw_pcie_config_presets()
1035 dw_pcie_program_presets(pp, PCIE_SPEED_16_0GT); in dw_pcie_config_presets()
1038 dw_pcie_program_presets(pp, PCIE_SPEED_32_0GT); in dw_pcie_config_presets()
1041 dw_pcie_program_presets(pp, PCIE_SPEED_64_0GT); in dw_pcie_config_presets()
1044 int dw_pcie_setup_rc(struct dw_pcie_rp *pp) in dw_pcie_setup_rc() argument
1046 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_setup_rc()
1058 dw_pcie_msi_init(pp); in dw_pcie_setup_rc()
1083 dw_pcie_config_presets(pp); in dw_pcie_setup_rc()
1089 if (pp->bridge->child_ops == &dw_child_pcie_ops) { in dw_pcie_setup_rc()
1090 ret = dw_pcie_iatu_setup(pp); in dw_pcie_setup_rc()
1116 if (pci->num_ob_windows <= pci->pp.msg_atu_index) in dw_pcie_pme_turn_off()
1119 if (!pci->pp.msg_res) in dw_pcie_pme_turn_off()
1125 atu.size = resource_size(pci->pp.msg_res); in dw_pcie_pme_turn_off()
1126 atu.index = pci->pp.msg_atu_index; in dw_pcie_pme_turn_off()
1128 atu.parent_bus_addr = pci->pp.msg_res->start - pci->parent_bus_offset; in dw_pcie_pme_turn_off()
1134 mem = ioremap(pci->pp.msg_res->start, pci->region_align); in dw_pcie_pme_turn_off()
1159 if (pci->pp.ops->pme_turn_off) { in dw_pcie_suspend_noirq()
1160 pci->pp.ops->pme_turn_off(&pci->pp); in dw_pcie_suspend_noirq()
1186 if (pci->pp.ops->deinit) in dw_pcie_suspend_noirq()
1187 pci->pp.ops->deinit(&pci->pp); in dw_pcie_suspend_noirq()
1204 if (pci->pp.ops->init) { in dw_pcie_resume_noirq()
1205 ret = pci->pp.ops->init(&pci->pp); in dw_pcie_resume_noirq()
1212 dw_pcie_setup_rc(&pci->pp); in dw_pcie_resume_noirq()