Linux Audio

Check our new training course

Loading...
v5.4
1#include <xen/arm/page.h>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
v3.15
  1#ifndef _ASM_ARM_XEN_PAGE_H
  2#define _ASM_ARM_XEN_PAGE_H
  3
  4#include <asm/page.h>
  5#include <asm/pgtable.h>
  6
  7#include <linux/pfn.h>
  8#include <linux/types.h>
  9#include <linux/dma-mapping.h>
 10
 11#include <xen/xen.h>
 12#include <xen/interface/grant_table.h>
 13
 14#define phys_to_machine_mapping_valid(pfn) (1)
 15#define mfn_to_virt(m)			(__va(mfn_to_pfn(m) << PAGE_SHIFT))
 16
 17#define pte_mfn	    pte_pfn
 18#define mfn_pte	    pfn_pte
 19
 20/* Xen machine address */
 21typedef struct xmaddr {
 22	phys_addr_t maddr;
 23} xmaddr_t;
 24
 25/* Xen pseudo-physical address */
 26typedef struct xpaddr {
 27	phys_addr_t paddr;
 28} xpaddr_t;
 29
 30#define XMADDR(x)	((xmaddr_t) { .maddr = (x) })
 31#define XPADDR(x)	((xpaddr_t) { .paddr = (x) })
 32
 33#define INVALID_P2M_ENTRY      (~0UL)
 34
 35unsigned long __pfn_to_mfn(unsigned long pfn);
 36unsigned long __mfn_to_pfn(unsigned long mfn);
 37extern struct rb_root phys_to_mach;
 38
 39static inline unsigned long pfn_to_mfn(unsigned long pfn)
 40{
 41	unsigned long mfn;
 42
 43	if (phys_to_mach.rb_node != NULL) {
 44		mfn = __pfn_to_mfn(pfn);
 45		if (mfn != INVALID_P2M_ENTRY)
 46			return mfn;
 47	}
 48
 49	return pfn;
 50}
 51
 52static inline unsigned long mfn_to_pfn(unsigned long mfn)
 53{
 54	unsigned long pfn;
 55
 56	if (phys_to_mach.rb_node != NULL) {
 57		pfn = __mfn_to_pfn(mfn);
 58		if (pfn != INVALID_P2M_ENTRY)
 59			return pfn;
 60	}
 61
 62	return mfn;
 63}
 64
 65#define mfn_to_local_pfn(mfn) mfn_to_pfn(mfn)
 66
 67static inline xmaddr_t phys_to_machine(xpaddr_t phys)
 68{
 69	unsigned offset = phys.paddr & ~PAGE_MASK;
 70	return XMADDR(PFN_PHYS(pfn_to_mfn(PFN_DOWN(phys.paddr))) | offset);
 71}
 72
 73static inline xpaddr_t machine_to_phys(xmaddr_t machine)
 74{
 75	unsigned offset = machine.maddr & ~PAGE_MASK;
 76	return XPADDR(PFN_PHYS(mfn_to_pfn(PFN_DOWN(machine.maddr))) | offset);
 77}
 78/* VIRT <-> MACHINE conversion */
 79#define virt_to_machine(v)	(phys_to_machine(XPADDR(__pa(v))))
 80#define virt_to_mfn(v)		(pfn_to_mfn(virt_to_pfn(v)))
 81#define mfn_to_virt(m)		(__va(mfn_to_pfn(m) << PAGE_SHIFT))
 82
 83static inline xmaddr_t arbitrary_virt_to_machine(void *vaddr)
 84{
 85	/* TODO: assuming it is mapped in the kernel 1:1 */
 86	return virt_to_machine(vaddr);
 87}
 88
 89/* TODO: this shouldn't be here but it is because the frontend drivers
 90 * are using it (its rolled in headers) even though we won't hit the code path.
 91 * So for right now just punt with this.
 92 */
 93static inline pte_t *lookup_address(unsigned long address, unsigned int *level)
 94{
 95	BUG();
 96	return NULL;
 97}
 98
 99extern int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
100				   struct gnttab_map_grant_ref *kmap_ops,
101				   struct page **pages, unsigned int count);
102
103extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops,
104				     struct gnttab_map_grant_ref *kmap_ops,
105				     struct page **pages, unsigned int count);
106
107bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn);
108bool __set_phys_to_machine_multi(unsigned long pfn, unsigned long mfn,
109		unsigned long nr_pages);
110
111static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn)
112{
113	return __set_phys_to_machine(pfn, mfn);
114}
115
116#define xen_remap(cookie, size) ioremap_cache((cookie), (size))
117#define xen_unmap(cookie) iounmap((cookie))
118
119#endif /* _ASM_ARM_XEN_PAGE_H */