^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 */