* [RFC PATCH v3 03/11] swiotbl: add back swiotlb_alloc_boot() [not found] <1267963912-984-1-git-send-email-albert_herranz@yahoo.es> @ 2010-03-07 12:11 ` Albert Herranz 2010-03-07 12:11 ` [RFC PATCH v3 04/11] swiotlb: support NOT_COHERENT_CACHE PowerPC platforms Albert Herranz 2010-03-07 12:11 ` [RFC PATCH v3 05/11] swiotlb: add swiotlb_set_default_size() Albert Herranz 2 siblings, 0 replies; 7+ messages in thread From: Albert Herranz @ 2010-03-07 12:11 UTC (permalink / raw) To: linux-usb, linuxppc-dev; +Cc: Albert Herranz, linux-kernel, x86, linux-ia64 This patch makes swiotlb_alloc_boot() available again. This weak function can be overloaded to modify slightly how the SWIOTLB and the overflow areas are allocated during boot. This will be used later to support the Nintendo Wii video game console, which requires placing the SWIOTLB area above 0x10000000 (MEM2). Signed-off-by: Albert Herranz <albert_herranz@yahoo.es> CC: linuxppc-dev@lists.ozlabs.org CC: linux-kernel@vger.kernel.org CC: x86@kernel.org CC: linux-ia64@vger.kernel.org --- include/linux/swiotlb.h | 2 ++ lib/swiotlb.c | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index febedcf..3954228 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h @@ -24,6 +24,8 @@ extern int swiotlb_force; extern void swiotlb_init(int verbose); +extern void *swiotlb_alloc_boot(size_t bytes, unsigned long nslabs); + extern void *swiotlb_alloc_coherent(struct device *hwdev, size_t size, dma_addr_t *dma_handle, gfp_t flags); diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 437eedb..94db5df 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c @@ -117,6 +117,11 @@ setup_io_tlb_npages(char *str) __setup("swiotlb=", setup_io_tlb_npages); /* make io_tlb_overflow tunable too? */ +void * __weak __init swiotlb_alloc_boot(size_t size, unsigned long nslabs) +{ + return alloc_bootmem_low_pages(size); +} + /* Note that this doesn't work with highmem page */ static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev, volatile void *address) @@ -158,7 +163,7 @@ swiotlb_init_with_default_size(size_t default_size, int verbose) /* * 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) panic("Cannot allocate SWIOTLB buffer"); io_tlb_end = io_tlb_start + bytes; @@ -177,7 +182,8 @@ swiotlb_init_with_default_size(size_t default_size, int verbose) /* * Get the overflow emergency buffer */ - io_tlb_overflow_buffer = alloc_bootmem_low(io_tlb_overflow); + io_tlb_overflow_buffer = swiotlb_alloc_boot(io_tlb_overflow, + io_tlb_nslabs); if (!io_tlb_overflow_buffer) panic("Cannot allocate SWIOTLB overflow buffer!\n"); if (verbose) -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RFC PATCH v3 04/11] swiotlb: support NOT_COHERENT_CACHE PowerPC platforms [not found] <1267963912-984-1-git-send-email-albert_herranz@yahoo.es> 2010-03-07 12:11 ` [RFC PATCH v3 03/11] swiotbl: add back swiotlb_alloc_boot() Albert Herranz @ 2010-03-07 12:11 ` Albert Herranz 2010-03-08 16:55 ` [LKML] " Konrad Rzeszutek Wilk 2010-03-07 12:11 ` [RFC PATCH v3 05/11] swiotlb: add swiotlb_set_default_size() Albert Herranz 2 siblings, 1 reply; 7+ messages in thread From: Albert Herranz @ 2010-03-07 12:11 UTC (permalink / raw) To: linux-usb, linuxppc-dev; +Cc: Albert Herranz, linux-kernel, x86, linux-ia64 The current SWIOTLB code does not support NOT_COHERENT_CACHE platforms. This patch adds support for NOT_COHERENT_CACHE platforms to SWIOTLB by adding two platform specific functions swiotlb_dma_sync_page() and swiotlb_dma_sync() which can be used to explicitly manage cache coherency. On PowerPC these functions are mapped to their corresponding __dma_sync_page() and __dma_sync() functions. On other architectures using SWIOTLB these functions are optimized out. This will be used later to support SWIOTLB on the Nintendo Wii video game console. Signed-off-by: Albert Herranz <albert_herranz@yahoo.es> CC: linuxppc-dev@lists.ozlabs.org CC: linux-kernel@vger.kernel.org CC: x86@kernel.org CC: linux-ia64@vger.kernel.org --- arch/ia64/include/asm/swiotlb.h | 10 ++++++++++ arch/powerpc/include/asm/swiotlb.h | 3 +++ arch/x86/include/asm/swiotlb.h | 10 ++++++++++ lib/swiotlb.c | 30 ++++++++++++++++++++++++------ 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/arch/ia64/include/asm/swiotlb.h b/arch/ia64/include/asm/swiotlb.h index f0acde6..6722090 100644 --- a/arch/ia64/include/asm/swiotlb.h +++ b/arch/ia64/include/asm/swiotlb.h @@ -14,4 +14,14 @@ static inline void pci_swiotlb_init(void) } #endif +static inline void swiotlb_dma_sync_page(struct page *page, + unsigned long offset, + size_t size, int direction) +{ +} + +static inline void swiotlb_dma_sync(void *vaddr, size_t size, int direction) +{ +} + #endif /* ASM_IA64__SWIOTLB_H */ diff --git a/arch/powerpc/include/asm/swiotlb.h b/arch/powerpc/include/asm/swiotlb.h index 8979d4c..603b343 100644 --- a/arch/powerpc/include/asm/swiotlb.h +++ b/arch/powerpc/include/asm/swiotlb.h @@ -22,4 +22,7 @@ int __init swiotlb_setup_bus_notifier(void); extern void pci_dma_dev_setup_swiotlb(struct pci_dev *pdev); +#define swiotlb_dma_sync_page __dma_sync_page +#define swiotlb_dma_sync __dma_sync + #endif /* __ASM_SWIOTLB_H */ diff --git a/arch/x86/include/asm/swiotlb.h b/arch/x86/include/asm/swiotlb.h index 8085277..e5f6d9c 100644 --- a/arch/x86/include/asm/swiotlb.h +++ b/arch/x86/include/asm/swiotlb.h @@ -20,4 +20,14 @@ static inline void pci_swiotlb_init(void) static inline void dma_mark_clean(void *addr, size_t size) {} +static inline void swiotlb_dma_sync_page(struct page *page, + unsigned long offset, + size_t size, int direction) +{ +} + +static inline void swiotlb_dma_sync(void *vaddr, size_t size, int direction) +{ +} + #endif /* _ASM_X86_SWIOTLB_H */ diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 94db5df..8f2dad9 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c @@ -346,10 +346,13 @@ static void swiotlb_bounce(phys_addr_t phys, char *dma_addr, size_t size, local_irq_save(flags); buffer = kmap_atomic(pfn_to_page(pfn), KM_BOUNCE_READ); - if (dir == DMA_TO_DEVICE) + if (dir == DMA_TO_DEVICE) { memcpy(dma_addr, buffer + offset, sz); - else + swiotlb_dma_sync(dma_addr, sz, dir); + } else { + swiotlb_dma_sync(dma_addr, sz, dir); memcpy(buffer + offset, dma_addr, sz); + } kunmap_atomic(buffer, KM_BOUNCE_READ); local_irq_restore(flags); @@ -359,10 +362,14 @@ static void swiotlb_bounce(phys_addr_t phys, char *dma_addr, size_t size, offset = 0; } } else { - if (dir == DMA_TO_DEVICE) + if (dir == DMA_TO_DEVICE) { memcpy(dma_addr, phys_to_virt(phys), size); - else + swiotlb_dma_sync(dma_addr, size, dir); + + } else { + swiotlb_dma_sync(dma_addr, size, dir); memcpy(phys_to_virt(phys), dma_addr, size); + } } } @@ -542,6 +549,8 @@ sync_single(struct device *hwdev, char *dma_addr, size_t size, } } +#ifndef CONFIG_NOT_COHERENT_CACHE + void * swiotlb_alloc_coherent(struct device *hwdev, size_t size, dma_addr_t *dma_handle, gfp_t flags) @@ -606,6 +615,8 @@ swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr, } EXPORT_SYMBOL(swiotlb_free_coherent); +#endif /* !CONFIG_NOT_COHERENT_CACHE */ + static void swiotlb_full(struct device *dev, size_t size, int dir, int do_panic) { @@ -652,8 +663,10 @@ dma_addr_t swiotlb_map_page(struct device *dev, struct page *page, * we can safely return the device addr and not worry about bounce * buffering it. */ - if (dma_capable(dev, dev_addr, size) && !swiotlb_force) + if (dma_capable(dev, dev_addr, size) && !swiotlb_force) { + swiotlb_dma_sync_page(page, offset, size, dir); return dev_addr; + } /* * Oh well, have to allocate and map a bounce buffer. @@ -739,6 +752,8 @@ swiotlb_sync_single(struct device *hwdev, dma_addr_t dev_addr, return; } + swiotlb_dma_sync(phys_to_virt(paddr), size, dir); + if (dir != DMA_FROM_DEVICE) return; @@ -835,8 +850,11 @@ swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl, int nelems, return 0; } sg->dma_address = swiotlb_virt_to_bus(hwdev, map); - } else + } else { + swiotlb_dma_sync_page(sg_page(sg), sg->offset, + sg->length, dir); sg->dma_address = dev_addr; + } sg->dma_length = sg->length; } return nelems; -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [LKML] [RFC PATCH v3 04/11] swiotlb: support NOT_COHERENT_CACHE PowerPC platforms 2010-03-07 12:11 ` [RFC PATCH v3 04/11] swiotlb: support NOT_COHERENT_CACHE PowerPC platforms Albert Herranz @ 2010-03-08 16:55 ` Konrad Rzeszutek Wilk 2010-03-09 18:07 ` Albert Herranz 0 siblings, 1 reply; 7+ messages in thread From: Konrad Rzeszutek Wilk @ 2010-03-08 16:55 UTC (permalink / raw) To: Albert Herranz; +Cc: linux-usb, linuxppc-dev, linux-kernel, x86, linux-ia64 On Sun, Mar 07, 2010 at 01:11:45PM +0100, Albert Herranz wrote: > The current SWIOTLB code does not support NOT_COHERENT_CACHE platforms. > This patch adds support for NOT_COHERENT_CACHE platforms to SWIOTLB by > adding two platform specific functions swiotlb_dma_sync_page() and > swiotlb_dma_sync() which can be used to explicitly manage cache coherency. Hey Albert, I've been doing some posting in this area to split the physical / bus address translation so that multiple platforms can utilize it. I was wondering if it makes sense to utilize some of those concepts (ie, extend it for DMA coherency) for your code: https://lists.linux-foundation.org/pipermail/iommu/2010-February/002066.html And here is the git tree that goes on top of those patches: git://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb-2.6.git xen-swiotlb-0.5 > > On PowerPC these functions are mapped to their corresponding > __dma_sync_page() and __dma_sync() functions. > On other architectures using SWIOTLB these functions are optimized out. > > This will be used later to support SWIOTLB on the Nintendo Wii video game > console. > > Signed-off-by: Albert Herranz <albert_herranz@yahoo.es> > CC: linuxppc-dev@lists.ozlabs.org > CC: linux-kernel@vger.kernel.org > CC: x86@kernel.org > CC: linux-ia64@vger.kernel.org > --- > arch/ia64/include/asm/swiotlb.h | 10 ++++++++++ > arch/powerpc/include/asm/swiotlb.h | 3 +++ > arch/x86/include/asm/swiotlb.h | 10 ++++++++++ > lib/swiotlb.c | 30 ++++++++++++++++++++++++------ > 4 files changed, 47 insertions(+), 6 deletions(-) > > diff --git a/arch/ia64/include/asm/swiotlb.h b/arch/ia64/include/asm/swiotlb.h > index f0acde6..6722090 100644 > --- a/arch/ia64/include/asm/swiotlb.h > +++ b/arch/ia64/include/asm/swiotlb.h > @@ -14,4 +14,14 @@ static inline void pci_swiotlb_init(void) > } > #endif > > +static inline void swiotlb_dma_sync_page(struct page *page, > + unsigned long offset, > + size_t size, int direction) > +{ > +} > + > +static inline void swiotlb_dma_sync(void *vaddr, size_t size, int direction) > +{ > +} > + > #endif /* ASM_IA64__SWIOTLB_H */ > diff --git a/arch/powerpc/include/asm/swiotlb.h b/arch/powerpc/include/asm/swiotlb.h > index 8979d4c..603b343 100644 > --- a/arch/powerpc/include/asm/swiotlb.h > +++ b/arch/powerpc/include/asm/swiotlb.h > @@ -22,4 +22,7 @@ int __init swiotlb_setup_bus_notifier(void); > > extern void pci_dma_dev_setup_swiotlb(struct pci_dev *pdev); > > +#define swiotlb_dma_sync_page __dma_sync_page > +#define swiotlb_dma_sync __dma_sync > + > #endif /* __ASM_SWIOTLB_H */ > diff --git a/arch/x86/include/asm/swiotlb.h b/arch/x86/include/asm/swiotlb.h > index 8085277..e5f6d9c 100644 > --- a/arch/x86/include/asm/swiotlb.h > +++ b/arch/x86/include/asm/swiotlb.h > @@ -20,4 +20,14 @@ static inline void pci_swiotlb_init(void) > > static inline void dma_mark_clean(void *addr, size_t size) {} > > +static inline void swiotlb_dma_sync_page(struct page *page, > + unsigned long offset, > + size_t size, int direction) > +{ > +} > + > +static inline void swiotlb_dma_sync(void *vaddr, size_t size, int direction) > +{ > +} > + > #endif /* _ASM_X86_SWIOTLB_H */ > diff --git a/lib/swiotlb.c b/lib/swiotlb.c > index 94db5df..8f2dad9 100644 > --- a/lib/swiotlb.c > +++ b/lib/swiotlb.c > @@ -346,10 +346,13 @@ static void swiotlb_bounce(phys_addr_t phys, char *dma_addr, size_t size, > local_irq_save(flags); > buffer = kmap_atomic(pfn_to_page(pfn), > KM_BOUNCE_READ); > - if (dir == DMA_TO_DEVICE) > + if (dir == DMA_TO_DEVICE) { > memcpy(dma_addr, buffer + offset, sz); > - else > + swiotlb_dma_sync(dma_addr, sz, dir); > + } else { > + swiotlb_dma_sync(dma_addr, sz, dir); > memcpy(buffer + offset, dma_addr, sz); > + } > kunmap_atomic(buffer, KM_BOUNCE_READ); > local_irq_restore(flags); > > @@ -359,10 +362,14 @@ static void swiotlb_bounce(phys_addr_t phys, char *dma_addr, size_t size, > offset = 0; > } > } else { > - if (dir == DMA_TO_DEVICE) > + if (dir == DMA_TO_DEVICE) { > memcpy(dma_addr, phys_to_virt(phys), size); > - else > + swiotlb_dma_sync(dma_addr, size, dir); > + > + } else { > + swiotlb_dma_sync(dma_addr, size, dir); > memcpy(phys_to_virt(phys), dma_addr, size); > + } > } > } > > @@ -542,6 +549,8 @@ sync_single(struct device *hwdev, char *dma_addr, size_t size, > } > } > > +#ifndef CONFIG_NOT_COHERENT_CACHE > + > void * > swiotlb_alloc_coherent(struct device *hwdev, size_t size, > dma_addr_t *dma_handle, gfp_t flags) > @@ -606,6 +615,8 @@ swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr, > } > EXPORT_SYMBOL(swiotlb_free_coherent); > > +#endif /* !CONFIG_NOT_COHERENT_CACHE */ > + > static void > swiotlb_full(struct device *dev, size_t size, int dir, int do_panic) > { > @@ -652,8 +663,10 @@ dma_addr_t swiotlb_map_page(struct device *dev, struct page *page, > * we can safely return the device addr and not worry about bounce > * buffering it. > */ > - if (dma_capable(dev, dev_addr, size) && !swiotlb_force) > + if (dma_capable(dev, dev_addr, size) && !swiotlb_force) { > + swiotlb_dma_sync_page(page, offset, size, dir); > return dev_addr; > + } > > /* > * Oh well, have to allocate and map a bounce buffer. > @@ -739,6 +752,8 @@ swiotlb_sync_single(struct device *hwdev, dma_addr_t dev_addr, > return; > } > > + swiotlb_dma_sync(phys_to_virt(paddr), size, dir); > + > if (dir != DMA_FROM_DEVICE) > return; > > @@ -835,8 +850,11 @@ swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl, int nelems, > return 0; > } > sg->dma_address = swiotlb_virt_to_bus(hwdev, map); > - } else > + } else { > + swiotlb_dma_sync_page(sg_page(sg), sg->offset, > + sg->length, dir); > sg->dma_address = dev_addr; > + } > sg->dma_length = sg->length; > } > return nelems; > -- > 1.6.3.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [LKML] [RFC PATCH v3 04/11] swiotlb: support NOT_COHERENT_CACHE PowerPC platforms 2010-03-08 16:55 ` [LKML] " Konrad Rzeszutek Wilk @ 2010-03-09 18:07 ` Albert Herranz 0 siblings, 0 replies; 7+ messages in thread From: Albert Herranz @ 2010-03-09 18:07 UTC (permalink / raw) To: Konrad Rzeszutek Wilk Cc: linux-usb, linuxppc-dev, linux-kernel, x86, linux-ia64 Konrad Rzeszutek Wilk wrote: > Hey Albert, > > I've been doing some posting in this area to split the physical / bus > address translation so that multiple platforms can utilize it. I was > wondering if it makes sense to utilize some of those concepts (ie, extend it > for DMA coherency) for your code: > > https://lists.linux-foundation.org/pipermail/iommu/2010-February/002066.html > > And here is the git tree that goes on top of those patches: > git://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb-2.6.git xen-swiotlb-0.5 > Hi Konrad, Thanks for your comments. In my case, I'd like to re-use as much code from swiotlb as possible. Adding a few function calls at strategic spots (which are optimized out for cache coherent platforms) to maintain cache coherency is currently enough for me if that's acceptable. A more general approach would involve making swiotlb_bounce() platform-dependent (or at least the actual code for copying the buffers), and re-implementing map_page, sync_single and map_sg at the platform DMA code again. I've whipped through your patches. If I undestood them, you make available a kind of swiotlb "library" core on top of which you can build alternate swiotlb-based dma ops. Wouldn't it be a good idea to split the "library" code from the default swiotlb dma ops? A(n embedded) platform may just want the "library" code to implement its own dma ops, without having to pay for the extra default swiotlb dma ops implementation. Thanks, Albert ^ permalink raw reply [flat|nested] 7+ messages in thread
* [RFC PATCH v3 05/11] swiotlb: add swiotlb_set_default_size() [not found] <1267963912-984-1-git-send-email-albert_herranz@yahoo.es> 2010-03-07 12:11 ` [RFC PATCH v3 03/11] swiotbl: add back swiotlb_alloc_boot() Albert Herranz 2010-03-07 12:11 ` [RFC PATCH v3 04/11] swiotlb: support NOT_COHERENT_CACHE PowerPC platforms Albert Herranz @ 2010-03-07 12:11 ` Albert Herranz 2010-03-08 16:59 ` [LKML] " Konrad Rzeszutek Wilk 2 siblings, 1 reply; 7+ messages in thread From: Albert Herranz @ 2010-03-07 12:11 UTC (permalink / raw) To: linux-usb, linuxppc-dev; +Cc: Albert Herranz, linux-kernel, x86, linux-ia64 The current SWIOTLB code uses a default of 64MB for the IO TLB area. This size can be influenced using a kernel command line parameter "swiotlb". Unfortunately, the parsing of the kernel command line is done _after_ the swiotlb is initialized on some architectures. This patch adds a new function swiotlb_set_default_size() which can be used before swiotlb_init() to indicate the desired IO TLB area size in bytes. This will be used later to implement a smaller IO TLB on the Nintendo Wii video game console which just comes with 24MB + 64MB of RAM. Signed-off-by: Albert Herranz <albert_herranz@yahoo.es> CC: linuxppc-dev@lists.ozlabs.org CC: linux-kernel@vger.kernel.org CC: x86@kernel.org CC: linux-ia64@vger.kernel.org --- include/linux/swiotlb.h | 2 ++ lib/swiotlb.c | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletions(-) diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index 3954228..2af6a45 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h @@ -22,6 +22,8 @@ extern int swiotlb_force; */ #define IO_TLB_SHIFT 11 +extern size_t __init swiotlb_set_default_size(size_t size); + extern void swiotlb_init(int verbose); extern void *swiotlb_alloc_boot(size_t bytes, unsigned long nslabs); diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 8f2dad9..c99512d 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c @@ -73,6 +73,11 @@ static char *io_tlb_start, *io_tlb_end; static unsigned long io_tlb_nslabs; /* + * Default size for the IO TLB (64MB). + */ +static __initdata size_t io_tlb_default_size = 64 * (1<<20); + +/* * When the IOMMU overflows we return a fallback buffer. This sets the size. */ static unsigned long io_tlb_overflow = 32*1024; @@ -117,6 +122,26 @@ setup_io_tlb_npages(char *str) __setup("swiotlb=", setup_io_tlb_npages); /* make io_tlb_overflow tunable too? */ +/** + * swiotlb_set_default_size() - set the default size for the IO TLB + * @size: size in bytes of the IO TLB + * + * A platform can use this function to change the default size of the + * IO TLB when the default of 64MB is not suitable. + * This function must be called before swiotlb_init(). + * + * Note that on some platforms this is the only way to influence the + * size of the IO TLB, as the command line may be parsed _after_ the + * IO TLB is initialized. + */ +size_t __init swiotlb_set_default_size(size_t size) +{ + size_t previous_size = io_tlb_default_size; + + io_tlb_default_size = size; + return previous_size; +} + void * __weak __init swiotlb_alloc_boot(size_t size, unsigned long nslabs) { return alloc_bootmem_low_pages(size); @@ -193,7 +218,7 @@ swiotlb_init_with_default_size(size_t default_size, int verbose) void __init swiotlb_init(int verbose) { - swiotlb_init_with_default_size(64 * (1<<20), verbose); /* default to 64MB */ + swiotlb_init_with_default_size(io_tlb_default_size, verbose); } /* -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [LKML] [RFC PATCH v3 05/11] swiotlb: add swiotlb_set_default_size() 2010-03-07 12:11 ` [RFC PATCH v3 05/11] swiotlb: add swiotlb_set_default_size() Albert Herranz @ 2010-03-08 16:59 ` Konrad Rzeszutek Wilk 2010-03-09 18:38 ` Albert Herranz 0 siblings, 1 reply; 7+ messages in thread From: Konrad Rzeszutek Wilk @ 2010-03-08 16:59 UTC (permalink / raw) To: Albert Herranz; +Cc: linux-usb, linuxppc-dev, linux-kernel, x86, linux-ia64 On Sun, Mar 07, 2010 at 01:11:46PM +0100, Albert Herranz wrote: > The current SWIOTLB code uses a default of 64MB for the IO TLB area. > This size can be influenced using a kernel command line parameter "swiotlb". > Unfortunately, the parsing of the kernel command line is done _after_ the > swiotlb is initialized on some architectures. Why can't it be moved up? I mean move the parsing of the kernel parameters before the PCI subsystem? > > This patch adds a new function swiotlb_set_default_size() which can be used > before swiotlb_init() to indicate the desired IO TLB area size in bytes. > > This will be used later to implement a smaller IO TLB on the Nintendo Wii > video game console which just comes with 24MB + 64MB of RAM. Use the io_tlb_nslabs, which is what swiotlb_init_with_default_size uses (the passed in argument is only used if io_tlb_nslabs is not set). > > Signed-off-by: Albert Herranz <albert_herranz@yahoo.es> > CC: linuxppc-dev@lists.ozlabs.org > CC: linux-kernel@vger.kernel.org > CC: x86@kernel.org > CC: linux-ia64@vger.kernel.org > --- > include/linux/swiotlb.h | 2 ++ > lib/swiotlb.c | 27 ++++++++++++++++++++++++++- > 2 files changed, 28 insertions(+), 1 deletions(-) > > diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h > index 3954228..2af6a45 100644 > --- a/include/linux/swiotlb.h > +++ b/include/linux/swiotlb.h > @@ -22,6 +22,8 @@ extern int swiotlb_force; > */ > #define IO_TLB_SHIFT 11 > > +extern size_t __init swiotlb_set_default_size(size_t size); > + > extern void swiotlb_init(int verbose); > > extern void *swiotlb_alloc_boot(size_t bytes, unsigned long nslabs); > diff --git a/lib/swiotlb.c b/lib/swiotlb.c > index 8f2dad9..c99512d 100644 > --- a/lib/swiotlb.c > +++ b/lib/swiotlb.c > @@ -73,6 +73,11 @@ static char *io_tlb_start, *io_tlb_end; > static unsigned long io_tlb_nslabs; > > /* > + * Default size for the IO TLB (64MB). > + */ > +static __initdata size_t io_tlb_default_size = 64 * (1<<20); > + > +/* > * When the IOMMU overflows we return a fallback buffer. This sets the size. > */ > static unsigned long io_tlb_overflow = 32*1024; > @@ -117,6 +122,26 @@ setup_io_tlb_npages(char *str) > __setup("swiotlb=", setup_io_tlb_npages); > /* make io_tlb_overflow tunable too? */ > > +/** > + * swiotlb_set_default_size() - set the default size for the IO TLB > + * @size: size in bytes of the IO TLB > + * > + * A platform can use this function to change the default size of the > + * IO TLB when the default of 64MB is not suitable. > + * This function must be called before swiotlb_init(). > + * > + * Note that on some platforms this is the only way to influence the > + * size of the IO TLB, as the command line may be parsed _after_ the > + * IO TLB is initialized. > + */ > +size_t __init swiotlb_set_default_size(size_t size) > +{ > + size_t previous_size = io_tlb_default_size; > + > + io_tlb_default_size = size; > + return previous_size; > +} > + > void * __weak __init swiotlb_alloc_boot(size_t size, unsigned long nslabs) > { > return alloc_bootmem_low_pages(size); > @@ -193,7 +218,7 @@ swiotlb_init_with_default_size(size_t default_size, int verbose) > void __init > swiotlb_init(int verbose) > { > - swiotlb_init_with_default_size(64 * (1<<20), verbose); /* default to 64MB */ > + swiotlb_init_with_default_size(io_tlb_default_size, verbose); > } > > /* > -- > 1.6.3.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [LKML] [RFC PATCH v3 05/11] swiotlb: add swiotlb_set_default_size() 2010-03-08 16:59 ` [LKML] " Konrad Rzeszutek Wilk @ 2010-03-09 18:38 ` Albert Herranz 0 siblings, 0 replies; 7+ messages in thread From: Albert Herranz @ 2010-03-09 18:38 UTC (permalink / raw) To: Konrad Rzeszutek Wilk Cc: linux-usb, linuxppc-dev, linux-kernel, x86, linux-ia64 Konrad Rzeszutek Wilk wrote: > On Sun, Mar 07, 2010 at 01:11:46PM +0100, Albert Herranz wrote: >> The current SWIOTLB code uses a default of 64MB for the IO TLB area. >> This size can be influenced using a kernel command line parameter "swiotlb". >> Unfortunately, the parsing of the kernel command line is done _after_ the >> swiotlb is initialized on some architectures. > > Why can't it be moved up? I mean move the parsing of the kernel > parameters before the PCI subsystem? (In my case there's no PCI subsystem, this is an embedded platform without PCI support). Currently, in the PowerPC tree a platform wanting to use the swiotlb just sets the global ppc_swiotlb_enable variable to true in its setup_arch() function. The PowerPC setup code then calls swiotlb_init(1) just after setup_arch() when SWIOTLB and ppc_swiotlb_enable is true. At this point the kernel command line is not yet parsed. So, at least in PowerPC linux, the early swiotlb initialization is not influenced by the kernel command line. Maybe switching swiotlb from __setup to early_param would help too. >> This patch adds a new function swiotlb_set_default_size() which can be used >> before swiotlb_init() to indicate the desired IO TLB area size in bytes. >> >> This will be used later to implement a smaller IO TLB on the Nintendo Wii >> video game console which just comes with 24MB + 64MB of RAM. > > Use the io_tlb_nslabs, which is what swiotlb_init_with_default_size uses > (the passed in argument is only used if io_tlb_nslabs is not set). > True, thanks. Cheers, Albert ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-03-09 18:38 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1267963912-984-1-git-send-email-albert_herranz@yahoo.es>
2010-03-07 12:11 ` [RFC PATCH v3 03/11] swiotbl: add back swiotlb_alloc_boot() Albert Herranz
2010-03-07 12:11 ` [RFC PATCH v3 04/11] swiotlb: support NOT_COHERENT_CACHE PowerPC platforms Albert Herranz
2010-03-08 16:55 ` [LKML] " Konrad Rzeszutek Wilk
2010-03-09 18:07 ` Albert Herranz
2010-03-07 12:11 ` [RFC PATCH v3 05/11] swiotlb: add swiotlb_set_default_size() Albert Herranz
2010-03-08 16:59 ` [LKML] " Konrad Rzeszutek Wilk
2010-03-09 18:38 ` Albert Herranz
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox