diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2012-11-02 07:56:43 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2012-11-23 05:14:30 -0500 |
commit | 6b70a92080be508e16b2f53efba39e5155eff809 (patch) | |
tree | a8bce16cd2f31284a392b29b4054230afce87168 /arch/s390 | |
parent | 1e466fcf3882e4c17c7df918185d0069cc334811 (diff) |
s390/memory hotplug: use pfmf instruction to initialize storage keys
Move and rename init_storage_keys() to pageattr.c, so it can also be
used from the sclp memory hotplug code in order to initialize
storage keys.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/include/asm/page.h | 2 | ||||
-rw-r--r-- | arch/s390/kernel/setup.c | 36 | ||||
-rw-r--r-- | arch/s390/mm/Makefile | 12 | ||||
-rw-r--r-- | arch/s390/mm/pageattr.c | 37 |
4 files changed, 45 insertions, 42 deletions
diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h index 6d5367060a56..24afd079e5ce 100644 --- a/arch/s390/include/asm/page.h +++ b/arch/s390/include/asm/page.h | |||
@@ -30,6 +30,8 @@ | |||
30 | #include <asm/setup.h> | 30 | #include <asm/setup.h> |
31 | #ifndef __ASSEMBLY__ | 31 | #ifndef __ASSEMBLY__ |
32 | 32 | ||
33 | void storage_key_init_range(unsigned long start, unsigned long end); | ||
34 | |||
33 | static unsigned long pfmf(unsigned long function, unsigned long address) | 35 | static unsigned long pfmf(unsigned long function, unsigned long address) |
34 | { | 36 | { |
35 | asm volatile( | 37 | asm volatile( |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index b1f2be9aaaad..cfdad57957fe 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -777,40 +777,6 @@ static void __init reserve_crashkernel(void) | |||
777 | #endif | 777 | #endif |
778 | } | 778 | } |
779 | 779 | ||
780 | static void __init init_storage_keys(unsigned long start, unsigned long end) | ||
781 | { | ||
782 | unsigned long boundary, function, size; | ||
783 | |||
784 | while (start < end) { | ||
785 | if (MACHINE_HAS_EDAT2) { | ||
786 | /* set storage keys for a 2GB frame */ | ||
787 | function = 0x22000 | PAGE_DEFAULT_KEY; | ||
788 | size = 1UL << 31; | ||
789 | boundary = (start + size) & ~(size - 1); | ||
790 | if (boundary <= end) { | ||
791 | do { | ||
792 | start = pfmf(function, start); | ||
793 | } while (start < boundary); | ||
794 | continue; | ||
795 | } | ||
796 | } | ||
797 | if (MACHINE_HAS_EDAT1) { | ||
798 | /* set storage keys for a 1MB frame */ | ||
799 | function = 0x21000 | PAGE_DEFAULT_KEY; | ||
800 | size = 1UL << 20; | ||
801 | boundary = (start + size) & ~(size - 1); | ||
802 | if (boundary <= end) { | ||
803 | do { | ||
804 | start = pfmf(function, start); | ||
805 | } while (start < boundary); | ||
806 | continue; | ||
807 | } | ||
808 | } | ||
809 | page_set_storage_key(start, PAGE_DEFAULT_KEY, 0); | ||
810 | start += PAGE_SIZE; | ||
811 | } | ||
812 | } | ||
813 | |||
814 | static void __init setup_memory(void) | 780 | static void __init setup_memory(void) |
815 | { | 781 | { |
816 | unsigned long bootmap_size; | 782 | unsigned long bootmap_size; |
@@ -889,7 +855,7 @@ static void __init setup_memory(void) | |||
889 | memblock_add_node(PFN_PHYS(start_chunk), | 855 | memblock_add_node(PFN_PHYS(start_chunk), |
890 | PFN_PHYS(end_chunk - start_chunk), 0); | 856 | PFN_PHYS(end_chunk - start_chunk), 0); |
891 | pfn = max(start_chunk, start_pfn); | 857 | pfn = max(start_chunk, start_pfn); |
892 | init_storage_keys(PFN_PHYS(pfn), PFN_PHYS(end_chunk)); | 858 | storage_key_init_range(PFN_PHYS(pfn), PFN_PHYS(end_chunk)); |
893 | } | 859 | } |
894 | 860 | ||
895 | psw_set_key(PAGE_DEFAULT_KEY); | 861 | psw_set_key(PAGE_DEFAULT_KEY); |
diff --git a/arch/s390/mm/Makefile b/arch/s390/mm/Makefile index 1bea6d1f55ab..640bea12303c 100644 --- a/arch/s390/mm/Makefile +++ b/arch/s390/mm/Makefile | |||
@@ -2,9 +2,9 @@ | |||
2 | # Makefile for the linux s390-specific parts of the memory manager. | 2 | # Makefile for the linux s390-specific parts of the memory manager. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := init.o fault.o extmem.o mmap.o vmem.o pgtable.o maccess.o \ | 5 | obj-y := init.o fault.o extmem.o mmap.o vmem.o pgtable.o maccess.o |
6 | page-states.o gup.o extable.o | 6 | obj-y += page-states.o gup.o extable.o pageattr.o |
7 | obj-$(CONFIG_CMM) += cmm.o | 7 | |
8 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | 8 | obj-$(CONFIG_CMM) += cmm.o |
9 | obj-$(CONFIG_DEBUG_SET_MODULE_RONX) += pageattr.o | 9 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o |
10 | obj-$(CONFIG_S390_PTDUMP) += dump_pagetables.o | 10 | obj-$(CONFIG_S390_PTDUMP) += dump_pagetables.o |
diff --git a/arch/s390/mm/pageattr.c b/arch/s390/mm/pageattr.c index c7ec7c2e46b0..73c3da393e88 100644 --- a/arch/s390/mm/pageattr.c +++ b/arch/s390/mm/pageattr.c | |||
@@ -2,11 +2,46 @@ | |||
2 | * Copyright IBM Corp. 2011 | 2 | * Copyright IBM Corp. 2011 |
3 | * Author(s): Jan Glauber <jang@linux.vnet.ibm.com> | 3 | * Author(s): Jan Glauber <jang@linux.vnet.ibm.com> |
4 | */ | 4 | */ |
5 | #include <linux/hugetlb.h> | ||
5 | #include <linux/module.h> | 6 | #include <linux/module.h> |
6 | #include <linux/mm.h> | 7 | #include <linux/mm.h> |
7 | #include <linux/hugetlb.h> | ||
8 | #include <asm/cacheflush.h> | 8 | #include <asm/cacheflush.h> |
9 | #include <asm/pgtable.h> | 9 | #include <asm/pgtable.h> |
10 | #include <asm/page.h> | ||
11 | |||
12 | void storage_key_init_range(unsigned long start, unsigned long end) | ||
13 | { | ||
14 | unsigned long boundary, function, size; | ||
15 | |||
16 | while (start < end) { | ||
17 | if (MACHINE_HAS_EDAT2) { | ||
18 | /* set storage keys for a 2GB frame */ | ||
19 | function = 0x22000 | PAGE_DEFAULT_KEY; | ||
20 | size = 1UL << 31; | ||
21 | boundary = (start + size) & ~(size - 1); | ||
22 | if (boundary <= end) { | ||
23 | do { | ||
24 | start = pfmf(function, start); | ||
25 | } while (start < boundary); | ||
26 | continue; | ||
27 | } | ||
28 | } | ||
29 | if (MACHINE_HAS_EDAT1) { | ||
30 | /* set storage keys for a 1MB frame */ | ||
31 | function = 0x21000 | PAGE_DEFAULT_KEY; | ||
32 | size = 1UL << 20; | ||
33 | boundary = (start + size) & ~(size - 1); | ||
34 | if (boundary <= end) { | ||
35 | do { | ||
36 | start = pfmf(function, start); | ||
37 | } while (start < boundary); | ||
38 | continue; | ||
39 | } | ||
40 | } | ||
41 | page_set_storage_key(start, PAGE_DEFAULT_KEY, 0); | ||
42 | start += PAGE_SIZE; | ||
43 | } | ||
44 | } | ||
10 | 45 | ||
11 | static pte_t *walk_page_table(unsigned long addr) | 46 | static pte_t *walk_page_table(unsigned long addr) |
12 | { | 47 | { |