From: Mario Limonciello mario.limonciello@amd.com
[ Upstream commit e1bdbbc98279164d910d2de82a745f090a8b249f ]
acpi_register_lps0_dev() and acpi_unregister_lps0_dev() may be used in drivers that don't require CONFIG_SUSPEND or compile on !X86.
Add prototypes for those cases.
Reported-by: kernel test robot lkp@intel.com Closes: https://lore.kernel.org/oe-kbuild-all/202502191627.fRgoBwcZ-lkp@intel.com/ Signed-off-by: Mario Limonciello mario.limonciello@amd.com Link: https://patch.msgid.link/20250407183656.1503446-1-superm1@kernel.org Signed-off-by: Rafael J. Wysocki rafael.j.wysocki@intel.com Signed-off-by: Sasha Levin sashal@kernel.org ---
**YES** This commit should be backported to stable kernel trees. **Analysis:** This commit fixes a clear build error that affects users in specific, but valid, kernel configurations. Here's the detailed analysis: **1. Clear Bug Fix:** The commit addresses missing function prototypes for `acpi_register_lps0_dev()` and `acpi_unregister_lps0_dev()` when `CONFIG_SUSPEND` or `CONFIG_X86` are not enabled. This causes compilation failures when drivers that use these functions are built without these config options. **2. Code Changes Analysis:** - **File Modified:** `include/linux/acpi.h` at lines 1108-1162 - **Before:** The `struct acpi_s2idle_dev_ops` was only defined within the `#if defined(CONFIG_SUSPEND) && defined(CONFIG_X86)` block, and the stub functions for `acpi_register_lps0_dev()` and `acpi_unregister_lps0_dev()` were missing from the `#else` clause. - **After:** The struct definition is moved outside the conditional block, and stub functions are added in the `#else` clause that return `-ENODEV` for registration and do nothing for unregistration. **3. Real-world Impact:** From examining the kernel tree, several drivers use these functions: - `/home/sasha/linux/drivers/platform/x86/amd/pmc/pmc.c` - AMD PMC driver calls `acpi_register_lps0_dev()` and `acpi_unregister_lps0_dev()` - `/home/sasha/linux/arch/x86/platform/atom/punit_atom_debug.c` - Intel Atom debug driver - `/home/sasha/linux/drivers/platform/x86/pmc_atom.c` - Intel PMC Atom driver These drivers can be enabled on platforms or configurations where `CONFIG_SUSPEND` or `CONFIG_X86` might not be set, causing build failures. **4. Minimal Risk:** - **Size:** Very small change - only adds stub function prototypes - **Scope:** Limited to header file, no runtime behavior changes for existing working configurations - **Side Effects:** None - the stubs return appropriate error codes and maintain API compatibility **5. Comparison with Similar Commits:** Looking at the provided similar commits, this follows the same pattern as commits #2, #3, and #4 (all marked as NO), which were prototype/warning fixes. However, this commit differs crucially because: - It fixes actual **build failures** (not just warnings) - The kernel test robot specifically reported compilation errors - It affects **real drivers** that are in use **6. Stable Tree Criteria Compliance:** - ✅ Fixes important bugs (build failures) - ✅ Doesn't introduce new features - ✅ Doesn't make architectural changes - ✅ Has minimal risk of regression - ✅ Is confined to a specific subsystem (ACPI headers) The commit message explicitly mentions "kernel test robot" reporting build failures, indicating this is a real issue affecting automated testing and potentially user builds. The fix is exactly what's needed for proper API completeness - providing stub implementations when the real functionality isn't available.
include/linux/acpi.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 4d5ee84c468ba..f826bb59556af 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -1110,13 +1110,13 @@ void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state,
acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state, u32 val_a, u32 val_b); -#if defined(CONFIG_SUSPEND) && defined(CONFIG_X86) struct acpi_s2idle_dev_ops { struct list_head list_node; void (*prepare)(void); void (*check)(void); void (*restore)(void); }; +#if defined(CONFIG_SUSPEND) && defined(CONFIG_X86) int acpi_register_lps0_dev(struct acpi_s2idle_dev_ops *arg); void acpi_unregister_lps0_dev(struct acpi_s2idle_dev_ops *arg); int acpi_get_lps0_constraint(struct acpi_device *adev); @@ -1125,6 +1125,13 @@ static inline int acpi_get_lps0_constraint(struct device *dev) { return ACPI_STATE_UNKNOWN; } +static inline int acpi_register_lps0_dev(struct acpi_s2idle_dev_ops *arg) +{ + return -ENODEV; +} +static inline void acpi_unregister_lps0_dev(struct acpi_s2idle_dev_ops *arg) +{ +} #endif /* CONFIG_SUSPEND && CONFIG_X86 */ void arch_reserve_mem_area(acpi_physical_address addr, size_t size); #else