Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1206746 > unrolled thread
| Started by | "Suzuki K. Poulose" <suzuki.poulose@arm.com> |
|---|---|
| First post | 2015-08-13 13:40 +0200 |
| Last post | 2015-08-13 13:40 +0200 |
| Articles | 13 — 4 participants |
Back to article view | Back to linux.kernel
[PATCH 00/14] arm64: 16K translation granule support "Suzuki K. Poulose" <suzuki.poulose@arm.com> - 2015-08-13 13:40 +0200
[PATCH 04/14] arm64: Calculate size for idmap_pg_dir at compile time "Suzuki K. Poulose" <suzuki.poulose@arm.com> - 2015-08-13 13:40 +0200
[PATCH 09/14] arm64: Cleanup VTCR_EL2 computation "Suzuki K. Poulose" <suzuki.poulose@arm.com> - 2015-08-13 13:40 +0200
[PATCH 05/14] arm64: Handle 4 level page table for swapper "Suzuki K. Poulose" <suzuki.poulose@arm.com> - 2015-08-13 13:40 +0200
[PATCH 12/14] arm64: Check for selected granule support "Suzuki K. Poulose" <suzuki.poulose@arm.com> - 2015-08-13 13:40 +0200
Re: [PATCH 12/14] arm64: Check for selected granule support Steve Capper <steve.capper@linaro.org> - 2015-08-13 14:30 +0200
Re: [PATCH 12/14] arm64: Check for selected granule support "Suzuki K. Poulose" <Suzuki.Poulose@arm.com> - 2015-08-13 16:50 +0200
Re: [PATCH 12/14] arm64: Check for selected granule support Catalin Marinas <catalin.marinas@arm.com> - 2015-08-13 19:40 +0200
[PATCH 07/14] arm64: Kconfig: Fix help text about AArch32 support with 64K pages "Suzuki K. Poulose" <suzuki.poulose@arm.com> - 2015-08-13 13:40 +0200
[PATCH 06/14] arm64: Clean config usages for page size "Suzuki K. Poulose" <suzuki.poulose@arm.com> - 2015-08-13 13:40 +0200
[PATCH 08/14] arm64: kvm: Fix {V}TCR_EL2_TG0 mask "Suzuki K. Poulose" <suzuki.poulose@arm.com> - 2015-08-13 13:40 +0200
[PATCH 13/14] arm64: Add 16K page size support "Suzuki K. Poulose" <suzuki.poulose@arm.com> - 2015-08-13 13:40 +0200
[PATCH 10/14] arm: kvm: Move fake PGD handling to arch specific files "Suzuki K. Poulose" <suzuki.poulose@arm.com> - 2015-08-13 13:40 +0200
| From | "Suzuki K. Poulose" <suzuki.poulose@arm.com> |
|---|---|
| Date | 2015-08-13 13:40 +0200 |
| Subject | [PATCH 00/14] arm64: 16K translation granule support |
| Message-ID | <pWZ1v-22I-7@gated-at.bofh.it> |
From: "Suzuki K. Poulose" <suzuki.poulose@arm.com>
This series enables the 16K page size support on Linux for arm64.
This series adds support for 48bit VA(4 level), 47bit VA(3 level) and
36bit VA(2 level) with 16K. 16K was a late addition to the architecture
and is not implemented by all CPUs. Added a check to ensure the
selected granule size is supported by the CPU, failing which the CPU
won't proceed with booting.
KVM bits have been tested on a fast model with GICv3 using Andre's kvmtool
with gicv3 support[1].
Patches 1-7 cleans up the kernel page size handling code.
Patches 8-11 Fixes some issues with the KVM bits, mainly the fake PGD
handling code.
Patch 12 Adds a check to ensure the CPU supports the selected granule size.
Patch 13-14 Adds the 16k page size support bits.
This series applies on top of for-next/core branch of the aarch64 tree and is
also available here:
git://linux-arm.org/linux-skp.git 16k/v1
[1] git://linux-arm.org/kvmtool.git gicv3/v4
TODO:
1) Testing on a silicon
2) Analyse the performance of HugePages with 16K (32MB) on a
silicon.
3) SMMU driver
Suzuki K. Poulose (14):
arm64: Move swapper pagetable definitions
arm64: Handle section maps for swapper/idmap
arm64: Introduce helpers for page table levels
arm64: Calculate size for idmap_pg_dir at compile time
arm64: Handle 4 level page table for swapper
arm64: Clean config usages for page size
arm64: Kconfig: Fix help text about AArch32 support with 64K pages
arm64: kvm: Fix {V}TCR_EL2_TG0 mask
arm64: Cleanup VTCR_EL2 computation
arm: kvm: Move fake PGD handling to arch specific files
arm64: kvm: Rewrite fake pgd handling
arm64: Check for selected granule support
arm64: Add 16K page size support
arm64: 36 bit VA
arch/arm/include/asm/kvm_mmu.h | 7 ++
arch/arm/kvm/mmu.c | 44 ++--------
arch/arm64/Kconfig | 37 +++++++--
arch/arm64/Kconfig.debug | 2 +-
arch/arm64/include/asm/boot.h | 1 +
arch/arm64/include/asm/fixmap.h | 4 +-
arch/arm64/include/asm/kernel-pgtable.h | 77 ++++++++++++++++++
arch/arm64/include/asm/kvm_arm.h | 29 +++++--
arch/arm64/include/asm/kvm_mmu.h | 135 +++++++++++++++++++++----------
arch/arm64/include/asm/page.h | 20 +----
arch/arm64/include/asm/pgtable-hwdef.h | 15 +++-
arch/arm64/include/asm/sysreg.h | 8 ++
arch/arm64/include/asm/thread_info.h | 4 +-
arch/arm64/kernel/head.S | 71 +++++++++-------
arch/arm64/kernel/vmlinux.lds.S | 1 +
arch/arm64/mm/mmu.c | 70 +++++++---------
arch/arm64/mm/proc.S | 4 +-
17 files changed, 337 insertions(+), 192 deletions(-)
create mode 100644 arch/arm64/include/asm/kernel-pgtable.h
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | "Suzuki K. Poulose" <suzuki.poulose@arm.com> |
|---|---|
| Date | 2015-08-13 13:40 +0200 |
| Subject | [PATCH 04/14] arm64: Calculate size for idmap_pg_dir at compile time |
| Message-ID | <pWZ1w-22I-27@gated-at.bofh.it> |
| In reply to | #1206746 |
From: "Suzuki K. Poulose" <suzuki.poulose@arm.com> Now that we can calculate the number of levels required for mapping a va width, reserve exact number of pages that would be required to cover the idmap. The idmap should be able to handle the maximum physical address size supported. Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com> --- arch/arm64/include/asm/boot.h | 1 + arch/arm64/include/asm/kernel-pgtable.h | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/arm64/include/asm/boot.h b/arch/arm64/include/asm/boot.h index 81151b6..678b63e 100644 --- a/arch/arm64/include/asm/boot.h +++ b/arch/arm64/include/asm/boot.h @@ -2,6 +2,7 @@ #ifndef __ASM_BOOT_H #define __ASM_BOOT_H +#include <asm/page.h> #include <asm/sizes.h> /* diff --git a/arch/arm64/include/asm/kernel-pgtable.h b/arch/arm64/include/asm/kernel-pgtable.h index 5876a36..def7168 100644 --- a/arch/arm64/include/asm/kernel-pgtable.h +++ b/arch/arm64/include/asm/kernel-pgtable.h @@ -33,16 +33,19 @@ * map to pte level. The swapper also maps the FDT (see __create_page_tables * for more information). Note that the number of ID map translation levels * could be increased on the fly if system RAM is out of reach for the default - * VA range, so 3 pages are reserved in all cases. + * VA range, so pages required to map highest possible PA are reserved in all + * cases. */ #if ARM64_SWAPPER_USES_SECTION_MAPS #define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS - 1) +#define IDMAP_PGTABLE_LEVELS (ARM64_HW_PGTABLE_LEVELS(PHYS_MASK_SHIFT) - 1) #else #define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS) +#define IDMAP_PGTABLE_LEVELS (ARM64_HW_PGTABLE_LEVELS(PHYS_MASK_SHIFT)) #endif #define SWAPPER_DIR_SIZE (SWAPPER_PGTABLE_LEVELS * PAGE_SIZE) -#define IDMAP_DIR_SIZE (3 * PAGE_SIZE) +#define IDMAP_DIR_SIZE (IDMAP_PGTABLE_LEVELS * PAGE_SIZE) /* Initial memory map size */ #if ARM64_SWAPPER_USES_SECTION_MAPS -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Suzuki K. Poulose" <suzuki.poulose@arm.com> |
|---|---|
| Date | 2015-08-13 13:40 +0200 |
| Subject | [PATCH 09/14] arm64: Cleanup VTCR_EL2 computation |
| Message-ID | <pWZ1x-22I-39@gated-at.bofh.it> |
| In reply to | #1206746 |
From: "Suzuki K. Poulose" <suzuki.poulose@arm.com> No functional changes. Group the common bits for VCTR_EL2 initialisation for better readability. The granule size and the entry level are controlled by the page size. Cc: Christoffer Dall <christoffer.dall@linaro.org> Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: kvmarm@lists.cs.columbia.edu Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com> --- arch/arm64/include/asm/kvm_arm.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h index 52dc9cc..dcaf799 100644 --- a/arch/arm64/include/asm/kvm_arm.h +++ b/arch/arm64/include/asm/kvm_arm.h @@ -138,6 +138,9 @@ * The magic numbers used for VTTBR_X in this patch can be found in Tables * D4-23 and D4-25 in ARM DDI 0487A.b. */ +#define VTCR_EL2_COMMON_BITS (VTCR_EL2_SH0_INNER | VTCR_EL2_ORGN0_WBWA | \ + VTCR_EL2_IRGN0_WBWA | VTCR_EL2_T0SZ_40B) + #ifdef CONFIG_ARM64_64K_PAGES /* * Stage2 translation configuration: @@ -145,9 +148,8 @@ * 64kB pages (TG0 = 1) * 2 level page tables (SL = 1) */ -#define VTCR_EL2_FLAGS (VTCR_EL2_TG0_64K | VTCR_EL2_SH0_INNER | \ - VTCR_EL2_ORGN0_WBWA | VTCR_EL2_IRGN0_WBWA | \ - VTCR_EL2_SL0_LVL1 | VTCR_EL2_T0SZ_40B) +#define VTCR_EL2_FLAGS (VTCR_EL2_TG0_64K | VTCR_EL2_SL0_LVL1 | \ + VTCR_EL2_COMMON_BITS) #define VTTBR_X (38 - VTCR_EL2_T0SZ_40B) #else /* @@ -156,9 +158,8 @@ * 4kB pages (TG0 = 0) * 3 level page tables (SL = 1) */ -#define VTCR_EL2_FLAGS (VTCR_EL2_TG0_4K | VTCR_EL2_SH0_INNER | \ - VTCR_EL2_ORGN0_WBWA | VTCR_EL2_IRGN0_WBWA | \ - VTCR_EL2_SL0_LVL1 | VTCR_EL2_T0SZ_40B) +#define VTCR_EL2_FLAGS (VTCR_EL2_TG0_4K | VTCR_EL2_SL0_LVL1 | \ + VTCR_EL2_COMMON_BITS) #define VTTBR_X (37 - VTCR_EL2_T0SZ_40B) #endif -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Suzuki K. Poulose" <suzuki.poulose@arm.com> |
|---|---|
| Date | 2015-08-13 13:40 +0200 |
| Subject | [PATCH 05/14] arm64: Handle 4 level page table for swapper |
| Message-ID | <pWZ1x-22I-43@gated-at.bofh.it> |
| In reply to | #1206746 |
From: "Suzuki K. Poulose" <suzuki.poulose@arm.com> At the moment, we only support maximum of 3-level page table for swapper. With 48bit VA, 64K has only 3 levels and 4K uses section mapping. Add support for 4-level page table for swapper, needed by 16K pages. Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com> --- arch/arm64/kernel/head.S | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index 46670bf..01b8e58 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S @@ -271,7 +271,10 @@ ENDPROC(preserve_boot_args) */ .macro create_pgd_entry, tbl, virt, tmp1, tmp2 create_table_entry \tbl, \virt, PGDIR_SHIFT, PTRS_PER_PGD, \tmp1, \tmp2 -#if SWAPPER_PGTABLE_LEVELS == 3 +#if SWAPPER_PGTABLE_LEVELS > 3 + create_table_entry \tbl, \virt, PUD_SHIFT, PTRS_PER_PUD, \tmp1, \tmp2 +#endif +#if SWAPPER_PGTABLE_LEVELS > 2 create_table_entry \tbl, \virt, SWAPPER_TABLE_SHIFT, PTRS_PER_PTE, \tmp1, \tmp2 #endif .endm -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Suzuki K. Poulose" <suzuki.poulose@arm.com> |
|---|---|
| Date | 2015-08-13 13:40 +0200 |
| Subject | [PATCH 12/14] arm64: Check for selected granule support |
| Message-ID | <pWZ1x-22I-31@gated-at.bofh.it> |
| In reply to | #1206746 |
From: "Suzuki K. Poulose" <suzuki.poulose@arm.com> Ensure that the selected page size is supported by the CPU(s). Cc: Mark Rutland <mark.rutland@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com> --- arch/arm64/include/asm/sysreg.h | 6 ++++++ arch/arm64/kernel/head.S | 24 +++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h index a7f3d4b..e01d323 100644 --- a/arch/arm64/include/asm/sysreg.h +++ b/arch/arm64/include/asm/sysreg.h @@ -87,4 +87,10 @@ static inline void config_sctlr_el1(u32 clear, u32 set) } #endif +#define ID_AA64MMFR0_TGran4_SHIFT 28 +#define ID_AA64MMFR0_TGran64_SHIFT 24 + +#define ID_AA64MMFR0_TGran4_ENABLED 0x0 +#define ID_AA64MMFR0_TGran64_ENABLED 0x0 + #endif /* __ASM_SYSREG_H */ diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index 01b8e58..0cb04db 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S @@ -31,10 +31,11 @@ #include <asm/cputype.h> #include <asm/kernel-pgtable.h> #include <asm/memory.h> -#include <asm/thread_info.h> #include <asm/pgtable-hwdef.h> #include <asm/pgtable.h> #include <asm/page.h> +#include <asm/sysreg.h> +#include <asm/thread_info.h> #include <asm/virt.h> #define __PHYS_OFFSET (KERNEL_START - TEXT_OFFSET) @@ -606,9 +607,25 @@ ENDPROC(__secondary_switched) * x27 = *virtual* address to jump to upon completion * * other registers depend on the function called upon completion + * Checks if the selected granule size is supported by the CPU. */ +#if defined(CONFIG_ARM64_64K_PAGES) + +#define ID_AA64MMFR0_TGran_SHIFT ID_AA64MMFR0_TGran64_SHIFT +#define ID_AA64MMFR0_TGran_ENABLED ID_AA64MMFR0_TGran64_ENABLED + +#else + +#define ID_AA64MMFR0_TGran_SHIFT ID_AA64MMFR0_TGran4_SHIFT +#define ID_AA64MMFR0_TGran_ENABLED ID_AA64MMFR0_TGran4_ENABLED + +#endif .section ".idmap.text", "ax" __enable_mmu: + mrs x1, ID_AA64MMFR0_EL1 + ubfx x2, x1, #ID_AA64MMFR0_TGran_SHIFT, 4 + cmp x2, #ID_AA64MMFR0_TGran_ENABLED + b.ne __no_granule_support ldr x5, =vectors msr vbar_el1, x5 msr ttbr0_el1, x25 // load TTBR0 @@ -626,3 +643,8 @@ __enable_mmu: isb br x27 ENDPROC(__enable_mmu) + +__no_granule_support: + wfe + b __no_granule_support +ENDPROC(__no_granule_support) -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Steve Capper <steve.capper@linaro.org> |
|---|---|
| Date | 2015-08-13 14:30 +0200 |
| Subject | Re: [PATCH 12/14] arm64: Check for selected granule support |
| Message-ID | <pWZNU-3cO-13@gated-at.bofh.it> |
| In reply to | #1206750 |
On 13 August 2015 at 12:34, Suzuki K. Poulose <suzuki.poulose@arm.com> wrote: > From: "Suzuki K. Poulose" <suzuki.poulose@arm.com> > > Ensure that the selected page size is supported by the > CPU(s). > > Cc: Mark Rutland <mark.rutland@arm.com> > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: Will Deacon <will.deacon@arm.com> > Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com> > --- > arch/arm64/include/asm/sysreg.h | 6 ++++++ > arch/arm64/kernel/head.S | 24 +++++++++++++++++++++++- > 2 files changed, 29 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h > index a7f3d4b..e01d323 100644 > --- a/arch/arm64/include/asm/sysreg.h > +++ b/arch/arm64/include/asm/sysreg.h > @@ -87,4 +87,10 @@ static inline void config_sctlr_el1(u32 clear, u32 set) > } > #endif > > +#define ID_AA64MMFR0_TGran4_SHIFT 28 > +#define ID_AA64MMFR0_TGran64_SHIFT 24 > + > +#define ID_AA64MMFR0_TGran4_ENABLED 0x0 > +#define ID_AA64MMFR0_TGran64_ENABLED 0x0 > + > #endif /* __ASM_SYSREG_H */ > diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S > index 01b8e58..0cb04db 100644 > --- a/arch/arm64/kernel/head.S > +++ b/arch/arm64/kernel/head.S > @@ -31,10 +31,11 @@ > #include <asm/cputype.h> > #include <asm/kernel-pgtable.h> > #include <asm/memory.h> > -#include <asm/thread_info.h> > #include <asm/pgtable-hwdef.h> > #include <asm/pgtable.h> > #include <asm/page.h> > +#include <asm/sysreg.h> > +#include <asm/thread_info.h> > #include <asm/virt.h> > > #define __PHYS_OFFSET (KERNEL_START - TEXT_OFFSET) > @@ -606,9 +607,25 @@ ENDPROC(__secondary_switched) > * x27 = *virtual* address to jump to upon completion > * > * other registers depend on the function called upon completion > + * Checks if the selected granule size is supported by the CPU. > */ > +#if defined(CONFIG_ARM64_64K_PAGES) > + > +#define ID_AA64MMFR0_TGran_SHIFT ID_AA64MMFR0_TGran64_SHIFT > +#define ID_AA64MMFR0_TGran_ENABLED ID_AA64MMFR0_TGran64_ENABLED > + > +#else > + > +#define ID_AA64MMFR0_TGran_SHIFT ID_AA64MMFR0_TGran4_SHIFT > +#define ID_AA64MMFR0_TGran_ENABLED ID_AA64MMFR0_TGran4_ENABLED > + > +#endif > .section ".idmap.text", "ax" > __enable_mmu: > + mrs x1, ID_AA64MMFR0_EL1 > + ubfx x2, x1, #ID_AA64MMFR0_TGran_SHIFT, 4 > + cmp x2, #ID_AA64MMFR0_TGran_ENABLED > + b.ne __no_granule_support > ldr x5, =vectors > msr vbar_el1, x5 > msr ttbr0_el1, x25 // load TTBR0 > @@ -626,3 +643,8 @@ __enable_mmu: > isb > br x27 > ENDPROC(__enable_mmu) > + > +__no_granule_support: > + wfe > + b __no_granule_support > +ENDPROC(__no_granule_support) > -- > 1.7.9.5 > Hi Suzuki, Is is possible to tell the user that the kernel has failed to boot due to the kernel granule being unsupported? Cheers, -- Steve -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Suzuki K. Poulose" <Suzuki.Poulose@arm.com> |
|---|---|
| Date | 2015-08-13 16:50 +0200 |
| Subject | Re: [PATCH 12/14] arm64: Check for selected granule support |
| Message-ID | <pX1Zo-6gD-29@gated-at.bofh.it> |
| In reply to | #1206774 |
On 13/08/15 13:28, Steve Capper wrote: > On 13 August 2015 at 12:34, Suzuki K. Poulose <suzuki.poulose@arm.com> wrote: >> From: "Suzuki K. Poulose" <suzuki.poulose@arm.com> >> >> Ensure that the selected page size is supported by the >> CPU(s). >> >> Cc: Mark Rutland <mark.rutland@arm.com> >> Cc: Catalin Marinas <catalin.marinas@arm.com> >> Cc: Will Deacon <will.deacon@arm.com> >> Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com> >> --- >> arch/arm64/include/asm/sysreg.h | 6 ++++++ >> arch/arm64/kernel/head.S | 24 +++++++++++++++++++++++- >> 2 files changed, 29 insertions(+), 1 deletion(-) >> >> diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h >> index a7f3d4b..e01d323 100644 >> --- a/arch/arm64/include/asm/sysreg.h >> +++ b/arch/arm64/include/asm/sysreg.h >> @@ -87,4 +87,10 @@ static inline void config_sctlr_el1(u32 clear, u32 set) >> } >> #endif >> >> +#define ID_AA64MMFR0_TGran4_SHIFT 28 >> +#define ID_AA64MMFR0_TGran64_SHIFT 24 >> + >> +#define ID_AA64MMFR0_TGran4_ENABLED 0x0 >> +#define ID_AA64MMFR0_TGran64_ENABLED 0x0 >> + >> #endif /* __ASM_SYSREG_H */ >> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S >> index 01b8e58..0cb04db 100644 >> --- a/arch/arm64/kernel/head.S >> +++ b/arch/arm64/kernel/head.S >> @@ -31,10 +31,11 @@ >> #include <asm/cputype.h> >> #include <asm/kernel-pgtable.h> >> #include <asm/memory.h> >> -#include <asm/thread_info.h> >> #include <asm/pgtable-hwdef.h> >> #include <asm/pgtable.h> >> #include <asm/page.h> >> +#include <asm/sysreg.h> >> +#include <asm/thread_info.h> >> #include <asm/virt.h> >> >> #define __PHYS_OFFSET (KERNEL_START - TEXT_OFFSET) >> @@ -606,9 +607,25 @@ ENDPROC(__secondary_switched) >> * x27 = *virtual* address to jump to upon completion >> * >> * other registers depend on the function called upon completion >> + * Checks if the selected granule size is supported by the CPU. >> */ >> +#if defined(CONFIG_ARM64_64K_PAGES) >> + >> +#define ID_AA64MMFR0_TGran_SHIFT ID_AA64MMFR0_TGran64_SHIFT >> +#define ID_AA64MMFR0_TGran_ENABLED ID_AA64MMFR0_TGran64_ENABLED >> + >> +#else >> + >> +#define ID_AA64MMFR0_TGran_SHIFT ID_AA64MMFR0_TGran4_SHIFT >> +#define ID_AA64MMFR0_TGran_ENABLED ID_AA64MMFR0_TGran4_ENABLED >> + >> +#endif >> .section ".idmap.text", "ax" >> __enable_mmu: >> + mrs x1, ID_AA64MMFR0_EL1 >> + ubfx x2, x1, #ID_AA64MMFR0_TGran_SHIFT, 4 >> + cmp x2, #ID_AA64MMFR0_TGran_ENABLED >> + b.ne __no_granule_support >> ldr x5, =vectors >> msr vbar_el1, x5 >> msr ttbr0_el1, x25 // load TTBR0 >> @@ -626,3 +643,8 @@ __enable_mmu: >> isb >> br x27 >> ENDPROC(__enable_mmu) >> + >> +__no_granule_support: >> + wfe >> + b __no_granule_support >> +ENDPROC(__no_granule_support) >> -- >> 1.7.9.5 >> > > Hi Suzuki, > Is is possible to tell the user that the kernel has failed to boot due > to the kernel granule being unsupported? We don't have anything up at this time. The "looping address" is actually a clue to the (expert) user. Not sure we can do something, until we get something like DEBUG_LL(?) Or we should let it continue and end in a panic(?). The current situation can boot a multi-cluster system with boot cluster having the Tgran support(which doesn't make a strong use case though). I will try out some options and get back to you. Thanks Suzuki > > Cheers, > -- > Steve > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Catalin Marinas <catalin.marinas@arm.com> |
|---|---|
| Date | 2015-08-13 19:40 +0200 |
| Subject | Re: [PATCH 12/14] arm64: Check for selected granule support |
| Message-ID | <pX4DU-1Gi-3@gated-at.bofh.it> |
| In reply to | #1206877 |
On Thu, Aug 13, 2015 at 03:45:07PM +0100, Suzuki K. Poulose wrote: > On 13/08/15 13:28, Steve Capper wrote: > >On 13 August 2015 at 12:34, Suzuki K. Poulose <suzuki.poulose@arm.com> wrote: > >> __enable_mmu: > >>+ mrs x1, ID_AA64MMFR0_EL1 > >>+ ubfx x2, x1, #ID_AA64MMFR0_TGran_SHIFT, 4 > >>+ cmp x2, #ID_AA64MMFR0_TGran_ENABLED > >>+ b.ne __no_granule_support > >> ldr x5, =vectors > >> msr vbar_el1, x5 > >> msr ttbr0_el1, x25 // load TTBR0 > >>@@ -626,3 +643,8 @@ __enable_mmu: > >> isb > >> br x27 > >> ENDPROC(__enable_mmu) > >>+ > >>+__no_granule_support: > >>+ wfe > >>+ b __no_granule_support > >>+ENDPROC(__no_granule_support) > >>-- > >>1.7.9.5 > >> > > > >Is is possible to tell the user that the kernel has failed to boot due > >to the kernel granule being unsupported? > > We don't have anything up at this time. The "looping address" is actually a clue > to the (expert) user. Not sure we can do something, until we get something like DEBUG_LL(?) No. > Or we should let it continue and end in a panic(?). The current situation can boot a > multi-cluster system with boot cluster having the Tgran support(which doesn't make a > strong use case though). I will try out some options and get back to you. If the boot CPU does not support 16KB pages, in general there isn't much we can do since the console printing is done after we enabled the MMU. Even mapping the UART address requires fixmap support and the PAGE_SIZE is hard-coded in the kernel image. The DT is also mapped at run-time. While in theory it's possible to fall back to a 4KB page size just enough to load the DT and figure out the early console, I suggest we just live with the "looping address" clue. -- Catalin -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Suzuki K. Poulose" <suzuki.poulose@arm.com> |
|---|---|
| Date | 2015-08-13 13:40 +0200 |
| Subject | [PATCH 07/14] arm64: Kconfig: Fix help text about AArch32 support with 64K pages |
| Message-ID | <pWZ1x-22I-49@gated-at.bofh.it> |
| In reply to | #1206746 |
From: "Suzuki K. Poulose" <suzuki.poulose@arm.com> Update the help text for ARM64_64K_PAGES to reflect the reality about AArch32 support. Cc: Mark Rutland <mark.rutland@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com> --- arch/arm64/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index d1fb2a3..b247897 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -449,8 +449,8 @@ config ARM64_64K_PAGES help This feature enables 64KB pages support (4KB by default) allowing only two levels of page tables and faster TLB - look-up. AArch32 emulation is not available when this feature - is enabled. + look-up. AArch32 emulation requires applications compiled + with 64K aligned segments. endchoice -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Suzuki K. Poulose" <suzuki.poulose@arm.com> |
|---|---|
| Date | 2015-08-13 13:40 +0200 |
| Subject | [PATCH 06/14] arm64: Clean config usages for page size |
| Message-ID | <pWZ1x-22I-41@gated-at.bofh.it> |
| In reply to | #1206746 |
From: "Suzuki K. Poulose" <suzuki.poulose@arm.com>
We use !CONFIG_ARM64_64K_PAGES for CONFIG_ARM64_4K_PAGES
(and vice versa) in code. It all worked well, so far since
we only had two options. Now, with the introduction of 16K,
these cases will break. This patch cleans up the code to
use the required CONFIG symbol expression without the assumption
that !64K => 4K (and vice versa)
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Steve Capper <steve.capper@linaro.org>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com>
---
arch/arm64/Kconfig | 4 ++--
arch/arm64/Kconfig.debug | 2 +-
arch/arm64/include/asm/thread_info.h | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 78b89fa..d1fb2a3 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -550,7 +550,7 @@ config ARCH_WANT_GENERAL_HUGETLB
def_bool y
config ARCH_WANT_HUGE_PMD_SHARE
- def_bool y if !ARM64_64K_PAGES
+ def_bool y if ARM64_4K_PAGES
config HAVE_ARCH_TRANSPARENT_HUGEPAGE
def_bool y
@@ -762,7 +762,7 @@ source "fs/Kconfig.binfmt"
config COMPAT
bool "Kernel support for 32-bit EL0"
- depends on !ARM64_64K_PAGES || EXPERT
+ depends on ARM64_4K_PAGES || EXPERT
select COMPAT_BINFMT_ELF
select HAVE_UID16
select OLD_SIGSUSPEND3
diff --git a/arch/arm64/Kconfig.debug b/arch/arm64/Kconfig.debug
index d6285ef..c24d6ad 100644
--- a/arch/arm64/Kconfig.debug
+++ b/arch/arm64/Kconfig.debug
@@ -77,7 +77,7 @@ config DEBUG_RODATA
If in doubt, say Y
config DEBUG_ALIGN_RODATA
- depends on DEBUG_RODATA && !ARM64_64K_PAGES
+ depends on DEBUG_RODATA && ARM64_4K_PAGES
bool "Align linker sections up to SECTION_SIZE"
help
If this option is enabled, sections that may potentially be marked as
diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h
index dcd06d1..d9c8c9f 100644
--- a/arch/arm64/include/asm/thread_info.h
+++ b/arch/arm64/include/asm/thread_info.h
@@ -23,7 +23,7 @@
#include <linux/compiler.h>
-#ifndef CONFIG_ARM64_64K_PAGES
+#ifdef CONFIG_ARM64_4K_PAGES
#define THREAD_SIZE_ORDER 2
#endif
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Suzuki K. Poulose" <suzuki.poulose@arm.com> |
|---|---|
| Date | 2015-08-13 13:40 +0200 |
| Subject | [PATCH 08/14] arm64: kvm: Fix {V}TCR_EL2_TG0 mask |
| Message-ID | <pWZ1x-22I-47@gated-at.bofh.it> |
| In reply to | #1206746 |
From: "Suzuki K. Poulose" <suzuki.poulose@arm.com>
{V}TCR_EL2_TG0 is a 2bit wide field, where:
00 - 4K
01 - 64K
10 - 16K
But we use only 1 bit, which has worked well so far since
we never cared about 16K. Fix it for 16K support.
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Christoffer Dall <christoffer.dall@linaro.org>
Cc: kvmarm@lists.cs.columbia.edu
Acked-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com>
---
arch/arm64/include/asm/kvm_arm.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
index ac6fafb..52dc9cc 100644
--- a/arch/arm64/include/asm/kvm_arm.h
+++ b/arch/arm64/include/asm/kvm_arm.h
@@ -98,7 +98,7 @@
#define TCR_EL2_TBI (1 << 20)
#define TCR_EL2_PS (7 << 16)
#define TCR_EL2_PS_40B (2 << 16)
-#define TCR_EL2_TG0 (1 << 14)
+#define TCR_EL2_TG0 (3 << 14)
#define TCR_EL2_SH0 (3 << 12)
#define TCR_EL2_ORGN0 (3 << 10)
#define TCR_EL2_IRGN0 (3 << 8)
@@ -110,7 +110,7 @@
/* VTCR_EL2 Registers bits */
#define VTCR_EL2_PS_MASK (7 << 16)
-#define VTCR_EL2_TG0_MASK (1 << 14)
+#define VTCR_EL2_TG0_MASK (3 << 14)
#define VTCR_EL2_TG0_4K (0 << 14)
#define VTCR_EL2_TG0_64K (1 << 14)
#define VTCR_EL2_SH0_MASK (3 << 12)
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Suzuki K. Poulose" <suzuki.poulose@arm.com> |
|---|---|
| Date | 2015-08-13 13:40 +0200 |
| Subject | [PATCH 13/14] arm64: Add 16K page size support |
| Message-ID | <pWZ1x-22I-57@gated-at.bofh.it> |
| In reply to | #1206746 |
From: "Suzuki K. Poulose" <suzuki.poulose@arm.com>
This patch turns on the 16K page support in the kernel. We
support 48bit VA (4 level page tables) and 47bit VA (3 level
page tables).
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Steve Capper <steve.capper@linaro.org>
Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com>
---
arch/arm64/Kconfig | 25 ++++++++++++++++++++-----
arch/arm64/include/asm/fixmap.h | 4 +++-
arch/arm64/include/asm/kvm_arm.h | 12 ++++++++++++
arch/arm64/include/asm/page.h | 2 ++
arch/arm64/include/asm/sysreg.h | 2 ++
arch/arm64/include/asm/thread_info.h | 2 ++
arch/arm64/kernel/head.S | 7 ++++++-
arch/arm64/mm/proc.S | 4 +++-
8 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index b247897..8327edf 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -167,7 +167,8 @@ config PGTABLE_LEVELS
default 2 if ARM64_64K_PAGES && ARM64_VA_BITS_42
default 3 if ARM64_64K_PAGES && ARM64_VA_BITS_48
default 3 if ARM64_4K_PAGES && ARM64_VA_BITS_39
- default 4 if ARM64_4K_PAGES && ARM64_VA_BITS_48
+ default 3 if ARM64_16K_PAGES && ARM64_VA_BITS_47
+ default 4 if !ARM64_64K_PAGES && ARM64_VA_BITS_48
source "init/Kconfig"
@@ -444,6 +445,13 @@ config ARM64_4K_PAGES
help
This feature enables 4KB pages support.
+config ARM64_16K_PAGES
+ bool "16KB"
+ help
+ The system will use 16KB pages support. AArch32 emulation
+ requires applications compiled with 16K(or multiple of 16K)
+ aligned segments.
+
config ARM64_64K_PAGES
bool "64KB"
help
@@ -457,6 +465,7 @@ endchoice
choice
prompt "Virtual address space size"
default ARM64_VA_BITS_39 if ARM64_4K_PAGES
+ default ARM64_VA_BITS_47 if ARM64_16K_PAGES
default ARM64_VA_BITS_42 if ARM64_64K_PAGES
help
Allows choosing one of multiple possible virtual address
@@ -471,6 +480,10 @@ config ARM64_VA_BITS_42
bool "42-bit"
depends on ARM64_64K_PAGES
+config ARM64_VA_BITS_47
+ bool "47-bit"
+ depends on ARM64_16K_PAGES
+
config ARM64_VA_BITS_48
bool "48-bit"
@@ -480,6 +493,7 @@ config ARM64_VA_BITS
int
default 39 if ARM64_VA_BITS_39
default 42 if ARM64_VA_BITS_42
+ default 47 if ARM64_VA_BITS_47
default 48 if ARM64_VA_BITS_48
config CPU_BIG_ENDIAN
@@ -550,7 +564,7 @@ config ARCH_WANT_GENERAL_HUGETLB
def_bool y
config ARCH_WANT_HUGE_PMD_SHARE
- def_bool y if ARM64_4K_PAGES
+ def_bool y if ARM64_4K_PAGES || ARM64_16K_PAGES
config HAVE_ARCH_TRANSPARENT_HUGEPAGE
def_bool y
@@ -587,6 +601,7 @@ config XEN
config FORCE_MAX_ZONEORDER
int
default "14" if (ARM64_64K_PAGES && TRANSPARENT_HUGEPAGE)
+ default "12" if (ARM64_16K_PAGES && TRANSPARENT_HUGEPAGE)
default "11"
menuconfig ARMV8_DEPRECATED
@@ -773,9 +788,9 @@ config COMPAT
the user helper functions, VFP support and the ptrace interface are
handled appropriately by the kernel.
- If you also enabled CONFIG_ARM64_64K_PAGES, please be aware that you
- will only be able to execute AArch32 binaries that were compiled with
- 64k aligned segments.
+ If you use a page size other than 4KB(i.e, 16KB or 64KB), please be aware
+ that you will only be able to execute AArch32 binaries that were compiled
+ with page size aligned segments.
If you want to execute 32-bit userspace applications, say Y.
diff --git a/arch/arm64/include/asm/fixmap.h b/arch/arm64/include/asm/fixmap.h
index c0739187..f44a390 100644
--- a/arch/arm64/include/asm/fixmap.h
+++ b/arch/arm64/include/asm/fixmap.h
@@ -55,8 +55,10 @@ enum fixed_addresses {
* Temporary boot-time mappings, used by early_ioremap(),
* before ioremap() is functional.
*/
-#ifdef CONFIG_ARM64_64K_PAGES
+#if defined(CONFIG_ARM64_64K_PAGES)
#define NR_FIX_BTMAPS 4
+#elif defined (CONFIG_ARM64_16K_PAGES)
+#define NR_FIX_BTMAPS 16
#else
#define NR_FIX_BTMAPS 64
#endif
diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
index dcaf799..4d6a022 100644
--- a/arch/arm64/include/asm/kvm_arm.h
+++ b/arch/arm64/include/asm/kvm_arm.h
@@ -113,6 +113,7 @@
#define VTCR_EL2_TG0_MASK (3 << 14)
#define VTCR_EL2_TG0_4K (0 << 14)
#define VTCR_EL2_TG0_64K (1 << 14)
+#define VTCR_EL2_TG0_16K (2 << 14)
#define VTCR_EL2_SH0_MASK (3 << 12)
#define VTCR_EL2_SH0_INNER (3 << 12)
#define VTCR_EL2_ORGN0_MASK (3 << 10)
@@ -134,6 +135,8 @@
*
* Note that when using 4K pages, we concatenate two first level page tables
* together.
+ * With 16K pages, we concatenate 16 first level page tables and enter at
+ * level 2.
*
* The magic numbers used for VTTBR_X in this patch can be found in Tables
* D4-23 and D4-25 in ARM DDI 0487A.b.
@@ -151,6 +154,15 @@
#define VTCR_EL2_FLAGS (VTCR_EL2_TG0_64K | VTCR_EL2_SL0_LVL1 | \
VTCR_EL2_COMMON_BITS)
#define VTTBR_X (38 - VTCR_EL2_T0SZ_40B)
+#elif defined(CONFIG_ARM64_16K_PAGES)
+/*
+ * Stage2 translation configuration:
+ * 16kB pages (TG0 = 2)
+ * 2 level page tables (SL0 = 1)
+ */
+#define VTCR_EL2_FLAGS (VTCR_EL2_TG0_16K | VTCR_EL2_SL0_LVL1 | \
+ VTCR_EL2_COMMON_BITS)
+#define VTTBR_X (42 - VTCR_EL2_T0SZ_40B)
#else
/*
* Stage2 translation configuration:
diff --git a/arch/arm64/include/asm/page.h b/arch/arm64/include/asm/page.h
index 3c9ce8c..6aee732 100644
--- a/arch/arm64/include/asm/page.h
+++ b/arch/arm64/include/asm/page.h
@@ -22,6 +22,8 @@
/* PAGE_SHIFT determines the page size */
#ifdef CONFIG_ARM64_64K_PAGES
#define PAGE_SHIFT 16
+#elif defined(CONFIG_ARM64_16K_PAGES)
+#define PAGE_SHIFT 14
#else
#define PAGE_SHIFT 12
#endif
diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h
index e01d323..310592c 100644
--- a/arch/arm64/include/asm/sysreg.h
+++ b/arch/arm64/include/asm/sysreg.h
@@ -89,8 +89,10 @@ static inline void config_sctlr_el1(u32 clear, u32 set)
#define ID_AA64MMFR0_TGran4_SHIFT 28
#define ID_AA64MMFR0_TGran64_SHIFT 24
+#define ID_AA64MMFR0_TGran16_SHIFT 20
#define ID_AA64MMFR0_TGran4_ENABLED 0x0
#define ID_AA64MMFR0_TGran64_ENABLED 0x0
+#define ID_AA64MMFR0_TGran16_ENABLED 0x1
#endif /* __ASM_SYSREG_H */
diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h
index d9c8c9f..338a4ac 100644
--- a/arch/arm64/include/asm/thread_info.h
+++ b/arch/arm64/include/asm/thread_info.h
@@ -25,6 +25,8 @@
#ifdef CONFIG_ARM64_4K_PAGES
#define THREAD_SIZE_ORDER 2
+#elif defined(CONFIG_ARM64_16K_PAGES)
+#define THREAD_SIZE_ORDER 0
#endif
#define THREAD_SIZE 16384
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
index 0cb04db..959100b 100644
--- a/arch/arm64/kernel/head.S
+++ b/arch/arm64/kernel/head.S
@@ -614,7 +614,12 @@ ENDPROC(__secondary_switched)
#define ID_AA64MMFR0_TGran_SHIFT ID_AA64MMFR0_TGran64_SHIFT
#define ID_AA64MMFR0_TGran_ENABLED ID_AA64MMFR0_TGran64_ENABLED
-#else
+#elif defined(CONFIG_ARM64_16K_PAGES)
+
+#define ID_AA64MMFR0_TGran_SHIFT ID_AA64MMFR0_TGran16_SHIFT
+#define ID_AA64MMFR0_TGran_ENABLED ID_AA64MMFR0_TGran16_ENABLED
+
+#elif defined(CONFIG_ARM64_4K_PAGES)
#define ID_AA64MMFR0_TGran_SHIFT ID_AA64MMFR0_TGran4_SHIFT
#define ID_AA64MMFR0_TGran_ENABLED ID_AA64MMFR0_TGran4_ENABLED
diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S
index 6e8765a..182bced 100644
--- a/arch/arm64/mm/proc.S
+++ b/arch/arm64/mm/proc.S
@@ -30,7 +30,9 @@
#ifdef CONFIG_ARM64_64K_PAGES
#define TCR_TG_FLAGS TCR_TG0_64K | TCR_TG1_64K
-#else
+#elif defined(CONFIG_ARM64_16K_PAGES)
+#define TCR_TG_FLAGS TCR_TG0_16K | TCR_TG1_16K
+#else /* CONFIG_ARM64_4K_PAGES */
#define TCR_TG_FLAGS TCR_TG0_4K | TCR_TG1_4K
#endif
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Suzuki K. Poulose" <suzuki.poulose@arm.com> |
|---|---|
| Date | 2015-08-13 13:40 +0200 |
| Subject | [PATCH 10/14] arm: kvm: Move fake PGD handling to arch specific files |
| Message-ID | <pWZ1y-22I-61@gated-at.bofh.it> |
| In reply to | #1206746 |
From: "Suzuki K. Poulose" <suzuki.poulose@arm.com>
Rearrange the code for fake pgd handling, which is applicable
to only ARM64. The intention is to keep the common code cleaner,
unaware of the underlying hacks.
Cc: kvmarm@lists.cs.columbia.edu
Cc: christoffer.dall@linaro.org
Cc: Marc.Zyngier@arm.com
Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com>
---
arch/arm/include/asm/kvm_mmu.h | 7 ++++++
arch/arm/kvm/mmu.c | 44 +++++---------------------------------
arch/arm64/include/asm/kvm_mmu.h | 43 +++++++++++++++++++++++++++++++++++++
3 files changed, 55 insertions(+), 39 deletions(-)
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h
index 405aa18..1c9aa8a 100644
--- a/arch/arm/include/asm/kvm_mmu.h
+++ b/arch/arm/include/asm/kvm_mmu.h
@@ -173,6 +173,13 @@ static inline unsigned int kvm_get_hwpgd_size(void)
return PTRS_PER_S2_PGD * sizeof(pgd_t);
}
+static inline pgd_t *kvm_setup_fake_pgd(pgd_t *pgd)
+{
+ return pgd;
+}
+
+static inline void kvm_free_fake_pgd(pgd_t *pgd) {}
+
struct kvm;
#define kvm_flush_dcache_to_poc(a,l) __cpuc_flush_dcache_area((a), (l))
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 7b42012..b210622 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -677,43 +677,11 @@ int kvm_alloc_stage2_pgd(struct kvm *kvm)
* guest, we allocate a fake PGD and pre-populate it to point
* to the next-level page table, which will be the real
* initial page table pointed to by the VTTBR.
- *
- * When KVM_PREALLOC_LEVEL==2, we allocate a single page for
- * the PMD and the kernel will use folded pud.
- * When KVM_PREALLOC_LEVEL==1, we allocate 2 consecutive PUD
- * pages.
*/
- if (KVM_PREALLOC_LEVEL > 0) {
- int i;
-
- /*
- * Allocate fake pgd for the page table manipulation macros to
- * work. This is not used by the hardware and we have no
- * alignment requirement for this allocation.
- */
- pgd = kmalloc(PTRS_PER_S2_PGD * sizeof(pgd_t),
- GFP_KERNEL | __GFP_ZERO);
-
- if (!pgd) {
- kvm_free_hwpgd(hwpgd);
- return -ENOMEM;
- }
-
- /* Plug the HW PGD into the fake one. */
- for (i = 0; i < PTRS_PER_S2_PGD; i++) {
- if (KVM_PREALLOC_LEVEL == 1)
- pgd_populate(NULL, pgd + i,
- (pud_t *)hwpgd + i * PTRS_PER_PUD);
- else if (KVM_PREALLOC_LEVEL == 2)
- pud_populate(NULL, pud_offset(pgd, 0) + i,
- (pmd_t *)hwpgd + i * PTRS_PER_PMD);
- }
- } else {
- /*
- * Allocate actual first-level Stage-2 page table used by the
- * hardware for Stage-2 page table walks.
- */
- pgd = (pgd_t *)hwpgd;
+ pgd = kvm_setup_fake_pgd(hwpgd);
+ if (IS_ERR(pgd)) {
+ kvm_free_hwpgd(hwpgd);
+ return PTR_ERR(pgd);
}
kvm_clean_pgd(pgd);
@@ -820,9 +788,7 @@ void kvm_free_stage2_pgd(struct kvm *kvm)
unmap_stage2_range(kvm, 0, KVM_PHYS_SIZE);
kvm_free_hwpgd(kvm_get_hwpgd(kvm));
- if (KVM_PREALLOC_LEVEL > 0)
- kfree(kvm->arch.pgd);
-
+ kvm_free_fake_pgd(kvm->arch.pgd);
kvm->arch.pgd = NULL;
}
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h
index 6150567..2567fe8 100644
--- a/arch/arm64/include/asm/kvm_mmu.h
+++ b/arch/arm64/include/asm/kvm_mmu.h
@@ -198,6 +198,49 @@ static inline unsigned int kvm_get_hwpgd_size(void)
return PTRS_PER_S2_PGD * sizeof(pgd_t);
}
+/*
+ * Allocate fake pgd for the page table manipulation macros to
+ * work. This is not used by the hardware and we have no
+ * alignment requirement for this allocation.
+ */
+static inline pgd_t* kvm_setup_fake_pgd(pgd_t *hwpgd)
+{
+ int i;
+ pgd_t *pgd;
+
+ if (!KVM_PREALLOC_LEVEL)
+ return hwpgd;
+ /*
+ * When KVM_PREALLOC_LEVEL==2, we allocate a single page for
+ * the PMD and the kernel will use folded pud.
+ * When KVM_PREALLOC_LEVEL==1, we allocate 2 consecutive PUD
+ * pages.
+ */
+ pgd = kmalloc(PTRS_PER_S2_PGD * sizeof(pgd_t),
+ GFP_KERNEL | __GFP_ZERO);
+
+ if (!pgd)
+ return ERR_PTR(-ENOMEM);
+
+ /* Plug the HW PGD into the fake one. */
+ for (i = 0; i < PTRS_PER_S2_PGD; i++) {
+ if (KVM_PREALLOC_LEVEL == 1)
+ pgd_populate(NULL, pgd + i,
+ (pud_t *)hwpgd + i * PTRS_PER_PUD);
+ else if (KVM_PREALLOC_LEVEL == 2)
+ pud_populate(NULL, pud_offset(pgd, 0) + i,
+ (pmd_t *)hwpgd + i * PTRS_PER_PMD);
+ }
+
+ return pgd;
+}
+
+static inline void kvm_free_fake_pgd(pgd_t *pgd)
+{
+ if (KVM_PREALLOC_LEVEL > 0)
+ kfree(pgd);
+}
+
static inline bool kvm_page_empty(void *ptr)
{
struct page *ptr_page = virt_to_page(ptr);
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web