diff options
Diffstat (limited to 'arch/sparc64/kernel/pci_schizo.c')
-rw-r--r-- | arch/sparc64/kernel/pci_schizo.c | 57 |
1 files changed, 3 insertions, 54 deletions
diff --git a/arch/sparc64/kernel/pci_schizo.c b/arch/sparc64/kernel/pci_schizo.c index cae5b61fe2f0..d8c4e0919b4e 100644 --- a/arch/sparc64/kernel/pci_schizo.c +++ b/arch/sparc64/kernel/pci_schizo.c | |||
@@ -1765,7 +1765,7 @@ static void schizo_pbm_strbuf_init(struct pci_pbm_info *pbm) | |||
1765 | static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm) | 1765 | static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm) |
1766 | { | 1766 | { |
1767 | struct pci_iommu *iommu = pbm->iommu; | 1767 | struct pci_iommu *iommu = pbm->iommu; |
1768 | unsigned long tsbbase, i, tagbase, database, order; | 1768 | unsigned long i, tagbase, database; |
1769 | u32 vdma[2], dma_mask; | 1769 | u32 vdma[2], dma_mask; |
1770 | u64 control; | 1770 | u64 control; |
1771 | int err, tsbsize; | 1771 | int err, tsbsize; |
@@ -1800,10 +1800,6 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm) | |||
1800 | prom_halt(); | 1800 | prom_halt(); |
1801 | }; | 1801 | }; |
1802 | 1802 | ||
1803 | /* Setup initial software IOMMU state. */ | ||
1804 | spin_lock_init(&iommu->lock); | ||
1805 | iommu->ctx_lowest_free = 1; | ||
1806 | |||
1807 | /* Register addresses, SCHIZO has iommu ctx flushing. */ | 1803 | /* Register addresses, SCHIZO has iommu ctx flushing. */ |
1808 | iommu->iommu_control = pbm->pbm_regs + SCHIZO_IOMMU_CONTROL; | 1804 | iommu->iommu_control = pbm->pbm_regs + SCHIZO_IOMMU_CONTROL; |
1809 | iommu->iommu_tsbbase = pbm->pbm_regs + SCHIZO_IOMMU_TSBBASE; | 1805 | iommu->iommu_tsbbase = pbm->pbm_regs + SCHIZO_IOMMU_TSBBASE; |
@@ -1832,56 +1828,9 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm) | |||
1832 | /* Leave diag mode enabled for full-flushing done | 1828 | /* Leave diag mode enabled for full-flushing done |
1833 | * in pci_iommu.c | 1829 | * in pci_iommu.c |
1834 | */ | 1830 | */ |
1831 | pci_iommu_table_init(iommu, tsbsize * 8 * 1024, vdma[0], dma_mask); | ||
1835 | 1832 | ||
1836 | iommu->dummy_page = __get_free_pages(GFP_KERNEL, 0); | 1833 | schizo_write(iommu->iommu_tsbbase, __pa(iommu->page_table)); |
1837 | if (!iommu->dummy_page) { | ||
1838 | prom_printf("PSYCHO_IOMMU: Error, gfp(dummy_page) failed.\n"); | ||
1839 | prom_halt(); | ||
1840 | } | ||
1841 | memset((void *)iommu->dummy_page, 0, PAGE_SIZE); | ||
1842 | iommu->dummy_page_pa = (unsigned long) __pa(iommu->dummy_page); | ||
1843 | |||
1844 | /* Using assumed page size 8K with 128K entries we need 1MB iommu page | ||
1845 | * table (128K ioptes * 8 bytes per iopte). This is | ||
1846 | * page order 7 on UltraSparc. | ||
1847 | */ | ||
1848 | order = get_order(tsbsize * 8 * 1024); | ||
1849 | tsbbase = __get_free_pages(GFP_KERNEL, order); | ||
1850 | if (!tsbbase) { | ||
1851 | prom_printf("%s: Error, gfp(tsb) failed.\n", pbm->name); | ||
1852 | prom_halt(); | ||
1853 | } | ||
1854 | |||
1855 | iommu->page_table = (iopte_t *)tsbbase; | ||
1856 | iommu->page_table_map_base = vdma[0]; | ||
1857 | iommu->dma_addr_mask = dma_mask; | ||
1858 | pci_iommu_table_init(iommu, PAGE_SIZE << order); | ||
1859 | |||
1860 | switch (tsbsize) { | ||
1861 | case 64: | ||
1862 | iommu->page_table_sz_bits = 16; | ||
1863 | break; | ||
1864 | |||
1865 | case 128: | ||
1866 | iommu->page_table_sz_bits = 17; | ||
1867 | break; | ||
1868 | |||
1869 | default: | ||
1870 | prom_printf("iommu_init: Illegal TSB size %d\n", tsbsize); | ||
1871 | prom_halt(); | ||
1872 | break; | ||
1873 | }; | ||
1874 | |||
1875 | /* We start with no consistent mappings. */ | ||
1876 | iommu->lowest_consistent_map = | ||
1877 | 1 << (iommu->page_table_sz_bits - PBM_LOGCLUSTERS); | ||
1878 | |||
1879 | for (i = 0; i < PBM_NCLUSTERS; i++) { | ||
1880 | iommu->alloc_info[i].flush = 0; | ||
1881 | iommu->alloc_info[i].next = 0; | ||
1882 | } | ||
1883 | |||
1884 | schizo_write(iommu->iommu_tsbbase, __pa(tsbbase)); | ||
1885 | 1834 | ||
1886 | control = schizo_read(iommu->iommu_control); | 1835 | control = schizo_read(iommu->iommu_control); |
1887 | control &= ~(SCHIZO_IOMMU_CTRL_TSBSZ | SCHIZO_IOMMU_CTRL_TBWSZ); | 1836 | control &= ~(SCHIZO_IOMMU_CTRL_TSBSZ | SCHIZO_IOMMU_CTRL_TBWSZ); |