2017-07-17 10:24:10

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 0/5] ACPI / boot: Few amendments

This series does few amendments to architectural ACPI code related to
boot, in particularly to arch/x86/kernel/acpi/boot.c.

First two patches are amendments to satisfy compiler and static analyzer
(the order is changed from first version which had been applied; in case
of partial update first patch is already in tree).

Third patch might be useful on platforms when debugging *PIC related
code path to see how many legacy IRQs are registered.

Fourth and fifth patches are preparation for some interesting
implementation of ACPI HW reduced platforms (note, this does not mean
it's against specification, patch 5 actually about following
specification).

Fifth patch might be subject to additional discussions.

In v2:
- fix function declarations in ia64 and arm64 as well (Hanjun)
- add three more patches

Andy Shevchenko (5):
ACPI / boot: Don't define unused variables
ACPI / boot: Correct address space of __acpi_map_table()
ACPI / boot: Add number of legacy IRQs to debug output
ACPI / boot: Not all platform require acpi_reduced_hw_init()
ACPI / boot: Don't handle SCI on HW reduced platforms

arch/arm64/kernel/acpi.c | 4 ++--
arch/ia64/kernel/acpi.c | 4 ++--
arch/x86/kernel/acpi/boot.c | 15 +++++++++------
include/linux/acpi.h | 7 +++++--
4 files changed, 18 insertions(+), 12 deletions(-)

--
2.11.0


2017-07-17 10:24:12

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 1/5] ACPI / boot: Don't define unused variables

Some code in acpi_parse_x2apic() conditionally compiled, though parts of
it are being used in any case. This annoys gcc.

arch/x86/kernel/acpi/boot.c: In function ‘acpi_parse_x2apic’:
arch/x86/kernel/acpi/boot.c:203:5: warning: variable ‘enabled’ set but not used [-Wunused-but-set-variable]
u8 enabled;
^~~~~~~
arch/x86/kernel/acpi/boot.c:202:6: warning: variable ‘apic_id’ set but not used [-Wunused-but-set-variable]
int apic_id;
^~~~~~~

Re-arrange the code to avoid compiling unused variables.

Signed-off-by: Andy Shevchenko <[email protected]>
---
arch/x86/kernel/acpi/boot.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 6bb680671088..09ddb3cd627a 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -199,8 +199,10 @@ static int __init
acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end)
{
struct acpi_madt_local_x2apic *processor = NULL;
+#ifdef CONFIG_X86_X2APIC
int apic_id;
u8 enabled;
+#endif

processor = (struct acpi_madt_local_x2apic *)header;

@@ -209,9 +211,10 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end)

acpi_table_print_madt_entry(header);

+#ifdef CONFIG_X86_X2APIC
apic_id = processor->local_apic_id;
enabled = processor->lapic_flags & ACPI_MADT_ENABLED;
-#ifdef CONFIG_X86_X2APIC
+
/*
* We need to register disabled CPU as well to permit
* counting disabled CPUs. This allows us to size
--
2.11.0

2017-07-17 10:24:27

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 5/5] ACPI / boot: Don't handle SCI on HW reduced platforms

WIP

Signed-off-by: Andy Shevchenko <[email protected]>
---
arch/x86/kernel/acpi/boot.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 71c0feae60a4..4413cc2f7c3c 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -1184,7 +1184,7 @@ static int __init acpi_parse_madt_ioapic_entries(void)
* If BIOS did not supply an INT_SRC_OVR for the SCI
* pretend we got one so we can set the SCI flags.
*/
- if (!acpi_sci_override_gsi)
+ if (!acpi_sci_override_gsi && !acpi_gbl_reduced_hardware)
acpi_sci_ioapic_setup(acpi_gbl_FADT.sci_interrupt, 0, 0,
acpi_gbl_FADT.sci_interrupt);

--
2.11.0

2017-07-17 10:24:40

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 2/5] ACPI / boot: Correct address space of __acpi_map_table()

Sparse complains about wrong address space used in __acpi_map_table()
and in __acpi_unmap_table().

