Message ID | 1439465645-22584-13-git-send-email-suzuki.poulose@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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 kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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.
On 13 August 2015 at 19:29, Catalin Marinas <catalin.marinas@arm.com> wrote: > 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. > Couldn't we allocate some flag bits in the Image header to communicate the page size to the bootloader? -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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)