linux/arch/frv/mm/highmem.c
<<
>>
Prefs
   1/* highmem.c: arch-specific highmem stuff
   2 *
   3 * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
   4 * Written by David Howells (dhowells@redhat.com)
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License
   8 * as published by the Free Software Foundation; either version
   9 * 2 of the License, or (at your option) any later version.
  10 */
  11#include <linux/highmem.h>
  12#include <linux/module.h>
  13
  14void *kmap(struct page *page)
  15{
  16        might_sleep();
  17        if (!PageHighMem(page))
  18                return page_address(page);
  19        return kmap_high(page);
  20}
  21
  22EXPORT_SYMBOL(kmap);
  23
  24void kunmap(struct page *page)
  25{
  26        if (in_interrupt())
  27                BUG();
  28        if (!PageHighMem(page))
  29                return;
  30        kunmap_high(page);
  31}
  32
  33EXPORT_SYMBOL(kunmap);
  34
  35void *kmap_atomic(struct page *page)
  36{
  37        unsigned long paddr;
  38        int type;
  39
  40        preempt_disable();
  41        pagefault_disable();
  42        type = kmap_atomic_idx_push();
  43        paddr = page_to_phys(page);
  44
  45        switch (type) {
  46        /*
  47         * The first 4 primary maps are reserved for architecture code
  48         */
  49        case 0:         return __kmap_atomic_primary(0, paddr, 6);
  50        case 1:         return __kmap_atomic_primary(0, paddr, 7);
  51        case 2:         return __kmap_atomic_primary(0, paddr, 8);
  52        case 3:         return __kmap_atomic_primary(0, paddr, 9);
  53        case 4:         return __kmap_atomic_primary(0, paddr, 10);
  54
  55        case 5 ... 5 + NR_TLB_LINES - 1:
  56                return __kmap_atomic_secondary(type - 5, paddr);
  57
  58        default:
  59                BUG();
  60                return NULL;
  61        }
  62}
  63EXPORT_SYMBOL(kmap_atomic);
  64
  65void __kunmap_atomic(void *kvaddr)
  66{
  67        int type = kmap_atomic_idx();
  68        switch (type) {
  69        case 0:         __kunmap_atomic_primary(0, 6);  break;
  70        case 1:         __kunmap_atomic_primary(0, 7);  break;
  71        case 2:         __kunmap_atomic_primary(0, 8);  break;
  72        case 3:         __kunmap_atomic_primary(0, 9);  break;
  73        case 4:         __kunmap_atomic_primary(0, 10); break;
  74
  75        case 5 ... 5 + NR_TLB_LINES - 1:
  76                __kunmap_atomic_secondary(type - 5, kvaddr);
  77                break;
  78
  79        default:
  80                BUG();
  81        }
  82        kmap_atomic_idx_pop();
  83        pagefault_enable();
  84        preempt_enable();
  85}
  86EXPORT_SYMBOL(__kunmap_atomic);
  87