hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/arch/csky/mm/highmem.c
....@@ -9,6 +9,8 @@
99 #include <asm/tlbflush.h>
1010 #include <asm/cacheflush.h>
1111
12
+static pte_t *kmap_pte;
13
+
1214 unsigned long highstart_pfn, highend_pfn;
1315
1416 void kmap_flush_tlb(unsigned long addr)
....@@ -17,7 +19,67 @@
1719 }
1820 EXPORT_SYMBOL(kmap_flush_tlb);
1921
20
-void __init kmap_init(void)
22
+void *kmap_atomic_high_prot(struct page *page, pgprot_t prot)
23
+{
24
+ unsigned long vaddr;
25
+ int idx, type;
26
+
27
+ type = kmap_atomic_idx_push();
28
+ idx = type + KM_TYPE_NR*smp_processor_id();
29
+ vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
30
+#ifdef CONFIG_DEBUG_HIGHMEM
31
+ BUG_ON(!pte_none(*(kmap_pte - idx)));
32
+#endif
33
+ set_pte(kmap_pte-idx, mk_pte(page, prot));
34
+ flush_tlb_one((unsigned long)vaddr);
35
+
36
+ return (void *)vaddr;
37
+}
38
+EXPORT_SYMBOL(kmap_atomic_high_prot);
39
+
40
+void kunmap_atomic_high(void *kvaddr)
41
+{
42
+ unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
43
+ int idx;
44
+
45
+ if (vaddr < FIXADDR_START)
46
+ return;
47
+
48
+#ifdef CONFIG_DEBUG_HIGHMEM
49
+ idx = KM_TYPE_NR*smp_processor_id() + kmap_atomic_idx();
50
+
51
+ BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
52
+
53
+ pte_clear(&init_mm, vaddr, kmap_pte - idx);
54
+ flush_tlb_one(vaddr);
55
+#else
56
+ (void) idx; /* to kill a warning */
57
+#endif
58
+ kmap_atomic_idx_pop();
59
+}
60
+EXPORT_SYMBOL(kunmap_atomic_high);
61
+
62
+/*
63
+ * This is the same as kmap_atomic() but can map memory that doesn't
64
+ * have a struct page associated with it.
65
+ */
66
+void *kmap_atomic_pfn(unsigned long pfn)
67
+{
68
+ unsigned long vaddr;
69
+ int idx, type;
70
+
71
+ pagefault_disable();
72
+
73
+ type = kmap_atomic_idx_push();
74
+ idx = type + KM_TYPE_NR*smp_processor_id();
75
+ vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
76
+ set_pte(kmap_pte-idx, pfn_pte(pfn, PAGE_KERNEL));
77
+ flush_tlb_one(vaddr);
78
+
79
+ return (void *) vaddr;
80
+}
81
+
82
+static void __init kmap_pages_init(void)
2183 {
2284 unsigned long vaddr;
2385 pgd_t *pgd;
....@@ -34,3 +96,14 @@
3496 pte = pte_offset_kernel(pmd, vaddr);
3597 pkmap_page_table = pte;
3698 }
99
+
100
+void __init kmap_init(void)
101
+{
102
+ unsigned long vaddr;
103
+
104
+ kmap_pages_init();
105
+
106
+ vaddr = __fix_to_virt(FIX_KMAP_BEGIN);
107
+
108
+ kmap_pte = pte_offset_kernel((pmd_t *)pgd_offset_k(vaddr), vaddr);
109
+}