Linux-ACPI Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH 0/2] ACPI: Tiny power button driver
@ 2020-02-11 23:36 Josh Triplett
  2020-02-11 23:37 ` [PATCH 1/2] ACPI: button: move HIDs to acpi/button.h Josh Triplett
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Josh Triplett @ 2020-02-11 23:36 UTC (permalink / raw)
  To: Rafael J. Wysocki, linux-acpi; +Cc: Arjan van de Ven, linux-kernel

Virtual machines often use an ACPI power button event to tell the
machine to shut down gracefully.

Provide an extremely lightweight "tiny power button" driver to handle
this event by signaling init directly, rather than running a separate
daemon (such as acpid or systemd-logind) that adds to startup time and
VM image complexity.

I originally proposed a change to the ACPI power button driver to
introduce an optional path to signal init, but Rafael expressed a
preference to have this as a separate, mutually exclusive driver
instead. The result did come out much simpler, conceptually, with the
added benefit of being able to disable CONFIG_INPUT entirely for a
kernel that exclusively targets cloud/VM systems.

The first patch in the series just moves HID definitions to
acpi/button.h in preparation for sharing them with the tiny-power-button
driver. The second patch provides the driver itself.

Josh Triplett (2):
  acpi: button: move HIDs to acpi/button.h
  acpi: Add new tiny-power-button driver to directly signal init

 drivers/acpi/Kconfig             | 24 +++++++++++++++++
 drivers/acpi/Makefile            |  1 +
 drivers/acpi/button.c            |  3 ---
 drivers/acpi/tiny-power-button.c | 46 ++++++++++++++++++++++++++++++++
 include/acpi/button.h            |  4 +++
 5 files changed, 75 insertions(+), 3 deletions(-)
 create mode 100644 drivers/acpi/tiny-power-button.c

-- 
2.25.0


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

* [PATCH 1/2] ACPI: button: move HIDs to acpi/button.h
  2020-02-11 23:36 [PATCH 0/2] ACPI: Tiny power button driver Josh Triplett
@ 2020-02-11 23:37 ` Josh Triplett
  2020-02-11 23:38 ` [PATCH 2/2] ACPI: Add new tiny-power-button driver to directly signal init Josh Triplett
  2020-02-13 22:43 ` [PATCH 0/2] ACPI: Tiny power button driver Rafael J. Wysocki
  2 siblings, 0 replies; 4+ messages in thread
From: Josh Triplett @ 2020-02-11 23:37 UTC (permalink / raw)
  To: Rafael J. Wysocki, linux-acpi; +Cc: Arjan van de Ven, linux-kernel

This makes it possible to use ACPI_BUTTON_HID_POWER in another driver.

Signed-off-by: Josh Triplett <josh@joshtriplett.org>
---
 drivers/acpi/button.c | 3 ---
 include/acpi/button.h | 4 ++++
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index f6925f16c4a2..00112cf15322 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -30,17 +30,14 @@
 #define ACPI_BUTTON_NOTIFY_STATUS	0x80
 
 #define ACPI_BUTTON_SUBCLASS_POWER	"power"
-#define ACPI_BUTTON_HID_POWER		"PNP0C0C"
 #define ACPI_BUTTON_DEVICE_NAME_POWER	"Power Button"
 #define ACPI_BUTTON_TYPE_POWER		0x01
 
 #define ACPI_BUTTON_SUBCLASS_SLEEP	"sleep"
-#define ACPI_BUTTON_HID_SLEEP		"PNP0C0E"
 #define ACPI_BUTTON_DEVICE_NAME_SLEEP	"Sleep Button"
 #define ACPI_BUTTON_TYPE_SLEEP		0x03
 
 #define ACPI_BUTTON_SUBCLASS_LID	"lid"
-#define ACPI_BUTTON_HID_LID		"PNP0C0D"
 #define ACPI_BUTTON_DEVICE_NAME_LID	"Lid Switch"
 #define ACPI_BUTTON_TYPE_LID		0x05
 
diff --git a/include/acpi/button.h b/include/acpi/button.h
index 340da7784cc8..af2fce5d2ee3 100644
--- a/include/acpi/button.h
+++ b/include/acpi/button.h
@@ -2,6 +2,10 @@
 #ifndef ACPI_BUTTON_H
 #define ACPI_BUTTON_H
 
