diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2007-04-27 00:08:21 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-04-27 00:08:21 -0400 |
commit | 16ce82d846f2e6b652a064f91c5019cfe8682be4 (patch) | |
tree | 9100d2baface8ec8d5b7911e00e093fd177cb9e4 /arch/sparc64/kernel/pci_iommu.c | |
parent | ee5ac9ddf2ea13be2418ac7d0ce5a930e78af013 (diff) |
[SPARC64]: Convert PCI over to generic struct iommu/strbuf.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/pci_iommu.c')
-rw-r--r-- | arch/sparc64/kernel/pci_iommu.c | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/arch/sparc64/kernel/pci_iommu.c b/arch/sparc64/kernel/pci_iommu.c index 355ed0ba937a..66712772f494 100644 --- a/arch/sparc64/kernel/pci_iommu.c +++ b/arch/sparc64/kernel/pci_iommu.c | |||
@@ -1,7 +1,6 @@ | |||
1 | /* $Id: pci_iommu.c,v 1.17 2001/12/17 07:05:09 davem Exp $ | 1 | /* pci_iommu.c: UltraSparc PCI controller IOM/STC support. |
2 | * pci_iommu.c: UltraSparc PCI controller IOM/STC support. | ||
3 | * | 2 | * |
4 | * Copyright (C) 1999 David S. Miller (davem@redhat.com) | 3 | * Copyright (C) 1999, 2007 David S. Miller (davem@davemloft.net) |
5 | * Copyright (C) 1999, 2000 Jakub Jelinek (jakub@redhat.com) | 4 | * Copyright (C) 1999, 2000 Jakub Jelinek (jakub@redhat.com) |
6 | */ | 5 | */ |
7 | 6 | ||
@@ -36,7 +35,7 @@ | |||
36 | "i" (ASI_PHYS_BYPASS_EC_E)) | 35 | "i" (ASI_PHYS_BYPASS_EC_E)) |
37 | 36 | ||
38 | /* Must be invoked under the IOMMU lock. */ | 37 | /* Must be invoked under the IOMMU lock. */ |
39 | static void __iommu_flushall(struct pci_iommu *iommu) | 38 | static void __iommu_flushall(struct iommu *iommu) |
40 | { | 39 | { |
41 | unsigned long tag; | 40 | unsigned long tag; |
42 | int entry; | 41 | int entry; |
@@ -64,7 +63,7 @@ static void __iommu_flushall(struct pci_iommu *iommu) | |||
64 | #define IOPTE_IS_DUMMY(iommu, iopte) \ | 63 | #define IOPTE_IS_DUMMY(iommu, iopte) \ |
65 | ((iopte_val(*iopte) & IOPTE_PAGE) == (iommu)->dummy_page_pa) | 64 | ((iopte_val(*iopte) & IOPTE_PAGE) == (iommu)->dummy_page_pa) |
66 | 65 | ||
67 | static inline void iopte_make_dummy(struct pci_iommu *iommu, iopte_t *iopte) | 66 | static inline void iopte_make_dummy(struct iommu *iommu, iopte_t *iopte) |
68 | { | 67 | { |
69 | unsigned long val = iopte_val(*iopte); | 68 | unsigned long val = iopte_val(*iopte); |
70 | 69 | ||
@@ -75,7 +74,7 @@ static inline void iopte_make_dummy(struct pci_iommu *iommu, iopte_t *iopte) | |||
75 | } | 74 | } |
76 | 75 | ||
77 | /* Based largely upon the ppc64 iommu allocator. */ | 76 | /* Based largely upon the ppc64 iommu allocator. */ |
78 | static long pci_arena_alloc(struct pci_iommu *iommu, unsigned long npages) | 77 | static long pci_arena_alloc(struct iommu *iommu, unsigned long npages) |
79 | { | 78 | { |
80 | struct iommu_arena *arena = &iommu->arena; | 79 | struct iommu_arena *arena = &iommu->arena; |
81 | unsigned long n, i, start, end, limit; | 80 | unsigned long n, i, start, end, limit; |
@@ -124,7 +123,7 @@ static void pci_arena_free(struct iommu_arena *arena, unsigned long base, unsign | |||
124 | __clear_bit(i, arena->map); | 123 | __clear_bit(i, arena->map); |
125 | } | 124 | } |
126 | 125 | ||
127 | void pci_iommu_table_init(struct pci_iommu *iommu, int tsbsize, u32 dma_offset, u32 dma_addr_mask) | 126 | void pci_iommu_table_init(struct iommu *iommu, int tsbsize, u32 dma_offset, u32 dma_addr_mask) |
128 | { | 127 | { |
129 | unsigned long i, tsbbase, order, sz, num_tsb_entries; | 128 | unsigned long i, tsbbase, order, sz, num_tsb_entries; |
130 | 129 | ||
@@ -170,7 +169,7 @@ void pci_iommu_table_init(struct pci_iommu *iommu, int tsbsize, u32 dma_offset, | |||
170 | iopte_make_dummy(iommu, &iommu->page_table[i]); | 169 | iopte_make_dummy(iommu, &iommu->page_table[i]); |
171 | } | 170 | } |
172 | 171 | ||
173 | static inline iopte_t *alloc_npages(struct pci_iommu *iommu, unsigned long npages) | 172 | static inline iopte_t *alloc_npages(struct iommu *iommu, unsigned long npages) |
174 | { | 173 | { |
175 | long entry; | 174 | long entry; |
176 | 175 | ||
@@ -181,12 +180,12 @@ static inline iopte_t *alloc_npages(struct pci_iommu *iommu, unsigned long npage | |||
181 | return iommu->page_table + entry; | 180 | return iommu->page_table + entry; |
182 | } | 181 | } |
183 | 182 | ||
184 | static inline void free_npages(struct pci_iommu *iommu, dma_addr_t base, unsigned long npages) | 183 | static inline void free_npages(struct iommu *iommu, dma_addr_t base, unsigned long npages) |
185 | { | 184 | { |
186 | pci_arena_free(&iommu->arena, base >> IO_PAGE_SHIFT, npages); | 185 | pci_arena_free(&iommu->arena, base >> IO_PAGE_SHIFT, npages); |
187 | } | 186 | } |
188 | 187 | ||
189 | static int iommu_alloc_ctx(struct pci_iommu *iommu) | 188 | static int iommu_alloc_ctx(struct iommu *iommu) |
190 | { | 189 | { |
191 | int lowest = iommu->ctx_lowest_free; | 190 | int lowest = iommu->ctx_lowest_free; |
192 | int sz = IOMMU_NUM_CTXS - lowest; | 191 | int sz = IOMMU_NUM_CTXS - lowest; |
@@ -205,7 +204,7 @@ static int iommu_alloc_ctx(struct pci_iommu *iommu) | |||
205 | return n; | 204 | return n; |
206 | } | 205 | } |
207 | 206 | ||
208 | static inline void iommu_free_ctx(struct pci_iommu *iommu, int ctx) | 207 | static inline void iommu_free_ctx(struct iommu *iommu, int ctx) |
209 | { | 208 | { |
210 | if (likely(ctx)) { | 209 | if (likely(ctx)) { |
211 | __clear_bit(ctx, iommu->ctx_bitmap); | 210 | __clear_bit(ctx, iommu->ctx_bitmap); |
@@ -220,7 +219,7 @@ static inline void iommu_free_ctx(struct pci_iommu *iommu, int ctx) | |||
220 | */ | 219 | */ |
221 | static void *pci_4u_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp, gfp_t gfp) | 220 | static void *pci_4u_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp, gfp_t gfp) |
222 | { | 221 | { |
223 | struct pci_iommu *iommu; | 222 | struct iommu *iommu; |
224 | iopte_t *iopte; | 223 | iopte_t *iopte; |
225 | unsigned long flags, order, first_page; | 224 | unsigned long flags, order, first_page; |
226 | void *ret; | 225 | void *ret; |
@@ -266,7 +265,7 @@ static void *pci_4u_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr | |||
266 | /* Free and unmap a consistent DMA translation. */ | 265 | /* Free and unmap a consistent DMA translation. */ |
267 | static void pci_4u_free_consistent(struct pci_dev *pdev, size_t size, void *cpu, dma_addr_t dvma) | 266 | static void pci_4u_free_consistent(struct pci_dev *pdev, size_t size, void *cpu, dma_addr_t dvma) |
268 | { | 267 | { |
269 | struct pci_iommu *iommu; | 268 | struct iommu *iommu; |
270 | iopte_t *iopte; | 269 | iopte_t *iopte; |
271 | unsigned long flags, order, npages; | 270 | unsigned long flags, order, npages; |
272 | 271 | ||
@@ -291,8 +290,8 @@ static void pci_4u_free_consistent(struct pci_dev *pdev, size_t size, void *cpu, | |||
291 | */ | 290 | */ |
292 | static dma_addr_t pci_4u_map_single(struct pci_dev *pdev, void *ptr, size_t sz, int direction) | 291 | static dma_addr_t pci_4u_map_single(struct pci_dev *pdev, void *ptr, size_t sz, int direction) |
293 | { | 292 | { |
294 | struct pci_iommu *iommu; | 293 | struct iommu *iommu; |
295 | struct pci_strbuf *strbuf; | 294 | struct strbuf *strbuf; |
296 | iopte_t *base; | 295 | iopte_t *base; |
297 | unsigned long flags, npages, oaddr; | 296 | unsigned long flags, npages, oaddr; |
298 | unsigned long i, base_paddr, ctx; | 297 | unsigned long i, base_paddr, ctx; |
@@ -343,7 +342,7 @@ bad_no_ctx: | |||
343 | return PCI_DMA_ERROR_CODE; | 342 | return PCI_DMA_ERROR_CODE; |
344 | } | 343 | } |
345 | 344 | ||
346 | static void pci_strbuf_flush(struct pci_strbuf *strbuf, struct pci_iommu *iommu, u32 vaddr, unsigned long ctx, unsigned long npages, int direction) | 345 | static void pci_strbuf_flush(struct strbuf *strbuf, struct iommu *iommu, u32 vaddr, unsigned long ctx, unsigned long npages, int direction) |
347 | { | 346 | { |
348 | int limit; | 347 | int limit; |
349 | 348 | ||
@@ -410,8 +409,8 @@ do_flush_sync: | |||
410 | /* Unmap a single streaming mode DMA translation. */ | 409 | /* Unmap a single streaming mode DMA translation. */ |
411 | static void pci_4u_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int direction) | 410 | static void pci_4u_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int direction) |
412 | { | 411 | { |
413 | struct pci_iommu *iommu; | 412 | struct iommu *iommu; |
414 | struct pci_strbuf *strbuf; | 413 | struct strbuf *strbuf; |
415 | iopte_t *base; | 414 | iopte_t *base; |
416 | unsigned long flags, npages, ctx, i; | 415 | unsigned long flags, npages, ctx, i; |
417 | 416 | ||
@@ -541,8 +540,8 @@ static inline void fill_sg(iopte_t *iopte, struct scatterlist *sg, | |||
541 | */ | 540 | */ |
542 | static int pci_4u_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction) | 541 | static int pci_4u_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction) |
543 | { | 542 | { |
544 | struct pci_iommu *iommu; | 543 | struct iommu *iommu; |
545 | struct pci_strbuf *strbuf; | 544 | struct strbuf *strbuf; |
546 | unsigned long flags, ctx, npages, iopte_protection; | 545 | unsigned long flags, ctx, npages, iopte_protection; |
547 | iopte_t *base; | 546 | iopte_t *base; |
548 | u32 dma_base; | 547 | u32 dma_base; |
@@ -626,8 +625,8 @@ bad_no_ctx: | |||
626 | /* Unmap a set of streaming mode DMA translations. */ | 625 | /* Unmap a set of streaming mode DMA translations. */ |
627 | static void pci_4u_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction) | 626 | static void pci_4u_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction) |
628 | { | 627 | { |
629 | struct pci_iommu *iommu; | 628 | struct iommu *iommu; |
630 | struct pci_strbuf *strbuf; | 629 | struct strbuf *strbuf; |
631 | iopte_t *base; | 630 | iopte_t *base; |
632 | unsigned long flags, ctx, i, npages; | 631 | unsigned long flags, ctx, i, npages; |
633 | u32 bus_addr; | 632 | u32 bus_addr; |
@@ -684,8 +683,8 @@ static void pci_4u_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, in | |||
684 | */ | 683 | */ |
685 | static void pci_4u_dma_sync_single_for_cpu(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int direction) | 684 | static void pci_4u_dma_sync_single_for_cpu(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int direction) |
686 | { | 685 | { |
687 | struct pci_iommu *iommu; | 686 | struct iommu *iommu; |
688 | struct pci_strbuf *strbuf; | 687 | struct strbuf *strbuf; |
689 | unsigned long flags, ctx, npages; | 688 | unsigned long flags, ctx, npages; |
690 | 689 | ||
691 | iommu = pdev->dev.archdata.iommu; | 690 | iommu = pdev->dev.archdata.iommu; |
@@ -722,8 +721,8 @@ static void pci_4u_dma_sync_single_for_cpu(struct pci_dev *pdev, dma_addr_t bus_ | |||
722 | */ | 721 | */ |
723 | static void pci_4u_dma_sync_sg_for_cpu(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction) | 722 | static void pci_4u_dma_sync_sg_for_cpu(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction) |
724 | { | 723 | { |
725 | struct pci_iommu *iommu; | 724 | struct iommu *iommu; |
726 | struct pci_strbuf *strbuf; | 725 | struct strbuf *strbuf; |
727 | unsigned long flags, ctx, npages, i; | 726 | unsigned long flags, ctx, npages, i; |
728 | u32 bus_addr; | 727 | u32 bus_addr; |
729 | 728 | ||
@@ -798,7 +797,7 @@ int pci_dma_supported(struct pci_dev *pdev, u64 device_mask) | |||
798 | if (pdev == NULL) { | 797 | if (pdev == NULL) { |
799 | dma_addr_mask = 0xffffffff; | 798 | dma_addr_mask = 0xffffffff; |
800 | } else { | 799 | } else { |
801 | struct pci_iommu *iommu = pdev->dev.archdata.iommu; | 800 | struct iommu *iommu = pdev->dev.archdata.iommu; |
802 | 801 | ||
803 | dma_addr_mask = iommu->dma_addr_mask; | 802 | dma_addr_mask = iommu->dma_addr_mask; |
804 | 803 | ||