arch/x86/kernel/acpi/boot.c:127:29: warning: incorrect type in return expression (different address spaces)
arch/x86/kernel/acpi/boot.c:127:29: expected char *
arch/x86/kernel/acpi/boot.c:127:29: got void [noderef] <asn:2>*
arch/x86/kernel/acpi/boot.c:135:23: warning: incorrect type in argument 1 (different address spaces)
arch/x86/kernel/acpi/boot.c:135:23: expected void [noderef] <asn:2>*addr
arch/x86/kernel/acpi/boot.c:135:23: got char *map

Correct address space to be in align of type of returned and passed
parameter.

Signed-off-by: Andy Shevchenko <[email protected]>
---
arch/arm64/kernel/acpi.c | 4 ++--
arch/ia64/kernel/acpi.c | 4 ++--
arch/x86/kernel/acpi/boot.c | 4 ++--
include/linux/acpi.h | 4 ++--
4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c
index e25c11e727fe..b3162715ed78 100644
--- a/arch/arm64/kernel/acpi.c
+++ b/arch/arm64/kernel/acpi.c
@@ -95,7 +95,7 @@ static int __init dt_scan_depth1_nodes(unsigned long node,
* __acpi_map_table() will be called before page_init(), so early_ioremap()
* or early_memremap() should be called here to for ACPI table mapping.
*/
-char *__init __acpi_map_table(unsigned long phys, unsigned long size)
+void __init __iomem *__acpi_map_table(unsigned long phys, unsigned long size)
{
if (!size)
return NULL;
@@ -103,7 +103,7 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size)
return early_memremap(phys, size);
}

-void __init __acpi_unmap_table(char *map, unsigned long size)
+void __init __acpi_unmap_table(void __iomem *map, unsigned long size)
{
if (!map || !size)
return;
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c
index 7508c306aa9e..b9388cc283bc 100644
--- a/arch/ia64/kernel/acpi.c
+++ b/arch/ia64/kernel/acpi.c
@@ -159,12 +159,12 @@ int acpi_request_vector(u32 int_type)
return vector;
}

-char *__init __acpi_map_table(unsigned long phys_addr, unsigned long size)
+void __init __iomem *__acpi_map_table(unsigned long phys, unsigned long size)
{
return __va(phys_addr);
}

-void __init __acpi_unmap_table(char *map, unsigned long size)
+void __init __acpi_unmap_table(void __iomem *map, unsigned long size)
{
}

diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 09ddb3cd627a..6d5b1346268a 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -118,7 +118,7 @@ static u32 isa_irq_to_gsi[NR_IRQS_LEGACY] __read_mostly = {
* This is just a simple wrapper around early_ioremap(),
* with sanity checks for phys == 0 and size == 0.
*/
-char *__init __acpi_map_table(unsigned long phys, unsigned long size)
+void __init __iomem *__acpi_map_table(unsigned long phys, unsigned long size)
{

if (!phys || !size)
@@ -127,7 +127,7 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size)
return early_ioremap(phys, size);
}

-void __init __acpi_unmap_table(char *map, unsigned long size)
+void __init __acpi_unmap_table(void __iomem *map, unsigned long size)
{
if (!map || !size)
return;
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index c749eef1daa1..3848b56fcd83 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -228,8 +228,8 @@ struct acpi_subtable_proc {
int count;
};

-char * __acpi_map_table (unsigned long phys_addr, unsigned long size);
-void __acpi_unmap_table(char *map, unsigned long size);
+void __iomem *__acpi_map_table(unsigned long phys_addr, unsigned long size);
+void __acpi_unmap_table(void __iomem *map, unsigned long size);
int early_acpi_boot_init(void);
int acpi_boot_init (void);
void acpi_boot_table_init (void);
--
2.11.0

2017-07-17 10:25:03

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 4/5] ACPI / boot: Not all platform require acpi_reduced_hw_init()

Some platform might take care of legacy devices on theirs own.
Let's allow them to do that by exporting a weak function.