+#define ACPI_BUTTON_HID_POWER	"PNP0C0C"
+#define ACPI_BUTTON_HID_LID	"PNP0C0D"
+#define ACPI_BUTTON_HID_SLEEP	"PNP0C0E"
+
 #if IS_ENABLED(CONFIG_ACPI_BUTTON)
 extern int acpi_lid_open(void);
 #else
-- 
2.25.0


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

* [PATCH 2/2] ACPI: Add new tiny-power-button driver to directly signal init
  2020-02-11 23:36 [PATCH 0/2] ACPI: Tiny power button driver Josh Triplett
  2020-02-11 23:37 ` [PATCH 1/2] ACPI: button: move HIDs to acpi/button.h Josh Triplett
@ 2020-02-11 23:38 ` Josh Triplett
  2020-02-13 22:43 ` [PATCH 0/2] ACPI: Tiny power button driver Rafael J. Wysocki
  2 siblings, 0 replies; 4+ messages in thread
From: Josh Triplett @ 2020-02-11 23:38 UTC (permalink / raw)
  To: Rafael J. Wysocki, linux-acpi; +Cc: Arjan van de Ven, linux-kernel

Virtual machines often use an ACPI power button event to tell the
machine to shut down gracefully.

Provide an extremely lightweight "tiny power button" driver to handle
this event by signaling init directly, rather than running a separate
daemon (such as acpid or systemd-logind) that adds to startup time and
VM image complexity.

The kernel configuration defines the default signal to send init, and
userspace can change this signal via a module parameter.

Suggested-by: "Rafael J. Wysocki" <rafael@kernel.org>
Signed-off-by: Josh Triplett <josh@joshtriplett.org>
---
 drivers/acpi/Kconfig             | 24 +++++++++++++++++
 drivers/acpi/Makefile            |  1 +
 drivers/acpi/tiny-power-button.c | 46 ++++++++++++++++++++++++++++++++
 3 files changed, 71 insertions(+)
 create mode 100644 drivers/acpi/tiny-power-button.c

diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
index cc57bab146b5..ce2730d61a8f 100644
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -190,6 +190,30 @@ config ACPI_BUTTON
 	  To compile this driver as a module, choose M here:
 	  the module will be called button.
 
+config ACPI_TINY_POWER_BUTTON
+	tristate "Tiny Power Button Driver"
+	depends on !ACPI_BUTTON
+	help
+	  This driver provides a tiny alternative to the ACPI Button driver.
+	  The tiny power button driver only handles the power button. Rather
+	  than notifying userspace via the input layer or a netlink event, this
+	  driver directly signals the init process to shut down.
+
+	  This driver is particularly suitable for cloud and VM environments,
+	  which use a simulated power button to initiate a controlled poweroff,
+	  but which may not want to run a separate userspace daemon to process
+	  input events.
+
+config ACPI_TINY_POWER_BUTTON_SIGNAL
+	int "Tiny Power Button Signal"
+	depends on ACPI_TINY_POWER_BUTTON
+	default 38
+	help
+	  Default signal to send to init in response to the power button.
+
+	  Likely values here include 38 (SIGRTMIN+4) to power off, or 2
+	  (SIGINT) to simulate Ctrl+Alt+Del.
+
 config ACPI_VIDEO
 	tristate "Video"
 	depends on X86 && BACKLIGHT_CLASS_DEVICE
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 33fdaf67454e..e81e1ebbfb32 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_ACPI_IPMI)		+= acpi_ipmi.o
 
 obj-$(CONFIG_ACPI_AC) 		+= ac.o
 obj-$(CONFIG_ACPI_BUTTON)	+= button.o
+obj-$(CONFIG_ACPI_TINY_POWER_BUTTON)	+= tiny-power-button.o
 obj-$(CONFIG_ACPI_FAN)		+= fan.o
 obj-$(CONFIG_ACPI_VIDEO)	+= video.o
 obj-$(CONFIG_ACPI_TAD)		+= acpi_tad.o
diff --git a/drivers/acpi/tiny-power-button.c b/drivers/acpi/tiny-power-button.c
new file mode 100644
index 000000000000..6273d73c0b59
--- /dev/null
+++ b/drivers/acpi/tiny-power-button.c
@@ -0,0 +1,46 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <linux/module.h>
+#include <linux/sched/signal.h>
+#include <linux/acpi.h>
+#include <acpi/button.h>
+
+ACPI_MODULE_NAME("tiny-power-button");
+MODULE_AUTHOR("Josh Triplett");
+MODULE_DESCRIPTION("ACPI Tiny Power Button Driver");
+MODULE_LICENSE("GPL");
+
+static int power_signal __read_mostly = CONFIG_ACPI_TINY_POWER_BUTTON_SIGNAL;
+module_param(power_signal, int, 0644);
+MODULE_PARM_DESC(power_signal, "Power button sends this signal to init");
+
+static const struct acpi_device_id tiny_power_button_device_ids[] = {
+	{ ACPI_BUTTON_HID_POWER, 0 },
+	{ ACPI_BUTTON_HID_POWERF, 0 },
+	{ "", 0 },
+};
+MODULE_DEVICE_TABLE(acpi, tiny_power_button_device_ids);
+
+static int acpi_noop_add_remove(struct acpi_device *device)
+{
+	return 0;
+}
+
+static void acpi_tiny_power_button_notify(struct acpi_device *device, u32 event)
+{
+	kill_cad_pid(power_signal, 1);
+}
+
+static struct acpi_driver acpi_tiny_power_button_driver = {
+	.name = "tiny-power-button",
+	.class = "tiny-power-button",
+	.ids = tiny_power_button_device_ids,
+	.ops = {
+		.add = acpi_noop_add_remove,
+		.remove = acpi_noop_add_remove,
+		.notify = acpi_tiny_power_button_notify,
+	},
+};
+
+module_driver(acpi_tiny_power_button_driver,
+		acpi_bus_register_driver,
+		acpi_bus_unregister_driver);
-- 
2.25.0


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

* Re: [PATCH 0/2] ACPI: Tiny power button driver
  2020-02-11 23:36 [PATCH 0/2] ACPI: Tiny power button driver Josh Triplett
  2020-02-11 23:37 ` [PATCH 1/2] ACPI: button: move HIDs to acpi/button.h Josh Triplett
  2020-02-11 23:38 ` [PATCH 2/2] ACPI: Add new tiny-power-button driver to directly signal init Josh Triplett
@ 2020-02-13 22:43 ` Rafael J. Wysocki
  2 siblings, 0 replies; 4+ messages in thread
