-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
xen: introduce xen_alloc/free_coherent_pages
xen_swiotlb_alloc_coherent needs to allocate a coherent buffer for cpu and devices. On native x86 is sufficient to call __get_free_pages in order to get a coherent buffer, while on ARM (and potentially ARM64) we need to call the native dma_ops->alloc implementation. Introduce xen_alloc_coherent_pages to abstract the arch specific buffer allocation. Similarly introduce xen_free_coherent_pages to free a coherent buffer: on x86 is simply a call to free_pages while on ARM and ARM64 is arm_dma_ops.free. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Changes in v7: - rename __get_dma_ops to __generic_dma_ops; - call __generic_dma_ops(hwdev)->alloc/free on arm64 too. Changes in v6: - call __get_dma_ops to get the native dma_ops pointer on arm.
- Loading branch information
Stefano Stabellini
committed
Oct 9, 2013
1 parent
58c8b26
commit d6fe76c
Showing
4 changed files
with
92 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#ifndef _ASM_ARM_XEN_PAGE_COHERENT_H | ||
#define _ASM_ARM_XEN_PAGE_COHERENT_H | ||
|
||
#include <asm/page.h> | ||
#include <linux/dma-attrs.h> | ||
#include <linux/dma-mapping.h> | ||
|
||
static inline void *xen_alloc_coherent_pages(struct device *hwdev, size_t size, | ||
dma_addr_t *dma_handle, gfp_t flags, | ||
struct dma_attrs *attrs) | ||
{ | ||
return __generic_dma_ops(hwdev)->alloc(hwdev, size, dma_handle, flags, attrs); | ||
} | ||
|
||
static inline void xen_free_coherent_pages(struct device *hwdev, size_t size, | ||
void *cpu_addr, dma_addr_t dma_handle, | ||
struct dma_attrs *attrs) | ||
{ | ||
__generic_dma_ops(hwdev)->free(hwdev, size, cpu_addr, dma_handle, attrs); | ||
} | ||
|
||
#endif /* _ASM_ARM_XEN_PAGE_COHERENT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#ifndef _ASM_ARM64_XEN_PAGE_COHERENT_H | ||
#define _ASM_ARM64_XEN_PAGE_COHERENT_H | ||
|
||
#include <asm/page.h> | ||
#include <linux/dma-attrs.h> | ||
#include <linux/dma-mapping.h> | ||
|
||
static inline void *xen_alloc_coherent_pages(struct device *hwdev, size_t size, | ||
dma_addr_t *dma_handle, gfp_t flags, | ||
struct dma_attrs *attrs) | ||
{ | ||
return __generic_dma_ops(hwdev)->alloc(hwdev, size, dma_handle, flags, attrs); | ||
} | ||
|
||
static inline void xen_free_coherent_pages(struct device *hwdev, size_t size, | ||
void *cpu_addr, dma_addr_t dma_handle, | ||
struct dma_attrs *attrs) | ||
{ | ||
__generic_dma_ops(hwdev)->free(hwdev, size, cpu_addr, dma_handle, attrs); | ||
} | ||
|
||
#endif /* _ASM_ARM64_XEN_PAGE_COHERENT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#ifndef _ASM_IA64_XEN_PAGE_COHERENT_H | ||
#define _ASM_IA64_XEN_PAGE_COHERENT_H | ||
|
||
#include <asm/page.h> | ||
#include <linux/dma-attrs.h> | ||
#include <linux/dma-mapping.h> | ||
|
||
static inline void *xen_alloc_coherent_pages(struct device *hwdev, size_t size, | ||
dma_addr_t *dma_handle, gfp_t flags, | ||
struct dma_attrs *attrs) | ||
{ | ||
void *vstart = (void*)__get_free_pages(flags, get_order(size)); | ||
*dma_handle = virt_to_phys(vstart); | ||
return vstart; | ||
} | ||
|
||
static inline void xen_free_coherent_pages(struct device *hwdev, size_t size, | ||
void *cpu_addr, dma_addr_t dma_handle, | ||
struct dma_attrs *attrs) | ||
{ | ||
free_pages((unsigned long) cpu_addr, get_order(size)); | ||
} | ||
|
||
#endif /* _ASM_IA64_XEN_PAGE_COHERENT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#ifndef _ASM_X86_XEN_PAGE_COHERENT_H | ||
#define _ASM_X86_XEN_PAGE_COHERENT_H | ||
|
||
#include <asm/page.h> | ||
#include <linux/dma-attrs.h> | ||
#include <linux/dma-mapping.h> | ||
|
||
static inline void *xen_alloc_coherent_pages(struct device *hwdev, size_t size, | ||
dma_addr_t *dma_handle, gfp_t flags, | ||
struct dma_attrs *attrs) | ||
{ | ||
void *vstart = (void*)__get_free_pages(flags, get_order(size)); | ||
*dma_handle = virt_to_phys(vstart); | ||
return vstart; | ||
} | ||
|
||
static inline void xen_free_coherent_pages(struct device *hwdev, size_t size, | ||
void *cpu_addr, dma_addr_t dma_handle, | ||
struct dma_attrs *attrs) | ||
{ | ||
free_pages((unsigned long) cpu_addr, get_order(size)); | ||
} | ||
|
||
#endif /* _ASM_X86_XEN_PAGE_COHERENT_H */ |