swiotlb: allow architectures to override swiotlb pool allocation
Impact: generalize swiotlb allocation code Architectures may need to allocate memory specially for use with the swiotlb. Create the weak function swiotlb_alloc_boot() and swiotlb_alloc() defaulting to the current behaviour. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
					parent
					
						
							
								a79b7a2a75
							
						
					
				
			
			
				commit
				
					
						8c5df16bec
					
				
			
		
					 2 changed files with 16 additions and 3 deletions
				
			
		| 
						 | 
					@ -10,6 +10,9 @@ struct scatterlist;
 | 
				
			||||||
extern void
 | 
					extern void
 | 
				
			||||||
swiotlb_init(void);
 | 
					swiotlb_init(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void *swiotlb_alloc_boot(size_t bytes, unsigned long nslabs);
 | 
				
			||||||
 | 
					extern void *swiotlb_alloc(unsigned order, unsigned long nslabs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void
 | 
					extern void
 | 
				
			||||||
*swiotlb_alloc_coherent(struct device *hwdev, size_t size,
 | 
					*swiotlb_alloc_coherent(struct device *hwdev, size_t size,
 | 
				
			||||||
			dma_addr_t *dma_handle, gfp_t flags);
 | 
								dma_addr_t *dma_handle, gfp_t flags);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,7 @@
 | 
				
			||||||
#include <linux/mm.h>
 | 
					#include <linux/mm.h>
 | 
				
			||||||
#include <linux/module.h>
 | 
					#include <linux/module.h>
 | 
				
			||||||
#include <linux/spinlock.h>
 | 
					#include <linux/spinlock.h>
 | 
				
			||||||
 | 
					#include <linux/swiotlb.h>
 | 
				
			||||||
#include <linux/string.h>
 | 
					#include <linux/string.h>
 | 
				
			||||||
#include <linux/types.h>
 | 
					#include <linux/types.h>
 | 
				
			||||||
#include <linux/ctype.h>
 | 
					#include <linux/ctype.h>
 | 
				
			||||||
| 
						 | 
					@ -126,6 +127,16 @@ setup_io_tlb_npages(char *str)
 | 
				
			||||||
__setup("swiotlb=", setup_io_tlb_npages);
 | 
					__setup("swiotlb=", setup_io_tlb_npages);
 | 
				
			||||||
/* make io_tlb_overflow tunable too? */
 | 
					/* make io_tlb_overflow tunable too? */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void * __weak swiotlb_alloc_boot(size_t size, unsigned long nslabs)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return alloc_bootmem_low_pages(size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void * __weak swiotlb_alloc(unsigned order, unsigned long nslabs)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return (void *)__get_free_pages(GFP_DMA | __GFP_NOWARN, order);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Statically reserve bounce buffer space and initialize bounce buffer data
 | 
					 * Statically reserve bounce buffer space and initialize bounce buffer data
 | 
				
			||||||
 * structures for the software IO TLB used to implement the DMA API.
 | 
					 * structures for the software IO TLB used to implement the DMA API.
 | 
				
			||||||
| 
						 | 
					@ -145,7 +156,7 @@ swiotlb_init_with_default_size(size_t default_size)
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Get IO TLB memory from the low pages
 | 
						 * Get IO TLB memory from the low pages
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	io_tlb_start = alloc_bootmem_low_pages(bytes);
 | 
						io_tlb_start = swiotlb_alloc_boot(bytes, io_tlb_nslabs);
 | 
				
			||||||
	if (!io_tlb_start)
 | 
						if (!io_tlb_start)
 | 
				
			||||||
		panic("Cannot allocate SWIOTLB buffer");
 | 
							panic("Cannot allocate SWIOTLB buffer");
 | 
				
			||||||
	io_tlb_end = io_tlb_start + bytes;
 | 
						io_tlb_end = io_tlb_start + bytes;
 | 
				
			||||||
| 
						 | 
					@ -202,8 +213,7 @@ swiotlb_late_init_with_default_size(size_t default_size)
 | 
				
			||||||
	bytes = io_tlb_nslabs << IO_TLB_SHIFT;
 | 
						bytes = io_tlb_nslabs << IO_TLB_SHIFT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while ((SLABS_PER_PAGE << order) > IO_TLB_MIN_SLABS) {
 | 
						while ((SLABS_PER_PAGE << order) > IO_TLB_MIN_SLABS) {
 | 
				
			||||||
		io_tlb_start = (char *)__get_free_pages(GFP_DMA | __GFP_NOWARN,
 | 
							io_tlb_start = swiotlb_alloc(order, io_tlb_nslabs);
 | 
				
			||||||
		                                        order);
 | 
					 | 
				
			||||||
		if (io_tlb_start)
 | 
							if (io_tlb_start)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		order--;
 | 
							order--;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue