linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] arm64: dmi: initialize DMI earlier in boot
@ 2015-09-18 14:14 Mark Salter
  2015-09-18 14:31 ` Mark Rutland
  0 siblings, 1 reply; 4+ messages in thread
From: Mark Salter @ 2015-09-18 14:14 UTC (permalink / raw)
  To: linux-arm-kernel

Currently, DMI initialization takes place in a core initcall. This
limits how early in boot the kernel can make DMI-based decisions
about firmware/hardware quirks. This patch moves DMI initialization
to setup_arch() so that DMI info is available before initcalls run.

Signed-off-by: Mark Salter <msalter@redhat.com>
---
 arch/arm64/include/asm/dmi.h | 19 ++++++++++++++++---
 arch/arm64/kernel/efi.c      | 15 ---------------
 arch/arm64/kernel/setup.c    |  5 +++++
 3 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/arch/arm64/include/asm/dmi.h b/arch/arm64/include/asm/dmi.h
index 69d37d8..e6389fd 100644
--- a/arch/arm64/include/asm/dmi.h
+++ b/arch/arm64/include/asm/dmi.h
@@ -16,16 +16,29 @@
 
 #include <linux/io.h>
 #include <linux/slab.h>
+#include <linux/memblock.h>
 
 /*
  * According to section 2.3.6 of the UEFI spec, the firmware should not
  * request a virtual mapping for configuration tables such as SMBIOS.
  * This means we have to map them before use.
  */
-#define dmi_early_remap(x, l)		ioremap_cache(x, l)
-#define dmi_early_unmap(x, l)		iounmap(x)
+static inline __init void __iomem *dmi_early_remap(resource_size_t addr,
+						   unsigned long size)
+{
+	return (__force void __iomem *)early_memremap(addr, size);
+}
+
+#define dmi_early_unmap(x, l)		early_memunmap((__force void *)(x), l)
 #define dmi_remap(x, l)			ioremap_cache(x, l)
 #define dmi_unmap(x)			iounmap(x)
-#define dmi_alloc(l)			kzalloc(l, GFP_KERNEL)
+
+static inline __init void *dmi_alloc(size_t len)
+{
+	void *ptr = __va(memblock_alloc(len, sizeof(long)));
+
+	memset(ptr, 0, len);
+	return ptr;
+}
 
 #endif
diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c
index 7939667..b9e6afb 100644
--- a/arch/arm64/kernel/efi.c
+++ b/arch/arm64/kernel/efi.c
@@ -12,7 +12,6 @@
  */
 
 #include <linux/atomic.h>
-#include <linux/dmi.h>
 #include <linux/efi.h>
 #include <linux/export.h>
 #include <linux/memblock.h>
@@ -413,20 +412,6 @@ static int __init arm64_enable_runtime_services(void)
 }
 early_initcall(arm64_enable_runtime_services);
 
-static int __init arm64_dmi_init(void)
-{
-	/*
-	 * On arm64, DMI depends on UEFI, and dmi_scan_machine() needs to
-	 * be called early because dmi_id_init(), which is an arch_initcall
-	 * itself, depends on dmi_scan_machine() having been called already.
-	 */
-	dmi_scan_machine();
-	if (dmi_available)
-		dmi_set_dump_stack_arch_desc();
-	return 0;
-}
-core_initcall(arm64_dmi_init);
-
 static void efi_set_pgd(struct mm_struct *mm)
 {
 	if (mm == &init_mm)
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index dc9eb5f..200c2e9 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -46,6 +46,7 @@
 #include <linux/efi.h>
 #include <linux/personality.h>
 #include <linux/psci.h>
+#include <linux/dmi.h>
 
 #include <asm/acpi.h>
 #include <asm/fixmap.h>
@@ -436,6 +437,10 @@ void __init setup_arch(char **cmdline_p)
 	relocate_initrd();
 	request_standard_resources();
 
+	dmi_scan_machine();
+	if (dmi_available)
+		dmi_set_dump_stack_arch_desc();
+
 	early_ioremap_reset();
 
 	if (acpi_disabled) {
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH] arm64: dmi: initialize DMI earlier in boot
  2015-09-18 14:14 [PATCH] arm64: dmi: initialize DMI earlier in boot Mark Salter
@ 2015-09-18 14:31 ` Mark Rutland
  2015-09-18 15:26   ` Mark Salter
  0 siblings, 1 reply; 4+ messages in thread
From: Mark Rutland @ 2015-09-18 14:31 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Sep 18, 2015 at 03:14:26PM +0100, Mark Salter wrote:
> Currently, DMI initialization takes place in a core initcall. This
> limits how early in boot the kernel can make DMI-based decisions
> about firmware/hardware quirks. This patch moves DMI initialization
> to setup_arch() so that DMI info is available before initcalls run.

Which firmware/hardware quirks in particular necessitate moving this?

> 
> ---
>  arch/arm64/include/asm/dmi.h | 19 ++++++++++++++++---
>  arch/arm64/kernel/efi.c      | 15 ---------------
>  arch/arm64/kernel/setup.c    |  5 +++++
>  3 files changed, 21 insertions(+), 18 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/dmi.h b/arch/arm64/include/asm/dmi.h
> index 69d37d8..e6389fd 100644
> --- a/arch/arm64/include/asm/dmi.h
> +++ b/arch/arm64/include/asm/dmi.h
> @@ -16,16 +16,29 @@
>  
>  #include <linux/io.h>
>  #include <linux/slab.h>
> +#include <linux/memblock.h>

Nit: please keep includes ordered (given they were already).

[...]

> @@ -413,20 +412,6 @@ static int __init arm64_enable_runtime_services(void)
>  }
>  early_initcall(arm64_enable_runtime_services);
>  
> -static int __init arm64_dmi_init(void)
> -{
> -	/*
> -	 * On arm64, DMI depends on UEFI, and dmi_scan_machine() needs to
> -	 * be called early because dmi_id_init(), which is an arch_initcall
> -	 * itself, depends on dmi_scan_machine() having been called already.
> -	 */
> -	dmi_scan_machine();
> -	if (dmi_available)
> -		dmi_set_dump_stack_arch_desc();
> -	return 0;
> -}
> -core_initcall(arm64_dmi_init);
> -
>  static void efi_set_pgd(struct mm_struct *mm)
>  {
>  	if (mm == &init_mm)
> diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> index dc9eb5f..200c2e9 100644
> --- a/arch/arm64/kernel/setup.c
> +++ b/arch/arm64/kernel/setup.c
> @@ -46,6 +46,7 @@
>  #include <linux/efi.h>
>  #include <linux/personality.h>
>  #include <linux/psci.h>
> +#include <linux/dmi.h>
>  
>  #include <asm/acpi.h>
>  #include <asm/fixmap.h>
> @@ -436,6 +437,10 @@ void __init setup_arch(char **cmdline_p)
>  	relocate_initrd();
>  	request_standard_resources();
>  
> +	dmi_scan_machine();
> +	if (dmi_available)
> +		dmi_set_dump_stack_arch_desc();

We should have a comment as to why this needs to happen so early (much
like we used to).

Mark.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] arm64: dmi: initialize DMI earlier in boot
  2015-09-18 14:31 ` Mark Rutland
