hc
2024-10-16 50a212ec906f7524620675f0c57357691c26c81f
kernel/arch/arc/mm/highmem.c
....@@ -1,17 +1,13 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) 2015 Synopsys, Inc. (www.synopsys.com)
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License version 2 as
6
- * published by the Free Software Foundation.
7
- *
84 */
95
10
-#include <linux/bootmem.h>
6
+#include <linux/memblock.h>
117 #include <linux/export.h>
128 #include <linux/highmem.h>
9
+#include <linux/pgtable.h>
1310 #include <asm/processor.h>
14
-#include <asm/pgtable.h>
1511 #include <asm/pgalloc.h>
1612 #include <asm/tlbflush.h>
1713
....@@ -53,38 +49,23 @@
5349 extern pte_t * pkmap_page_table;
5450 static pte_t * fixmap_page_table;
5551
56
-void *kmap(struct page *page)
57
-{
58
- BUG_ON(in_interrupt());
59
- if (!PageHighMem(page))
60
- return page_address(page);
61
-
62
- return kmap_high(page);
63
-}
64
-EXPORT_SYMBOL(kmap);
65
-
66
-void *kmap_atomic(struct page *page)
52
+void *kmap_atomic_high_prot(struct page *page, pgprot_t prot)
6753 {
6854 int idx, cpu_idx;
6955 unsigned long vaddr;
70
-
71
- preempt_disable();
72
- pagefault_disable();
73
- if (!PageHighMem(page))
74
- return page_address(page);
7556
7657 cpu_idx = kmap_atomic_idx_push();
7758 idx = cpu_idx + KM_TYPE_NR * smp_processor_id();
7859 vaddr = FIXMAP_ADDR(idx);
7960
8061 set_pte_at(&init_mm, vaddr, fixmap_page_table + idx,
81
- mk_pte(page, kmap_prot));
62
+ mk_pte(page, prot));
8263
8364 return (void *)vaddr;
8465 }
85
-EXPORT_SYMBOL(kmap_atomic);
66
+EXPORT_SYMBOL(kmap_atomic_high_prot);
8667
87
-void __kunmap_atomic(void *kv)
68
+void kunmap_atomic_high(void *kv)
8869 {
8970 unsigned long kvaddr = (unsigned long)kv;
9071
....@@ -106,24 +87,19 @@
10687
10788 kmap_atomic_idx_pop();
10889 }
109
-
110
- pagefault_enable();
111
- preempt_enable();
11290 }
113
-EXPORT_SYMBOL(__kunmap_atomic);
91
+EXPORT_SYMBOL(kunmap_atomic_high);
11492
11593 static noinline pte_t * __init alloc_kmap_pgtable(unsigned long kvaddr)
11694 {
117
- pgd_t *pgd_k;
118
- pud_t *pud_k;
119
- pmd_t *pmd_k;
95
+ pmd_t *pmd_k = pmd_off_k(kvaddr);
12096 pte_t *pte_k;
12197
122
- pgd_k = pgd_offset_k(kvaddr);
123
- pud_k = pud_offset(pgd_k, kvaddr);
124
- pmd_k = pmd_offset(pud_k, kvaddr);
98
+ pte_k = (pte_t *)memblock_alloc_low(PAGE_SIZE, PAGE_SIZE);
99
+ if (!pte_k)
100
+ panic("%s: Failed to allocate %lu bytes align=0x%lx\n",
101
+ __func__, PAGE_SIZE, PAGE_SIZE);
125102
126
- pte_k = (pte_t *)alloc_bootmem_low_pages(PAGE_SIZE);
127103 pmd_populate_kernel(&init_mm, pmd_k, pte_k);
128104 return pte_k;
129105 }