linux/arch/sparc/include/asm/highmem.h
<<
>>
Prefs
   1/*
   2 * highmem.h: virtual kernel memory mappings for high memory
   3 *
   4 * Used in CONFIG_HIGHMEM systems for memory pages which
   5 * are not addressable by direct kernel virtual addresses.
   6 *
   7 * Copyright (C) 1999 Gerhard Wichert, Siemens AG
   8 *                    Gerhard.Wichert@pdb.siemens.de
   9 *
  10 *
  11 * Redesigned the x86 32-bit VM architecture to deal with 
  12 * up to 16 Terrabyte physical memory. With current x86 CPUs
  13 * we now support up to 64 Gigabytes physical RAM.
  14 *
  15 * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
  16 */
  17
  18#ifndef _ASM_HIGHMEM_H
  19#define _ASM_HIGHMEM_H
  20
  21#ifdef __KERNEL__
  22
  23#include <linux/interrupt.h>
  24#include <asm/vaddrs.h>
  25#include <asm/kmap_types.h>
  26#include <asm/pgtable.h>
  27
  28/* declarations for highmem.c */
  29extern unsigned long highstart_pfn, highend_pfn;
  30
  31extern pgprot_t kmap_prot;
  32extern pte_t *pkmap_page_table;
  33
  34void kmap_init(void) __init;
  35
  36/*
  37 * Right now we initialize only a single pte table. It can be extended
  38 * easily, subsequent pte tables have to be allocated in one physical
  39 * chunk of RAM.  Currently the simplest way to do this is to align the
  40 * pkmap region on a pagetable boundary (4MB).
  41 */
  42#define LAST_PKMAP 1024
  43#define PKMAP_SIZE (LAST_PKMAP << PAGE_SHIFT)
  44#define PKMAP_BASE PMD_ALIGN(SRMMU_NOCACHE_VADDR + (SRMMU_MAX_NOCACHE_PAGES << PAGE_SHIFT))
  45
  46#define LAST_PKMAP_MASK (LAST_PKMAP - 1)
  47#define PKMAP_NR(virt)  ((virt - PKMAP_BASE) >> PAGE_SHIFT)
  48#define PKMAP_ADDR(nr)  (PKMAP_BASE + ((nr) << PAGE_SHIFT))
  49
  50#define PKMAP_END (PKMAP_ADDR(LAST_PKMAP))
  51
  52void *kmap_high(struct page *page);
  53void kunmap_high(struct page *page);
  54
  55static inline void *kmap(struct page *page)
  56{
  57        BUG_ON(in_interrupt());
  58        if (!PageHighMem(page))
  59                return page_address(page);
  60        return kmap_high(page);
  61}
  62
  63static inline void kunmap(struct page *page)
  64{
  65        BUG_ON(in_interrupt());
  66        if (!PageHighMem(page))
  67                return;
  68        kunmap_high(page);
  69}
  70
  71void *kmap_atomic(struct page *page);
  72void __kunmap_atomic(void *kvaddr);
  73
  74#define flush_cache_kmaps()     flush_cache_all()
  75
  76#endif /* __KERNEL__ */
  77
  78#endif /* _ASM_HIGHMEM_H */
  79