Linux Audio

Check our new training course

Loading...
v6.8
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _M68K_PAGE_MM_H
  3#define _M68K_PAGE_MM_H
  4
  5#ifndef __ASSEMBLY__
  6
  7#include <linux/compiler.h>
  8#include <asm/module.h>
  9
 10/*
 11 * We don't need to check for alignment etc.
 12 */
 13#ifdef CPU_M68040_OR_M68060_ONLY
 14static inline void copy_page(void *to, void *from)
 15{
 16	unsigned long tmp;
 17
 18	__asm__ __volatile__("1:\t"
 19			     ".chip 68040\n\t"
 20			     "move16 %1@+,%0@+\n\t"
 21			     "move16 %1@+,%0@+\n\t"
 22			     ".chip 68k\n\t"
 23			     "dbra  %2,1b\n\t"
 24			     : "=a" (to), "=a" (from), "=d" (tmp)
 25			     : "0" (to), "1" (from), "2" (PAGE_SIZE / 32 - 1));
 
 26}
 27
 28static inline void clear_page(void *page)
 29{
 30	unsigned long tmp;
 31	unsigned long *sp = page;
 32
 33	*sp++ = 0;
 34	*sp++ = 0;
 35	*sp++ = 0;
 36	*sp++ = 0;
 37
 38	__asm__ __volatile__("1:\t"
 39			     ".chip 68040\n\t"
 40			     "move16 %2@+,%0@+\n\t"
 41			     ".chip 68k\n\t"
 42			     "subqw  #8,%2\n\t"
 43			     "subqw  #8,%2\n\t"
 44			     "dbra   %1,1b\n\t"
 45			     : "=a" (sp), "=d" (tmp)
 46			     : "a" (page), "0" (sp),
 47			       "1" ((PAGE_SIZE - 16) / 16 - 1));
 48}
 49
 50#else
 51#define clear_page(page)	memset((page), 0, PAGE_SIZE)
 52#define copy_page(to,from)	memcpy((to), (from), PAGE_SIZE)
 53#endif
 54
 55#define clear_user_page(addr, vaddr, page)	\
 56	do {	clear_page(addr);		\
 57		flush_dcache_page(page);	\
 58	} while (0)
 59#define copy_user_page(to, from, vaddr, page)	\
 60	do {	copy_page(to, from);		\
 61		flush_dcache_page(page);	\
 62	} while (0)
 63
 64extern unsigned long m68k_memoffset;
 65
 66#ifndef CONFIG_SUN3
 67
 68#define WANT_PAGE_VIRTUAL
 69
 70static inline unsigned long ___pa(void *vaddr)
 71{
 72	unsigned long paddr;
 73	asm (
 74		"1:	addl #0,%0\n"
 75		m68k_fixup(%c2, 1b+2)
 76		: "=r" (paddr)
 77		: "0" (vaddr), "i" (m68k_fixup_memoffset));
 78	return paddr;
 79}
 80#define __pa(vaddr)	___pa((void *)(long)(vaddr))
 81static inline void *__va(unsigned long paddr)
 82{
 83	void *vaddr;
 84	asm (
 85		"1:	subl #0,%0\n"
 86		m68k_fixup(%c2, 1b+2)
 87		: "=r" (vaddr)
 88		: "0" (paddr), "i" (m68k_fixup_memoffset));
 89	return vaddr;
 90}
 91
 92#else	/* !CONFIG_SUN3 */
 93/* This #define is a horrible hack to suppress lots of warnings. --m */
 94#define __pa(x) ___pa((unsigned long)(x))
 95static inline unsigned long ___pa(unsigned long x)
 96{
 97	if (x == 0)
 98		return 0;
 99	if (x >= PAGE_OFFSET)
100		return (x - PAGE_OFFSET);
101	else
102		return (x + 0x2000000);
103}
104
105static inline void *__va(unsigned long x)
106{
107	if (x == 0)
108		return (void *)0;
109
110	if (x < 0x2000000)
111		return (void *)(x + PAGE_OFFSET);
112	else
113		return (void *)(x - 0x2000000);
114}
115#endif	/* CONFIG_SUN3 */
116
117/*
118 * NOTE: virtual isn't really correct, actually it should be the offset into the
119 * memory node, but we have no highmem, so that works for now.
120 * TODO: implement (fast) pfn<->pgdat_idx conversion functions, this makes lots
121 * of the shifts unnecessary.
122 */
123static inline unsigned long virt_to_pfn(const void *kaddr)
124{
125	return __pa(kaddr) >> PAGE_SHIFT;
126}
127
128static inline void *pfn_to_virt(unsigned long pfn)
129{
130	return __va(pfn << PAGE_SHIFT);
131}
132
133extern int m68k_virt_to_node_shift;
134
135#define virt_to_page(addr) ({						\
136	pfn_to_page(virt_to_pfn(addr));					\
137})
138#define page_to_virt(page) ({						\
139	pfn_to_virt(page_to_pfn(page));					\
140})
141
142#define ARCH_PFN_OFFSET (m68k_memory[0].addr >> PAGE_SHIFT)
 
