Lines Matching refs:ioc

204 sba_dump_pdir_entry(struct ioc *ioc, char *msg, uint pide)  in sba_dump_pdir_entry()  argument
207 u64 *ptr = &(ioc->pdir_base[pide & (~0U * BITS_PER_LONG)]); in sba_dump_pdir_entry()
208 unsigned long *rptr = (unsigned long *) &(ioc->res_map[(pide >>3) & ~(sizeof(unsigned long) - 1)]); in sba_dump_pdir_entry()
236 sba_check_pdir(struct ioc *ioc, char *msg) in sba_check_pdir() argument
238 u32 *rptr_end = (u32 *) &(ioc->res_map[ioc->res_size]); in sba_check_pdir()
239 u32 *rptr = (u32 *) ioc->res_map; /* resource map ptr */ in sba_check_pdir()
240 u64 *pptr = ioc->pdir_base; /* pdir ptr */ in sba_check_pdir()
256 sba_dump_pdir_entry(ioc, msg, pide); in sba_check_pdir()
280 sba_dump_sg( struct ioc *ioc, struct scatterlist *startsg, int nents) in sba_dump_sg() argument
312 #define SBA_IOVA(ioc,iovp,offset,hint_reg) ((ioc->ibase) | (iovp) | (offset)) argument
313 #define SBA_IOVP(ioc,iova) ((iova) & (ioc)->iovp_mask) argument
316 #define SBA_IOVA(ioc,iovp,offset,hint_reg) ((iovp) | (offset)) argument
317 #define SBA_IOVP(ioc,iova) (iova) argument
325 static unsigned long ptr_to_pide(struct ioc *ioc, unsigned long *res_ptr, in ptr_to_pide() argument
328 return (((unsigned long)res_ptr - (unsigned long)ioc->res_map) << 3) in ptr_to_pide()
342 sba_search_bitmap(struct ioc *ioc, struct device *dev, in sba_search_bitmap() argument
345 unsigned long *res_ptr = ioc->res_hint; in sba_search_bitmap()
346 unsigned long *res_end = (unsigned long *) &(ioc->res_map[ioc->res_size]); in sba_search_bitmap()
355 BUG_ON(ioc->ibase & ~IOVP_MASK); in sba_search_bitmap()
356 shift = ioc->ibase >> IOVP_SHIFT; in sba_search_bitmap()
364 tpide = ptr_to_pide(ioc, res_ptr, 0); in sba_search_bitmap()
376 ioc->res_bitshift = 0; in sba_search_bitmap()
385 uint bitshiftcnt = ALIGN(ioc->res_bitshift, o); in sba_search_bitmap()
399 tpide = ptr_to_pide(ioc, res_ptr, bitshiftcnt); in sba_search_bitmap()
417 ioc->res_bitshift = bitshiftcnt + bits_wanted; in sba_search_bitmap()
422 ioc->res_hint = (unsigned long *) ioc->res_map; in sba_search_bitmap()
423 ioc->res_bitshift = 0; in sba_search_bitmap()
425 ioc->res_hint = res_ptr; in sba_search_bitmap()
440 sba_alloc_range(struct ioc *ioc, struct device *dev, size_t size) in sba_alloc_range() argument
448 pide = sba_search_bitmap(ioc, dev, pages_needed); in sba_alloc_range()
449 if (pide >= (ioc->res_size << 3)) { in sba_alloc_range()
450 pide = sba_search_bitmap(ioc, dev, pages_needed); in sba_alloc_range()
451 if (pide >= (ioc->res_size << 3)) in sba_alloc_range()
453 __FILE__, ioc->ioc_hpa); in sba_alloc_range()
458 if(0x00 != ((u8 *) ioc->pdir_base)[pide*sizeof(u64) + 7]) { in sba_alloc_range()
459 sba_dump_pdir_entry(ioc, "sba_search_bitmap() botched it?", pide); in sba_alloc_range()
465 (uint) ((unsigned long) ioc->res_hint - (unsigned long) ioc->res_map), in sba_alloc_range()
466 ioc->res_bitshift ); in sba_alloc_range()
475 ioc->avg_search[ioc->avg_idx++] = cr_start; in sba_alloc_range()
476 ioc->avg_idx &= SBA_SEARCH_SAMPLE - 1; in sba_alloc_range()
478 ioc->used_pages += pages_needed; in sba_alloc_range()
494 sba_free_range(struct ioc *ioc, dma_addr_t iova, size_t size) in sba_free_range() argument
496 unsigned long iovp = SBA_IOVP(ioc, iova); in sba_free_range()
499 unsigned long *res_ptr = (unsigned long *) &((ioc)->res_map[ridx & ~RESMAP_IDX_MASK]); in sba_free_range()
511 ioc->used_pages -= bits_not_wanted; in sba_free_range()
525 #define SBA_DMA_HINT(ioc, val) ((val) << (ioc)->hint_shift_pdir) argument
613 sba_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt) in sba_mark_invalid() argument
615 u32 iovp = (u32) SBA_IOVP(ioc,iova); in sba_mark_invalid()
616 u64 *pdir_ptr = &ioc->pdir_base[PDIR_INDEX(iovp)]; in sba_mark_invalid()
626 sba_dump_pdir_entry(ioc,"sba_mark_invalid()", PDIR_INDEX(iovp)); in sba_mark_invalid()
667 WRITE_REG( SBA_IOVA(ioc, iovp, 0, 0), ioc->ioc_hpa+IOC_PCOM); in sba_mark_invalid()
679 struct ioc *ioc; in sba_dma_supported() local
687 ioc = GET_IOC(dev); in sba_dma_supported()
688 if (!ioc) in sba_dma_supported()
695 return((int)(mask >= (ioc->ibase - 1 + in sba_dma_supported()
696 (ioc->pdir_size / sizeof(u64) * IOVP_SIZE) ))); in sba_dma_supported()
713 struct ioc *ioc; in sba_map_single() local
720 ioc = GET_IOC(dev); in sba_map_single()
721 if (!ioc) in sba_map_single()
730 spin_lock_irqsave(&ioc->res_lock, flags); in sba_map_single()
732 sba_check_pdir(ioc,"Check before sba_map_single()"); in sba_map_single()
736 ioc->msingle_calls++; in sba_map_single()
737 ioc->msingle_pages += size >> IOVP_SHIFT; in sba_map_single()
739 pide = sba_alloc_range(ioc, dev, size); in sba_map_single()
745 pdir_start = &(ioc->pdir_base[pide]); in sba_map_single()
771 sba_check_pdir(ioc,"Check after sba_map_single()"); in sba_map_single()
773 spin_unlock_irqrestore(&ioc->res_lock, flags); in sba_map_single()
776 return SBA_IOVA(ioc, iovp, offset, DEFAULT_DMA_HINT_REG); in sba_map_single()
803 struct ioc *ioc; in sba_unmap_page() local
812 ioc = GET_IOC(dev); in sba_unmap_page()
813 if (!ioc) { in sba_unmap_page()
814 WARN_ON(!ioc); in sba_unmap_page()
822 spin_lock_irqsave(&ioc->res_lock, flags); in sba_unmap_page()
825 ioc->usingle_calls++; in sba_unmap_page()
826 ioc->usingle_pages += size >> IOVP_SHIFT; in sba_unmap_page()
829 sba_mark_invalid(ioc, iova, size); in sba_unmap_page()
835 d = &(ioc->saved[ioc->saved_cnt]); in sba_unmap_page()
838 if (++(ioc->saved_cnt) >= DELAYED_RESOURCE_CNT) { in sba_unmap_page()
839 int cnt = ioc->saved_cnt; in sba_unmap_page()
841 sba_free_range(ioc, d->iova, d->size); in sba_unmap_page()
844 ioc->saved_cnt = 0; in sba_unmap_page()
846 READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */ in sba_unmap_page()
849 sba_free_range(ioc, iova, size); in sba_unmap_page()
854 READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */ in sba_unmap_page()
857 spin_unlock_irqrestore(&ioc->res_lock, flags); in sba_unmap_page()
948 struct ioc *ioc; in sba_map_sg() local
954 ioc = GET_IOC(dev); in sba_map_sg()
955 if (!ioc) in sba_map_sg()
966 spin_lock_irqsave(&ioc->res_lock, flags); in sba_map_sg()
969 if (sba_check_pdir(ioc,"Check before sba_map_sg()")) in sba_map_sg()
971 sba_dump_sg(ioc, sglist, nents); in sba_map_sg()
977 ioc->msg_calls++; in sba_map_sg()
988 coalesced = iommu_coalesce_chunks(ioc, dev, sglist, nents, sba_alloc_range); in sba_map_sg()
998 filled = iommu_fill_pdir(ioc, sglist, nents, 0, sba_io_pdir_entry); in sba_map_sg()
1004 if (sba_check_pdir(ioc,"Check after sba_map_sg()")) in sba_map_sg()
1006 sba_dump_sg(ioc, sglist, nents); in sba_map_sg()
1011 spin_unlock_irqrestore(&ioc->res_lock, flags); in sba_map_sg()
1032 struct ioc *ioc; in sba_unmap_sg() local
1040 ioc = GET_IOC(dev); in sba_unmap_sg()
1041 if (!ioc) { in sba_unmap_sg()
1042 WARN_ON(!ioc); in sba_unmap_sg()
1047 ioc->usg_calls++; in sba_unmap_sg()
1051 spin_lock_irqsave(&ioc->res_lock, flags); in sba_unmap_sg()
1052 sba_check_pdir(ioc,"Check before sba_unmap_sg()"); in sba_unmap_sg()
1053 spin_unlock_irqrestore(&ioc->res_lock, flags); in sba_unmap_sg()
1061ioc->usg_pages += ((sg_dma_address(sglist) & ~IOVP_MASK) + sg_dma_len(sglist) + IOVP_SIZE - 1) >> … in sba_unmap_sg()
1062 ioc->usingle_calls--; /* kluge since call is unmap_sg() */ in sba_unmap_sg()
1071 spin_lock_irqsave(&ioc->res_lock, flags); in sba_unmap_sg()
1072 sba_check_pdir(ioc,"Check after sba_unmap_sg()"); in sba_unmap_sg()
1073 spin_unlock_irqrestore(&ioc->res_lock, flags); in sba_unmap_sg()
1115 PAT_MOD(mod)->mod_info.ioc = PAT_GET_IOC(temp); in sba_get_pat_resources()
1226 struct ioc *ioc; member
1238 lba_set_iregs(lba, ibd->ioc->ibase, ibd->ioc->imask); in setup_ibase_imask_callback()
1244 setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num) in setup_ibase_imask() argument
1247 .ioc = ioc, in setup_ibase_imask()
1269 sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num) in sba_ioc_init_pluto() argument
1282 ioc->ibase = READ_REG(ioc->ioc_hpa + IOC_IBASE) & ~0x1fffffULL; in sba_ioc_init_pluto()
1283 iova_space_size = ~(READ_REG(ioc->ioc_hpa + IOC_IMASK) & 0xFFFFFFFFUL) + 1; in sba_ioc_init_pluto()
1285 if ((ioc->ibase < 0xfed00000UL) && ((ioc->ibase + iova_space_size) > 0xfee00000UL)) { in sba_ioc_init_pluto()
1295 ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64); in sba_ioc_init_pluto()
1298 __func__, ioc->ioc_hpa, iova_space_size >> 20, in sba_ioc_init_pluto()
1301 ioc->pdir_base = (void *) __get_free_pages(GFP_KERNEL, in sba_ioc_init_pluto()
1302 get_order(ioc->pdir_size)); in sba_ioc_init_pluto()
1303 if (!ioc->pdir_base) in sba_ioc_init_pluto()
1306 memset(ioc->pdir_base, 0, ioc->pdir_size); in sba_ioc_init_pluto()
1309 __func__, ioc->pdir_base, ioc->pdir_size); in sba_ioc_init_pluto()
1312 ioc->hint_shift_pdir = iov_order + PAGE_SHIFT; in sba_ioc_init_pluto()
1313 ioc->hint_mask_pdir = ~(0x3 << (iov_order + PAGE_SHIFT)); in sba_ioc_init_pluto()
1316 ioc->hint_shift_pdir, ioc->hint_mask_pdir); in sba_ioc_init_pluto()
1319 WARN_ON((((unsigned long) ioc->pdir_base) & PAGE_MASK) != (unsigned long) ioc->pdir_base); in sba_ioc_init_pluto()
1320 WRITE_REG(virt_to_phys(ioc->pdir_base), ioc->ioc_hpa + IOC_PDIR_BASE); in sba_ioc_init_pluto()
1325 ioc->imask = iova_space_mask; in sba_ioc_init_pluto()
1327 ioc->iovp_mask = ~(iova_space_mask + PAGE_SIZE - 1); in sba_ioc_init_pluto()
1329 sba_dump_tlb(ioc->ioc_hpa); in sba_ioc_init_pluto()
1331 setup_ibase_imask(sba, ioc, ioc_num); in sba_ioc_init_pluto()
1333 WRITE_REG(ioc->imask, ioc->ioc_hpa + IOC_IMASK); in sba_ioc_init_pluto()
1340 ioc->imask |= 0xFFFFFFFF00000000UL; in sba_ioc_init_pluto()
1354 WRITE_REG(tcnfg, ioc->ioc_hpa + IOC_TCNFG); in sba_ioc_init_pluto()
1360 WRITE_REG(ioc->ibase | 1, ioc->ioc_hpa + IOC_IBASE); in sba_ioc_init_pluto()
1366 WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM); in sba_ioc_init_pluto()
1383 ioc->pdir_size /= 2; in sba_ioc_init_pluto()
1384 ioc->pdir_base[PDIR_INDEX(iova_space_size/2)] = SBA_AGPGART_COOKIE; in sba_ioc_init_pluto()
1390 sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num) in sba_ioc_init() argument
1429 ioc->pdir_size = pdir_size = (iova_space_size/IOVP_SIZE) * sizeof(u64); in sba_ioc_init()
1433 ioc->ioc_hpa, in sba_ioc_init()
1438 ioc->pdir_base = sba_alloc_pdir(pdir_size); in sba_ioc_init()
1441 __func__, ioc->pdir_base, pdir_size); in sba_ioc_init()
1445 ioc->hint_shift_pdir = iov_order + PAGE_SHIFT; in sba_ioc_init()
1446 ioc->hint_mask_pdir = ~(0x3 << (iov_order + PAGE_SHIFT)); in sba_ioc_init()
1449 ioc->hint_shift_pdir, ioc->hint_mask_pdir); in sba_ioc_init()
1452 WRITE_REG64(virt_to_phys(ioc->pdir_base), ioc->ioc_hpa + IOC_PDIR_BASE); in sba_ioc_init()
1462 ioc->ibase = 0; in sba_ioc_init()
1463 ioc->imask = iova_space_mask; /* save it */ in sba_ioc_init()
1465 ioc->iovp_mask = ~(iova_space_mask + PAGE_SIZE - 1); in sba_ioc_init()
1469 __func__, ioc->ibase, ioc->imask); in sba_ioc_init()
1477 setup_ibase_imask(sba, ioc, ioc_num); in sba_ioc_init()
1482 WRITE_REG(ioc->ibase | 1, ioc->ioc_hpa+IOC_IBASE); in sba_ioc_init()
1483 WRITE_REG(ioc->imask, ioc->ioc_hpa+IOC_IMASK); in sba_ioc_init()
1497 WRITE_REG(tcnfg, ioc->ioc_hpa+IOC_TCNFG); in sba_ioc_init()
1503 WRITE_REG(0 | 31, ioc->ioc_hpa+IOC_PCOM); in sba_ioc_init()
1505 ioc->ibase = 0; /* used by SBA_IOVA and related macros */ in sba_ioc_init()
1597 sba_dev->ioc[0].ioc_hpa = ioc_remap(sba_dev, ASTRO_IOC_OFFSET); in sba_hw_init()
1609 sba_dev->ioc[0].ioc_hpa = ioc_remap(sba_dev, PLUTO_IOC_OFFSET); in sba_hw_init()
1625 sba_dev->ioc[0].ioc_hpa = ioc_remap(sba_dev, IKE_IOC_OFFSET(0)); in sba_hw_init()
1626 sba_dev->ioc[1].ioc_hpa = ioc_remap(sba_dev, IKE_IOC_OFFSET(1)); in sba_hw_init()
1635 void __iomem *ioc_hpa = sba_dev->ioc[i].ioc_hpa; in sba_hw_init()
1663 READ_REG(sba_dev->ioc[i].ioc_hpa + ROPE7_CTL); in sba_hw_init()
1667 READ_REG(sba_dev->ioc[i].ioc_hpa + 0x40), in sba_hw_init()
1668 READ_REG(sba_dev->ioc[i].ioc_hpa + 0x50) in sba_hw_init()
1671 READ_REG(sba_dev->ioc[i].ioc_hpa + 0x108), in sba_hw_init()
1672 READ_REG(sba_dev->ioc[i].ioc_hpa + 0x400) in sba_hw_init()
1676 sba_ioc_init_pluto(sba_dev->dev, &(sba_dev->ioc[i]), i); in sba_hw_init()
1678 sba_ioc_init(sba_dev->dev, &(sba_dev->ioc[i]), i); in sba_hw_init()
1703 res_size = sba_dev->ioc[i].pdir_size/sizeof(u64); /* entries */ in sba_common_init()
1714 sba_dev->ioc[i].res_size = res_size; in sba_common_init()
1715 sba_dev->ioc[i].res_map = (char *) __get_free_pages(GFP_KERNEL, get_order(res_size)); in sba_common_init()
1718 iterate_pages( sba_dev->ioc[i].res_map, res_size, in sba_common_init()
1722 if (NULL == sba_dev->ioc[i].res_map) in sba_common_init()
1728 memset(sba_dev->ioc[i].res_map, 0, res_size); in sba_common_init()
1730 sba_dev->ioc[i].res_hint = (unsigned long *) in sba_common_init()
1731 &(sba_dev->ioc[i].res_map[L1_CACHE_BYTES]); in sba_common_init()
1735 sba_dev->ioc[i].res_map[0] = 0x80; in sba_common_init()
1736 sba_dev->ioc[i].pdir_base[0] = 0xeeffc0addbba0080ULL; in sba_common_init()
1745 long *p_start = (long *) &(sba_dev->ioc[i].res_map[idx_start]); in sba_common_init()
1746 long *p_end = (long *) &(sba_dev->ioc[i].res_map[idx_end]); in sba_common_init()
1755 iterate_pages( sba_dev->ioc[i].res_map, res_size, in sba_common_init()
1757 iterate_pages( sba_dev->ioc[i].pdir_base, sba_dev->ioc[i].pdir_size, in sba_common_init()
1762 __func__, i, res_size, sba_dev->ioc[i].res_map); in sba_common_init()
1786 struct ioc *ioc = &sba_dev->ioc[0]; /* FIXME: Multi-IOC support! */ in sba_proc_info() local
1787 int total_pages = (int) (ioc->res_size << 3); /* 8 bits per byte */ in sba_proc_info()
1798 (int)((ioc->res_size << 3) * sizeof(u64)), /* 8 bits/byte */ in sba_proc_info()
1802 ioc->res_size, ioc->res_size << 3); /* 8 bits per byte */ in sba_proc_info()
1818 total_pages - ioc->used_pages, ioc->used_pages, in sba_proc_info()
1819 (int)(ioc->used_pages * 100 / total_pages)); in sba_proc_info()
1821 min = max = ioc->avg_search[0]; in sba_proc_info()
1823 avg += ioc->avg_search[i]; in sba_proc_info()
1824 if (ioc->avg_search[i] > max) max = ioc->avg_search[i]; in sba_proc_info()
1825 if (ioc->avg_search[i] < min) min = ioc->avg_search[i]; in sba_proc_info()
1832 ioc->msingle_calls, ioc->msingle_pages, in sba_proc_info()
1833 (int)((ioc->msingle_pages * 1000)/ioc->msingle_calls)); in sba_proc_info()
1836 min = ioc->usingle_calls; in sba_proc_info()
1837 max = ioc->usingle_pages - ioc->usg_pages; in sba_proc_info()
1842 ioc->msg_calls, ioc->msg_pages, in sba_proc_info()
1843 (int)((ioc->msg_pages * 1000)/ioc->msg_calls)); in sba_proc_info()
1846 ioc->usg_calls, ioc->usg_pages, in sba_proc_info()
1847 (int)((ioc->usg_pages * 1000)/ioc->usg_calls)); in sba_proc_info()
1857 struct ioc *ioc = &sba_dev->ioc[0]; /* FIXME: Multi-IOC support! */ in sba_proc_bitmap_info() local
1859 seq_hex_dump(m, " ", DUMP_PREFIX_NONE, 32, 4, ioc->res_map, in sba_proc_bitmap_info()
1860 ioc->res_size, false); in sba_proc_bitmap_info()
1951 spin_lock_init(&(sba_dev->ioc[i].res_lock)); in sba_driver_callback()
2009 return &(sba->ioc[iocnum]); in sba_get_iommu()