mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-04 21:31:51 +00:00
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