@@ -38,6 +38,7 @@ enum swiotlb_force {
extern void swiotlb_init(int verbose);
int swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose);
unsigned long swiotlb_size_or_default(void);
+void swiotlb_set_alloc_from_low_pages(bool low);
extern int swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs);
extern int swiotlb_late_init_with_default_size(size_t default_size);
extern void __init swiotlb_update_mem_attributes(void);
@@ -67,6 +67,7 @@ enum swiotlb_force swiotlb_force;
struct io_tlb_mem *io_tlb_default_mem;
phys_addr_t swiotlb_unencrypted_base;
+static bool swiotlb_alloc_from_low_pages = true;
/*
* Max segment that we can provide which (if pages are contingous) will
@@ -109,6 +110,11 @@ void swiotlb_set_max_segment(unsigned int val)
max_segment = rounddown(val, PAGE_SIZE);
}
+void swiotlb_set_alloc_from_low_pages(bool low)
+{
+ swiotlb_alloc_from_low_pages = low;
+}
+
unsigned long swiotlb_size_or_default(void)
{
return default_nslabs << IO_TLB_SHIFT;
@@ -253,8 +259,15 @@ swiotlb_init(int verbose)
if (swiotlb_force == SWIOTLB_NO_FORCE)
return;
- /* Get IO TLB memory from the low pages */
- tlb = memblock_alloc_low(bytes, PAGE_SIZE);
+ /*
+ * Get IO TLB memory from the low pages if swiotlb_alloc_from_low_pages
+ * is set.
+ */
+ if (swiotlb_alloc_from_low_pages)
+ tlb = memblock_alloc_low(bytes, PAGE_SIZE);
+ else
+ tlb = memblock_alloc(bytes, PAGE_SIZE);
+
if (!tlb)
goto fail;
if (swiotlb_init_with_tbl(tlb, default_nslabs, verbose))