Signed-off-by: Andy Shevchenko <[email protected]>
---
arch/x86/kernel/acpi/boot.c | 2 +-
include/linux/acpi.h | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 0186d3bae610..71c0feae60a4 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -1348,7 +1348,7 @@ static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)
*
* We initialize the Hardware-reduced ACPI model here:
*/
-static void __init acpi_reduced_hw_init(void)
+void __init __weak acpi_reduced_hw_init(void)
{
if (acpi_gbl_reduced_hardware) {
/*
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 3848b56fcd83..3ef30a7b5444 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -230,6 +230,8 @@ struct acpi_subtable_proc {

void __iomem *__acpi_map_table(unsigned long phys_addr, unsigned long size);
void __acpi_unmap_table(void __iomem *map, unsigned long size);
+
+void acpi_reduced_hw_init(void);
int early_acpi_boot_init(void);
int acpi_boot_init (void);
void acpi_boot_table_init (void);
@@ -682,6 +684,7 @@ static inline struct device *acpi_get_first_physical_node(struct acpi_device *ad
static inline void acpi_early_init(void) { }
static inline void acpi_subsystem_init(void) { }

+static inline void acpi_reduced_hw_init(void) { }
static inline int early_acpi_boot_init(void)
{
return 0;
--
2.11.0

2017-07-17 10:25:11

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 3/5] ACPI / boot: Add number of legacy IRQs to debug output

Sometimes it's useful to have when mp_config_acpi_legacy_irqs() is called.

Signed-off-by: Andy Shevchenko <[email protected]>
---
arch/x86/kernel/acpi/boot.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 6d5b1346268a..0186d3bae610 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -1078,7 +1078,7 @@ static void __init mp_config_acpi_legacy_irqs(void)
mp_bus_id_to_type[MP_ISA_BUS] = MP_BUS_ISA;
#endif
set_bit(MP_ISA_BUS, mp_bus_not_pci);
- pr_debug("Bus #%d is ISA\n", MP_ISA_BUS);
+ pr_debug("Bus #%d is ISA (nIRQs: %d)\n", MP_ISA_BUS, nr_legacy_irqs());

/*
* Use the default configuration for the IRQs 0-15. Unless
--
2.11.0

2017-07-17 11:58:38

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH v2 0/5] ACPI / boot: Few amendments

On Monday, July 17, 2017 01:23:59 PM Andy Shevchenko wrote:
> This series does few amendments to architectural ACPI code related to
> boot, in particularly to arch/x86/kernel/acpi/boot.c.
>
> First two patches are amendments to satisfy compiler and static analyzer
> (the order is changed from first version which had been applied; in case
> of partial update first patch is already in tree).
>
> Third patch might be useful on platforms when debugging *PIC related
> code path to see how many legacy IRQs are registered.
>
> Fourth and fifth patches are preparation for some interesting
> implementation of ACPI HW reduced platforms (note, this does not mean
> it's against specification, patch 5 actually about following
> specification).
>
> Fifth patch might be subject to additional discussions.
>
> In v2:
> - fix function declarations in ia64 and arm64 as well (Hanjun)
> - add three more patches
>
> Andy Shevchenko (5):
> ACPI / boot: Don't define unused variables
> ACPI / boot: Correct address space of __acpi_map_table()
> ACPI / boot: Add number of legacy IRQs to debug output
> ACPI / boot: Not all platform require acpi_reduced_hw_init()
> ACPI / boot: Don't handle SCI on HW reduced platforms
>
> arch/arm64/kernel/acpi.c | 4 ++--
> arch/ia64/kernel/acpi.c | 4 ++--
> arch/x86/kernel/acpi/boot.c | 15 +++++++++------
> include/linux/acpi.h | 7 +++++--
> 4 files changed, 18 insertions(+), 12 deletions(-)

Can you please CC ACPI material to linux-acpi too?

Thanks,
Rafael

2017-07-17 13:30:30

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v2 0/5] ACPI / boot: Few amendments

On Mon, 2017-07-17 at 13:50 +0200, Rafael J. Wysocki wrote:
> On Monday, July 17, 2017 01:23:59 PM Andy Shevchenko wrote:
> >
> Can you please CC ACPI material to linux-acpi too?
>

Done.

--
Andy Shevchenko <[email protected]>
Intel Finland Oy

2017-07-18 09:03:24

by Geert Uytterhoeven

[permalink] [raw]
Subject: Re: [PATCH v2 2/5] ACPI / boot: Correct address space of __acpi_map_table()

Hi Andy,

On Mon, Jul 17, 2017 at 12:24 PM, Andy Shevchenko
<[email protected]> wrote:
> Sparse complains about wrong address space used in __acpi_map_table()
> and in __acpi_unmap_table().
>
> arch/x86/kernel/acpi/boot.c:127:29: warning: incorrect type in return expression (different address spaces)
> arch/x86/kernel/acpi/boot.c:127:29: expected char *
> arch/x86/kernel/acpi/boot.c:127:29: got void [noderef] <asn:2>*
> arch/x86/kernel/acpi/boot.c:135:23: warning: incorrect type in argument 1 (different address spaces)
> arch/x86/kernel/acpi/boot.c:135:23: expected void [noderef] <asn:2>*addr
> arch/x86/kernel/acpi/boot.c:135:23: got char *map
>
> Correct address space to be in align of type of returned and passed
> parameter.
>
> Signed-off-by: Andy Shevchenko <[email protected]>
> ---
> arch/arm64/kernel/acpi.c | 4 ++--

Thanks for the update!
I can confirm this fixes the arm64 build for me.

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds

2017-07-18 09:23:22

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v2 2/5] ACPI / boot: Correct address space of __acpi_map_table()

On Tue, 2017-07-18 at 11:03 +0200, Geert Uytterhoeven wrote:
> Hi Andy,
>
> On Mon, Jul 17, 2017 at 12:24 PM, Andy Shevchenko
> <[email protected]> wrote:
> > Sparse complains about wrong address space used in
> > __acpi_map_table()
> > and in __acpi_unmap_table().
> >
> > arch/x86/kernel/acpi/boot.c:127:29: warning: incorrect type in
> > return expression (different address spaces)
> > arch/x86/kernel/acpi/boot.c:127:29:    expected char *
> > arch/x86/kernel/acpi/boot.c:127:29:    got void [noderef] <asn:2>*
> > arch/x86/kernel/acpi/boot.c:135:23: warning: incorrect type in
> > argument 1 (different address spaces)
> > arch/x86/kernel/acpi/boot.c:135:23:    expected void [noderef]
> > <asn:2>*addr
> > arch/x86/kernel/acpi/boot.c:135:23:    got char *map
> >
> > Correct address space to be in align of type of returned and passed
> > parameter.
> >
> > Signed-off-by: Andy Shevchenko <[email protected]>
> > ---
> >  arch/arm64/kernel/acpi.c    | 4 ++--
>
> Thanks for the update!
> I can confirm this fixes the arm64 build for me.

Thanks to you and thanks to kbuild bot to check for ia64!

I will send v3 soon with fixed this part and extended patch 5.

--
Andy Shevchenko <[email protected]>
Intel Finland Oy

2017-07-18 09:56:01

by Hanjun Guo

[permalink] [raw]
Subject: Re: [PATCH v2 2/5] ACPI / boot: Correct address space of __acpi_map_table()

On 2017/7/18 17:23, Andy Shevchenko wrote:
> On Tue, 2017-07-18 at 11:03 +0200, Geert Uytterhoeven wrote:
>> Hi Andy,
>>
>> On Mon, Jul 17, 2017 at 12:24 PM, Andy Shevchenko
>> <[email protected]> wrote:
>>> Sparse complains about wrong address space used in
>>> __acpi_map_table()
>>> and in __acpi_unmap_table().
>>>
>>> arch/x86/kernel/acpi/boot.c:127:29: warning: incorrect type in
>>> return expression (different address spaces)
>>> arch/x86/kernel/acpi/boot.c:127:29: expected char *
>>> arch/x86/kernel/acpi/boot.c:127:29: got void [noderef] <asn:2>*
>>> arch/x86/kernel/acpi/boot.c:135:23: warning: incorrect type in
>>> argument 1 (different address spaces)
>>> arch/x86/kernel/acpi/boot.c:135:23: expected void [noderef]
>>> <asn:2>*addr
>>> arch/x86/kernel/acpi/boot.c:135:23: got char *map
>>>
>>> Correct address space to be in align of type of returned and passed
>>> parameter.
>>>
>>> Signed-off-by: Andy Shevchenko <[email protected]>
>>> ---
>>> arch/arm64/kernel/acpi.c | 4 ++--
>> Thanks for the update!
>> I can confirm this fixes the arm64 build for me.
> Thanks to you and thanks to kbuild bot to check for ia64!
>
> I will send v3 soon with fixed this part and extended patch 5.

Ah, sorry, there are some delays when I got this email...,
forget about my comments on patch 5.

Thanks
Hanjun