Lines Matching refs:phb

135 static void pnv_ioda_reserve_pe(struct pnv_phb *phb, int pe_no)  in pnv_ioda_reserve_pe()  argument
137 if (!(pe_no >= 0 && pe_no < phb->ioda.total_pe)) { in pnv_ioda_reserve_pe()
139 __func__, pe_no, phb->hose->global_number); in pnv_ioda_reserve_pe()
143 if (test_and_set_bit(pe_no, phb->ioda.pe_alloc)) in pnv_ioda_reserve_pe()
145 __func__, pe_no, phb->hose->global_number); in pnv_ioda_reserve_pe()
147 phb->ioda.pe_array[pe_no].phb = phb; in pnv_ioda_reserve_pe()
148 phb->ioda.pe_array[pe_no].pe_number = pe_no; in pnv_ioda_reserve_pe()
151 static int pnv_ioda_alloc_pe(struct pnv_phb *phb) in pnv_ioda_alloc_pe() argument
156 pe = find_next_zero_bit(phb->ioda.pe_alloc, in pnv_ioda_alloc_pe()
157 phb->ioda.total_pe, 0); in pnv_ioda_alloc_pe()
158 if (pe >= phb->ioda.total_pe) in pnv_ioda_alloc_pe()
160 } while(test_and_set_bit(pe, phb->ioda.pe_alloc)); in pnv_ioda_alloc_pe()
162 phb->ioda.pe_array[pe].phb = phb; in pnv_ioda_alloc_pe()
163 phb->ioda.pe_array[pe].pe_number = pe; in pnv_ioda_alloc_pe()
167 static void pnv_ioda_free_pe(struct pnv_phb *phb, int pe) in pnv_ioda_free_pe() argument
169 WARN_ON(phb->ioda.pe_array[pe].pdev); in pnv_ioda_free_pe()
171 memset(&phb->ioda.pe_array[pe], 0, sizeof(struct pnv_ioda_pe)); in pnv_ioda_free_pe()
172 clear_bit(pe, phb->ioda.pe_alloc); in pnv_ioda_free_pe()
176 static int pnv_ioda2_init_m64(struct pnv_phb *phb) in pnv_ioda2_init_m64() argument
183 rc = opal_pci_set_phb_mem_window(phb->opal_id, in pnv_ioda2_init_m64()
185 phb->ioda.m64_bar_idx, in pnv_ioda2_init_m64()
186 phb->ioda.m64_base, in pnv_ioda2_init_m64()
188 phb->ioda.m64_size); in pnv_ioda2_init_m64()
195 rc = opal_pci_phb_mmio_enable(phb->opal_id, in pnv_ioda2_init_m64()
197 phb->ioda.m64_bar_idx, in pnv_ioda2_init_m64()
205 set_bit(phb->ioda.m64_bar_idx, &phb->ioda.m64_bar_alloc); in pnv_ioda2_init_m64()
211 r = &phb->hose->mem_resources[1]; in pnv_ioda2_init_m64()
212 if (phb->ioda.reserved_pe == 0) in pnv_ioda2_init_m64()
213 r->start += phb->ioda.m64_segsize; in pnv_ioda2_init_m64()
214 else if (phb->ioda.reserved_pe == (phb->ioda.total_pe - 1)) in pnv_ioda2_init_m64()
215 r->end -= phb->ioda.m64_segsize; in pnv_ioda2_init_m64()
218 phb->ioda.reserved_pe); in pnv_ioda2_init_m64()
224 rc, desc, phb->ioda.m64_bar_idx); in pnv_ioda2_init_m64()
225 opal_pci_phb_mmio_enable(phb->opal_id, in pnv_ioda2_init_m64()
227 phb->ioda.m64_bar_idx, in pnv_ioda2_init_m64()
236 struct pnv_phb *phb = hose->private_data; in pnv_ioda2_reserve_dev_m64_pe() local
241 base = phb->ioda.m64_base; in pnv_ioda2_reserve_dev_m64_pe()
242 sgsz = phb->ioda.m64_segsize; in pnv_ioda2_reserve_dev_m64_pe()
254 pnv_ioda_reserve_pe(phb, segno); in pnv_ioda2_reserve_dev_m64_pe()
277 struct pnv_phb *phb = hose->private_data; in pnv_ioda2_pick_m64_pe() local
287 size = _ALIGN_UP(phb->ioda.total_pe / 8, sizeof(unsigned long)); in pnv_ioda2_pick_m64_pe()
303 if (bitmap_empty(pe_alloc, phb->ioda.total_pe)) { in pnv_ioda2_pick_m64_pe()
314 while ((i = find_next_bit(pe_alloc, phb->ioda.total_pe, i + 1)) < in pnv_ioda2_pick_m64_pe()
315 phb->ioda.total_pe) { in pnv_ioda2_pick_m64_pe()
316 pe = &phb->ioda.pe_array[i]; in pnv_ioda2_pick_m64_pe()
333 static void __init pnv_ioda_parse_m64_window(struct pnv_phb *phb) in pnv_ioda_parse_m64_window() argument
335 struct pci_controller *hose = phb->hose; in pnv_ioda_parse_m64_window()
342 if (phb->type != PNV_PHB_IODA2) { in pnv_ioda_parse_m64_window()
366 phb->ioda.m64_size = resource_size(res); in pnv_ioda_parse_m64_window()
367 phb->ioda.m64_segsize = phb->ioda.m64_size / phb->ioda.total_pe; in pnv_ioda_parse_m64_window()
368 phb->ioda.m64_base = pci_addr; in pnv_ioda_parse_m64_window()
374 phb->ioda.m64_bar_idx = 15; in pnv_ioda_parse_m64_window()
375 phb->init_m64 = pnv_ioda2_init_m64; in pnv_ioda_parse_m64_window()
376 phb->reserve_m64_pe = pnv_ioda2_reserve_m64_pe; in pnv_ioda_parse_m64_window()
377 phb->pick_m64_pe = pnv_ioda2_pick_m64_pe; in pnv_ioda_parse_m64_window()
380 static void pnv_ioda_freeze_pe(struct pnv_phb *phb, int pe_no) in pnv_ioda_freeze_pe() argument
382 struct pnv_ioda_pe *pe = &phb->ioda.pe_array[pe_no]; in pnv_ioda_freeze_pe()
396 rc = opal_pci_eeh_freeze_set(phb->opal_id, in pnv_ioda_freeze_pe()
401 __func__, rc, phb->hose->global_number, pe_no); in pnv_ioda_freeze_pe()
410 rc = opal_pci_eeh_freeze_set(phb->opal_id, in pnv_ioda_freeze_pe()
415 __func__, rc, phb->hose->global_number, in pnv_ioda_freeze_pe()
420 static int pnv_ioda_unfreeze_pe(struct pnv_phb *phb, int pe_no, int opt) in pnv_ioda_unfreeze_pe() argument
426 pe = &phb->ioda.pe_array[pe_no]; in pnv_ioda_unfreeze_pe()
434 rc = opal_pci_eeh_freeze_clear(phb->opal_id, pe_no, opt); in pnv_ioda_unfreeze_pe()
437 __func__, rc, opt, phb->hose->global_number, pe_no); in pnv_ioda_unfreeze_pe()
446 rc = opal_pci_eeh_freeze_clear(phb->opal_id, in pnv_ioda_unfreeze_pe()
451 __func__, rc, opt, phb->hose->global_number, in pnv_ioda_unfreeze_pe()
460 static int pnv_ioda_get_pe_state(struct pnv_phb *phb, int pe_no) in pnv_ioda_get_pe_state() argument
468 if (pe_no < 0 || pe_no >= phb->ioda.total_pe) in pnv_ioda_get_pe_state()
475 pe = &phb->ioda.pe_array[pe_no]; in pnv_ioda_get_pe_state()
483 rc = opal_pci_eeh_freeze_status(phb->opal_id, pe_no, in pnv_ioda_get_pe_state()
489 phb->hose->global_number, pe_no); in pnv_ioda_get_pe_state()
498 rc = opal_pci_eeh_freeze_status(phb->opal_id, in pnv_ioda_get_pe_state()
507 phb->hose->global_number, slave->pe_number); in pnv_ioda_get_pe_state()
529 struct pnv_phb *phb = hose->private_data; in pnv_ioda_get_pe() local
536 return &phb->ioda.pe_array[pdn->pe_number]; in pnv_ioda_get_pe()
540 static int pnv_ioda_set_one_peltv(struct pnv_phb *phb, in pnv_ioda_set_one_peltv() argument
552 rc = opal_pci_set_peltv(phb->opal_id, parent->pe_number, in pnv_ioda_set_one_peltv()
565 rc = opal_pci_set_peltv(phb->opal_id, parent->pe_number, in pnv_ioda_set_one_peltv()
577 static int pnv_ioda_set_peltv(struct pnv_phb *phb, in pnv_ioda_set_peltv() argument
590 opal_pci_eeh_freeze_clear(phb->opal_id, pe->pe_number, in pnv_ioda_set_peltv()
594 opal_pci_eeh_freeze_clear(phb->opal_id, in pnv_ioda_set_peltv()
606 ret = pnv_ioda_set_one_peltv(phb, pe, pe, is_add); in pnv_ioda_set_peltv()
613 ret = pnv_ioda_set_one_peltv(phb, slave, pe, is_add); in pnv_ioda_set_peltv()
632 parent = &phb->ioda.pe_array[pdn->pe_number]; in pnv_ioda_set_peltv()
633 ret = pnv_ioda_set_one_peltv(phb, parent, pe, is_add); in pnv_ioda_set_peltv()
645 static int pnv_ioda_deconfigure_pe(struct pnv_phb *phb, struct pnv_ioda_pe *pe) in pnv_ioda_deconfigure_pe() argument
691 phb->ioda.pe_rmap[rid] = 0; in pnv_ioda_deconfigure_pe()
697 rc = opal_pci_set_peltv(phb->opal_id, pdn->pe_number, in pnv_ioda_deconfigure_pe()
704 opal_pci_eeh_freeze_clear(phb->opal_id, pe->pe_number, in pnv_ioda_deconfigure_pe()
708 rc = opal_pci_set_peltv(phb->opal_id, pe->pe_number, in pnv_ioda_deconfigure_pe()
712 rc = opal_pci_set_pe(phb->opal_id, pe->pe_number, pe->rid, in pnv_ioda_deconfigure_pe()
725 static int pnv_ioda_configure_pe(struct pnv_phb *phb, struct pnv_ioda_pe *pe) in pnv_ioda_configure_pe() argument
776 rc = opal_pci_set_pe(phb->opal_id, pe->pe_number, pe->rid, in pnv_ioda_configure_pe()
784 pnv_ioda_set_peltv(phb, pe, true); in pnv_ioda_configure_pe()
788 phb->ioda.pe_rmap[rid] = pe->pe_number; in pnv_ioda_configure_pe()
791 if (phb->type != PNV_PHB_IODA1) { in pnv_ioda_configure_pe()
797 rc = opal_pci_set_mve(phb->opal_id, pe->mve_number, pe->pe_number); in pnv_ioda_configure_pe()
803 rc = opal_pci_set_mve_enable(phb->opal_id, in pnv_ioda_configure_pe()
816 static void pnv_ioda_link_pe_by_weight(struct pnv_phb *phb, in pnv_ioda_link_pe_by_weight() argument
821 list_for_each_entry(lpe, &phb->ioda.pe_dma_list, dma_link) { in pnv_ioda_link_pe_by_weight()
827 list_add_tail(&pe->dma_link, &phb->ioda.pe_dma_list); in pnv_ioda_link_pe_by_weight()
931 struct pnv_phb *phb = hose->private_data;
948 pe_num = pnv_ioda_alloc_pe(phb);
962 pe = &phb->ioda.pe_array[pe_num];
974 if (pnv_ioda_configure_pe(phb, pe)) {
977 pnv_ioda_free_pe(phb, pe_num);
987 phb->ioda.dma_weight += pe->dma_weight;
988 phb->ioda.dma_pe_count++;
992 pnv_ioda_link_pe_by_weight(phb, pe);
1026 struct pnv_phb *phb = hose->private_data; in pnv_ioda_setup_bus_PE() local
1031 if (phb->pick_m64_pe) in pnv_ioda_setup_bus_PE()
1032 pe_num = phb->pick_m64_pe(bus, all); in pnv_ioda_setup_bus_PE()
1036 pe_num = pnv_ioda_alloc_pe(phb); in pnv_ioda_setup_bus_PE()
1044 pe = &phb->ioda.pe_array[pe_num]; in pnv_ioda_setup_bus_PE()
1060 if (pnv_ioda_configure_pe(phb, pe)) { in pnv_ioda_setup_bus_PE()
1063 pnv_ioda_free_pe(phb, pe_num); in pnv_ioda_setup_bus_PE()
1072 list_add_tail(&pe->list, &phb->ioda.pe_list); in pnv_ioda_setup_bus_PE()
1078 phb->ioda.dma_weight += pe->dma_weight; in pnv_ioda_setup_bus_PE()
1079 phb->ioda.dma_pe_count++; in pnv_ioda_setup_bus_PE()
1083 pnv_ioda_link_pe_by_weight(phb, pe); in pnv_ioda_setup_bus_PE()
1113 struct pnv_phb *phb; in pnv_pci_ioda_setup_PEs() local
1116 phb = hose->private_data; in pnv_pci_ioda_setup_PEs()
1119 if (phb->reserve_m64_pe) in pnv_pci_ioda_setup_PEs()
1120 phb->reserve_m64_pe(hose->bus, NULL, true); in pnv_pci_ioda_setup_PEs()
1131 struct pnv_phb *phb; in pnv_pci_vf_release_m64() local
1137 phb = hose->private_data; in pnv_pci_vf_release_m64()
1144 opal_pci_phb_mmio_enable(phb->opal_id, in pnv_pci_vf_release_m64()
1146 clear_bit(pdn->m64_wins[i][j], &phb->ioda.m64_bar_alloc); in pnv_pci_vf_release_m64()
1157 struct pnv_phb *phb; in pnv_pci_vf_assign_m64() local
1171 phb = hose->private_data; in pnv_pci_vf_assign_m64()
1199 win = find_next_zero_bit(&phb->ioda.m64_bar_alloc, in pnv_pci_vf_assign_m64()
1200 phb->ioda.m64_bar_idx + 1, 0); in pnv_pci_vf_assign_m64()
1202 if (win >= phb->ioda.m64_bar_idx + 1) in pnv_pci_vf_assign_m64()
1204 } while (test_and_set_bit(win, &phb->ioda.m64_bar_alloc)); in pnv_pci_vf_assign_m64()
1221 rc = opal_pci_map_pe_mmio_window(phb->opal_id, in pnv_pci_vf_assign_m64()
1226 rc = opal_pci_set_phb_mem_window(phb->opal_id, in pnv_pci_vf_assign_m64()
1241 rc = opal_pci_phb_mmio_enable(phb->opal_id, in pnv_pci_vf_assign_m64()
1244 rc = opal_pci_phb_mmio_enable(phb->opal_id, in pnv_pci_vf_assign_m64()
1288 struct pnv_phb *phb; in pnv_ioda_release_vf_PE() local
1296 phb = hose->private_data; in pnv_ioda_release_vf_PE()
1319 rc = opal_pci_set_peltv(phb->opal_id, in pnv_ioda_release_vf_PE()
1331 list_for_each_entry_safe(pe, pe_n, &phb->ioda.pe_list, list) { in pnv_ioda_release_vf_PE()
1338 mutex_lock(&phb->ioda.pe_list_mutex); in pnv_ioda_release_vf_PE()
1340 mutex_unlock(&phb->ioda.pe_list_mutex); in pnv_ioda_release_vf_PE()
1342 pnv_ioda_deconfigure_pe(phb, pe); in pnv_ioda_release_vf_PE()
1344 pnv_ioda_free_pe(phb, pe->pe_number); in pnv_ioda_release_vf_PE()
1352 struct pnv_phb *phb; in pnv_pci_sriov_disable() local
1359 phb = hose->private_data; in pnv_pci_sriov_disable()
1367 if (phb->type == PNV_PHB_IODA2) { in pnv_pci_sriov_disable()
1375 bitmap_clear(phb->ioda.pe_alloc, pdn->offset, num_vfs); in pnv_pci_sriov_disable()
1380 static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb,
1386 struct pnv_phb *phb; in pnv_ioda_setup_vf_PE() local
1395 phb = hose->private_data; in pnv_ioda_setup_vf_PE()
1405 pe = &phb->ioda.pe_array[pe_num]; in pnv_ioda_setup_vf_PE()
1407 pe->phb = phb; in pnv_ioda_setup_vf_PE()
1421 if (pnv_ioda_configure_pe(phb, pe)) { in pnv_ioda_setup_vf_PE()
1424 pnv_ioda_free_pe(phb, pe_num); in pnv_ioda_setup_vf_PE()
1430 mutex_lock(&phb->ioda.pe_list_mutex); in pnv_ioda_setup_vf_PE()
1431 list_add_tail(&pe->list, &phb->ioda.pe_list); in pnv_ioda_setup_vf_PE()
1432 mutex_unlock(&phb->ioda.pe_list_mutex); in pnv_ioda_setup_vf_PE()
1434 pnv_pci_ioda2_setup_dma_pe(phb, pe); in pnv_ioda_setup_vf_PE()
1454 rc = opal_pci_set_peltv(phb->opal_id, in pnv_ioda_setup_vf_PE()
1473 struct pnv_phb *phb; in pnv_pci_sriov_enable() local
1479 phb = hose->private_data; in pnv_pci_sriov_enable()
1482 if (phb->type == PNV_PHB_IODA2) { in pnv_pci_sriov_enable()
1484 mutex_lock(&phb->ioda.pe_alloc_mutex); in pnv_pci_sriov_enable()
1486 phb->ioda.pe_alloc, phb->ioda.total_pe, in pnv_pci_sriov_enable()
1488 if (pdn->offset >= phb->ioda.total_pe) { in pnv_pci_sriov_enable()
1489 mutex_unlock(&phb->ioda.pe_alloc_mutex); in pnv_pci_sriov_enable()
1494 bitmap_set(phb->ioda.pe_alloc, pdn->offset, num_vfs); in pnv_pci_sriov_enable()
1496 mutex_unlock(&phb->ioda.pe_alloc_mutex); in pnv_pci_sriov_enable()
1523 bitmap_clear(phb->ioda.pe_alloc, pdn->offset, num_vfs); in pnv_pci_sriov_enable()
1548 static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *pdev) in pnv_pci_ioda_dma_dev_setup() argument
1561 pe = &phb->ioda.pe_array[pdn->pe_number]; in pnv_pci_ioda_dma_dev_setup()
1576 struct pnv_phb *phb = hose->private_data; in pnv_pci_ioda_dma_set_mask() local
1585 pe = &phb->ioda.pe_array[pdn->pe_number]; in pnv_pci_ioda_dma_set_mask()
1605 struct pnv_phb *phb = hose->private_data; in pnv_pci_ioda_dma_get_required_mask() local
1613 pe = &phb->ioda.pe_array[pdn->pe_number]; in pnv_pci_ioda_dma_get_required_mask()
1649 (__be64 __iomem *)pe->phb->ioda.tce_inval_reg_phys : in pnv_pci_ioda1_tce_invalidate()
1650 pe->phb->ioda.tce_inval_reg; in pnv_pci_ioda1_tce_invalidate()
1742 struct pnv_phb *phb = pe->phb; in pnv_pci_ioda2_tce_invalidate_entire() local
1744 if (!phb->ioda.tce_inval_reg) in pnv_pci_ioda2_tce_invalidate_entire()
1748 __raw_writeq(cpu_to_be64(val), phb->ioda.tce_inval_reg); in pnv_pci_ioda2_tce_invalidate_entire()
1786 (__be64 __iomem *)pe->phb->ioda.tce_inval_reg_phys : in pnv_pci_ioda2_tce_invalidate()
1787 pe->phb->ioda.tce_inval_reg; in pnv_pci_ioda2_tce_invalidate()
1848 static void pnv_pci_ioda_setup_dma_pe(struct pnv_phb *phb, in pnv_pci_ioda_setup_dma_pe() argument
1867 tbl = pnv_pci_table_alloc(phb->hose->node); in pnv_pci_ioda_setup_dma_pe()
1868 iommu_register_group(&pe->table_group, phb->hose->global_number, in pnv_pci_ioda_setup_dma_pe()
1870 pnv_pci_link_table_and_group(phb->hose->node, 0, tbl, &pe->table_group); in pnv_pci_ioda_setup_dma_pe()
1882 tce_mem = alloc_pages_node(phb->hose->node, GFP_KERNEL, in pnv_pci_ioda_setup_dma_pe()
1893 rc = opal_pci_map_pe_dma_window(phb->opal_id, in pnv_pci_ioda_setup_dma_pe()
1910 if (phb->ioda.tce_inval_reg) in pnv_pci_ioda_setup_dma_pe()
1918 iommu_init_table(tbl, phb->hose->node); in pnv_pci_ioda_setup_dma_pe()
1949 struct pnv_phb *phb = pe->phb; in pnv_pci_ioda2_set_window() local
1964 rc = opal_pci_map_pe_dma_window(phb->opal_id, in pnv_pci_ioda2_set_window()
1976 pnv_pci_link_table_and_group(phb->hose->node, num, in pnv_pci_ioda2_set_window()
1993 rc = opal_pci_map_pe_dma_window_real(pe->phb->opal_id, in pnv_pci_ioda2_set_bypass()
1999 rc = opal_pci_map_pe_dma_window_real(pe->phb->opal_id, in pnv_pci_ioda2_set_bypass()
2021 int nid = pe->phb->hose->node; in pnv_pci_ioda2_create_table()
2039 if (pe->phb->ioda.tce_inval_reg) in pnv_pci_ioda2_create_table()
2076 iommu_init_table(tbl, pe->phb->hose->node); in pnv_pci_ioda2_setup_default_config()
2090 if (pe->phb->ioda.tce_inval_reg) in pnv_pci_ioda2_setup_default_config()
2110 struct pnv_phb *phb = pe->phb; in pnv_pci_ioda2_unset_window() local
2115 ret = opal_pci_map_pe_dma_window(phb->opal_id, pe->pe_number, in pnv_pci_ioda2_unset_window()
2193 static void pnv_pci_ioda_setup_opal_tce_kill(struct pnv_phb *phb) in pnv_pci_ioda_setup_opal_tce_kill() argument
2198 swinvp = of_get_property(phb->hose->dn, "ibm,opal-tce-kill", NULL); in pnv_pci_ioda_setup_opal_tce_kill()
2202 phb->ioda.tce_inval_reg_phys = be64_to_cpup(swinvp); in pnv_pci_ioda_setup_opal_tce_kill()
2203 phb->ioda.tce_inval_reg = ioremap(phb->ioda.tce_inval_reg_phys, 8); in pnv_pci_ioda_setup_opal_tce_kill()
2341 static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb, in pnv_pci_ioda2_setup_dma_pe() argument
2353 iommu_register_group(&pe->table_group, phb->hose->global_number, in pnv_pci_ioda2_setup_dma_pe()
2359 phb->ioda.m32_pci_base); in pnv_pci_ioda2_setup_dma_pe()
2363 pe->table_group.tce32_size = phb->ioda.m32_pci_base; in pnv_pci_ioda2_setup_dma_pe()
2385 static void pnv_ioda_setup_dma(struct pnv_phb *phb) in pnv_ioda_setup_dma() argument
2387 struct pci_controller *hose = phb->hose; in pnv_ioda_setup_dma()
2396 if (phb->ioda.dma_pe_count > phb->ioda.tce32_count) in pnv_ioda_setup_dma()
2399 residual = phb->ioda.tce32_count - in pnv_ioda_setup_dma()
2400 phb->ioda.dma_pe_count; in pnv_ioda_setup_dma()
2403 hose->global_number, phb->ioda.tce32_count); in pnv_ioda_setup_dma()
2405 phb->ioda.dma_pe_count, phb->ioda.dma_weight); in pnv_ioda_setup_dma()
2407 pnv_pci_ioda_setup_opal_tce_kill(phb); in pnv_ioda_setup_dma()
2413 remaining = phb->ioda.tce32_count; in pnv_ioda_setup_dma()
2414 tw = phb->ioda.dma_weight; in pnv_ioda_setup_dma()
2416 list_for_each_entry(pe, &phb->ioda.pe_dma_list, dma_link) { in pnv_ioda_setup_dma()
2435 if (phb->type == PNV_PHB_IODA1) { in pnv_ioda_setup_dma()
2438 pnv_pci_ioda_setup_dma_pe(phb, pe, base, segs); in pnv_ioda_setup_dma()
2442 pnv_pci_ioda2_setup_dma_pe(phb, pe); in pnv_ioda_setup_dma()
2455 struct pnv_phb *phb = container_of(chip, struct pnv_phb, in pnv_ioda2_msi_eoi() local
2459 rc = opal_pci_msi_eoi(phb->opal_id, hw_irq); in pnv_ioda2_msi_eoi()
2466 static void set_msi_irq_chip(struct pnv_phb *phb, unsigned int virq) in set_msi_irq_chip() argument
2471 if (phb->type != PNV_PHB_IODA2) in set_msi_irq_chip()
2474 if (!phb->ioda.irq_chip_init) { in set_msi_irq_chip()
2481 phb->ioda.irq_chip_init = 1; in set_msi_irq_chip()
2482 phb->ioda.irq_chip = *ichip; in set_msi_irq_chip()
2483 phb->ioda.irq_chip.irq_eoi = pnv_ioda2_msi_eoi; in set_msi_irq_chip()
2485 irq_set_chip(virq, &phb->ioda.irq_chip); in set_msi_irq_chip()
2501 struct pnv_phb *phb = hose->private_data; in pnv_phb_to_cxl_mode() local
2511 rc = opal_pci_set_phb_cxl_mode(phb->opal_id, mode, pe->pe_number); in pnv_phb_to_cxl_mode()
2525 struct pnv_phb *phb = hose->private_data; in pnv_cxl_alloc_hwirqs() local
2526 int hwirq = msi_bitmap_alloc_hwirqs(&phb->msi_bmp, num); in pnv_cxl_alloc_hwirqs()
2533 return phb->msi_base + hwirq; in pnv_cxl_alloc_hwirqs()
2540 struct pnv_phb *phb = hose->private_data; in pnv_cxl_release_hwirqs() local
2542 msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq - phb->msi_base, num); in pnv_cxl_release_hwirqs()
2550 struct pnv_phb *phb = hose->private_data; in pnv_cxl_release_hwirq_ranges() local
2559 hwirq = irqs->offset[i] - phb->msi_base; in pnv_cxl_release_hwirq_ranges()
2560 msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq, in pnv_cxl_release_hwirq_ranges()
2570 struct pnv_phb *phb = hose->private_data; in pnv_cxl_alloc_hwirq_ranges() local
2579 hwirq = msi_bitmap_alloc_hwirqs(&phb->msi_bmp, try); in pnv_cxl_alloc_hwirq_ranges()
2587 irqs->offset[i] = phb->msi_base + hwirq; in pnv_cxl_alloc_hwirq_ranges()
2606 struct pnv_phb *phb = hose->private_data; in pnv_cxl_get_irq_count() local
2608 return phb->msi_bmp.irq_count; in pnv_cxl_get_irq_count()
2616 struct pnv_phb *phb = hose->private_data; in pnv_cxl_ioda_msi_setup() local
2617 unsigned int xive_num = hwirq - phb->msi_base; in pnv_cxl_ioda_msi_setup()
2625 rc = opal_pci_set_xive_pe(phb->opal_id, pe->pe_number, xive_num); in pnv_cxl_ioda_msi_setup()
2629 pci_name(dev), rc, phb->msi_base, hwirq, xive_num); in pnv_cxl_ioda_msi_setup()
2632 set_msi_irq_chip(phb, virq); in pnv_cxl_ioda_msi_setup()
2639 static int pnv_pci_ioda_msi_setup(struct pnv_phb *phb, struct pci_dev *dev, in pnv_pci_ioda_msi_setup() argument
2644 unsigned int xive_num = hwirq - phb->msi_base; in pnv_pci_ioda_msi_setup()
2661 rc = opal_pci_set_xive_pe(phb->opal_id, pe->pe_number, xive_num); in pnv_pci_ioda_msi_setup()
2671 rc = opal_get_msi_64(phb->opal_id, pe->mve_number, xive_num, 1, in pnv_pci_ioda_msi_setup()
2683 rc = opal_get_msi_32(phb->opal_id, pe->mve_number, xive_num, 1, in pnv_pci_ioda_msi_setup()
2695 set_msi_irq_chip(phb, virq); in pnv_pci_ioda_msi_setup()
2705 static void pnv_pci_init_ioda_msis(struct pnv_phb *phb) in pnv_pci_init_ioda_msis() argument
2708 const __be32 *prop = of_get_property(phb->hose->dn, in pnv_pci_init_ioda_msis()
2712 prop = of_get_property(phb->hose->dn, "msi-ranges", NULL); in pnv_pci_init_ioda_msis()
2717 phb->msi_base = be32_to_cpup(prop); in pnv_pci_init_ioda_msis()
2719 if (msi_bitmap_alloc(&phb->msi_bmp, count, phb->hose->dn)) { in pnv_pci_init_ioda_msis()
2721 phb->hose->global_number); in pnv_pci_init_ioda_msis()
2725 phb->msi_setup = pnv_pci_ioda_msi_setup; in pnv_pci_init_ioda_msis()
2726 phb->msi32_support = 1; in pnv_pci_init_ioda_msis()
2728 count, phb->msi_base); in pnv_pci_init_ioda_msis()
2731 static void pnv_pci_init_ioda_msis(struct pnv_phb *phb) { } in pnv_pci_init_ioda_msis() argument
2738 struct pnv_phb *phb; in pnv_pci_ioda_fixup_iov_resources() local
2749 phb = hose->private_data; in pnv_pci_ioda_fixup_iov_resources()
2756 mul = phb->ioda.total_pe; in pnv_pci_ioda_fixup_iov_resources()
2809 struct pnv_phb *phb = hose->private_data; in pnv_ioda_setup_pe_seg() local
2828 region.start = res->start - phb->ioda.io_pci_base; in pnv_ioda_setup_pe_seg()
2829 region.end = res->end - phb->ioda.io_pci_base; in pnv_ioda_setup_pe_seg()
2830 index = region.start / phb->ioda.io_segsize; in pnv_ioda_setup_pe_seg()
2832 while (index < phb->ioda.total_pe && in pnv_ioda_setup_pe_seg()
2834 phb->ioda.io_segmap[index] = pe->pe_number; in pnv_ioda_setup_pe_seg()
2835 rc = opal_pci_map_pe_mmio_window(phb->opal_id, in pnv_ioda_setup_pe_seg()
2844 region.start += phb->ioda.io_segsize; in pnv_ioda_setup_pe_seg()
2851 phb->ioda.m32_pci_base; in pnv_ioda_setup_pe_seg()
2854 phb->ioda.m32_pci_base; in pnv_ioda_setup_pe_seg()
2855 index = region.start / phb->ioda.m32_segsize; in pnv_ioda_setup_pe_seg()
2857 while (index < phb->ioda.total_pe && in pnv_ioda_setup_pe_seg()
2859 phb->ioda.m32_segmap[index] = pe->pe_number; in pnv_ioda_setup_pe_seg()
2860 rc = opal_pci_map_pe_mmio_window(phb->opal_id, in pnv_ioda_setup_pe_seg()
2869 region.start += phb->ioda.m32_segsize; in pnv_ioda_setup_pe_seg()
2879 struct pnv_phb *phb; in pnv_pci_ioda_setup_seg() local
2883 phb = hose->private_data; in pnv_pci_ioda_setup_seg()
2884 list_for_each_entry(pe, &phb->ioda.pe_list, list) { in pnv_pci_ioda_setup_seg()
2893 struct pnv_phb *phb; in pnv_pci_ioda_setup_DMA() local
2899 phb = hose->private_data; in pnv_pci_ioda_setup_DMA()
2900 phb->initialized = 1; in pnv_pci_ioda_setup_DMA()
2908 struct pnv_phb *phb; in pnv_pci_ioda_create_dbgfs() local
2912 phb = hose->private_data; in pnv_pci_ioda_create_dbgfs()
2915 phb->dbgfs = debugfs_create_dir(name, powerpc_debugfs_root); in pnv_pci_ioda_create_dbgfs()
2916 if (!phb->dbgfs) in pnv_pci_ioda_create_dbgfs()
2954 struct pnv_phb *phb = hose->private_data; in pnv_pci_window_alignment() local
2969 if (phb->ioda.m64_segsize && in pnv_pci_window_alignment()
2971 return phb->ioda.m64_segsize; in pnv_pci_window_alignment()
2973 return phb->ioda.m32_segsize; in pnv_pci_window_alignment()
2975 return phb->ioda.io_segsize; in pnv_pci_window_alignment()
3003 struct pnv_phb *phb = hose->private_data; in pnv_pci_enable_device_hook() local
3011 if (!phb->initialized) in pnv_pci_enable_device_hook()
3021 static u32 pnv_ioda_bdfn_to_pe(struct pnv_phb *phb, struct pci_bus *bus, in pnv_ioda_bdfn_to_pe() argument
3024 return phb->ioda.pe_rmap[(bus->number << 8) | devfn]; in pnv_ioda_bdfn_to_pe()
3029 struct pnv_phb *phb = hose->private_data; in pnv_pci_ioda_shutdown() local
3031 opal_pci_reset(phb->opal_id, OPAL_RESET_PCI_IODA_TABLE, in pnv_pci_ioda_shutdown()
3054 struct pnv_phb *phb; in pnv_pci_init_ioda_phb() local
3073 phb = memblock_virt_alloc(sizeof(struct pnv_phb), 0); in pnv_pci_init_ioda_phb()
3076 phb->hose = hose = pcibios_alloc_controller(np); in pnv_pci_init_ioda_phb()
3077 if (!phb->hose) { in pnv_pci_init_ioda_phb()
3080 memblock_free(__pa(phb), sizeof(struct pnv_phb)); in pnv_pci_init_ioda_phb()
3084 spin_lock_init(&phb->lock); in pnv_pci_init_ioda_phb()
3094 hose->private_data = phb; in pnv_pci_init_ioda_phb()
3095 phb->hub_id = hub_id; in pnv_pci_init_ioda_phb()
3096 phb->opal_id = phb_id; in pnv_pci_init_ioda_phb()
3097 phb->type = ioda_type; in pnv_pci_init_ioda_phb()
3098 mutex_init(&phb->ioda.pe_alloc_mutex); in pnv_pci_init_ioda_phb()
3102 phb->model = PNV_PHB_MODEL_P7IOC; in pnv_pci_init_ioda_phb()
3104 phb->model = PNV_PHB_MODEL_PHB3; in pnv_pci_init_ioda_phb()
3106 phb->model = PNV_PHB_MODEL_UNKNOWN; in pnv_pci_init_ioda_phb()
3112 phb->regs = of_iomap(np, 0); in pnv_pci_init_ioda_phb()
3113 if (phb->regs == NULL) in pnv_pci_init_ioda_phb()
3117 phb->ioda.total_pe = 1; in pnv_pci_init_ioda_phb()
3120 phb->ioda.total_pe = be32_to_cpup(prop32); in pnv_pci_init_ioda_phb()
3123 phb->ioda.reserved_pe = be32_to_cpup(prop32); in pnv_pci_init_ioda_phb()
3126 pnv_ioda_parse_m64_window(phb); in pnv_pci_init_ioda_phb()
3128 phb->ioda.m32_size = resource_size(&hose->mem_resources[0]); in pnv_pci_init_ioda_phb()
3130 phb->ioda.m32_size += 0x10000; in pnv_pci_init_ioda_phb()
3132 phb->ioda.m32_segsize = phb->ioda.m32_size / phb->ioda.total_pe; in pnv_pci_init_ioda_phb()
3133 phb->ioda.m32_pci_base = hose->mem_resources[0].start - hose->mem_offset[0]; in pnv_pci_init_ioda_phb()
3134 phb->ioda.io_size = hose->pci_io_size; in pnv_pci_init_ioda_phb()
3135 phb->ioda.io_segsize = phb->ioda.io_size / phb->ioda.total_pe; in pnv_pci_init_ioda_phb()
3136 phb->ioda.io_pci_base = 0; /* XXX calculate this ? */ in pnv_pci_init_ioda_phb()
3139 size = _ALIGN_UP(phb->ioda.total_pe / 8, sizeof(unsigned long)); in pnv_pci_init_ioda_phb()
3141 size += phb->ioda.total_pe * sizeof(phb->ioda.m32_segmap[0]); in pnv_pci_init_ioda_phb()
3142 if (phb->type == PNV_PHB_IODA1) { in pnv_pci_init_ioda_phb()
3144 size += phb->ioda.total_pe * sizeof(phb->ioda.io_segmap[0]); in pnv_pci_init_ioda_phb()
3147 size += phb->ioda.total_pe * sizeof(struct pnv_ioda_pe); in pnv_pci_init_ioda_phb()
3149 phb->ioda.pe_alloc = aux; in pnv_pci_init_ioda_phb()
3150 phb->ioda.m32_segmap = aux + m32map_off; in pnv_pci_init_ioda_phb()
3151 if (phb->type == PNV_PHB_IODA1) in pnv_pci_init_ioda_phb()
3152 phb->ioda.io_segmap = aux + iomap_off; in pnv_pci_init_ioda_phb()
3153 phb->ioda.pe_array = aux + pemap_off; in pnv_pci_init_ioda_phb()
3154 set_bit(phb->ioda.reserved_pe, phb->ioda.pe_alloc); in pnv_pci_init_ioda_phb()
3156 INIT_LIST_HEAD(&phb->ioda.pe_dma_list); in pnv_pci_init_ioda_phb()
3157 INIT_LIST_HEAD(&phb->ioda.pe_list); in pnv_pci_init_ioda_phb()
3158 mutex_init(&phb->ioda.pe_list_mutex); in pnv_pci_init_ioda_phb()
3161 phb->ioda.tce32_count = phb->ioda.m32_pci_base >> 28; in pnv_pci_init_ioda_phb()
3173 phb->ioda.total_pe, phb->ioda.reserved_pe, in pnv_pci_init_ioda_phb()
3174 phb->ioda.m32_size, phb->ioda.m32_segsize); in pnv_pci_init_ioda_phb()
3175 if (phb->ioda.m64_size) in pnv_pci_init_ioda_phb()
3177 phb->ioda.m64_size, phb->ioda.m64_segsize); in pnv_pci_init_ioda_phb()
3178 if (phb->ioda.io_size) in pnv_pci_init_ioda_phb()
3180 phb->ioda.io_size, phb->ioda.io_segsize); in pnv_pci_init_ioda_phb()
3183 phb->hose->ops = &pnv_pci_ops; in pnv_pci_init_ioda_phb()
3184 phb->get_pe_state = pnv_ioda_get_pe_state; in pnv_pci_init_ioda_phb()
3185 phb->freeze_pe = pnv_ioda_freeze_pe; in pnv_pci_init_ioda_phb()
3186 phb->unfreeze_pe = pnv_ioda_unfreeze_pe; in pnv_pci_init_ioda_phb()
3189 phb->bdfn_to_pe = pnv_ioda_bdfn_to_pe; in pnv_pci_init_ioda_phb()
3192 phb->dma_dev_setup = pnv_pci_ioda_dma_dev_setup; in pnv_pci_init_ioda_phb()
3195 pnv_pci_init_ioda_msis(phb); in pnv_pci_init_ioda_phb()
3231 if (!phb->init_m64 || phb->init_m64(phb)) in pnv_pci_init_ioda_phb()