Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) #ifndef _ASM_ARM_XEN_PAGE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) #define _ASM_ARM_XEN_PAGE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <linux/pfn.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/dma-mapping.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/pgtable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <xen/xen.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <xen/interface/grant_table.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #define phys_to_machine_mapping_valid(pfn) (1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) /* Xen machine address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) typedef struct xmaddr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	phys_addr_t maddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) } xmaddr_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) /* Xen pseudo-physical address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) typedef struct xpaddr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	phys_addr_t paddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) } xpaddr_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #define XMADDR(x)	((xmaddr_t) { .maddr = (x) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #define XPADDR(x)	((xpaddr_t) { .paddr = (x) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define INVALID_P2M_ENTRY      (~0UL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  * The pseudo-physical frame (pfn) used in all the helpers is always based
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  * on Xen page granularity (i.e 4KB).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  * A Linux page may be split across multiple non-contiguous Xen page so we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  * have to keep track with frame based on 4KB page granularity.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  * PV drivers should never make a direct usage of those helpers (particularly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40)  * pfn_to_gfn and gfn_to_pfn).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) unsigned long __pfn_to_mfn(unsigned long pfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) extern struct rb_root phys_to_mach;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) /* Pseudo-physical <-> Guest conversion */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) static inline unsigned long pfn_to_gfn(unsigned long pfn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	return pfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) static inline unsigned long gfn_to_pfn(unsigned long gfn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	return gfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) /* Pseudo-physical <-> BUS conversion */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) static inline unsigned long pfn_to_bfn(unsigned long pfn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	unsigned long mfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	if (phys_to_mach.rb_node != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 		mfn = __pfn_to_mfn(pfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 		if (mfn != INVALID_P2M_ENTRY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 			return mfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	return pfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) static inline unsigned long bfn_to_pfn(unsigned long bfn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	return bfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) #define bfn_to_local_pfn(bfn)	bfn_to_pfn(bfn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) /* VIRT <-> GUEST conversion */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) #define virt_to_gfn(v)                                                         \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	({                                                                     \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		WARN_ON_ONCE(!virt_addr_valid(v));                              \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		pfn_to_gfn(virt_to_phys(v) >> XEN_PAGE_SHIFT);                 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	})
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) #define gfn_to_virt(m)		(__va(gfn_to_pfn(m) << XEN_PAGE_SHIFT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) #define percpu_to_gfn(v)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	(pfn_to_gfn(per_cpu_ptr_to_phys(v) >> XEN_PAGE_SHIFT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) /* Only used in PV code. But ARM guests are always HVM. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) static inline xmaddr_t arbitrary_virt_to_machine(void *vaddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) extern int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 				   struct gnttab_map_grant_ref *kmap_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 				   struct page **pages, unsigned int count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 				     struct gnttab_unmap_grant_ref *kunmap_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 				     struct page **pages, unsigned int count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) bool __set_phys_to_machine_multi(unsigned long pfn, unsigned long mfn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 		unsigned long nr_pages);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	return __set_phys_to_machine(pfn, mfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define xen_remap(cookie, size) ioremap_cache((cookie), (size))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define xen_unmap(cookie) iounmap((cookie))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) bool xen_arch_need_swiotlb(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 			   phys_addr_t phys,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 			   dma_addr_t dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) unsigned long xen_get_swiotlb_free_pages(unsigned int order);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #endif /* _ASM_ARM_XEN_PAGE_H */