Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 356260
b: refs/heads/master
c: ac2cbab
h: refs/heads/master
v: v3
  • Loading branch information
Yinghai Lu authored and H. Peter Anvin committed Jan 30, 2013
1 parent 1730356 commit bcae38f
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 22 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 38fa4175e60d98fb1c9815fb14f8057576dade73
refs/heads/master: ac2cbab21f318e19bc176a7f38a120cec835220f
3 changes: 2 additions & 1 deletion trunk/arch/mips/cavium-octeon/dma-octeon.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,8 @@ void __init plat_swiotlb_setup(void)

octeon_swiotlb = alloc_bootmem_low_pages(swiotlbsize);

swiotlb_init_with_tbl(octeon_swiotlb, swiotlb_nslabs, 1);
if (swiotlb_init_with_tbl(octeon_swiotlb, swiotlb_nslabs, 1) == -ENOMEM)
panic("Cannot allocate SWIOTLB buffer");

mips_dma_map_ops = &octeon_linear_dma_map_ops.dma_map_ops;
}
Expand Down
4 changes: 3 additions & 1 deletion trunk/drivers/xen/swiotlb-xen.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,9 @@ int __ref xen_swiotlb_init(int verbose, bool early)
}
start_dma_addr = xen_virt_to_bus(xen_io_tlb_start);
if (early) {
swiotlb_init_with_tbl(xen_io_tlb_start, xen_io_tlb_nslabs, verbose);
if (swiotlb_init_with_tbl(xen_io_tlb_start, xen_io_tlb_nslabs,
verbose))
panic("Cannot allocate SWIOTLB buffer");
rc = 0;
} else
rc = swiotlb_late_init_with_tbl(xen_io_tlb_start, xen_io_tlb_nslabs);
Expand Down
2 changes: 1 addition & 1 deletion trunk/include/linux/swiotlb.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ extern int swiotlb_force;
#define IO_TLB_SHIFT 11

extern void swiotlb_init(int verbose);
extern void swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose);
int swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose);
extern unsigned long swiotlb_nr_tbl(void);
extern int swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs);

Expand Down
47 changes: 29 additions & 18 deletions trunk/lib/swiotlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,18 @@ static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev,
return phys_to_dma(hwdev, virt_to_phys(address));
}

static bool no_iotlb_memory;

void swiotlb_print_info(void)
{
unsigned long bytes = io_tlb_nslabs << IO_TLB_SHIFT;
unsigned char *vstart, *vend;

if (no_iotlb_memory) {
pr_warn("software IO TLB: No low mem\n");
return;
}

vstart = phys_to_virt(io_tlb_start);
vend = phys_to_virt(io_tlb_end);

Expand All @@ -136,7 +143,7 @@ void swiotlb_print_info(void)
bytes >> 20, vstart, vend - 1);
}

void __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose)
int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose)
{
void *v_overflow_buffer;
unsigned long i, bytes;
Expand All @@ -150,9 +157,10 @@ void __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose)
/*
* Get the overflow emergency buffer
*/
v_overflow_buffer = alloc_bootmem_low_pages(PAGE_ALIGN(io_tlb_overflow));
v_overflow_buffer = alloc_bootmem_low_pages_nopanic(
PAGE_ALIGN(io_tlb_overflow));
if (!v_overflow_buffer)
panic("Cannot allocate SWIOTLB overflow buffer!\n");
return -ENOMEM;

io_tlb_overflow_buffer = __pa(v_overflow_buffer);

Expand All @@ -169,15 +177,19 @@ void __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose)

if (verbose)
swiotlb_print_info();

return 0;
}

/*
* Statically reserve bounce buffer space and initialize bounce buffer data
* structures for the software IO TLB used to implement the DMA API.
*/
static void __init
swiotlb_init_with_default_size(size_t default_size, int verbose)
void __init
swiotlb_init(int verbose)
{
/* default to 64MB */
size_t default_size = 64UL<<20;
unsigned char *vstart;
unsigned long bytes;

Expand All @@ -188,20 +200,16 @@ swiotlb_init_with_default_size(size_t default_size, int verbose)

bytes = io_tlb_nslabs << IO_TLB_SHIFT;

/*
* Get IO TLB memory from the low pages
*/
vstart = alloc_bootmem_low_pages(PAGE_ALIGN(bytes));
if (!vstart)
panic("Cannot allocate SWIOTLB buffer");

swiotlb_init_with_tbl(vstart, io_tlb_nslabs, verbose);
}
/* Get IO TLB memory from the low pages */
vstart = alloc_bootmem_low_pages_nopanic(PAGE_ALIGN(bytes));
if (vstart && !swiotlb_init_with_tbl(vstart, io_tlb_nslabs, verbose))
return;

void __init
swiotlb_init(int verbose)
{
swiotlb_init_with_default_size(64 * (1<<20), verbose); /* default to 64MB */
if (io_tlb_start)
free_bootmem(io_tlb_start,
PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
pr_warn("Cannot allocate SWIOTLB buffer");
no_iotlb_memory = true;
}

/*
Expand Down Expand Up @@ -405,6 +413,9 @@ phys_addr_t swiotlb_tbl_map_single(struct device *hwdev,
unsigned long offset_slots;
unsigned long max_slots;

if (no_iotlb_memory)
panic("Can not allocate SWIOTLB buffer earlier and can't now provide you with the DMA bounce buffer");

mask = dma_get_seg_boundary(hwdev);

tbl_dma_addr &= mask;
Expand Down

0 comments on commit bcae38f

Please sign in to comment.