@ 2015-09-18 15:26   ` Mark Salter
  2015-09-18 15:37     ` Will Deacon
  0 siblings, 1 reply; 4+ messages in thread
From: Mark Salter @ 2015-09-18 15:26 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, 2015-09-18 at 15:31 +0100, Mark Rutland wrote:
> On Fri, Sep 18, 2015 at 03:14:26PM +0100, Mark Salter wrote:
> > Currently, DMI initialization takes place in a core initcall. This
> > limits how early in boot the kernel can make DMI-based decisions
> > about firmware/hardware quirks. This patch moves DMI initialization
> > to setup_arch() so that DMI info is available before initcalls run.
> 
> Which firmware/hardware quirks in particular necessitate moving this?

The thing that prompted it for me was my testing of Lorenzo's parking
protocol patch. I have a platform which has a quirky implementation of
that and which has modified firmware to implement it according to the
latest spec. So I need to tell the difference before secondary cores
were brought up. This doesn't really effect upstream in that there is
no need for backwards compatibility because there is no upstream
parking protocol support currently. But it seemed reasonable to post
this patch anyway since having DMI available earlier adds a little
more utility, generally.

> > ---
> >  arch/arm64/include/asm/dmi.h | 19 ++++++++++++++++---
> >  arch/arm64/kernel/efi.c      | 15 ---------------
> >  arch/arm64/kernel/setup.c    |  5 +++++
> >  3 files changed, 21 insertions(+), 18 deletions(-)
> > 
> > diff --git a/arch/arm64/include/asm/dmi.h b/arch/arm64/include/asm/dmi.h
> > index 69d37d8..e6389fd 100644
> > --- a/arch/arm64/include/asm/dmi.h
> > +++ b/arch/arm64/include/asm/dmi.h
> > @@ -16,16 +16,29 @@
> >  
> >  #include <linux/io.h>
> >  #include <linux/slab.h>
> > +#include <linux/memblock.h>
> 
> Nit: please keep includes ordered (given they were already).

Alphabetically? (some maintainers like them ordered by name length :)

> 
> [...]
> 
> > @@ -413,20 +412,6 @@ static int __init arm64_enable_runtime_services(void)
> >  }
> >  early_initcall(arm64_enable_runtime_services);
> >  
> > -static int __init arm64_dmi_init(void)
> > -{
> > -	/*
> > -	 * On arm64, DMI depends on UEFI, and dmi_scan_machine() needs to
> > -	 * be called early because dmi_id_init(), which is an arch_initcall
> > -	 * itself, depends on dmi_scan_machine() having been called already.
> > -	 */
> > -	dmi_scan_machine();
> > -	if (dmi_available)
> > -		dmi_set_dump_stack_arch_desc();
> > -	return 0;
> > -}
> > -core_initcall(arm64_dmi_init);
> > -
> >  static void efi_set_pgd(struct mm_struct *mm)
> >  {
> >  	if (mm == &init_mm)
> > diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> > index dc9eb5f..200c2e9 100644
> > --- a/arch/arm64/kernel/setup.c
> > +++ b/arch/arm64/kernel/setup.c
> > @@ -46,6 +46,7 @@
> >  #include <linux/efi.h>
> >  #include <linux/personality.h>
> >  #include <linux/psci.h>
> > +#include <linux/dmi.h>
> >  
> >  #include <asm/acpi.h>
> >  #include <asm/fixmap.h>
> > @@ -436,6 +437,10 @@ void __init setup_arch(char **cmdline_p)
> >  	relocate_initrd();
> >  	request_standard_resources();
> >  
> > +	dmi_scan_machine();
> > +	if (dmi_available)
> > +		dmi_set_dump_stack_arch_desc();
> 
> We should have a comment as to why this needs to happen so early (much
> like we used to).

The original comment was about why it should be core_initcall rather than
some other initcall, which is why I dropped it altogether.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] arm64: dmi: initialize DMI earlier in boot
  2015-09-18 15:26   ` Mark Salter
@ 2015-09-18 15:37     ` Will Deacon
  0 siblings, 0 replies; 4+ messages in thread
From: Will Deacon @ 2015-09-18 15:37 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Sep 18, 2015 at 04:26:08PM +0100, Mark Salter wrote:
> On Fri, 2015-09-18 at 15:31 +0100, Mark Rutland wrote:
> > On Fri, Sep 18, 2015 at 03:14:26PM +0100, Mark Salter wrote:
> > > Currently, DMI initialization takes place in a core initcall. This
> > > limits how early in boot the kernel can make DMI-based decisions
> > > about firmware/hardware quirks. This patch moves DMI initialization
> > > to setup_arch() so that DMI info is available before initcalls run.
> > 
> > Which firmware/hardware quirks in particular necessitate moving this?
> 
> The thing that prompted it for me was my testing of Lorenzo's parking
> protocol patch. I have a platform which has a quirky implementation of
> that and which has modified firmware to implement it according to the
> latest spec. So I need to tell the difference before secondary cores
> were brought up. This doesn't really effect upstream in that there is
> no need for backwards compatibility because there is no upstream
> parking protocol support currently. But it seemed reasonable to post
> this patch anyway since having DMI available earlier adds a little
> more utility, generally.

I think I'd rather hold off until we actually need this upstream for
something. The general tendency to move things earlier often causes
problems in the long-run.

> > > ---
> > >  arch/arm64/include/asm/dmi.h | 19 ++++++++++++++++---
> > >  arch/arm64/kernel/efi.c      | 15 ---------------
> > >  arch/arm64/kernel/setup.c    |  5 +++++
> > >  3 files changed, 21 insertions(+), 18 deletions(-)
> > > 
> > > diff --git a/arch/arm64/include/asm/dmi.h b/arch/arm64/include/asm/dmi.h
> > > index 69d37d8..e6389fd 100644
> > > --- a/arch/arm64/include/asm/dmi.h
> > > +++ b/arch/arm64/include/asm/dmi.h
> > > @@ -16,16 +16,29 @@
> > >  
> > >  #include <linux/io.h>
> > >  #include <linux/slab.h>
> > > +#include <linux/memblock.h>
> > 
> > Nit: please keep includes ordered (given they were already).
> 
> Alphabetically? (some maintainers like them ordered by name length :)

I prefer them ordered by hamming distance from the SHA1 of the file.

Will

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-09-18 15:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-18 14:14 [PATCH] arm64: dmi: initialize DMI earlier in boot Mark Salter
2015-09-18 14:31 ` Mark Rutland
2015-09-18 15:26   ` Mark Salter
2015-09-18 15:37     ` Will Deacon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).