162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * page.h:  Various defines and such for MMU operations on the Sparc for
462306a36Sopenharmony_ci *          the Linux kernel.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef _SPARC_PAGE_H
1062306a36Sopenharmony_ci#define _SPARC_PAGE_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/const.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define PAGE_SHIFT   12
1562306a36Sopenharmony_ci#define PAGE_SIZE    (_AC(1, UL) << PAGE_SHIFT)
1662306a36Sopenharmony_ci#define PAGE_MASK    (~(PAGE_SIZE-1))
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#ifndef __ASSEMBLY__
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define clear_page(page)	 memset((void *)(page), 0, PAGE_SIZE)
2162306a36Sopenharmony_ci#define copy_page(to,from) 	memcpy((void *)(to), (void *)(from), PAGE_SIZE)
2262306a36Sopenharmony_ci#define clear_user_page(addr, vaddr, page)	\
2362306a36Sopenharmony_ci	do { 	clear_page(addr);		\
2462306a36Sopenharmony_ci		sparc_flush_page_to_ram(page);	\
2562306a36Sopenharmony_ci	} while (0)
2662306a36Sopenharmony_ci#define copy_user_page(to, from, vaddr, page)	\
2762306a36Sopenharmony_ci	do {	copy_page(to, from);		\
2862306a36Sopenharmony_ci		sparc_flush_page_to_ram(page);	\
2962306a36Sopenharmony_ci	} while (0)
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/* The following structure is used to hold the physical
3262306a36Sopenharmony_ci * memory configuration of the machine.  This is filled in
3362306a36Sopenharmony_ci * prom_meminit() and is later used by mem_init() to set up
3462306a36Sopenharmony_ci * mem_map[].  We statically allocate SPARC_PHYS_BANKS+1 of
3562306a36Sopenharmony_ci * these structs, this is arbitrary.  The entry after the
3662306a36Sopenharmony_ci * last valid one has num_bytes==0.
3762306a36Sopenharmony_ci */
3862306a36Sopenharmony_cistruct sparc_phys_banks {
3962306a36Sopenharmony_ci  unsigned long base_addr;
4062306a36Sopenharmony_ci  unsigned long num_bytes;
4162306a36Sopenharmony_ci};
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define SPARC_PHYS_BANKS 32
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ciextern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS+1];
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/* passing structs on the Sparc slow us down tremendously... */
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/* #define STRICT_MM_TYPECHECKS */
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#ifdef STRICT_MM_TYPECHECKS
5262306a36Sopenharmony_ci/*
5362306a36Sopenharmony_ci * These are used to make use of C type-checking..
5462306a36Sopenharmony_ci */
5562306a36Sopenharmony_citypedef struct { unsigned long pte; } pte_t;
5662306a36Sopenharmony_citypedef struct { unsigned long iopte; } iopte_t;
5762306a36Sopenharmony_citypedef struct { unsigned long pmd; } pmd_t;
5862306a36Sopenharmony_citypedef struct { unsigned long pgd; } pgd_t;
5962306a36Sopenharmony_citypedef struct { unsigned long ctxd; } ctxd_t;
6062306a36Sopenharmony_citypedef struct { unsigned long pgprot; } pgprot_t;
6162306a36Sopenharmony_citypedef struct { unsigned long iopgprot; } iopgprot_t;
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#define pte_val(x)	((x).pte)
6462306a36Sopenharmony_ci#define iopte_val(x)	((x).iopte)
6562306a36Sopenharmony_ci#define pmd_val(x)      ((x).pmd)
6662306a36Sopenharmony_ci#define pgd_val(x)	((x).pgd)
6762306a36Sopenharmony_ci#define ctxd_val(x)	((x).ctxd)
6862306a36Sopenharmony_ci#define pgprot_val(x)	((x).pgprot)
6962306a36Sopenharmony_ci#define iopgprot_val(x)	((x).iopgprot)
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#define __pte(x)	((pte_t) { (x) } )
7262306a36Sopenharmony_ci#define __pmd(x)	((pmd_t) { { (x) }, })
7362306a36Sopenharmony_ci#define __iopte(x)	((iopte_t) { (x) } )
7462306a36Sopenharmony_ci#define __pgd(x)	((pgd_t) { (x) } )
7562306a36Sopenharmony_ci#define __ctxd(x)	((ctxd_t) { (x) } )
7662306a36Sopenharmony_ci#define __pgprot(x)	((pgprot_t) { (x) } )
7762306a36Sopenharmony_ci#define __iopgprot(x)	((iopgprot_t) { (x) } )
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#else
8062306a36Sopenharmony_ci/*
8162306a36Sopenharmony_ci * .. while these make it easier on the compiler
8262306a36Sopenharmony_ci */
8362306a36Sopenharmony_citypedef unsigned long pte_t;
8462306a36Sopenharmony_citypedef unsigned long iopte_t;
8562306a36Sopenharmony_citypedef unsigned long pmd_t;
8662306a36Sopenharmony_citypedef unsigned long pgd_t;
8762306a36Sopenharmony_citypedef unsigned long ctxd_t;
8862306a36Sopenharmony_citypedef unsigned long pgprot_t;
8962306a36Sopenharmony_citypedef unsigned long iopgprot_t;
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci#define pte_val(x)	(x)
9262306a36Sopenharmony_ci#define iopte_val(x)	(x)
9362306a36Sopenharmony_ci#define pmd_val(x)      (x)
9462306a36Sopenharmony_ci#define pgd_val(x)	(x)
9562306a36Sopenharmony_ci#define ctxd_val(x)	(x)
9662306a36Sopenharmony_ci#define pgprot_val(x)	(x)
9762306a36Sopenharmony_ci#define iopgprot_val(x)	(x)
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci#define __pte(x)	(x)
10062306a36Sopenharmony_ci#define __pmd(x)	(x)
10162306a36Sopenharmony_ci#define __iopte(x)	(x)
10262306a36Sopenharmony_ci#define __pgd(x)	(x)
10362306a36Sopenharmony_ci#define __ctxd(x)	(x)
10462306a36Sopenharmony_ci#define __pgprot(x)	(x)
10562306a36Sopenharmony_ci#define __iopgprot(x)	(x)
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci#endif
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_citypedef pte_t *pgtable_t;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci#define TASK_UNMAPPED_BASE	0x50000000
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci#else /* !(__ASSEMBLY__) */
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci#define __pgprot(x)	(x)
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci#endif /* !(__ASSEMBLY__) */
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci#define PAGE_OFFSET	0xf0000000
12062306a36Sopenharmony_ci#ifndef __ASSEMBLY__
12162306a36Sopenharmony_ciextern unsigned long phys_base;
12262306a36Sopenharmony_ciextern unsigned long pfn_base;
12362306a36Sopenharmony_ci#endif
12462306a36Sopenharmony_ci#define __pa(x)			((unsigned long)(x) - PAGE_OFFSET + phys_base)
12562306a36Sopenharmony_ci#define __va(x)			((void *)((unsigned long) (x) - phys_base + PAGE_OFFSET))
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci#define virt_to_phys		__pa
12862306a36Sopenharmony_ci#define phys_to_virt		__va
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci#define ARCH_PFN_OFFSET		(pfn_base)
13162306a36Sopenharmony_ci#define virt_to_page(kaddr)	pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci#define virt_addr_valid(kaddr)	((((unsigned long)(kaddr)-PAGE_OFFSET)>>PAGE_SHIFT) < max_mapnr)
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci#include <asm-generic/memory_model.h>
13662306a36Sopenharmony_ci#include <asm-generic/getorder.h>
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci#endif /* _SPARC_PAGE_H */
139