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
  35struct page *kmap_atomic_to_page(void *ptr)
  36{
  37        return virt_to_page(ptr);
  38}
  39
  40void *kmap_atomic(struct page *page)
  41{
  42        unsigned long paddr;
  43        int type;
  44
  45        pagefault_disable();
  46        type = kmap_atomic_idx_push();
  47        paddr = page_to_phys(page);
  48
  49        switch (type) {
  50        /*
  51         * The first 4 primary maps are reserved for architecture code
  52         */
  53        case 0:         return __kmap_atomic_primary(0, paddr, 6);
  54        case 1:         return __kmap_atomic_primary(0, paddr, 7);
  55        case 2:         return __kmap_atomic_primary(0, paddr, 8);
  56        case 3:         return __kmap_atomic_primary(0, paddr, 9);
  57        case 4:         return __kmap_atomic_primary(0, paddr, 10);
  58
  59        case 5 ... 5 + NR_TLB_LINES - 1:
  60                return __kmap_atomic_secondary(type - 5, paddr);
  61
  62        default:
  63                BUG();
  64                return NULL;
  65        }
  66}
  67EXPORT_SYMBOL(kmap_atomic);
  68
  69void __kunmap_atomic(void *kvaddr)
  70{
  71        int type = kmap_atomic_idx();
  72        switch (type) {
  73        case 0:         __kunmap_atomic_primary(0, 6);  break;
  74        case 1:         __kunmap_atomic_primary(0, 7);  break;
  75        case 2:         __kunmap_atomic_primary(0, 8);  break;
  76        case 3:         __kunmap_atomic_primary(0, 9);  break;
  77        case 4:         __kunmap_atomic_primary(0, 10); break;
  78
  79        case 5 ... 5 + NR_TLB_LINES - 1:
  80                __kunmap_atomic_secondary(type - 5, kvaddr);
  81                break;
  82
  83        default:
  84                BUG();
  85        }
  86        kmap_atomic_idx_pop();
  87        pagefault_enable();
  88}
  89EXPORT_SYMBOL(__kunmap_atomic);
  90