1
2
3
4
5
6
7
8
9
10#include <linux/seq_file.h>
11#include <linux/bootmem.h>
12#include <linux/debugfs.h>
13#include <linux/kernel.h>
14#include <linux/pfn_t.h>
15#include <linux/slab.h>
16#include <linux/mm.h>
17#include <linux/fs.h>
18#include <linux/rbtree.h>
19
20#include <asm/cacheflush.h>
21#include <asm/processor.h>
22#include <asm/tlbflush.h>
23#include <asm/x86_init.h>
24#include <asm/pgtable.h>
25#include <asm/fcntl.h>
26#include <asm/e820.h>
27#include <asm/mtrr.h>
28#include <asm/page.h>
29#include <asm/msr.h>
30#include <asm/pat.h>
31#include <asm/io.h>
32
33#include "pat_internal.h"
34#include "mm_internal.h"
35
36#undef pr_fmt
37#define pr_fmt(fmt) "" fmt
38
39static bool boot_cpu_done;
40
41static int __read_mostly __pat_enabled = IS_ENABLED(CONFIG_X86_PAT);
42static void init_cache_modes(void);
43
44void pat_disable(const char *reason)
45{
46 if (!__pat_enabled)
47 return;
48
49 if (boot_cpu_done) {
50 WARN_ONCE(1, "x86/PAT: PAT cannot be disabled after initialization\n");
51 return;
52 }
53
54 __pat_enabled = 0;
55 pr_info("x86/PAT: %s\n", reason);
56
57 init_cache_modes();
58}
59
60static int __init nopat(char *str)
61{
62 pat_disable("PAT support disabled.");
63 return 0;
64}
65early_param("nopat", nopat);
66
67bool pat_enabled(void)
68{
69 return !!__pat_enabled;
70}
71EXPORT_SYMBOL_GPL(pat_enabled);
72
73int pat_debug_enable;
74
75static int __init pat_debug_setup(char *str)
76{
77 pat_debug_enable = 1;
78 return 0;
79}
80__setup("debugpat", pat_debug_setup);
81
82#ifdef CONFIG_X86_PAT
83
84
85
86
87
88
89
90
91
92
93
94
95
96#define _PGMT_WB 0
97#define _PGMT_WC (1UL << PG_arch_1)
98#define _PGMT_UC_MINUS (1UL << PG_uncached)
99#define _PGMT_WT (1UL << PG_uncached | 1UL << PG_arch_1)
100#define _PGMT_MASK (1UL << PG_uncached | 1UL << PG_arch_1)
101#define _PGMT_CLEAR_MASK (~_PGMT_MASK)
102
103static inline enum page_cache_mode get_page_memtype(struct page *pg)
104{
105 unsigned long pg_flags = pg->flags & _PGMT_MASK;
106
107 if (pg_flags == _PGMT_WB)
108 return _PAGE_CACHE_MODE_WB;
109 else if (pg_flags == _PGMT_WC)
110 return _PAGE_CACHE_MODE_WC;
111 else if (pg_flags == _PGMT_UC_MINUS)
112 return _PAGE_CACHE_MODE_UC_MINUS;
113 else
114 return _PAGE_CACHE_MODE_WT;
115}
116
117static inline void set_page_memtype(struct page *pg,
118 enum page_cache_mode memtype)
119{
120 unsigned long memtype_flags;
121 unsigned long old_flags;
122 unsigned long new_flags;
123
124 switch (memtype) {
125 case _PAGE_CACHE_MODE_WC:
126 memtype_flags = _PGMT_WC;
127 break;
128 case _PAGE_CACHE_MODE_UC_MINUS:
129 memtype_flags = _PGMT_UC_MINUS;
130 break;
131 case _PAGE_CACHE_MODE_WT:
132 memtype_flags = _PGMT_WT;
133 break;
134 case _PAGE_CACHE_MODE_WB:
135 default:
136 memtype_flags = _PGMT_WB;
137 break;
138 }
139
140 do {
141 old_flags = pg->flags;
142 new_flags = (old_flags & _PGMT_CLEAR_MASK) | memtype_flags;
143 } while (cmpxchg(&pg->flags, old_flags, new_flags) != old_flags);
144}
145#else
146static inline enum page_cache_mode get_page_memtype(struct page *pg)
147{
148 return -1;
149}
150static inline void set_page_memtype(struct page *pg,
151 enum page_cache_mode memtype)
152{
153}
154#endif
155
156enum {
157 PAT_UC = 0,
158 PAT_WC = 1,
159 PAT_WT = 4,
160 PAT_WP = 5,
161 PAT_WB = 6,
162 PAT_UC_MINUS = 7,
163};
164
165#define CM(c) (_PAGE_CACHE_MODE_ ## c)
166
167static enum page_cache_mode pat_get_cache_mode(unsigned pat_val, char *msg)
168{
169 enum page_cache_mode cache;
170 char *cache_mode;
171
172 switch (pat_val) {
173 case PAT_UC: cache = CM(UC); cache_mode = "UC "; break;
174 case PAT_WC: cache = CM(WC); cache_mode = "WC "; break;
175 case PAT_WT: cache = CM(WT); cache_mode = "WT "; break;
176 case PAT_WP: cache = CM(WP); cache_mode = "WP "; break;
177 case PAT_WB: cache = CM(WB); cache_mode = "WB "; break;
178 case PAT_UC_MINUS: cache = CM(UC_MINUS); cache_mode = "UC- "; break;
179 default: cache = CM(WB); cache_mode = "WB "; break;
180 }
181
182 memcpy(msg, cache_mode, 4);
183
184 return cache;
185}
186
187#undef CM
188
189
190
191
192
193
194static void __init_cache_modes(u64 pat)
195{
196 enum page_cache_mode cache;
197 char pat_msg[33];
198 int i;
199
200 pat_msg[32] = 0;
201 for (i = 7; i >= 0; i--) {
202 cache = pat_get_cache_mode((pat >> (i * 8)) & 7,
203 pat_msg + 4 * i);
204 update_cache_mode_entry(i, cache);
205 }
206 pr_info("x86/PAT: Configuration [0-7]: %s\n", pat_msg);
207}
208
209#define PAT(x, y) ((u64)PAT_ ## y << ((x)*8))
210
211static void pat_bsp_init(u64 pat)
212{
213 u64 tmp_pat;
214
215 if (!boot_cpu_has(X86_FEATURE_PAT)) {
216 pat_disable("PAT not supported by CPU.");
217 return;
218 }
219
220 rdmsrl(MSR_IA32_CR_PAT, tmp_pat);
221 if (!tmp_pat) {
222 pat_disable("PAT MSR is 0, disabled.");
223 return;
224 }
225
226 wrmsrl(MSR_IA32_CR_PAT, pat);
227
228 __init_cache_modes(pat);
229}
230
231static void pat_ap_init(u64 pat)
232{
233 if (!boot_cpu_has(X86_FEATURE_PAT)) {
234
235
236
237
238 panic("x86/PAT: PAT enabled, but not supported by secondary CPU\n");
239 }
240
241 wrmsrl(MSR_IA32_CR_PAT, pat);
242}
243
244static void init_cache_modes(void)
245{
246 u64 pat = 0;
247 static int init_cm_done;
248
249 if (init_cm_done)
250 return;
251
252 if (boot_cpu_has(X86_FEATURE_PAT)) {
253
254
255
256
257
258
259
260
261
262 rdmsrl(MSR_IA32_CR_PAT, pat);
263 }
264
265 if (!pat) {
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284 pat = PAT(0, WB) | PAT(1, WT) | PAT(2, UC_MINUS) | PAT(3, UC) |
285 PAT(4, WB) | PAT(5, WT) | PAT(6, UC_MINUS) | PAT(7, UC);
286 }
287
288 __init_cache_modes(pat);
289
290 init_cm_done = 1;
291}
292
293
294
295
296
297
298
299
300
301
302
303void pat_init(void)
304{
305 u64 pat;
306 struct cpuinfo_x86 *c = &boot_cpu_data;
307
308 if (!pat_enabled()) {
309 init_cache_modes();
310 return;
311 }
312
313 if ((c->x86_vendor == X86_VENDOR_INTEL) &&
314 (((c->x86 == 0x6) && (c->x86_model <= 0xd)) ||
315 ((c->x86 == 0xf) && (c->x86_model <= 0x6)))) {
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336 pat = PAT(0, WB) | PAT(1, WC) | PAT(2, UC_MINUS) | PAT(3, UC) |
337 PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC);
338 } else {
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365 pat = PAT(0, WB) | PAT(1, WC) | PAT(2, UC_MINUS) | PAT(3, UC) |
366 PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, WT);
367 }
368
369 if (!boot_cpu_done) {
370 pat_bsp_init(pat);
371 boot_cpu_done = true;
372 } else {
373 pat_ap_init(pat);
374 }
375}
376
377#undef PAT
378
379static DEFINE_SPINLOCK(memtype_lock);
380
381
382
383
384
385
386
387
388static unsigned long pat_x_mtrr_type(u64 start, u64 end,
389 enum page_cache_mode req_type)
390{
391
392
393
394
395 if (req_type == _PAGE_CACHE_MODE_WB) {
396 u8 mtrr_type, uniform;
397
398 mtrr_type = mtrr_type_lookup(start, end, &uniform);
399 if (mtrr_type != MTRR_TYPE_WRBACK)
400 return _PAGE_CACHE_MODE_UC_MINUS;
401
402 return _PAGE_CACHE_MODE_WB;
403 }
404
405 return req_type;
406}
407
408struct pagerange_state {
409 unsigned long cur_pfn;
410 int ram;
411 int not_ram;
412};
413
414static int
415pagerange_is_ram_callback(unsigned long initial_pfn, unsigned long total_nr_pages, void *arg)
416{
417 struct pagerange_state *state = arg;
418
419 state->not_ram |= initial_pfn > state->cur_pfn;
420 state->ram |= total_nr_pages > 0;
421 state->cur_pfn = initial_pfn + total_nr_pages;
422
423 return state->ram && state->not_ram;
424}
425
426static int pat_pagerange_is_ram(resource_size_t start, resource_size_t end)
427{
428 int ret = 0;
429 unsigned long start_pfn = start >> PAGE_SHIFT;
430 unsigned long end_pfn = (end + PAGE_SIZE - 1) >> PAGE_SHIFT;
431 struct pagerange_state state = {start_pfn, 0, 0};
432
433
434
435
436
437
438
439
440 if (start_pfn < ISA_END_ADDRESS >> PAGE_SHIFT)
441 start_pfn = ISA_END_ADDRESS >> PAGE_SHIFT;
442
443 if (start_pfn < end_pfn) {
444 ret = walk_system_ram_range(start_pfn, end_pfn - start_pfn,
445 &state, pagerange_is_ram_callback);
446 }
447
448 return (ret > 0) ? -1 : (state.ram ? 1 : 0);
449}
450
451
452
453
454
455
456
457
458
459
460
461
462static int reserve_ram_pages_type(u64 start, u64 end,
463 enum page_cache_mode req_type,
464 enum page_cache_mode *new_type)
465{
466 struct page *page;
467 u64 pfn;
468
469 if (req_type == _PAGE_CACHE_MODE_WP) {
470 if (new_type)
471 *new_type = _PAGE_CACHE_MODE_UC_MINUS;
472 return -EINVAL;
473 }
474
475 if (req_type == _PAGE_CACHE_MODE_UC) {
476
477 WARN_ON_ONCE(1);
478 req_type = _PAGE_CACHE_MODE_UC_MINUS;
479 }
480
481 for (pfn = (start >> PAGE_SHIFT); pfn < (end >> PAGE_SHIFT); ++pfn) {
482 enum page_cache_mode type;
483
484 page = pfn_to_page(pfn);
485 type = get_page_memtype(page);
486 if (type != _PAGE_CACHE_MODE_WB) {
487 pr_info("x86/PAT: reserve_ram_pages_type failed [mem %#010Lx-%#010Lx], track 0x%x, req 0x%x\n",
488 start, end - 1, type, req_type);
489 if (new_type)
490 *new_type = type;
491
492 return -EBUSY;
493 }
494 }
495
496 if (new_type)
497 *new_type = req_type;
498
499 for (pfn = (start >> PAGE_SHIFT); pfn < (end >> PAGE_SHIFT); ++pfn) {
500 page = pfn_to_page(pfn);
501 set_page_memtype(page, req_type);
502 }
503 return 0;
504}
505
506static int free_ram_pages_type(u64 start, u64 end)
507{
508 struct page *page;
509 u64 pfn;
510
511 for (pfn = (start >> PAGE_SHIFT); pfn < (end >> PAGE_SHIFT); ++pfn) {
512 page = pfn_to_page(pfn);
513 set_page_memtype(page, _PAGE_CACHE_MODE_WB);
514 }
515 return 0;
516}
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531int reserve_memtype(u64 start, u64 end, enum page_cache_mode req_type,
532 enum page_cache_mode *new_type)
533{
534 struct memtype *new;
535 enum page_cache_mode actual_type;
536 int is_range_ram;
537 int err = 0;
538
539 BUG_ON(start >= end);
540
541 if (!pat_enabled()) {
542
543 if (new_type)
544 *new_type = req_type;
545 return 0;
546 }
547
548
549 if (x86_platform.is_untracked_pat_range(start, end)) {
550 if (new_type)
551 *new_type = _PAGE_CACHE_MODE_WB;
552 return 0;
553 }
554
555
556
557
558
559
560
561 actual_type = pat_x_mtrr_type(start, end, req_type);
562
563 if (new_type)
564 *new_type = actual_type;
565
566 is_range_ram = pat_pagerange_is_ram(start, end);
567 if (is_range_ram == 1) {
568
569 err = reserve_ram_pages_type(start, end, req_type, new_type);
570
571 return err;
572 } else if (is_range_ram < 0) {
573 return -EINVAL;
574 }
575
576 new = kzalloc(sizeof(struct memtype), GFP_KERNEL);
577 if (!new)
578 return -ENOMEM;
579
580 new->start = start;
581 new->end = end;
582 new->type = actual_type;
583
584 spin_lock(&memtype_lock);
585
586 err = rbt_memtype_check_insert(new, new_type);
587 if (err) {
588 pr_info("x86/PAT: reserve_memtype failed [mem %#010Lx-%#010Lx], track %s, req %s\n",
589 start, end - 1,
590 cattr_name(new->type), cattr_name(req_type));
591 kfree(new);
592 spin_unlock(&memtype_lock);
593
594 return err;
595 }
596
597 spin_unlock(&memtype_lock);
598
599 dprintk("reserve_memtype added [mem %#010Lx-%#010Lx], track %s, req %s, ret %s\n",
600 start, end - 1, cattr_name(new->type), cattr_name(req_type),
601 new_type ? cattr_name(*new_type) : "-");
602
603 return err;
604}
605
606int free_memtype(u64 start, u64 end)
607{
608 int err = -EINVAL;
609 int is_range_ram;
610 struct memtype *entry;
611
612 if (!pat_enabled())
613 return 0;
614
615
616 if (x86_platform.is_untracked_pat_range(start, end))
617 return 0;
618
619 is_range_ram = pat_pagerange_is_ram(start, end);
620 if (is_range_ram == 1) {
621
622 err = free_ram_pages_type(start, end);
623
624 return err;
625 } else if (is_range_ram < 0) {
626 return -EINVAL;
627 }
628
629 spin_lock(&memtype_lock);
630 entry = rbt_memtype_erase(start, end);
631 spin_unlock(&memtype_lock);
632
633 if (IS_ERR(entry)) {
634 pr_info("x86/PAT: %s:%d freeing invalid memtype [mem %#010Lx-%#010Lx]\n",
635 current->comm, current->pid, start, end - 1);
636 return -EINVAL;
637 }
638
639 kfree(entry);
640
641 dprintk("free_memtype request [mem %#010Lx-%#010Lx]\n", start, end - 1);
642
643 return 0;
644}
645
646
647
648
649
650
651
652
653
654
655
656static enum page_cache_mode lookup_memtype(u64 paddr)
657{
658 enum page_cache_mode rettype = _PAGE_CACHE_MODE_WB;
659 struct memtype *entry;
660
661 if (x86_platform.is_untracked_pat_range(paddr, paddr + PAGE_SIZE))
662 return rettype;
663
664 if (pat_pagerange_is_ram(paddr, paddr + PAGE_SIZE)) {
665 struct page *page;
666
667 page = pfn_to_page(paddr >> PAGE_SHIFT);
668 return get_page_memtype(page);
669 }
670
671 spin_lock(&memtype_lock);
672
673 entry = rbt_memtype_lookup(paddr);
674 if (entry != NULL)
675 rettype = entry->type;
676 else
677 rettype = _PAGE_CACHE_MODE_UC_MINUS;
678
679 spin_unlock(&memtype_lock);
680 return rettype;
681}
682
683
684
685
686
687
688
689
690
691
692
693int io_reserve_memtype(resource_size_t start, resource_size_t end,
694 enum page_cache_mode *type)
695{
696 resource_size_t size = end - start;
697 enum page_cache_mode req_type = *type;
698 enum page_cache_mode new_type;
699 int ret;
700
701 WARN_ON_ONCE(iomem_map_sanity_check(start, size));
702
703 ret = reserve_memtype(start, end, req_type, &new_type);
704 if (ret)
705 goto out_err;
706
707 if (!is_new_memtype_allowed(start, size, req_type, new_type))
708 goto out_free;
709
710 if (kernel_map_sync_memtype(start, size, new_type) < 0)
711 goto out_free;
712
713 *type = new_type;
714 return 0;
715
716out_free:
717 free_memtype(start, end);
718 ret = -EBUSY;
719out_err:
720 return ret;
721}
722
723
724
725
726
727
728void io_free_memtype(resource_size_t start, resource_size_t end)
729{
730 free_memtype(start, end);
731}
732
733int arch_io_reserve_memtype_wc(resource_size_t start, resource_size_t size)
734{
735 enum page_cache_mode type = _PAGE_CACHE_MODE_WC;
736
737 return io_reserve_memtype(start, start + size, &type);
738}
739EXPORT_SYMBOL(arch_io_reserve_memtype_wc);
740
741void arch_io_free_memtype_wc(resource_size_t start, resource_size_t size)
742{
743 io_free_memtype(start, start + size);
744}
745EXPORT_SYMBOL(arch_io_free_memtype_wc);
746
747pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
748 unsigned long size, pgprot_t vma_prot)
749{
750 return vma_prot;
751}
752
753#ifdef CONFIG_STRICT_DEVMEM
754
755static inline int range_is_allowed(unsigned long pfn, unsigned long size)
756{
757 return 1;
758}
759#else
760
761static inline int range_is_allowed(unsigned long pfn, unsigned long size)
762{
763 u64 from = ((u64)pfn) << PAGE_SHIFT;
764 u64 to = from + size;
765 u64 cursor = from;
766
767 if (!pat_enabled())
768 return 1;
769
770 while (cursor < to) {
771 if (!devmem_is_allowed(pfn))
772 return 0;
773 cursor += PAGE_SIZE;
774 pfn++;
775 }
776 return 1;
777}
778#endif
779
780int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
781 unsigned long size, pgprot_t *vma_prot)
782{
783 enum page_cache_mode pcm = _PAGE_CACHE_MODE_WB;
784
785 if (!range_is_allowed(pfn, size))
786 return 0;
787
788 if (file->f_flags & O_DSYNC)
789 pcm = _PAGE_CACHE_MODE_UC_MINUS;
790
791 *vma_prot = __pgprot((pgprot_val(*vma_prot) & ~_PAGE_CACHE_MASK) |
792 cachemode2protval(pcm));
793 return 1;
794}
795
796
797
798
799
800int kernel_map_sync_memtype(u64 base, unsigned long size,
801 enum page_cache_mode pcm)
802{
803 unsigned long id_sz;
804
805 if (base > __pa(high_memory-1))
806 return 0;
807
808
809
810
811
812 if (!page_is_ram(base >> PAGE_SHIFT))
813 return 0;
814
815 id_sz = (__pa(high_memory-1) <= base + size) ?
816 __pa(high_memory) - base :
817 size;
818
819 if (ioremap_change_attr((unsigned long)__va(base), id_sz, pcm) < 0) {
820 pr_info("x86/PAT: %s:%d ioremap_change_attr failed %s for [mem %#010Lx-%#010Lx]\n",
821 current->comm, current->pid,
822 cattr_name(pcm),
823 base, (unsigned long long)(base + size-1));
824 return -EINVAL;
825 }
826 return 0;
827}
828
829
830
831
832
833
834static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot,
835 int strict_prot)
836{
837 int is_ram = 0;
838 int ret;
839 enum page_cache_mode want_pcm = pgprot2cachemode(*vma_prot);
840 enum page_cache_mode pcm = want_pcm;
841
842 is_ram = pat_pagerange_is_ram(paddr, paddr + size);
843
844
845
846
847
848
849 if (is_ram) {
850 if (!pat_enabled())
851 return 0;
852
853 pcm = lookup_memtype(paddr);
854 if (want_pcm != pcm) {
855 pr_warn("x86/PAT: %s:%d map pfn RAM range req %s for [mem %#010Lx-%#010Lx], got %s\n",
856 current->comm, current->pid,
857 cattr_name(want_pcm),
858 (unsigned long long)paddr,
859 (unsigned long long)(paddr + size - 1),
860 cattr_name(pcm));
861 *vma_prot = __pgprot((pgprot_val(*vma_prot) &
862 (~_PAGE_CACHE_MASK)) |
863 cachemode2protval(pcm));
864 }
865 return 0;
866 }
867
868 ret = reserve_memtype(paddr, paddr + size, want_pcm, &pcm);
869 if (ret)
870 return ret;
871
872 if (pcm != want_pcm) {
873 if (strict_prot ||
874 !is_new_memtype_allowed(paddr, size, want_pcm, pcm)) {
875 free_memtype(paddr, paddr + size);
876 pr_err("x86/PAT: %s:%d map pfn expected mapping type %s for [mem %#010Lx-%#010Lx], got %s\n",
877 current->comm, current->pid,
878 cattr_name(want_pcm),
879 (unsigned long long)paddr,
880 (unsigned long long)(paddr + size - 1),
881 cattr_name(pcm));
882 return -EINVAL;
883 }
884
885
886
887
888 *vma_prot = __pgprot((pgprot_val(*vma_prot) &
889 (~_PAGE_CACHE_MASK)) |
890 cachemode2protval(pcm));
891 }
892
893 if (kernel_map_sync_memtype(paddr, size, pcm) < 0) {
894 free_memtype(paddr, paddr + size);
895 return -EINVAL;
896 }
897 return 0;
898}
899
900
901
902
903
904static void free_pfn_range(u64 paddr, unsigned long size)
905{
906 int is_ram;
907
908 is_ram = pat_pagerange_is_ram(paddr, paddr + size);
909 if (is_ram == 0)
910 free_memtype(paddr, paddr + size);
911}
912
913
914
915
916
917
918
919
920int track_pfn_copy(struct vm_area_struct *vma)
921{
922 resource_size_t paddr;
923 unsigned long prot;
924 unsigned long vma_size = vma->vm_end - vma->vm_start;
925 pgprot_t pgprot;
926
927 if (vma->vm_flags & VM_PAT) {
928
929
930
931
932 if (follow_phys(vma, vma->vm_start, 0, &prot, &paddr)) {
933 WARN_ON_ONCE(1);
934 return -EINVAL;
935 }
936 pgprot = __pgprot(prot);
937 return reserve_pfn_range(paddr, vma_size, &pgprot, 1);
938 }
939
940 return 0;
941}
942
943
944
945
946
947
948
949int track_pfn_remap(struct vm_area_struct *vma, pgprot_t *prot,
950 unsigned long pfn, unsigned long addr, unsigned long size)
951{
952 resource_size_t paddr = (resource_size_t)pfn << PAGE_SHIFT;
953 enum page_cache_mode pcm;
954
955
956 if (!vma || (addr == vma->vm_start
957 && size == (vma->vm_end - vma->vm_start))) {
958 int ret;
959
960 ret = reserve_pfn_range(paddr, size, prot, 0);
961 if (ret == 0 && vma)
962 vma->vm_flags |= VM_PAT;
963 return ret;
964 }
965
966 if (!pat_enabled())
967 return 0;
968
969
970
971
972
973 pcm = lookup_memtype(paddr);
974
975
976 while (size > PAGE_SIZE) {
977 size -= PAGE_SIZE;
978 paddr += PAGE_SIZE;
979 if (pcm != lookup_memtype(paddr))
980 return -EINVAL;
981 }
982
983 *prot = __pgprot((pgprot_val(*prot) & (~_PAGE_CACHE_MASK)) |
984 cachemode2protval(pcm));
985
986 return 0;
987}
988
989int track_pfn_insert(struct vm_area_struct *vma, pgprot_t *prot,
990 pfn_t pfn)
991{
992 enum page_cache_mode pcm;
993
994 if (!pat_enabled())
995 return 0;
996
997
998 pcm = lookup_memtype(pfn_t_to_phys(pfn));
999 *prot = __pgprot((pgprot_val(*prot) & (~_PAGE_CACHE_MASK)) |
1000 cachemode2protval(pcm));
1001
1002 return 0;
1003}
1004
1005
1006
1007
1008
1009
1010void untrack_pfn(struct vm_area_struct *vma, unsigned long pfn,
1011 unsigned long size)
1012{
1013 resource_size_t paddr;
1014 unsigned long prot;
1015
1016 if (vma && !(vma->vm_flags & VM_PAT))
1017 return;
1018
1019
1020 paddr = (resource_size_t)pfn << PAGE_SHIFT;
1021 if (!paddr && !size) {
1022 if (follow_phys(vma, vma->vm_start, 0, &prot, &paddr)) {
1023 WARN_ON_ONCE(1);
1024 return;
1025 }
1026
1027 size = vma->vm_end - vma->vm_start;
1028 }
1029 free_pfn_range(paddr, size);
1030 if (vma)
1031 vma->vm_flags &= ~VM_PAT;
1032}
1033
1034
1035
1036
1037
1038
1039void untrack_pfn_moved(struct vm_area_struct *vma)
1040{
1041 vma->vm_flags &= ~VM_PAT;
1042}
1043
1044pgprot_t pgprot_writecombine(pgprot_t prot)
1045{
1046 return __pgprot(pgprot_val(prot) |
1047 cachemode2protval(_PAGE_CACHE_MODE_WC));
1048}
1049EXPORT_SYMBOL_GPL(pgprot_writecombine);
1050
1051pgprot_t pgprot_writethrough(pgprot_t prot)
1052{
1053 return __pgprot(pgprot_val(prot) |
1054 cachemode2protval(_PAGE_CACHE_MODE_WT));
1055}
1056EXPORT_SYMBOL_GPL(pgprot_writethrough);
1057
1058#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_X86_PAT)
1059
1060static struct memtype *memtype_get_idx(loff_t pos)
1061{
1062 struct memtype *print_entry;
1063 int ret;
1064
1065 print_entry = kzalloc(sizeof(struct memtype), GFP_KERNEL);
1066 if (!print_entry)
1067 return NULL;
1068
1069 spin_lock(&memtype_lock);
1070 ret = rbt_memtype_copy_nth_element(print_entry, pos);
1071 spin_unlock(&memtype_lock);
1072
1073 if (!ret) {
1074 return print_entry;
1075 } else {
1076 kfree(print_entry);
1077 return NULL;
1078 }
1079}
1080
1081static void *memtype_seq_start(struct seq_file *seq, loff_t *pos)
1082{
1083 if (*pos == 0) {
1084 ++*pos;
1085 seq_puts(seq, "PAT memtype list:\n");
1086 }
1087
1088 return memtype_get_idx(*pos);
1089}
1090
1091static void *memtype_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1092{
1093 ++*pos;
1094 return memtype_get_idx(*pos);
1095}
1096
1097static void memtype_seq_stop(struct seq_file *seq, void *v)
1098{
1099}
1100
1101static int memtype_seq_show(struct seq_file *seq, void *v)
1102{
1103 struct memtype *print_entry = (struct memtype *)v;
1104
1105 seq_printf(seq, "%s @ 0x%Lx-0x%Lx\n", cattr_name(print_entry->type),
1106 print_entry->start, print_entry->end);
1107 kfree(print_entry);
1108
1109 return 0;
1110}
1111
1112static const struct seq_operations memtype_seq_ops = {
1113 .start = memtype_seq_start,
1114 .next = memtype_seq_next,
1115 .stop = memtype_seq_stop,
1116 .show = memtype_seq_show,
1117};
1118
1119static int memtype_seq_open(struct inode *inode, struct file *file)
1120{
1121 return seq_open(file, &memtype_seq_ops);
1122}
1123
1124static const struct file_operations memtype_fops = {
1125 .open = memtype_seq_open,
1126 .read = seq_read,
1127 .llseek = seq_lseek,
1128 .release = seq_release,
1129};
1130
1131static int __init pat_memtype_list_init(void)
1132{
1133 if (pat_enabled()) {
1134 debugfs_create_file("pat_memtype_list", S_IRUSR,
1135 arch_debugfs_dir, NULL, &memtype_fops);
1136 }
1137 return 0;
1138}
1139
1140late_initcall(pat_memtype_list_init);
1141
1142#endif
1143