mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-29 01:51:39 +00:00
swiotlb: Add restricted DMA alloc/free support
Add the functions, swiotlb_{alloc,free} and is_swiotlb_for_alloc to support the memory allocation from restricted DMA pool. The restricted DMA pool is preferred if available. Note that since coherent allocation needs remapping, one must set up another device coherent pool by shared-dma-pool and use dma_alloc_from_dev_coherent instead for atomic coherent allocation. Signed-off-by: Claire Chang <tientzu@chromium.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Tested-by: Stefano Stabellini <sstabellini@kernel.org> Tested-by: Will Deacon <will@kernel.org> Acked-by: Stefano Stabellini <sstabellini@kernel.org> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
parent
7034787723
commit
f4111e39a5
3 changed files with 99 additions and 14 deletions
|
@ -85,6 +85,7 @@ extern enum swiotlb_force swiotlb_force;
|
|||
* @debugfs: The dentry to debugfs.
|
||||
* @late_alloc: %true if allocated using the page allocator
|
||||
* @force_bounce: %true if swiotlb bouncing is forced
|
||||
* @for_alloc: %true if the pool is used for memory allocation
|
||||
*/
|
||||
struct io_tlb_mem {
|
||||
phys_addr_t start;
|
||||
|
@ -96,6 +97,7 @@ struct io_tlb_mem {
|
|||
struct dentry *debugfs;
|
||||
bool late_alloc;
|
||||
bool force_bounce;
|
||||
bool for_alloc;
|
||||
struct io_tlb_slot {
|
||||
phys_addr_t orig_addr;
|
||||
size_t alloc_size;
|
||||
|
@ -158,4 +160,28 @@ static inline void swiotlb_adjust_size(unsigned long size)
|
|||
extern void swiotlb_print_info(void);
|
||||
extern void swiotlb_set_max_segment(unsigned int);
|
||||
|
||||
#ifdef CONFIG_DMA_RESTRICTED_POOL
|
||||
struct page *swiotlb_alloc(struct device *dev, size_t size);
|
||||
bool swiotlb_free(struct device *dev, struct page *page, size_t size);
|
||||
|
||||
static inline bool is_swiotlb_for_alloc(struct device *dev)
|
||||
{
|
||||
return dev->dma_io_tlb_mem->for_alloc;
|
||||
}
|
||||
#else
|
||||
static inline struct page *swiotlb_alloc(struct device *dev, size_t size)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline bool swiotlb_free(struct device *dev, struct page *page,
|
||||
size_t size)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline bool is_swiotlb_for_alloc(struct device *dev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif /* CONFIG_DMA_RESTRICTED_POOL */
|
||||
|
||||
#endif /* __LINUX_SWIOTLB_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue