NOT_IMPLEMENTED refers to the software only; therefore AE_SUPPORT should be returned. Otherwise, seems like this may be a good idea. > -----Original Message----- > From: Hanjun Guo [mailto:hanjun.guo@xxxxxxxxxx] > Sent: Friday, September 13, 2013 3:06 AM > To: Rafael J. Wysocki; Len Brown > Cc: Zheng, Lv; Moore, Robert; linux-acpi@xxxxxxxxxxxxxxx; > patches@xxxxxxxxxx; linaro-kernel@xxxxxxxxxxxxxxxx; linaro- > acpi@xxxxxxxxxxxxxxxx; Hanjun Guo > Subject: [PATCH] ACPICA / hwreg: Use acpi_gbl_reduced_hardware to prevent > accessing PM registers > > On hardware reduced platforms, there is no support for the following: > - PM Event and Control registers > - SCI interrupt (and handler) > - Fixed Events > - General Purpose Events (GPEs) > - Global Lock > - ACPI PM timer > - FACS table (Waking vectors and Global Lock) > > acpi_gbl_reduced_hardware is a global flag and can be used to prevent > misbehavior on hardware reduced platforms, and this flag is initialized at > the very beginning of the system boot when FADT is parsed, this flag is > set to 1 when the FACP Hardware Reduced flag is set, so we can use it to > prevent accessing registers which do not exist on reduced hardware > platform. > > but when FACP Hardware Reduced flag is set, ACPI drivers will still access > some registers directly which do not exist on reduced hardware platform > and cause boot failure: > > [ 9.024370] Unable to handle kernel paging request at virtual address > ffffffbffbe00001 > [ 9.024423] pgd = ffffffc00007d000 > [ 9.024468] [ffffffbffbe00001] *pgd=000000008007f003, > *pmd=0000000000000000 > [ 9.024538] Internal error: Oops: 96000006 [#1] SMP > [ 9.024577] Modules linked in: > [ 9.024627] CPU: 0 Not tainted (3.9.0+ #3) > [ 9.024691] PC is at acpi_os_read_port+0x58/0xc8 > [ 9.024753] LR is at acpi_hw_read_port+0x4c/0xc4 > [ 9.024810] pc : [<ffffffc0002810cc>] lr : [<ffffffc0002a4fc4>] pstate: > 600003c5 > .... > [ 9.031956] Call trace: > [ 9.032021] [<ffffffc0002810cc>] acpi_os_read_port+0x58/0xc8 > [ 9.032094] [<ffffffc0002a4fc4>] acpi_hw_read_port+0x4c/0xc4 > [ 9.032165] [<ffffffc0002a4198>] acpi_hw_read+0x6c/0x100 > [ 9.032237] [<ffffffc0002a4250>] acpi_hw_read_multiple+0x24/0x70 > [ 9.032312] [<ffffffc0002a457c>] acpi_hw_register_read+0xa8/0x164 > [ 9.032386] [<ffffffc0002a52dc>] acpi_write_bit_register+0x9c/0x194 > [ 9.032472] [<ffffffc0002bffb4>] > acpi_processor_get_power_info+0x6c4/0x748 > [ 9.032550] [<ffffffc000565220>] acpi_processor_power_init+0xac/0x138 > [ 9.032630] [<ffffffc0003f3c00>] acpi_processor_start+0x48/0x138 > [ 9.032704] [<ffffffc000565118>] acpi_processor_add+0x43c/0x498 > [ 9.032784] [<ffffffc000283a74>] acpi_device_probe+0x3c/0x198 > [ 9.032862] [<ffffffc0002ef0fc>] driver_probe_device+0x90/0x348 > [ 9.032940] [<ffffffc0002ef450>] __driver_attach+0x9c/0xa0 > [ 9.033015] [<ffffffc0002ed40c>] bus_for_each_dev+0x4c/0x8c > [ 9.033090] [<ffffffc0002eeb98>] driver_attach+0x20/0x28 > [ 9.033166] [<ffffffc0002ee6e0>] bus_add_driver+0xfc/0x254 > [ 9.033244] [<ffffffc0002ef8b0>] driver_register+0x6c/0x184 > [ 9.033325] [<ffffffc000284894>] acpi_bus_register_driver+0x34/0x44 > [ 9.033400] [<ffffffc000559c60>] acpi_processor_init+0x28/0x40 > [ 9.033469] [<ffffffc000081438>] do_one_initcall+0x100/0x138 > [ 9.033544] [<ffffffc0005448c8>] kernel_init_freeable+0x128/0x1cc > [ 9.033620] [<ffffffc0003f2f90>] kernel_init+0x10/0xcc > [ 9.033700] Code: d2bf7c02 f2dff7e2 f2ffffe2 8b020000 (79400000) > [ 9.033843] ---[ end trace 64376967e6bc20a9 ]--- > [ 9.033995] Kernel panic - not syncing: Attempted to kill init! > exitcode=0x0000000b > > So acpi_gbl_reduced_hardware should be used to check if reduced hardware > or not, if it is reduced hardware, just return with some error and do not > access the no-existent registers. > > Signed-off-by: Hanjun Guo <hanjun.guo@xxxxxxxxxx> > --- > drivers/acpi/acpica/hwregs.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/drivers/acpi/acpica/hwregs.c b/drivers/acpi/acpica/hwregs.c > index 8d2e866..4c270c3 100644 > --- a/drivers/acpi/acpica/hwregs.c > +++ b/drivers/acpi/acpica/hwregs.c > @@ -265,6 +265,11 @@ acpi_status acpi_hw_clear_acpi_status(void) > > ACPI_FUNCTION_TRACE(hw_clear_acpi_status); > > + /* If Hardware Reduced flag is set, there are no GPEs */ > + if (acpi_gbl_reduced_hardware) { > + return_ACPI_STATUS(AE_NOT_IMPLEMENTED); > + } > + > ACPI_DEBUG_PRINT((ACPI_DB_IO, "About to write %04X to %8.8X%8.8X\n", > ACPI_BITMASK_ALL_FIXED_STATUS, > ACPI_FORMAT_UINT64(acpi_gbl_xpm1a_status.address))); > @@ -305,6 +310,10 @@ struct acpi_bit_register_info > *acpi_hw_get_bit_register_info(u32 register_id) { > ACPI_FUNCTION_ENTRY(); > > + if (acpi_gbl_reduced_hardware) { > + return (NULL); > + } > + > if (register_id > ACPI_BITREG_MAX) { > ACPI_ERROR((AE_INFO, "Invalid BitRegister ID: 0x%X", > register_id)); > @@ -337,6 +346,11 @@ acpi_status acpi_hw_write_pm1_control(u32 > pm1a_control, u32 pm1b_control) > > ACPI_FUNCTION_TRACE(hw_write_pm1_control); > > + /* If Hardware Reduced flag is set, there are no PM Control > registers */ > + if (acpi_gbl_reduced_hardware) { > + return_ACPI_STATUS(AE_NOT_IMPLEMENTED); > + } > + > status = > acpi_hw_write(pm1a_control, &acpi_gbl_FADT.xpm1a_control_block); > if (ACPI_FAILURE(status)) { > @@ -370,6 +384,11 @@ acpi_status acpi_hw_register_read(u32 register_id, > u32 *return_value) > > ACPI_FUNCTION_TRACE(hw_register_read); > > + /* If Hardware Reduced flag is set, there are no PM Control > registers */ > + if (acpi_gbl_reduced_hardware) { > + return_ACPI_STATUS(AE_NOT_IMPLEMENTED); > + } > + > switch (register_id) { > case ACPI_REGISTER_PM1_STATUS: /* PM1 A/B: 16-bit access each > */ > > @@ -465,6 +484,11 @@ acpi_status acpi_hw_register_write(u32 register_id, > u32 value) > > ACPI_FUNCTION_TRACE(hw_register_write); > > + /* If Hardware Reduced flag is set, there are no PM Control > registers */ > + if (acpi_gbl_reduced_hardware) { > + return_ACPI_STATUS(AE_NOT_IMPLEMENTED); > + } > + > switch (register_id) { > case ACPI_REGISTER_PM1_STATUS: /* PM1 A/B: 16-bit access each > */ > /* > -- > 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html