Lines Matching refs:phb
126 static void pnv_ioda_reserve_pe(struct pnv_phb *phb, int pe_no) in pnv_ioda_reserve_pe() argument
128 if (!(pe_no >= 0 && pe_no < phb->ioda.total_pe)) { in pnv_ioda_reserve_pe()
130 __func__, pe_no, phb->hose->global_number); in pnv_ioda_reserve_pe()
134 if (test_and_set_bit(pe_no, phb->ioda.pe_alloc)) { in pnv_ioda_reserve_pe()
136 __func__, pe_no, phb->hose->global_number); in pnv_ioda_reserve_pe()
140 phb->ioda.pe_array[pe_no].phb = phb; in pnv_ioda_reserve_pe()
141 phb->ioda.pe_array[pe_no].pe_number = pe_no; in pnv_ioda_reserve_pe()
144 static int pnv_ioda_alloc_pe(struct pnv_phb *phb) in pnv_ioda_alloc_pe() argument
149 pe = find_next_zero_bit(phb->ioda.pe_alloc, in pnv_ioda_alloc_pe()
150 phb->ioda.total_pe, 0); in pnv_ioda_alloc_pe()
151 if (pe >= phb->ioda.total_pe) in pnv_ioda_alloc_pe()
153 } while(test_and_set_bit(pe, phb->ioda.pe_alloc)); in pnv_ioda_alloc_pe()
155 phb->ioda.pe_array[pe].phb = phb; in pnv_ioda_alloc_pe()
156 phb->ioda.pe_array[pe].pe_number = pe; in pnv_ioda_alloc_pe()
160 static void pnv_ioda_free_pe(struct pnv_phb *phb, int pe) in pnv_ioda_free_pe() argument
162 WARN_ON(phb->ioda.pe_array[pe].pdev); in pnv_ioda_free_pe()
164 memset(&phb->ioda.pe_array[pe], 0, sizeof(struct pnv_ioda_pe)); in pnv_ioda_free_pe()
165 clear_bit(pe, phb->ioda.pe_alloc); in pnv_ioda_free_pe()
169 static int pnv_ioda2_init_m64(struct pnv_phb *phb) in pnv_ioda2_init_m64() argument
176 rc = opal_pci_set_phb_mem_window(phb->opal_id, in pnv_ioda2_init_m64()
178 phb->ioda.m64_bar_idx, in pnv_ioda2_init_m64()
179 phb->ioda.m64_base, in pnv_ioda2_init_m64()
181 phb->ioda.m64_size); in pnv_ioda2_init_m64()
188 rc = opal_pci_phb_mmio_enable(phb->opal_id, in pnv_ioda2_init_m64()
190 phb->ioda.m64_bar_idx, in pnv_ioda2_init_m64()
198 set_bit(phb->ioda.m64_bar_idx, &phb->ioda.m64_bar_alloc); in pnv_ioda2_init_m64()
204 r = &phb->hose->mem_resources[1]; in pnv_ioda2_init_m64()
205 if (phb->ioda.reserved_pe == 0) in pnv_ioda2_init_m64()
206 r->start += phb->ioda.m64_segsize; in pnv_ioda2_init_m64()
207 else if (phb->ioda.reserved_pe == (phb->ioda.total_pe - 1)) in pnv_ioda2_init_m64()
208 r->end -= phb->ioda.m64_segsize; in pnv_ioda2_init_m64()
211 phb->ioda.reserved_pe); in pnv_ioda2_init_m64()
217 rc, desc, phb->ioda.m64_bar_idx); in pnv_ioda2_init_m64()
218 opal_pci_phb_mmio_enable(phb->opal_id, in pnv_ioda2_init_m64()
220 phb->ioda.m64_bar_idx, in pnv_ioda2_init_m64()
225 static void pnv_ioda2_reserve_m64_pe(struct pnv_phb *phb) in pnv_ioda2_reserve_m64_pe() argument
227 resource_size_t sgsz = phb->ioda.m64_segsize; in pnv_ioda2_reserve_m64_pe()
237 list_for_each_entry(pdev, &phb->hose->bus->devices, bus_list) { in pnv_ioda2_reserve_m64_pe()
244 base = (r->start - phb->ioda.m64_base) / sgsz; in pnv_ioda2_reserve_m64_pe()
246 pnv_ioda_reserve_pe(phb, base + step); in pnv_ioda2_reserve_m64_pe()
251 static int pnv_ioda2_pick_m64_pe(struct pnv_phb *phb, in pnv_ioda2_pick_m64_pe() argument
254 resource_size_t segsz = phb->ioda.m64_segsize; in pnv_ioda2_pick_m64_pe()
281 size = _ALIGN_UP(phb->ioda.total_pe / 8, sizeof(unsigned long)); in pnv_ioda2_pick_m64_pe()
293 start = (r->start - phb->ioda.m64_base) / segsz; in pnv_ioda2_pick_m64_pe()
313 start = (r->start - phb->ioda.m64_base) / segsz; in pnv_ioda2_pick_m64_pe()
324 if (bitmap_empty(pe_alloc, phb->ioda.total_pe)) { in pnv_ioda2_pick_m64_pe()
336 while ((i = find_next_bit(pe_alloc, phb->ioda.total_pe, i + 1)) < in pnv_ioda2_pick_m64_pe()
337 phb->ioda.total_pe) { in pnv_ioda2_pick_m64_pe()
338 pe = &phb->ioda.pe_array[i]; in pnv_ioda2_pick_m64_pe()
355 static void __init pnv_ioda_parse_m64_window(struct pnv_phb *phb) in pnv_ioda_parse_m64_window() argument
357 struct pci_controller *hose = phb->hose; in pnv_ioda_parse_m64_window()
364 if (phb->type != PNV_PHB_IODA2) { in pnv_ioda_parse_m64_window()
388 phb->ioda.m64_size = resource_size(res); in pnv_ioda_parse_m64_window()
389 phb->ioda.m64_segsize = phb->ioda.m64_size / phb->ioda.total_pe; in pnv_ioda_parse_m64_window()
390 phb->ioda.m64_base = pci_addr; in pnv_ioda_parse_m64_window()
396 phb->ioda.m64_bar_idx = 15; in pnv_ioda_parse_m64_window()
397 phb->init_m64 = pnv_ioda2_init_m64; in pnv_ioda_parse_m64_window()
398 phb->reserve_m64_pe = pnv_ioda2_reserve_m64_pe; in pnv_ioda_parse_m64_window()
399 phb->pick_m64_pe = pnv_ioda2_pick_m64_pe; in pnv_ioda_parse_m64_window()
402 static void pnv_ioda_freeze_pe(struct pnv_phb *phb, int pe_no) in pnv_ioda_freeze_pe() argument
404 struct pnv_ioda_pe *pe = &phb->ioda.pe_array[pe_no]; in pnv_ioda_freeze_pe()
418 rc = opal_pci_eeh_freeze_set(phb->opal_id, in pnv_ioda_freeze_pe()
423 __func__, rc, phb->hose->global_number, pe_no); in pnv_ioda_freeze_pe()
432 rc = opal_pci_eeh_freeze_set(phb->opal_id, in pnv_ioda_freeze_pe()
437 __func__, rc, phb->hose->global_number, in pnv_ioda_freeze_pe()
442 static int pnv_ioda_unfreeze_pe(struct pnv_phb *phb, int pe_no, int opt) in pnv_ioda_unfreeze_pe() argument
448 pe = &phb->ioda.pe_array[pe_no]; in pnv_ioda_unfreeze_pe()
456 rc = opal_pci_eeh_freeze_clear(phb->opal_id, pe_no, opt); in pnv_ioda_unfreeze_pe()
459 __func__, rc, opt, phb->hose->global_number, pe_no); in pnv_ioda_unfreeze_pe()
468 rc = opal_pci_eeh_freeze_clear(phb->opal_id, in pnv_ioda_unfreeze_pe()
473 __func__, rc, opt, phb->hose->global_number, in pnv_ioda_unfreeze_pe()
482 static int pnv_ioda_get_pe_state(struct pnv_phb *phb, int pe_no) in pnv_ioda_get_pe_state() argument
490 if (pe_no < 0 || pe_no >= phb->ioda.total_pe) in pnv_ioda_get_pe_state()
497 pe = &phb->ioda.pe_array[pe_no]; in pnv_ioda_get_pe_state()
505 rc = opal_pci_eeh_freeze_status(phb->opal_id, pe_no, in pnv_ioda_get_pe_state()
511 phb->hose->global_number, pe_no); in pnv_ioda_get_pe_state()
520 rc = opal_pci_eeh_freeze_status(phb->opal_id, in pnv_ioda_get_pe_state()
529 phb->hose->global_number, slave->pe_number); in pnv_ioda_get_pe_state()
551 struct pnv_phb *phb = hose->private_data; in pnv_ioda_get_pe() local
558 return &phb->ioda.pe_array[pdn->pe_number]; in pnv_ioda_get_pe()
562 static int pnv_ioda_set_one_peltv(struct pnv_phb *phb, in pnv_ioda_set_one_peltv() argument
574 rc = opal_pci_set_peltv(phb->opal_id, parent->pe_number, in pnv_ioda_set_one_peltv()
587 rc = opal_pci_set_peltv(phb->opal_id, parent->pe_number, in pnv_ioda_set_one_peltv()
599 static int pnv_ioda_set_peltv(struct pnv_phb *phb, in pnv_ioda_set_peltv() argument
612 opal_pci_eeh_freeze_clear(phb->opal_id, pe->pe_number, in pnv_ioda_set_peltv()
616 opal_pci_eeh_freeze_clear(phb->opal_id, in pnv_ioda_set_peltv()
628 ret = pnv_ioda_set_one_peltv(phb, pe, pe, is_add); in pnv_ioda_set_peltv()
635 ret = pnv_ioda_set_one_peltv(phb, slave, pe, is_add); in pnv_ioda_set_peltv()
654 parent = &phb->ioda.pe_array[pdn->pe_number]; in pnv_ioda_set_peltv()
655 ret = pnv_ioda_set_one_peltv(phb, parent, pe, is_add); in pnv_ioda_set_peltv()
667 static int pnv_ioda_deconfigure_pe(struct pnv_phb *phb, struct pnv_ioda_pe *pe) in pnv_ioda_deconfigure_pe() argument
713 phb->ioda.pe_rmap[rid] = 0; in pnv_ioda_deconfigure_pe()
719 rc = opal_pci_set_peltv(phb->opal_id, pdn->pe_number, in pnv_ioda_deconfigure_pe()
726 opal_pci_eeh_freeze_set(phb->opal_id, pe->pe_number, in pnv_ioda_deconfigure_pe()
730 rc = opal_pci_set_peltv(phb->opal_id, pe->pe_number, in pnv_ioda_deconfigure_pe()
734 rc = opal_pci_set_pe(phb->opal_id, pe->pe_number, pe->rid, in pnv_ioda_deconfigure_pe()
747 static int pnv_ioda_configure_pe(struct pnv_phb *phb, struct pnv_ioda_pe *pe) in pnv_ioda_configure_pe() argument
798 rc = opal_pci_set_pe(phb->opal_id, pe->pe_number, pe->rid, in pnv_ioda_configure_pe()
806 pnv_ioda_set_peltv(phb, pe, true); in pnv_ioda_configure_pe()
810 phb->ioda.pe_rmap[rid] = pe->pe_number; in pnv_ioda_configure_pe()
813 if (phb->type != PNV_PHB_IODA1) { in pnv_ioda_configure_pe()
819 rc = opal_pci_set_mve(phb->opal_id, pe->mve_number, pe->pe_number); in pnv_ioda_configure_pe()
825 rc = opal_pci_set_mve_enable(phb->opal_id, in pnv_ioda_configure_pe()
838 static void pnv_ioda_link_pe_by_weight(struct pnv_phb *phb, in pnv_ioda_link_pe_by_weight() argument
843 list_for_each_entry(lpe, &phb->ioda.pe_dma_list, dma_link) { in pnv_ioda_link_pe_by_weight()
849 list_add_tail(&pe->dma_link, &phb->ioda.pe_dma_list); in pnv_ioda_link_pe_by_weight()
952 struct pnv_phb *phb = hose->private_data;
969 pe_num = pnv_ioda_alloc_pe(phb);
983 pe = &phb->ioda.pe_array[pe_num];
995 if (pnv_ioda_configure_pe(phb, pe)) {
998 pnv_ioda_free_pe(phb, pe_num);
1008 phb->ioda.dma_weight += pe->dma_weight;
1009 phb->ioda.dma_pe_count++;
1013 pnv_ioda_link_pe_by_weight(phb, pe);
1047 struct pnv_phb *phb = hose->private_data; in pnv_ioda_setup_bus_PE() local
1052 if (phb->pick_m64_pe) in pnv_ioda_setup_bus_PE()
1053 pe_num = phb->pick_m64_pe(phb, bus, all); in pnv_ioda_setup_bus_PE()
1057 pe_num = pnv_ioda_alloc_pe(phb); in pnv_ioda_setup_bus_PE()
1065 pe = &phb->ioda.pe_array[pe_num]; in pnv_ioda_setup_bus_PE()
1081 if (pnv_ioda_configure_pe(phb, pe)) { in pnv_ioda_setup_bus_PE()
1084 pnv_ioda_free_pe(phb, pe_num); in pnv_ioda_setup_bus_PE()
1097 list_add_tail(&pe->list, &phb->ioda.pe_list); in pnv_ioda_setup_bus_PE()
1103 phb->ioda.dma_weight += pe->dma_weight; in pnv_ioda_setup_bus_PE()
1104 phb->ioda.dma_pe_count++; in pnv_ioda_setup_bus_PE()
1108 pnv_ioda_link_pe_by_weight(phb, pe); in pnv_ioda_setup_bus_PE()
1138 struct pnv_phb *phb; in pnv_pci_ioda_setup_PEs() local
1141 phb = hose->private_data; in pnv_pci_ioda_setup_PEs()
1144 if (phb->reserve_m64_pe) in pnv_pci_ioda_setup_PEs()
1145 phb->reserve_m64_pe(phb); in pnv_pci_ioda_setup_PEs()
1156 struct pnv_phb *phb; in pnv_pci_vf_release_m64() local
1162 phb = hose->private_data; in pnv_pci_vf_release_m64()
1169 opal_pci_phb_mmio_enable(phb->opal_id, in pnv_pci_vf_release_m64()
1171 clear_bit(pdn->m64_wins[i][j], &phb->ioda.m64_bar_alloc); in pnv_pci_vf_release_m64()
1182 struct pnv_phb *phb; in pnv_pci_vf_assign_m64() local
1196 phb = hose->private_data; in pnv_pci_vf_assign_m64()
1224 win = find_next_zero_bit(&phb->ioda.m64_bar_alloc, in pnv_pci_vf_assign_m64()
1225 phb->ioda.m64_bar_idx + 1, 0); in pnv_pci_vf_assign_m64()
1227 if (win >= phb->ioda.m64_bar_idx + 1) in pnv_pci_vf_assign_m64()
1229 } while (test_and_set_bit(win, &phb->ioda.m64_bar_alloc)); in pnv_pci_vf_assign_m64()
1246 rc = opal_pci_map_pe_mmio_window(phb->opal_id, in pnv_pci_vf_assign_m64()
1251 rc = opal_pci_set_phb_mem_window(phb->opal_id, in pnv_pci_vf_assign_m64()
1266 rc = opal_pci_phb_mmio_enable(phb->opal_id, in pnv_pci_vf_assign_m64()
1269 rc = opal_pci_phb_mmio_enable(phb->opal_id, in pnv_pci_vf_assign_m64()
1290 struct pnv_phb *phb; in pnv_pci_ioda2_release_dma_pe() local
1297 phb = hose->private_data; in pnv_pci_ioda2_release_dma_pe()
1301 opal_pci_map_pe_dma_window(phb->opal_id, pe->pe_number, in pnv_pci_ioda2_release_dma_pe()
1305 rc = opal_pci_map_pe_dma_window_real(pe->phb->opal_id, in pnv_pci_ioda2_release_dma_pe()
1322 struct pnv_phb *phb; in pnv_ioda_release_vf_PE() local
1330 phb = hose->private_data; in pnv_ioda_release_vf_PE()
1353 rc = opal_pci_set_peltv(phb->opal_id, in pnv_ioda_release_vf_PE()
1365 list_for_each_entry_safe(pe, pe_n, &phb->ioda.pe_list, list) { in pnv_ioda_release_vf_PE()
1372 mutex_lock(&phb->ioda.pe_list_mutex); in pnv_ioda_release_vf_PE()
1374 mutex_unlock(&phb->ioda.pe_list_mutex); in pnv_ioda_release_vf_PE()
1376 pnv_ioda_deconfigure_pe(phb, pe); in pnv_ioda_release_vf_PE()
1378 pnv_ioda_free_pe(phb, pe->pe_number); in pnv_ioda_release_vf_PE()
1386 struct pnv_phb *phb; in pnv_pci_sriov_disable() local
1393 phb = hose->private_data; in pnv_pci_sriov_disable()
1401 if (phb->type == PNV_PHB_IODA2) { in pnv_pci_sriov_disable()
1409 bitmap_clear(phb->ioda.pe_alloc, pdn->offset, num_vfs); in pnv_pci_sriov_disable()
1414 static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb,
1420 struct pnv_phb *phb; in pnv_ioda_setup_vf_PE() local
1429 phb = hose->private_data; in pnv_ioda_setup_vf_PE()
1439 pe = &phb->ioda.pe_array[pe_num]; in pnv_ioda_setup_vf_PE()
1441 pe->phb = phb; in pnv_ioda_setup_vf_PE()
1455 if (pnv_ioda_configure_pe(phb, pe)) { in pnv_ioda_setup_vf_PE()
1458 pnv_ioda_free_pe(phb, pe_num); in pnv_ioda_setup_vf_PE()
1468 mutex_lock(&phb->ioda.pe_list_mutex); in pnv_ioda_setup_vf_PE()
1469 list_add_tail(&pe->list, &phb->ioda.pe_list); in pnv_ioda_setup_vf_PE()
1470 mutex_unlock(&phb->ioda.pe_list_mutex); in pnv_ioda_setup_vf_PE()
1472 pnv_pci_ioda2_setup_dma_pe(phb, pe); in pnv_ioda_setup_vf_PE()
1492 rc = opal_pci_set_peltv(phb->opal_id, in pnv_ioda_setup_vf_PE()
1511 struct pnv_phb *phb; in pnv_pci_sriov_enable() local
1517 phb = hose->private_data; in pnv_pci_sriov_enable()
1520 if (phb->type == PNV_PHB_IODA2) { in pnv_pci_sriov_enable()
1522 mutex_lock(&phb->ioda.pe_alloc_mutex); in pnv_pci_sriov_enable()
1524 phb->ioda.pe_alloc, phb->ioda.total_pe, in pnv_pci_sriov_enable()
1526 if (pdn->offset >= phb->ioda.total_pe) { in pnv_pci_sriov_enable()
1527 mutex_unlock(&phb->ioda.pe_alloc_mutex); in pnv_pci_sriov_enable()
1532 bitmap_set(phb->ioda.pe_alloc, pdn->offset, num_vfs); in pnv_pci_sriov_enable()
1534 mutex_unlock(&phb->ioda.pe_alloc_mutex); in pnv_pci_sriov_enable()
1561 bitmap_clear(phb->ioda.pe_alloc, pdn->offset, num_vfs); in pnv_pci_sriov_enable()
1586 static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *pdev) in pnv_pci_ioda_dma_dev_setup() argument
1599 pe = &phb->ioda.pe_array[pdn->pe_number]; in pnv_pci_ioda_dma_dev_setup()
1604 static int pnv_pci_ioda_dma_set_mask(struct pnv_phb *phb, in pnv_pci_ioda_dma_set_mask() argument
1615 pe = &phb->ioda.pe_array[pdn->pe_number]; in pnv_pci_ioda_dma_set_mask()
1634 static u64 pnv_pci_ioda_dma_get_required_mask(struct pnv_phb *phb, in pnv_pci_ioda_dma_get_required_mask() argument
1644 pe = &phb->ioda.pe_array[pdn->pe_number]; in pnv_pci_ioda_dma_get_required_mask()
1758 struct pnv_phb *phb = pe->phb; in pnv_pci_ioda_tce_invalidate() local
1760 if (phb->type == PNV_PHB_IODA1) in pnv_pci_ioda_tce_invalidate()
1766 static void pnv_pci_ioda_setup_dma_pe(struct pnv_phb *phb, in pnv_pci_ioda_setup_dma_pe() argument
1796 tce_mem = alloc_pages_node(phb->hose->node, GFP_KERNEL, in pnv_pci_ioda_setup_dma_pe()
1807 rc = opal_pci_map_pe_dma_window(phb->opal_id, in pnv_pci_ioda_setup_dma_pe()
1825 swinvp = of_get_property(phb->hose->dn, "ibm,opal-tce-kill", NULL); in pnv_pci_ioda_setup_dma_pe()
1839 iommu_init_table(tbl, phb->hose->node); in pnv_pci_ioda_setup_dma_pe()
1842 iommu_register_group(tbl, phb->hose->global_number, in pnv_pci_ioda_setup_dma_pe()
1846 iommu_register_group(tbl, phb->hose->global_number, in pnv_pci_ioda_setup_dma_pe()
1850 iommu_register_group(tbl, phb->hose->global_number, in pnv_pci_ioda_setup_dma_pe()
1874 rc = opal_pci_map_pe_dma_window_real(pe->phb->opal_id, in pnv_pci_ioda2_set_bypass()
1880 rc = opal_pci_map_pe_dma_window_real(pe->phb->opal_id, in pnv_pci_ioda2_set_bypass()
1903 static void pnv_pci_ioda2_setup_bypass_pe(struct pnv_phb *phb, in pnv_pci_ioda2_setup_bypass_pe() argument
1916 static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb, in pnv_pci_ioda2_setup_dma_pe() argument
1932 end = (1 << ilog2(phb->ioda.m32_pci_base)); in pnv_pci_ioda2_setup_dma_pe()
1938 tce_mem = alloc_pages_node(phb->hose->node, GFP_KERNEL, in pnv_pci_ioda2_setup_dma_pe()
1951 rc = opal_pci_map_pe_dma_window(phb->opal_id, pe->pe_number, in pnv_pci_ioda2_setup_dma_pe()
1966 swinvp = of_get_property(phb->hose->dn, "ibm,opal-tce-kill", NULL); in pnv_pci_ioda2_setup_dma_pe()
1978 iommu_init_table(tbl, phb->hose->node); in pnv_pci_ioda2_setup_dma_pe()
1981 iommu_register_group(tbl, phb->hose->global_number, in pnv_pci_ioda2_setup_dma_pe()
1985 iommu_register_group(tbl, phb->hose->global_number, in pnv_pci_ioda2_setup_dma_pe()
1989 iommu_register_group(tbl, phb->hose->global_number, in pnv_pci_ioda2_setup_dma_pe()
1995 pnv_pci_ioda2_setup_bypass_pe(phb, pe); in pnv_pci_ioda2_setup_dma_pe()
2005 static void pnv_ioda_setup_dma(struct pnv_phb *phb) in pnv_ioda_setup_dma() argument
2007 struct pci_controller *hose = phb->hose; in pnv_ioda_setup_dma()
2016 if (phb->ioda.dma_pe_count > phb->ioda.tce32_count) in pnv_ioda_setup_dma()
2019 residual = phb->ioda.tce32_count - in pnv_ioda_setup_dma()
2020 phb->ioda.dma_pe_count; in pnv_ioda_setup_dma()
2023 hose->global_number, phb->ioda.tce32_count); in pnv_ioda_setup_dma()
2025 phb->ioda.dma_pe_count, phb->ioda.dma_weight); in pnv_ioda_setup_dma()
2031 remaining = phb->ioda.tce32_count; in pnv_ioda_setup_dma()
2032 tw = phb->ioda.dma_weight; in pnv_ioda_setup_dma()
2034 list_for_each_entry(pe, &phb->ioda.pe_dma_list, dma_link) { in pnv_ioda_setup_dma()
2053 if (phb->type == PNV_PHB_IODA1) { in pnv_ioda_setup_dma()
2056 pnv_pci_ioda_setup_dma_pe(phb, pe, base, segs); in pnv_ioda_setup_dma()
2060 pnv_pci_ioda2_setup_dma_pe(phb, pe); in pnv_ioda_setup_dma()
2073 struct pnv_phb *phb = container_of(chip, struct pnv_phb, in pnv_ioda2_msi_eoi() local
2077 rc = opal_pci_msi_eoi(phb->opal_id, hw_irq); in pnv_ioda2_msi_eoi()
2084 static void set_msi_irq_chip(struct pnv_phb *phb, unsigned int virq) in set_msi_irq_chip() argument
2089 if (phb->type != PNV_PHB_IODA2) in set_msi_irq_chip()
2092 if (!phb->ioda.irq_chip_init) { in set_msi_irq_chip()
2099 phb->ioda.irq_chip_init = 1; in set_msi_irq_chip()
2100 phb->ioda.irq_chip = *ichip; in set_msi_irq_chip()
2101 phb->ioda.irq_chip.irq_eoi = pnv_ioda2_msi_eoi; in set_msi_irq_chip()
2103 irq_set_chip(virq, &phb->ioda.irq_chip); in set_msi_irq_chip()
2119 struct pnv_phb *phb = hose->private_data; in pnv_phb_to_cxl_mode() local
2129 rc = opal_pci_set_phb_cxl_mode(phb->opal_id, mode, pe->pe_number); in pnv_phb_to_cxl_mode()
2143 struct pnv_phb *phb = hose->private_data; in pnv_cxl_alloc_hwirqs() local
2144 int hwirq = msi_bitmap_alloc_hwirqs(&phb->msi_bmp, num); in pnv_cxl_alloc_hwirqs()
2151 return phb->msi_base + hwirq; in pnv_cxl_alloc_hwirqs()
2158 struct pnv_phb *phb = hose->private_data; in pnv_cxl_release_hwirqs() local
2160 msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq - phb->msi_base, num); in pnv_cxl_release_hwirqs()
2168 struct pnv_phb *phb = hose->private_data; in pnv_cxl_release_hwirq_ranges() local
2177 hwirq = irqs->offset[i] - phb->msi_base; in pnv_cxl_release_hwirq_ranges()
2178 msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq, in pnv_cxl_release_hwirq_ranges()
2188 struct pnv_phb *phb = hose->private_data; in pnv_cxl_alloc_hwirq_ranges() local
2197 hwirq = msi_bitmap_alloc_hwirqs(&phb->msi_bmp, try); in pnv_cxl_alloc_hwirq_ranges()
2205 irqs->offset[i] = phb->msi_base + hwirq; in pnv_cxl_alloc_hwirq_ranges()
2224 struct pnv_phb *phb = hose->private_data; in pnv_cxl_get_irq_count() local
2226 return phb->msi_bmp.irq_count; in pnv_cxl_get_irq_count()
2234 struct pnv_phb *phb = hose->private_data; in pnv_cxl_ioda_msi_setup() local
2235 unsigned int xive_num = hwirq - phb->msi_base; in pnv_cxl_ioda_msi_setup()
2243 rc = opal_pci_set_xive_pe(phb->opal_id, pe->pe_number, xive_num); in pnv_cxl_ioda_msi_setup()
2247 pci_name(dev), rc, phb->msi_base, hwirq, xive_num); in pnv_cxl_ioda_msi_setup()
2250 set_msi_irq_chip(phb, virq); in pnv_cxl_ioda_msi_setup()
2257 static int pnv_pci_ioda_msi_setup(struct pnv_phb *phb, struct pci_dev *dev, in pnv_pci_ioda_msi_setup() argument
2262 unsigned int xive_num = hwirq - phb->msi_base; in pnv_pci_ioda_msi_setup()
2279 rc = opal_pci_set_xive_pe(phb->opal_id, pe->pe_number, xive_num); in pnv_pci_ioda_msi_setup()
2289 rc = opal_get_msi_64(phb->opal_id, pe->mve_number, xive_num, 1, in pnv_pci_ioda_msi_setup()
2301 rc = opal_get_msi_32(phb->opal_id, pe->mve_number, xive_num, 1, in pnv_pci_ioda_msi_setup()
2313 set_msi_irq_chip(phb, virq); in pnv_pci_ioda_msi_setup()
2323 static void pnv_pci_init_ioda_msis(struct pnv_phb *phb) in pnv_pci_init_ioda_msis() argument
2326 const __be32 *prop = of_get_property(phb->hose->dn, in pnv_pci_init_ioda_msis()
2330 prop = of_get_property(phb->hose->dn, "msi-ranges", NULL); in pnv_pci_init_ioda_msis()
2335 phb->msi_base = be32_to_cpup(prop); in pnv_pci_init_ioda_msis()
2337 if (msi_bitmap_alloc(&phb->msi_bmp, count, phb->hose->dn)) { in pnv_pci_init_ioda_msis()
2339 phb->hose->global_number); in pnv_pci_init_ioda_msis()
2343 phb->msi_setup = pnv_pci_ioda_msi_setup; in pnv_pci_init_ioda_msis()
2344 phb->msi32_support = 1; in pnv_pci_init_ioda_msis()
2346 count, phb->msi_base); in pnv_pci_init_ioda_msis()
2349 static void pnv_pci_init_ioda_msis(struct pnv_phb *phb) { } in pnv_pci_init_ioda_msis() argument
2356 struct pnv_phb *phb; in pnv_pci_ioda_fixup_iov_resources() local
2367 phb = hose->private_data; in pnv_pci_ioda_fixup_iov_resources()
2374 mul = phb->ioda.total_pe; in pnv_pci_ioda_fixup_iov_resources()
2427 struct pnv_phb *phb = hose->private_data; in pnv_ioda_setup_pe_seg() local
2446 region.start = res->start - phb->ioda.io_pci_base; in pnv_ioda_setup_pe_seg()
2447 region.end = res->end - phb->ioda.io_pci_base; in pnv_ioda_setup_pe_seg()
2448 index = region.start / phb->ioda.io_segsize; in pnv_ioda_setup_pe_seg()
2450 while (index < phb->ioda.total_pe && in pnv_ioda_setup_pe_seg()
2452 phb->ioda.io_segmap[index] = pe->pe_number; in pnv_ioda_setup_pe_seg()
2453 rc = opal_pci_map_pe_mmio_window(phb->opal_id, in pnv_ioda_setup_pe_seg()
2462 region.start += phb->ioda.io_segsize; in pnv_ioda_setup_pe_seg()
2469 phb->ioda.m32_pci_base; in pnv_ioda_setup_pe_seg()
2472 phb->ioda.m32_pci_base; in pnv_ioda_setup_pe_seg()
2473 index = region.start / phb->ioda.m32_segsize; in pnv_ioda_setup_pe_seg()
2475 while (index < phb->ioda.total_pe && in pnv_ioda_setup_pe_seg()
2477 phb->ioda.m32_segmap[index] = pe->pe_number; in pnv_ioda_setup_pe_seg()
2478 rc = opal_pci_map_pe_mmio_window(phb->opal_id, in pnv_ioda_setup_pe_seg()
2487 region.start += phb->ioda.m32_segsize; in pnv_ioda_setup_pe_seg()
2497 struct pnv_phb *phb; in pnv_pci_ioda_setup_seg() local
2501 phb = hose->private_data; in pnv_pci_ioda_setup_seg()
2502 list_for_each_entry(pe, &phb->ioda.pe_list, list) { in pnv_pci_ioda_setup_seg()
2511 struct pnv_phb *phb; in pnv_pci_ioda_setup_DMA() local
2517 phb = hose->private_data; in pnv_pci_ioda_setup_DMA()
2518 phb->initialized = 1; in pnv_pci_ioda_setup_DMA()
2526 struct pnv_phb *phb; in pnv_pci_ioda_create_dbgfs() local
2530 phb = hose->private_data; in pnv_pci_ioda_create_dbgfs()
2533 phb->dbgfs = debugfs_create_dir(name, powerpc_debugfs_root); in pnv_pci_ioda_create_dbgfs()
2534 if (!phb->dbgfs) in pnv_pci_ioda_create_dbgfs()
2572 struct pnv_phb *phb = hose->private_data; in pnv_pci_window_alignment() local
2587 if (phb->ioda.m64_segsize && in pnv_pci_window_alignment()
2589 return phb->ioda.m64_segsize; in pnv_pci_window_alignment()
2591 return phb->ioda.m32_segsize; in pnv_pci_window_alignment()
2593 return phb->ioda.io_segsize; in pnv_pci_window_alignment()
2621 struct pnv_phb *phb = hose->private_data; in pnv_pci_enable_device_hook() local
2629 if (!phb->initialized) in pnv_pci_enable_device_hook()
2639 static u32 pnv_ioda_bdfn_to_pe(struct pnv_phb *phb, struct pci_bus *bus, in pnv_ioda_bdfn_to_pe() argument
2642 return phb->ioda.pe_rmap[(bus->number << 8) | devfn]; in pnv_ioda_bdfn_to_pe()
2645 static void pnv_pci_ioda_shutdown(struct pnv_phb *phb) in pnv_pci_ioda_shutdown() argument
2647 opal_pci_reset(phb->opal_id, OPAL_RESET_PCI_IODA_TABLE, in pnv_pci_ioda_shutdown()
2655 struct pnv_phb *phb; in pnv_pci_init_ioda_phb() local
2674 phb = memblock_virt_alloc(sizeof(struct pnv_phb), 0); in pnv_pci_init_ioda_phb()
2677 phb->hose = hose = pcibios_alloc_controller(np); in pnv_pci_init_ioda_phb()
2678 if (!phb->hose) { in pnv_pci_init_ioda_phb()
2681 memblock_free(__pa(phb), sizeof(struct pnv_phb)); in pnv_pci_init_ioda_phb()
2685 spin_lock_init(&phb->lock); in pnv_pci_init_ioda_phb()
2695 hose->private_data = phb; in pnv_pci_init_ioda_phb()
2696 phb->hub_id = hub_id; in pnv_pci_init_ioda_phb()
2697 phb->opal_id = phb_id; in pnv_pci_init_ioda_phb()
2698 phb->type = ioda_type; in pnv_pci_init_ioda_phb()
2699 mutex_init(&phb->ioda.pe_alloc_mutex); in pnv_pci_init_ioda_phb()
2703 phb->model = PNV_PHB_MODEL_P7IOC; in pnv_pci_init_ioda_phb()
2705 phb->model = PNV_PHB_MODEL_PHB3; in pnv_pci_init_ioda_phb()
2707 phb->model = PNV_PHB_MODEL_UNKNOWN; in pnv_pci_init_ioda_phb()
2713 phb->regs = of_iomap(np, 0); in pnv_pci_init_ioda_phb()
2714 if (phb->regs == NULL) in pnv_pci_init_ioda_phb()
2718 phb->ioda.total_pe = 1; in pnv_pci_init_ioda_phb()
2721 phb->ioda.total_pe = be32_to_cpup(prop32); in pnv_pci_init_ioda_phb()
2724 phb->ioda.reserved_pe = be32_to_cpup(prop32); in pnv_pci_init_ioda_phb()
2727 pnv_ioda_parse_m64_window(phb); in pnv_pci_init_ioda_phb()
2729 phb->ioda.m32_size = resource_size(&hose->mem_resources[0]); in pnv_pci_init_ioda_phb()
2731 phb->ioda.m32_size += 0x10000; in pnv_pci_init_ioda_phb()
2733 phb->ioda.m32_segsize = phb->ioda.m32_size / phb->ioda.total_pe; in pnv_pci_init_ioda_phb()
2734 phb->ioda.m32_pci_base = hose->mem_resources[0].start - hose->mem_offset[0]; in pnv_pci_init_ioda_phb()
2735 phb->ioda.io_size = hose->pci_io_size; in pnv_pci_init_ioda_phb()
2736 phb->ioda.io_segsize = phb->ioda.io_size / phb->ioda.total_pe; in pnv_pci_init_ioda_phb()
2737 phb->ioda.io_pci_base = 0; /* XXX calculate this ? */ in pnv_pci_init_ioda_phb()
2740 size = _ALIGN_UP(phb->ioda.total_pe / 8, sizeof(unsigned long)); in pnv_pci_init_ioda_phb()
2742 size += phb->ioda.total_pe * sizeof(phb->ioda.m32_segmap[0]); in pnv_pci_init_ioda_phb()
2743 if (phb->type == PNV_PHB_IODA1) { in pnv_pci_init_ioda_phb()
2745 size += phb->ioda.total_pe * sizeof(phb->ioda.io_segmap[0]); in pnv_pci_init_ioda_phb()
2748 size += phb->ioda.total_pe * sizeof(struct pnv_ioda_pe); in pnv_pci_init_ioda_phb()
2750 phb->ioda.pe_alloc = aux; in pnv_pci_init_ioda_phb()
2751 phb->ioda.m32_segmap = aux + m32map_off; in pnv_pci_init_ioda_phb()
2752 if (phb->type == PNV_PHB_IODA1) in pnv_pci_init_ioda_phb()
2753 phb->ioda.io_segmap = aux + iomap_off; in pnv_pci_init_ioda_phb()
2754 phb->ioda.pe_array = aux + pemap_off; in pnv_pci_init_ioda_phb()
2755 set_bit(phb->ioda.reserved_pe, phb->ioda.pe_alloc); in pnv_pci_init_ioda_phb()
2757 INIT_LIST_HEAD(&phb->ioda.pe_dma_list); in pnv_pci_init_ioda_phb()
2758 INIT_LIST_HEAD(&phb->ioda.pe_list); in pnv_pci_init_ioda_phb()
2759 mutex_init(&phb->ioda.pe_list_mutex); in pnv_pci_init_ioda_phb()
2762 phb->ioda.tce32_count = phb->ioda.m32_pci_base >> 28; in pnv_pci_init_ioda_phb()
2774 phb->ioda.total_pe, phb->ioda.reserved_pe, in pnv_pci_init_ioda_phb()
2775 phb->ioda.m32_size, phb->ioda.m32_segsize); in pnv_pci_init_ioda_phb()
2776 if (phb->ioda.m64_size) in pnv_pci_init_ioda_phb()
2778 phb->ioda.m64_size, phb->ioda.m64_segsize); in pnv_pci_init_ioda_phb()
2779 if (phb->ioda.io_size) in pnv_pci_init_ioda_phb()
2781 phb->ioda.io_size, phb->ioda.io_segsize); in pnv_pci_init_ioda_phb()
2784 phb->hose->ops = &pnv_pci_ops; in pnv_pci_init_ioda_phb()
2785 phb->get_pe_state = pnv_ioda_get_pe_state; in pnv_pci_init_ioda_phb()
2786 phb->freeze_pe = pnv_ioda_freeze_pe; in pnv_pci_init_ioda_phb()
2787 phb->unfreeze_pe = pnv_ioda_unfreeze_pe; in pnv_pci_init_ioda_phb()
2790 phb->bdfn_to_pe = pnv_ioda_bdfn_to_pe; in pnv_pci_init_ioda_phb()
2793 phb->dma_dev_setup = pnv_pci_ioda_dma_dev_setup; in pnv_pci_init_ioda_phb()
2794 phb->dma_set_mask = pnv_pci_ioda_dma_set_mask; in pnv_pci_init_ioda_phb()
2795 phb->dma_get_required_mask = pnv_pci_ioda_dma_get_required_mask; in pnv_pci_init_ioda_phb()
2798 phb->shutdown = pnv_pci_ioda_shutdown; in pnv_pci_init_ioda_phb()
2801 pnv_pci_init_ioda_msis(phb); in pnv_pci_init_ioda_phb()
2840 if (!phb->init_m64 || phb->init_m64(phb)) in pnv_pci_init_ioda_phb()