Merge branches 'acpi-resource', 'acpi-pm', 'acpi-platform-profile' and 'acpi-docs'

Merge an ACPI resources management update, ACPI power management
updates, an ACPI platform profile driver fix and an ACPI documentation
update related to device properties for 6.16-rc1:

 - Fix a typo for MECHREVO in irq1_edge_low_force_override[] (Mingcong
   Bai).

 - Add an LPS0 check() callback to the AMD pinctrl driver and fix up
   config symbol dependencies in it (Mario Limonciello, Rafael Wysocki).

 - Avoid initializing the ACPI platform profile driver on non-ACPI
   platforms (Alexandre Ghiti).

 - Document that references to ACPI data (non-device) nodes should use
   string-only references in hierarchical data node packages (Sakari
   Ailus).

* acpi-resource:
  ACPI: resource: fix a typo for MECHREVO in irq1_edge_low_force_override[]

* acpi-pm:
  pinctrl: amd: Fix hibernation support with CONFIG_SUSPEND unset
  pinctrl: amd: Fix use of undeclared identifier 'pinctrl_amd_s2idle_dev_ops'
  pinctrl: amd: Add an LPS0 check() callback
  ACPI: Add missing prototype for non CONFIG_SUSPEND/CONFIG_X86 case

* acpi-platform-profile:
  ACPI: platform_profile: Avoid initializing on non-ACPI platforms

* acpi-docs:
  Documentation: ACPI: Use all-string data node references
This commit is contained in:
Rafael J. Wysocki 2025-05-26 19:42:29 +02:00
7 changed files with 77 additions and 30 deletions

View File

@ -12,11 +12,14 @@ ACPI in general allows referring to device objects in the tree only.
Hierarchical data extension nodes may not be referred to directly, hence this
document defines a scheme to implement such references.
A reference consist of the device object name followed by one or more
hierarchical data extension [dsd-guide] keys. Specifically, the hierarchical
data extension node which is referred to by the key shall lie directly under
the parent object i.e. either the device object or another hierarchical data
extension node.
A reference to a _DSD hierarchical data node is a string consisting of a
device object reference followed by a dot (".") and a relative path to a data
node object. Do not use non-string references as this will produce a copy of
the hierarchical data node, not a reference!
The hierarchical data extension node which is referred to shall be located
directly under its parent object i.e. either the device object or another
hierarchical data extension node [dsd-guide].
The keys in the hierarchical data nodes shall consist of the name of the node,
"@" character and the number of the node in hexadecimal notation (without pre-
@ -33,11 +36,9 @@ extension key.
Example
=======
In the ASL snippet below, the "reference" _DSD property contains a
device object reference to DEV0 and under that device object, a
hierarchical data extension key "node@1" referring to the NOD1 object
and lastly, a hierarchical data extension key "anothernode" referring to
the ANOD object which is also the final target node of the reference.
In the ASL snippet below, the "reference" _DSD property contains a string
reference to a hierarchical data extension node ANOD under DEV0 under the parent
of DEV1. ANOD is also the final target node of the reference.
::
Device (DEV0)
@ -76,10 +77,7 @@ the ANOD object which is also the final target node of the reference.
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {
"reference", Package () {
^DEV0, "node@1", "anothernode"
}
Package () { "reference", "^DEV0.ANOD" }
},
}
})

View File

@ -66,12 +66,9 @@ of that port shall be zero. Similarly, if a port may only have a single
endpoint, the number of that endpoint shall be zero.
The endpoint reference uses property extension with "remote-endpoint" property
name followed by a reference in the same package. Such references consist of
the remote device reference, the first package entry of the port data extension
reference under the device and finally the first package entry of the endpoint
data extension reference under the port. Individual references thus appear as::
name followed by a string reference in the same package. [data-node-ref]::
Package() { device, "port@X", "endpoint@Y" }
"device.datanode"
In the above example, "X" is the number of the port and "Y" is the number of
the endpoint.
@ -109,7 +106,7 @@ A simple example of this is show below::
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () { "reg", 0 },
Package () { "remote-endpoint", Package() { \_SB.PCI0.ISP, "port@4", "endpoint@0" } },
Package () { "remote-endpoint", "\\_SB.PCI0.ISP.EP40" },
}
})
}
@ -141,7 +138,7 @@ A simple example of this is show below::
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () { "reg", 0 },
Package () { "remote-endpoint", Package () { \_SB.PCI0.I2C2.CAM0, "port@0", "endpoint@0" } },
Package () { "remote-endpoint", "\\_SB.PCI0.I2C2.CAM0.EP00" },
}
})
}

View File