143
144#define virt_addr_valid(kaddr)	((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)
145#define pfn_valid(pfn)		virt_addr_valid(pfn_to_virt(pfn))
146
147#endif /* __ASSEMBLY__ */
148
149#endif /* _M68K_PAGE_MM_H */
v5.14.15
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _M68K_PAGE_MM_H
  3#define _M68K_PAGE_MM_H
  4
  5#ifndef __ASSEMBLY__
  6
  7#include <linux/compiler.h>
  8#include <asm/module.h>
  9
 10/*
 11 * We don't need to check for alignment etc.
 12 */
 13#ifdef CPU_M68040_OR_M68060_ONLY
 14static inline void copy_page(void *to, void *from)
 15{
 16  unsigned long tmp;
 17
 18  __asm__ __volatile__("1:\t"
 19		       ".chip 68040\n\t"
 20		       "move16 %1@+,%0@+\n\t"
 21		       "move16 %1@+,%0@+\n\t"
 22		       ".chip 68k\n\t"
 23		       "dbra  %2,1b\n\t"
 24		       : "=a" (to), "=a" (from), "=d" (tmp)
 25		       : "0" (to), "1" (from) , "2" (PAGE_SIZE / 32 - 1)
 26		       );
 27}
 28
 29static inline void clear_page(void *page)
 30{
 31	unsigned long tmp;
 32	unsigned long *sp = page;
 33
 34	*sp++ = 0;
 35	*sp++ = 0;
 36	*sp++ = 0;
 37	*sp++ = 0;
 38
 39	__asm__ __volatile__("1:\t"
 40			     ".chip 68040\n\t"
 41			     "move16 %2@+,%0@+\n\t"
 42			     ".chip 68k\n\t"
 43			     "subqw  #8,%2\n\t"
 44			     "subqw  #8,%2\n\t"
 45			     "dbra   %1,1b\n\t"
 46			     : "=a" (sp), "=d" (tmp)
 47			     : "a" (page), "0" (sp),
 48			       "1" ((PAGE_SIZE - 16) / 16 - 1));
 49}
 50
 51#else
 52#define clear_page(page)	memset((page), 0, PAGE_SIZE)
 53#define copy_page(to,from)	memcpy((to), (from), PAGE_SIZE)
 54#endif
 55
 56#define clear_user_page(addr, vaddr, page)	\
 57	do {	clear_page(addr);		\
 58		flush_dcache_page(page);	\
 59	} while (0)
 60#define copy_user_page(to, from, vaddr, page)	\
 61	do {	copy_page(to, from);		\
 62		flush_dcache_page(page);	\
 63	} while (0)
 64
 65extern unsigned long m68k_memoffset;
 66
 67#ifndef CONFIG_SUN3
 68
 69#define WANT_PAGE_VIRTUAL
 70
 71static inline unsigned long ___pa(void *vaddr)
 72{
 73	unsigned long paddr;
 74	asm (
 75		"1:	addl #0,%0\n"
 76		m68k_fixup(%c2, 1b+2)
 77		: "=r" (paddr)
 78		: "0" (vaddr), "i" (m68k_fixup_memoffset));
 79	return paddr;
 80}
 81#define __pa(vaddr)	___pa((void *)(long)(vaddr))
 82static inline void *__va(unsigned long paddr)
 83{
 84	void *vaddr;
 85	asm (
 86		"1:	subl #0,%0\n"
 87		m68k_fixup(%c2, 1b+2)
 88		: "=r" (vaddr)
 89		: "0" (paddr), "i" (m68k_fixup_memoffset));
 90	return vaddr;
 91}
 92
 93#else	/* !CONFIG_SUN3 */
 94/* This #define is a horrible hack to suppress lots of warnings. --m */
 95#define __pa(x) ___pa((unsigned long)(x))
 96static inline unsigned long ___pa(unsigned long x)
 97{
 98     if(x == 0)
 99	  return 0;
100     if(x >= PAGE_OFFSET)
101        return (x-PAGE_OFFSET);
102     else
103        return (x+0x2000000);
104}
105
106static inline void *__va(unsigned long x)
107{
108     if(x == 0)
109	  return (void *)0;
110
111     if(x < 0x2000000)
112        return (void *)(x+PAGE_OFFSET);
113     else
114        return (void *)(x-0x2000000);
115}
116#endif	/* CONFIG_SUN3 */
117
118/*
119 * NOTE: virtual isn't really correct, actually it should be the offset into the
120 * memory node, but we have no highmem, so that works for now.
121 * TODO: implement (fast) pfn<->pgdat_idx conversion functions, this makes lots
122 * of the shifts unnecessary.
123 */
124#define virt_to_pfn(kaddr)	(__pa(kaddr) >> PAGE_SHIFT)
125#define pfn_to_virt(pfn)	__va((pfn) << PAGE_SHIFT)
 
 
 
 
 
 
 
126
127extern int m68k_virt_to_node_shift;
128
129#define virt_to_page(addr) ({						\
130	pfn_to_page(virt_to_pfn(addr));					\
131})
132#define page_to_virt(page) ({						\
133	pfn_to_virt(page_to_pfn(page));					\
134})
135
136#define ARCH_PFN_OFFSET (m68k_memory[0].addr >> PAGE_SHIFT)
137#include <asm-generic/memory_model.h>
138
139#define virt_addr_valid(kaddr)	((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)
140#define pfn_valid(pfn)		virt_addr_valid(pfn_to_virt(pfn))
141
142#endif /* __ASSEMBLY__ */
143
144#endif /* _M68K_PAGE_MM_H */