lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 19 Jul 2022 09:21:41 -0500 From: Mario Limonciello <mario.limonciello@....com> To: <mario.limonciello@....com>, Mika Westerberg <mika.westerberg@...ux.intel.com>, Andy Shevchenko <andriy.shevchenko@...ux.intel.com>, Linus Walleij <linus.walleij@...aro.org>, Bartosz Golaszewski <brgl@...ev.pl> CC: Pavel Krc <reg.krn@...c.net>, <linux-gpio@...r.kernel.org>, <linux-acpi@...r.kernel.org>, <linux-kernel@...r.kernel.org> Subject: [PATCH 1/2] gpiolib: acpi: Add support to ignore programming an interrupt gpiolib-acpi already had support for ignoring a pin for wakeup, but if an OEM configures a floating pin as an interrupt source then stopping it from being a wakeup won't do much good to stop the interrupt storm. Add support for a module parameter and quirk infrastructure to ignore interrupts as well. Tested-by: Pavel Krc <reg.krn@...c.net> Signed-off-by: Mario Limonciello <mario.limonciello@....com> --- drivers/gpio/gpiolib-acpi.c | 39 ++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index c2523ac26fac..375942d92d6f 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c @@ -32,9 +32,21 @@ MODULE_PARM_DESC(ignore_wake, "controller@pin combos on which to ignore the ACPI wake flag " "ignore_wake=controller@pin[,controller@pin[,...]]"); +static char *ignore_interrupt; +module_param(ignore_interrupt, charp, 0444); +MODULE_PARM_DESC(ignore_interrupt, + "controller@pin combos on which to ignore interrupt " + "ignore_interrupt=controller@pin[,controller@pin[,...]]"); + struct acpi_gpiolib_dmi_quirk { bool no_edge_events_on_boot; char *ignore_wake; + char *ignore_interrupt; +}; + +enum ignore_type { + IGNORE_WAKEUP, + IGNORE_INTERRUPT, }; /** @@ -317,14 +329,18 @@ static struct gpio_desc *acpi_request_own_gpiod(struct gpio_chip *chip, return desc; } -static bool acpi_gpio_in_ignore_list(const char *controller_in, unsigned int pin_in) +static bool acpi_gpio_in_ignore_list(const char *controller_in, unsigned int pin_in, + enum ignore_type type) { - const char *controller, *pin_str; + const char *controller = NULL, *pin_str; unsigned int pin; char *endp; int len; - controller = ignore_wake; + if (type == IGNORE_WAKEUP) + controller = ignore_wake; + else if (type == IGNORE_INTERRUPT) + controller = ignore_interrupt; while (controller) { pin_str = strchr(controller, '@'); if (!pin_str) @@ -348,7 +364,12 @@ static bool acpi_gpio_in_ignore_list(const char *controller_in, unsigned int pin return false; err: - pr_err_once("Error: Invalid value for gpiolib_acpi.ignore_wake: %s\n", ignore_wake); + if (type == IGNORE_WAKEUP) + pr_err_once("Error: Invalid value for gpiolib_acpi.ignore_wake: %s\n", + ignore_wake); + else if (type == IGNORE_INTERRUPT) + pr_err_once("Error: Invalid value for gpiolib_acpi.ignore_interrupt: %s\n", + ignore_interrupt); return false; } @@ -360,7 +381,7 @@ static bool acpi_gpio_irq_is_wake(struct device *parent, if (agpio->wake_capable != ACPI_WAKE_CAPABLE) return false; - if (acpi_gpio_in_ignore_list(dev_name(parent), pin)) { + if (acpi_gpio_in_ignore_list(dev_name(parent), pin, IGNORE_WAKEUP)) { dev_info(parent, "Ignoring wakeup on pin %u\n", pin); return false; } @@ -427,6 +448,11 @@ static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares, goto fail_unlock_irq; } + if (acpi_gpio_in_ignore_list(dev_name(chip->parent), pin, IGNORE_INTERRUPT)) { + dev_info(chip->parent, "Ignoring interrupt on pin %u\n", pin); + return AE_OK; + } + event = kzalloc(sizeof(*event), GFP_KERNEL); if (!event) goto fail_unlock_irq; @@ -1582,6 +1608,9 @@ static int __init acpi_gpio_setup_params(void) if (ignore_wake == NULL && quirk && quirk->ignore_wake) ignore_wake = quirk->ignore_wake; + if (ignore_interrupt == NULL && quirk && quirk->ignore_interrupt) + ignore_interrupt = quirk->ignore_interrupt; + return 0; } -- 2.34.1
Powered by blists - more mailing lists