linux/arch/s390/include/asm/page.h
<<
>>
Prefs
   1/*
   2 *  include/asm-s390/page.h
   3 *
   4 *  S390 version
   5 *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
   6 *    Author(s): Hartmut Penner (hp@de.ibm.com)
   7 */
   8
   9#ifndef _S390_PAGE_H
  10#define _S390_PAGE_H
  11
  12#include <linux/const.h>
  13#include <asm/types.h>
  14
  15/* PAGE_SHIFT determines the page size */
  16#define PAGE_SHIFT      12
  17#define PAGE_SIZE       (_AC(1,UL) << PAGE_SHIFT)
  18#define PAGE_MASK       (~(PAGE_SIZE-1))
  19#define PAGE_DEFAULT_ACC        0
  20#define PAGE_DEFAULT_KEY        (PAGE_DEFAULT_ACC << 4)
  21
  22#define HPAGE_SHIFT     20
  23#define HPAGE_SIZE      (1UL << HPAGE_SHIFT)
  24#define HPAGE_MASK      (~(HPAGE_SIZE - 1))
  25#define HUGETLB_PAGE_ORDER      (HPAGE_SHIFT - PAGE_SHIFT)
  26
  27#define ARCH_HAS_SETCLEAR_HUGE_PTE
  28#define ARCH_HAS_HUGE_PTE_TYPE
  29#define ARCH_HAS_PREPARE_HUGEPAGE
  30#define ARCH_HAS_HUGEPAGE_CLEAR_FLUSH
  31
  32#include <asm/setup.h>
  33#ifndef __ASSEMBLY__
  34
  35static inline void clear_page(void *page)
  36{
  37        if (MACHINE_HAS_PFMF) {
  38                asm volatile(
  39                        "       .insn   rre,0xb9af0000,%0,%1"
  40                        : : "d" (0x10000), "a" (page) : "memory", "cc");
  41        } else {
  42                register unsigned long reg1 asm ("1") = 0;
  43                register void *reg2 asm ("2") = page;
  44                register unsigned long reg3 asm ("3") = 4096;
  45                asm volatile(
  46                        "       mvcl    2,0"
  47                        : "+d" (reg2), "+d" (reg3) : "d" (reg1)
  48                        : "memory", "cc");
  49        }
  50}
  51
  52static inline void copy_page(void *to, void *from)
  53{
  54        if (MACHINE_HAS_MVPG) {
  55                register unsigned long reg0 asm ("0") = 0;
  56                asm volatile(
  57                        "       mvpg    %0,%1"
  58                        : : "a" (to), "a" (from), "d" (reg0)
  59                        : "memory", "cc");
  60        } else
  61                asm volatile(
  62                        "       mvc     0(256,%0),0(%1)\n"
  63                        "       mvc     256(256,%0),256(%1)\n"
  64                        "       mvc     512(256,%0),512(%1)\n"
  65                        "       mvc     768(256,%0),768(%1)\n"
  66                        "       mvc     1024(256,%0),1024(%1)\n"
  67                        "       mvc     1280(256,%0),1280(%1)\n"
  68                        "       mvc     1536(256,%0),1536(%1)\n"
  69                        "       mvc     1792(256,%0),1792(%1)\n"
  70                        "       mvc     2048(256,%0),2048(%1)\n"
  71                        "       mvc     2304(256,%0),2304(%1)\n"
  72                        "       mvc     2560(256,%0),2560(%1)\n"
  73                        "       mvc     2816(256,%0),2816(%1)\n"
  74                        "       mvc     3072(256,%0),3072(%1)\n"
  75                        "       mvc     3328(256,%0),3328(%1)\n"
  76                        "       mvc     3584(256,%0),3584(%1)\n"
  77                        "       mvc     3840(256,%0),3840(%1)\n"
  78                        : : "a" (to), "a" (from) : "memory");
  79}
  80
  81#define clear_user_page(page, vaddr, pg)        clear_page(page)
  82#define copy_user_page(to, from, vaddr, pg)     copy_page(to, from)
  83
  84#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
  85        alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr)
  86#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
  87
  88/*
  89 * These are used to make use of C type-checking..
  90 */
  91
  92typedef struct { unsigned long pgprot; } pgprot_t;
  93typedef struct { unsigned long pte; } pte_t;
  94typedef struct { unsigned long pmd; } pmd_t;
  95typedef struct { unsigned long pud; } pud_t;
  96typedef struct { unsigned long pgd; } pgd_t;
  97typedef pte_t *pgtable_t;
  98
  99#define pgprot_val(x)   ((x).pgprot)
 100#define pte_val(x)      ((x).pte)
 101#define pmd_val(x)      ((x).pmd)
 102#define pud_val(x)      ((x).pud)
 103#define pgd_val(x)      ((x).pgd)
 104
 105#define __pte(x)        ((pte_t) { (x) } )
 106#define __pmd(x)        ((pmd_t) { (x) } )
 107#define __pgd(x)        ((pgd_t) { (x) } )
 108#define __pgprot(x)     ((pgprot_t) { (x) } )
 109
 110static inline void
 111page_set_storage_key(unsigned long addr, unsigned int skey, int mapped)
 112{
 113        if (!mapped)
 114                asm volatile(".insn rrf,0xb22b0000,%0,%1,8,0"
 115                             : : "d" (skey), "a" (addr));
 116        else
 117                asm volatile("sske %0,%1" : : "d" (skey), "a" (addr));
 118}
 119
 120static inline unsigned int
 121page_get_storage_key(unsigned long addr)
 122{
 123        unsigned int skey;
 124
 125        asm volatile("iske %0,%1" : "=d" (skey) : "a" (addr), "0" (0));
 126        return skey;
 127}
 128
 129struct page;
 130void arch_free_page(struct page *page, int order);
 131void arch_alloc_page(struct page *page, int order);
 132
 133static inline int devmem_is_allowed(unsigned long pfn)
 134{
 135        return 0;
 136}
 137
 138#define HAVE_ARCH_FREE_PAGE
 139#define HAVE_ARCH_ALLOC_PAGE
 140
 141#endif /* !__ASSEMBLY__ */
 142
 143#define __PAGE_OFFSET           0x0UL
 144#define PAGE_OFFSET             0x0UL
 145#define __pa(x)                 (unsigned long)(x)
 146#define __va(x)                 (void *)(unsigned long)(x)
 147#define virt_to_page(kaddr)     pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 148#define page_to_phys(page)      (page_to_pfn(page) << PAGE_SHIFT)
 149#define virt_addr_valid(kaddr)  pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
 150
 151#define VM_DATA_DEFAULT_FLAGS   (VM_READ | VM_WRITE | \
 152                                 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 153
 154#include <asm-generic/memory_model.h>
 155#include <asm-generic/getorder.h>
 156
 157#define __HAVE_ARCH_GATE_AREA 1
 158
 159#endif /* _S390_PAGE_H */
 160