From: Rafael J. Wysocki @ 2020-02-13 22:43 UTC (permalink / raw)
  To: Josh Triplett
  Cc: Rafael J. Wysocki, ACPI Devel Maling List, Arjan van de Ven,
	Linux Kernel Mailing List

On Wed, Feb 12, 2020 at 12:36 AM Josh Triplett <josh@joshtriplett.org> wrote:
>
> Virtual machines often use an ACPI power button event to tell the
> machine to shut down gracefully.
>
> Provide an extremely lightweight "tiny power button" driver to handle
> this event by signaling init directly, rather than running a separate
> daemon (such as acpid or systemd-logind) that adds to startup time and
> VM image complexity.
>
> I originally proposed a change to the ACPI power button driver to
> introduce an optional path to signal init, but Rafael expressed a
> preference to have this as a separate, mutually exclusive driver
> instead. The result did come out much simpler, conceptually, with the
> added benefit of being able to disable CONFIG_INPUT entirely for a
> kernel that exclusively targets cloud/VM systems.
>
> The first patch in the series just moves HID definitions to
> acpi/button.h in preparation for sharing them with the tiny-power-button
> driver. The second patch provides the driver itself.
>
> Josh Triplett (2):
>   acpi: button: move HIDs to acpi/button.h
>   acpi: Add new tiny-power-button driver to directly signal init

Applied as 5.7 material, thanks!

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

end of thread, back to index

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-11 23:36 [PATCH 0/2] ACPI: Tiny power button driver Josh Triplett
2020-02-11 23:37 ` [PATCH 1/2] ACPI: button: move HIDs to acpi/button.h Josh Triplett
2020-02-11 23:38 ` [PATCH 2/2] ACPI: Add new tiny-power-button driver to directly signal init Josh Triplett
2020-02-13 22:43 ` [PATCH 0/2] ACPI: Tiny power button driver Rafael J. Wysocki

Linux-ACPI Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-acpi/0 linux-acpi/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-acpi linux-acpi/ https://lore.kernel.org/linux-acpi \
		linux-acpi@vger.kernel.org
	public-inbox-index linux-acpi

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-acpi


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git