This patch - adds proper __init decoration to swiotlb's init code (and the code calling it, where not already the case) - replaces uses of 'unsigned long' with dma_addr_t where appropriate - does miscellaneous simplicfication and cleanup Signed-off-by: Jan Beulich Index: sle10-sp1-2006-12-18/arch/ia64/mm/init.c =================================================================== --- sle10-sp1-2006-12-18.orig/arch/ia64/mm/init.c 2006-12-20 12:02:01.000000000 +0100 +++ sle10-sp1-2006-12-18/arch/ia64/mm/init.c 2006-12-20 12:09:22.000000000 +0100 @@ -586,7 +586,7 @@ nolwsys_setup (char *s) __setup("nolwsys", nolwsys_setup); -void +void __init mem_init (void) { long reserved_pages, codesize, datasize, initsize; Index: sle10-sp1-2006-12-18/arch/x86_64/kernel/pci-swiotlb.c =================================================================== --- sle10-sp1-2006-12-18.orig/arch/x86_64/kernel/pci-swiotlb.c 2006-12-20 11:51:05.000000000 +0100 +++ sle10-sp1-2006-12-18/arch/x86_64/kernel/pci-swiotlb.c 2006-12-20 12:09:22.000000000 +0100 @@ -28,7 +28,7 @@ struct dma_mapping_ops swiotlb_dma_ops = .dma_supported = NULL, }; -void pci_swiotlb_init(void) +void __init pci_swiotlb_init(void) { /* don't initialize swiotlb if iommu=off (no_iommu=1) */ if (!iommu_detected && !no_iommu && Index: sle10-sp1-2006-12-18/lib/swiotlb.c =================================================================== --- sle10-sp1-2006-12-18.orig/lib/swiotlb.c 2006-12-20 12:09:03.000000000 +0100 +++ sle10-sp1-2006-12-18/lib/swiotlb.c 2006-12-20 12:39:41.000000000 +0100 @@ -1,7 +1,7 @@ /* * Dynamic DMA mapping support. * - * This implementation is for IA-64 and EM64T platforms that do not support + * This implementation is a fallback for platforms that do not support * I/O TLBs (aka DMA address translation hardware). * Copyright (C) 2000 Asit Mallick * Copyright (C) 2000 Goutham Rao @@ -68,7 +68,7 @@ enum dma_sync_target { SYNC_FOR_DEVICE = 1, }; -int swiotlb_force; +static int swiotlb_force; /* * Used to do a quick range check in swiotlb_unmap_single and @@ -129,23 +129,25 @@ __setup("swiotlb=", setup_io_tlb_npages) * Statically reserve bounce buffer space and initialize bounce buffer data * structures for the software IO TLB used to implement the DMA API. */ -void -swiotlb_init_with_default_size (size_t default_size) +void __init +swiotlb_init_with_default_size(size_t default_size) { - unsigned long i; + unsigned long i, bytes; if (!io_tlb_nslabs) { io_tlb_nslabs = (default_size >> IO_TLB_SHIFT); io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE); } + bytes = io_tlb_nslabs << IO_TLB_SHIFT; + /* * Get IO TLB memory from the low pages */ - io_tlb_start = alloc_bootmem_low_pages(io_tlb_nslabs * (1 << IO_TLB_SHIFT)); + io_tlb_start = alloc_bootmem_low_pages(bytes); if (!io_tlb_start) panic("Cannot allocate SWIOTLB buffer"); - io_tlb_end = io_tlb_start + io_tlb_nslabs * (1 << IO_TLB_SHIFT); + io_tlb_end = io_tlb_start + bytes; /* * Allocate and initialize the free list array. This array is used @@ -166,8 +168,8 @@ swiotlb_init_with_default_size (size_t d virt_to_bus(io_tlb_start), virt_to_bus(io_tlb_end)); } -void -swiotlb_init (void) +void __init +swiotlb_init(void) { swiotlb_init_with_default_size(64 * (1<<20)); /* default to 64MB */ } @@ -178,9 +180,9 @@ swiotlb_init (void) * This should be just like above, but with some error catching. */ int -swiotlb_late_init_with_default_size (size_t default_size) +swiotlb_late_init_with_default_size(size_t default_size) { - unsigned long i, req_nslabs = io_tlb_nslabs; + unsigned long i, bytes, req_nslabs = io_tlb_nslabs; unsigned int order; if (!io_tlb_nslabs) { @@ -191,8 +193,9 @@ swiotlb_late_init_with_default_size (siz /* * Get IO TLB memory from the low pages */ - order = get_order(io_tlb_nslabs * (1 << IO_TLB_SHIFT)); + order = get_order(io_tlb_nslabs << IO_TLB_SHIFT); io_tlb_nslabs = SLABS_PER_PAGE << order; + bytes = io_tlb_nslabs << IO_TLB_SHIFT; while ((SLABS_PER_PAGE << order) > IO_TLB_MIN_SLABS) { io_tlb_start = (char *)__get_free_pages(GFP_DMA | __GFP_NOWARN, @@ -205,13 +208,14 @@ swiotlb_late_init_with_default_size (siz if (!io_tlb_start) goto cleanup1; - if (order != get_order(io_tlb_nslabs * (1 << IO_TLB_SHIFT))) { + if (order != get_order(bytes)) { printk(KERN_WARNING "Warning: only able to allocate %ld MB " "for software IO TLB\n", (PAGE_SIZE << order) >> 20); io_tlb_nslabs = SLABS_PER_PAGE << order; + bytes = io_tlb_nslabs << IO_TLB_SHIFT; } - io_tlb_end = io_tlb_start + io_tlb_nslabs * (1 << IO_TLB_SHIFT); - memset(io_tlb_start, 0, io_tlb_nslabs * (1 << IO_TLB_SHIFT)); + io_tlb_end = io_tlb_start + bytes; + memset(io_tlb_start, 0, bytes); /* * Allocate and initialize the free list array. This array is used @@ -242,8 +246,8 @@ swiotlb_late_init_with_default_size (siz if (!io_tlb_overflow_buffer) goto cleanup4; - printk(KERN_INFO "Placing %ldMB software IO TLB between 0x%lx - " - "0x%lx\n", (io_tlb_nslabs * (1 << IO_TLB_SHIFT)) >> 20, + printk(KERN_INFO "Placing %luMB software IO TLB between 0x%lx - " + "0x%lx\n", bytes >> 20, virt_to_bus(io_tlb_start), virt_to_bus(io_tlb_end)); return 0; @@ -256,8 +260,8 @@ cleanup3: free_pages((unsigned long)io_tlb_list, get_order(io_tlb_nslabs * sizeof(int))); io_tlb_list = NULL; - io_tlb_end = NULL; cleanup2: + io_tlb_end = NULL; free_pages((unsigned long)io_tlb_start, order); io_tlb_start = NULL; cleanup1: @@ -434,7 +438,7 @@ void * swiotlb_alloc_coherent(struct device *hwdev, size_t size, dma_addr_t *dma_handle, gfp_t flags) { - unsigned long dev_addr; + dma_addr_t dev_addr; void *ret; int order = get_order(size); @@ -474,8 +478,9 @@ swiotlb_alloc_coherent(struct device *hw /* Confirm address can be DMA'd by device */ if (address_needs_mapping(hwdev, dev_addr)) { - printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016lx\n", - (unsigned long long)*hwdev->dma_mask, dev_addr); + printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n", + (unsigned long long)*hwdev->dma_mask, + (unsigned long long)dev_addr); panic("swiotlb_alloc_coherent: allocated memory is out of " "range for device"); } @@ -505,7 +510,7 @@ swiotlb_full(struct device *dev, size_t * When the mapping is small enough return a static buffer to limit * the damage, or panic when the transfer is too big. */ - printk(KERN_ERR "DMA: Out of SW-IOMMU space for %lu bytes at " + printk(KERN_ERR "DMA: Out of SW-IOMMU space for %zu bytes at " "device %s\n", size, dev ? dev->bus_id : "?"); if (size > io_tlb_overflow && do_panic) { @@ -526,7 +531,7 @@ swiotlb_full(struct device *dev, size_t dma_addr_t swiotlb_map_single(struct device *hwdev, void *ptr, size_t size, int dir) { - unsigned long dev_addr = virt_to_bus(ptr); + dma_addr_t dev_addr = virt_to_bus(ptr); void *map; if (dir == DMA_NONE) @@ -674,7 +679,7 @@ swiotlb_map_sg(struct device *hwdev, str int dir) { void *addr; - unsigned long dev_addr; + dma_addr_t dev_addr; int i; if (dir == DMA_NONE)