@ -15,11 +15,6 @@ Referring to LEDs in Device tree is documented in [video-interfaces], in
"flash-leds" property documentation. In short, LEDs are directly referred to by
using phandles.
While Device tree allows referring to any node in the tree [devicetree], in
ACPI references are limited to device nodes only [acpi]. For this reason using
the same mechanism on ACPI is not possible. A mechanism to refer to non-device
ACPI nodes is documented in [data-node-ref].
ACPI allows (as does DT) using integer arguments after the reference. A
combination of the LED driver device reference and an integer argument,
referring to the "reg" property of the relevant LED, is used to identify
@ -74,7 +69,7 @@ omitted. ::
Package () {
Package () {
"flash-leds",
Package () { ^LED, "led@0", ^LED, "led@1" },
Package () { "^LED.LED0", "^LED.LED1" },
}
}
})

View File

@ -688,6 +688,9 @@ static int __init platform_profile_init(void)
{
int err;
if (acpi_disabled)
return -EOPNOTSUPP;
err = class_register(&platform_profile_class);
if (err)
return err;

View File

@ -534,7 +534,7 @@ static const struct dmi_system_id irq1_level_low_skip_override[] = {
*/
static const struct dmi_system_id irq1_edge_low_force_override[] = {
{
/* MECHREV Jiaolong17KS Series GM7XG0M */
/* MECHREVO Jiaolong17KS Series GM7XG0M */
.matches = {
DMI_MATCH(DMI_BOARD_NAME, "GM7XG0M"),
},

View File

@ -37,6 +37,10 @@
#include "pinctrl-utils.h"
#include "pinctrl-amd.h"
#ifdef CONFIG_SUSPEND
static struct amd_gpio *pinctrl_dev;
#endif
static int amd_gpio_get_direction(struct gpio_chip *gc, unsigned offset)
{
unsigned long flags;
@ -890,6 +894,44 @@ static void amd_gpio_irq_init(struct amd_gpio *gpio_dev)
}
}
#if defined(CONFIG_SUSPEND) && defined(CONFIG_ACPI)
static void amd_gpio_check_pending(void)
{
struct amd_gpio *gpio_dev = pinctrl_dev;
struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
int i;
if (!pm_debug_messages_on)
return;
for (i = 0; i < desc->npins; i++) {
int pin = desc->pins[i].number;
u32 tmp;
tmp = readl(gpio_dev->base + pin * 4);
if (tmp & PIN_IRQ_PENDING)
pm_pr_dbg("%s: GPIO %d is active: 0x%x.\n", __func__, pin, tmp);
}
}
static struct acpi_s2idle_dev_ops pinctrl_amd_s2idle_dev_ops = {
.check = amd_gpio_check_pending,
};
static void amd_gpio_register_s2idle_ops(void)
{
acpi_register_lps0_dev(&pinctrl_amd_s2idle_dev_ops);
}
static void amd_gpio_unregister_s2idle_ops(void)
{
acpi_unregister_lps0_dev(&pinctrl_amd_s2idle_dev_ops);
}
#else
static inline void amd_gpio_register_s2idle_ops(void) {}
static inline void amd_gpio_unregister_s2idle_ops(void) {}
#endif
#ifdef CONFIG_PM_SLEEP
static bool amd_gpio_should_save(struct amd_gpio *gpio_dev, unsigned int pin)
{
@ -942,6 +984,9 @@ static int amd_gpio_suspend_hibernate_common(struct device *dev, bool is_suspend
static int amd_gpio_suspend(struct device *dev)
{
#ifdef CONFIG_SUSPEND
pinctrl_dev = dev_get_drvdata(dev);
#endif
return amd_gpio_suspend_hibernate_common(dev, true);
}
@ -1115,7 +1160,7 @@ static int amd_gpio_probe(struct platform_device *pdev)
if (gpio_dev->irq < 0)
return gpio_dev->irq;
#ifdef CONFIG_PM_SLEEP
#ifdef CONFIG_SUSPEND
gpio_dev->saved_regs = devm_kcalloc(&pdev->dev, amd_pinctrl_desc.npins,
sizeof(*gpio_dev->saved_regs),
GFP_KERNEL);
@ -1181,6 +1226,7 @@ static int amd_gpio_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, gpio_dev);
acpi_register_wakeup_handler(gpio_dev->irq, amd_gpio_check_wake, gpio_dev);
amd_gpio_register_s2idle_ops();
dev_dbg(&pdev->dev, "amd gpio driver loaded\n");
return ret;
@ -1199,6 +1245,7 @@ static void amd_gpio_remove(struct platform_device *pdev)
gpiochip_remove(&gpio_dev->gc);
acpi_unregister_wakeup_handler(amd_gpio_check_wake, gpio_dev);
amd_gpio_unregister_s2idle_ops();
}
#ifdef CONFIG_ACPI

View File

@ -1134,13 +1134,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);
@ -1149,6 +1149,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