Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 
0003 #ifndef __ASM_CSKY_PAGE_H
0004 #define __ASM_CSKY_PAGE_H
0005 
0006 #include <asm/setup.h>
0007 #include <asm/cache.h>
0008 #include <linux/const.h>
0009 
0010 /*
0011  * PAGE_SHIFT determines the page size: 4KB
0012  */
0013 #define PAGE_SHIFT  12
0014 #define PAGE_SIZE   (_AC(1, UL) << PAGE_SHIFT)
0015 #define PAGE_MASK   (~(PAGE_SIZE - 1))
0016 #define THREAD_SIZE (PAGE_SIZE * 2)
0017 #define THREAD_MASK (~(THREAD_SIZE - 1))
0018 #define THREAD_SHIFT    (PAGE_SHIFT + 1)
0019 
0020 
0021 /*
0022  * For C-SKY "User-space:Kernel-space" is "2GB:2GB" fixed by hardware and there
0023  * are two segment registers (MSA0 + MSA1) to mapping 512MB + 512MB physical
0024  * address region. We use them mapping kernel 1GB direct-map address area and
0025  * for more than 1GB of memory we use highmem.
0026  */
0027 #define PAGE_OFFSET CONFIG_PAGE_OFFSET
0028 #define SSEG_SIZE   0x20000000
0029 #define LOWMEM_LIMIT    (SSEG_SIZE * 2)
0030 
0031 #define PHYS_OFFSET_OFFSET (CONFIG_DRAM_BASE & (SSEG_SIZE - 1))
0032 
0033 #ifndef __ASSEMBLY__
0034 
0035 #include <linux/pfn.h>
0036 
0037 #define virt_to_pfn(kaddr)      (__pa(kaddr) >> PAGE_SHIFT)
0038 #define pfn_to_virt(pfn)        __va((pfn) << PAGE_SHIFT)
0039 
0040 #define virt_addr_valid(kaddr)  ((void *)(kaddr) >= (void *)PAGE_OFFSET && \
0041             (void *)(kaddr) < high_memory)
0042 #define pfn_valid(pfn)      ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
0043 
0044 extern void *memset(void *dest, int c, size_t l);
0045 extern void *memcpy(void *to, const void *from, size_t l);
0046 
0047 #define clear_page(page)    memset((page), 0, PAGE_SIZE)
0048 #define copy_page(to, from) memcpy((to), (from), PAGE_SIZE)
0049 
0050 #define page_to_phys(page)  (page_to_pfn(page) << PAGE_SHIFT)
0051 #define phys_to_page(paddr) (pfn_to_page(PFN_DOWN(paddr)))
0052 
0053 struct page;
0054 
0055 #include <abi/page.h>
0056 
0057 struct vm_area_struct;
0058 
0059 typedef struct { unsigned long pte_low; } pte_t;
0060 #define pte_val(x)  ((x).pte_low)
0061 
0062 typedef struct { unsigned long pgd; } pgd_t;
0063 typedef struct { unsigned long pgprot; } pgprot_t;
0064 typedef struct page *pgtable_t;
0065 
0066 #define pgd_val(x)  ((x).pgd)
0067 #define pgprot_val(x)   ((x).pgprot)
0068 
0069 #define ptep_buddy(x)   ((pte_t *)((unsigned long)(x) ^ sizeof(pte_t)))
0070 
0071 #define __pte(x)    ((pte_t) { (x) })
0072 #define __pgd(x)    ((pgd_t) { (x) })
0073 #define __pgprot(x) ((pgprot_t) { (x) })
0074 
0075 extern unsigned long va_pa_offset;
0076 
0077 #define ARCH_PFN_OFFSET PFN_DOWN(va_pa_offset + PHYS_OFFSET_OFFSET)
0078 
0079 #define __pa(x)      ((unsigned long)(x) - PAGE_OFFSET + va_pa_offset)
0080 #define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - va_pa_offset))
0081 
0082 #define __pa_symbol(x)  __pa(RELOC_HIDE((unsigned long)(x), 0))
0083 
0084 #define MAP_NR(x)   PFN_DOWN((unsigned long)(x) - PAGE_OFFSET - \
0085                  PHYS_OFFSET_OFFSET)
0086 #define virt_to_page(x) (mem_map + MAP_NR(x))
0087 
0088 #define pfn_to_kaddr(x) __va(PFN_PHYS(x))
0089 
0090 #include <asm-generic/memory_model.h>
0091 #include <asm-generic/getorder.h>
0092 
0093 #endif /* !__ASSEMBLY__ */
0094 #endif /* __ASM_CSKY_PAGE_H */