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