162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef __ASM_ARC_PAGE_H
662306a36Sopenharmony_ci#define __ASM_ARC_PAGE_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <uapi/asm/page.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifdef CONFIG_ARC_HAS_PAE40
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define MAX_POSSIBLE_PHYSMEM_BITS	40
1362306a36Sopenharmony_ci#define PAGE_MASK_PHYS			(0xff00000000ull | PAGE_MASK)
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#else /* CONFIG_ARC_HAS_PAE40 */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define MAX_POSSIBLE_PHYSMEM_BITS	32
1862306a36Sopenharmony_ci#define PAGE_MASK_PHYS			PAGE_MASK
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#endif /* CONFIG_ARC_HAS_PAE40 */
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#ifndef __ASSEMBLY__
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define clear_page(paddr)		memset((paddr), 0, PAGE_SIZE)
2562306a36Sopenharmony_ci#define copy_user_page(to, from, vaddr, pg)	copy_page(to, from)
2662306a36Sopenharmony_ci#define copy_page(to, from)		memcpy((to), (from), PAGE_SIZE)
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistruct vm_area_struct;
2962306a36Sopenharmony_cistruct page;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define __HAVE_ARCH_COPY_USER_HIGHPAGE
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_civoid copy_user_highpage(struct page *to, struct page *from,
3462306a36Sopenharmony_ci			unsigned long u_vaddr, struct vm_area_struct *vma);
3562306a36Sopenharmony_civoid clear_user_page(void *to, unsigned long u_vaddr, struct page *page);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_citypedef struct {
3862306a36Sopenharmony_ci	unsigned long pgd;
3962306a36Sopenharmony_ci} pgd_t;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define pgd_val(x)	((x).pgd)
4262306a36Sopenharmony_ci#define __pgd(x)	((pgd_t) { (x) })
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#if CONFIG_PGTABLE_LEVELS > 3
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_citypedef struct {
4762306a36Sopenharmony_ci	unsigned long pud;
4862306a36Sopenharmony_ci} pud_t;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define pud_val(x)      	((x).pud)
5162306a36Sopenharmony_ci#define __pud(x)        	((pud_t) { (x) })
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#endif
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#if CONFIG_PGTABLE_LEVELS > 2
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_citypedef struct {
5862306a36Sopenharmony_ci	unsigned long pmd;
5962306a36Sopenharmony_ci} pmd_t;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define pmd_val(x)	((x).pmd)
6262306a36Sopenharmony_ci#define __pmd(x)	((pmd_t) { (x) })
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#endif
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_citypedef struct {
6762306a36Sopenharmony_ci#ifdef CONFIG_ARC_HAS_PAE40
6862306a36Sopenharmony_ci	unsigned long long pte;
6962306a36Sopenharmony_ci#else
7062306a36Sopenharmony_ci	unsigned long pte;
7162306a36Sopenharmony_ci#endif
7262306a36Sopenharmony_ci} pte_t;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#define pte_val(x)	((x).pte)
7562306a36Sopenharmony_ci#define __pte(x)	((pte_t) { (x) })
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_citypedef struct {
7862306a36Sopenharmony_ci	unsigned long pgprot;
7962306a36Sopenharmony_ci} pgprot_t;
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#define pgprot_val(x)	((x).pgprot)
8262306a36Sopenharmony_ci#define __pgprot(x)	((pgprot_t) { (x) })
8362306a36Sopenharmony_ci#define pte_pgprot(x)	__pgprot(pte_val(x))
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_citypedef struct page *pgtable_t;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci/*
8862306a36Sopenharmony_ci * Use virt_to_pfn with caution:
8962306a36Sopenharmony_ci * If used in pte or paddr related macros, it could cause truncation
9062306a36Sopenharmony_ci * in PAE40 builds
9162306a36Sopenharmony_ci * As a rule of thumb, only use it in helpers starting with virt_
9262306a36Sopenharmony_ci * You have been warned !
9362306a36Sopenharmony_ci */
9462306a36Sopenharmony_ci#define virt_to_pfn(kaddr)	(__pa(kaddr) >> PAGE_SHIFT)
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci/*
9762306a36Sopenharmony_ci * When HIGHMEM is enabled we have holes in the memory map so we need
9862306a36Sopenharmony_ci * pfn_valid() that takes into account the actual extents of the physical
9962306a36Sopenharmony_ci * memory
10062306a36Sopenharmony_ci */
10162306a36Sopenharmony_ci#ifdef CONFIG_HIGHMEM
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ciextern unsigned long arch_pfn_offset;
10462306a36Sopenharmony_ci#define ARCH_PFN_OFFSET		arch_pfn_offset
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ciextern int pfn_valid(unsigned long pfn);
10762306a36Sopenharmony_ci#define pfn_valid		pfn_valid
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci#else /* CONFIG_HIGHMEM */
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci#define ARCH_PFN_OFFSET		virt_to_pfn((void *)CONFIG_LINUX_RAM_BASE)
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci#endif /* CONFIG_HIGHMEM */
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/*
11662306a36Sopenharmony_ci * __pa, __va, virt_to_page (ALERT: deprecated, don't use them)
11762306a36Sopenharmony_ci *
11862306a36Sopenharmony_ci * These macros have historically been misnamed
11962306a36Sopenharmony_ci * virt here means link-address/program-address as embedded in object code.
12062306a36Sopenharmony_ci * And for ARC, link-addr = physical address
12162306a36Sopenharmony_ci */
12262306a36Sopenharmony_ci#define __pa(vaddr)  		((unsigned long)(vaddr))
12362306a36Sopenharmony_ci#define __va(paddr)  		((void *)((unsigned long)(paddr)))
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci#define virt_to_page(kaddr)	pfn_to_page(virt_to_pfn(kaddr))
12662306a36Sopenharmony_ci#define virt_addr_valid(kaddr)  pfn_valid(virt_to_pfn(kaddr))
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci/* Default Permissions for stack/heaps pages (Non Executable) */
12962306a36Sopenharmony_ci#define VM_DATA_DEFAULT_FLAGS	VM_DATA_FLAGS_NON_EXEC
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci#define WANT_PAGE_VIRTUAL   1
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci#include <asm-generic/memory_model.h>   /* page_to_pfn, pfn_to_page */
13462306a36Sopenharmony_ci#include <asm-generic/getorder.h>
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci#endif
139