Lines Matching refs:phb
118 static struct pnv_ioda_pe *pnv_ioda_init_pe(struct pnv_phb *phb, int pe_no) in pnv_ioda_init_pe() argument
122 phb->ioda.pe_array[pe_no].phb = phb; in pnv_ioda_init_pe()
123 phb->ioda.pe_array[pe_no].pe_number = pe_no; in pnv_ioda_init_pe()
124 phb->ioda.pe_array[pe_no].dma_setup_done = false; in pnv_ioda_init_pe()
131 rc = opal_pci_eeh_freeze_clear(phb->opal_id, pe_no, in pnv_ioda_init_pe()
135 __func__, rc, phb->hose->global_number, pe_no); in pnv_ioda_init_pe()
137 return &phb->ioda.pe_array[pe_no]; in pnv_ioda_init_pe()
140 static void pnv_ioda_reserve_pe(struct pnv_phb *phb, int pe_no) in pnv_ioda_reserve_pe() argument
142 if (!(pe_no >= 0 && pe_no < phb->ioda.total_pe_num)) { in pnv_ioda_reserve_pe()
144 __func__, pe_no, phb->hose->global_number); in pnv_ioda_reserve_pe()
148 mutex_lock(&phb->ioda.pe_alloc_mutex); in pnv_ioda_reserve_pe()
149 if (test_and_set_bit(pe_no, phb->ioda.pe_alloc)) in pnv_ioda_reserve_pe()
151 __func__, pe_no, phb->hose->global_number); in pnv_ioda_reserve_pe()
152 mutex_unlock(&phb->ioda.pe_alloc_mutex); in pnv_ioda_reserve_pe()
154 pnv_ioda_init_pe(phb, pe_no); in pnv_ioda_reserve_pe()
157 struct pnv_ioda_pe *pnv_ioda_alloc_pe(struct pnv_phb *phb, int count) in pnv_ioda_alloc_pe() argument
162 mutex_lock(&phb->ioda.pe_alloc_mutex); in pnv_ioda_alloc_pe()
165 for (pe = phb->ioda.total_pe_num - 1; pe >= 0; pe--) { in pnv_ioda_alloc_pe()
166 if (test_bit(pe, phb->ioda.pe_alloc)) { in pnv_ioda_alloc_pe()
179 set_bit(i, phb->ioda.pe_alloc); in pnv_ioda_alloc_pe()
180 pnv_ioda_init_pe(phb, i); in pnv_ioda_alloc_pe()
182 ret = &phb->ioda.pe_array[pe]; in pnv_ioda_alloc_pe()
185 mutex_unlock(&phb->ioda.pe_alloc_mutex); in pnv_ioda_alloc_pe()
191 struct pnv_phb *phb = pe->phb; in pnv_ioda_free_pe() local
199 mutex_lock(&phb->ioda.pe_alloc_mutex); in pnv_ioda_free_pe()
200 clear_bit(pe_num, phb->ioda.pe_alloc); in pnv_ioda_free_pe()
201 mutex_unlock(&phb->ioda.pe_alloc_mutex); in pnv_ioda_free_pe()
205 static int pnv_ioda2_init_m64(struct pnv_phb *phb) in pnv_ioda2_init_m64() argument
212 rc = opal_pci_set_phb_mem_window(phb->opal_id, in pnv_ioda2_init_m64()
214 phb->ioda.m64_bar_idx, in pnv_ioda2_init_m64()
215 phb->ioda.m64_base, in pnv_ioda2_init_m64()
217 phb->ioda.m64_size); in pnv_ioda2_init_m64()
224 rc = opal_pci_phb_mmio_enable(phb->opal_id, in pnv_ioda2_init_m64()
226 phb->ioda.m64_bar_idx, in pnv_ioda2_init_m64()
237 r = &phb->hose->mem_resources[1]; in pnv_ioda2_init_m64()
238 if (phb->ioda.reserved_pe_idx == 0) in pnv_ioda2_init_m64()
239 r->start += (2 * phb->ioda.m64_segsize); in pnv_ioda2_init_m64()
240 else if (phb->ioda.reserved_pe_idx == (phb->ioda.total_pe_num - 1)) in pnv_ioda2_init_m64()
241 r->end -= (2 * phb->ioda.m64_segsize); in pnv_ioda2_init_m64()
244 phb->ioda.reserved_pe_idx); in pnv_ioda2_init_m64()
250 rc, desc, phb->ioda.m64_bar_idx); in pnv_ioda2_init_m64()
251 opal_pci_phb_mmio_enable(phb->opal_id, in pnv_ioda2_init_m64()
253 phb->ioda.m64_bar_idx, in pnv_ioda2_init_m64()
261 struct pnv_phb *phb = pci_bus_to_pnvhb(pdev->bus); in pnv_ioda_reserve_dev_m64_pe() local
266 base = phb->ioda.m64_base; in pnv_ioda_reserve_dev_m64_pe()
267 sgsz = phb->ioda.m64_segsize; in pnv_ioda_reserve_dev_m64_pe()
270 if (!r->parent || !pnv_pci_is_m64(phb, r)) in pnv_ioda_reserve_dev_m64_pe()
279 pnv_ioda_reserve_pe(phb, segno); in pnv_ioda_reserve_dev_m64_pe()
284 static int pnv_ioda1_init_m64(struct pnv_phb *phb) in pnv_ioda1_init_m64() argument
295 unsigned long base, segsz = phb->ioda.m64_segsize; in pnv_ioda1_init_m64()
298 base = phb->ioda.m64_base + in pnv_ioda1_init_m64()
300 rc = opal_pci_set_phb_mem_window(phb->opal_id, in pnv_ioda1_init_m64()
305 rc, phb->hose->global_number, index); in pnv_ioda1_init_m64()
309 rc = opal_pci_phb_mmio_enable(phb->opal_id, in pnv_ioda1_init_m64()
314 rc, phb->hose->global_number, index); in pnv_ioda1_init_m64()
319 for (index = 0; index < phb->ioda.total_pe_num; index++) { in pnv_ioda1_init_m64()
329 rc = opal_pci_map_pe_mmio_window(phb->opal_id, in pnv_ioda1_init_m64()
335 __func__, rc, phb->hose->global_number, in pnv_ioda1_init_m64()
345 r = &phb->hose->mem_resources[1]; in pnv_ioda1_init_m64()
346 if (phb->ioda.reserved_pe_idx == 0) in pnv_ioda1_init_m64()
347 r->start += (2 * phb->ioda.m64_segsize); in pnv_ioda1_init_m64()
348 else if (phb->ioda.reserved_pe_idx == (phb->ioda.total_pe_num - 1)) in pnv_ioda1_init_m64()
349 r->end -= (2 * phb->ioda.m64_segsize); in pnv_ioda1_init_m64()
352 phb->ioda.reserved_pe_idx, phb->hose->global_number); in pnv_ioda1_init_m64()
358 opal_pci_phb_mmio_enable(phb->opal_id, in pnv_ioda1_init_m64()
381 struct pnv_phb *phb = pci_bus_to_pnvhb(bus); in pnv_ioda_pick_m64_pe() local
391 size = ALIGN(phb->ioda.total_pe_num / 8, sizeof(unsigned long)); in pnv_ioda_pick_m64_pe()
407 if (bitmap_empty(pe_alloc, phb->ioda.total_pe_num)) { in pnv_ioda_pick_m64_pe()
418 while ((i = find_next_bit(pe_alloc, phb->ioda.total_pe_num, i + 1)) < in pnv_ioda_pick_m64_pe()
419 phb->ioda.total_pe_num) { in pnv_ioda_pick_m64_pe()
420 pe = &phb->ioda.pe_array[i]; in pnv_ioda_pick_m64_pe()
422 phb->ioda.m64_segmap[pe->pe_number] = pe->pe_number; in pnv_ioda_pick_m64_pe()
438 static void __init pnv_ioda_parse_m64_window(struct pnv_phb *phb) in pnv_ioda_parse_m64_window() argument
440 struct pci_controller *hose = phb->hose; in pnv_ioda_parse_m64_window()
447 if (phb->type != PNV_PHB_IODA1 && phb->type != PNV_PHB_IODA2) { in pnv_ioda_parse_m64_window()
477 __func__, m64_range[1], phb->hose->global_number); in pnv_ioda_parse_m64_window()
483 __func__, phb->hose->global_number); in pnv_ioda_parse_m64_window()
496 phb->ioda.m64_size = resource_size(res); in pnv_ioda_parse_m64_window()
497 phb->ioda.m64_segsize = phb->ioda.m64_size / phb->ioda.total_pe_num; in pnv_ioda_parse_m64_window()
498 phb->ioda.m64_base = pci_addr; in pnv_ioda_parse_m64_window()
506 phb->ioda.m64_bar_alloc = (unsigned long)-1; in pnv_ioda_parse_m64_window()
510 phb->ioda.m64_bar_idx = m64_range[0] + m64_range[1]; in pnv_ioda_parse_m64_window()
512 pr_info(" Using M64 #%d as default window\n", phb->ioda.m64_bar_idx); in pnv_ioda_parse_m64_window()
516 clear_bit(i, &phb->ioda.m64_bar_alloc); in pnv_ioda_parse_m64_window()
522 if (phb->type == PNV_PHB_IODA1) in pnv_ioda_parse_m64_window()
523 phb->init_m64 = pnv_ioda1_init_m64; in pnv_ioda_parse_m64_window()
525 phb->init_m64 = pnv_ioda2_init_m64; in pnv_ioda_parse_m64_window()
528 static void pnv_ioda_freeze_pe(struct pnv_phb *phb, int pe_no) in pnv_ioda_freeze_pe() argument
530 struct pnv_ioda_pe *pe = &phb->ioda.pe_array[pe_no]; in pnv_ioda_freeze_pe()
544 rc = opal_pci_eeh_freeze_set(phb->opal_id, in pnv_ioda_freeze_pe()
549 __func__, rc, phb->hose->global_number, pe_no); in pnv_ioda_freeze_pe()
558 rc = opal_pci_eeh_freeze_set(phb->opal_id, in pnv_ioda_freeze_pe()
563 __func__, rc, phb->hose->global_number, in pnv_ioda_freeze_pe()
568 static int pnv_ioda_unfreeze_pe(struct pnv_phb *phb, int pe_no, int opt) in pnv_ioda_unfreeze_pe() argument
574 pe = &phb->ioda.pe_array[pe_no]; in pnv_ioda_unfreeze_pe()
582 rc = opal_pci_eeh_freeze_clear(phb->opal_id, pe_no, opt); in pnv_ioda_unfreeze_pe()
585 __func__, rc, opt, phb->hose->global_number, pe_no); in pnv_ioda_unfreeze_pe()
594 rc = opal_pci_eeh_freeze_clear(phb->opal_id, in pnv_ioda_unfreeze_pe()
599 __func__, rc, opt, phb->hose->global_number, in pnv_ioda_unfreeze_pe()
608 static int pnv_ioda_get_pe_state(struct pnv_phb *phb, int pe_no) in pnv_ioda_get_pe_state() argument
616 if (pe_no < 0 || pe_no >= phb->ioda.total_pe_num) in pnv_ioda_get_pe_state()
623 pe = &phb->ioda.pe_array[pe_no]; in pnv_ioda_get_pe_state()
631 rc = opal_pci_eeh_freeze_status(phb->opal_id, pe_no, in pnv_ioda_get_pe_state()
637 phb->hose->global_number, pe_no); in pnv_ioda_get_pe_state()
646 rc = opal_pci_eeh_freeze_status(phb->opal_id, in pnv_ioda_get_pe_state()
655 phb->hose->global_number, slave->pe_number); in pnv_ioda_get_pe_state()
670 struct pnv_ioda_pe *pnv_pci_bdfn_to_pe(struct pnv_phb *phb, u16 bdfn) in pnv_pci_bdfn_to_pe() argument
672 int pe_number = phb->ioda.pe_rmap[bdfn]; in pnv_pci_bdfn_to_pe()
677 return &phb->ioda.pe_array[pe_number]; in pnv_pci_bdfn_to_pe()
682 struct pnv_phb *phb = pci_bus_to_pnvhb(dev->bus); in pnv_ioda_get_pe() local
689 return &phb->ioda.pe_array[pdn->pe_number]; in pnv_ioda_get_pe()
692 static int pnv_ioda_set_one_peltv(struct pnv_phb *phb, in pnv_ioda_set_one_peltv() argument
704 rc = opal_pci_set_peltv(phb->opal_id, parent->pe_number, in pnv_ioda_set_one_peltv()
717 rc = opal_pci_set_peltv(phb->opal_id, parent->pe_number, in pnv_ioda_set_one_peltv()
729 static int pnv_ioda_set_peltv(struct pnv_phb *phb, in pnv_ioda_set_peltv() argument
742 opal_pci_eeh_freeze_clear(phb->opal_id, pe->pe_number, in pnv_ioda_set_peltv()
746 opal_pci_eeh_freeze_clear(phb->opal_id, in pnv_ioda_set_peltv()
758 ret = pnv_ioda_set_one_peltv(phb, pe, pe, is_add); in pnv_ioda_set_peltv()
765 ret = pnv_ioda_set_one_peltv(phb, slave, pe, is_add); in pnv_ioda_set_peltv()
784 parent = &phb->ioda.pe_array[pdn->pe_number]; in pnv_ioda_set_peltv()
785 ret = pnv_ioda_set_one_peltv(phb, parent, pe, is_add); in pnv_ioda_set_peltv()
796 static void pnv_ioda_unset_peltv(struct pnv_phb *phb, in pnv_ioda_unset_peltv() argument
806 rc = opal_pci_set_peltv(phb->opal_id, pdn->pe_number, in pnv_ioda_unset_peltv()
814 opal_pci_eeh_freeze_clear(phb->opal_id, pe->pe_number, in pnv_ioda_unset_peltv()
818 rc = opal_pci_set_peltv(phb->opal_id, pe->pe_number, in pnv_ioda_unset_peltv()
824 int pnv_ioda_deconfigure_pe(struct pnv_phb *phb, struct pnv_ioda_pe *pe) in pnv_ioda_deconfigure_pe() argument
872 phb->ioda.pe_rmap[rid] = IODA_INVALID_PE; in pnv_ioda_deconfigure_pe()
878 if (phb->type != PNV_PHB_NPU_NVLINK && phb->type != PNV_PHB_NPU_OCAPI) in pnv_ioda_deconfigure_pe()
879 pnv_ioda_unset_peltv(phb, pe, parent); in pnv_ioda_deconfigure_pe()
881 rc = opal_pci_set_pe(phb->opal_id, pe->pe_number, pe->rid, in pnv_ioda_deconfigure_pe()
895 int pnv_ioda_configure_pe(struct pnv_phb *phb, struct pnv_ioda_pe *pe) in pnv_ioda_configure_pe() argument
938 rc = opal_pci_set_pe(phb->opal_id, pe->pe_number, pe->rid, in pnv_ioda_configure_pe()
949 if (phb->type != PNV_PHB_NPU_NVLINK && phb->type != PNV_PHB_NPU_OCAPI) in pnv_ioda_configure_pe()
950 pnv_ioda_set_peltv(phb, pe, true); in pnv_ioda_configure_pe()
954 phb->ioda.pe_rmap[rid] = pe->pe_number; in pnv_ioda_configure_pe()
957 if (phb->type != PNV_PHB_IODA1) { in pnv_ioda_configure_pe()
963 rc = opal_pci_set_mve(phb->opal_id, pe->mve_number, pe->pe_number); in pnv_ioda_configure_pe()
969 rc = opal_pci_set_mve_enable(phb->opal_id, in pnv_ioda_configure_pe()
984 struct pnv_phb *phb = pci_bus_to_pnvhb(dev->bus); in pnv_ioda_setup_dev_PE() local
996 pe = pnv_ioda_alloc_pe(phb, 1); in pnv_ioda_setup_dev_PE()
1020 if (pnv_ioda_configure_pe(phb, pe)) { in pnv_ioda_setup_dev_PE()
1029 mutex_lock(&phb->ioda.pe_list_mutex); in pnv_ioda_setup_dev_PE()
1030 list_add_tail(&pe->list, &phb->ioda.pe_list); in pnv_ioda_setup_dev_PE()
1031 mutex_unlock(&phb->ioda.pe_list_mutex); in pnv_ioda_setup_dev_PE()
1043 struct pnv_phb *phb = pci_bus_to_pnvhb(bus); in pnv_ioda_setup_bus_PE() local
1051 pe_num = phb->ioda.pe_rmap[bus->number << 8]; in pnv_ioda_setup_bus_PE()
1053 pe = &phb->ioda.pe_array[pe_num]; in pnv_ioda_setup_bus_PE()
1059 pe = &phb->ioda.pe_array[phb->ioda.root_pe_idx]; in pnv_ioda_setup_bus_PE()
1067 pe = pnv_ioda_alloc_pe(phb, 1); in pnv_ioda_setup_bus_PE()
1089 if (pnv_ioda_configure_pe(phb, pe)) { in pnv_ioda_setup_bus_PE()
1097 list_add_tail(&pe->list, &phb->ioda.pe_list); in pnv_ioda_setup_bus_PE()
1109 struct pnv_phb *phb = pci_bus_to_pnvhb(npu_pdev->bus); in pnv_ioda_setup_npu_PE() local
1129 for (pe_num = 0; pe_num < phb->ioda.total_pe_num; pe_num++) { in pnv_ioda_setup_npu_PE()
1130 pe = &phb->ioda.pe_array[pe_num]; in pnv_ioda_setup_npu_PE()
1145 phb->ioda.pe_rmap[rid] = pe->pe_number; in pnv_ioda_setup_npu_PE()
1149 rc = opal_pci_set_pe(phb->opal_id, pe_num, rid, in pnv_ioda_setup_npu_PE()
1181 struct pnv_phb *phb; in pnv_pci_ioda_setup_nvlink() local
1185 phb = hose->private_data; in pnv_pci_ioda_setup_nvlink()
1186 if (phb->type == PNV_PHB_NPU_NVLINK) { in pnv_pci_ioda_setup_nvlink()
1188 pnv_ioda_reserve_pe(phb, 0); in pnv_pci_ioda_setup_nvlink()
1190 if (phb->model == PNV_PHB_MODEL_NPU2) in pnv_pci_ioda_setup_nvlink()
1195 phb = hose->private_data; in pnv_pci_ioda_setup_nvlink()
1196 if (phb->type != PNV_PHB_IODA2) in pnv_pci_ioda_setup_nvlink()
1199 list_for_each_entry(pe, &phb->ioda.pe_list, list) in pnv_pci_ioda_setup_nvlink()
1209 static void pnv_pci_ioda1_setup_dma_pe(struct pnv_phb *phb,
1214 struct pnv_phb *phb = pci_bus_to_pnvhb(pdev->bus); in pnv_pci_ioda_dma_dev_setup() local
1219 pe = pnv_pci_bdfn_to_pe(phb, pdev->devfn | (pdev->bus->number << 8)); in pnv_pci_ioda_dma_dev_setup()
1226 pe = pnv_pci_bdfn_to_pe(phb, pdev->devfn | (pdev->bus->number << 8)); in pnv_pci_ioda_dma_dev_setup()
1245 switch (phb->type) { in pnv_pci_ioda_dma_dev_setup()
1247 pnv_pci_ioda1_setup_dma_pe(phb, pe); in pnv_pci_ioda_dma_dev_setup()
1250 pnv_pci_ioda2_setup_dma_pe(phb, pe); in pnv_pci_ioda_dma_dev_setup()
1254 __func__, phb->hose->global_number, phb->type); in pnv_pci_ioda_dma_dev_setup()
1307 table_pages = alloc_pages_node(pe->phb->hose->node, GFP_KERNEL, in pnv_pci_ioda_dma_64bit_bypass()
1323 rc = opal_pci_map_pe_dma_window(pe->phb->opal_id, in pnv_pci_ioda_dma_64bit_bypass()
1343 struct pnv_phb *phb = pci_bus_to_pnvhb(pdev->bus); in pnv_pci_ioda_iommu_bypass_supported() local
1350 pe = &phb->ioda.pe_array[pdn->pe_number]; in pnv_pci_ioda_iommu_bypass_supported()
1367 phb->model == PNV_PHB_MODEL_PHB3) { in pnv_pci_ioda_iommu_bypass_supported()
1380 static inline __be64 __iomem *pnv_ioda_get_inval_reg(struct pnv_phb *phb, in pnv_ioda_get_inval_reg() argument
1383 return real_mode ? (__be64 __iomem *)(phb->regs_phys + 0x210) : in pnv_ioda_get_inval_reg()
1384 (phb->regs + 0x210); in pnv_ioda_get_inval_reg()
1395 __be64 __iomem *invalidate = pnv_ioda_get_inval_reg(pe->phb, rm); in pnv_pci_p7ioc_tce_invalidate()
1471 static void pnv_pci_phb3_tce_invalidate_entire(struct pnv_phb *phb, bool rm) in pnv_pci_phb3_tce_invalidate_entire() argument
1473 __be64 __iomem *invalidate = pnv_ioda_get_inval_reg(phb, rm); in pnv_pci_phb3_tce_invalidate_entire()
1486 __be64 __iomem *invalidate = pnv_ioda_get_inval_reg(pe->phb, false); in pnv_pci_phb3_tce_invalidate_pe()
1497 __be64 __iomem *invalidate = pnv_ioda_get_inval_reg(pe->phb, rm); in pnv_pci_phb3_tce_invalidate()
1522 struct pnv_phb *phb = pe->phb; in pnv_pci_ioda2_tce_invalidate_pe() local
1524 if (phb->model == PNV_PHB_MODEL_PHB3 && phb->regs) in pnv_pci_ioda2_tce_invalidate_pe()
1527 opal_pci_tce_kill(phb->opal_id, OPAL_PCI_TCE_KILL_PE, in pnv_pci_ioda2_tce_invalidate_pe()
1539 struct pnv_phb *phb = pe->phb; in pnv_pci_ioda2_tce_invalidate() local
1547 if (phb->model == PNV_PHB_MODEL_NPU) { in pnv_pci_ioda2_tce_invalidate()
1553 pnv_pci_phb3_tce_invalidate_entire(phb, rm); in pnv_pci_ioda2_tce_invalidate()
1556 if (phb->model == PNV_PHB_MODEL_PHB3 && phb->regs) in pnv_pci_ioda2_tce_invalidate()
1560 opal_pci_tce_kill(phb->opal_id, in pnv_pci_ioda2_tce_invalidate()
1567 void pnv_pci_ioda2_tce_invalidate_entire(struct pnv_phb *phb, bool rm) in pnv_pci_ioda2_tce_invalidate_entire() argument
1569 if (phb->model == PNV_PHB_MODEL_NPU || phb->model == PNV_PHB_MODEL_PHB3) in pnv_pci_ioda2_tce_invalidate_entire()
1570 pnv_pci_phb3_tce_invalidate_entire(phb, rm); in pnv_pci_ioda2_tce_invalidate_entire()
1572 opal_pci_tce_kill(phb->opal_id, OPAL_PCI_TCE_KILL, 0, 0, 0, 0); in pnv_pci_ioda2_tce_invalidate_entire()
1657 static void pnv_pci_ioda1_setup_dma_pe(struct pnv_phb *phb, in pnv_pci_ioda1_setup_dma_pe() argument
1675 pci_walk_bus(phb->hose->bus, pnv_pci_ioda_dev_dma_weight, in pnv_pci_ioda1_setup_dma_pe()
1677 segs = (weight * phb->ioda.dma32_count) / total_weight; in pnv_pci_ioda1_setup_dma_pe()
1688 for (base = 0; base <= phb->ioda.dma32_count - segs; base++) { in pnv_pci_ioda1_setup_dma_pe()
1690 if (phb->ioda.dma32_segmap[i] == in pnv_pci_ioda1_setup_dma_pe()
1706 tbl = pnv_pci_table_alloc(phb->hose->node); in pnv_pci_ioda1_setup_dma_pe()
1710 iommu_register_group(&pe->table_group, phb->hose->global_number, in pnv_pci_ioda1_setup_dma_pe()
1712 pnv_pci_link_table_and_group(phb->hose->node, 0, tbl, &pe->table_group); in pnv_pci_ioda1_setup_dma_pe()
1730 tce_mem = alloc_pages_node(phb->hose->node, GFP_KERNEL, in pnv_pci_ioda1_setup_dma_pe()
1741 rc = opal_pci_map_pe_dma_window(phb->opal_id, in pnv_pci_ioda1_setup_dma_pe()
1755 phb->ioda.dma32_segmap[i] = pe->pe_number; in pnv_pci_ioda1_setup_dma_pe()
1765 iommu_init_table(tbl, phb->hose->node, 0, 0); in pnv_pci_ioda1_setup_dma_pe()
1784 struct pnv_phb *phb = pe->phb; in pnv_pci_ioda2_set_window() local
1799 rc = opal_pci_map_pe_dma_window(phb->opal_id, in pnv_pci_ioda2_set_window()
1811 pnv_pci_link_table_and_group(phb->hose->node, num, in pnv_pci_ioda2_set_window()
1828 rc = opal_pci_map_pe_dma_window_real(pe->phb->opal_id, in pnv_pci_ioda2_set_bypass()
1834 rc = opal_pci_map_pe_dma_window_real(pe->phb->opal_id, in pnv_pci_ioda2_set_bypass()
1852 int nid = pe->phb->hose->node; in pnv_pci_ioda2_create_table()
1929 if (window_size > pe->phb->ioda.m32_pci_base) { in pnv_pci_ioda2_setup_default_config()
1930 res_start = pe->phb->ioda.m32_pci_base >> tbl->it_page_shift; in pnv_pci_ioda2_setup_default_config()
1933 iommu_init_table(tbl, pe->phb->hose->node, res_start, res_end); in pnv_pci_ioda2_setup_default_config()
1962 struct pnv_phb *phb = pe->phb; in pnv_pci_ioda2_unset_window() local
1967 ret = opal_pci_map_pe_dma_window(phb->opal_id, pe->pe_number, in pnv_pci_ioda2_unset_window()
2077 void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb, in pnv_pci_ioda2_setup_dma_pe() argument
2087 phb->ioda.m32_pci_base); in pnv_pci_ioda2_setup_dma_pe()
2091 pe->table_group.tce32_size = phb->ioda.m32_pci_base; in pnv_pci_ioda2_setup_dma_pe()
2095 pe->table_group.pgsizes = pnv_ioda_parse_tce_sizes(phb); in pnv_pci_ioda2_setup_dma_pe()
2103 iommu_register_group(&pe->table_group, phb->hose->global_number, in pnv_pci_ioda2_setup_dma_pe()
2111 struct pnv_phb *phb = container_of(chip, struct pnv_phb, in pnv_opal_pci_msi_eoi() local
2114 return opal_pci_msi_eoi(phb->opal_id, hw_irq); in pnv_opal_pci_msi_eoi()
2130 void pnv_set_msi_irq_chip(struct pnv_phb *phb, unsigned int virq) in pnv_set_msi_irq_chip() argument
2136 if (phb->model != PNV_PHB_MODEL_PHB3) in pnv_set_msi_irq_chip()
2139 if (!phb->ioda.irq_chip_init) { in pnv_set_msi_irq_chip()
2146 phb->ioda.irq_chip_init = 1; in pnv_set_msi_irq_chip()
2147 phb->ioda.irq_chip = *ichip; in pnv_set_msi_irq_chip()
2148 phb->ioda.irq_chip.irq_eoi = pnv_ioda2_msi_eoi; in pnv_set_msi_irq_chip()
2150 irq_set_chip(virq, &phb->ioda.irq_chip); in pnv_set_msi_irq_chip()
2163 static int pnv_pci_ioda_msi_setup(struct pnv_phb *phb, struct pci_dev *dev, in pnv_pci_ioda_msi_setup() argument
2168 unsigned int xive_num = hwirq - phb->msi_base; in pnv_pci_ioda_msi_setup()
2185 rc = opal_pci_set_xive_pe(phb->opal_id, pe->pe_number, xive_num); in pnv_pci_ioda_msi_setup()
2195 rc = opal_get_msi_64(phb->opal_id, pe->mve_number, xive_num, 1, in pnv_pci_ioda_msi_setup()
2207 rc = opal_get_msi_32(phb->opal_id, pe->mve_number, xive_num, 1, in pnv_pci_ioda_msi_setup()
2219 pnv_set_msi_irq_chip(phb, virq); in pnv_pci_ioda_msi_setup()
2229 static void pnv_pci_init_ioda_msis(struct pnv_phb *phb) in pnv_pci_init_ioda_msis() argument
2232 const __be32 *prop = of_get_property(phb->hose->dn, in pnv_pci_init_ioda_msis()
2236 prop = of_get_property(phb->hose->dn, "msi-ranges", NULL); in pnv_pci_init_ioda_msis()
2241 phb->msi_base = be32_to_cpup(prop); in pnv_pci_init_ioda_msis()
2243 if (msi_bitmap_alloc(&phb->msi_bmp, count, phb->hose->dn)) { in pnv_pci_init_ioda_msis()
2245 phb->hose->global_number); in pnv_pci_init_ioda_msis()
2249 phb->msi_setup = pnv_pci_ioda_msi_setup; in pnv_pci_init_ioda_msis()
2250 phb->msi32_support = 1; in pnv_pci_init_ioda_msis()
2252 count, phb->msi_base); in pnv_pci_init_ioda_msis()
2258 struct pnv_phb *phb = pe->phb; in pnv_ioda_setup_pe_res() local
2267 region.start = res->start - phb->ioda.io_pci_base; in pnv_ioda_setup_pe_res()
2268 region.end = res->end - phb->ioda.io_pci_base; in pnv_ioda_setup_pe_res()
2269 index = region.start / phb->ioda.io_segsize; in pnv_ioda_setup_pe_res()
2271 while (index < phb->ioda.total_pe_num && in pnv_ioda_setup_pe_res()
2273 phb->ioda.io_segmap[index] = pe->pe_number; in pnv_ioda_setup_pe_res()
2274 rc = opal_pci_map_pe_mmio_window(phb->opal_id, in pnv_ioda_setup_pe_res()
2282 region.start += phb->ioda.io_segsize; in pnv_ioda_setup_pe_res()
2286 !pnv_pci_is_m64(phb, res)) { in pnv_ioda_setup_pe_res()
2288 phb->hose->mem_offset[0] - in pnv_ioda_setup_pe_res()
2289 phb->ioda.m32_pci_base; in pnv_ioda_setup_pe_res()
2291 phb->hose->mem_offset[0] - in pnv_ioda_setup_pe_res()
2292 phb->ioda.m32_pci_base; in pnv_ioda_setup_pe_res()
2293 index = region.start / phb->ioda.m32_segsize; in pnv_ioda_setup_pe_res()
2295 while (index < phb->ioda.total_pe_num && in pnv_ioda_setup_pe_res()
2297 phb->ioda.m32_segmap[index] = pe->pe_number; in pnv_ioda_setup_pe_res()
2298 rc = opal_pci_map_pe_mmio_window(phb->opal_id, in pnv_ioda_setup_pe_res()
2306 region.start += phb->ioda.m32_segsize; in pnv_ioda_setup_pe_res()
2349 struct pnv_phb *phb = data; in pnv_pci_diag_data_set() local
2353 ret = opal_pci_get_phb_diag_data2(phb->opal_id, phb->diag_data, in pnv_pci_diag_data_set()
2354 phb->diag_data_size); in pnv_pci_diag_data_set()
2359 pnv_pci_dump_phb_diag_data(phb->hose, phb->diag_data); in pnv_pci_diag_data_set()
2368 struct pnv_phb *phb = data; in pnv_pci_ioda_pe_dump() local
2371 for (pe_num = 0; pe_num < phb->ioda.total_pe_num; pe_num++) { in pnv_pci_ioda_pe_dump()
2372 struct pnv_ioda_pe *pe = &phb->ioda.pe_array[pe_num]; in pnv_pci_ioda_pe_dump()
2374 if (!test_bit(pe_num, phb->ioda.pe_alloc)) in pnv_pci_ioda_pe_dump()
2399 struct pnv_phb *phb; in pnv_pci_ioda_create_dbgfs() local
2403 phb = hose->private_data; in pnv_pci_ioda_create_dbgfs()
2406 phb->initialized = 1; in pnv_pci_ioda_create_dbgfs()
2409 phb->dbgfs = debugfs_create_dir(name, powerpc_debugfs_root); in pnv_pci_ioda_create_dbgfs()
2411 debugfs_create_file_unsafe("dump_diag_regs", 0200, phb->dbgfs, in pnv_pci_ioda_create_dbgfs()
2412 phb, &pnv_pci_diag_data_fops); in pnv_pci_ioda_create_dbgfs()
2413 debugfs_create_file_unsafe("dump_ioda_pe_state", 0200, phb->dbgfs, in pnv_pci_ioda_create_dbgfs()
2414 phb, &pnv_pci_ioda_pe_dump_fops); in pnv_pci_ioda_create_dbgfs()
2481 struct pnv_phb *phb = pci_bus_to_pnvhb(bus); in pnv_pci_window_alignment() local
2501 if (phb->ioda.m64_segsize && pnv_pci_is_m64_flags(type)) in pnv_pci_window_alignment()
2502 return phb->ioda.m64_segsize; in pnv_pci_window_alignment()
2504 return phb->ioda.m32_segsize; in pnv_pci_window_alignment()
2506 return phb->ioda.io_segsize; in pnv_pci_window_alignment()
2521 struct pnv_phb *phb = hose->private_data; in pnv_pci_fixup_bridge_resources() local
2541 else if (pnv_pci_is_m64(phb, r) && in pnv_pci_fixup_bridge_resources()
2543 phb->ioda.m64_segsize) in pnv_pci_fixup_bridge_resources()
2604 struct pnv_phb *phb = pci_bus_to_pnvhb(dev->bus); in pnv_pci_enable_device_hook() local
2612 if (!phb->initialized) in pnv_pci_enable_device_hook()
2625 struct pnv_phb *phb = hose->private_data; in pnv_ocapi_enable_device_hook() local
2629 if (!phb->initialized) in pnv_ocapi_enable_device_hook()
2649 struct pnv_phb *phb = pe->phb; in pnv_pci_ioda1_unset_window() local
2654 for (idx = 0; idx < phb->ioda.dma32_count; idx++) { in pnv_pci_ioda1_unset_window()
2655 if (phb->ioda.dma32_segmap[idx] != pe->pe_number) in pnv_pci_ioda1_unset_window()
2658 rc = opal_pci_map_pe_dma_window(phb->opal_id, pe->pe_number, in pnv_pci_ioda1_unset_window()
2666 phb->ioda.dma32_segmap[idx] = IODA_INVALID_PE; in pnv_pci_ioda1_unset_window()
2720 struct pnv_phb *phb = pe->phb; in pnv_ioda_free_pe_seg() local
2724 for (idx = 0; idx < phb->ioda.total_pe_num; idx++) { in pnv_ioda_free_pe_seg()
2728 rc = opal_pci_map_pe_mmio_window(phb->opal_id, in pnv_ioda_free_pe_seg()
2729 phb->ioda.reserved_pe_idx, win, 0, idx); in pnv_ioda_free_pe_seg()
2741 struct pnv_phb *phb = pe->phb; in pnv_ioda_release_pe_seg() local
2743 if (phb->type == PNV_PHB_IODA1) { in pnv_ioda_release_pe_seg()
2745 phb->ioda.io_segmap); in pnv_ioda_release_pe_seg()
2747 phb->ioda.m32_segmap); in pnv_ioda_release_pe_seg()
2749 } else if (phb->type == PNV_PHB_IODA2) { in pnv_ioda_release_pe_seg()
2751 phb->ioda.m32_segmap); in pnv_ioda_release_pe_seg()
2757 struct pnv_phb *phb = pe->phb; in pnv_ioda_release_pe() local
2762 mutex_lock(&phb->ioda.pe_list_mutex); in pnv_ioda_release_pe()
2764 mutex_unlock(&phb->ioda.pe_list_mutex); in pnv_ioda_release_pe()
2766 switch (phb->type) { in pnv_ioda_release_pe()
2780 pnv_ioda_deconfigure_pe(pe->phb, pe); in pnv_ioda_release_pe()
2796 if (phb->ioda.root_pe_idx == pe->pe_number) in pnv_ioda_release_pe()
2804 struct pnv_phb *phb = pci_bus_to_pnvhb(pdev->bus); in pnv_pci_release_device() local
2833 pe = &phb->ioda.pe_array[pdn->pe_number]; in pnv_pci_release_device()
2852 struct pnv_phb *phb = hose->private_data; in pnv_pci_ioda_shutdown() local
2854 opal_pci_reset(phb->opal_id, OPAL_RESET_PCI_IODA_TABLE, in pnv_pci_ioda_shutdown()
2860 struct pnv_phb *phb = pci_bus_to_pnvhb(bus); in pnv_pci_ioda_dma_bus_setup() local
2863 list_for_each_entry(pe, &phb->ioda.pe_list, list) { in pnv_pci_ioda_dma_bus_setup()
2913 struct pnv_phb *phb; in pnv_pci_init_ioda_phb() local
2939 phb = memblock_alloc(sizeof(*phb), SMP_CACHE_BYTES); in pnv_pci_init_ioda_phb()
2940 if (!phb) in pnv_pci_init_ioda_phb()
2942 sizeof(*phb)); in pnv_pci_init_ioda_phb()
2945 phb->hose = hose = pcibios_alloc_controller(np); in pnv_pci_init_ioda_phb()
2946 if (!phb->hose) { in pnv_pci_init_ioda_phb()
2949 memblock_free(__pa(phb), sizeof(struct pnv_phb)); in pnv_pci_init_ioda_phb()
2953 spin_lock_init(&phb->lock); in pnv_pci_init_ioda_phb()
2963 hose->private_data = phb; in pnv_pci_init_ioda_phb()
2964 phb->hub_id = hub_id; in pnv_pci_init_ioda_phb()
2965 phb->opal_id = phb_id; in pnv_pci_init_ioda_phb()
2966 phb->type = ioda_type; in pnv_pci_init_ioda_phb()
2967 mutex_init(&phb->ioda.pe_alloc_mutex); in pnv_pci_init_ioda_phb()
2971 phb->model = PNV_PHB_MODEL_P7IOC; in pnv_pci_init_ioda_phb()
2973 phb->model = PNV_PHB_MODEL_PHB3; in pnv_pci_init_ioda_phb()
2975 phb->model = PNV_PHB_MODEL_NPU; in pnv_pci_init_ioda_phb()
2977 phb->model = PNV_PHB_MODEL_NPU2; in pnv_pci_init_ioda_phb()
2979 phb->model = PNV_PHB_MODEL_UNKNOWN; in pnv_pci_init_ioda_phb()
2984 phb->diag_data_size = be32_to_cpup(prop32); in pnv_pci_init_ioda_phb()
2986 phb->diag_data_size = PNV_PCI_DIAG_BUF_SIZE; in pnv_pci_init_ioda_phb()
2988 phb->diag_data = memblock_alloc(phb->diag_data_size, SMP_CACHE_BYTES); in pnv_pci_init_ioda_phb()
2989 if (!phb->diag_data) in pnv_pci_init_ioda_phb()
2991 phb->diag_data_size); in pnv_pci_init_ioda_phb()
2998 phb->regs_phys = r.start; in pnv_pci_init_ioda_phb()
2999 phb->regs = ioremap(r.start, resource_size(&r)); in pnv_pci_init_ioda_phb()
3000 if (phb->regs == NULL) in pnv_pci_init_ioda_phb()
3005 phb->ioda.total_pe_num = 1; in pnv_pci_init_ioda_phb()
3008 phb->ioda.total_pe_num = be32_to_cpup(prop32); in pnv_pci_init_ioda_phb()
3011 phb->ioda.reserved_pe_idx = be32_to_cpup(prop32); in pnv_pci_init_ioda_phb()
3014 for (segno = 0; segno < ARRAY_SIZE(phb->ioda.pe_rmap); segno++) in pnv_pci_init_ioda_phb()
3015 phb->ioda.pe_rmap[segno] = IODA_INVALID_PE; in pnv_pci_init_ioda_phb()
3018 pnv_ioda_parse_m64_window(phb); in pnv_pci_init_ioda_phb()
3020 phb->ioda.m32_size = resource_size(&hose->mem_resources[0]); in pnv_pci_init_ioda_phb()
3022 phb->ioda.m32_size += 0x10000; in pnv_pci_init_ioda_phb()
3024 phb->ioda.m32_segsize = phb->ioda.m32_size / phb->ioda.total_pe_num; in pnv_pci_init_ioda_phb()
3025 phb->ioda.m32_pci_base = hose->mem_resources[0].start - hose->mem_offset[0]; in pnv_pci_init_ioda_phb()
3026 phb->ioda.io_size = hose->pci_io_size; in pnv_pci_init_ioda_phb()
3027 phb->ioda.io_segsize = phb->ioda.io_size / phb->ioda.total_pe_num; in pnv_pci_init_ioda_phb()
3028 phb->ioda.io_pci_base = 0; /* XXX calculate this ? */ in pnv_pci_init_ioda_phb()
3031 phb->ioda.dma32_count = phb->ioda.m32_pci_base / in pnv_pci_init_ioda_phb()
3035 size = ALIGN(max_t(unsigned, phb->ioda.total_pe_num, 8) / 8, in pnv_pci_init_ioda_phb()
3038 size += phb->ioda.total_pe_num * sizeof(phb->ioda.m64_segmap[0]); in pnv_pci_init_ioda_phb()
3040 size += phb->ioda.total_pe_num * sizeof(phb->ioda.m32_segmap[0]); in pnv_pci_init_ioda_phb()
3041 if (phb->type == PNV_PHB_IODA1) { in pnv_pci_init_ioda_phb()
3043 size += phb->ioda.total_pe_num * sizeof(phb->ioda.io_segmap[0]); in pnv_pci_init_ioda_phb()
3045 size += phb->ioda.dma32_count * in pnv_pci_init_ioda_phb()
3046 sizeof(phb->ioda.dma32_segmap[0]); in pnv_pci_init_ioda_phb()
3049 size += phb->ioda.total_pe_num * sizeof(struct pnv_ioda_pe); in pnv_pci_init_ioda_phb()
3053 phb->ioda.pe_alloc = aux; in pnv_pci_init_ioda_phb()
3054 phb->ioda.m64_segmap = aux + m64map_off; in pnv_pci_init_ioda_phb()
3055 phb->ioda.m32_segmap = aux + m32map_off; in pnv_pci_init_ioda_phb()
3056 for (segno = 0; segno < phb->ioda.total_pe_num; segno++) { in pnv_pci_init_ioda_phb()
3057 phb->ioda.m64_segmap[segno] = IODA_INVALID_PE; in pnv_pci_init_ioda_phb()
3058 phb->ioda.m32_segmap[segno] = IODA_INVALID_PE; in pnv_pci_init_ioda_phb()
3060 if (phb->type == PNV_PHB_IODA1) { in pnv_pci_init_ioda_phb()
3061 phb->ioda.io_segmap = aux + iomap_off; in pnv_pci_init_ioda_phb()
3062 for (segno = 0; segno < phb->ioda.total_pe_num; segno++) in pnv_pci_init_ioda_phb()
3063 phb->ioda.io_segmap[segno] = IODA_INVALID_PE; in pnv_pci_init_ioda_phb()
3065 phb->ioda.dma32_segmap = aux + dma32map_off; in pnv_pci_init_ioda_phb()
3066 for (segno = 0; segno < phb->ioda.dma32_count; segno++) in pnv_pci_init_ioda_phb()
3067 phb->ioda.dma32_segmap[segno] = IODA_INVALID_PE; in pnv_pci_init_ioda_phb()
3069 phb->ioda.pe_array = aux + pemap_off; in pnv_pci_init_ioda_phb()
3076 pnv_ioda_reserve_pe(phb, phb->ioda.reserved_pe_idx); in pnv_pci_init_ioda_phb()
3077 if (phb->ioda.reserved_pe_idx == 0) { in pnv_pci_init_ioda_phb()
3078 phb->ioda.root_pe_idx = 1; in pnv_pci_init_ioda_phb()
3079 pnv_ioda_reserve_pe(phb, phb->ioda.root_pe_idx); in pnv_pci_init_ioda_phb()
3080 } else if (phb->ioda.reserved_pe_idx == (phb->ioda.total_pe_num - 1)) { in pnv_pci_init_ioda_phb()
3081 phb->ioda.root_pe_idx = phb->ioda.reserved_pe_idx - 1; in pnv_pci_init_ioda_phb()
3082 pnv_ioda_reserve_pe(phb, phb->ioda.root_pe_idx); in pnv_pci_init_ioda_phb()
3085 root_pe = pnv_ioda_alloc_pe(phb, 1); in pnv_pci_init_ioda_phb()
3086 phb->ioda.root_pe_idx = root_pe->pe_number; in pnv_pci_init_ioda_phb()
3089 INIT_LIST_HEAD(&phb->ioda.pe_list); in pnv_pci_init_ioda_phb()
3090 mutex_init(&phb->ioda.pe_list_mutex); in pnv_pci_init_ioda_phb()
3093 phb->ioda.dma32_count = phb->ioda.m32_pci_base / in pnv_pci_init_ioda_phb()
3106 phb->ioda.total_pe_num, phb->ioda.reserved_pe_idx, in pnv_pci_init_ioda_phb()
3107 phb->ioda.m32_size, phb->ioda.m32_segsize); in pnv_pci_init_ioda_phb()
3108 if (phb->ioda.m64_size) in pnv_pci_init_ioda_phb()
3110 phb->ioda.m64_size, phb->ioda.m64_segsize); in pnv_pci_init_ioda_phb()
3111 if (phb->ioda.io_size) in pnv_pci_init_ioda_phb()
3113 phb->ioda.io_size, phb->ioda.io_segsize); in pnv_pci_init_ioda_phb()
3116 phb->hose->ops = &pnv_pci_ops; in pnv_pci_init_ioda_phb()
3117 phb->get_pe_state = pnv_ioda_get_pe_state; in pnv_pci_init_ioda_phb()
3118 phb->freeze_pe = pnv_ioda_freeze_pe; in pnv_pci_init_ioda_phb()
3119 phb->unfreeze_pe = pnv_ioda_unfreeze_pe; in pnv_pci_init_ioda_phb()
3122 pnv_pci_init_ioda_msis(phb); in pnv_pci_init_ioda_phb()
3133 switch (phb->type) { in pnv_pci_init_ioda_phb()
3177 if (!phb->init_m64 || phb->init_m64(phb)) in pnv_pci_init_ioda_phb()
3198 struct pnv_phb *phb = pci_bus_to_pnvhb(dev->bus); in pnv_npu2_opencapi_cfg_size_fixup() local
3203 if (phb->type == PNV_PHB_NPU_OCAPI) in pnv_npu2_opencapi_cfg_size_fixup()