* [PATCH v5 0/5] Fix, extend and support OF to mc13xxx pwrbutton
From: Alexander Kurz @ 2025-10-08 6:43 UTC (permalink / raw)
To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Dmitry Torokhov, Dzmitry Sankouski, Dr. David Alan Gilbert,
Heiko Stuebner, Uwe Kleine-König, devicetree, linux-input
Cc: linux-kernel, Alexander Kurz
Goal of this patch series is to make the mc13892 PWRON1 button usable,
found e.g. on amazon kindle D01100/D01200/EY21 readers.
A ten-year-old IRQ issue needed a fix, mc13783-pwrbutton had to be
extended to the other to mc13xxx PMIC as well and adding OF support.
The implementation has been tested only with PWRON1 on an mc13892.
Changes in v5:
- Link to v4: https://lore.kernel.org/linux-input/20250914193723.10544-1-akurz@blala.de/
- Rebase to current to include already merged dt-schema patches and
a different mc13xxx related patch.
- Drop patch to use devm_mfd_add_devices and devm_regmap_add_irq_chip -
won't like to do the proposed mutex-cleanup now.
- While adding OF support, remove the platform_data configuration
interface as proposed by Dmitry Torokhov. Also drop the change
to use module_platform_driver_probe.
Changes in v4:
- Link to v3: https://lore.kernel.org/linux-input/20250829201517.15374-1-akurz@blala.de/
- Rebase to git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git
tags/ib-mfd-input-rtc-v6.18 in order to include a different mc13xxx
related patch (sorry for that).
- Re-ordered commits since dt-bindings changes already go reviewes by
Rob Herring.
- Following Dmitrys suggestions, resources for irq are now passed from
mfd to input allowing a more simple implementation. Work on other mfd
cells with irq usage might still be a future project.
- Input-related differences between the mc13xxx variants are encoded
in data structures, making the implementation of mc13892 PWRON3 a
simple task.
Changes in v3:
- Link to v2: https://lore.kernel.org/linux-input/20250823144441.12654-1-akurz@blala.de/
- Undo all changes to led-control (rename to fsl,led-control), thanks Rob
- Restructured the new buttons node for unevaluatedProperties: false
- Various other remarks from Rob
- Rebase to current state
Changes in v2:
- Link to v1: https://lore.kernel.org/linux-input/20250817102751.29709-1-akurz@blala.de/
- Convert dt-bindings from txt to fsl,mc13xxx.yaml and add vendor prefix
to led-control property, causing changes in dts and driver.
- Change node name from pwrbuttons to buttons
- Change property debounce-delay-value to debounce-delay-ms
- Fixed a section mismatch error
- Fixed https://lore.kernel.org/r/202508210551.VzAtE5re-lkp@intel.com/
(wrong index used when converting to array access)
- Usage of generic device properties API in mc13783-pwrbutton.c
- Provide chip-specific max button id via platform_device_id, therefore
swap patches 3 and 4.
Alexander Kurz (5):
Input: mc13783-pwrbutton: use managed resources
Input: mc13783-pwrbutton: fix irq mixup and use resources
Input: mc13783-pwrbutton: convert pdata members to array
Input: mc13783-pwrbutton: enable other mc13xxx PMIC
Input: mc13783-pwrbutton: add OF support and drop platform_data
drivers/input/misc/Kconfig | 4 +-
drivers/input/misc/mc13783-pwrbutton.c | 278 ++++++++++++++-----------
drivers/mfd/mc13xxx-core.c | 49 ++++-
drivers/mfd/mc13xxx.h | 2 +
include/linux/mfd/mc13783.h | 4 +-
include/linux/mfd/mc13892.h | 1 +
include/linux/mfd/mc13xxx.h | 20 +-
7 files changed, 207 insertions(+), 151 deletions(-)
--
2.39.5
^ permalink raw reply
* [PATCH v5 3/5] Input: mc13783-pwrbutton: convert pdata members to array
From: Alexander Kurz @ 2025-10-08 6:43 UTC (permalink / raw)
To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Dmitry Torokhov, Dzmitry Sankouski, Dr. David Alan Gilbert,
Heiko Stuebner, Uwe Kleine-König, devicetree, linux-input
Cc: linux-kernel, Alexander Kurz
In-Reply-To: <20251008064401.13863-1-akurz@blala.de>
As preparation for the extension of support for all three mc13xxx
variants, convert the members of mc13xxx_buttons_platform_data to
arrays to allow index access within the next commit.
Signed-off-by: Alexander Kurz <akurz@blala.de>
---
drivers/input/misc/mc13783-pwrbutton.c | 42 +++++++++++++-------------
include/linux/mfd/mc13xxx.h | 8 ++---
2 files changed, 23 insertions(+), 27 deletions(-)
diff --git a/drivers/input/misc/mc13783-pwrbutton.c b/drivers/input/misc/mc13783-pwrbutton.c
index 20f68aab6edf..2ee115d77b1c 100644
--- a/drivers/input/misc/mc13783-pwrbutton.c
+++ b/drivers/input/misc/mc13783-pwrbutton.c
@@ -108,24 +108,24 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
if (!priv)
return -ENOMEM;
- reg |= (pdata->b1on_flags & 0x3) << MC13783_POWER_CONTROL_2_ON1BDBNC;
- reg |= (pdata->b2on_flags & 0x3) << MC13783_POWER_CONTROL_2_ON2BDBNC;
- reg |= (pdata->b3on_flags & 0x3) << MC13783_POWER_CONTROL_2_ON3BDBNC;
+ reg |= (pdata->b_on_flags[0] & 0x3) << MC13783_POWER_CONTROL_2_ON1BDBNC;
+ reg |= (pdata->b_on_flags[1] & 0x3) << MC13783_POWER_CONTROL_2_ON2BDBNC;
+ reg |= (pdata->b_on_flags[2] & 0x3) << MC13783_POWER_CONTROL_2_ON3BDBNC;
priv->pwr = pwr;
priv->mc13783 = mc13783;
mc13xxx_lock(mc13783);
- if (pdata->b1on_flags & MC13783_BUTTON_ENABLE) {
- priv->keymap[0] = pdata->b1on_key;
- if (pdata->b1on_key != KEY_RESERVED)
- __set_bit(pdata->b1on_key, pwr->keybit);
+ if (pdata->b_on_flags[0] & MC13783_BUTTON_ENABLE) {
+ priv->keymap[0] = pdata->b_on_key[0];
+ if (pdata->b_on_key[0] != KEY_RESERVED)
+ __set_bit(pdata->b_on_key[0], pwr->keybit);
- if (pdata->b1on_flags & MC13783_BUTTON_POL_INVERT)
+ if (pdata->b_on_flags[0] & MC13783_BUTTON_POL_INVERT)
priv->flags |= MC13783_PWRB_B1_POL_INVERT;
- if (pdata->b1on_flags & MC13783_BUTTON_RESET_EN)
+ if (pdata->b_on_flags[0] & MC13783_BUTTON_RESET_EN)
reg |= MC13783_POWER_CONTROL_2_ON1BRSTEN;
irq = platform_get_irq_byname(pdev, "b1on");
@@ -144,15 +144,15 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
priv->irq[0] = irq;
}
- if (pdata->b2on_flags & MC13783_BUTTON_ENABLE) {
- priv->keymap[1] = pdata->b2on_key;
- if (pdata->b2on_key != KEY_RESERVED)
- __set_bit(pdata->b2on_key, pwr->keybit);
+ if (pdata->b_on_flags[1] & MC13783_BUTTON_ENABLE) {
+ priv->keymap[1] = pdata->b_on_key[1];
+ if (pdata->b_on_key[1] != KEY_RESERVED)
+ __set_bit(pdata->b_on_key[1], pwr->keybit);
- if (pdata->b2on_flags & MC13783_BUTTON_POL_INVERT)
+ if (pdata->b_on_flags[1] & MC13783_BUTTON_POL_INVERT)
priv->flags |= MC13783_PWRB_B2_POL_INVERT;
- if (pdata->b2on_flags & MC13783_BUTTON_RESET_EN)
+ if (pdata->b_on_flags[1] & MC13783_BUTTON_RESET_EN)
reg |= MC13783_POWER_CONTROL_2_ON2BRSTEN;
irq = platform_get_irq_byname(pdev, "b2on");
@@ -171,15 +171,15 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
priv->irq[1] = irq;
}
- if (pdata->b3on_flags & MC13783_BUTTON_ENABLE) {
- priv->keymap[2] = pdata->b3on_key;
- if (pdata->b3on_key != KEY_RESERVED)
- __set_bit(pdata->b3on_key, pwr->keybit);
+ if (pdata->b_on_flags[2] & MC13783_BUTTON_ENABLE) {
+ priv->keymap[2] = pdata->b_on_key[2];
+ if (pdata->b_on_key[2] != KEY_RESERVED)
+ __set_bit(pdata->b_on_key[2], pwr->keybit);
- if (pdata->b3on_flags & MC13783_BUTTON_POL_INVERT)
+ if (pdata->b_on_flags[2] & MC13783_BUTTON_POL_INVERT)
priv->flags |= MC13783_PWRB_B3_POL_INVERT;
- if (pdata->b3on_flags & MC13783_BUTTON_RESET_EN)
+ if (pdata->b_on_flags[2] & MC13783_BUTTON_RESET_EN)
reg |= MC13783_POWER_CONTROL_2_ON3BRSTEN;
irq = platform_get_irq_byname(pdev, "b3on");
diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h
index dd46fe424a80..4437ab80fcf8 100644
--- a/include/linux/mfd/mc13xxx.h
+++ b/include/linux/mfd/mc13xxx.h
@@ -181,12 +181,8 @@ struct mc13xxx_leds_platform_data {
#define MC13783_BUTTON_RESET_EN (1 << 4)
struct mc13xxx_buttons_platform_data {
- int b1on_flags;
- unsigned short b1on_key;
- int b2on_flags;
- unsigned short b2on_key;
- int b3on_flags;
- unsigned short b3on_key;
+ int b_on_flags[3];
+ unsigned int b_on_key[3];
};
#define MC13783_TS_ATO_FIRST false
--
2.39.5
^ permalink raw reply related
* [PATCH v5 5/5] Input: mc13783-pwrbutton: add OF support and drop platform_data
From: Alexander Kurz @ 2025-10-08 6:44 UTC (permalink / raw)
To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Dmitry Torokhov, Dzmitry Sankouski, Dr. David Alan Gilbert,
Heiko Stuebner, Uwe Kleine-König, devicetree, linux-input
Cc: linux-kernel, Alexander Kurz
In-Reply-To: <20251008064401.13863-1-akurz@blala.de>
Add OF support for the mc13783-pwrbutton so that it can be used with
modern DT based systems, dropping support for platform_data.
Signed-off-by: Alexander Kurz <akurz@blala.de>
---
drivers/input/misc/mc13783-pwrbutton.c | 104 +++++++++++++++++++++----
drivers/mfd/mc13xxx-core.c | 4 -
include/linux/mfd/mc13xxx.h | 14 ----
3 files changed, 88 insertions(+), 34 deletions(-)
diff --git a/drivers/input/misc/mc13783-pwrbutton.c b/drivers/input/misc/mc13783-pwrbutton.c
index 08618c59197f..0fa630adff19 100644
--- a/drivers/input/misc/mc13783-pwrbutton.c
+++ b/drivers/input/misc/mc13783-pwrbutton.c
@@ -27,6 +27,7 @@
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/mfd/mc13783.h>
+#include <linux/property.h>
#include <linux/sched.h>
#include <linux/slab.h>
@@ -41,10 +42,20 @@ struct mc13783_pwrb {
struct mc13xxx *mc13783;
const struct mc13xxx_button_devtype *devtype;
int flags;
+ int b_on_flags[3];
+ unsigned int b_on_key[3];
unsigned short keymap[3];
int irq[3];
};
+#define MC13783_BUTTON_DBNC_0MS 0
+#define MC13783_BUTTON_DBNC_30MS 1
+#define MC13783_BUTTON_DBNC_150MS 2
+#define MC13783_BUTTON_DBNC_750MS 3
+#define MC13783_BUTTON_ENABLE (1 << 2)
+#define MC13783_BUTTON_POL_INVERT (1 << 3)
+#define MC13783_BUTTON_RESET_EN (1 << 4)
+
#define MC13783_PWRB_B1_POL_INVERT (1 << 0)
#define MC13783_PWRB_B2_POL_INVERT (1 << 1)
#define MC13783_PWRB_B3_POL_INVERT (1 << 2)
@@ -88,9 +99,69 @@ static irqreturn_t button_irq(int irq, void *_priv)
return IRQ_HANDLED;
}
+static int mc13xxx_pwrbutton_parse_properties(struct platform_device *pdev,
+ struct mc13783_pwrb *priv)
+{
+ struct fwnode_handle *child;
+ struct device *dev = &pdev->dev;
+ struct mc13xxx_button_devtype *devtype =
+ (struct mc13xxx_button_devtype *)platform_get_device_id(pdev)->driver_data;
+
+ struct fwnode_handle *parent __free(fwnode_handle) =
+ device_get_named_child_node(dev->parent, "buttons");
+ if (!parent)
+ return -ENODATA;
+
+ fwnode_for_each_named_child_node(parent, child, "onkey") {
+ u32 idx;
+ u8 dbnc = MC13783_BUTTON_DBNC_30MS;
+ u16 dbnc_ms;
+
+ if (fwnode_property_read_u32(child, "reg", &idx))
+ continue;
+
+ if (idx > devtype->button_id_max) {
+ dev_warn(dev, "reg out of range\n");
+ continue;
+ }
+
+ fwnode_property_read_u16(child, "debounce-delay-ms", &dbnc_ms);
+ switch (dbnc_ms) {
+ case 0:
+ dbnc = MC13783_BUTTON_DBNC_0MS;
+ break;
+ case 30:
+ dbnc = MC13783_BUTTON_DBNC_30MS;
+ break;
+ case 150:
+ dbnc = MC13783_BUTTON_DBNC_150MS;
+ break;
+ case 750:
+ dbnc = MC13783_BUTTON_DBNC_750MS;
+ break;
+ default:
+ dev_warn(dev, "invalid debounce-delay-ms value\n");
+ continue;
+ }
+
+ if (fwnode_property_read_u32(child, "linux,code", &priv->b_on_key[idx]))
+ continue;
+
+ if (fwnode_property_read_bool(child, "active-low"))
+ priv->b_on_flags[idx] |= MC13783_BUTTON_POL_INVERT;
+
+ if (fwnode_property_read_bool(child, "fsl,enable-reset"))
+ priv->b_on_flags[idx] |= MC13783_BUTTON_RESET_EN;
+
+ priv->b_on_flags[idx] |= MC13783_BUTTON_ENABLE | dbnc;
+ }
+
+ return 0;
+}
+
static int mc13783_pwrbutton_probe(struct platform_device *pdev)
{
- const struct mc13xxx_buttons_platform_data *pdata;
+ struct device *dev = &pdev->dev;
struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent);
struct mc13xxx_button_devtype *devtype =
(struct mc13xxx_button_devtype *)pdev->id_entry->driver_data;
@@ -100,11 +171,8 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
int reg = 0;
int irq = 0;
- pdata = dev_get_platdata(&pdev->dev);
- if (!pdata) {
- dev_err(&pdev->dev, "missing platform data\n");
- return -ENODEV;
- }
+ if (!dev->parent->of_node)
+ return -ENODATA;
pwr = devm_input_allocate_device(&pdev->dev);
if (!pwr)
@@ -114,14 +182,18 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
if (!priv)
return -ENOMEM;
- if (devtype->button_id_max < 2 && pdata->b_on_flags[2] & 0x3) {
+ err = mc13xxx_pwrbutton_parse_properties(pdev, priv);
+ if (err)
+ return err;
+
+ if (devtype->button_id_max < 2 && priv->b_on_flags[2] & 0x3) {
dev_err(&pdev->dev, "button not supported\n");
return -ENODEV;
}
- reg |= (pdata->b_on_flags[0] & 0x3) << MC13783_POWER_CONTROL_2_ON1BDBNC;
- reg |= (pdata->b_on_flags[1] & 0x3) << MC13783_POWER_CONTROL_2_ON2BDBNC;
- reg |= (pdata->b_on_flags[2] & 0x3) << MC13783_POWER_CONTROL_2_ON3BDBNC;
+ reg |= (priv->b_on_flags[0] & 0x3) << MC13783_POWER_CONTROL_2_ON1BDBNC;
+ reg |= (priv->b_on_flags[1] & 0x3) << MC13783_POWER_CONTROL_2_ON2BDBNC;
+ reg |= (priv->b_on_flags[2] & 0x3) << MC13783_POWER_CONTROL_2_ON3BDBNC;
priv->pwr = pwr;
priv->mc13783 = mc13783;
@@ -130,17 +202,17 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
mc13xxx_lock(mc13783);
for (int i = 0; i < devtype->button_id_max; i++) {
- if ((pdata->b_on_flags[i] & MC13783_BUTTON_ENABLE) == 0)
+ if ((priv->b_on_flags[i] & MC13783_BUTTON_ENABLE) == 0)
continue;
- priv->keymap[i] = pdata->b_on_key[i];
- if (pdata->b_on_key[i] != KEY_RESERVED)
- __set_bit(pdata->b_on_key[i], pwr->keybit);
+ priv->keymap[i] = priv->b_on_key[i];
+ if (priv->b_on_key[i] != KEY_RESERVED)
+ __set_bit(priv->b_on_key[i], pwr->keybit);
- if (pdata->b_on_flags[i] & MC13783_BUTTON_POL_INVERT)
+ if (priv->b_on_flags[i] & MC13783_BUTTON_POL_INVERT)
priv->flags |= (MC13783_PWRB_B1_POL_INVERT << i);
- if (pdata->b_on_flags[i] & MC13783_BUTTON_RESET_EN)
+ if (priv->b_on_flags[i] & MC13783_BUTTON_RESET_EN)
reg |= (MC13783_POWER_CONTROL_2_ON1BRSTEN << i);
irq = platform_get_irq_byname(pdev, devtype->irq_name[i]);
diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
index c29974722704..9512136e821b 100644
--- a/drivers/mfd/mc13xxx-core.c
+++ b/drivers/mfd/mc13xxx-core.c
@@ -504,10 +504,6 @@ int mc13xxx_common_init(struct device *dev)
&pdata->regulators, sizeof(pdata->regulators));
mc13xxx_add_subdevice_pdata(mc13xxx, "%s-led",
pdata->leds, sizeof(*pdata->leds));
- mc13xxx_add_subdevice_pdata_res(mc13xxx, "%s-pwrbutton",
- pdata->buttons, sizeof(*pdata->buttons),
- mc13xxx->variant->button_resources,
- mc13xxx->variant->button_resources_size);
if (mc13xxx->flags & MC13XXX_USE_CODEC)
mc13xxx_add_subdevice_pdata(mc13xxx, "%s-codec",
pdata->codec, sizeof(*pdata->codec));
diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h
index 71c7d3614d4c..ac3765df341d 100644
--- a/include/linux/mfd/mc13xxx.h
+++ b/include/linux/mfd/mc13xxx.h
@@ -174,19 +174,6 @@ struct mc13xxx_leds_platform_data {
u32 led_control[MAX_LED_CONTROL_REGS];
};
-#define MC13783_BUTTON_DBNC_0MS 0
-#define MC13783_BUTTON_DBNC_30MS 1
-#define MC13783_BUTTON_DBNC_150MS 2
-#define MC13783_BUTTON_DBNC_750MS 3
-#define MC13783_BUTTON_ENABLE (1 << 2)
-#define MC13783_BUTTON_POL_INVERT (1 << 3)
-#define MC13783_BUTTON_RESET_EN (1 << 4)
-
-struct mc13xxx_buttons_platform_data {
- int b_on_flags[3];
- unsigned int b_on_key[3];
-};
-
#define MC13783_TS_ATO_FIRST false
#define MC13783_TS_ATO_EACH true
@@ -219,7 +206,6 @@ struct mc13xxx_platform_data {
struct mc13xxx_regulator_platform_data regulators;
struct mc13xxx_leds_platform_data *leds;
- struct mc13xxx_buttons_platform_data *buttons;
struct mc13xxx_ts_platform_data touch;
struct mc13xxx_codec_platform_data *codec;
};
--
2.39.5
^ permalink raw reply related
* [PATCH v5 2/5] Input: mc13783-pwrbutton: fix irq mixup and use resources
From: Alexander Kurz @ 2025-10-08 6:43 UTC (permalink / raw)
To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Dmitry Torokhov, Dzmitry Sankouski, Dr. David Alan Gilbert,
Heiko Stuebner, Uwe Kleine-König, devicetree, linux-input
Cc: linux-kernel, Alexander Kurz
In-Reply-To: <20251008064401.13863-1-akurz@blala.de>
The mfd mc13xxx interrupt handling was migrated to regmap with commit
10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for interrupts").
As a consequence, button_irq() got get called with virtual irq instead
of chip-internal irq.
Make use of mfd_cell resources to pass interrupts from mfd so that
platform_get_irq_byname() can be used in mc13783-pwrbutton. The
amount of required interrupt related cleanup can be reduced this way.
Note, that mc13783-pwrbutton is still considered to support only the
model mc13783.
Signed-off-by: Alexander Kurz <akurz@blala.de>
---
drivers/input/misc/mc13783-pwrbutton.c | 103 +++++++++++--------------
drivers/mfd/mc13xxx-core.c | 39 ++++++++--
drivers/mfd/mc13xxx.h | 2 +
3 files changed, 79 insertions(+), 65 deletions(-)
diff --git a/drivers/input/misc/mc13783-pwrbutton.c b/drivers/input/misc/mc13783-pwrbutton.c
index 82434ea9cca5..20f68aab6edf 100644
--- a/drivers/input/misc/mc13783-pwrbutton.c
+++ b/drivers/input/misc/mc13783-pwrbutton.c
@@ -33,13 +33,15 @@
struct mc13783_pwrb {
struct input_dev *pwr;
struct mc13xxx *mc13783;
-#define MC13783_PWRB_B1_POL_INVERT (1 << 0)
-#define MC13783_PWRB_B2_POL_INVERT (1 << 1)
-#define MC13783_PWRB_B3_POL_INVERT (1 << 2)
int flags;
unsigned short keymap[3];
+ int irq[3];
};
+#define MC13783_PWRB_B1_POL_INVERT (1 << 0)
+#define MC13783_PWRB_B2_POL_INVERT (1 << 1)
+#define MC13783_PWRB_B3_POL_INVERT (1 << 2)
+
#define MC13783_REG_INTERRUPT_SENSE_1 5
#define MC13783_IRQSENSE1_ONOFD1S (1 << 3)
#define MC13783_IRQSENSE1_ONOFD2S (1 << 4)
@@ -60,27 +62,21 @@ static irqreturn_t button_irq(int irq, void *_priv)
mc13xxx_reg_read(priv->mc13783, MC13783_REG_INTERRUPT_SENSE_1, &val);
- switch (irq) {
- case MC13783_IRQ_ONOFD1:
+ if (irq == priv->irq[0]) {
val = val & MC13783_IRQSENSE1_ONOFD1S ? 1 : 0;
if (priv->flags & MC13783_PWRB_B1_POL_INVERT)
val ^= 1;
input_report_key(priv->pwr, priv->keymap[0], val);
- break;
-
- case MC13783_IRQ_ONOFD2:
+ } else if (irq == priv->irq[1]) {
val = val & MC13783_IRQSENSE1_ONOFD2S ? 1 : 0;
if (priv->flags & MC13783_PWRB_B2_POL_INVERT)
val ^= 1;
input_report_key(priv->pwr, priv->keymap[1], val);
- break;
-
- case MC13783_IRQ_ONOFD3:
+ } else if (irq == priv->irq[2]) {
val = val & MC13783_IRQSENSE1_ONOFD3S ? 1 : 0;
if (priv->flags & MC13783_PWRB_B3_POL_INVERT)
val ^= 1;
input_report_key(priv->pwr, priv->keymap[2], val);
- break;
}
input_sync(priv->pwr);
@@ -96,6 +92,7 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
struct mc13783_pwrb *priv;
int err = 0;
int reg = 0;
+ int irq = 0;
pdata = dev_get_platdata(&pdev->dev);
if (!pdata) {
@@ -131,12 +128,20 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
if (pdata->b1on_flags & MC13783_BUTTON_RESET_EN)
reg |= MC13783_POWER_CONTROL_2_ON1BRSTEN;
- err = mc13xxx_irq_request(mc13783, MC13783_IRQ_ONOFD1,
- button_irq, "b1on", priv);
- if (err) {
+ irq = platform_get_irq_byname(pdev, "b1on");
+
+ if (irq < 0) {
dev_dbg(&pdev->dev, "Can't request irq\n");
goto free_mc13xxx_lock;
}
+
+ err = devm_request_any_context_irq(&pdev->dev, irq, button_irq,
+ IRQF_ONESHOT, "b1on",
+ priv);
+ if (err < 0)
+ goto free_mc13xxx_lock;
+
+ priv->irq[0] = irq;
}
if (pdata->b2on_flags & MC13783_BUTTON_ENABLE) {
@@ -150,12 +155,20 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
if (pdata->b2on_flags & MC13783_BUTTON_RESET_EN)
reg |= MC13783_POWER_CONTROL_2_ON2BRSTEN;
- err = mc13xxx_irq_request(mc13783, MC13783_IRQ_ONOFD2,
- button_irq, "b2on", priv);
- if (err) {
+ irq = platform_get_irq_byname(pdev, "b2on");
+
+ if (irq < 0) {
dev_dbg(&pdev->dev, "Can't request irq\n");
- goto free_irq_b1;
+ goto free_mc13xxx_lock;
}
+
+ err = devm_request_any_context_irq(&pdev->dev, irq, button_irq,
+ IRQF_ONESHOT, "b2on",
+ priv);
+ if (err < 0)
+ goto free_mc13xxx_lock;
+
+ priv->irq[1] = irq;
}
if (pdata->b3on_flags & MC13783_BUTTON_ENABLE) {
@@ -169,12 +182,20 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
if (pdata->b3on_flags & MC13783_BUTTON_RESET_EN)
reg |= MC13783_POWER_CONTROL_2_ON3BRSTEN;
- err = mc13xxx_irq_request(mc13783, MC13783_IRQ_ONOFD3,
- button_irq, "b3on", priv);
- if (err) {
+ irq = platform_get_irq_byname(pdev, "b3on");
+
+ if (irq < 0) {
dev_dbg(&pdev->dev, "Can't request irq: %d\n", err);
- goto free_irq_b2;
+ goto free_mc13xxx_lock;
}
+
+ err = devm_request_any_context_irq(&pdev->dev, irq, button_irq,
+ IRQF_ONESHOT, "b3on",
+ priv);
+ if (err < 0)
+ goto free_mc13xxx_lock;
+
+ priv->irq[2] = irq;
}
mc13xxx_reg_rmw(mc13783, MC13783_REG_POWER_CONTROL_2, 0x3FE, reg);
@@ -192,55 +213,21 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
err = input_register_device(pwr);
if (err) {
dev_dbg(&pdev->dev, "Can't register power button: %d\n", err);
- goto free_irq;
+ return err;
}
platform_set_drvdata(pdev, priv);
return 0;
-free_irq:
- mc13xxx_lock(mc13783);
-
- if (pdata->b3on_flags & MC13783_BUTTON_ENABLE)
- mc13xxx_irq_free(mc13783, MC13783_IRQ_ONOFD3, priv);
-
-free_irq_b2:
- if (pdata->b2on_flags & MC13783_BUTTON_ENABLE)
- mc13xxx_irq_free(mc13783, MC13783_IRQ_ONOFD2, priv);
-
-free_irq_b1:
- if (pdata->b1on_flags & MC13783_BUTTON_ENABLE)
- mc13xxx_irq_free(mc13783, MC13783_IRQ_ONOFD1, priv);
-
free_mc13xxx_lock:
mc13xxx_unlock(mc13783);
return err;
}
-static void mc13783_pwrbutton_remove(struct platform_device *pdev)
-{
- struct mc13783_pwrb *priv = platform_get_drvdata(pdev);
- const struct mc13xxx_buttons_platform_data *pdata;
-
- pdata = dev_get_platdata(&pdev->dev);
-
- mc13xxx_lock(priv->mc13783);
-
- if (pdata->b3on_flags & MC13783_BUTTON_ENABLE)
- mc13xxx_irq_free(priv->mc13783, MC13783_IRQ_ONOFD3, priv);
- if (pdata->b2on_flags & MC13783_BUTTON_ENABLE)
- mc13xxx_irq_free(priv->mc13783, MC13783_IRQ_ONOFD2, priv);
- if (pdata->b1on_flags & MC13783_BUTTON_ENABLE)
- mc13xxx_irq_free(priv->mc13783, MC13783_IRQ_ONOFD1, priv);
-
- mc13xxx_unlock(priv->mc13783);
-}
-
static struct platform_driver mc13783_pwrbutton_driver = {
.probe = mc13783_pwrbutton_probe,
- .remove = mc13783_pwrbutton_remove,
.driver = {
.name = "mc13783-pwrbutton",
},
diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
index 920797b806ce..1756c8d47d5e 100644
--- a/drivers/mfd/mc13xxx-core.c
+++ b/drivers/mfd/mc13xxx-core.c
@@ -13,6 +13,7 @@
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/mfd/core.h>
+#include <linux/mfd/mc13783.h>
#include "mc13xxx.h"
@@ -46,6 +47,12 @@
#define MC13XXX_ADC2 45
+static const struct resource mc13783_button_resources[] = {
+ DEFINE_RES_IRQ_NAMED(MC13783_IRQ_ONOFD1, "b1on"),
+ DEFINE_RES_IRQ_NAMED(MC13783_IRQ_ONOFD2, "b2on"),
+ DEFINE_RES_IRQ_NAMED(MC13783_IRQ_ONOFD3, "b3on"),
+};
+
void mc13xxx_lock(struct mc13xxx *mc13xxx)
{
if (!mutex_trylock(&mc13xxx->lock)) {
@@ -201,18 +208,22 @@ static void mc34708_print_revision(struct mc13xxx *mc13xxx, u32 revision)
/* These are only exported for mc13xxx-i2c and mc13xxx-spi */
struct mc13xxx_variant mc13xxx_variant_mc13783 = {
.name = "mc13783",
+ .button_resources = mc13783_button_resources,
+ .button_resources_size = ARRAY_SIZE(mc13783_button_resources),
.print_revision = mc13xxx_print_revision,
};
EXPORT_SYMBOL_GPL(mc13xxx_variant_mc13783);
struct mc13xxx_variant mc13xxx_variant_mc13892 = {
.name = "mc13892",
+ .button_resources_size = 0,
.print_revision = mc13xxx_print_revision,
};
EXPORT_SYMBOL_GPL(mc13xxx_variant_mc13892);
struct mc13xxx_variant mc13xxx_variant_mc34708 = {
.name = "mc34708",
+ .button_resources_size = 0,
.print_revision = mc34708_print_revision,
};
EXPORT_SYMBOL_GPL(mc13xxx_variant_mc34708);
@@ -362,15 +373,18 @@ int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode,
}
EXPORT_SYMBOL_GPL(mc13xxx_adc_do_conversion);
-static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
- const char *format, void *pdata, size_t pdata_size)
+static int mc13xxx_add_subdevice_pdata_res(struct mc13xxx *mc13xxx,
+ const char *format, void *pdata, size_t pdata_size,
+ const struct resource *resources, int num_resources)
{
char buf[30];
const char *name = mc13xxx_get_chipname(mc13xxx);
struct mfd_cell cell = {
- .platform_data = pdata,
- .pdata_size = pdata_size,
+ .platform_data = pdata,
+ .pdata_size = pdata_size,
+ .resources = resources,
+ .num_resources = num_resources,
};
/* there is no asnprintf in the kernel :-( */
@@ -385,6 +399,12 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
regmap_irq_get_domain(mc13xxx->irq_data));
}
+static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
+ const char *format, void *pdata, size_t pdata_size)
+{
+ return mc13xxx_add_subdevice_pdata_res(mc13xxx, format, pdata, pdata_size, NULL, 0);
+}
+
static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format)
{
return mc13xxx_add_subdevice_pdata(mc13xxx, format, NULL, 0);
@@ -470,8 +490,10 @@ int mc13xxx_common_init(struct device *dev)
&pdata->regulators, sizeof(pdata->regulators));
mc13xxx_add_subdevice_pdata(mc13xxx, "%s-led",
pdata->leds, sizeof(*pdata->leds));
- mc13xxx_add_subdevice_pdata(mc13xxx, "%s-pwrbutton",
- pdata->buttons, sizeof(*pdata->buttons));
+ mc13xxx_add_subdevice_pdata_res(mc13xxx, "%s-pwrbutton",
+ pdata->buttons, sizeof(*pdata->buttons),
+ mc13xxx->variant->button_resources,
+ mc13xxx->variant->button_resources_size);
if (mc13xxx->flags & MC13XXX_USE_CODEC)
mc13xxx_add_subdevice_pdata(mc13xxx, "%s-codec",
pdata->codec, sizeof(*pdata->codec));
@@ -481,7 +503,10 @@ int mc13xxx_common_init(struct device *dev)
} else {
mc13xxx_add_subdevice(mc13xxx, "%s-regulator");
mc13xxx_add_subdevice(mc13xxx, "%s-led");
- mc13xxx_add_subdevice(mc13xxx, "%s-pwrbutton");
+ mc13xxx_add_subdevice_pdata_res(mc13xxx, "%s-pwrbutton",
+ NULL, 0,
+ mc13xxx->variant->button_resources,
+ mc13xxx->variant->button_resources_size);
if (mc13xxx->flags & MC13XXX_USE_CODEC)
mc13xxx_add_subdevice(mc13xxx, "%s-codec");
if (mc13xxx->flags & MC13XXX_USE_TOUCHSCREEN)
diff --git a/drivers/mfd/mc13xxx.h b/drivers/mfd/mc13xxx.h
index bd5ba9a0e14f..b13ae652f4ec 100644
--- a/drivers/mfd/mc13xxx.h
+++ b/drivers/mfd/mc13xxx.h
@@ -18,6 +18,8 @@ struct mc13xxx;
struct mc13xxx_variant {
const char *name;
+ const struct resource *button_resources;
+ int button_resources_size;
void (*print_revision)(struct mc13xxx *mc13xxx, u32 revision);
};
--
2.39.5
^ permalink raw reply related
* [PATCH v5 4/5] Input: mc13783-pwrbutton: enable other mc13xxx PMIC
From: Alexander Kurz @ 2025-10-08 6:44 UTC (permalink / raw)
To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Dmitry Torokhov, Dzmitry Sankouski, Dr. David Alan Gilbert,
Heiko Stuebner, Uwe Kleine-König, devicetree, linux-input
Cc: linux-kernel, Alexander Kurz
In-Reply-To: <20251008064401.13863-1-akurz@blala.de>
All three mc13xxx types feature two common power buttons referred in
the datasheets as ONOFD[12] (mc13783) and PWRON[12] (mc13892/mc34708).
A third button is available on the mc13783 and mc13892 models, which
however uses distinct interrupt register bits.
Add support for mc13892/mc34708 to support all available power buttons
in the mc13xxx series.
Signed-off-by: Alexander Kurz <akurz@blala.de>
---
drivers/input/misc/Kconfig | 4 +-
drivers/input/misc/mc13783-pwrbutton.c | 131 +++++++++++--------------
drivers/mfd/mc13xxx-core.c | 22 ++++-
include/linux/mfd/mc13783.h | 4 +-
include/linux/mfd/mc13892.h | 1 +
include/linux/mfd/mc13xxx.h | 2 +
6 files changed, 84 insertions(+), 80 deletions(-)
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 0e6b49fb54bc..c36c575f11e5 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -286,8 +286,8 @@ config INPUT_MC13783_PWRBUTTON
tristate "MC13783 ON buttons"
depends on MFD_MC13XXX
help
- Support the ON buttons of MC13783 PMIC as an input device
- reporting power button status.
+ Support the ON buttons of MC13783/MC13892/MC34708 PMIC as an input
+ device reporting power button status.
To compile this driver as a module, choose M here: the module
will be called mc13783-pwrbutton.
diff --git a/drivers/input/misc/mc13783-pwrbutton.c b/drivers/input/misc/mc13783-pwrbutton.c
index 2ee115d77b1c..08618c59197f 100644
--- a/drivers/input/misc/mc13783-pwrbutton.c
+++ b/drivers/input/misc/mc13783-pwrbutton.c
@@ -30,9 +30,16 @@
#include <linux/sched.h>
#include <linux/slab.h>
+struct mc13xxx_button_devtype {
+ int button_id_max;
+ const char *irq_name[3];
+ int irq_sense_reg[3];
+};
+
struct mc13783_pwrb {
struct input_dev *pwr;
struct mc13xxx *mc13783;
+ const struct mc13xxx_button_devtype *devtype;
int flags;
unsigned short keymap[3];
int irq[3];
@@ -43,9 +50,6 @@ struct mc13783_pwrb {
#define MC13783_PWRB_B3_POL_INVERT (1 << 2)
#define MC13783_REG_INTERRUPT_SENSE_1 5
-#define MC13783_IRQSENSE1_ONOFD1S (1 << 3)
-#define MC13783_IRQSENSE1_ONOFD2S (1 << 4)
-#define MC13783_IRQSENSE1_ONOFD3S (1 << 5)
#define MC13783_REG_POWER_CONTROL_2 15
#define MC13783_POWER_CONTROL_2_ON1BDBNC 4
@@ -63,17 +67,17 @@ static irqreturn_t button_irq(int irq, void *_priv)
mc13xxx_reg_read(priv->mc13783, MC13783_REG_INTERRUPT_SENSE_1, &val);
if (irq == priv->irq[0]) {
- val = val & MC13783_IRQSENSE1_ONOFD1S ? 1 : 0;
+ val = val & (1 << priv->devtype->irq_sense_reg[0]) ? 1 : 0;
if (priv->flags & MC13783_PWRB_B1_POL_INVERT)
val ^= 1;
input_report_key(priv->pwr, priv->keymap[0], val);
} else if (irq == priv->irq[1]) {
- val = val & MC13783_IRQSENSE1_ONOFD2S ? 1 : 0;
+ val = val & (1 << priv->devtype->irq_sense_reg[1]) ? 1 : 0;
if (priv->flags & MC13783_PWRB_B2_POL_INVERT)
val ^= 1;
input_report_key(priv->pwr, priv->keymap[1], val);
- } else if (irq == priv->irq[2]) {
- val = val & MC13783_IRQSENSE1_ONOFD3S ? 1 : 0;
+ } else if (irq == priv->irq[2] && priv->devtype->button_id_max >= 2) {
+ val = val & (1 << priv->devtype->irq_sense_reg[2]) ? 1 : 0;
if (priv->flags & MC13783_PWRB_B3_POL_INVERT)
val ^= 1;
input_report_key(priv->pwr, priv->keymap[2], val);
@@ -88,6 +92,8 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
{
const struct mc13xxx_buttons_platform_data *pdata;
struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent);
+ struct mc13xxx_button_devtype *devtype =
+ (struct mc13xxx_button_devtype *)pdev->id_entry->driver_data;
struct input_dev *pwr;
struct mc13783_pwrb *priv;
int err = 0;
@@ -108,54 +114,36 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
if (!priv)
return -ENOMEM;
+ if (devtype->button_id_max < 2 && pdata->b_on_flags[2] & 0x3) {
+ dev_err(&pdev->dev, "button not supported\n");
+ return -ENODEV;
+ }
+
reg |= (pdata->b_on_flags[0] & 0x3) << MC13783_POWER_CONTROL_2_ON1BDBNC;
reg |= (pdata->b_on_flags[1] & 0x3) << MC13783_POWER_CONTROL_2_ON2BDBNC;
reg |= (pdata->b_on_flags[2] & 0x3) << MC13783_POWER_CONTROL_2_ON3BDBNC;
priv->pwr = pwr;
priv->mc13783 = mc13783;
+ priv->devtype = devtype;
mc13xxx_lock(mc13783);
- if (pdata->b_on_flags[0] & MC13783_BUTTON_ENABLE) {
- priv->keymap[0] = pdata->b_on_key[0];
- if (pdata->b_on_key[0] != KEY_RESERVED)
- __set_bit(pdata->b_on_key[0], pwr->keybit);
+ for (int i = 0; i < devtype->button_id_max; i++) {
+ if ((pdata->b_on_flags[i] & MC13783_BUTTON_ENABLE) == 0)
+ continue;
- if (pdata->b_on_flags[0] & MC13783_BUTTON_POL_INVERT)
- priv->flags |= MC13783_PWRB_B1_POL_INVERT;
+ priv->keymap[i] = pdata->b_on_key[i];
+ if (pdata->b_on_key[i] != KEY_RESERVED)
+ __set_bit(pdata->b_on_key[i], pwr->keybit);
- if (pdata->b_on_flags[0] & MC13783_BUTTON_RESET_EN)
- reg |= MC13783_POWER_CONTROL_2_ON1BRSTEN;
+ if (pdata->b_on_flags[i] & MC13783_BUTTON_POL_INVERT)
+ priv->flags |= (MC13783_PWRB_B1_POL_INVERT << i);
- irq = platform_get_irq_byname(pdev, "b1on");
+ if (pdata->b_on_flags[i] & MC13783_BUTTON_RESET_EN)
+ reg |= (MC13783_POWER_CONTROL_2_ON1BRSTEN << i);
- if (irq < 0) {
- dev_dbg(&pdev->dev, "Can't request irq\n");
- goto free_mc13xxx_lock;
- }
-
- err = devm_request_any_context_irq(&pdev->dev, irq, button_irq,
- IRQF_ONESHOT, "b1on",
- priv);
- if (err < 0)
- goto free_mc13xxx_lock;
-
- priv->irq[0] = irq;
- }
-
- if (pdata->b_on_flags[1] & MC13783_BUTTON_ENABLE) {
- priv->keymap[1] = pdata->b_on_key[1];
- if (pdata->b_on_key[1] != KEY_RESERVED)
- __set_bit(pdata->b_on_key[1], pwr->keybit);
-
- if (pdata->b_on_flags[1] & MC13783_BUTTON_POL_INVERT)
- priv->flags |= MC13783_PWRB_B2_POL_INVERT;
-
- if (pdata->b_on_flags[1] & MC13783_BUTTON_RESET_EN)
- reg |= MC13783_POWER_CONTROL_2_ON2BRSTEN;
-
- irq = platform_get_irq_byname(pdev, "b2on");
+ irq = platform_get_irq_byname(pdev, devtype->irq_name[i]);
if (irq < 0) {
dev_dbg(&pdev->dev, "Can't request irq\n");
@@ -163,39 +151,12 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
}
err = devm_request_any_context_irq(&pdev->dev, irq, button_irq,
- IRQF_ONESHOT, "b2on",
- priv);
+ IRQF_ONESHOT, devtype->irq_name[i],
+ priv);
if (err < 0)
goto free_mc13xxx_lock;
- priv->irq[1] = irq;
- }
-
- if (pdata->b_on_flags[2] & MC13783_BUTTON_ENABLE) {
- priv->keymap[2] = pdata->b_on_key[2];
- if (pdata->b_on_key[2] != KEY_RESERVED)
- __set_bit(pdata->b_on_key[2], pwr->keybit);
-
- if (pdata->b_on_flags[2] & MC13783_BUTTON_POL_INVERT)
- priv->flags |= MC13783_PWRB_B3_POL_INVERT;
-
- if (pdata->b_on_flags[2] & MC13783_BUTTON_RESET_EN)
- reg |= MC13783_POWER_CONTROL_2_ON3BRSTEN;
-
- irq = platform_get_irq_byname(pdev, "b3on");
-
- if (irq < 0) {
- dev_dbg(&pdev->dev, "Can't request irq: %d\n", err);
- goto free_mc13xxx_lock;
- }
-
- err = devm_request_any_context_irq(&pdev->dev, irq, button_irq,
- IRQF_ONESHOT, "b3on",
- priv);
- if (err < 0)
- goto free_mc13xxx_lock;
-
- priv->irq[2] = irq;
+ priv->irq[i] = irq;
}
mc13xxx_reg_rmw(mc13783, MC13783_REG_POWER_CONTROL_2, 0x3FE, reg);
@@ -226,7 +187,33 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev)
return err;
}
+static const struct mc13xxx_button_devtype mc13783_button_devtype = {
+ .button_id_max = 2,
+ .irq_name = { "b1on", "b2on", "b3on" },
+ .irq_sense_reg = { 3, 4, 5 },
+};
+
+static const struct mc13xxx_button_devtype mc13892_button_devtype = {
+ .button_id_max = 2,
+ .irq_name = { "b1on", "b2on", "b3on" },
+ .irq_sense_reg = { 3, 4, 2 },
+};
+
+static const struct mc13xxx_button_devtype mc34708_button_devtype = {
+ .button_id_max = 1,
+ .irq_name = { "b1on", "b2on" },
+ .irq_sense_reg = { 3, 4 },
+};
+
+static const struct platform_device_id mc13xxx_pwrbutton_idtable[] = {
+ { "mc13783-pwrbutton", (kernel_ulong_t)&mc13783_button_devtype },
+ { "mc13892-pwrbutton", (kernel_ulong_t)&mc13892_button_devtype },
+ { "mc34708-pwrbutton", (kernel_ulong_t)&mc34708_button_devtype },
+ { /* sentinel */ }
+};
+
static struct platform_driver mc13783_pwrbutton_driver = {
+ .id_table = mc13xxx_pwrbutton_idtable,
.probe = mc13783_pwrbutton_probe,
.driver = {
.name = "mc13783-pwrbutton",
diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
index 1756c8d47d5e..c29974722704 100644
--- a/drivers/mfd/mc13xxx-core.c
+++ b/drivers/mfd/mc13xxx-core.c
@@ -14,6 +14,7 @@
#include <linux/platform_device.h>
#include <linux/mfd/core.h>
#include <linux/mfd/mc13783.h>
+#include <linux/mfd/mc13892.h>
#include "mc13xxx.h"
@@ -48,11 +49,22 @@
#define MC13XXX_ADC2 45
static const struct resource mc13783_button_resources[] = {
- DEFINE_RES_IRQ_NAMED(MC13783_IRQ_ONOFD1, "b1on"),
- DEFINE_RES_IRQ_NAMED(MC13783_IRQ_ONOFD2, "b2on"),
+ DEFINE_RES_IRQ_NAMED(MC13XXX_IRQ_PWRON1, "b1on"),
+ DEFINE_RES_IRQ_NAMED(MC13XXX_IRQ_PWRON2, "b2on"),
DEFINE_RES_IRQ_NAMED(MC13783_IRQ_ONOFD3, "b3on"),
};
+static const struct resource mc13892_button_resources[] = {
+ DEFINE_RES_IRQ_NAMED(MC13XXX_IRQ_PWRON1, "b1on"),
+ DEFINE_RES_IRQ_NAMED(MC13XXX_IRQ_PWRON2, "b2on"),
+ DEFINE_RES_IRQ_NAMED(MC13892_IRQ_PWRON3, "b3on"),
+};
+
+static const struct resource mc34708_button_resources[] = {
+ DEFINE_RES_IRQ_NAMED(MC13XXX_IRQ_PWRON1, "b1on"),
+ DEFINE_RES_IRQ_NAMED(MC13XXX_IRQ_PWRON2, "b2on"),
+};
+
void mc13xxx_lock(struct mc13xxx *mc13xxx)
{
if (!mutex_trylock(&mc13xxx->lock)) {
@@ -216,14 +228,16 @@ EXPORT_SYMBOL_GPL(mc13xxx_variant_mc13783);
struct mc13xxx_variant mc13xxx_variant_mc13892 = {
.name = "mc13892",
- .button_resources_size = 0,
+ .button_resources = mc13892_button_resources,
+ .button_resources_size = ARRAY_SIZE(mc13892_button_resources),
.print_revision = mc13xxx_print_revision,
};
EXPORT_SYMBOL_GPL(mc13xxx_variant_mc13892);
struct mc13xxx_variant mc13xxx_variant_mc34708 = {
.name = "mc34708",
- .button_resources_size = 0,
+ .button_resources = mc34708_button_resources,
+ .button_resources_size = ARRAY_SIZE(mc34708_button_resources),
.print_revision = mc34708_print_revision,
};
EXPORT_SYMBOL_GPL(mc13xxx_variant_mc34708);
diff --git a/include/linux/mfd/mc13783.h b/include/linux/mfd/mc13783.h
index c25b1676741b..ab6db774e1fa 100644
--- a/include/linux/mfd/mc13783.h
+++ b/include/linux/mfd/mc13783.h
@@ -65,8 +65,8 @@
#define MC13783_IRQ_UDM 23
#define MC13783_IRQ_1HZ MC13XXX_IRQ_1HZ
#define MC13783_IRQ_TODA MC13XXX_IRQ_TODA
-#define MC13783_IRQ_ONOFD1 27
-#define MC13783_IRQ_ONOFD2 28
+#define MC13783_IRQ_ONOFD1 MC13XXX_IRQ_PWRON1
+#define MC13783_IRQ_ONOFD2 MC13XXX_IRQ_PWRON2
#define MC13783_IRQ_ONOFD3 29
#define MC13783_IRQ_SYSRST MC13XXX_IRQ_SYSRST
#define MC13783_IRQ_RTCRST MC13XXX_IRQ_RTCRST
diff --git a/include/linux/mfd/mc13892.h b/include/linux/mfd/mc13892.h
index 880cd949d12a..567d527825df 100644
--- a/include/linux/mfd/mc13892.h
+++ b/include/linux/mfd/mc13892.h
@@ -33,4 +33,5 @@
#define MC13892_PWGT2SPI 22
#define MC13892_VCOINCELL 23
+#define MC13892_IRQ_PWRON3 26
#endif
diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h
index 4437ab80fcf8..71c7d3614d4c 100644
--- a/include/linux/mfd/mc13xxx.h
+++ b/include/linux/mfd/mc13xxx.h
@@ -61,6 +61,8 @@ int mc13xxx_irq_unmask(struct mc13xxx *mc13xxx, int irq);
#define MC13XXX_IRQ_LOBATH 14
#define MC13XXX_IRQ_1HZ 24
#define MC13XXX_IRQ_TODA 25
+#define MC13XXX_IRQ_PWRON1 27
+#define MC13XXX_IRQ_PWRON2 28
#define MC13XXX_IRQ_SYSRST 30
#define MC13XXX_IRQ_RTCRST 31
#define MC13XXX_IRQ_PC 32
--
2.39.5
^ permalink raw reply related
* [PATCH] HID: multitouch: fix name of Stylus input devices
From: Thadeu Lima de Souza Cascardo @ 2025-10-08 12:40 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires, Mika Westerberg, Tero Kristo
Cc: linux-input, linux-kernel, kernel-dev,
Thadeu Lima de Souza Cascardo
HID_DG_PEN devices should have a suffix of "Stylus", as pointed out by
commit c0ee1d571626 ("HID: hid-input: Add suffix also for HID_DG_PEN").
However, on multitouch devices, these suffixes may be overridden. Before
that commit, HID_DG_PEN devices would get the "Stylus" suffix, but after
that, multitouch would override them to have an "UNKNOWN" suffix. Just add
HID_DG_PEN to the list of non-overriden suffixes in multitouch.
Before this fix:
[ 0.470981] input: ELAN9008:00 04F3:2E14 UNKNOWN as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-16/i2c-ELAN9008:00/0018:04F3:2E14.0001/input/input8
ELAN9008:00 04F3:2E14 UNKNOWN
After this fix:
[ 0.474332] input: ELAN9008:00 04F3:2E14 Stylus as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-16/i2c-ELAN9008:00/0018:04F3:2E14.0001/input/input8
ELAN9008:00 04F3:2E14 Stylus
Fixes: c0ee1d571626 ("HID: hid-input: Add suffix also for HID_DG_PEN")
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
---
drivers/hid/hid-multitouch.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 2879e65cf303b1456311ac06115adda5a78a2600..513b8673ad8dd7ad135652f787812072d45e6c1a 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -1742,6 +1742,7 @@ static int mt_input_configured(struct hid_device *hdev, struct hid_input *hi)
case HID_CP_CONSUMER_CONTROL:
case HID_GD_WIRELESS_RADIO_CTLS:
case HID_GD_SYSTEM_MULTIAXIS:
+ case HID_DG_PEN:
/* already handled by hid core */
break;
case HID_DG_TOUCHSCREEN:
---
base-commit: c746c3b5169831d7fb032a1051d8b45592ae8d78
change-id: 20251008-hid_multitouch_stylus-9d2d20d86108
Best regards,
--
Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
^ permalink raw reply related
* [PATCH 0/2] HID: multitouch: fix sticky-fingers quirks
From: Benjamin Tissoires @ 2025-10-08 14:06 UTC (permalink / raw)
To: Jiri Kosina, Shuah Khan
Cc: Peter Hutterer, linux-input, linux-kernel, linux-kselftest,
Benjamin Tissoires, stable
According to Peter, we've had for a very long time an issue on some
mutltiouch touchpads where the fingers were stuck in a scrolling mode,
or 3 fingers gesture mode. I was unable to debug it because it was
rather hard to reproduce.
Recently, some people raised the issue again on libinput, and this time
added a recording of the actual bug.
It turns out that the sticky finger quirk that was introduced back in
2017 was only checking the last report, and that those missing releases
also happen when moving from 3 to 1 finger (only 1 is released instead
of 2).
This solution seems to me to be the most sensible, because we could also
add the NSMU quirk to win8 multitouch touchpads, but this would involve
a lot more computations at each report for rather annoying corner cases.
Link: https://gitlab.freedesktop.org/libinput/libinput/-/issues/1194
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
---
Benjamin Tissoires (2):
HID: multitouch: fix sticky fingers
selftests/hid: add tests for missing release on the Dell Synaptics
drivers/hid/hid-multitouch.c | 27 ++++++-----
.../testing/selftests/hid/tests/test_multitouch.py | 55 ++++++++++++++++++++++
2 files changed, 69 insertions(+), 13 deletions(-)
---
base-commit: 54ba6d9b1393a0061600c0e49c8ebef65d60a8b2
change-id: 20250926-fix-sticky-fingers-8ae88436ae82
Best regards,
--
Benjamin Tissoires <bentiss@kernel.org>
^ permalink raw reply
* [PATCH 1/2] HID: multitouch: fix sticky fingers
From: Benjamin Tissoires @ 2025-10-08 14:06 UTC (permalink / raw)
To: Jiri Kosina, Shuah Khan
Cc: Peter Hutterer, linux-input, linux-kernel, linux-kselftest,
Benjamin Tissoires, stable
In-Reply-To: <20251008-fix-sticky-fingers-v1-0-760f1f26fce3@kernel.org>
The sticky fingers quirk (MT_QUIRK_STICKY_FINGERS) was only considering
the case when slots were not released during the last report.
This can be problematic if the firmware forgets to release a finger
while others are still present.
This was observed on the Synaptics DLL0945 touchpad found on the Dell
XPS 9310 and the Dell Inspiron 5406.
Fixes: 4f4001bc76fd ("HID: multitouch: fix rare Win 8 cases when the touch up event gets missing")
Cc: stable@vger.kernel.org
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
---
drivers/hid/hid-multitouch.c | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 2879e65cf303b1456311ac06115adda5a78a2600..e1a5c7f3a25132094ed643910337474025852b22 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -94,9 +94,8 @@ enum report_mode {
TOUCHPAD_REPORT_ALL = TOUCHPAD_REPORT_BUTTONS | TOUCHPAD_REPORT_CONTACTS,
};
-#define MT_IO_FLAGS_RUNNING 0
-#define MT_IO_FLAGS_ACTIVE_SLOTS 1
-#define MT_IO_FLAGS_PENDING_SLOTS 2
+#define MT_IO_SLOTS_MASK GENMASK(7, 0) /* reserve first 8 bits for slot tracking */
+#define MT_IO_FLAGS_RUNNING 32
static const bool mtrue = true; /* default for true */
static const bool mfalse; /* default for false */
@@ -172,7 +171,11 @@ struct mt_device {
struct timer_list release_timer; /* to release sticky fingers */
struct hid_haptic_device *haptic; /* haptic related configuration */
struct hid_device *hdev; /* hid_device we're attached to */
- unsigned long mt_io_flags; /* mt flags (MT_IO_FLAGS_*) */
+ unsigned long mt_io_flags; /* mt flags (MT_IO_FLAGS_RUNNING)
+ * first 8 bits are reserved for keeping the slot
+ * states, this is fine because we only support up
+ * to 250 slots (MT_MAX_MAXCONTACT)
+ */
__u8 inputmode_value; /* InputMode HID feature value */
__u8 maxcontacts;
bool is_buttonpad; /* is this device a button pad? */
@@ -986,6 +989,7 @@ static void mt_release_pending_palms(struct mt_device *td,
for_each_set_bit(slotnum, app->pending_palm_slots, td->maxcontacts) {
clear_bit(slotnum, app->pending_palm_slots);
+ clear_bit(slotnum, &td->mt_io_flags);
input_mt_slot(input, slotnum);
input_mt_report_slot_inactive(input);
@@ -1019,12 +1023,6 @@ static void mt_sync_frame(struct mt_device *td, struct mt_application *app,
app->left_button_state = 0;
if (td->is_haptic_touchpad)
hid_haptic_pressure_reset(td->haptic);
-
- if (test_bit(MT_IO_FLAGS_ACTIVE_SLOTS, &td->mt_io_flags))
- set_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags);
- else
- clear_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags);
- clear_bit(MT_IO_FLAGS_ACTIVE_SLOTS, &td->mt_io_flags);
}
static int mt_compute_timestamp(struct mt_application *app, __s32 value)
@@ -1202,7 +1200,9 @@ static int mt_process_slot(struct mt_device *td, struct input_dev *input,
input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, major);
input_event(input, EV_ABS, ABS_MT_TOUCH_MINOR, minor);
- set_bit(MT_IO_FLAGS_ACTIVE_SLOTS, &td->mt_io_flags);
+ set_bit(slotnum, &td->mt_io_flags);
+ } else {
+ clear_bit(slotnum, &td->mt_io_flags);
}
return 0;
@@ -1337,7 +1337,7 @@ static void mt_touch_report(struct hid_device *hid,
* defect.
*/
if (app->quirks & MT_QUIRK_STICKY_FINGERS) {
- if (test_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags))
+ if (td->mt_io_flags & MT_IO_SLOTS_MASK)
mod_timer(&td->release_timer,
jiffies + msecs_to_jiffies(100));
else
@@ -1813,6 +1813,7 @@ static void mt_release_contacts(struct hid_device *hid)
for (i = 0; i < mt->num_slots; i++) {
input_mt_slot(input_dev, i);
input_mt_report_slot_inactive(input_dev);
+ clear_bit(i, &td->mt_io_flags);
}
input_mt_sync_frame(input_dev);
input_sync(input_dev);
@@ -1835,7 +1836,7 @@ static void mt_expired_timeout(struct timer_list *t)
*/
if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))
return;
- if (test_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags))
+ if (td->mt_io_flags & MT_IO_SLOTS_MASK)
mt_release_contacts(hdev);
clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
}
--
2.51.0
^ permalink raw reply related
* [PATCH 2/2] selftests/hid: add tests for missing release on the Dell Synaptics
From: Benjamin Tissoires @ 2025-10-08 14:06 UTC (permalink / raw)
To: Jiri Kosina, Shuah Khan
Cc: Peter Hutterer, linux-input, linux-kernel, linux-kselftest,
Benjamin Tissoires
In-Reply-To: <20251008-fix-sticky-fingers-v1-0-760f1f26fce3@kernel.org>
Add a simple test for the corner case not currently covered by the
sticky fingers quirk. Because it's a corner case test, we only test this
on a couple of devices, not on all of them because the value of adding
the same test over and over is rather moot.
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
---
.../testing/selftests/hid/tests/test_multitouch.py | 55 ++++++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/tools/testing/selftests/hid/tests/test_multitouch.py b/tools/testing/selftests/hid/tests/test_multitouch.py
index 5d2ffa3d59777e3cd93d1d7aebabc2a6b7ecb42a..ece0ba8e7d34b75d42245e5936ecf804c46b0846 100644
--- a/tools/testing/selftests/hid/tests/test_multitouch.py
+++ b/tools/testing/selftests/hid/tests/test_multitouch.py
@@ -1752,6 +1752,52 @@ class TestWin8TSConfidence(BaseTest.TestWin8Multitouch):
assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
+ @pytest.mark.skip_if_uhdev(
+ lambda uhdev: "Confidence" not in uhdev.fields,
+ "Device not compatible, missing Confidence usage",
+ )
+ def test_mt_confidence_bad_multi_release(self):
+ """Check for the sticky finger being properly detected.
+
+ We first inject 3 fingers, then release only the second.
+ After 100 ms, we should receive a generated event about the
+ 2 missing fingers being released.
+ """
+ uhdev = self.uhdev
+ evdev = uhdev.get_evdev()
+
+ # send 3 touches
+ t0 = Touch(1, 50, 10)
+ t1 = Touch(2, 150, 100)
+ t2 = Touch(3, 250, 200)
+ r = uhdev.event([t0, t1, t2])
+ events = uhdev.next_sync_events()
+ self.debug_reports(r, uhdev, events)
+
+ # release the second
+ t1.tipswitch = False
+ r = uhdev.event([t1])
+ events = uhdev.next_sync_events()
+ self.debug_reports(r, uhdev, events)
+
+ # only the second is released
+ assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] != -1
+ assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
+ assert evdev.slots[2][libevdev.EV_ABS.ABS_MT_TRACKING_ID] != -1
+
+ # wait for the timer to kick in
+ time.sleep(0.2)
+
+ events = uhdev.next_sync_events()
+ self.debug_reports([], uhdev, events)
+
+ # now all 3 fingers are released
+ assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 0) in events
+ assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
+ assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
+ assert evdev.slots[2][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
+
+
class TestElanXPS9360(BaseTest.TestWin8Multitouch):
def create_device(self):
return Digitizer(
@@ -2086,3 +2132,12 @@ class Testsynaptics_06cb_ce08(BaseTest.TestPTP):
input_info=(BusType.I2C, 0x06CB, 0xCE08),
rdesc="05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0 05 01 09 02 a1 01 85 18 09 01 a1 00 05 09 19 01 29 03 46 00 00 15 00 25 01 75 01 95 03 81 02 95 05 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0 06 00 ff 09 02 a1 01 85 20 09 01 a1 00 09 03 15 00 26 ff 00 35 00 46 ff 00 75 08 95 05 81 02 c0 c0 05 0d 09 05 a1 01 85 03 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 f8 04 75 10 55 0e 65 11 09 30 35 00 46 24 04 95 01 81 02 46 30 02 26 a0 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 f8 04 75 10 55 0e 65 11 09 30 35 00 46 24 04 95 01 81 02 46 30 02 26 a0 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 f8 04 75 10 55 0e 65 11 09 30 35 00 46 24 04 95 01 81 02 46 30 02 26 a0 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 f8 04 75 10 55 0e 65 11 09 30 35 00 46 24 04 95 01 81 02 46 30 02 26 a0 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 f8 04 75 10 55 0e 65 11 09 30 35 00 46 24 04 95 01 81 02 46 30 02 26 a0 02 09 31 81 02 c0 05 0d 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 08 09 55 09 59 75 04 95 02 25 0f b1 02 85 0d 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 07 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 04 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 06 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 00 ff 09 01 a1 01 85 09 09 02 15 00 26 ff 00 75 08 95 14 91 02 85 0a 09 03 15 00 26 ff 00 75 08 95 14 91 02 85 0b 09 04 15 00 26 ff 00 75 08 95 45 81 02 85 0c 09 05 15 00 26 ff 00 75 08 95 45 81 02 85 0f 09 06 15 00 26 ff 00 75 08 95 03 b1 02 85 0e 09 07 15 00 26 ff 00 75 08 95 01 b1 02 c0",
)
+
+class Testsynaptics_06cb_ce26(TestWin8TSConfidence):
+ def create_device(self):
+ return PTP(
+ "uhid test synaptics_06cb_ce26",
+ max_contacts=5,
+ input_info=(BusType.I2C, 0x06CB, 0xCE26),
+ rdesc="05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0 05 0d 09 05 a1 01 85 03 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 45 05 75 10 55 0e 65 11 09 30 35 00 46 64 04 95 01 81 02 46 a2 02 26 29 03 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 45 05 75 10 55 0e 65 11 09 30 35 00 46 64 04 95 01 81 02 46 a2 02 26 29 03 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 45 05 75 10 55 0e 65 11 09 30 35 00 46 64 04 95 01 81 02 46 a2 02 26 29 03 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 45 05 75 10 55 0e 65 11 09 30 35 00 46 64 04 95 01 81 02 46 a2 02 26 29 03 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 45 05 75 10 55 0e 65 11 09 30 35 00 46 64 04 95 01 81 02 46 a2 02 26 29 03 09 31 81 02 c0 05 0d 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 08 09 55 09 59 75 04 95 02 25 0f b1 02 85 0d 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 07 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 04 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 06 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 00 ff 09 01 a1 01 85 09 09 02 15 00 26 ff 00 75 08 95 14 91 02 85 0a 09 03 15 00 26 ff 00 75 08 95 14 91 02 85 0b 09 04 15 00 26 ff 00 75 08 95 3d 81 02 85 0c 09 05 15 00 26 ff 00 75 08 95 3d 81 02 85 0f 09 06 15 00 26 ff 00 75 08 95 03 b1 02 85 0e 09 07 15 00 26 ff 00 75 08 95 01 b1 02 c0",
+ )
--
2.51.0
^ permalink raw reply related
* [PATCH REQUEST] ASUS ROG Flow Z13 (2025) GZ302EA-XS99 touchpad lacks multi-touch support
From: Matt MP @ 2025-10-08 15:16 UTC (permalink / raw)
To: linux-input; +Cc: jikos, benjamin.tissoires
[-- Attachment #1.1: Type: text/plain, Size: 2504 bytes --]
Subject: ASUS ROG Flow Z13 (2025) GZ302EA-XS99 keyboard touchpad lacks
multi-touch support
Hardware: ASUS ROG Flow Z13 (2025 model - GZ302EA-XS99)
Kernel Version: 6.17.1-arch1-1
Driver: hid-asus
SUMMARY:
The integrated touchpad on the ASUS ROG Flow Z13 (2025) detachable keyboard
is not exposing multi-touch capabilities to Linux, preventing two-finger
scrolling. The device works in Windows with full multi-touch support.
DEVICE DETAILS:
- USB ID: 0b05:1a30
- Device Name: ASUSTeK Computer Inc. GZ302EA-Keyboard Touchpad
- Driver in use: hid-asus
- HID Device: 0003:0B05:1A30.XXXX (changes on boot)
- Event device: /dev/input/event10 (may vary)
- Size reported by libinput: 127x70mm
SYMPTOMS:
1. Touchpad works for basic pointer movement (single finger)
2. No multi-touch events reported (no ABS_MT_* or BTN_TOOL_DOUBLETAP)
3. Two-finger scrolling does not work
4. libinput only detects "button" scroll method, not "two-finger"
5. evtest shows only REL_X, REL_Y events, no multi-touch data
EXPECTED BEHAVIOR:
The touchpad should report multi-touch events (ABS_MT_POSITION_X/Y,
BTN_TOOL_DOUBLETAP, etc.) to enable two-finger scrolling, as it does
in Windows.
DMESG OUTPUT:
[ 68.393557] input: ASUSTeK Computer Inc. GZ302EA-Keyboard Touchpad as
/devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.3/0003:0B05:1A30.0008/input/input15
[ 68.445432] hid-generic 0003:0B05:1A30.0008: input,hiddev99,hidraw7: USB
HID v1.10 Mouse [ASUSTeK Computer Inc. GZ302EA-Keyboard] on
usb-0000:c6:00.0-4/input3
[ 69.218976] asus 0003:0B05:1A30.0008: input,hiddev98,hidraw6: USB HID
v1.10 Mouse [ASUSTeK Computer Inc. GZ302EA-Keyboard] on
usb-0000:c6:00.0-4/input3
LIBINPUT OUTPUT:
Device: Asus Keyboard
Kernel: /dev/input/event10
Id: usb:0b05:1a30
Size: 127x70mm
Capabilities: keyboard pointer
Scroll methods: button
Scroll button: BTN_RIGHT
MODULES LOADED:
asus_nb_wmi, hid_asus, asus_wmi
ATTEMPTS TO FIX:
1. Tried forcing hid-multitouch driver - device rejected binding
2. Created libinput quirks file - no effect
3. Updated to kernel 6.17.1 - no change
REQUEST:
Please add multi-touch support for this device to the hid-asus driver,
or provide guidance on what additional information is needed to enable
proper touchpad functionality.
ADDITIONAL INFO:
The device works correctly with full multi-touch support in Windows 11,
confirming the hardware is capable of reporting multi-touch data.
[-- Attachment #1.2: Type: text/html, Size: 2790 bytes --]
[-- Attachment #2: dmesg_asus_touchpad.txt --]
[-- Type: text/plain, Size: 104717 bytes --]
[ 0.000000] Linux version 6.17.1-arch1-1 (linux@archlinux) (gcc (GCC) 15.2.1 20250813, GNU ld (GNU Binutils) 2.45.0) #1 SMP PREEMPT_DYNAMIC Mon, 06 Oct 2025 18:48:29 +0000
[ 0.000000] Command line: quiet splash cryptdevice=PARTUUID=7c08e7e5-16ef-4bfe-a8ad-8a7e78ab54b3:root root=/dev/mapper/root zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs
[ 0.000000] x86/split lock detection: #DB: warning on user-space bus_locks
[ 0.000000] BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ffff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000000a0000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x0000000009b7efff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000009b7f000-0x0000000009ffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000000a000000-0x000000000a1fffff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000a200000-0x000000000a287fff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x000000000a288000-0x000000006a27efff] usable
[ 0.000000] BIOS-e820: [mem 0x000000006a27f000-0x000000007027efff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000007027f000-0x000000007037efff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x000000007037f000-0x000000007137efff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x000000007137f000-0x00000000785fefff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000785ff000-0x0000000079ff6fff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000079ff7000-0x0000000079ffbfff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000079ffc000-0x0000000079ffffff] usable
[ 0.000000] BIOS-e820: [mem 0x000000007a000000-0x000000007bffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000007d675000-0x000000007d6fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000007d800000-0x000000007fffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fd000000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x0000001c7e0bffff] usable
[ 0.000000] BIOS-e820: [mem 0x0000001c7f100000-0x00000020b01fffff] reserved
[ 0.000000] NX (Execute Disable) protection: active
[ 0.000000] APIC: Static calls initialized
[ 0.000000] efi: EFI v2.9 by American Megatrends
[ 0.000000] efi: ACPI=0x7037e000 ACPI 2.0=0x7037e014 TPMFinalLog=0x71330000 SMBIOS=0x781cb000 SMBIOS 3.0=0x781ca000 MEMATTR=0x6563d098 ESRT=0x67fd6b98 RNG=0x70305f18 INITRD=0x5de35898 TPMEventLog=0x702fa018
[ 0.000000] random: crng init done
[ 0.000000] efi: Remove mem64: MMIO range=[0xe0000000-0xefffffff] (256MB) from e820 map
[ 0.000000] e820: remove [mem 0xe0000000-0xefffffff] reserved
[ 0.000000] efi: Remove mem65: MMIO range=[0xfd000000-0xfedfffff] (30MB) from e820 map
[ 0.000000] e820: remove [mem 0xfd000000-0xfedfffff] reserved
[ 0.000000] efi: Not removing mem66: MMIO range=[0xfee00000-0xfee00fff] (4KB) from e820 map
[ 0.000000] efi: Remove mem67: MMIO range=[0xfee01000-0xffffffff] (17MB) from e820 map
[ 0.000000] e820: remove [mem 0xfee01000-0xffffffff] reserved
[ 0.000000] efi: Remove mem69: MMIO range=[0x2090000000-0x20b01fffff] (514MB) from e820 map
[ 0.000000] e820: remove [mem 0x2090000000-0x20b01fffff] reserved
[ 0.000000] SMBIOS 3.7.0 present.
[ 0.000000] DMI: ASUSTeK COMPUTER INC. ROG Flow Z13 GZ302EA_GZ302EA/GZ302EA, BIOS GZ302EA.308 03/24/2025
[ 0.000000] DMI: Memory slots populated: 8/8
[ 0.000000] tsc: Fast TSC calibration using PIT
[ 0.000000] tsc: Detected 2994.220 MHz processor
[ 0.000064] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
[ 0.000065] e820: remove [mem 0x000a0000-0x000fffff] usable
[ 0.000070] last_pfn = 0x1c7e0c0 max_arch_pfn = 0x400000000
[ 0.000076] MTRR map: 6 entries (3 fixed + 3 variable; max 20), built from 9 variable MTRRs
[ 0.000078] x86/PAT: Configuration [0-7]: WB WC UC- UC WB WP UC- WT
[ 0.000240] last_pfn = 0x7a000 max_arch_pfn = 0x400000000
[ 0.003557] esrt: Reserving ESRT space from 0x0000000067fd6b98 to 0x0000000067fd6bf8.
[ 0.003564] e820: update [mem 0x67fd6000-0x67fd6fff] usable ==> reserved
[ 0.003575] Using GB pages for direct mapping
[ 0.003770] Secure boot disabled
[ 0.003771] RAMDISK: [mem 0x565ed000-0x59776fff]
[ 0.003990] ACPI: Early table checksum verification disabled
[ 0.003993] ACPI: RSDP 0x000000007037E014 000024 (v02 _ASUS_)
[ 0.003996] ACPI: XSDT 0x000000007037D728 0001B4 (v01 _ASUS_ Notebook 01072009 AMI 01000013)
[ 0.004001] ACPI: FACP 0x0000000070371000 000114 (v06 _ASUS_ Notebook 01072009 AMI 00010013)
[ 0.004006] ACPI: DSDT 0x000000007035D000 013837 (v02 _ASUS_ Notebook 01072009 INTL 20230331)
[ 0.004007] ACPI: FACS 0x0000000070B0D000 000040
[ 0.004009] ACPI: MSDM 0x000000007037C000 000055 (v03 _ASUS_ Notebook 01072009 ASUS 00000001)
[ 0.004010] ACPI: SSDT 0x0000000070373000 00848D (v02 AMD AmdTable 00000002 MSFT 04000000)
[ 0.004011] ACPI: SSDT 0x0000000070372000 0003F1 (v02 _ASUS_ CPUSSDT 01072009 AMI 01072009)
[ 0.004013] ACPI: FIDT 0x000000007035C000 00009C (v01 _ASUS_ Notebook 01072009 AMI 00010013)
[ 0.004014] ACPI: ECDT 0x000000007035B000 0000C1 (v01 _ASUS_ Notebook 01072009 AMI. 00000005)
[ 0.004015] ACPI: MCFG 0x000000007035A000 00003C (v01 _ASUS_ Notebook 01072009 MSFT 00010013)
[ 0.004016] ACPI: HPET 0x0000000070359000 000038 (v01 _ASUS_ Notebook 01072009 AMI 00000005)
[ 0.004018] ACPI: UEFI 0x0000000070B0B000 000048 (v01 _ASUS_ Notebook 01072009 AMI 01000013)
[ 0.004019] ACPI: FPDT 0x0000000070358000 000044 (v01 _ASUS_ A M I 01072009 AMI 01000013)
[ 0.004020] ACPI: VFCT 0x0000000070353000 004484 (v01 _ASUS_ Notebook 00000001 AMD 33504F47)
[ 0.004021] ACPI: BGRT 0x0000000070352000 000038 (v01 _ASUS_ Notebook 01072009 AMI 00010013)
[ 0.004023] ACPI: SSDT 0x0000000070347000 00A8CE (v02 AMD AMD CPU 00000001 AMD 00000001)
[ 0.004024] ACPI: SDEV 0x0000000070346000 0001F2 (v01 AMD SdevTble 00000001 ACPI 00000002)
[ 0.004025] ACPI: TPM2 0x0000000070345000 000050 (v05 _ASUS_ Notebook 00000001 AMI 00000000)
[ 0.004026] ACPI: SSDT 0x0000000070344000 000CA9 (v02 AMD CPMDFIG4 00000001 INTL 20230331)
[ 0.004028] ACPI: SSDT 0x0000000070341000 002AA6 (v02 AMD CDFAAIG2 00000001 INTL 20230331)
[ 0.004029] ACPI: SSDT 0x000000007033F000 001DB7 (v02 AMD CPMPMF 00000001 INTL 20230331)
[ 0.004030] ACPI: SSDT 0x000000007033E000 000889 (v02 AMD CPMWLRC 00000001 INTL 20230331)
[ 0.004031] ACPI: SSDT 0x000000007033D000 000782 (v02 AMD CPMEC 00000001 INTL 20230331)
[ 0.004032] ACPI: SSDT 0x000000007033C000 000EB9 (v02 AMD OEMACP 00000001 INTL 20230331)
[ 0.004033] ACPI: SSDT 0x000000007033B000 000A70 (v02 AMD OEMPMF 00000001 INTL 20230331)
[ 0.004035] ACPI: SSDT 0x0000000070331000 009B12 (v02 AMD CPMCMN 00000001 INTL 20230331)
[ 0.004036] ACPI: WSMT 0x0000000070330000 000028 (v01 _ASUS_ Notebook 01072009 AMI 00010013)
[ 0.004037] ACPI: APIC 0x000000007032F000 000168 (v06 _ASUS_ Notebook 01072009 AMI 00010013)
[ 0.004038] ACPI: SSDT 0x000000007032E000 00010D (v02 MSFT MHSP 00000004 INTL 20230331)
[ 0.004039] ACPI: SSDT 0x000000007032C000 001EE8 (v02 AMD AOD 00000001 INTL 20230331)
[ 0.004041] ACPI: SSDT 0x000000007032B000 000051 (v02 AMD DRTM 00000001 INTL 20230331)
[ 0.004042] ACPI: IVRS 0x000000007032A000 0001F6 (v02 AMD AmdTable 00000001 AMD 00000001)
[ 0.004043] ACPI: SSDT 0x0000000070329000 0009D0 (v02 AMD CPMMSOSC 00000001 INTL 20230331)
[ 0.004044] ACPI: SSDT 0x0000000070328000 000F5C (v02 AMD CPMACPV8 00000001 INTL 20230331)
[ 0.004046] ACPI: SSDT 0x0000000070327000 000500 (v02 AMD MEMTOOL0 00000002 INTL 20230331)
[ 0.004047] ACPI: SSDT 0x0000000070326000 0009F5 (v02 AMD THERMAL0 00000001 INTL 20230331)
[ 0.004048] ACPI: SSDT 0x0000000070325000 0005F9 (v02 AMD GPP_PME_ 00000001 INTL 20230331)
[ 0.004049] ACPI: SSDT 0x000000007031B000 0097A0 (v02 AMD INTGPPC_ 00000001 INTL 20230331)
[ 0.004050] ACPI: SSDT 0x0000000070316000 0046FA (v02 AMD INTGPPA_ 00000001 INTL 20230331)
[ 0.004052] ACPI: SSDT 0x0000000070315000 000D1D (v02 AMD CPMGPIO0 00000001 INTL 20230331)
[ 0.004053] ACPI: SSDT 0x0000000070314000 000530 (v02 AMD CAM12 00000001 INTL 20230331)
[ 0.004054] ACPI: SSDT 0x0000000070313000 00008D (v02 AMD CPMMSLPI 00000001 INTL 20230331)
[ 0.004055] ACPI: SSDT 0x0000000070312000 00050B (v02 AMD CPMSFAML 00000001 INTL 20230331)
[ 0.004056] ACPI: SSDT 0x0000000070310000 0011BC (v01 AMD CPMUCSI 00000001 INTL 20230331)
[ 0.004058] ACPI: SSDT 0x000000007030F000 000D18 (v02 AMD WwanSsdt 00000001 INTL 20230331)
[ 0.004059] ACPI: SSDT 0x000000007030E000 000B07 (v02 AMD SDCR 00000001 INTL 20230331)
[ 0.004060] ACPI: SSDT 0x000000007030D000 000ABC (v02 AMD LOM 00000001 INTL 20230331)
[ 0.004061] ACPI: SSDT 0x000000007030C000 000BCA (v02 AMD WLAN 00000001 INTL 20230331)
[ 0.004062] ACPI: SSDT 0x000000007030B000 000CF8 (v02 AMD NVME 00000001 INTL 20230331)
[ 0.004063] ACPI: SSDT 0x000000007030A000 000CF8 (v02 AMD NVME 00000001 INTL 20230331)
[ 0.004065] ACPI: SSDT 0x0000000070309000 00063C (v02 AMD GpMsSsdt 00000001 INTL 20230331)
[ 0.004066] ACPI: SSDT 0x0000000070308000 00005E (v02 AMD GP10 00000001 INTL 20230331)
[ 0.004067] ACPI: SSDT 0x0000000070306000 001994 (v02 AMD UPEP 00000001 INTL 20230331)
[ 0.004068] ACPI: Reserving FACP table memory at [mem 0x70371000-0x70371113]
[ 0.004069] ACPI: Reserving DSDT table memory at [mem 0x7035d000-0x70370836]
[ 0.004069] ACPI: Reserving FACS table memory at [mem 0x70b0d000-0x70b0d03f]
[ 0.004069] ACPI: Reserving MSDM table memory at [mem 0x7037c000-0x7037c054]
[ 0.004069] ACPI: Reserving SSDT table memory at [mem 0x70373000-0x7037b48c]
[ 0.004070] ACPI: Reserving SSDT table memory at [mem 0x70372000-0x703723f0]
[ 0.004070] ACPI: Reserving FIDT table memory at [mem 0x7035c000-0x7035c09b]
[ 0.004070] ACPI: Reserving ECDT table memory at [mem 0x7035b000-0x7035b0c0]
[ 0.004070] ACPI: Reserving MCFG table memory at [mem 0x7035a000-0x7035a03b]
[ 0.004071] ACPI: Reserving HPET table memory at [mem 0x70359000-0x70359037]
[ 0.004071] ACPI: Reserving UEFI table memory at [mem 0x70b0b000-0x70b0b047]
[ 0.004071] ACPI: Reserving FPDT table memory at [mem 0x70358000-0x70358043]
[ 0.004071] ACPI: Reserving VFCT table memory at [mem 0x70353000-0x70357483]
[ 0.004071] ACPI: Reserving BGRT table memory at [mem 0x70352000-0x70352037]
[ 0.004072] ACPI: Reserving SSDT table memory at [mem 0x70347000-0x703518cd]
[ 0.004072] ACPI: Reserving SDEV table memory at [mem 0x70346000-0x703461f1]
[ 0.004072] ACPI: Reserving TPM2 table memory at [mem 0x70345000-0x7034504f]
[ 0.004072] ACPI: Reserving SSDT table memory at [mem 0x70344000-0x70344ca8]
[ 0.004073] ACPI: Reserving SSDT table memory at [mem 0x70341000-0x70343aa5]
[ 0.004073] ACPI: Reserving SSDT table memory at [mem 0x7033f000-0x70340db6]
[ 0.004073] ACPI: Reserving SSDT table memory at [mem 0x7033e000-0x7033e888]
[ 0.004073] ACPI: Reserving SSDT table memory at [mem 0x7033d000-0x7033d781]
[ 0.004073] ACPI: Reserving SSDT table memory at [mem 0x7033c000-0x7033ceb8]
[ 0.004074] ACPI: Reserving SSDT table memory at [mem 0x7033b000-0x7033ba6f]
[ 0.004074] ACPI: Reserving SSDT table memory at [mem 0x70331000-0x7033ab11]
[ 0.004074] ACPI: Reserving WSMT table memory at [mem 0x70330000-0x70330027]
[ 0.004074] ACPI: Reserving APIC table memory at [mem 0x7032f000-0x7032f167]
[ 0.004075] ACPI: Reserving SSDT table memory at [mem 0x7032e000-0x7032e10c]
[ 0.004075] ACPI: Reserving SSDT table memory at [mem 0x7032c000-0x7032dee7]
[ 0.004075] ACPI: Reserving SSDT table memory at [mem 0x7032b000-0x7032b050]
[ 0.004075] ACPI: Reserving IVRS table memory at [mem 0x7032a000-0x7032a1f5]
[ 0.004076] ACPI: Reserving SSDT table memory at [mem 0x70329000-0x703299cf]
[ 0.004076] ACPI: Reserving SSDT table memory at [mem 0x70328000-0x70328f5b]
[ 0.004076] ACPI: Reserving SSDT table memory at [mem 0x70327000-0x703274ff]
[ 0.004076] ACPI: Reserving SSDT table memory at [mem 0x70326000-0x703269f4]
[ 0.004076] ACPI: Reserving SSDT table memory at [mem 0x70325000-0x703255f8]
[ 0.004077] ACPI: Reserving SSDT table memory at [mem 0x7031b000-0x7032479f]
[ 0.004077] ACPI: Reserving SSDT table memory at [mem 0x70316000-0x7031a6f9]
[ 0.004077] ACPI: Reserving SSDT table memory at [mem 0x70315000-0x70315d1c]
[ 0.004077] ACPI: Reserving SSDT table memory at [mem 0x70314000-0x7031452f]
[ 0.004078] ACPI: Reserving SSDT table memory at [mem 0x70313000-0x7031308c]
[ 0.004078] ACPI: Reserving SSDT table memory at [mem 0x70312000-0x7031250a]
[ 0.004078] ACPI: Reserving SSDT table memory at [mem 0x70310000-0x703111bb]
[ 0.004078] ACPI: Reserving SSDT table memory at [mem 0x7030f000-0x7030fd17]
[ 0.004079] ACPI: Reserving SSDT table memory at [mem 0x7030e000-0x7030eb06]
[ 0.004079] ACPI: Reserving SSDT table memory at [mem 0x7030d000-0x7030dabb]
[ 0.004079] ACPI: Reserving SSDT table memory at [mem 0x7030c000-0x7030cbc9]
[ 0.004079] ACPI: Reserving SSDT table memory at [mem 0x7030b000-0x7030bcf7]
[ 0.004080] ACPI: Reserving SSDT table memory at [mem 0x7030a000-0x7030acf7]
[ 0.004080] ACPI: Reserving SSDT table memory at [mem 0x70309000-0x7030963b]
[ 0.004080] ACPI: Reserving SSDT table memory at [mem 0x70308000-0x7030805d]
[ 0.004080] ACPI: Reserving SSDT table memory at [mem 0x70306000-0x70307993]
[ 0.004146] No NUMA configuration found
[ 0.004147] Faking a node at [mem 0x0000000000000000-0x0000001c7e0bffff]
[ 0.004151] NODE_DATA(0) allocated [mem 0x1c7e0952c0-0x1c7e0bffff]
[ 0.004289] Zone ranges:
[ 0.004289] DMA [mem 0x0000000000001000-0x0000000000ffffff]
[ 0.004290] DMA32 [mem 0x0000000001000000-0x00000000ffffffff]
[ 0.004291] Normal [mem 0x0000000100000000-0x0000001c7e0bffff]
[ 0.004291] Device empty
[ 0.004292] Movable zone start for each node
[ 0.004293] Early memory node ranges
[ 0.004293] node 0: [mem 0x0000000000001000-0x000000000009ffff]
[ 0.004294] node 0: [mem 0x0000000000100000-0x0000000009b7efff]
[ 0.004294] node 0: [mem 0x000000000a000000-0x000000000a1fffff]
[ 0.004294] node 0: [mem 0x000000000a288000-0x000000006a27efff]
[ 0.004295] node 0: [mem 0x00000000785ff000-0x0000000079ff6fff]
[ 0.004295] node 0: [mem 0x0000000079ffc000-0x0000000079ffffff]
[ 0.004295] node 0: [mem 0x0000000100000000-0x0000001c7e0bffff]
[ 0.004300] Initmem setup node 0 [mem 0x0000000000001000-0x0000001c7e0bffff]
[ 0.004305] On node 0, zone DMA: 1 pages in unavailable ranges
[ 0.004313] On node 0, zone DMA: 96 pages in unavailable ranges
[ 0.004372] On node 0, zone DMA32: 1153 pages in unavailable ranges
[ 0.004986] On node 0, zone DMA32: 136 pages in unavailable ranges
[ 0.005040] On node 0, zone DMA32: 25472 pages in unavailable ranges
[ 0.005041] On node 0, zone DMA32: 5 pages in unavailable ranges
[ 0.059310] On node 0, zone Normal: 24576 pages in unavailable ranges
[ 0.059329] On node 0, zone Normal: 8000 pages in unavailable ranges
[ 0.059596] ACPI: PM-Timer IO Port: 0x808
[ 0.059606] ACPI: LAPIC_NMI (acpi_id[0xff] high edge lint[0x1])
[ 0.059619] IOAPIC[0]: apic_id 33, version 33, address 0xfec00000, GSI 0-23
[ 0.059624] IOAPIC[1]: apic_id 34, version 33, address 0xfec01000, GSI 24-55
[ 0.059625] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
[ 0.059627] ACPI: INT_SRC_OVR (bus 0 bus_irq 1 global_irq 1 low edge)
[ 0.059628] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level)
[ 0.059630] ACPI: Using ACPI (MADT) for SMP configuration information
[ 0.059631] ACPI: HPET id: 0x10228201 base: 0xfed00000
[ 0.059641] e820: update [mem 0x653a4000-0x6543ffff] usable ==> reserved
[ 0.059652] CPU topo: Max. logical packages: 1
[ 0.059653] CPU topo: Max. logical dies: 2
[ 0.059653] CPU topo: Max. dies per package: 2
[ 0.059655] CPU topo: Max. threads per core: 2
[ 0.059656] CPU topo: Num. cores per package: 16
[ 0.059657] CPU topo: Num. threads per package: 32
[ 0.059657] CPU topo: Allowing 32 present CPUs plus 0 hotplug CPUs
[ 0.059671] PM: hibernation: Registered nosave memory: [mem 0x00000000-0x00000fff]
[ 0.059672] PM: hibernation: Registered nosave memory: [mem 0x000a0000-0x000fffff]
[ 0.059672] PM: hibernation: Registered nosave memory: [mem 0x09b7f000-0x09ffffff]
[ 0.059673] PM: hibernation: Registered nosave memory: [mem 0x0a200000-0x0a287fff]
[ 0.059674] PM: hibernation: Registered nosave memory: [mem 0x653a4000-0x6543ffff]
[ 0.059674] PM: hibernation: Registered nosave memory: [mem 0x67fd6000-0x67fd6fff]
[ 0.059675] PM: hibernation: Registered nosave memory: [mem 0x6a27f000-0x785fefff]
[ 0.059675] PM: hibernation: Registered nosave memory: [mem 0x79ff7000-0x79ffbfff]
[ 0.059676] PM: hibernation: Registered nosave memory: [mem 0x7a000000-0xffffffff]
[ 0.059677] [mem 0x80000000-0xfedfffff] available for PCI devices
[ 0.059678] Booting paravirtualized kernel on bare hardware
[ 0.059681] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1910969940391419 ns
[ 0.063257] setup_percpu: NR_CPUS:8192 nr_cpumask_bits:32 nr_cpu_ids:32 nr_node_ids:1
[ 0.063562] percpu: Embedded 62 pages/cpu s217088 r8192 d28672 u262144
[ 0.063565] pcpu-alloc: s217088 r8192 d28672 u262144 alloc=1*2097152
[ 0.063567] pcpu-alloc: [0] 00 01 02 03 04 05 06 07 [0] 08 09 10 11 12 13 14 15
[ 0.063569] pcpu-alloc: [0] 16 17 18 19 20 21 22 23 [0] 24 25 26 27 28 29 30 31
[ 0.063581] Kernel command line: quiet splash cryptdevice=PARTUUID=7c08e7e5-16ef-4bfe-a8ad-8a7e78ab54b3:root root=/dev/mapper/root zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs
[ 0.063627] Unknown kernel command line parameters "splash cryptdevice=PARTUUID=7c08e7e5-16ef-4bfe-a8ad-8a7e78ab54b3:root", will be passed to user space.
[ 0.063642] printk: log_buf_len individual max cpu contribution: 4096 bytes
[ 0.063643] printk: log_buf_len total cpu_extra contributions: 126976 bytes
[ 0.063643] printk: log_buf_len min size: 131072 bytes
[ 0.063709] printk: log buffer data + meta data: 262144 + 917504 = 1179648 bytes
[ 0.063710] printk: early log buf free: 113760(86%)
[ 0.065541] Dentry cache hash table entries: 8388608 (order: 14, 67108864 bytes, linear)
[ 0.066515] Inode-cache hash table entries: 4194304 (order: 13, 33554432 bytes, linear)
[ 0.066701] software IO TLB: area num 32.
[ 0.070601] Fallback order for Node 0: 0
[ 0.070609] Built 1 zonelists, mobility grouping on. Total pages: 29267921
[ 0.070610] Policy zone: Normal
[ 0.070694] mem auto-init: stack:all(zero), heap alloc:on, heap free:off
[ 0.157973] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=32, Nodes=1
[ 0.168589] ftrace: allocating 56511 entries in 224 pages
[ 0.168590] ftrace: allocated 224 pages with 3 groups
[ 0.168651] Dynamic Preempt: full
[ 0.168724] rcu: Preemptible hierarchical RCU implementation.
[ 0.168725] rcu: RCU restricting CPUs from NR_CPUS=8192 to nr_cpu_ids=32.
[ 0.168726] rcu: RCU priority boosting: priority 1 delay 500 ms.
[ 0.168727] Trampoline variant of Tasks RCU enabled.
[ 0.168727] Rude variant of Tasks RCU enabled.
[ 0.168727] Tracing variant of Tasks RCU enabled.
[ 0.168728] rcu: RCU calculated value of scheduler-enlistment delay is 100 jiffies.
[ 0.168729] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=32
[ 0.168738] RCU Tasks: Setting shift to 5 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=32.
[ 0.168741] RCU Tasks Rude: Setting shift to 5 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=32.
[ 0.168743] RCU Tasks Trace: Setting shift to 5 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=32.
[ 0.171216] NR_IRQS: 524544, nr_irqs: 1224, preallocated irqs: 16
[ 0.171432] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[ 0.171544] kfence: initialized - using 2097152 bytes for 255 objects at 0x(____ptrval____)-0x(____ptrval____)
[ 0.171580] Console: colour dummy device 80x25
[ 0.171582] printk: legacy console [tty0] enabled
[ 0.171613] ACPI: Core revision 20250404
[ 0.171824] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484873504 ns
[ 0.171842] APIC: Switch to symmetric I/O mode setup
[ 0.172025] AMD-Vi: ivrs, add hid:AMDI0020, uid:ID00, rdevid:0xa0
[ 0.172026] AMD-Vi: ivrs, add hid:AMDI0020, uid:ID01, rdevid:0xa0
[ 0.172026] AMD-Vi: ivrs, add hid:AMDI0020, uid:ID02, rdevid:0xa0
[ 0.172027] AMD-Vi: ivrs, add hid:AMDI0020, uid:ID03, rdevid:0xa0
[ 0.172027] AMD-Vi: ivrs, add hid:MSFT0201, uid:1, rdevid:0x60
[ 0.172028] AMD-Vi: ivrs, add hid:AMDI0020, uid:ID04, rdevid:0xa0
[ 0.172028] AMD-Vi: Using global IVHD EFR:0x246577efa2254afa, EFR2:0x10
[ 0.173251] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1
[ 0.177847] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x2b28f100b1d, max_idle_ns: 440795219645 ns
[ 0.177850] Calibrating delay loop (skipped), value calculated using timer frequency.. 5988.44 BogoMIPS (lpj=2994220)
[ 0.177867] x86/cpu: User Mode Instruction Prevention (UMIP) activated
[ 0.177927] LVT offset 1 assigned for vector 0xf9
[ 0.178111] LVT offset 2 assigned for vector 0xf4
[ 0.178167] Last level iTLB entries: 4KB 64, 2MB 64, 4MB 32
[ 0.178167] Last level dTLB entries: 4KB 128, 2MB 128, 4MB 64, 1GB 0
[ 0.178169] process: using mwait in idle threads
[ 0.178170] mitigations: Enabled attack vectors: user_kernel, user_user, guest_host, guest_guest, SMT mitigations: auto
[ 0.178173] Speculative Store Bypass: Mitigation: Speculative Store Bypass disabled via prctl
[ 0.178175] Spectre V2 : Mitigation: Enhanced / Automatic IBRS
[ 0.178176] Spectre V2 : User space: Mitigation: STIBP always-on protection
[ 0.178176] Speculative Return Stack Overflow: Mitigation: IBPB on VMEXIT only
[ 0.178177] VMSCAPE: Mitigation: IBPB on VMEXIT
[ 0.178177] Spectre V1 : Mitigation: usercopy/swapgs barriers and __user pointer sanitization
[ 0.178178] Spectre V2 : mitigation: Enabling conditional Indirect Branch Prediction Barrier
[ 0.178186] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[ 0.178186] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[ 0.178187] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
[ 0.178187] x86/fpu: Supporting XSAVE feature 0x020: 'AVX-512 opmask'
[ 0.178188] x86/fpu: Supporting XSAVE feature 0x040: 'AVX-512 Hi256'
[ 0.178188] x86/fpu: Supporting XSAVE feature 0x080: 'AVX-512 ZMM_Hi256'
[ 0.178189] x86/fpu: Supporting XSAVE feature 0x200: 'Protection Keys User registers'
[ 0.178189] x86/fpu: Supporting XSAVE feature 0x800: 'Control-flow User registers'
[ 0.178190] x86/fpu: Supporting XSAVE feature 0x1000: 'Control-flow Kernel registers (KVM only)'
[ 0.178191] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
[ 0.178192] x86/fpu: xstate_offset[5]: 832, xstate_sizes[5]: 64
[ 0.178192] x86/fpu: xstate_offset[6]: 896, xstate_sizes[6]: 512
[ 0.178193] x86/fpu: xstate_offset[7]: 1408, xstate_sizes[7]: 1024
[ 0.178193] x86/fpu: xstate_offset[9]: 2432, xstate_sizes[9]: 8
[ 0.178194] x86/fpu: xstate_offset[11]: 2440, xstate_sizes[11]: 16
[ 0.178194] x86/fpu: xstate_offset[12]: 2456, xstate_sizes[12]: 24
[ 0.178195] x86/fpu: Enabled xstate features 0x1ae7, context size is 2480 bytes, using 'compacted' format.
[ 0.200021] Freeing SMP alternatives memory: 56K
[ 0.200023] pid_max: default: 32768 minimum: 301
[ 0.200048] LSM: initializing lsm=capability,landlock,lockdown,yama,bpf
[ 0.200108] landlock: Up and running.
[ 0.200110] Yama: becoming mindful.
[ 0.200261] LSM support for eBPF active
[ 0.200314] Mount-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[ 0.200355] Mountpoint-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[ 0.303813] smpboot: CPU0: AMD RYZEN AI MAX+ 395 w/ Radeon 8060S (family: 0x1a, model: 0x70, stepping: 0x0)
[ 0.303848] Performance Events: Fam17h+ 16-deep LBR, core perfctr, AMD PMU driver.
[ 0.303848] ... version: 2
[ 0.303848] ... bit width: 48
[ 0.303848] ... generic registers: 6
[ 0.303848] ... value mask: 0000ffffffffffff
[ 0.303848] ... max period: 00007fffffffffff
[ 0.303848] ... fixed-purpose events: 0
[ 0.303848] ... event mask: 000000000000003f
[ 0.303848] signal: max sigframe size: 3376
[ 0.303848] rcu: Hierarchical SRCU implementation.
[ 0.303848] rcu: Max phase no-delay instances is 400.
[ 0.303848] Timer migration: 2 hierarchy levels; 8 children per group; 2 crossnode level
[ 0.303848] MCE: In-kernel MCE decoding enabled.
[ 0.303848] NMI watchdog: Enabled. Permanently consumes one hw-PMU counter.
[ 0.303848] smp: Bringing up secondary CPUs ...
[ 0.303848] smpboot: x86: Booting SMP configuration:
[ 0.303848] .... node #0, CPUs: #1 #2 #3 #4 #5 #6 #7 #8 #9 #10 #11 #12 #13 #14 #15 #16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
[ 0.310011] Spectre V2 : Update user space SMT mitigation: STIBP always-on
[ 0.311920] smp: Brought up 1 node, 32 CPUs
[ 0.311920] smpboot: Total of 32 processors activated (191630.08 BogoMIPS)
[ 0.313024] Memory: 114913704K/117071684K available (20069K kernel code, 2945K rwdata, 16836K rodata, 4692K init, 4872K bss, 2118952K reserved, 0K cma-reserved)
[ 0.314574] devtmpfs: initialized
[ 0.314574] x86/mm: Memory block size: 2048MB
[ 0.315095] ACPI: PM: Registering ACPI NVS region [mem 0x0a200000-0x0a287fff] (557056 bytes)
[ 0.315095] ACPI: PM: Registering ACPI NVS region [mem 0x7037f000-0x7137efff] (16777216 bytes)
[ 0.315095] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1911260446275000 ns
[ 0.315095] posixtimers hash table entries: 16384 (order: 6, 262144 bytes, linear)
[ 0.315095] futex hash table entries: 8192 (524288 bytes on 1 NUMA nodes, total 512 KiB, linear).
[ 0.315095] pinctrl core: initialized pinctrl subsystem
[ 0.315095] PM: RTC time: 07:50:32, date: 2025-10-08
[ 0.315284] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[ 0.315887] DMA: preallocated 4096 KiB GFP_KERNEL pool for atomic allocations
[ 0.316024] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
[ 0.316159] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[ 0.316163] audit: initializing netlink subsys (disabled)
[ 0.316166] audit: type=2000 audit(1759909832.143:1): state=initialized audit_enabled=0 res=1
[ 0.316166] thermal_sys: Registered thermal governor 'fair_share'
[ 0.316166] thermal_sys: Registered thermal governor 'bang_bang'
[ 0.316166] thermal_sys: Registered thermal governor 'step_wise'
[ 0.316166] thermal_sys: Registered thermal governor 'user_space'
[ 0.316166] thermal_sys: Registered thermal governor 'power_allocator'
[ 0.316166] cpuidle: using governor ladder
[ 0.316166] cpuidle: using governor menu
[ 0.316166] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
[ 0.316166] PCI: ECAM [mem 0xe0000000-0xefffffff] (base 0xe0000000) for domain 0000 [bus 00-ff]
[ 0.316166] PCI: Using configuration type 1 for base access
[ 0.316872] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[ 0.316890] HugeTLB: allocation took 0ms with hugepage_allocation_threads=8
[ 0.316890] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
[ 0.316890] HugeTLB: 16380 KiB vmemmap can be freed for a 1.00 GiB page
[ 0.316890] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
[ 0.316890] HugeTLB: 28 KiB vmemmap can be freed for a 2.00 MiB page
[ 0.317399] raid6: skipped pq benchmark and selected avx512x4
[ 0.317400] raid6: using avx512x2 recovery algorithm
[ 0.317443] ACPI: Added _OSI(Module Device)
[ 0.317444] ACPI: Added _OSI(Processor Device)
[ 0.317444] ACPI: Added _OSI(Processor Aggregator Device)
[ 0.327088] ACPI BIOS Error (bug): Failure creating named object [\_SB.CIND], AE_ALREADY_EXISTS (20250404/dswload2-326)
[ 0.327093] ACPI Error: AE_ALREADY_EXISTS, During name lookup/catalog (20250404/psobject-220)
[ 0.327095] ACPI: Skipping parse of AML opcode: Device (0x5B82)
[ 0.327395] ACPI BIOS Error (bug): Failure creating named object [\_SB.PCI0.GPP4._S0W], AE_ALREADY_EXISTS (20250404/dswload2-326)
[ 0.327396] ACPI Error: AE_ALREADY_EXISTS, During name lookup/catalog (20250404/psobject-220)
[ 0.327397] ACPI: Skipping parse of AML opcode: Method (0x0014)
[ 0.327402] ACPI BIOS Error (bug): Failure creating named object [\_SB.PCI0.GPP4._PR0], AE_ALREADY_EXISTS (20250404/dswload2-326)
[ 0.327403] ACPI Error: AE_ALREADY_EXISTS, During name lookup/catalog (20250404/psobject-220)
[ 0.327405] ACPI BIOS Error (bug): Failure creating named object [\_SB.PCI0.GPP4._PR3], AE_ALREADY_EXISTS (20250404/dswload2-326)
[ 0.327406] ACPI Error: AE_ALREADY_EXISTS, During name lookup/catalog (20250404/psobject-220)
[ 0.328478] ACPI: 36 ACPI AML tables successfully acquired and loaded
[ 0.329112] ACPI: EC: EC started
[ 0.329112] ACPI: EC: interrupt blocked
[ 0.329283] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
[ 0.329284] ACPI: EC: Boot ECDT EC used to handle transactions
[ 0.329343] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored
[ 0.340921] ACPI: USB4 _OSC: OS supports USB3+ DisplayPort+ PCIe+ XDomain+
[ 0.340922] ACPI: USB4 _OSC: OS controls USB3+ DisplayPort+ PCIe+ XDomain+
[ 0.341358] ACPI: Interpreter enabled
[ 0.341367] ACPI: PM: (supports S0 S4 S5)
[ 0.341368] ACPI: Using IOAPIC for interrupt routing
[ 0.341836] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
[ 0.341837] PCI: Ignoring E820 reservations for host bridge windows
[ 0.342083] ACPI: Enabled 3 GPEs in block 00 to 1F
[ 0.343271] ACPI: \_SB_.PCI0.GPP0.PWRS: New power resource
[ 0.343748] ACPI: \_SB_.PCI0.GPP0.SWUS.PWRS: New power resource
[ 0.344243] ACPI: \_SB_.PCI0.GPP1.PWRS: New power resource
[ 0.344710] ACPI: \_SB_.PCI0.GPP1.SWUS.PWRS: New power resource
[ 0.344822] ACPI: \_SB_.PCI0.GPP3.PWRS: New power resource
[ 0.345054] ACPI: \_SB_.PCI0.GPP4.RPR2: New power resource
[ 0.345213] ACPI: \_SB_.PCI0.GPP4.PWRS: New power resource
[ 0.345294] ACPI: \_SB_.PCI0.GPP5.PWRS: New power resource
[ 0.345585] ACPI: \_SB_.PCI0.GPP6.P0WW: New power resource
[ 0.345806] ACPI: \_SB_.PCI0.GPP7.P0NV: New power resource
[ 0.346119] ACPI: \_SB_.PCI0.GPP9.P0NV: New power resource
[ 0.346428] ACPI: \_SB_.PCI0.GPPA.PWRS: New power resource
[ 0.346526] ACPI: \_SB_.PCI0.GPPA.VGA_.PWRS: New power resource
[ 0.346665] ACPI: \_SB_.PCI0.GPPA.ACP_.PWRS: New power resource
[ 0.346864] ACPI: \_SB_.PCI0.GPPA.AZAL.PWRS: New power resource
[ 0.347009] ACPI: \_SB_.PCI0.GPPA.HDAU.PWRS: New power resource
[ 0.347172] ACPI: \_SB_.PCI0.GPPA.XHC1.PWRS: New power resource
[ 0.347538] ACPI: \_SB_.PCI0.GPPC.XHC0.PWRS: New power resource
[ 0.347768] ACPI: \_SB_.PCI0.GPPC.XHC0.RHUB.PRT3.BTPR: New power resource
[ 0.348021] ACPI: \_SB_.PCI0.GPPC.XHC3.PWRS: New power resource
[ 0.348356] ACPI: \_SB_.PCI0.GPPC.XHC4.PWRS: New power resource
[ 0.348691] ACPI: \_SB_.PCI0.GPPC.NHI0.PWRS: New power resource
[ 0.349001] ACPI: \_SB_.PCI0.GPPC.NHI1.PWRS: New power resource
[ 0.351845] ACPI: \_SB_.PRWL: New power resource
[ 0.352270] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[ 0.352274] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
[ 0.352314] acpi PNP0A08:00: _OSC: platform does not support [SHPCHotplug AER LTR DPC]
[ 0.352384] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug PME PCIeCapability]
[ 0.352641] PCI host bridge to bus 0000:00
[ 0.352643] pci_bus 0000:00: root bus resource [io 0x0000-0x03af window]
[ 0.352644] pci_bus 0000:00: root bus resource [io 0x03e0-0x0cf7 window]
[ 0.352645] pci_bus 0000:00: root bus resource [io 0x03b0-0x03df window]
[ 0.352645] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
[ 0.352646] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000dffff window]
[ 0.352647] pci_bus 0000:00: root bus resource [mem 0x80000000-0xdfffffff window]
[ 0.352647] pci_bus 0000:00: root bus resource [mem 0xf0000000-0xfcffffff window]
[ 0.352647] pci_bus 0000:00: root bus resource [mem 0x2090000000-0x97ffffffff window]
[ 0.352648] pci_bus 0000:00: root bus resource [bus 00-ff]
[ 0.352661] pci 0000:00:00.0: [1022:1507] type 00 class 0x060000 conventional PCI endpoint
[ 0.352738] pci 0000:00:00.2: [1022:1508] type 00 class 0x080600 conventional PCI endpoint
[ 0.352812] pci 0000:00:01.0: [1022:1509] type 00 class 0x060000 conventional PCI endpoint
[ 0.352887] pci 0000:00:01.1: [1022:150a] type 01 class 0x060400 PCIe Root Port
[ 0.353107] pci 0000:00:01.1: PCI bridge to [bus 01-60]
[ 0.353113] pci 0000:00:01.1: bridge window [io 0xb000-0xefff]
[ 0.353116] pci 0000:00:01.1: bridge window [mem 0xbc000000-0xd3ffffff]
[ 0.353157] pci 0000:00:01.1: bridge window [mem 0x7000000000-0x8fffffffff 64bit pref]
[ 0.353168] pci 0000:00:01.1: enabling Extended Tags
[ 0.353338] pci 0000:00:01.1: PME# supported from D0 D3hot D3cold
[ 0.353914] pci 0000:00:01.2: [1022:150a] type 01 class 0x060400 PCIe Root Port
[ 0.354134] pci 0000:00:01.2: PCI bridge to [bus 61-c0]
[ 0.354139] pci 0000:00:01.2: bridge window [io 0x7000-0xafff]
[ 0.354141] pci 0000:00:01.2: bridge window [mem 0xa4000000-0xbbffffff]
[ 0.354184] pci 0000:00:01.2: bridge window [mem 0x5000000000-0x6fffffffff 64bit pref]
[ 0.354194] pci 0000:00:01.2: enabling Extended Tags
[ 0.354356] pci 0000:00:01.2: PME# supported from D0 D3hot D3cold
[ 0.354910] pci 0000:00:02.0: [1022:1509] type 00 class 0x060000 conventional PCI endpoint
[ 0.354964] pci 0000:00:02.2: [1022:150b] type 01 class 0x060400 PCIe Root Port
[ 0.354980] pci 0000:00:02.2: PCI bridge to [bus c1]
[ 0.354985] pci 0000:00:02.2: bridge window [mem 0xd4b00000-0xd4bfffff]
[ 0.355047] pci 0000:00:02.2: PME# supported from D0 D3hot D3cold
[ 0.355134] pci 0000:00:02.3: [1022:150b] type 01 class 0x060400 PCIe Root Port
[ 0.355150] pci 0000:00:02.3: PCI bridge to [bus c2]
[ 0.355154] pci 0000:00:02.3: bridge window [mem 0xd4000000-0xd42fffff]
[ 0.355216] pci 0000:00:02.3: PME# supported from D0 D3hot D3cold
[ 0.355312] pci 0000:00:02.5: [1022:150b] type 01 class 0x060400 PCIe Root Port
[ 0.355327] pci 0000:00:02.5: PCI bridge to [bus c3]
[ 0.355332] pci 0000:00:02.5: bridge window [mem 0xd4a00000-0xd4afffff]
[ 0.355393] pci 0000:00:02.5: PME# supported from D0 D3hot D3cold
[ 0.355486] pci 0000:00:03.0: [1022:1509] type 00 class 0x060000 conventional PCI endpoint
[ 0.355542] pci 0000:00:08.0: [1022:1509] type 00 class 0x060000 conventional PCI endpoint
[ 0.355595] pci 0000:00:08.1: [1022:150c] type 01 class 0x060400 PCIe Root Port
[ 0.355611] pci 0000:00:08.1: PCI bridge to [bus c4]
[ 0.355615] pci 0000:00:08.1: bridge window [io 0xf000-0xffff]
[ 0.355617] pci 0000:00:08.1: bridge window [mem 0x90000000-0xa04fffff]
[ 0.355623] pci 0000:00:08.1: bridge window [mem 0x9000000000-0x94007fffff 64bit pref]
[ 0.355629] pci 0000:00:08.1: enabling Extended Tags
[ 0.355677] pci 0000:00:08.1: PME# supported from D0 D3hot D3cold
[ 0.355821] pci 0000:00:08.2: [1022:150c] type 01 class 0x060400 PCIe Root Port
[ 0.355845] pci 0000:00:08.2: PCI bridge to [bus c5]
[ 0.355850] pci 0000:00:08.2: bridge window [mem 0xd4800000-0xd49fffff]
[ 0.355856] pci 0000:00:08.2: bridge window [mem 0x9400900000-0x94009fffff 64bit pref]
[ 0.355863] pci 0000:00:08.2: enabling Extended Tags
[ 0.355910] pci 0000:00:08.2: PME# supported from D0 D3hot D3cold
[ 0.355987] pci 0000:00:08.3: [1022:150c] type 01 class 0x060400 PCIe Root Port
[ 0.356004] pci 0000:00:08.3: PCI bridge to [bus c6]
[ 0.356009] pci 0000:00:08.3: bridge window [mem 0xd4400000-0xd47fffff]
[ 0.356021] pci 0000:00:08.3: enabling Extended Tags
[ 0.356068] pci 0000:00:08.3: PME# supported from D0 D3hot D3cold
[ 0.356224] pci 0000:00:14.0: [1022:790b] type 00 class 0x0c0500 conventional PCI endpoint
[ 0.356302] pci 0000:00:14.3: [1022:790e] type 00 class 0x060100 conventional PCI endpoint
[ 0.356387] pci 0000:00:18.0: [1022:12b8] type 00 class 0x060000 conventional PCI endpoint
[ 0.356410] pci 0000:00:18.1: [1022:12b9] type 00 class 0x060000 conventional PCI endpoint
[ 0.356434] pci 0000:00:18.2: [1022:12ba] type 00 class 0x060000 conventional PCI endpoint
[ 0.356457] pci 0000:00:18.3: [1022:12bb] type 00 class 0x060000 conventional PCI endpoint
[ 0.356482] pci 0000:00:18.4: [1022:12bc] type 00 class 0x060000 conventional PCI endpoint
[ 0.356506] pci 0000:00:18.5: [1022:12bd] type 00 class 0x060000 conventional PCI endpoint
[ 0.356529] pci 0000:00:18.6: [1022:12be] type 00 class 0x060000 conventional PCI endpoint
[ 0.356552] pci 0000:00:18.7: [1022:12bf] type 00 class 0x060000 conventional PCI endpoint
[ 0.356650] pci 0000:00:01.1: PCI bridge to [bus 01-60]
[ 0.356738] pci 0000:00:01.2: PCI bridge to [bus 61-c0]
[ 0.356855] pci 0000:c1:00.0: [17a0:9755] type 00 class 0x080501 PCIe Endpoint
[ 0.356939] pci 0000:c1:00.0: BAR 0 [mem 0xd4b00000-0xd4b00fff]
[ 0.357067] pci 0000:c1:00.0: supports D1 D2
[ 0.357067] pci 0000:c1:00.0: PME# supported from D1 D2 D3hot D3cold
[ 0.357328] pci 0000:00:02.2: PCI bridge to [bus c1]
[ 0.357382] pci 0000:c2:00.0: [14c3:7925] type 00 class 0x028000 PCIe Endpoint
[ 0.357430] pci 0000:c2:00.0: BAR 0 [mem 0xd4000000-0xd41fffff 64bit]
[ 0.357433] pci 0000:c2:00.0: BAR 2 [mem 0xd4200000-0xd4207fff 64bit]
[ 0.357513] pci 0000:c2:00.0: PME# supported from D0 D3hot D3cold
[ 0.357770] pci 0000:00:02.3: PCI bridge to [bus c2]
[ 0.357817] pci 0000:c3:00.0: [c0a9:5426] type 00 class 0x010802 PCIe Endpoint
[ 0.357860] pci 0000:c3:00.0: BAR 0 [mem 0xd4a00000-0xd4a03fff 64bit]
[ 0.358084] pci 0000:00:02.5: PCI bridge to [bus c3]
[ 0.358144] pci 0000:c4:00.0: [1002:1586] type 00 class 0x038000 PCIe Legacy Endpoint
[ 0.358508] pci 0000:c4:00.0: BAR 0 [mem 0x9000000000-0x93ffffffff 64bit pref]
[ 0.358510] pci 0000:c4:00.0: BAR 2 [mem 0x90000000-0x9fffffff 64bit pref]
[ 0.358511] pci 0000:c4:00.0: BAR 4 [io 0xf000-0xf0ff]
[ 0.358512] pci 0000:c4:00.0: BAR 5 [mem 0xa0300000-0xa03fffff]
[ 0.358517] pci 0000:c4:00.0: enabling Extended Tags
[ 0.358576] pci 0000:c4:00.0: PME# supported from D1 D2 D3hot D3cold
[ 0.358932] pci 0000:c4:00.1: [1002:1640] type 00 class 0x040300 PCIe Legacy Endpoint
[ 0.358954] pci 0000:c4:00.1: BAR 0 [mem 0xa0448000-0xa044bfff]
[ 0.358962] pci 0000:c4:00.1: enabling Extended Tags
[ 0.358996] pci 0000:c4:00.1: PME# supported from D1 D2 D3hot D3cold
[ 0.359101] pci 0000:c4:00.2: [1022:17e0] type 00 class 0x108000 PCIe Endpoint
[ 0.359125] pci 0000:c4:00.2: BAR 2 [mem 0xa0200000-0xa02fffff]
[ 0.359128] pci 0000:c4:00.2: BAR 5 [mem 0xa044e000-0xa044ffff]
[ 0.359132] pci 0000:c4:00.2: enabling Extended Tags
[ 0.359222] pci 0000:c4:00.4: [1022:1587] type 00 class 0x0c0330 PCIe Endpoint
[ 0.359247] pci 0000:c4:00.4: BAR 0 [mem 0xa0100000-0xa01fffff 64bit]
[ 0.359255] pci 0000:c4:00.4: enabling Extended Tags
[ 0.359290] pci 0000:c4:00.4: PME# supported from D0 D3hot D3cold
[ 0.359465] pci 0000:c4:00.5: [1022:15e2] type 00 class 0x048000 PCIe Endpoint
[ 0.359488] pci 0000:c4:00.5: BAR 0 [mem 0xa0400000-0xa043ffff]
[ 0.359491] pci 0000:c4:00.5: BAR 2 [mem 0x9400000000-0x94007fffff 64bit pref]
[ 0.359497] pci 0000:c4:00.5: enabling Extended Tags
[ 0.359530] pci 0000:c4:00.5: PME# supported from D0 D3hot D3cold
[ 0.359635] pci 0000:c4:00.6: [1022:15e3] type 00 class 0x040300 PCIe Endpoint
[ 0.359660] pci 0000:c4:00.6: BAR 0 [mem 0xa0440000-0xa0447fff]
[ 0.359667] pci 0000:c4:00.6: enabling Extended Tags
[ 0.359701] pci 0000:c4:00.6: PME# supported from D0 D3hot D3cold
[ 0.359805] pci 0000:c4:00.7: [1022:164a] type 00 class 0x118000 PCIe Endpoint
[ 0.359829] pci 0000:c4:00.7: BAR 2 [mem 0xa0000000-0xa00fffff]
[ 0.359831] pci 0000:c4:00.7: BAR 5 [mem 0xa044c000-0xa044dfff]
[ 0.359836] pci 0000:c4:00.7: enabling Extended Tags
[ 0.359942] pci 0000:00:08.1: PCI bridge to [bus c4]
[ 0.359985] pci 0000:c5:00.0: [1022:150d] type 00 class 0x130000 PCIe Endpoint
[ 0.360014] pci 0000:c5:00.0: enabling Extended Tags
[ 0.360128] pci 0000:c5:00.1: [1022:17f0] type 00 class 0x118000 PCIe Endpoint
[ 0.360155] pci 0000:c5:00.1: BAR 0 [mem 0xd4800000-0xd48fffff]
[ 0.360156] pci 0000:c5:00.1: BAR 1 [mem 0xd4900000-0xd4901fff]
[ 0.360158] pci 0000:c5:00.1: BAR 2 [mem 0x9400900000-0x940097ffff 64bit pref]
[ 0.360159] pci 0000:c5:00.1: BAR 4 [mem 0xd4903000-0xd4903fff]
[ 0.360160] pci 0000:c5:00.1: BAR 5 [mem 0xd4902000-0xd4902fff]
[ 0.360165] pci 0000:c5:00.1: enabling Extended Tags
[ 0.360269] pci 0000:00:08.2: PCI bridge to [bus c5]
[ 0.360319] pci 0000:c6:00.0: [1022:1588] type 00 class 0x0c0330 PCIe Endpoint
[ 0.360344] pci 0000:c6:00.0: BAR 0 [mem 0xd4600000-0xd46fffff 64bit]
[ 0.360352] pci 0000:c6:00.0: enabling Extended Tags
[ 0.360397] pci 0000:c6:00.0: PME# supported from D0 D3hot D3cold
[ 0.360592] pci 0000:c6:00.3: [1022:1589] type 00 class 0x0c0330 PCIe Endpoint
[ 0.360617] pci 0000:c6:00.3: BAR 0 [mem 0xd4500000-0xd45fffff 64bit]
[ 0.360624] pci 0000:c6:00.3: enabling Extended Tags
[ 0.360660] pci 0000:c6:00.3: PME# supported from D0 D3hot D3cold
[ 0.360831] pci 0000:c6:00.4: [1022:158b] type 00 class 0x0c0330 PCIe Endpoint
[ 0.360857] pci 0000:c6:00.4: BAR 0 [mem 0xd4400000-0xd44fffff 64bit]
[ 0.360864] pci 0000:c6:00.4: enabling Extended Tags
[ 0.360900] pci 0000:c6:00.4: PME# supported from D0 D3hot D3cold
[ 0.361071] pci 0000:c6:00.5: [1022:158d] type 00 class 0x0c0340 PCIe Endpoint
[ 0.361100] pci 0000:c6:00.5: BAR 0 [mem 0xd4780000-0xd47fffff 64bit]
[ 0.361108] pci 0000:c6:00.5: enabling Extended Tags
[ 0.361143] pci 0000:c6:00.5: PME# supported from D0 D3hot D3cold
[ 0.361314] pci 0000:c6:00.6: [1022:158e] type 00 class 0x0c0340 PCIe Endpoint
[ 0.361344] pci 0000:c6:00.6: BAR 0 [mem 0xd4700000-0xd477ffff 64bit]
[ 0.361351] pci 0000:c6:00.6: enabling Extended Tags
[ 0.361387] pci 0000:c6:00.6: PME# supported from D0 D3hot D3cold
[ 0.361568] pci 0000:00:08.3: PCI bridge to [bus c6]
[ 0.365680] ACPI: PCI: Interrupt link LNKA configured for IRQ 0
[ 0.365706] ACPI: PCI: Interrupt link LNKB configured for IRQ 0
[ 0.365724] ACPI: PCI: Interrupt link LNKC configured for IRQ 0
[ 0.365747] ACPI: PCI: Interrupt link LNKD configured for IRQ 0
[ 0.365768] ACPI: PCI: Interrupt link LNKE configured for IRQ 0
[ 0.365785] ACPI: PCI: Interrupt link LNKF configured for IRQ 0
[ 0.365801] ACPI: PCI: Interrupt link LNKG configured for IRQ 0
[ 0.365818] ACPI: PCI: Interrupt link LNKH configured for IRQ 0
[ 0.369310] Low-power S0 idle used by default for system suspend
[ 0.369592] ACPI: EC: interrupt unblocked
[ 0.369593] ACPI: EC: event unblocked
[ 0.369601] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
[ 0.369601] ACPI: EC: GPE=0xa
[ 0.369602] ACPI: \_SB_.PCI0.SBRG.EC0_: Boot ECDT EC initialization complete
[ 0.369603] ACPI: \_SB_.PCI0.SBRG.EC0_: EC: Used to handle transactions and events
[ 0.369650] iommu: Default domain type: Translated
[ 0.369650] iommu: DMA domain TLB invalidation policy: lazy mode
[ 0.369908] SCSI subsystem initialized
[ 0.369912] libata version 3.00 loaded.
[ 0.369912] ACPI: bus type USB registered
[ 0.369912] usbcore: registered new interface driver usbfs
[ 0.369912] usbcore: registered new interface driver hub
[ 0.369912] usbcore: registered new device driver usb
[ 0.382621] EDAC MC: Ver: 3.0.0
[ 0.382869] efivars: Registered efivars operations
[ 0.382965] NetLabel: Initializing
[ 0.382966] NetLabel: domain hash size = 128
[ 0.382966] NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO
[ 0.382974] NetLabel: unlabeled traffic allowed by default
[ 0.382975] mctp: management component transport protocol core
[ 0.382976] NET: Registered PF_MCTP protocol family
[ 0.382984] PCI: Using ACPI for IRQ routing
[ 0.391157] PCI: pci_cache_line_size set to 64 bytes
[ 0.391295] e820: reserve RAM buffer [mem 0x09b7f000-0x0bffffff]
[ 0.391296] e820: reserve RAM buffer [mem 0x0a200000-0x0bffffff]
[ 0.391297] e820: reserve RAM buffer [mem 0x653a4000-0x67ffffff]
[ 0.391297] e820: reserve RAM buffer [mem 0x67fd6000-0x67ffffff]
[ 0.391298] e820: reserve RAM buffer [mem 0x6a27f000-0x6bffffff]
[ 0.391298] e820: reserve RAM buffer [mem 0x79ff7000-0x7bffffff]
[ 0.391299] e820: reserve RAM buffer [mem 0x7a000000-0x7bffffff]
[ 0.391299] e820: reserve RAM buffer [mem 0x1c7e0c0000-0x1c7fffffff]
[ 0.391316] vgaarb: loaded
[ 0.391316] hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0
[ 0.391316] hpet0: 3 comparators, 32-bit 14.318180 MHz counter
[ 0.393907] clocksource: Switched to clocksource tsc-early
[ 0.393980] VFS: Disk quotas dquot_6.6.0
[ 0.393985] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[ 0.393995] pnp: PnP ACPI init
[ 0.394145] system 00:02: [io 0x04d0-0x04d1] has been reserved
[ 0.394147] system 00:02: [io 0x040b] has been reserved
[ 0.394147] system 00:02: [io 0x04d6] has been reserved
[ 0.394148] system 00:02: [io 0x0c00-0x0c01] has been reserved
[ 0.394148] system 00:02: [io 0x0c14] has been reserved
[ 0.394149] system 00:02: [io 0x0c50-0x0c51] has been reserved
[ 0.394149] system 00:02: [io 0x0c52] has been reserved
[ 0.394149] system 00:02: [io 0x0c6c] has been reserved
[ 0.394150] system 00:02: [io 0x0c6f] has been reserved
[ 0.394150] system 00:02: [io 0x0cd0-0x0cd1] has been reserved
[ 0.394151] system 00:02: [io 0x0cd2-0x0cd3] has been reserved
[ 0.394151] system 00:02: [io 0x0cd4-0x0cd5] has been reserved
[ 0.394151] system 00:02: [io 0x0cd6-0x0cd7] has been reserved
[ 0.394152] system 00:02: [io 0x0cd8-0x0cdf] has been reserved
[ 0.394152] system 00:02: [io 0x0800-0x089f] has been reserved
[ 0.394153] system 00:02: [io 0x0b00-0x0b0f] has been reserved
[ 0.394153] system 00:02: [io 0x0b20-0x0b3f] has been reserved
[ 0.394153] system 00:02: [io 0x0900-0x090f] has been reserved
[ 0.394154] system 00:02: [io 0x0910-0x091f] has been reserved
[ 0.394155] system 00:02: [mem 0xfec00000-0xfec00fff] could not be reserved
[ 0.394155] system 00:02: [mem 0xfec01000-0xfec01fff] could not be reserved
[ 0.394156] system 00:02: [mem 0xfedc0000-0xfedc0fff] has been reserved
[ 0.394157] system 00:02: [mem 0xfee00000-0xfee00fff] has been reserved
[ 0.394158] system 00:02: [mem 0xfed80000-0xfed8ffff] could not be reserved
[ 0.394158] system 00:02: [mem 0xfec10000-0xfec10fff] has been reserved
[ 0.394159] system 00:02: [mem 0xff000000-0xffffffff] has been reserved
[ 0.395727] system 00:03: [mem 0xe0000000-0xefffffff] has been reserved
[ 0.396088] pnp: PnP ACPI: found 4 devices
[ 0.401571] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[ 0.401601] NET: Registered PF_INET protocol family
[ 0.401673] IP idents hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[ 0.408874] tcp_listen_portaddr_hash hash table entries: 65536 (order: 8, 1048576 bytes, linear)
[ 0.408918] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[ 0.409083] TCP established hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[ 0.409300] TCP bind hash table entries: 65536 (order: 9, 2097152 bytes, linear)
[ 0.409337] TCP: Hash tables configured (established 524288 bind 65536)
[ 0.409453] MPTCP token hash table entries: 65536 (order: 8, 1572864 bytes, linear)
[ 0.409652] UDP hash table entries: 65536 (order: 10, 4194304 bytes, linear)
[ 0.409956] UDP-Lite hash table entries: 65536 (order: 10, 4194304 bytes, linear)
[ 0.410119] NET: Registered PF_UNIX/PF_LOCAL protocol family
[ 0.410124] NET: Registered PF_XDP protocol family
[ 0.410134] pci 0000:00:01.1: PCI bridge to [bus 01-60]
[ 0.410142] pci 0000:00:01.1: bridge window [io 0xb000-0xefff]
[ 0.410151] pci 0000:00:01.1: bridge window [mem 0xbc000000-0xd3ffffff]
[ 0.410177] pci 0000:00:01.1: bridge window [mem 0x7000000000-0x8fffffffff 64bit pref]
[ 0.410205] pci 0000:00:01.2: PCI bridge to [bus 61-c0]
[ 0.410206] pci 0000:00:01.2: bridge window [io 0x7000-0xafff]
[ 0.410231] pci 0000:00:01.2: bridge window [mem 0xa4000000-0xbbffffff]
[ 0.410233] pci 0000:00:01.2: bridge window [mem 0x5000000000-0x6fffffffff 64bit pref]
[ 0.410238] pci 0000:00:02.2: PCI bridge to [bus c1]
[ 0.410240] pci 0000:00:02.2: bridge window [mem 0xd4b00000-0xd4bfffff]
[ 0.410245] pci 0000:00:02.3: PCI bridge to [bus c2]
[ 0.410248] pci 0000:00:02.3: bridge window [mem 0xd4000000-0xd42fffff]
[ 0.410252] pci 0000:00:02.5: PCI bridge to [bus c3]
[ 0.410254] pci 0000:00:02.5: bridge window [mem 0xd4a00000-0xd4afffff]
[ 0.410260] pci 0000:00:08.1: PCI bridge to [bus c4]
[ 0.410261] pci 0000:00:08.1: bridge window [io 0xf000-0xffff]
[ 0.410263] pci 0000:00:08.1: bridge window [mem 0x90000000-0xa04fffff]
[ 0.410265] pci 0000:00:08.1: bridge window [mem 0x9000000000-0x94007fffff 64bit pref]
[ 0.410268] pci 0000:00:08.2: PCI bridge to [bus c5]
[ 0.410271] pci 0000:00:08.2: bridge window [mem 0xd4800000-0xd49fffff]
[ 0.410272] pci 0000:00:08.2: bridge window [mem 0x9400900000-0x94009fffff 64bit pref]
[ 0.410276] pci 0000:00:08.3: PCI bridge to [bus c6]
[ 0.410278] pci 0000:00:08.3: bridge window [mem 0xd4400000-0xd47fffff]
[ 0.410283] pci_bus 0000:00: resource 4 [io 0x0000-0x03af window]
[ 0.410284] pci_bus 0000:00: resource 5 [io 0x03e0-0x0cf7 window]
[ 0.410284] pci_bus 0000:00: resource 6 [io 0x03b0-0x03df window]
[ 0.410285] pci_bus 0000:00: resource 7 [io 0x0d00-0xffff window]
[ 0.410285] pci_bus 0000:00: resource 8 [mem 0x000a0000-0x000dffff window]
[ 0.410285] pci_bus 0000:00: resource 9 [mem 0x80000000-0xdfffffff window]
[ 0.410286] pci_bus 0000:00: resource 10 [mem 0xf0000000-0xfcffffff window]
[ 0.410286] pci_bus 0000:00: resource 11 [mem 0x2090000000-0x97ffffffff window]
[ 0.410287] pci_bus 0000:01: resource 0 [io 0xb000-0xefff]
[ 0.410287] pci_bus 0000:01: resource 1 [mem 0xbc000000-0xd3ffffff]
[ 0.410288] pci_bus 0000:01: resource 2 [mem 0x7000000000-0x8fffffffff 64bit pref]
[ 0.410288] pci_bus 0000:61: resource 0 [io 0x7000-0xafff]
[ 0.410289] pci_bus 0000:61: resource 1 [mem 0xa4000000-0xbbffffff]
[ 0.410289] pci_bus 0000:61: resource 2 [mem 0x5000000000-0x6fffffffff 64bit pref]
[ 0.410290] pci_bus 0000:c1: resource 1 [mem 0xd4b00000-0xd4bfffff]
[ 0.410290] pci_bus 0000:c2: resource 1 [mem 0xd4000000-0xd42fffff]
[ 0.410291] pci_bus 0000:c3: resource 1 [mem 0xd4a00000-0xd4afffff]
[ 0.410291] pci_bus 0000:c4: resource 0 [io 0xf000-0xffff]
[ 0.410292] pci_bus 0000:c4: resource 1 [mem 0x90000000-0xa04fffff]
[ 0.410292] pci_bus 0000:c4: resource 2 [mem 0x9000000000-0x94007fffff 64bit pref]
[ 0.410293] pci_bus 0000:c5: resource 1 [mem 0xd4800000-0xd49fffff]
[ 0.410293] pci_bus 0000:c5: resource 2 [mem 0x9400900000-0x94009fffff 64bit pref]
[ 0.410293] pci_bus 0000:c6: resource 1 [mem 0xd4400000-0xd47fffff]
[ 0.410420] pci 0000:c4:00.1: D0 power state depends on 0000:c4:00.0
[ 0.410664] PCI: CLS 64 bytes, default 64
[ 0.410694] pci 0000:00:00.2: AMD-Vi: IOMMU performance counters supported
[ 0.410726] platform MSFT0201:00: Adding to iommu group 0
[ 0.410740] Trying to unpack rootfs image as initramfs...
[ 0.410845] pci 0000:00:01.0: Adding to iommu group 1
[ 0.410853] pci 0000:00:01.1: Adding to iommu group 2
[ 0.410861] pci 0000:00:01.2: Adding to iommu group 3
[ 0.410873] pci 0000:00:02.0: Adding to iommu group 4
[ 0.410880] pci 0000:00:02.2: Adding to iommu group 5
[ 0.410887] pci 0000:00:02.3: Adding to iommu group 6
[ 0.410894] pci 0000:00:02.5: Adding to iommu group 7
[ 0.410901] pci 0000:00:03.0: Adding to iommu group 8
[ 0.410918] pci 0000:00:08.0: Adding to iommu group 9
[ 0.410925] pci 0000:00:08.1: Adding to iommu group 10
[ 0.410933] pci 0000:00:08.2: Adding to iommu group 11
[ 0.410940] pci 0000:00:08.3: Adding to iommu group 12
[ 0.410951] pci 0000:00:14.0: Adding to iommu group 13
[ 0.410957] pci 0000:00:14.3: Adding to iommu group 13
[ 0.410982] pci 0000:00:18.0: Adding to iommu group 14
[ 0.410988] pci 0000:00:18.1: Adding to iommu group 14
[ 0.410995] pci 0000:00:18.2: Adding to iommu group 14
[ 0.411001] pci 0000:00:18.3: Adding to iommu group 14
[ 0.411007] pci 0000:00:18.4: Adding to iommu group 14
[ 0.411013] pci 0000:00:18.5: Adding to iommu group 14
[ 0.411020] pci 0000:00:18.6: Adding to iommu group 14
[ 0.411026] pci 0000:00:18.7: Adding to iommu group 14
[ 0.411038] pci 0000:c1:00.0: Adding to iommu group 15
[ 0.411045] pci 0000:c2:00.0: Adding to iommu group 16
[ 0.411054] pci 0000:c3:00.0: Adding to iommu group 17
[ 0.411084] pci 0000:c4:00.0: Adding to iommu group 18
[ 0.411091] pci 0000:c4:00.1: Adding to iommu group 19
[ 0.411099] pci 0000:c4:00.2: Adding to iommu group 20
[ 0.411108] pci 0000:c4:00.4: Adding to iommu group 21
[ 0.411116] pci 0000:c4:00.5: Adding to iommu group 22
[ 0.411124] pci 0000:c4:00.6: Adding to iommu group 23
[ 0.411132] pci 0000:c4:00.7: Adding to iommu group 24
[ 0.411141] pci 0000:c5:00.0: Adding to iommu group 25
[ 0.411150] pci 0000:c5:00.1: Adding to iommu group 26
[ 0.411159] pci 0000:c6:00.0: Adding to iommu group 27
[ 0.411167] pci 0000:c6:00.3: Adding to iommu group 28
[ 0.411175] pci 0000:c6:00.4: Adding to iommu group 29
[ 0.411183] pci 0000:c6:00.5: Adding to iommu group 30
[ 0.411193] pci 0000:c6:00.6: Adding to iommu group 31
[ 0.414013] AMD-Vi: Extended features (0x246577efa2254afa, 0x10): PPR NX GT [5] IA GA PC GA_vAPIC
[ 0.414019] AMD-Vi: Interrupt remapping enabled
[ 0.414106] AMD-Vi: Virtual APIC enabled
[ 0.414133] PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
[ 0.414157] software IO TLB: mapped [mem 0x0000000059de6000-0x000000005dde6000] (64MB)
[ 0.414184] LVT offset 0 assigned for vector 0x400
[ 0.414380] perf: AMD IBS detected (0x00081bff)
[ 0.414402] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).
[ 0.440831] Initialise system trusted keyrings
[ 0.440844] Key type blacklist registered
[ 0.440906] workingset: timestamp_bits=36 max_order=25 bucket_order=0
[ 0.441202] fuse: init (API version 7.44)
[ 0.441311] integrity: Platform Keyring initialized
[ 0.441313] integrity: Machine keyring initialized
[ 0.448085] Freeing initrd memory: 50728K
[ 0.452952] xor: automatically using best checksumming function avx
[ 0.452955] Key type asymmetric registered
[ 0.452957] Asymmetric key parser 'x509' registered
[ 0.452978] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
[ 0.453030] io scheduler mq-deadline registered
[ 0.453032] io scheduler kyber registered
[ 0.453048] io scheduler bfq registered
[ 0.454949] ledtrig-cpu: registered to indicate activity on CPUs
[ 0.455252] pcieport 0000:00:01.1: PME: Signaling with IRQ 31
[ 0.455301] pcieport 0000:00:01.1: pciehp: Slot #0 AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+ IbPresDis- LLActRep+
[ 0.456013] pcieport 0000:00:01.2: PME: Signaling with IRQ 32
[ 0.456065] pcieport 0000:00:01.2: pciehp: Slot #0 AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+ IbPresDis- LLActRep+
[ 0.456529] pcieport 0000:00:02.2: PME: Signaling with IRQ 33
[ 0.456707] pcieport 0000:00:02.3: PME: Signaling with IRQ 34
[ 0.456873] pcieport 0000:00:02.5: PME: Signaling with IRQ 35
[ 0.457055] pcieport 0000:00:08.1: PME: Signaling with IRQ 36
[ 0.457300] pcieport 0000:00:08.2: PME: Signaling with IRQ 37
[ 0.457481] pcieport 0000:00:08.3: PME: Signaling with IRQ 38
[ 0.459004] ACPI: AC: AC Adapter [AC0] (off-line)
[ 0.459054] input: Lid Switch as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0D:00/input/input0
[ 0.459072] ACPI: button: Lid Switch [LID]
[ 0.459106] input: Power Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1
[ 0.459122] ACPI: button: Power Button [PWRB]
[ 0.459839] Monitor-Mwait will be used to enter C-1 state
[ 0.462307] Estimated ratio of average max frequency by base frequency (times 1024): 1397
[ 0.466546] thermal LNXTHERM:00: registered as thermal_zone0
[ 0.466549] ACPI: thermal: Thermal Zone [THZ0] (25 C)
[ 0.468575] thermal LNXTHERM:01: registered as thermal_zone1
[ 0.468577] ACPI: thermal: Thermal Zone [THRM] (34 C)
[ 0.468659] thermal LNXTHERM:02: registered as thermal_zone2
[ 0.468660] ACPI: thermal: Thermal Zone [TZ01] (20 C)
[ 0.468901] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled
[ 0.470589] Non-volatile memory driver v1.3
[ 0.470591] Linux agpgart interface v0.103
[ 0.480282] ACPI: battery: Slot [BAT0] (battery present)
[ 1.420452] tsc: Refined TSC clocksource calibration: 2994.333 MHz
[ 1.420474] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x2b295c55bb8, max_idle_ns: 440795327949 ns
[ 1.420539] clocksource: Switched to clocksource tsc
[ 1.713692] tpm_crb MSFT0101:00: Disabling hwrng
[ 1.714670] ACPI: bus type drm_connector registered
[ 1.719195] xhci_hcd 0000:c4:00.4: xHCI Host Controller
[ 1.719204] xhci_hcd 0000:c4:00.4: new USB bus registered, assigned bus number 1
[ 1.719666] xhci_hcd 0000:c4:00.4: hcc params 0x0118ffc5 hci version 0x120 quirks 0x0000000200000010
[ 1.720099] xhci_hcd 0000:c4:00.4: xHCI Host Controller
[ 1.720101] xhci_hcd 0000:c4:00.4: new USB bus registered, assigned bus number 2
[ 1.720103] xhci_hcd 0000:c4:00.4: Host supports USB 3.1 Enhanced SuperSpeed
[ 1.720150] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.17
[ 1.720154] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.720155] usb usb1: Product: xHCI Host Controller
[ 1.720156] usb usb1: Manufacturer: Linux 6.17.1-arch1-1 xhci-hcd
[ 1.720158] usb usb1: SerialNumber: 0000:c4:00.4
[ 1.720271] hub 1-0:1.0: USB hub found
[ 1.720296] hub 1-0:1.0: 1 port detected
[ 1.720474] usb usb2: We don't know the algorithms for LPM for this host, disabling LPM.
[ 1.720489] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.17
[ 1.720491] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.720492] usb usb2: Product: xHCI Host Controller
[ 1.720493] usb usb2: Manufacturer: Linux 6.17.1-arch1-1 xhci-hcd
[ 1.720494] usb usb2: SerialNumber: 0000:c4:00.4
[ 1.720569] hub 2-0:1.0: USB hub found
[ 1.720595] hub 2-0:1.0: 1 port detected
[ 1.720837] xhci_hcd 0000:c6:00.0: xHCI Host Controller
[ 1.720841] xhci_hcd 0000:c6:00.0: new USB bus registered, assigned bus number 3
[ 1.721292] xhci_hcd 0000:c6:00.0: hcc params 0x0128ffc5 hci version 0x120 quirks 0x0000000200000010
[ 1.721595] xhci_hcd 0000:c6:00.0: xHCI Host Controller
[ 1.721597] xhci_hcd 0000:c6:00.0: new USB bus registered, assigned bus number 4
[ 1.721598] xhci_hcd 0000:c6:00.0: Host supports USB 3.1 Enhanced SuperSpeed
[ 1.721625] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.17
[ 1.721627] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.721628] usb usb3: Product: xHCI Host Controller
[ 1.721629] usb usb3: Manufacturer: Linux 6.17.1-arch1-1 xhci-hcd
[ 1.721630] usb usb3: SerialNumber: 0000:c6:00.0
[ 1.721716] hub 3-0:1.0: USB hub found
[ 1.721724] hub 3-0:1.0: 5 ports detected
[ 1.722123] usb usb4: We don't know the algorithms for LPM for this host, disabling LPM.
[ 1.722137] usb usb4: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.17
[ 1.722138] usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.722139] usb usb4: Product: xHCI Host Controller
[ 1.722140] usb usb4: Manufacturer: Linux 6.17.1-arch1-1 xhci-hcd
[ 1.722141] usb usb4: SerialNumber: 0000:c6:00.0
[ 1.722212] hub 4-0:1.0: USB hub found
[ 1.722230] hub 4-0:1.0: 2 ports detected
[ 1.722545] xhci_hcd 0000:c6:00.3: xHCI Host Controller
[ 1.722549] xhci_hcd 0000:c6:00.3: new USB bus registered, assigned bus number 5
[ 1.722919] xhci_hcd 0000:c6:00.3: hcc params 0x0118ffc5 hci version 0x120 quirks 0x0000000200000010
[ 1.723318] xhci_hcd 0000:c6:00.3: xHCI Host Controller
[ 1.723319] xhci_hcd 0000:c6:00.3: new USB bus registered, assigned bus number 6
[ 1.723321] xhci_hcd 0000:c6:00.3: Host supports USB 3.1 Enhanced SuperSpeed
[ 1.723347] usb usb5: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.17
[ 1.723348] usb usb5: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.723349] usb usb5: Product: xHCI Host Controller
[ 1.723350] usb usb5: Manufacturer: Linux 6.17.1-arch1-1 xhci-hcd
[ 1.723351] usb usb5: SerialNumber: 0000:c6:00.3
[ 1.723428] hub 5-0:1.0: USB hub found
[ 1.723437] hub 5-0:1.0: 1 port detected
[ 1.723552] usb usb6: We don't know the algorithms for LPM for this host, disabling LPM.
[ 1.723565] usb usb6: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.17
[ 1.723566] usb usb6: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.723567] usb usb6: Product: xHCI Host Controller
[ 1.723568] usb usb6: Manufacturer: Linux 6.17.1-arch1-1 xhci-hcd
[ 1.723569] usb usb6: SerialNumber: 0000:c6:00.3
[ 1.723636] hub 6-0:1.0: USB hub found
[ 1.723654] hub 6-0:1.0: 1 port detected
[ 1.723966] xhci_hcd 0000:c6:00.4: xHCI Host Controller
[ 1.723969] xhci_hcd 0000:c6:00.4: new USB bus registered, assigned bus number 7
[ 1.724342] xhci_hcd 0000:c6:00.4: hcc params 0x0118ffc5 hci version 0x120 quirks 0x0000000200000010
[ 1.724713] xhci_hcd 0000:c6:00.4: xHCI Host Controller
[ 1.724715] xhci_hcd 0000:c6:00.4: new USB bus registered, assigned bus number 8
[ 1.724716] xhci_hcd 0000:c6:00.4: Host supports USB 3.1 Enhanced SuperSpeed
[ 1.724740] usb usb7: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.17
[ 1.724742] usb usb7: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.724743] usb usb7: Product: xHCI Host Controller
[ 1.724744] usb usb7: Manufacturer: Linux 6.17.1-arch1-1 xhci-hcd
[ 1.724745] usb usb7: SerialNumber: 0000:c6:00.4
[ 1.724816] hub 7-0:1.0: USB hub found
[ 1.724834] hub 7-0:1.0: 1 port detected
[ 1.724948] usb usb8: We don't know the algorithms for LPM for this host, disabling LPM.
[ 1.724961] usb usb8: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.17
[ 1.724963] usb usb8: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.724964] usb usb8: Product: xHCI Host Controller
[ 1.724964] usb usb8: Manufacturer: Linux 6.17.1-arch1-1 xhci-hcd
[ 1.724965] usb usb8: SerialNumber: 0000:c6:00.4
[ 1.725031] hub 8-0:1.0: USB hub found
[ 1.725049] hub 8-0:1.0: 1 port detected
[ 1.725338] usbcore: registered new interface driver usbserial_generic
[ 1.725344] usbserial: USB Serial support registered for generic
[ 1.725385] i8042: PNP: PS/2 Controller [PNP030b:PS2K] at 0x60,0x64 irq 1
[ 1.725387] i8042: PNP: PS/2 appears to have AUX port disabled, if this is incorrect please boot with i8042.nopnp
[ 1.727361] serio: i8042 KBD port at 0x60,0x64 irq 1
[ 1.727494] rtc_cmos 00:00: RTC can wake from S4
[ 1.727761] rtc_cmos 00:00: registered as rtc0
[ 1.727800] rtc_cmos 00:00: setting system clock to 2025-10-08T07:50:34 UTC (1759909834)
[ 1.727840] rtc_cmos 00:00: alarms up to one month, y3k, 114 bytes nvram
[ 1.729601] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input2
[ 1.730485] simple-framebuffer simple-framebuffer.0: [drm] Registered 1 planes with drm panic
[ 1.730488] [drm] Initialized simpledrm 1.0.0 for simple-framebuffer.0 on minor 0
[ 1.732789] fbcon: Deferring console take-over
[ 1.732800] simple-framebuffer simple-framebuffer.0: [drm] fb0: simpledrmdrmfb frame buffer device
[ 1.732908] hid: raw HID events driver (C) Jiri Kosina
[ 1.732947] usbcore: registered new interface driver usbhid
[ 1.732948] usbhid: USB HID core driver
[ 1.733057] drop_monitor: Initializing network drop monitor service
[ 1.733177] NET: Registered PF_INET6 protocol family
[ 1.733532] Segment Routing with IPv6
[ 1.733533] RPL Segment Routing with IPv6
[ 1.733538] In-situ OAM (IOAM) with IPv6
[ 1.733553] NET: Registered PF_PACKET protocol family
[ 1.735682] microcode: Current revision: 0x0b70001e
[ 1.736665] resctrl: L3 allocation detected
[ 1.736666] resctrl: MB allocation detected
[ 1.736667] resctrl: SMBA allocation detected
[ 1.736667] resctrl: L3 monitoring detected
[ 1.736694] IPI shorthand broadcast: enabled
[ 1.737703] sched_clock: Marking stable (1736010822, 1389310)->(1744148772, -6748640)
[ 1.737904] registered taskstats version 1
[ 1.739183] Loading compiled-in X.509 certificates
[ 1.743141] Loaded X.509 cert 'Build time autogenerated kernel key: b33ef8593969bf291187b2ac8b9422695ac997ad'
[ 1.744192] Demotion targets for Node 0: null
[ 1.744368] Key type .fscrypt registered
[ 1.744369] Key type fscrypt-provisioning registered
[ 1.744724] Btrfs loaded, zoned=yes, fsverity=yes
[ 1.744745] Key type big_key registered
[ 1.744821] integrity: Loading X.509 certificate: UEFI:db
[ 1.746895] integrity: Loaded X.509 cert 'ASUSTeK Notebook SW Key Certificate: b8e581e4df77a5bb4282d5ccfc00c071'
[ 1.746897] integrity: Loading X.509 certificate: UEFI:db
[ 1.746908] integrity: Loaded X.509 cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4'
[ 1.746909] integrity: Loading X.509 certificate: UEFI:db
[ 1.746915] integrity: Loaded X.509 cert 'Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53'
[ 1.746916] integrity: Loading X.509 certificate: UEFI:db
[ 1.746921] integrity: Loaded X.509 cert 'Microsoft Corporation: Windows UEFI CA 2023: aefc5fbbbe055d8f8daa585473499417ab5a5272'
[ 1.746922] integrity: Loading X.509 certificate: UEFI:db
[ 1.746926] integrity: Loaded X.509 cert 'Microsoft UEFI CA 2023: 81aa6b3244c935bce0d6628af39827421e32497d'
[ 1.747855] PM: Magic number: 13:154:824
[ 1.748641] RAS: Correctable Errors collector initialized.
[ 1.751593] clk: Disabling unused clocks
[ 1.751596] PM: genpd: Disabling unused power domains
[ 1.752634] Freeing unused decrypted memory: 2028K
[ 1.753041] Freeing unused kernel image (initmem) memory: 4692K
[ 1.753051] Write protecting the kernel read-only data: 38912k
[ 1.753276] Freeing unused kernel image (text/rodata gap) memory: 408K
[ 1.753490] Freeing unused kernel image (rodata/data gap) memory: 1596K
[ 1.780547] x86/mm: Checked W+X mappings: passed, no W+X pages found.
[ 1.780555] rodata_test: all tests were successful
[ 1.780559] Run /init as init process
[ 1.780561] with arguments:
[ 1.780561] /init
[ 1.780562] splash
[ 1.780563] with environment:
[ 1.780563] HOME=/
[ 1.780563] TERM=linux
[ 1.780564] cryptdevice=PARTUUID=7c08e7e5-16ef-4bfe-a8ad-8a7e78ab54b3:root
[ 1.924130] ccp 0000:c4:00.2: enabling device (0000 -> 0002)
[ 1.925565] ccp 0000:c4:00.2: tee enabled
[ 1.925579] Key type psk registered
[ 1.926756] ccp 0000:c4:00.2: psp enabled
[ 1.927376] ACPI: video: Video Device [VGA] (multi-head: yes rom: no post: no)
[ 1.927812] input: Video Bus as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1b/LNXVIDEO:00/input/input3
[ 1.932482] sdhci: Secure Digital Host Controller Interface driver
[ 1.932485] sdhci: Copyright(c) Pierre Ossman
[ 1.935927] nvme 0000:c3:00.0: platform quirk: setting simple suspend
[ 1.935990] nvme nvme0: pci function 0000:c3:00.0
[ 1.939057] sdhci-pci 0000:c1:00.0: SDHCI controller found [17a0:9755] (rev 1)
[ 1.939121] sdhci-pci 0000:c1:00.0: enabling device (0000 -> 0002)
[ 1.958000] usb 3-2: new full-speed USB device number 2 using xhci_hcd
[ 1.958067] usb 1-1: new high-speed USB device number 2 using xhci_hcd
[ 1.959481] nvme nvme0: allocated 64 MiB host memory buffer (1 segment).
[ 1.991859] mmc0: SDHCI controller on PCI [0000:c1:00.0] using ADMA 64-bit
[ 1.999237] nvme nvme0: 32/0/0 default/read/poll queues
[ 2.003596] nvme0n1: p1 p2 p3 p4 p5
[ 2.100038] usb 1-1: New USB device found, idVendor=0bda, idProduct=636e, bcdDevice= 0.06
[ 2.100050] usb 1-1: New USB device strings: Mfr=3, Product=1, SerialNumber=2
[ 2.100053] usb 1-1: Product: ASUS 5M webcam
[ 2.100055] usb 1-1: Manufacturer: Shinetech
[ 2.100056] usb 1-1: SerialNumber: 200901010001
[ 2.116652] usb 3-2: New USB device found, idVendor=17ef, idProduct=6116, bcdDevice= 0.34
[ 2.116665] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 2.116668] usb 3-2: Product: Lenovo USB-A Unified Pairing Receiver
[ 2.116671] usb 3-2: Manufacturer: Lenovo
[ 2.138416] input: Lenovo Lenovo USB-A Unified Pairing Receiver as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-2/3-2:1.0/0003:17EF:6116.0001/input/input4
[ 2.525673] hid-generic 0003:17EF:6116.0001: input,hidraw0: USB HID v1.11 Keyboard [Lenovo Lenovo USB-A Unified Pairing Receiver] on usb-0000:c6:00.0-2/input0
[ 2.529890] input: Lenovo Lenovo USB-A Unified Pairing Receiver as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-2/3-2:1.1/0003:17EF:6116.0002/input/input5
[ 2.529975] hid-generic 0003:17EF:6116.0002: input,hidraw1: USB HID v1.11 Mouse [Lenovo Lenovo USB-A Unified Pairing Receiver] on usb-0000:c6:00.0-2/input1
[ 2.534875] input: Lenovo Lenovo USB-A Unified Pairing Receiver Consumer Control as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-2/3-2:1.2/0003:17EF:6116.0003/input/input6
[ 2.585592] input: Lenovo Lenovo USB-A Unified Pairing Receiver System Control as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-2/3-2:1.2/0003:17EF:6116.0003/input/input7
[ 2.585701] hid-generic 0003:17EF:6116.0003: input,hidraw2: USB HID v1.11 Device [Lenovo Lenovo USB-A Unified Pairing Receiver] on usb-0000:c6:00.0-2/input2
[ 2.590031] hid-generic 0003:17EF:6116.0004: hiddev96,hidraw3: USB HID v1.11 Device [Lenovo Lenovo USB-A Unified Pairing Receiver] on usb-0000:c6:00.0-2/input3
[ 2.701452] usb 3-3: new high-speed USB device number 3 using xhci_hcd
[ 2.828181] usb 3-3: New USB device found, idVendor=13d3, idProduct=3608, bcdDevice= 1.00
[ 2.828193] usb 3-3: New USB device strings: Mfr=5, Product=6, SerialNumber=7
[ 2.828195] usb 3-3: Product: Wireless_Device
[ 2.828197] usb 3-3: Manufacturer: MediaTek Inc.
[ 2.828199] usb 3-3: SerialNumber: 000000000
[ 2.946437] usb 3-4: new full-speed USB device number 4 using xhci_hcd
[ 2.958066] [drm] amdgpu kernel modesetting enabled.
[ 2.961654] amdgpu: Virtual CRAT table created for CPU
[ 2.961661] amdgpu: Topology: Add CPU node
[ 2.961783] amdgpu 0000:c4:00.0: enabling device (0006 -> 0007)
[ 2.961832] amdgpu 0000:c4:00.0: amdgpu: initializing kernel modesetting (IP DISCOVERY 0x1002:0x1586 0x1043:0x1FB3 0xC1).
[ 2.970203] amdgpu 0000:c4:00.0: amdgpu: register mmio base: 0xA0300000
[ 2.970204] amdgpu 0000:c4:00.0: amdgpu: register mmio size: 1048576
[ 2.973607] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 0 <soc21_common>
[ 2.973608] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 1 <gmc_v11_0>
[ 2.973610] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 2 <ih_v6_1>
[ 2.973610] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 3 <psp>
[ 2.973611] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 4 <smu>
[ 2.973612] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 5 <dm>
[ 2.973612] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 6 <gfx_v11_0>
[ 2.973613] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 7 <sdma_v6_0>
[ 2.973614] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 8 <vcn_v4_0_5>
[ 2.973615] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 9 <jpeg_v4_0_5>
[ 2.973615] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 10 <mes_v11_0>
[ 2.973616] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 11 <vpe_v6_1>
[ 2.973616] amdgpu 0000:c4:00.0: amdgpu: detected ip block number 12 <isp_ip>
[ 2.973638] amdgpu 0000:c4:00.0: amdgpu: Fetched VBIOS from VFCT
[ 2.973639] amdgpu: ATOM BIOS: 113-STRXLGEN-001
[ 2.977201] amdgpu 0000:c4:00.0: amdgpu: VPE: collaborate mode true
[ 3.016200] amdgpu 0000:c4:00.0: amdgpu: Trusted Memory Zone (TMZ) feature disabled as experimental (default)
[ 3.016290] amdgpu 0000:c4:00.0: amdgpu: vm size is 262144 GB, 4 levels, block size is 9-bit, fragment size is 9-bit
[ 3.016314] amdgpu 0000:c4:00.0: amdgpu: VRAM: 16384M 0x0000008000000000 - 0x00000083FFFFFFFF (16384M used)
[ 3.016318] amdgpu 0000:c4:00.0: amdgpu: GART: 512M 0x00007FFF00000000 - 0x00007FFF1FFFFFFF
[ 3.016340] [drm] Detected VRAM RAM=16384M, BAR=16384M
[ 3.016342] [drm] RAM width 256bits LPDDR5
[ 3.016882] amdgpu 0000:c4:00.0: amdgpu: amdgpu: 16384M of VRAM memory ready
[ 3.016886] amdgpu 0000:c4:00.0: amdgpu: amdgpu: 56158M of GTT memory ready.
[ 3.016911] [drm] GART: num cpu pages 131072, num gpu pages 131072
[ 3.017602] [drm] PCIE GART of 512M enabled (table at 0x00000083FFB00000).
[ 3.018031] amdgpu 0000:c4:00.0: amdgpu: [drm] Loading DMUB firmware via PSP: version=0x09002C01
[ 3.018403] amdgpu 0000:c4:00.0: amdgpu: Found VCN firmware Version ENC: 1.24 DEC: 9 VEP: 0 Revision: 22
[ 3.018452] amdgpu 0000:c4:00.0: amdgpu: Found VCN firmware Version ENC: 1.24 DEC: 9 VEP: 0 Revision: 22
[ 3.042213] amdgpu 0000:c4:00.0: amdgpu: reserve 0x8c00000 from 0x83e0000000 for PSP TMR
[ 3.096126] usb 3-4: New USB device found, idVendor=0b05, idProduct=1a30, bcdDevice= 0.02
[ 3.096138] usb 3-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 3.096140] usb 3-4: Product: GZ302EA-Keyboard
[ 3.096142] usb 3-4: Manufacturer: ASUSTeK Computer Inc.
[ 3.120663] input: ASUSTeK Computer Inc. GZ302EA-Keyboard as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.0/0003:0B05:1A30.0005/input/input8
[ 3.120751] input: ASUSTeK Computer Inc. GZ302EA-Keyboard Consumer Control as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.0/0003:0B05:1A30.0005/input/input9
[ 3.171854] input: ASUSTeK Computer Inc. GZ302EA-Keyboard Wireless Radio Control as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.0/0003:0B05:1A30.0005/input/input10
[ 3.171918] input: ASUSTeK Computer Inc. GZ302EA-Keyboard as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.0/0003:0B05:1A30.0005/input/input11
[ 3.171962] input: ASUSTeK Computer Inc. GZ302EA-Keyboard as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.0/0003:0B05:1A30.0005/input/input12
[ 3.172072] hid-generic 0003:0B05:1A30.0005: input,hiddev97,hidraw4: USB HID v1.10 Device [ASUSTeK Computer Inc. GZ302EA-Keyboard] on usb-0000:c6:00.0-4/input0
[ 3.180008] hid-generic 0003:0B05:1A30.0006: hiddev98,hidraw5: USB HID v1.10 Device [ASUSTeK Computer Inc. GZ302EA-Keyboard] on usb-0000:c6:00.0-4/input1
[ 3.188506] input: ASUSTeK Computer Inc. GZ302EA-Keyboard as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.2/0003:0B05:1A30.0007/input/input13
[ 3.275928] hid-generic 0003:0B05:1A30.0007: input,hidraw6: USB HID v1.10 Keyboard [ASUSTeK Computer Inc. GZ302EA-Keyboard] on usb-0000:c6:00.0-4/input2
[ 3.286712] input: ASUSTeK Computer Inc. GZ302EA-Keyboard Mouse as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.3/0003:0B05:1A30.0008/input/input14
[ 3.286785] input: ASUSTeK Computer Inc. GZ302EA-Keyboard Touchpad as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.3/0003:0B05:1A30.0008/input/input15
[ 3.337928] hid-generic 0003:0B05:1A30.0008: input,hiddev99,hidraw7: USB HID v1.10 Mouse [ASUSTeK Computer Inc. GZ302EA-Keyboard] on usb-0000:c6:00.0-4/input3
[ 3.346249] hid-generic 0003:0B05:1A30.0009: hiddev100,hidraw8: USB HID v1.10 Device [ASUSTeK Computer Inc. GZ302EA-Keyboard] on usb-0000:c6:00.0-4/input4
[ 3.458716] usb 3-5: new full-speed USB device number 5 using xhci_hcd
[ 3.608118] usb 3-5: New USB device found, idVendor=0b05, idProduct=18c6, bcdDevice= 0.02
[ 3.608130] usb 3-5: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 3.608133] usb 3-5: Product: N-KEY Device
[ 3.608135] usb 3-5: Manufacturer: ASUSTeK Computer Inc.
[ 3.630677] input: ASUSTeK Computer Inc. N-KEY Device as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-5/3-5:1.0/0003:0B05:18C6.000A/input/input16
[ 3.630766] input: ASUSTeK Computer Inc. N-KEY Device Consumer Control as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-5/3-5:1.0/0003:0B05:18C6.000A/input/input17
[ 3.662999] amdgpu 0000:c4:00.0: amdgpu: RAS: optional ras ta ucode is not available
[ 3.666998] amdgpu 0000:c4:00.0: amdgpu: RAP: optional rap ta ucode is not available
[ 3.667000] amdgpu 0000:c4:00.0: amdgpu: SECUREDISPLAY: optional securedisplay ta ucode is not available
[ 3.692770] input: ASUSTeK Computer Inc. N-KEY Device as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-5/3-5:1.0/0003:0B05:18C6.000A/input/input18
[ 3.692834] input: ASUSTeK Computer Inc. N-KEY Device as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-5/3-5:1.0/0003:0B05:18C6.000A/input/input19
[ 3.692932] hid-generic 0003:0B05:18C6.000A: input,hiddev101,hidraw9: USB HID v1.10 Device [ASUSTeK Computer Inc. N-KEY Device] on usb-0000:c6:00.0-5/input0
[ 3.701292] hid-generic 0003:0B05:18C6.000B: hiddev102,hidraw10: USB HID v1.10 Device [ASUSTeK Computer Inc. N-KEY Device] on usb-0000:c6:00.0-5/input1
[ 3.709249] amdgpu 0000:c4:00.0: amdgpu: SMU is initialized successfully!
[ 3.711310] amdgpu 0000:c4:00.0: amdgpu: [drm] Display Core v3.2.340 initialized on DCN 3.5.1
[ 3.711312] amdgpu 0000:c4:00.0: amdgpu: [drm] DP-HDMI FRL PCON supported
[ 3.712316] asus_wmi: ASUS WMI generic driver loaded
[ 3.714175] amdgpu 0000:c4:00.0: amdgpu: [drm] DMUB hardware initialized: version=0x09002C01
[ 3.796709] asus 0003:0B05:1A30.0005: Fixing up Asus N-Key report descriptor
[ 3.797060] asus 0003:0B05:1A30.0005: using HID for asus::kbd_backlight
[ 3.804798] input: ASUSTeK Computer Inc. GZ302EA-Keyboard as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.0/0003:0B05:1A30.0005/input/input20
[ 3.829469] kfd kfd: amdgpu: Allocated 3969056 bytes on gart
[ 3.829480] kfd kfd: amdgpu: Total number of KFD nodes to be created: 1
[ 3.830067] amdgpu: Virtual CRAT table created for GPU
[ 3.830196] amdgpu: Topology: Add dGPU node [0x1586:0x1002]
[ 3.830197] kfd kfd: amdgpu: added device 1002:1586
[ 3.830207] amdgpu 0000:c4:00.0: amdgpu: SE 2, SH per SE 2, CU per SH 10, active_cu_number 40
[ 3.830210] amdgpu 0000:c4:00.0: amdgpu: ring gfx_0.0.0 uses VM inv eng 0 on hub 0
[ 3.830212] amdgpu 0000:c4:00.0: amdgpu: ring comp_1.0.0 uses VM inv eng 1 on hub 0
[ 3.830212] amdgpu 0000:c4:00.0: amdgpu: ring comp_1.1.0 uses VM inv eng 4 on hub 0
[ 3.830212] amdgpu 0000:c4:00.0: amdgpu: ring comp_1.2.0 uses VM inv eng 6 on hub 0
[ 3.830213] amdgpu 0000:c4:00.0: amdgpu: ring comp_1.3.0 uses VM inv eng 7 on hub 0
[ 3.830213] amdgpu 0000:c4:00.0: amdgpu: ring comp_1.0.1 uses VM inv eng 8 on hub 0
[ 3.830213] amdgpu 0000:c4:00.0: amdgpu: ring comp_1.1.1 uses VM inv eng 9 on hub 0
[ 3.830214] amdgpu 0000:c4:00.0: amdgpu: ring comp_1.2.1 uses VM inv eng 10 on hub 0
[ 3.830214] amdgpu 0000:c4:00.0: amdgpu: ring comp_1.3.1 uses VM inv eng 11 on hub 0
[ 3.830214] amdgpu 0000:c4:00.0: amdgpu: ring sdma0 uses VM inv eng 12 on hub 0
[ 3.830215] amdgpu 0000:c4:00.0: amdgpu: ring vcn_unified_0 uses VM inv eng 0 on hub 8
[ 3.830215] amdgpu 0000:c4:00.0: amdgpu: ring vcn_unified_1 uses VM inv eng 1 on hub 8
[ 3.830216] amdgpu 0000:c4:00.0: amdgpu: ring jpeg_dec_0 uses VM inv eng 4 on hub 8
[ 3.830216] amdgpu 0000:c4:00.0: amdgpu: ring jpeg_dec_1 uses VM inv eng 6 on hub 8
[ 3.830216] amdgpu 0000:c4:00.0: amdgpu: ring mes_kiq_3.1.0 uses VM inv eng 13 on hub 0
[ 3.830217] amdgpu 0000:c4:00.0: amdgpu: ring vpe uses VM inv eng 7 on hub 8
[ 3.831437] amdgpu 0000:c4:00.0: amdgpu: Runtime PM not available
[ 3.832031] amdgpu 0000:c4:00.0: amdgpu: [drm] Using custom brightness curve
[ 3.832383] amdgpu 0000:c4:00.0: [drm] Registered 4 planes with drm panic
[ 3.832384] [drm] Initialized amdgpu 3.64.0 for 0000:c4:00.0 on minor 1
[ 3.855734] asus 0003:0B05:1A30.0005: input,hiddev97,hidraw4: USB HID v1.10 Device [ASUSTeK Computer Inc. GZ302EA-Keyboard] on usb-0000:c6:00.0-4/input0
[ 3.856154] asus 0003:0B05:1A30.0006: hiddev98,hidraw5: USB HID v1.10 Device [ASUSTeK Computer Inc. GZ302EA-Keyboard] on usb-0000:c6:00.0-4/input1
[ 3.856158] asus 0003:0B05:1A30.0006: Asus input not registered
[ 3.856217] asus 0003:0B05:1A30.0006: probe with driver asus failed with error -12
[ 3.860647] fbcon: Deferring console take-over
[ 3.860649] amdgpu 0000:c4:00.0: [drm] fb0: amdgpudrmfb frame buffer device
[ 3.942864] input: ASUSTeK Computer Inc. GZ302EA-Keyboard as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.2/0003:0B05:1A30.0007/input/input21
[ 4.033798] asus 0003:0B05:1A30.0007: input,hidraw5: USB HID v1.10 Keyboard [ASUSTeK Computer Inc. GZ302EA-Keyboard] on usb-0000:c6:00.0-4/input2
[ 4.067054] input: ASUSTeK Computer Inc. GZ302EA-Keyboard as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-4/3-4:1.3/0003:0B05:1A30.0008/input/input22
[ 4.118009] asus 0003:0B05:1A30.0008: input,hiddev98,hidraw6: USB HID v1.10 Mouse [ASUSTeK Computer Inc. GZ302EA-Keyboard] on usb-0000:c6:00.0-4/input3
[ 4.118537] asus 0003:0B05:1A30.0009: hiddev99,hidraw7: USB HID v1.10 Device [ASUSTeK Computer Inc. GZ302EA-Keyboard] on usb-0000:c6:00.0-4/input4
[ 4.118541] asus 0003:0B05:1A30.0009: Asus input not registered
[ 4.118568] asus 0003:0B05:1A30.0009: probe with driver asus failed with error -12
[ 4.181903] asus 0003:0B05:18C6.000A: Fixing up Asus N-Key report descriptor
[ 4.182193] asus 0003:0B05:18C6.000A: using HID for asus::kbd_backlight
[ 4.189735] asus 0003:0B05:18C6.000A: Led asus::kbd_backlight renamed to asus::kbd_backlight_1 due to name collision
[ 4.189808] input: ASUSTeK Computer Inc. N-KEY Device as /devices/pci0000:00/0000:00:08.3/0000:c6:00.0/usb3/3-5/3-5:1.0/0003:0B05:18C6.000A/input/input23
[ 4.240956] asus 0003:0B05:18C6.000A: input,hiddev99,hidraw7: USB HID v1.10 Device [ASUSTeK Computer Inc. N-KEY Device] on usb-0000:c6:00.0-5/input0
[ 4.241492] asus 0003:0B05:18C6.000B: hiddev100,hidraw8: USB HID v1.10 Device [ASUSTeK Computer Inc. N-KEY Device] on usb-0000:c6:00.0-5/input1
[ 4.241498] asus 0003:0B05:18C6.000B: Asus input not registered
[ 4.241546] asus 0003:0B05:18C6.000B: probe with driver asus failed with error -12
[ 4.285479] [drm] pre_validate_dsc:1628 MST_DSC dsc precompute is not needed
[ 5.041192] device-mapper: uevent: version 1.0.3
[ 5.041340] device-mapper: ioctl: 4.50.0-ioctl (2025-04-28) initialised: dm-devel@lists.linux.dev
[ 5.049621] Key type trusted registered
[ 5.052364] Key type encrypted registered
[ 18.509413] BTRFS: device fsid f7428b70-20b5-44ba-8cb9-a6818440d315 devid 1 transid 1423 /dev/mapper/root (253:0) scanned by mount (1690)
[ 18.509703] BTRFS info (device dm-0): first mount of filesystem f7428b70-20b5-44ba-8cb9-a6818440d315
[ 18.509712] BTRFS info (device dm-0): using crc32c (crc32c-lib) checksum algorithm
[ 18.514866] BTRFS info (device dm-0): enabling ssd optimizations
[ 18.514868] BTRFS info (device dm-0): enabling free space tree
[ 18.919729] systemd[1]: systemd 258-4-arch running in system mode (+PAM +AUDIT -SELINUX +APPARMOR -IMA +IPE +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK +BTF +XKBCOMMON +UTMP -SYSVINIT +LIBARCHIVE)
[ 18.919761] systemd[1]: Detected architecture x86-64.
[ 18.923274] systemd[1]: Hostname set to <QUALIA>.
[ 19.013055] systemd[1]: bpf-restrict-fs: LSM BPF program attached
[ 19.041991] zram: Added device: zram0
[ 19.078010] systemd[1]: /etc/systemd/system/omarchy-seamless-login.service:13: Unknown key 'StartLimitIntervalSec' in section [Service], ignoring.
[ 19.078916] systemd[1]: Queued start job for default target Graphical Interface.
[ 19.101639] systemd[1]: Created slice CUPS Slice.
[ 19.101883] systemd[1]: Created slice Slice /system/dirmngr.
[ 19.102046] systemd[1]: Created slice Slice /system/gpg-agent.
[ 19.102209] systemd[1]: Created slice Slice /system/gpg-agent-browser.
[ 19.102357] systemd[1]: Created slice Slice /system/gpg-agent-extra.
[ 19.102543] systemd[1]: Created slice Slice /system/gpg-agent-ssh.
[ 19.102692] systemd[1]: Created slice Slice /system/keyboxd.
[ 19.102848] systemd[1]: Created slice Slice /system/modprobe.
[ 19.102993] systemd[1]: Created slice Slice /system/systemd-zram-setup.
[ 19.103144] systemd[1]: Created slice Slice /system/wg-quick.
[ 19.103247] systemd[1]: Created slice User and Session Slice.
[ 19.103277] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[ 19.103455] systemd[1]: Set up automount Arbitrary Executable File Formats File System Automount Point.
[ 19.103470] systemd[1]: Expecting device /dev/disk/by-uuid/DE97-1489...
[ 19.103474] systemd[1]: Expecting device /dev/disk/by-uuid/f7428b70-20b5-44ba-8cb9-a6818440d315...
[ 19.103478] systemd[1]: Expecting device /dev/zram0...
[ 19.103490] systemd[1]: Reached target Login Prompts.
[ 19.103499] systemd[1]: Reached target Image Downloads.
[ 19.103505] systemd[1]: Reached target Local Integrity Protected Volumes.
[ 19.103526] systemd[1]: Reached target Remote File Systems.
[ 19.103533] systemd[1]: Reached target Slice Units.
[ 19.103551] systemd[1]: Reached target Local Verity Protected Volumes.
[ 19.103595] systemd[1]: Listening on Device-mapper event daemon FIFOs.
[ 19.104086] systemd[1]: Listening on Query the User Interactively for a Password.
[ 19.104623] systemd[1]: Listening on Process Core Dump Socket.
[ 19.104851] systemd[1]: Listening on Credential Encryption/Decryption.
[ 19.105172] systemd[1]: Listening on Factory Reset Management.
[ 19.105212] systemd[1]: Listening on Journal Socket (/dev/log).
[ 19.105241] systemd[1]: Listening on Journal Sockets.
[ 19.105302] systemd[1]: Listening on Network Service Varlink Socket.
[ 19.105342] systemd[1]: Listening on Network Service Netlink Socket.
[ 19.105940] systemd[1]: Listening on TPM PCR Measurements.
[ 19.106181] systemd[1]: Listening on Make TPM PCR Policy.
[ 19.106202] systemd[1]: Listening on Resolve Monitor Varlink Socket.
[ 19.106217] systemd[1]: Listening on Resolve Service Varlink Socket.
[ 19.106243] systemd[1]: Listening on udev Control Socket.
[ 19.106264] systemd[1]: Listening on udev Kernel Socket.
[ 19.106282] systemd[1]: Listening on udev Varlink Socket.
[ 19.106303] systemd[1]: Listening on User Database Manager Socket.
[ 19.108653] systemd[1]: Mounting Huge Pages File System...
[ 19.109136] systemd[1]: Mounting POSIX Message Queue File System...
[ 19.110002] systemd[1]: Mounting Kernel Debug File System...
[ 19.110876] systemd[1]: Mounting Kernel Trace File System...
[ 19.111315] systemd[1]: Starting Create List of Static Device Nodes...
[ 19.111337] systemd[1]: Load Kernel Module configfs was skipped because of an unmet condition check (ConditionKernelModuleLoaded=!configfs).
[ 19.111764] systemd[1]: Mounting Kernel Configuration File System...
[ 19.111788] systemd[1]: Load Kernel Module dm_mod was skipped because of an unmet condition check (ConditionKernelModuleLoaded=!dm_mod).
[ 19.111804] systemd[1]: Load Kernel Module drm was skipped because of an unmet condition check (ConditionKernelModuleLoaded=!drm).
[ 19.111816] systemd[1]: Load Kernel Module fuse was skipped because of an unmet condition check (ConditionKernelModuleLoaded=!fuse).
[ 19.112436] systemd[1]: Mounting FUSE Control File System...
[ 19.112843] systemd[1]: Starting Load Kernel Module loop...
[ 19.112929] systemd[1]: Clear Stale Hibernate Storage Info was skipped because of an unmet condition check (ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-8cf2644b-4b0b-428f-9387-6d876050dc67).
[ 19.114216] systemd[1]: Starting Journal Service...
[ 19.114708] systemd[1]: Starting Load Kernel Modules...
[ 19.115046] systemd[1]: Starting Generate network units from Kernel command line...
[ 19.115381] systemd[1]: Starting TPM PCR Machine ID Measurement...
[ 19.115684] systemd[1]: Starting Remount Root and Kernel File Systems...
[ 19.115980] systemd[1]: Starting Early TPM SRK Setup...
[ 19.116440] systemd[1]: Starting Load udev Rules from Credentials...
[ 19.116871] systemd[1]: Starting Coldplug All udev Devices...
[ 19.117204] systemd[1]: Starting Virtual Console Setup...
[ 19.118238] systemd[1]: Mounted Huge Pages File System.
[ 19.118277] systemd[1]: Mounted POSIX Message Queue File System.
[ 19.118306] systemd[1]: Mounted Kernel Debug File System.
[ 19.118341] systemd[1]: Mounted Kernel Trace File System.
[ 19.118483] systemd[1]: Finished Create List of Static Device Nodes.
[ 19.118570] systemd[1]: Mounted Kernel Configuration File System.
[ 19.118602] systemd[1]: Mounted FUSE Control File System.
[ 19.118700] loop: module loaded
[ 19.119023] systemd[1]: Starting Create Static Device Nodes in /dev gracefully...
[ 19.119108] systemd[1]: modprobe@loop.service: Deactivated successfully.
[ 19.119180] systemd[1]: Finished Load Kernel Module loop.
[ 19.120194] systemd[1]: Finished Generate network units from Kernel command line.
[ 19.120393] systemd[1]: Reached target Preparation for Network.
[ 19.136298] systemd[1]: Finished Virtual Console Setup.
[ 19.137541] systemd[1]: Finished Load udev Rules from Credentials.
[ 19.137615] systemd-journald[1771]: Collecting audit messages is disabled.
[ 19.137677] Asymmetric key parser 'pkcs8' registered
[ 19.138032] systemd[1]: Finished Load Kernel Modules.
[ 19.138635] systemd[1]: Starting Apply Kernel Variables...
[ 19.140909] systemd[1]: Starting User Database Manager...
[ 19.141430] systemd[1]: Finished TPM PCR Machine ID Measurement.
[ 19.145837] systemd[1]: Finished Apply Kernel Variables.
[ 19.152151] BTRFS info (device dm-0 state M): use zstd compression, level 3
[ 19.152682] systemd[1]: Finished Remount Root and Kernel File Systems.
[ 19.152893] systemd[1]: Rebuild Hardware Database was skipped because of an unmet condition check (ConditionNeedsUpdate=/etc).
[ 19.153407] systemd[1]: Starting Load/Save OS Random Seed...
[ 19.154459] systemd[1]: Finished Early TPM SRK Setup.
[ 19.154509] systemd[1]: Repartition Root Disk was skipped because no trigger condition checks were met.
[ 19.154917] systemd[1]: Starting TPM SRK Setup...
[ 19.158902] systemd[1]: Finished Load/Save OS Random Seed.
[ 19.160466] systemd[1]: Started User Database Manager.
[ 19.163585] systemd[1]: Started Journal Service.
[ 19.262100] zram0: detected capacity change from 0 to 8388608
[ 19.271221] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[ 19.271313] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[ 19.271378] Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600'
[ 19.272216] pcie_mp2_amd 0000:c4:00.7: enabling device (0000 -> 0002)
[ 19.288150] Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 I2C devices.
[ 19.288237] ACPI: bus type thunderbolt registered
[ 19.309291] Adding 4194300k swap on /dev/zram0. Priority:100 extents:1 across:4194300k SSDsc
[ 19.312177] input: PC Speaker as /devices/platform/pcspkr/input/input24
[ 19.312489] amdxdna 0000:c5:00.1: enabling device (0000 -> 0002)
[ 19.312520] asus_nb_wmi: Identified laptop model 'ASUS ROG Z13'
[ 19.312563] asus_wmi: Initialization: 0x1
[ 19.312585] asus_wmi: BIOS WMI version: 9.4
[ 19.312599] asus_wmi: SFUN value: 0x21
[ 19.312600] asus-nb-wmi asus-nb-wmi: Detected ATK, not ASUSWMI, use DSTS
[ 19.313350] mc: Linux media interface: v0.10
[ 19.313448] RAPL PMU: API unit is 2^-32 Joules, 2 fixed counters, 163840 ms ovfl timer
[ 19.313451] RAPL PMU: hw unit of domain package 2^-16 Joules
[ 19.313452] RAPL PMU: hw unit of domain core 2^-16 Joules
[ 19.313521] mousedev: PS/2 mouse device common for all mice
[ 19.332862] Bluetooth: Core ver 2.22
[ 19.332883] NET: Registered PF_BLUETOOTH protocol family
[ 19.332884] Bluetooth: HCI device and connection manager initialized
[ 19.332888] Bluetooth: HCI socket layer initialized
[ 19.332890] Bluetooth: L2CAP socket layer initialized
[ 19.332892] Bluetooth: SCO socket layer initialized
[ 19.333675] asus-nb-wmi asus-nb-wmi: Using throttle_thermal_policy for platform_profile support
[ 19.343559] input: Asus WMI hotkeys as /devices/platform/asus-nb-wmi/input/input25
[ 19.353497] input: gpio-keys as /devices/platform/ACPI0011:00/gpio-keys.1.auto/input/input26
[ 19.375477] asus_wmi: fan_curve_get_factory_default (0x00110032) failed: -19
[ 19.385350] i2c_hid_acpi i2c-ELAN9008:00: i2c_hid_get_input: IRQ triggered but there's no data
[ 19.388539] ACPI: battery: new hook: ASUS Battery Extension
[ 19.396036] input: ELAN9008:00 04F3:43C7 as /devices/platform/AMDI0010:00/i2c-0/i2c-ELAN9008:00/0018:04F3:43C7.000C/input/input27
[ 19.396103] input: ELAN9008:00 04F3:43C7 UNKNOWN as /devices/platform/AMDI0010:00/i2c-0/i2c-ELAN9008:00/0018:04F3:43C7.000C/input/input28
[ 19.396123] input: ELAN9008:00 04F3:43C7 UNKNOWN as /devices/platform/AMDI0010:00/i2c-0/i2c-ELAN9008:00/0018:04F3:43C7.000C/input/input29
[ 19.396144] input: ELAN9008:00 04F3:43C7 Stylus as /devices/platform/AMDI0010:00/i2c-0/i2c-ELAN9008:00/0018:04F3:43C7.000C/input/input30
[ 19.396175] input: ELAN9008:00 04F3:43C7 UNKNOWN as /devices/platform/AMDI0010:00/i2c-0/i2c-ELAN9008:00/0018:04F3:43C7.000C/input/input32
[ 19.396189] input: ELAN9008:00 04F3:43C7 UNKNOWN as /devices/platform/AMDI0010:00/i2c-0/i2c-ELAN9008:00/0018:04F3:43C7.000C/input/input33
[ 19.396208] input: ELAN9008:00 04F3:43C7 UNKNOWN as /devices/platform/AMDI0010:00/i2c-0/i2c-ELAN9008:00/0018:04F3:43C7.000C/input/input34
[ 19.409157] amd-pmf AMDI0105:00: No Smart PC policy present
[ 19.409161] amd-pmf AMDI0105:00: registered PMF device successfully
[ 19.414670] [drm] Initialized amdxdna_accel_driver 0.0.0 for 0000:c5:00.1 on minor 0
[ 19.430689] hid-multitouch 0018:04F3:43C7.000C: input,hidraw8: I2C HID v1.00 Device [ELAN9008:00 04F3:43C7] on i2c-ELAN9008:00
[ 19.443173] hid-generic 0018:048D:8353.000D: hidraw9: I2C HID v1.00 Device [ITE8353:00 048D:8353] on i2c-ITE8353:00
[ 19.447296] hid-sensor-hub 0018:048D:8353.000D: hidraw9: I2C HID v1.00 Device [ITE8353:00 048D:8353] on i2c-ITE8353:00
[ 19.447795] piix4_smbus 0000:00:14.0: SMBus Host Controller at 0xb00, revision 0
[ 19.447799] piix4_smbus 0000:00:14.0: Using register 0x02 for SMBus port selection
[ 19.452097] videodev: Linux video capture interface: v2.00
[ 19.453120] piix4_smbus 0000:00:14.0: Auxiliary SMBus Host Controller at 0xb20
[ 19.495978] sp5100_tco: SP5100/SB800 TCO WatchDog Timer Driver
[ 19.496163] sp5100-tco sp5100-tco: Using 0xfeb00000 for watchdog MMIO address
[ 19.496214] sp5100-tco sp5100-tco: initialized. heartbeat=60 sec (nowayout=0)
[ 19.501231] usbcore: registered new interface driver btusb
[ 19.503755] Bluetooth: hci0: HW/SW Version: 0x00000000, Build Time: 20250825220109
[ 19.504132] kvm_amd: TSC scaling supported
[ 19.504134] kvm_amd: Nested Virtualization enabled
[ 19.504135] kvm_amd: Nested Paging enabled
[ 19.504136] kvm_amd: LBR virtualization supported
[ 19.504144] kvm_amd: Virtual VMLOAD VMSAVE supported
[ 19.504144] kvm_amd: Virtual GIF supported
[ 19.504144] kvm_amd: Virtual NMI enabled
[ 19.513798] snd_acp_pci 0000:c4:00.5: enabling device (0000 -> 0002)
[ 19.513992] platform acp_asoc_acp70.0: warning: No matching ASoC machine driver found
[ 19.514853] usb 1-1: Found UVC 1.10 device ASUS 5M webcam (0bda:636e)
[ 19.517295] snd_hda_intel 0000:c4:00.1: enabling device (0000 -> 0002)
[ 19.517332] snd_hda_intel 0000:c4:00.1: Handle vga_switcheroo audio client
[ 19.517901] mt7925e 0000:c2:00.0: enabling device (0000 -> 0002)
[ 19.522421] mt7925e 0000:c2:00.0: ASIC revision: 79250000
[ 19.524475] usb 1-1: Found UVC 1.50 device ASUS 5M webcam (0bda:636e)
[ 19.525885] snd_hda_intel 0000:c4:00.1: bound 0000:c4:00.0 (ops amdgpu_dm_audio_component_bind_ops [amdgpu])
[ 19.526701] input: HD-Audio Generic HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:08.1/0000:c4:00.1/sound/card0/input36
[ 19.526734] input: HD-Audio Generic HDMI/DP,pcm=7 as /devices/pci0000:00/0000:00:08.1/0000:c4:00.1/sound/card0/input37
[ 19.526753] usbcore: registered new interface driver uvcvideo
[ 19.526756] input: HD-Audio Generic HDMI/DP,pcm=8 as /devices/pci0000:00/0000:00:08.1/0000:c4:00.1/sound/card0/input38
[ 19.526773] input: HD-Audio Generic HDMI/DP,pcm=9 as /devices/pci0000:00/0000:00:08.1/0000:c4:00.1/sound/card0/input39
[ 19.533337] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Cirrus Logic CS35L41 (35a40), Revision: B2
[ 19.533449] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Reset line busy, assuming shared reset
[ 19.540141] snd_hda_codec_alc269 hdaudioC1D0: ALC294: picked fixup for PCI SSID 1043:1fb3
[ 19.540598] snd_hda_codec_alc269 hdaudioC1D0: autoconfig for ALC294: line_outs=1 (0x17/0x0/0x0/0x0/0x0) type:speaker
[ 19.540600] snd_hda_codec_alc269 hdaudioC1D0: speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
[ 19.540600] snd_hda_codec_alc269 hdaudioC1D0: hp_outs=1 (0x21/0x0/0x0/0x0/0x0)
[ 19.540601] snd_hda_codec_alc269 hdaudioC1D0: mono: mono_out=0x0
[ 19.540602] snd_hda_codec_alc269 hdaudioC1D0: inputs:
[ 19.540602] snd_hda_codec_alc269 hdaudioC1D0: Internal Mic=0x12
[ 19.540603] snd_hda_codec_alc269 hdaudioC1D0: Internal Mic=0x13
[ 19.565574] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Falling back to default firmware.
[ 19.565890] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: cirrus/cs35l41-dsp1-spk-prot.wmfw: format 3 timestamp 0x62b5c26c
[ 19.565892] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: cirrus/cs35l41-dsp1-spk-prot.wmfw: Fri 24 Jun 2022 14:55:56 GMT Daylight Time
[ 19.569149] intel_rapl_common: Found RAPL domain package
[ 19.569151] intel_rapl_common: Found RAPL domain core
[ 19.569967] amd_atl: AMD Address Translation Library initialized
[ 19.598802] mt7925e 0000:c2:00.0: HW/SW Version: 0x8a108a10, Build Time: 20250825215832a
[ 19.946364] mt7925e 0000:c2:00.0: WM Firmware Version: ____000000, Build Time: 20250825215925
[ 19.985377] input: HD-Audio Generic Headphone as /devices/pci0000:00/0000:00:08.1/0000:c4:00.6/sound/card1/input40
[ 20.024440] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: Firmware: 400a4 vendor: 0x2 v0.58.0, 2 algorithms
[ 20.025518] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: cirrus/cs35l41-dsp1-spk-prot.bin: v0.58.0
[ 20.025526] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: spk-prot: e:\workspace\workspace\tibranch_release_playback_6.76_2\ormis\staging\default_tunings\internal\CS35L
[ 20.039883] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Calibration applied: R0=7180
[ 20.050224] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Firmware Loaded - Type: spk-prot, Gain: 17
[ 20.050250] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: CS35L41 Bound - SSID: 10431FB3, BST: 0, VSPK: 0, CH: L, FW EN: 1, SPKID: -19
[ 20.050253] snd_hda_codec_alc269 hdaudioC1D0: bound i2c-CSC3551:00-cs35l41-hda.0 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
[ 20.053019] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Falling back to default firmware.
[ 20.053249] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: cirrus/cs35l41-dsp1-spk-prot.wmfw: format 3 timestamp 0x62b5c26c
[ 20.053253] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: cirrus/cs35l41-dsp1-spk-prot.wmfw: Fri 24 Jun 2022 14:55:56 GMT Daylight Time
[ 20.150130] systemd-journald[1771]: Received client request to flush runtime journal.
[ 20.233765] NET: Registered PF_ALG protocol family
[ 20.238942] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[ 20.238949] Bluetooth: BNEP filters: protocol multicast
[ 20.238952] Bluetooth: BNEP socket layer initialized
[ 20.339444] wireguard: WireGuard 1.0.0 loaded. See www.wireguard.com for information.
[ 20.339448] wireguard: Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
[ 20.433884] Initializing XFRM netlink socket
[ 20.511902] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: Firmware: 400a4 vendor: 0x2 v0.58.0, 2 algorithms
[ 20.512956] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: cirrus/cs35l41-dsp1-spk-prot.bin: v0.58.0
[ 20.512958] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: spk-prot: e:\workspace\workspace\tibranch_release_playback_6.76_2\ormis\staging\default_tunings\internal\CS35L
[ 20.526860] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Calibration applied: R0=7196
[ 20.537227] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Firmware Loaded - Type: spk-prot, Gain: 17
[ 20.537280] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: CS35L41 Bound - SSID: 10431FB3, BST: 0, VSPK: 0, CH: R, FW EN: 1, SPKID: -19
[ 20.537284] snd_hda_codec_alc269 hdaudioC1D0: bound i2c-CSC3551:00-cs35l41-hda.1 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
[ 20.537292] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Cirrus Logic CS35L41 (35a40), Revision: B2
[ 20.735618] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[ 21.257288] Bluetooth: hci0: Device setup in 1714887 usecs
[ 21.257300] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
[ 21.342638] Bluetooth: hci0: AOSP extensions version v1.00
[ 21.342644] Bluetooth: hci0: AOSP quality report is supported
[ 21.342777] Bluetooth: MGMT ver 1.23
[ 21.600069] wlan0: authenticate with 00:11:32:bc:38:e5 (local address=a8:e2:91:52:5a:36)
[ 21.964052] wlan0: send auth to 00:11:32:bc:38:e5 (try 1/3)
[ 21.969455] wlan0: authenticated
[ 21.974428] wlan0: associate with 00:11:32:bc:38:e5 (try 1/3)
[ 21.989319] wlan0: RX AssocResp from 00:11:32:bc:38:e5 (capab=0x1511 status=0 aid=4)
[ 22.033316] wlan0: associated
[ 22.175463] wlan0: Limiting TX power to 24 (24 - 0) dBm as advertised by 00:11:32:bc:38:e5
[ 23.139322] Bluetooth: RFCOMM TTY layer initialized
[ 23.139331] Bluetooth: RFCOMM socket layer initialized
[ 23.139333] Bluetooth: RFCOMM ver 1.11
[ 31.010564] asus 0003:0B05:1A30.0005: Unmapped Asus vendor usagepage code 0xec
[ 38.368521] warning: `ThreadPoolForeg' uses wireless extensions which will stop working for Wi-Fi 7 hardware; use nl80211
[-- Attachment #3: lsusb_asus_keyboard.txt --]
[-- Type: text/plain, Size: 7029 bytes --]
Bus 003 Device 004: ID 0b05:1a30 ASUSTek Computer, Inc. GZ302EA-Keyboard
Negotiated speed: Full Speed (12Mbps)
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 [unknown]
bDeviceSubClass 0 [unknown]
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0b05 ASUSTek Computer, Inc.
idProduct 0x1a30 GZ302EA-Keyboard
bcdDevice 0.02
iManufacturer 1 ASUSTeK Computer Inc.
iProduct 2 GZ302EA-Keyboard
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x008d
bNumInterfaces 5
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 1 Keyboard
iInterface 1 ASUSTeK Computer Inc.
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 (null)
wDescriptorLength 192
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x04 EP 4 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 1 Keyboard
iInterface 1 ASUSTeK Computer Inc.
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 (null)
wDescriptorLength 77
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 1 Keyboard
iInterface 1 ASUSTeK Computer Inc.
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 (null)
wDescriptorLength 83
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 3
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 1 Keyboard
iInterface 1 ASUSTeK Computer Inc.
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 (null)
wDescriptorLength 752
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x85 EP 5 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 4
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 1 Keyboard
iInterface 1 ASUSTeK Computer Inc.
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 (null)
wDescriptorLength 328
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x86 EP 6 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Device Status: 0x0001
Self Powered
[-- Attachment #4: evtest_output.txt --]
[-- Type: text/plain, Size: 109133 bytes --]
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0xb05 product 0x1a30 version 0x110
Input device name: "Asus Keyboard"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 224 (KEY_BRIGHTNESSDOWN)
Event code 225 (KEY_BRIGHTNESSUP)
Event code 248 (KEY_MICMUTE)
Event code 256 (BTN_0)
Event code 272 (BTN_LEFT)
Event code 273 (BTN_RIGHT)
Event code 330 (BTN_TOUCH)
Event type 2 (EV_REL)
Event code 0 (REL_X)
Event code 1 (REL_Y)
Event code 6 (REL_HWHEEL)
Event code 8 (REL_WHEEL)
Event code 11 (REL_WHEEL_HI_RES)
Event code 12 (REL_HWHEEL_HI_RES)
Event type 3 (EV_ABS)
Event code 0 (ABS_X)
Value 0
Min 0
Max 3929
Resolution 31
Event code 1 (ABS_Y)
Value 0
Min 0
Max 2181
Resolution 31
Event code 40 (ABS_MISC)
Value 0
Min 0
Max 15
Event type 4 (EV_MSC)
Event code 4 (MSC_SCAN)
Key repeat handling:
Repeat type 20 (EV_REP)
Repeat code 0 (REP_DELAY)
Value 250
Repeat code 1 (REP_PERIOD)
Value 33
Properties:
Testing ... (interrupt to exit)
Event: time 1759936495.460895, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.460895, -------------- SYN_REPORT ------------
Event: time 1759936495.464807, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.464807, -------------- SYN_REPORT ------------
Event: time 1759936495.468824, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.468824, -------------- SYN_REPORT ------------
Event: time 1759936495.472856, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.472856, -------------- SYN_REPORT ------------
Event: time 1759936495.476815, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.476815, -------------- SYN_REPORT ------------
Event: time 1759936495.480824, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.480824, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.480824, -------------- SYN_REPORT ------------
Event: time 1759936495.484824, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.484824, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.484824, -------------- SYN_REPORT ------------
Event: time 1759936495.488813, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.488813, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.488813, -------------- SYN_REPORT ------------
Event: time 1759936495.493802, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.493802, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.493802, -------------- SYN_REPORT ------------
Event: time 1759936495.497939, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.497939, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.497939, -------------- SYN_REPORT ------------
Event: time 1759936495.502227, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.502227, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.502227, -------------- SYN_REPORT ------------
Event: time 1759936495.505826, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.505826, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.505826, -------------- SYN_REPORT ------------
Event: time 1759936495.509901, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.509901, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.509901, -------------- SYN_REPORT ------------
Event: time 1759936495.514221, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.514221, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.514221, -------------- SYN_REPORT ------------
Event: time 1759936495.518221, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.518221, -------------- SYN_REPORT ------------
Event: time 1759936495.521835, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936495.521835, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.521835, -------------- SYN_REPORT ------------
Event: time 1759936495.525947, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936495.525947, -------------- SYN_REPORT ------------
Event: time 1759936495.530182, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936495.530182, -------------- SYN_REPORT ------------
Event: time 1759936495.533826, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.533826, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.533826, -------------- SYN_REPORT ------------
Event: time 1759936495.537925, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.537925, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.537925, -------------- SYN_REPORT ------------
Event: time 1759936495.541848, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.541848, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.541848, -------------- SYN_REPORT ------------
Event: time 1759936495.546215, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.546215, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.546215, -------------- SYN_REPORT ------------
Event: time 1759936495.549838, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.549838, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.549838, -------------- SYN_REPORT ------------
Event: time 1759936495.553945, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.553945, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.553945, -------------- SYN_REPORT ------------
Event: time 1759936495.558422, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936495.558422, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.558422, -------------- SYN_REPORT ------------
Event: time 1759936495.562831, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.562831, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.562831, -------------- SYN_REPORT ------------
Event: time 1759936495.566843, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.566843, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.566843, -------------- SYN_REPORT ------------
Event: time 1759936495.571888, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.571888, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.571888, -------------- SYN_REPORT ------------
Event: time 1759936495.576234, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.576234, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.576234, -------------- SYN_REPORT ------------
Event: time 1759936495.579940, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.579940, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.579940, -------------- SYN_REPORT ------------
Event: time 1759936495.583871, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.583871, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.583871, -------------- SYN_REPORT ------------
Event: time 1759936495.587894, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.587894, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.587894, -------------- SYN_REPORT ------------
Event: time 1759936495.592246, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.592246, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.592246, -------------- SYN_REPORT ------------
Event: time 1759936495.596372, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.596372, -------------- SYN_REPORT ------------
Event: time 1759936495.599885, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.599885, -------------- SYN_REPORT ------------
Event: time 1759936495.603917, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.603917, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.603917, -------------- SYN_REPORT ------------
Event: time 1759936495.608308, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.608308, -------------- SYN_REPORT ------------
Event: time 1759936495.611838, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.611838, -------------- SYN_REPORT ------------
Event: time 1759936495.615925, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.615925, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.615925, -------------- SYN_REPORT ------------
Event: time 1759936495.619894, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.619894, -------------- SYN_REPORT ------------
Event: time 1759936495.623874, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.623874, -------------- SYN_REPORT ------------
Event: time 1759936495.628881, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.628881, -------------- SYN_REPORT ------------
Event: time 1759936495.632878, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.632878, -------------- SYN_REPORT ------------
Event: time 1759936495.636822, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.636822, -------------- SYN_REPORT ------------
Event: time 1759936495.641308, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.641308, -------------- SYN_REPORT ------------
Event: time 1759936495.644827, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.644827, -------------- SYN_REPORT ------------
Event: time 1759936495.648932, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.648932, -------------- SYN_REPORT ------------
Event: time 1759936495.657325, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.657325, -------------- SYN_REPORT ------------
Event: time 1759936495.664903, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.664903, -------------- SYN_REPORT ------------
Event: time 1759936495.676920, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.676920, -------------- SYN_REPORT ------------
Event: time 1759936495.686310, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.686310, -------------- SYN_REPORT ------------
Event: time 1759936495.705897, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.705897, -------------- SYN_REPORT ------------
Event: time 1759936495.715201, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.715201, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.715201, -------------- SYN_REPORT ------------
Event: time 1759936495.719216, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.719216, -------------- SYN_REPORT ------------
Event: time 1759936495.722836, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.722836, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.722836, -------------- SYN_REPORT ------------
Event: time 1759936495.726890, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.726890, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.726890, -------------- SYN_REPORT ------------
Event: time 1759936495.730896, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.730896, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.730896, -------------- SYN_REPORT ------------
Event: time 1759936495.735074, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.735074, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936495.735074, -------------- SYN_REPORT ------------
Event: time 1759936495.738872, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.738872, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936495.738872, -------------- SYN_REPORT ------------
Event: time 1759936495.742893, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.742893, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936495.742893, -------------- SYN_REPORT ------------
Event: time 1759936495.747283, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936495.747283, -------------- SYN_REPORT ------------
Event: time 1759936495.752311, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.752311, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936495.752311, -------------- SYN_REPORT ------------
Event: time 1759936495.755870, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.755870, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936495.755870, -------------- SYN_REPORT ------------
Event: time 1759936495.760246, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936495.760246, -------------- SYN_REPORT ------------
Event: time 1759936495.763907, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.763907, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936495.763907, -------------- SYN_REPORT ------------
Event: time 1759936495.768216, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936495.768216, -------------- SYN_REPORT ------------
Event: time 1759936495.771876, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.771876, -------------- SYN_REPORT ------------
Event: time 1759936495.775879, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.775879, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936495.775879, -------------- SYN_REPORT ------------
Event: time 1759936495.780301, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.780301, -------------- SYN_REPORT ------------
Event: time 1759936495.783844, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.783844, -------------- SYN_REPORT ------------
Event: time 1759936495.787923, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.787923, -------------- SYN_REPORT ------------
Event: time 1759936495.792296, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.792296, -------------- SYN_REPORT ------------
Event: time 1759936495.799922, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.799922, -------------- SYN_REPORT ------------
Event: time 1759936495.808309, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.808309, -------------- SYN_REPORT ------------
Event: time 1759936495.820909, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936495.820909, -------------- SYN_REPORT ------------
Event: time 1759936495.844900, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.844900, -------------- SYN_REPORT ------------
Event: time 1759936495.853927, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.853927, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.853927, -------------- SYN_REPORT ------------
Event: time 1759936495.857848, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.857848, -------------- SYN_REPORT ------------
Event: time 1759936495.861818, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936495.861818, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.861818, -------------- SYN_REPORT ------------
Event: time 1759936495.865802, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.865802, -------------- SYN_REPORT ------------
Event: time 1759936495.869903, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.869903, -------------- SYN_REPORT ------------
Event: time 1759936495.874932, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.874932, -------------- SYN_REPORT ------------
Event: time 1759936495.878818, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.878818, -------------- SYN_REPORT ------------
Event: time 1759936495.882803, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.882803, -------------- SYN_REPORT ------------
Event: time 1759936495.886814, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.886814, -------------- SYN_REPORT ------------
Event: time 1759936495.890817, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.890817, -------------- SYN_REPORT ------------
Event: time 1759936495.894807, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.894807, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.894807, -------------- SYN_REPORT ------------
Event: time 1759936495.898812, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.898812, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.898812, -------------- SYN_REPORT ------------
Event: time 1759936495.903034, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.903034, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.903034, -------------- SYN_REPORT ------------
Event: time 1759936495.906849, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.906849, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.906849, -------------- SYN_REPORT ------------
Event: time 1759936495.910882, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.910882, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.910882, -------------- SYN_REPORT ------------
Event: time 1759936495.915213, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.915213, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.915213, -------------- SYN_REPORT ------------
Event: time 1759936495.919200, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.919200, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.919200, -------------- SYN_REPORT ------------
Event: time 1759936495.922874, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936495.922874, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.922874, -------------- SYN_REPORT ------------
Event: time 1759936495.926884, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936495.926884, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.926884, -------------- SYN_REPORT ------------
Event: time 1759936495.931286, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936495.931286, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.931286, -------------- SYN_REPORT ------------
Event: time 1759936495.936310, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936495.936310, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.936310, -------------- SYN_REPORT ------------
Event: time 1759936495.938843, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936495.938843, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.938843, -------------- SYN_REPORT ------------
Event: time 1759936495.943866, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936495.943866, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.943866, -------------- SYN_REPORT ------------
Event: time 1759936495.947898, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936495.947898, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.947898, -------------- SYN_REPORT ------------
Event: time 1759936495.952308, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936495.952308, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.952308, -------------- SYN_REPORT ------------
Event: time 1759936495.955850, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936495.955850, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.955850, -------------- SYN_REPORT ------------
Event: time 1759936495.960077, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936495.960077, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.960077, -------------- SYN_REPORT ------------
Event: time 1759936495.964314, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936495.964314, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936495.964314, -------------- SYN_REPORT ------------
Event: time 1759936495.968216, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936495.968216, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.968216, -------------- SYN_REPORT ------------
Event: time 1759936495.971884, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936495.971884, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.971884, -------------- SYN_REPORT ------------
Event: time 1759936495.975924, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936495.975924, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.975924, -------------- SYN_REPORT ------------
Event: time 1759936495.980213, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936495.980213, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.980213, -------------- SYN_REPORT ------------
Event: time 1759936495.983844, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936495.983844, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936495.983844, -------------- SYN_REPORT ------------
Event: time 1759936495.987876, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936495.987876, -------------- SYN_REPORT ------------
Event: time 1759936495.991821, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936495.991821, -------------- SYN_REPORT ------------
Event: time 1759936495.995816, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936495.995816, -------------- SYN_REPORT ------------
Event: time 1759936496.001806, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936496.001806, -------------- SYN_REPORT ------------
Event: time 1759936496.005811, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936496.005811, -------------- SYN_REPORT ------------
Event: time 1759936496.009813, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936496.009813, -------------- SYN_REPORT ------------
Event: time 1759936496.013817, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936496.013817, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.013817, -------------- SYN_REPORT ------------
Event: time 1759936496.017809, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.017809, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.017809, -------------- SYN_REPORT ------------
Event: time 1759936496.021808, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.021808, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.021808, -------------- SYN_REPORT ------------
Event: time 1759936496.025819, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.025819, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.025819, -------------- SYN_REPORT ------------
Event: time 1759936496.029792, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.029792, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.029792, -------------- SYN_REPORT ------------
Event: time 1759936496.033812, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.033812, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.033812, -------------- SYN_REPORT ------------
Event: time 1759936496.037805, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.037805, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.037805, -------------- SYN_REPORT ------------
Event: time 1759936496.041799, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.041799, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.041799, -------------- SYN_REPORT ------------
Event: time 1759936496.045809, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.045809, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.045809, -------------- SYN_REPORT ------------
Event: time 1759936496.049791, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.049791, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.049791, -------------- SYN_REPORT ------------
Event: time 1759936496.053810, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.053810, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.053810, -------------- SYN_REPORT ------------
Event: time 1759936496.058811, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.058811, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.058811, -------------- SYN_REPORT ------------
Event: time 1759936496.061801, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.061801, -------------- SYN_REPORT ------------
Event: time 1759936496.066803, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.066803, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.066803, -------------- SYN_REPORT ------------
Event: time 1759936496.070816, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.070816, -------------- SYN_REPORT ------------
Event: time 1759936496.074809, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.074809, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.074809, -------------- SYN_REPORT ------------
Event: time 1759936496.078800, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.078800, -------------- SYN_REPORT ------------
Event: time 1759936496.082800, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.082800, -------------- SYN_REPORT ------------
Event: time 1759936496.086816, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.086816, -------------- SYN_REPORT ------------
Event: time 1759936496.090800, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.090800, -------------- SYN_REPORT ------------
Event: time 1759936496.094803, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.094803, -------------- SYN_REPORT ------------
Event: time 1759936496.098815, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.098815, -------------- SYN_REPORT ------------
Event: time 1759936496.102808, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.102808, -------------- SYN_REPORT ------------
Event: time 1759936496.106795, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.106795, -------------- SYN_REPORT ------------
Event: time 1759936496.110795, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.110795, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.110795, -------------- SYN_REPORT ------------
Event: time 1759936496.114815, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.114815, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.114815, -------------- SYN_REPORT ------------
Event: time 1759936496.118805, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.118805, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.118805, -------------- SYN_REPORT ------------
Event: time 1759936496.123804, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.123804, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.123804, -------------- SYN_REPORT ------------
Event: time 1759936496.127802, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.127802, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.127802, -------------- SYN_REPORT ------------
Event: time 1759936496.131808, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.131808, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.131808, -------------- SYN_REPORT ------------
Event: time 1759936496.135808, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.135808, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.135808, -------------- SYN_REPORT ------------
Event: time 1759936496.139814, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.139814, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.139814, -------------- SYN_REPORT ------------
Event: time 1759936496.143807, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.143807, -------------- SYN_REPORT ------------
Event: time 1759936496.148822, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.148822, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.148822, -------------- SYN_REPORT ------------
Event: time 1759936496.152810, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.152810, -------------- SYN_REPORT ------------
Event: time 1759936496.156800, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.156800, -------------- SYN_REPORT ------------
Event: time 1759936496.160804, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.160804, -------------- SYN_REPORT ------------
Event: time 1759936496.164814, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.164814, -------------- SYN_REPORT ------------
Event: time 1759936496.168794, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.168794, -------------- SYN_REPORT ------------
Event: time 1759936496.172810, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.172810, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.172810, -------------- SYN_REPORT ------------
Event: time 1759936496.176806, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.176806, -------------- SYN_REPORT ------------
Event: time 1759936496.180808, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.180808, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.180808, -------------- SYN_REPORT ------------
Event: time 1759936496.184816, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.184816, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.184816, -------------- SYN_REPORT ------------
Event: time 1759936496.189808, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.189808, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.189808, -------------- SYN_REPORT ------------
Event: time 1759936496.193813, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.193813, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.193813, -------------- SYN_REPORT ------------
Event: time 1759936496.197799, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.197799, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.197799, -------------- SYN_REPORT ------------
Event: time 1759936496.201812, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.201812, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.201812, -------------- SYN_REPORT ------------
Event: time 1759936496.205808, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.205808, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.205808, -------------- SYN_REPORT ------------
Event: time 1759936496.209810, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.209810, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.209810, -------------- SYN_REPORT ------------
Event: time 1759936496.213814, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.213814, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.213814, -------------- SYN_REPORT ------------
Event: time 1759936496.217799, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.217799, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.217799, -------------- SYN_REPORT ------------
Event: time 1759936496.221795, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.221795, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.221795, -------------- SYN_REPORT ------------
Event: time 1759936496.225814, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.225814, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.225814, -------------- SYN_REPORT ------------
Event: time 1759936496.229810, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.229810, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.229810, -------------- SYN_REPORT ------------
Event: time 1759936496.233802, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.233802, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.233802, -------------- SYN_REPORT ------------
Event: time 1759936496.237802, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.237802, -------------- SYN_REPORT ------------
Event: time 1759936496.241798, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.241798, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.241798, -------------- SYN_REPORT ------------
Event: time 1759936496.245787, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.245787, -------------- SYN_REPORT ------------
Event: time 1759936496.249802, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.249802, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.249802, -------------- SYN_REPORT ------------
Event: time 1759936496.253823, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.253823, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.253823, -------------- SYN_REPORT ------------
Event: time 1759936496.258819, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.258819, -------------- SYN_REPORT ------------
Event: time 1759936496.263813, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.263813, -------------- SYN_REPORT ------------
Event: time 1759936496.267782, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.267782, -------------- SYN_REPORT ------------
Event: time 1759936496.271797, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.271797, -------------- SYN_REPORT ------------
Event: time 1759936496.279808, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.279808, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.279808, -------------- SYN_REPORT ------------
Event: time 1759936496.287801, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.287801, -------------- SYN_REPORT ------------
Event: time 1759936496.295792, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.295792, -------------- SYN_REPORT ------------
Event: time 1759936496.299784, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.299784, -------------- SYN_REPORT ------------
Event: time 1759936496.307807, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.307807, -------------- SYN_REPORT ------------
Event: time 1759936496.352808, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.352808, -------------- SYN_REPORT ------------
Event: time 1759936496.356793, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.356793, -------------- SYN_REPORT ------------
Event: time 1759936496.360792, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.360792, -------------- SYN_REPORT ------------
Event: time 1759936496.364812, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.364812, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.364812, -------------- SYN_REPORT ------------
Event: time 1759936496.368801, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.368801, -------------- SYN_REPORT ------------
Event: time 1759936496.372803, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.372803, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.372803, -------------- SYN_REPORT ------------
Event: time 1759936496.376796, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.376796, -------------- SYN_REPORT ------------
Event: time 1759936496.380805, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.380805, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.380805, -------------- SYN_REPORT ------------
Event: time 1759936496.384803, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.384803, -------------- SYN_REPORT ------------
Event: time 1759936496.389803, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.389803, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.389803, -------------- SYN_REPORT ------------
Event: time 1759936496.393795, type 2 (EV_REL), code 1 (REL_Y), value -3
Event: time 1759936496.393795, -------------- SYN_REPORT ------------
Event: time 1759936496.398805, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.398805, type 2 (EV_REL), code 1 (REL_Y), value -3
Event: time 1759936496.398805, -------------- SYN_REPORT ------------
Event: time 1759936496.401799, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.401799, -------------- SYN_REPORT ------------
Event: time 1759936496.406799, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.406799, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.406799, -------------- SYN_REPORT ------------
Event: time 1759936496.410793, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.410793, -------------- SYN_REPORT ------------
Event: time 1759936496.414804, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.414804, -------------- SYN_REPORT ------------
Event: time 1759936496.418806, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.418806, -------------- SYN_REPORT ------------
Event: time 1759936496.422802, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.422802, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.422802, -------------- SYN_REPORT ------------
Event: time 1759936496.426795, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.426795, -------------- SYN_REPORT ------------
Event: time 1759936496.431071, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.431071, -------------- SYN_REPORT ------------
Event: time 1759936496.434833, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.434833, -------------- SYN_REPORT ------------
Event: time 1759936496.438793, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.438793, -------------- SYN_REPORT ------------
Event: time 1759936496.442814, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.442814, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.442814, -------------- SYN_REPORT ------------
Event: time 1759936496.446806, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.446806, -------------- SYN_REPORT ------------
Event: time 1759936496.454796, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.454796, -------------- SYN_REPORT ------------
Event: time 1759936496.463806, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.463806, -------------- SYN_REPORT ------------
Event: time 1759936496.479806, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.479806, -------------- SYN_REPORT ------------
Event: time 1759936496.503805, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.503805, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.503805, -------------- SYN_REPORT ------------
Event: time 1759936496.511798, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.511798, -------------- SYN_REPORT ------------
Event: time 1759936496.515797, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.515797, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.515797, -------------- SYN_REPORT ------------
Event: time 1759936496.520810, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.520810, -------------- SYN_REPORT ------------
Event: time 1759936496.525809, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.525809, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.525809, -------------- SYN_REPORT ------------
Event: time 1759936496.529803, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.529803, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.529803, -------------- SYN_REPORT ------------
Event: time 1759936496.533796, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.533796, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.533796, -------------- SYN_REPORT ------------
Event: time 1759936496.537798, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.537798, type 2 (EV_REL), code 1 (REL_Y), value 3
Event: time 1759936496.537798, -------------- SYN_REPORT ------------
Event: time 1759936496.541809, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.541809, type 2 (EV_REL), code 1 (REL_Y), value 3
Event: time 1759936496.541809, -------------- SYN_REPORT ------------
Event: time 1759936496.545806, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.545806, type 2 (EV_REL), code 1 (REL_Y), value 3
Event: time 1759936496.545806, -------------- SYN_REPORT ------------
Event: time 1759936496.549788, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.549788, type 2 (EV_REL), code 1 (REL_Y), value 3
Event: time 1759936496.549788, -------------- SYN_REPORT ------------
Event: time 1759936496.553809, type 2 (EV_REL), code 1 (REL_Y), value 3
Event: time 1759936496.553809, -------------- SYN_REPORT ------------
Event: time 1759936496.557803, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.557803, type 2 (EV_REL), code 1 (REL_Y), value 3
Event: time 1759936496.557803, -------------- SYN_REPORT ------------
Event: time 1759936496.561793, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.561793, -------------- SYN_REPORT ------------
Event: time 1759936496.565794, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.565794, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.565794, -------------- SYN_REPORT ------------
Event: time 1759936496.569809, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.569809, -------------- SYN_REPORT ------------
Event: time 1759936496.573804, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.573804, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.573804, -------------- SYN_REPORT ------------
Event: time 1759936496.577793, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.577793, -------------- SYN_REPORT ------------
Event: time 1759936496.582797, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.582797, -------------- SYN_REPORT ------------
Event: time 1759936496.586809, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936496.586809, -------------- SYN_REPORT ------------
Event: time 1759936496.590802, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.590802, -------------- SYN_REPORT ------------
Event: time 1759936496.594791, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.594791, -------------- SYN_REPORT ------------
Event: time 1759936496.598808, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.598808, -------------- SYN_REPORT ------------
Event: time 1759936496.602808, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.602808, -------------- SYN_REPORT ------------
Event: time 1759936496.606797, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.606797, -------------- SYN_REPORT ------------
Event: time 1759936496.610797, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.610797, -------------- SYN_REPORT ------------
Event: time 1759936496.614808, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.614808, -------------- SYN_REPORT ------------
Event: time 1759936496.618802, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.618802, -------------- SYN_REPORT ------------
Event: time 1759936496.626792, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.626792, -------------- SYN_REPORT ------------
Event: time 1759936496.634797, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.634797, -------------- SYN_REPORT ------------
Event: time 1759936496.638790, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.638790, -------------- SYN_REPORT ------------
Event: time 1759936496.647808, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.647808, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.647808, -------------- SYN_REPORT ------------
Event: time 1759936496.655792, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.655792, -------------- SYN_REPORT ------------
Event: time 1759936496.660797, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.660797, -------------- SYN_REPORT ------------
Event: time 1759936496.664808, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.664808, -------------- SYN_REPORT ------------
Event: time 1759936496.668802, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.668802, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.668802, -------------- SYN_REPORT ------------
Event: time 1759936496.672792, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.672792, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.672792, -------------- SYN_REPORT ------------
Event: time 1759936496.676792, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.676792, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.676792, -------------- SYN_REPORT ------------
Event: time 1759936496.680808, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.680808, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.680808, -------------- SYN_REPORT ------------
Event: time 1759936496.684798, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.684798, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.684798, -------------- SYN_REPORT ------------
Event: time 1759936496.688797, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936496.688797, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.688797, -------------- SYN_REPORT ------------
Event: time 1759936496.692808, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936496.692808, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.692808, -------------- SYN_REPORT ------------
Event: time 1759936496.696802, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936496.696802, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.696802, -------------- SYN_REPORT ------------
Event: time 1759936496.700795, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936496.700795, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.700795, -------------- SYN_REPORT ------------
Event: time 1759936496.704794, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.704794, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.704794, -------------- SYN_REPORT ------------
Event: time 1759936496.708808, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.708808, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.708808, -------------- SYN_REPORT ------------
Event: time 1759936496.712801, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.712801, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.712801, -------------- SYN_REPORT ------------
Event: time 1759936496.717797, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.717797, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.717797, -------------- SYN_REPORT ------------
Event: time 1759936496.721799, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.721799, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936496.721799, -------------- SYN_REPORT ------------
Event: time 1759936496.725801, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.725801, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.725801, -------------- SYN_REPORT ------------
Event: time 1759936496.729801, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.729801, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.729801, -------------- SYN_REPORT ------------
Event: time 1759936496.733804, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.733804, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.733804, -------------- SYN_REPORT ------------
Event: time 1759936496.737781, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.737781, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.737781, -------------- SYN_REPORT ------------
Event: time 1759936496.741793, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.741793, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.741793, -------------- SYN_REPORT ------------
Event: time 1759936496.745801, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.745801, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.745801, -------------- SYN_REPORT ------------
Event: time 1759936496.749797, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.749797, -------------- SYN_REPORT ------------
Event: time 1759936496.753800, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.753800, -------------- SYN_REPORT ------------
Event: time 1759936496.757800, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.757800, -------------- SYN_REPORT ------------
Event: time 1759936496.765788, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936496.765788, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.765788, -------------- SYN_REPORT ------------
Event: time 1759936496.773794, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.773794, -------------- SYN_REPORT ------------
Event: time 1759936496.783782, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.783782, -------------- SYN_REPORT ------------
Event: time 1759936496.795795, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.795795, -------------- SYN_REPORT ------------
Event: time 1759936496.803799, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.803799, -------------- SYN_REPORT ------------
Event: time 1759936496.807790, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.807790, -------------- SYN_REPORT ------------
Event: time 1759936496.811793, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.811793, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.811793, -------------- SYN_REPORT ------------
Event: time 1759936496.815779, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.815779, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.815779, -------------- SYN_REPORT ------------
Event: time 1759936496.819798, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.819798, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.819798, -------------- SYN_REPORT ------------
Event: time 1759936496.823792, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.823792, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.823792, -------------- SYN_REPORT ------------
Event: time 1759936496.827783, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.827783, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.827783, -------------- SYN_REPORT ------------
Event: time 1759936496.831795, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.831795, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.831795, -------------- SYN_REPORT ------------
Event: time 1759936496.835781, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.835781, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.835781, -------------- SYN_REPORT ------------
Event: time 1759936496.840790, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.840790, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.840790, -------------- SYN_REPORT ------------
Event: time 1759936496.843779, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.843779, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.843779, -------------- SYN_REPORT ------------
Event: time 1759936496.848805, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.848805, -------------- SYN_REPORT ------------
Event: time 1759936496.852806, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.852806, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.852806, -------------- SYN_REPORT ------------
Event: time 1759936496.856791, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.856791, -------------- SYN_REPORT ------------
Event: time 1759936496.860790, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.860790, -------------- SYN_REPORT ------------
Event: time 1759936496.864805, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.864805, -------------- SYN_REPORT ------------
Event: time 1759936496.868801, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.868801, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936496.868801, -------------- SYN_REPORT ------------
Event: time 1759936496.872790, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.872790, -------------- SYN_REPORT ------------
Event: time 1759936496.876798, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.876798, -------------- SYN_REPORT ------------
Event: time 1759936496.880801, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.880801, -------------- SYN_REPORT ------------
Event: time 1759936496.884793, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.884793, -------------- SYN_REPORT ------------
Event: time 1759936496.888784, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.888784, -------------- SYN_REPORT ------------
Event: time 1759936496.892805, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.892805, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.892805, -------------- SYN_REPORT ------------
Event: time 1759936496.896804, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.896804, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.896804, -------------- SYN_REPORT ------------
Event: time 1759936496.900794, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.900794, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.900794, -------------- SYN_REPORT ------------
Event: time 1759936496.905801, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.905801, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.905801, -------------- SYN_REPORT ------------
Event: time 1759936496.909811, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.909811, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.909811, -------------- SYN_REPORT ------------
Event: time 1759936496.913801, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.913801, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.913801, -------------- SYN_REPORT ------------
Event: time 1759936496.917789, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.917789, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.917789, -------------- SYN_REPORT ------------
Event: time 1759936496.921792, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936496.921792, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.921792, -------------- SYN_REPORT ------------
Event: time 1759936496.925804, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.925804, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.925804, -------------- SYN_REPORT ------------
Event: time 1759936496.930804, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.930804, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.930804, -------------- SYN_REPORT ------------
Event: time 1759936496.934792, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.934792, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.934792, -------------- SYN_REPORT ------------
Event: time 1759936496.938784, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.938784, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.938784, -------------- SYN_REPORT ------------
Event: time 1759936496.942804, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.942804, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.942804, -------------- SYN_REPORT ------------
Event: time 1759936496.946803, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.946803, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.946803, -------------- SYN_REPORT ------------
Event: time 1759936496.950788, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.950788, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.950788, -------------- SYN_REPORT ------------
Event: time 1759936496.954790, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.954790, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.954790, -------------- SYN_REPORT ------------
Event: time 1759936496.958803, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.958803, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.958803, -------------- SYN_REPORT ------------
Event: time 1759936496.963804, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.963804, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.963804, -------------- SYN_REPORT ------------
Event: time 1759936496.966793, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.966793, -------------- SYN_REPORT ------------
Event: time 1759936496.971781, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.971781, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.971781, -------------- SYN_REPORT ------------
Event: time 1759936496.975803, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.975803, -------------- SYN_REPORT ------------
Event: time 1759936496.979799, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.979799, -------------- SYN_REPORT ------------
Event: time 1759936496.983788, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.983788, -------------- SYN_REPORT ------------
Event: time 1759936496.991803, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936496.991803, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936496.991803, -------------- SYN_REPORT ------------
Event: time 1759936497.003803, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.003803, -------------- SYN_REPORT ------------
Event: time 1759936497.011790, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.011790, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.011790, -------------- SYN_REPORT ------------
Event: time 1759936497.048834, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.048834, -------------- SYN_REPORT ------------
Event: time 1759936497.056805, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.056805, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.056805, -------------- SYN_REPORT ------------
Event: time 1759936497.060789, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.060789, -------------- SYN_REPORT ------------
Event: time 1759936497.064803, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.064803, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.064803, -------------- SYN_REPORT ------------
Event: time 1759936497.068798, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.068798, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.068798, -------------- SYN_REPORT ------------
Event: time 1759936497.073783, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.073783, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.073783, -------------- SYN_REPORT ------------
Event: time 1759936497.077787, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.077787, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.077787, -------------- SYN_REPORT ------------
Event: time 1759936497.081799, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.081799, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.081799, -------------- SYN_REPORT ------------
Event: time 1759936497.085802, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.085802, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.085802, -------------- SYN_REPORT ------------
Event: time 1759936497.090784, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.090784, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.090784, -------------- SYN_REPORT ------------
Event: time 1759936497.093786, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.093786, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.093786, -------------- SYN_REPORT ------------
Event: time 1759936497.098802, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.098802, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.098802, -------------- SYN_REPORT ------------
Event: time 1759936497.102803, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.102803, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.102803, -------------- SYN_REPORT ------------
Event: time 1759936497.106787, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.106787, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.106787, -------------- SYN_REPORT ------------
Event: time 1759936497.110787, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.110787, type 2 (EV_REL), code 1 (REL_Y), value -3
Event: time 1759936497.110787, -------------- SYN_REPORT ------------
Event: time 1759936497.114802, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.114802, type 2 (EV_REL), code 1 (REL_Y), value -3
Event: time 1759936497.114802, -------------- SYN_REPORT ------------
Event: time 1759936497.118798, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.118798, -------------- SYN_REPORT ------------
Event: time 1759936497.122786, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.122786, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.122786, -------------- SYN_REPORT ------------
Event: time 1759936497.126782, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.126782, -------------- SYN_REPORT ------------
Event: time 1759936497.130802, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.130802, -------------- SYN_REPORT ------------
Event: time 1759936497.134789, type 2 (EV_REL), code 1 (REL_Y), value -2
Event: time 1759936497.134789, -------------- SYN_REPORT ------------
Event: time 1759936497.138772, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.138772, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.138772, -------------- SYN_REPORT ------------
Event: time 1759936497.142808, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.142808, -------------- SYN_REPORT ------------
Event: time 1759936497.146808, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.146808, -------------- SYN_REPORT ------------
Event: time 1759936497.150793, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.150793, -------------- SYN_REPORT ------------
Event: time 1759936497.159795, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.159795, -------------- SYN_REPORT ------------
Event: time 1759936497.167789, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.167789, -------------- SYN_REPORT ------------
Event: time 1759936497.183786, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.183786, -------------- SYN_REPORT ------------
Event: time 1759936497.207794, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.207794, -------------- SYN_REPORT ------------
Event: time 1759936497.216797, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.216797, -------------- SYN_REPORT ------------
Event: time 1759936497.221787, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.221787, -------------- SYN_REPORT ------------
Event: time 1759936497.225801, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.225801, -------------- SYN_REPORT ------------
Event: time 1759936497.229794, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.229794, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.229794, -------------- SYN_REPORT ------------
Event: time 1759936497.237785, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.237785, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.237785, -------------- SYN_REPORT ------------
Event: time 1759936497.241800, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.241800, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.241800, -------------- SYN_REPORT ------------
Event: time 1759936497.245779, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.245779, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.245779, -------------- SYN_REPORT ------------
Event: time 1759936497.249782, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.249782, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.249782, -------------- SYN_REPORT ------------
Event: time 1759936497.253808, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.253808, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.253808, -------------- SYN_REPORT ------------
Event: time 1759936497.257801, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.257801, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.257801, -------------- SYN_REPORT ------------
Event: time 1759936497.261779, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.261779, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936497.261779, -------------- SYN_REPORT ------------
Event: time 1759936497.265790, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.265790, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936497.265790, -------------- SYN_REPORT ------------
Event: time 1759936497.269801, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.269801, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936497.269801, -------------- SYN_REPORT ------------
Event: time 1759936497.273793, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.273793, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936497.273793, -------------- SYN_REPORT ------------
Event: time 1759936497.278789, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.278789, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936497.278789, -------------- SYN_REPORT ------------
Event: time 1759936497.282787, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.282787, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936497.282787, -------------- SYN_REPORT ------------
Event: time 1759936497.286799, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.286799, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936497.286799, -------------- SYN_REPORT ------------
Event: time 1759936497.290793, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.290793, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936497.290793, -------------- SYN_REPORT ------------
Event: time 1759936497.294782, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.294782, type 2 (EV_REL), code 1 (REL_Y), value 2
Event: time 1759936497.294782, -------------- SYN_REPORT ------------
Event: time 1759936497.298800, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.298800, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.298800, -------------- SYN_REPORT ------------
Event: time 1759936497.302800, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.302800, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.302800, -------------- SYN_REPORT ------------
Event: time 1759936497.306795, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.306795, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.306795, -------------- SYN_REPORT ------------
Event: time 1759936497.310778, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.310778, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.310778, -------------- SYN_REPORT ------------
Event: time 1759936497.314801, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.314801, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.314801, -------------- SYN_REPORT ------------
Event: time 1759936497.318799, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.318799, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.318799, -------------- SYN_REPORT ------------
Event: time 1759936497.322780, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.322780, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.322780, -------------- SYN_REPORT ------------
Event: time 1759936497.326783, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.326783, -------------- SYN_REPORT ------------
Event: time 1759936497.330788, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.330788, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.330788, -------------- SYN_REPORT ------------
Event: time 1759936497.334798, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.334798, -------------- SYN_REPORT ------------
Event: time 1759936497.339788, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.339788, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.339788, -------------- SYN_REPORT ------------
Event: time 1759936497.342799, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.342799, -------------- SYN_REPORT ------------
Event: time 1759936497.347782, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.347782, -------------- SYN_REPORT ------------
Event: time 1759936497.351803, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.351803, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.351803, -------------- SYN_REPORT ------------
Event: time 1759936497.356790, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.356790, -------------- SYN_REPORT ------------
Event: time 1759936497.360790, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.360790, -------------- SYN_REPORT ------------
Event: time 1759936497.364800, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.364800, -------------- SYN_REPORT ------------
Event: time 1759936497.368799, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.368799, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.368799, -------------- SYN_REPORT ------------
Event: time 1759936497.372787, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.372787, -------------- SYN_REPORT ------------
Event: time 1759936497.376783, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.376783, -------------- SYN_REPORT ------------
Event: time 1759936497.380798, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.380798, -------------- SYN_REPORT ------------
Event: time 1759936497.384792, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.384792, -------------- SYN_REPORT ------------
Event: time 1759936497.388782, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.388782, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.388782, -------------- SYN_REPORT ------------
Event: time 1759936497.392798, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.392798, -------------- SYN_REPORT ------------
Event: time 1759936497.396798, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.396798, -------------- SYN_REPORT ------------
Event: time 1759936497.400792, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.400792, -------------- SYN_REPORT ------------
Event: time 1759936497.404782, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.404782, -------------- SYN_REPORT ------------
Event: time 1759936497.409194, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.409194, -------------- SYN_REPORT ------------
Event: time 1759936497.416907, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.416907, -------------- SYN_REPORT ------------
Event: time 1759936497.433837, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.433837, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.433837, -------------- SYN_REPORT ------------
Event: time 1759936497.461798, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.461798, -------------- SYN_REPORT ------------
Event: time 1759936497.465784, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.465784, -------------- SYN_REPORT ------------
Event: time 1759936497.470326, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.470326, -------------- SYN_REPORT ------------
Event: time 1759936497.473826, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.473826, -------------- SYN_REPORT ------------
Event: time 1759936497.479916, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.479916, -------------- SYN_REPORT ------------
Event: time 1759936497.483806, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.483806, -------------- SYN_REPORT ------------
Event: time 1759936497.487864, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.487864, -------------- SYN_REPORT ------------
Event: time 1759936497.492350, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.492350, -------------- SYN_REPORT ------------
Event: time 1759936497.495843, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.495843, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.495843, -------------- SYN_REPORT ------------
Event: time 1759936497.499860, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.499860, -------------- SYN_REPORT ------------
Event: time 1759936497.504323, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.504323, -------------- SYN_REPORT ------------
Event: time 1759936497.508132, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.508132, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.508132, -------------- SYN_REPORT ------------
Event: time 1759936497.511823, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.511823, -------------- SYN_REPORT ------------
Event: time 1759936497.515884, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936497.515884, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.515884, -------------- SYN_REPORT ------------
Event: time 1759936497.519869, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.519869, -------------- SYN_REPORT ------------
Event: time 1759936497.523809, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936497.523809, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.523809, -------------- SYN_REPORT ------------
Event: time 1759936497.527788, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.527788, -------------- SYN_REPORT ------------
Event: time 1759936497.531796, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.531796, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.531796, -------------- SYN_REPORT ------------
Event: time 1759936497.535798, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.535798, -------------- SYN_REPORT ------------
Event: time 1759936497.539796, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.539796, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.539796, -------------- SYN_REPORT ------------
Event: time 1759936497.543776, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.543776, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.543776, -------------- SYN_REPORT ------------
Event: time 1759936497.547797, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.547797, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.547797, -------------- SYN_REPORT ------------
Event: time 1759936497.551819, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.551819, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.551819, -------------- SYN_REPORT ------------
Event: time 1759936497.555802, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936497.555802, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.555802, -------------- SYN_REPORT ------------
Event: time 1759936497.559793, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.559793, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.559793, -------------- SYN_REPORT ------------
Event: time 1759936497.564797, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.564797, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.564797, -------------- SYN_REPORT ------------
Event: time 1759936497.569796, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.569796, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.569796, -------------- SYN_REPORT ------------
Event: time 1759936497.573796, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.573796, -------------- SYN_REPORT ------------
Event: time 1759936497.577780, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.577780, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.577780, -------------- SYN_REPORT ------------
Event: time 1759936497.581795, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.581795, -------------- SYN_REPORT ------------
Event: time 1759936497.585796, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.585796, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.585796, -------------- SYN_REPORT ------------
Event: time 1759936497.589789, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.589789, -------------- SYN_REPORT ------------
Event: time 1759936497.593781, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.593781, -------------- SYN_REPORT ------------
Event: time 1759936497.597795, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.597795, -------------- SYN_REPORT ------------
Event: time 1759936497.601796, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.601796, -------------- SYN_REPORT ------------
Event: time 1759936497.605840, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.605840, -------------- SYN_REPORT ------------
Event: time 1759936497.610037, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.610037, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.610037, -------------- SYN_REPORT ------------
Event: time 1759936497.613814, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.613814, -------------- SYN_REPORT ------------
Event: time 1759936497.617799, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.617799, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.617799, -------------- SYN_REPORT ------------
Event: time 1759936497.622795, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936497.622795, -------------- SYN_REPORT ------------
Event: time 1759936497.626780, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.626780, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.626780, -------------- SYN_REPORT ------------
Event: time 1759936497.630789, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.630789, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.630789, -------------- SYN_REPORT ------------
Event: time 1759936497.634795, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.634795, -------------- SYN_REPORT ------------
Event: time 1759936497.638859, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.638859, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.638859, -------------- SYN_REPORT ------------
Event: time 1759936497.643318, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.643318, -------------- SYN_REPORT ------------
Event: time 1759936497.646895, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.646895, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.646895, -------------- SYN_REPORT ------------
Event: time 1759936497.650855, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.650855, -------------- SYN_REPORT ------------
Event: time 1759936497.654865, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.654865, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.654865, -------------- SYN_REPORT ------------
Event: time 1759936497.666881, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936497.666881, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.666881, -------------- SYN_REPORT ------------
Event: time 1759936497.679886, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.679886, -------------- SYN_REPORT ------------
Event: time 1759936497.691896, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.691896, -------------- SYN_REPORT ------------
Event: time 1759936497.701370, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.701370, -------------- SYN_REPORT ------------
Event: time 1759936497.708905, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.708905, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.708905, -------------- SYN_REPORT ------------
Event: time 1759936497.712820, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.712820, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.712820, -------------- SYN_REPORT ------------
Event: time 1759936497.716823, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.716823, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.716823, -------------- SYN_REPORT ------------
Event: time 1759936497.721066, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.721066, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.721066, -------------- SYN_REPORT ------------
Event: time 1759936497.725378, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936497.725378, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.725378, -------------- SYN_REPORT ------------
Event: time 1759936497.728908, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936497.728908, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.728908, -------------- SYN_REPORT ------------
Event: time 1759936497.732851, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936497.732851, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.732851, -------------- SYN_REPORT ------------
Event: time 1759936497.737370, type 2 (EV_REL), code 0 (REL_X), value 4
Event: time 1759936497.737370, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.737370, -------------- SYN_REPORT ------------
Event: time 1759936497.741377, type 2 (EV_REL), code 0 (REL_X), value 4
Event: time 1759936497.741377, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.741377, -------------- SYN_REPORT ------------
Event: time 1759936497.744827, type 2 (EV_REL), code 0 (REL_X), value 4
Event: time 1759936497.744827, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.744827, -------------- SYN_REPORT ------------
Event: time 1759936497.748838, type 2 (EV_REL), code 0 (REL_X), value 4
Event: time 1759936497.748838, -------------- SYN_REPORT ------------
Event: time 1759936497.753192, type 2 (EV_REL), code 0 (REL_X), value 4
Event: time 1759936497.753192, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936497.753192, -------------- SYN_REPORT ------------
Event: time 1759936497.756874, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936497.756874, -------------- SYN_REPORT ------------
Event: time 1759936497.760861, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936497.760861, -------------- SYN_REPORT ------------
Event: time 1759936497.765854, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936497.765854, -------------- SYN_REPORT ------------
Event: time 1759936497.770308, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936497.770308, -------------- SYN_REPORT ------------
Event: time 1759936497.773871, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.773871, -------------- SYN_REPORT ------------
Event: time 1759936497.777857, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.777857, -------------- SYN_REPORT ------------
Event: time 1759936497.782303, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936497.782303, -------------- SYN_REPORT ------------
Event: time 1759936497.785910, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.785910, -------------- SYN_REPORT ------------
Event: time 1759936497.790160, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.790160, -------------- SYN_REPORT ------------
Event: time 1759936497.793833, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.793833, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.793833, -------------- SYN_REPORT ------------
Event: time 1759936497.798377, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.798377, -------------- SYN_REPORT ------------
Event: time 1759936497.801903, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.801903, -------------- SYN_REPORT ------------
Event: time 1759936497.805826, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.805826, -------------- SYN_REPORT ------------
Event: time 1759936497.813908, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.813908, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.813908, -------------- SYN_REPORT ------------
Event: time 1759936497.822889, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.822889, -------------- SYN_REPORT ------------
Event: time 1759936497.835848, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936497.835848, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.835848, -------------- SYN_REPORT ------------
Event: time 1759936497.843849, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.843849, -------------- SYN_REPORT ------------
Event: time 1759936497.851822, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936497.851822, -------------- SYN_REPORT ------------
Event: time 1759936501.044777, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.044777, -------------- SYN_REPORT ------------
Event: time 1759936501.048751, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.048751, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.048751, -------------- SYN_REPORT ------------
Event: time 1759936501.057742, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.057742, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.057742, -------------- SYN_REPORT ------------
Event: time 1759936501.065745, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.065745, -------------- SYN_REPORT ------------
Event: time 1759936501.069747, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.069747, -------------- SYN_REPORT ------------
Event: time 1759936501.078150, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.078150, -------------- SYN_REPORT ------------
Event: time 1759936501.089956, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.089956, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.089956, -------------- SYN_REPORT ------------
Event: time 1759936501.101825, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.101825, -------------- SYN_REPORT ------------
Event: time 1759936501.122840, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.122840, -------------- SYN_REPORT ------------
Event: time 1759936501.167819, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.167819, -------------- SYN_REPORT ------------
Event: time 1759936501.177146, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.177146, -------------- SYN_REPORT ------------
Event: time 1759936501.180836, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.180836, -------------- SYN_REPORT ------------
Event: time 1759936501.184827, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.184827, -------------- SYN_REPORT ------------
Event: time 1759936501.189138, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.189138, -------------- SYN_REPORT ------------
Event: time 1759936501.193147, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.193147, -------------- SYN_REPORT ------------
Event: time 1759936501.196811, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936501.196811, -------------- SYN_REPORT ------------
Event: time 1759936501.201064, type 2 (EV_REL), code 0 (REL_X), value 4
Event: time 1759936501.201064, -------------- SYN_REPORT ------------
Event: time 1759936501.204841, type 2 (EV_REL), code 0 (REL_X), value 4
Event: time 1759936501.204841, -------------- SYN_REPORT ------------
Event: time 1759936501.208762, type 2 (EV_REL), code 0 (REL_X), value 4
Event: time 1759936501.208762, -------------- SYN_REPORT ------------
Event: time 1759936501.212735, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936501.212735, -------------- SYN_REPORT ------------
Event: time 1759936501.216747, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936501.216747, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.216747, -------------- SYN_REPORT ------------
Event: time 1759936501.220748, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.220748, -------------- SYN_REPORT ------------
Event: time 1759936501.224734, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.224734, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.224734, -------------- SYN_REPORT ------------
Event: time 1759936501.228749, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.228749, -------------- SYN_REPORT ------------
Event: time 1759936501.233750, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.233750, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.233750, -------------- SYN_REPORT ------------
Event: time 1759936501.237742, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.237742, -------------- SYN_REPORT ------------
Event: time 1759936501.241737, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.241737, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.241737, -------------- SYN_REPORT ------------
Event: time 1759936501.245748, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.245748, -------------- SYN_REPORT ------------
Event: time 1759936501.249737, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.249737, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.249737, -------------- SYN_REPORT ------------
Event: time 1759936501.253729, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.253729, -------------- SYN_REPORT ------------
Event: time 1759936501.257738, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.257738, -------------- SYN_REPORT ------------
Event: time 1759936501.261729, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.261729, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.261729, -------------- SYN_REPORT ------------
Event: time 1759936501.265742, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.265742, -------------- SYN_REPORT ------------
Event: time 1759936501.269737, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.269737, -------------- SYN_REPORT ------------
Event: time 1759936501.274718, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.274718, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.274718, -------------- SYN_REPORT ------------
Event: time 1759936501.283170, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.283170, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.283170, -------------- SYN_REPORT ------------
Event: time 1759936501.286764, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.286764, -------------- SYN_REPORT ------------
Event: time 1759936501.290803, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.290803, -------------- SYN_REPORT ------------
Event: time 1759936501.295922, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.295922, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.295922, -------------- SYN_REPORT ------------
Event: time 1759936501.300136, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.300136, -------------- SYN_REPORT ------------
Event: time 1759936501.304144, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.304144, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.304144, -------------- SYN_REPORT ------------
Event: time 1759936501.307816, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.307816, -------------- SYN_REPORT ------------
Event: time 1759936501.312145, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.312145, -------------- SYN_REPORT ------------
Event: time 1759936501.316144, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.316144, -------------- SYN_REPORT ------------
Event: time 1759936501.319772, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.319772, -------------- SYN_REPORT ------------
Event: time 1759936501.323847, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.323847, -------------- SYN_REPORT ------------
Event: time 1759936501.328143, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936501.328143, -------------- SYN_REPORT ------------
Event: time 1759936501.331778, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936501.331778, -------------- SYN_REPORT ------------
Event: time 1759936501.335811, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936501.335811, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.335811, -------------- SYN_REPORT ------------
Event: time 1759936501.340132, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936501.340132, -------------- SYN_REPORT ------------
Event: time 1759936501.344145, type 2 (EV_REL), code 0 (REL_X), value 4
Event: time 1759936501.344145, -------------- SYN_REPORT ------------
Event: time 1759936501.347772, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936501.347772, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.347772, -------------- SYN_REPORT ------------
Event: time 1759936501.351835, type 2 (EV_REL), code 0 (REL_X), value 3
Event: time 1759936501.351835, -------------- SYN_REPORT ------------
Event: time 1759936501.356146, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.356146, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.356146, -------------- SYN_REPORT ------------
Event: time 1759936501.360769, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.360769, -------------- SYN_REPORT ------------
Event: time 1759936501.364741, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.364741, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.364741, -------------- SYN_REPORT ------------
Event: time 1759936501.368731, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.368731, -------------- SYN_REPORT ------------
Event: time 1759936501.373073, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.373073, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.373073, -------------- SYN_REPORT ------------
Event: time 1759936501.377147, type 2 (EV_REL), code 0 (REL_X), value 2
Event: time 1759936501.377147, -------------- SYN_REPORT ------------
Event: time 1759936501.380764, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.380764, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.380764, -------------- SYN_REPORT ------------
Event: time 1759936501.384829, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.384829, -------------- SYN_REPORT ------------
Event: time 1759936501.390123, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.390123, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.390123, -------------- SYN_REPORT ------------
Event: time 1759936501.394143, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.394143, -------------- SYN_REPORT ------------
Event: time 1759936501.397771, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.397771, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.397771, -------------- SYN_REPORT ------------
Event: time 1759936501.402024, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.402024, -------------- SYN_REPORT ------------
Event: time 1759936501.410143, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.410143, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.410143, -------------- SYN_REPORT ------------
Event: time 1759936501.418113, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.418113, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.418113, -------------- SYN_REPORT ------------
Event: time 1759936501.438845, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.438845, -------------- SYN_REPORT ------------
Event: time 1759936501.450821, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.450821, -------------- SYN_REPORT ------------
Event: time 1759936501.454776, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.454776, -------------- SYN_REPORT ------------
Event: time 1759936501.458741, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.458741, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.458741, -------------- SYN_REPORT ------------
Event: time 1759936501.462733, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.462733, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.462733, -------------- SYN_REPORT ------------
Event: time 1759936501.466737, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.466737, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.466737, -------------- SYN_REPORT ------------
Event: time 1759936501.470816, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936501.470816, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.470816, -------------- SYN_REPORT ------------
Event: time 1759936501.474807, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936501.474807, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.474807, -------------- SYN_REPORT ------------
Event: time 1759936501.479115, type 2 (EV_REL), code 0 (REL_X), value -4
Event: time 1759936501.479115, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.479115, -------------- SYN_REPORT ------------
Event: time 1759936501.483146, type 2 (EV_REL), code 0 (REL_X), value -4
Event: time 1759936501.483146, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.483146, -------------- SYN_REPORT ------------
Event: time 1759936501.486772, type 2 (EV_REL), code 0 (REL_X), value -4
Event: time 1759936501.486772, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.486772, -------------- SYN_REPORT ------------
Event: time 1759936501.491800, type 2 (EV_REL), code 0 (REL_X), value -4
Event: time 1759936501.491800, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.491800, -------------- SYN_REPORT ------------
Event: time 1759936501.495924, type 2 (EV_REL), code 0 (REL_X), value -5
Event: time 1759936501.495924, -------------- SYN_REPORT ------------
Event: time 1759936501.500142, type 2 (EV_REL), code 0 (REL_X), value -5
Event: time 1759936501.500142, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.500142, -------------- SYN_REPORT ------------
Event: time 1759936501.504142, type 2 (EV_REL), code 0 (REL_X), value -4
Event: time 1759936501.504142, -------------- SYN_REPORT ------------
Event: time 1759936501.507810, type 2 (EV_REL), code 0 (REL_X), value -4
Event: time 1759936501.507810, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.507810, -------------- SYN_REPORT ------------
Event: time 1759936501.512144, type 2 (EV_REL), code 0 (REL_X), value -4
Event: time 1759936501.512144, -------------- SYN_REPORT ------------
Event: time 1759936501.516137, type 2 (EV_REL), code 0 (REL_X), value -4
Event: time 1759936501.516137, -------------- SYN_REPORT ------------
Event: time 1759936501.519797, type 2 (EV_REL), code 0 (REL_X), value -4
Event: time 1759936501.519797, -------------- SYN_REPORT ------------
Event: time 1759936501.523809, type 2 (EV_REL), code 0 (REL_X), value -4
Event: time 1759936501.523809, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.523809, -------------- SYN_REPORT ------------
Event: time 1759936501.528145, type 2 (EV_REL), code 0 (REL_X), value -4
Event: time 1759936501.528145, -------------- SYN_REPORT ------------
Event: time 1759936501.533142, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936501.533142, -------------- SYN_REPORT ------------
Event: time 1759936501.537135, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936501.537135, -------------- SYN_REPORT ------------
Event: time 1759936501.540823, type 2 (EV_REL), code 0 (REL_X), value -3
Event: time 1759936501.540823, -------------- SYN_REPORT ------------
Event: time 1759936501.545139, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.545139, -------------- SYN_REPORT ------------
Event: time 1759936501.549145, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.549145, -------------- SYN_REPORT ------------
Event: time 1759936501.552794, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.552794, -------------- SYN_REPORT ------------
Event: time 1759936501.556958, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.556958, -------------- SYN_REPORT ------------
Event: time 1759936501.562141, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.562141, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.562141, -------------- SYN_REPORT ------------
Event: time 1759936501.565957, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.565957, -------------- SYN_REPORT ------------
Event: time 1759936501.569773, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.569773, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.569773, -------------- SYN_REPORT ------------
Event: time 1759936501.573833, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.573833, -------------- SYN_REPORT ------------
Event: time 1759936501.578143, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.578143, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.578143, -------------- SYN_REPORT ------------
Event: time 1759936501.581773, type 2 (EV_REL), code 0 (REL_X), value -2
Event: time 1759936501.581773, -------------- SYN_REPORT ------------
Event: time 1759936501.585811, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.585811, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.585811, -------------- SYN_REPORT ------------
Event: time 1759936501.590140, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.590140, -------------- SYN_REPORT ------------
Event: time 1759936501.593818, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.593818, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.593818, -------------- SYN_REPORT ------------
Event: time 1759936501.597774, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.597774, -------------- SYN_REPORT ------------
Event: time 1759936501.601840, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.601840, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.601840, -------------- SYN_REPORT ------------
Event: time 1759936501.606140, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.606140, -------------- SYN_REPORT ------------
Event: time 1759936501.610143, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.610143, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.610143, -------------- SYN_REPORT ------------
Event: time 1759936501.613805, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.613805, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.613805, -------------- SYN_REPORT ------------
Event: time 1759936501.618805, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.618805, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.618805, -------------- SYN_REPORT ------------
Event: time 1759936501.623142, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.623142, -------------- SYN_REPORT ------------
Event: time 1759936501.627141, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.627141, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.627141, -------------- SYN_REPORT ------------
Event: time 1759936501.630762, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.630762, -------------- SYN_REPORT ------------
Event: time 1759936501.634820, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.634820, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.634820, -------------- SYN_REPORT ------------
Event: time 1759936501.643137, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.643137, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.643137, -------------- SYN_REPORT ------------
Event: time 1759936501.651140, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.651140, -------------- SYN_REPORT ------------
Event: time 1759936501.655137, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1759936501.655137, -------------- SYN_REPORT ------------
Event: time 1759936501.666781, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1759936501.666781, -------------- SYN_REPORT ------------
Event: time 1759936501.704842, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1759936501.704842, -------------- SYN_REPORT ------------
Event: time 1759936501.708767, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1759936501.708767, -------------- SYN_REPORT ------------
^ permalink raw reply
* [PATCH v3 00/19 5.15.y] Backport minmax.h updates from v6.17-rc7
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
This series backports 19 patches to update minmax.h in the 5.15.y branch,
aligning it with v6.17-rc7.
The ultimate goal is to synchronize all longterm branches so that they
include the full set of minmax.h changes.
6.12.y was already backported and changes are part of v6.12.49.
6.6.y was already backported and changes are part of v6.6.109.
6.1.y was already backported and changes are currently in the 6.1-stable
tree.
The key motivation is to bring in commit d03eba99f5bf ("minmax: allow
min()/max()/clamp() if the arguments have the same signedness"), which
is missing in kernel 5.10.y.
In mainline, this change enables min()/max()/clamp() to accept mixed
argument types, provided both have the same signedness. Without it,
backported patches that use these forms may trigger compiler warnings,
which escalate to build failures when -Werror is enabled.
Changes in v3:
- Fix fs/erofs/zdata.h in patch 06/19 to use MIN_T instead of min_t to
fix build on the following patch (07/19):
In file included from ./include/linux/kernel.h:16,
from ./include/linux/list.h:9,
from ./include/linux/wait.h:7,
from ./include/linux/wait_bit.h:8,
from ./include/linux/fs.h:6,
from fs/erofs/internal.h:10,
from fs/erofs/zdata.h:9,
from fs/erofs/zdata.c:6:
fs/erofs/zdata.c: In function ‘z_erofs_decompress_pcluster’:
fs/erofs/zdata.h:185:61: error: ISO C90 forbids variable length array ‘pages_onstack’ [-Werror=vla]
185 | min_t(unsigned int, THREAD_SIZE / 8 / sizeof(struct page *), 96U)
| ^~~~
./include/linux/minmax.h:49:23: note: in definition of macro ‘__cmp_once_unique’
49 | ({ type ux = (x); type uy = (y); __cmp(op, ux, uy); })
| ^
./include/linux/minmax.h:164:27: note: in expansion of macro ‘__cmp_once’
164 | #define min_t(type, x, y) __cmp_once(min, type, x, y)
| ^~~~~~~~~~
fs/erofs/zdata.h:185:9: note: in expansion of macro ‘min_t’
185 | min_t(unsigned int, THREAD_SIZE / 8 / sizeof(struct page *), 96U)
| ^~~~~
fs/erofs/zdata.c:847:36: note: in expansion of macro ‘Z_EROFS_VMAP_ONSTACK_PAGES’
847 | struct page *pages_onstack[Z_EROFS_VMAP_ONSTACK_PAGES];
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
- Increase test coverage using `make allyesconfig` and
`make allmodconfig` for arm64, arm, x86_64 and i386 architectures.
Changes in v2:
- Fix the order of patches 6 - 10 according to order in mainline branch.
- Use same style of [ Upstream commit <HASH> ] in all patches.
Andy Shevchenko (1):
minmax: deduplicate __unconst_integer_typeof()
David Laight (8):
minmax: fix indentation of __cmp_once() and __clamp_once()
minmax.h: add whitespace around operators and after commas
minmax.h: update some comments
minmax.h: reduce the #define expansion of min(), max() and clamp()
minmax.h: use BUILD_BUG_ON_MSG() for the lo < hi test in clamp()
minmax.h: move all the clamp() definitions after the min/max() ones
minmax.h: simplify the variants of clamp()
minmax.h: remove some #defines that are only expanded once
Herve Codina (1):
minmax: Introduce {min,max}_array()
Linus Torvalds (8):
minmax: avoid overly complicated constant expressions in VM code
minmax: add a few more MIN_T/MAX_T users
minmax: simplify and clarify min_t()/max_t() implementation
minmax: make generic MIN() and MAX() macros available everywhere
minmax: don't use max() in situations that want a C constant
expression
minmax: simplify min()/max()/clamp() implementation
minmax: improve macro expansion and type checking
minmax: fix up min3() and max3() too
Matthew Wilcox (Oracle) (1):
minmax: add in_range() macro
arch/arm/mm/pageattr.c | 6 +-
arch/um/drivers/mconsole_user.c | 2 +
arch/x86/mm/pgtable.c | 2 +-
drivers/edac/sb_edac.c | 4 +-
drivers/edac/skx_common.h | 1 -
drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 +
.../drm/amd/display/modules/hdcp/hdcp_ddc.c | 2 +
.../drm/amd/pm/powerplay/hwmgr/ppevvmath.h | 14 +-
.../amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 2 +
.../drm/arm/display/include/malidp_utils.h | 2 +-
.../display/komeda/komeda_pipeline_state.c | 24 +-
drivers/gpu/drm/drm_color_mgmt.c | 2 +-
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 6 -
drivers/gpu/drm/radeon/evergreen_cs.c | 2 +
drivers/hwmon/adt7475.c | 24 +-
drivers/input/touchscreen/cyttsp4_core.c | 2 +-
drivers/irqchip/irq-sun6i-r.c | 2 +-
drivers/md/dm-integrity.c | 4 +-
drivers/media/dvb-frontends/stv0367_priv.h | 3 +
.../net/ethernet/chelsio/cxgb3/cxgb3_main.c | 18 +-
.../net/ethernet/stmicro/stmmac/stmmac_main.c | 2 +-
drivers/net/fjes/fjes_main.c | 4 +-
drivers/nfc/pn544/i2c.c | 2 -
drivers/platform/x86/sony-laptop.c | 1 -
drivers/scsi/isci/init.c | 6 +-
.../pci/hive_isp_css_include/math_support.h | 5 -
drivers/virt/acrn/ioreq.c | 4 +-
fs/btrfs/misc.h | 2 -
fs/btrfs/tree-checker.c | 2 +-
fs/erofs/zdata.h | 2 +-
fs/ext2/balloc.c | 2 -
fs/ext4/ext4.h | 2 -
fs/ufs/util.h | 6 -
include/linux/compiler.h | 9 +
include/linux/minmax.h | 264 +++++++++++++-----
kernel/trace/preemptirq_delay_test.c | 2 -
lib/btree.c | 1 -
lib/decompress_unlzma.c | 2 +
lib/logic_pio.c | 3 -
lib/vsprintf.c | 2 +-
lib/zstd/zstd_internal.h | 2 -
mm/zsmalloc.c | 1 -
net/ipv4/proc.c | 2 +-
net/ipv6/proc.c | 2 +-
net/netfilter/nf_nat_core.c | 6 +-
net/tipc/core.h | 2 +-
net/tipc/link.c | 10 +-
tools/testing/selftests/vm/mremap_test.c | 2 +
48 files changed, 290 insertions(+), 184 deletions(-)
--
2.47.3
^ permalink raw reply
* [PATCH v3 01/19 5.15.y] minmax: add in_range() macro
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: "Matthew Wilcox (Oracle)" <willy@infradead.org>
[ Upstream commit f9bff0e31881d03badf191d3b0005839391f5f2b ]
Patch series "New page table range API", v6.
This patchset changes the API used by the MM to set up page table entries.
The four APIs are:
set_ptes(mm, addr, ptep, pte, nr)
update_mmu_cache_range(vma, addr, ptep, nr)
flush_dcache_folio(folio)
flush_icache_pages(vma, page, nr)
flush_dcache_folio() isn't technically new, but no architecture
implemented it, so I've done that for them. The old APIs remain around
but are mostly implemented by calling the new interfaces.
The new APIs are based around setting up N page table entries at once.
The N entries belong to the same PMD, the same folio and the same VMA, so
ptep++ is a legitimate operation, and locking is taken care of for you.
Some architectures can do a better job of it than just a loop, but I have
hesitated to make too deep a change to architectures I don't understand
well.
One thing I have changed in every architecture is that PG_arch_1 is now a
per-folio bit instead of a per-page bit when used for dcache clean/dirty
tracking. This was something that would have to happen eventually, and it
makes sense to do it now rather than iterate over every page involved in a
cache flush and figure out if it needs to happen.
The point of all this is better performance, and Fengwei Yin has measured
improvement on x86. I suspect you'll see improvement on your architecture
too. Try the new will-it-scale test mentioned here:
https://lore.kernel.org/linux-mm/20230206140639.538867-5-fengwei.yin@intel.com/
You'll need to run it on an XFS filesystem and have
CONFIG_TRANSPARENT_HUGEPAGE set.
This patchset is the basis for much of the anonymous large folio work
being done by Ryan, so it's received quite a lot of testing over the last
few months.
This patch (of 38):
Determine if a value lies within a range more efficiently (subtraction +
comparison vs two comparisons and an AND). It also has useful (under some
circumstances) behaviour if the range exceeds the maximum value of the
type. Convert all the conflicting definitions of in_range() within the
kernel; some can use the generic definition while others need their own
definition.
Link: https://lkml.kernel.org/r/20230802151406.3735276-1-willy@infradead.org
Link: https://lkml.kernel.org/r/20230802151406.3735276-2-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
arch/arm/mm/pageattr.c | 6 ++---
.../drm/arm/display/include/malidp_utils.h | 2 +-
.../display/komeda/komeda_pipeline_state.c | 24 ++++++++---------
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 6 -----
.../net/ethernet/chelsio/cxgb3/cxgb3_main.c | 18 ++++++-------
drivers/virt/acrn/ioreq.c | 4 +--
fs/btrfs/misc.h | 2 --
fs/ext2/balloc.c | 2 --
fs/ext4/ext4.h | 2 --
fs/ufs/util.h | 6 -----
include/linux/minmax.h | 27 +++++++++++++++++++
lib/logic_pio.c | 3 ---
net/netfilter/nf_nat_core.c | 6 ++---
net/tipc/core.h | 2 +-
net/tipc/link.c | 10 +++----
15 files changed, 63 insertions(+), 57 deletions(-)
diff --git a/arch/arm/mm/pageattr.c b/arch/arm/mm/pageattr.c
index 9790ae3a8c68..3b3bfa825fad 100644
--- a/arch/arm/mm/pageattr.c
+++ b/arch/arm/mm/pageattr.c
@@ -25,7 +25,7 @@ static int change_page_range(pte_t *ptep, unsigned long addr, void *data)
return 0;
}
-static bool in_range(unsigned long start, unsigned long size,
+static bool range_in_range(unsigned long start, unsigned long size,
unsigned long range_start, unsigned long range_end)
{
return start >= range_start && start < range_end &&
@@ -46,8 +46,8 @@ static int change_memory_common(unsigned long addr, int numpages,
if (!size)
return 0;
- if (!in_range(start, size, MODULES_VADDR, MODULES_END) &&
- !in_range(start, size, VMALLOC_START, VMALLOC_END))
+ if (!range_in_range(start, size, MODULES_VADDR, MODULES_END) &&
+ !range_in_range(start, size, VMALLOC_START, VMALLOC_END))
return -EINVAL;
data.set_mask = set_mask;
diff --git a/drivers/gpu/drm/arm/display/include/malidp_utils.h b/drivers/gpu/drm/arm/display/include/malidp_utils.h
index 49a1d7f3539c..9f83baac6ed8 100644
--- a/drivers/gpu/drm/arm/display/include/malidp_utils.h
+++ b/drivers/gpu/drm/arm/display/include/malidp_utils.h
@@ -35,7 +35,7 @@ static inline void set_range(struct malidp_range *rg, u32 start, u32 end)
rg->end = end;
}
-static inline bool in_range(struct malidp_range *rg, u32 v)
+static inline bool malidp_in_range(struct malidp_range *rg, u32 v)
{
return (v >= rg->start) && (v <= rg->end);
}
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
index c956fda918be..4aa527ca765b 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
@@ -305,12 +305,12 @@ komeda_layer_check_cfg(struct komeda_layer *layer,
if (komeda_fb_check_src_coords(kfb, src_x, src_y, src_w, src_h))
return -EINVAL;
- if (!in_range(&layer->hsize_in, src_w)) {
+ if (!malidp_in_range(&layer->hsize_in, src_w)) {
DRM_DEBUG_ATOMIC("invalidate src_w %d.\n", src_w);
return -EINVAL;
}
- if (!in_range(&layer->vsize_in, src_h)) {
+ if (!malidp_in_range(&layer->vsize_in, src_h)) {
DRM_DEBUG_ATOMIC("invalidate src_h %d.\n", src_h);
return -EINVAL;
}
@@ -452,14 +452,14 @@ komeda_scaler_check_cfg(struct komeda_scaler *scaler,
hsize_out = dflow->out_w;
vsize_out = dflow->out_h;
- if (!in_range(&scaler->hsize, hsize_in) ||
- !in_range(&scaler->hsize, hsize_out)) {
+ if (!malidp_in_range(&scaler->hsize, hsize_in) ||
+ !malidp_in_range(&scaler->hsize, hsize_out)) {
DRM_DEBUG_ATOMIC("Invalid horizontal sizes");
return -EINVAL;
}
- if (!in_range(&scaler->vsize, vsize_in) ||
- !in_range(&scaler->vsize, vsize_out)) {
+ if (!malidp_in_range(&scaler->vsize, vsize_in) ||
+ !malidp_in_range(&scaler->vsize, vsize_out)) {
DRM_DEBUG_ATOMIC("Invalid vertical sizes");
return -EINVAL;
}
@@ -574,13 +574,13 @@ komeda_splitter_validate(struct komeda_splitter *splitter,
return -EINVAL;
}
- if (!in_range(&splitter->hsize, dflow->in_w)) {
+ if (!malidp_in_range(&splitter->hsize, dflow->in_w)) {
DRM_DEBUG_ATOMIC("split in_w:%d is out of the acceptable range.\n",
dflow->in_w);
return -EINVAL;
}
- if (!in_range(&splitter->vsize, dflow->in_h)) {
+ if (!malidp_in_range(&splitter->vsize, dflow->in_h)) {
DRM_DEBUG_ATOMIC("split in_h: %d exceeds the acceptable range.\n",
dflow->in_h);
return -EINVAL;
@@ -624,13 +624,13 @@ komeda_merger_validate(struct komeda_merger *merger,
return -EINVAL;
}
- if (!in_range(&merger->hsize_merged, output->out_w)) {
+ if (!malidp_in_range(&merger->hsize_merged, output->out_w)) {
DRM_DEBUG_ATOMIC("merged_w: %d is out of the accepted range.\n",
output->out_w);
return -EINVAL;
}
- if (!in_range(&merger->vsize_merged, output->out_h)) {
+ if (!malidp_in_range(&merger->vsize_merged, output->out_h)) {
DRM_DEBUG_ATOMIC("merged_h: %d is out of the accepted range.\n",
output->out_h);
return -EINVAL;
@@ -866,8 +866,8 @@ void komeda_complete_data_flow_cfg(struct komeda_layer *layer,
* input/output range.
*/
if (dflow->en_scaling && scaler)
- dflow->en_split = !in_range(&scaler->hsize, dflow->in_w) ||
- !in_range(&scaler->hsize, dflow->out_w);
+ dflow->en_split = !malidp_in_range(&scaler->hsize, dflow->in_w) ||
+ !malidp_in_range(&scaler->hsize, dflow->out_w);
}
static bool merger_is_available(struct komeda_pipeline *pipe,
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index f1daa923f346..9215322fc915 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -676,12 +676,6 @@ struct block_header {
u32 data[];
};
-/* this should be a general kernel helper */
-static int in_range(u32 addr, u32 start, u32 size)
-{
- return addr >= start && addr < start + size;
-}
-
static bool fw_block_mem(struct a6xx_gmu_bo *bo, const struct block_header *blk)
{
if (!in_range(blk->addr, bo->iova, bo->size))
diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
index 07568aa15873..3c3d8ffc3c8b 100644
--- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
@@ -2135,7 +2135,7 @@ static const struct ethtool_ops cxgb_ethtool_ops = {
.set_link_ksettings = set_link_ksettings,
};
-static int in_range(int val, int lo, int hi)
+static int cxgb_in_range(int val, int lo, int hi)
{
return val < 0 || (val <= hi && val >= lo);
}
@@ -2171,19 +2171,19 @@ static int cxgb_siocdevprivate(struct net_device *dev,
return -EINVAL;
if (t.qset_idx >= SGE_QSETS)
return -EINVAL;
- if (!in_range(t.intr_lat, 0, M_NEWTIMER) ||
- !in_range(t.cong_thres, 0, 255) ||
- !in_range(t.txq_size[0], MIN_TXQ_ENTRIES,
+ if (!cxgb_in_range(t.intr_lat, 0, M_NEWTIMER) ||
+ !cxgb_in_range(t.cong_thres, 0, 255) ||
+ !cxgb_in_range(t.txq_size[0], MIN_TXQ_ENTRIES,
MAX_TXQ_ENTRIES) ||
- !in_range(t.txq_size[1], MIN_TXQ_ENTRIES,
+ !cxgb_in_range(t.txq_size[1], MIN_TXQ_ENTRIES,
MAX_TXQ_ENTRIES) ||
- !in_range(t.txq_size[2], MIN_CTRL_TXQ_ENTRIES,
+ !cxgb_in_range(t.txq_size[2], MIN_CTRL_TXQ_ENTRIES,
MAX_CTRL_TXQ_ENTRIES) ||
- !in_range(t.fl_size[0], MIN_FL_ENTRIES,
+ !cxgb_in_range(t.fl_size[0], MIN_FL_ENTRIES,
MAX_RX_BUFFERS) ||
- !in_range(t.fl_size[1], MIN_FL_ENTRIES,
+ !cxgb_in_range(t.fl_size[1], MIN_FL_ENTRIES,
MAX_RX_JUMBO_BUFFERS) ||
- !in_range(t.rspq_size, MIN_RSPQ_ENTRIES,
+ !cxgb_in_range(t.rspq_size, MIN_RSPQ_ENTRIES,
MAX_RSPQ_ENTRIES))
return -EINVAL;
diff --git a/drivers/virt/acrn/ioreq.c b/drivers/virt/acrn/ioreq.c
index 80b2e3f0e276..5446e5bbbff8 100644
--- a/drivers/virt/acrn/ioreq.c
+++ b/drivers/virt/acrn/ioreq.c
@@ -356,7 +356,7 @@ static bool handle_cf8cfc(struct acrn_vm *vm,
return is_handled;
}
-static bool in_range(struct acrn_ioreq_range *range,
+static bool acrn_in_range(struct acrn_ioreq_range *range,
struct acrn_io_request *req)
{
bool ret = false;
@@ -394,7 +394,7 @@ static struct acrn_ioreq_client *find_ioreq_client(struct acrn_vm *vm,
list_for_each_entry(client, &vm->ioreq_clients, list) {
read_lock_bh(&client->range_lock);
list_for_each_entry(range, &client->range_list, list) {
- if (in_range(range, req)) {
+ if (acrn_in_range(range, req)) {
found = client;
break;
}
diff --git a/fs/btrfs/misc.h b/fs/btrfs/misc.h
index 340f995652f2..5269923c8a7d 100644
--- a/fs/btrfs/misc.h
+++ b/fs/btrfs/misc.h
@@ -8,8 +8,6 @@
#include <linux/math64.h>
#include <linux/rbtree.h>
-#define in_range(b, first, len) ((b) >= (first) && (b) < (first) + (len))
-
static inline void cond_wake_up(struct wait_queue_head *wq)
{
/*
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c
index 9bf086821eb3..1d9380c5523b 100644
--- a/fs/ext2/balloc.c
+++ b/fs/ext2/balloc.c
@@ -36,8 +36,6 @@
*/
-#define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1)
-
struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
unsigned int block_group,
struct buffer_head ** bh)
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index ed477af15b6b..3e5c91e8b036 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -3830,8 +3830,6 @@ static inline void set_bitmap_uptodate(struct buffer_head *bh)
set_bit(BH_BITMAP_UPTODATE, &(bh)->b_state);
}
-#define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1)
-
/* For ioend & aio unwritten conversion wait queues */
#define EXT4_WQ_HASH_SZ 37
#define ext4_ioend_wq(v) (&ext4__ioend_wq[((unsigned long)(v)) %\
diff --git a/fs/ufs/util.h b/fs/ufs/util.h
index 4931bec1a01c..89247193d96d 100644
--- a/fs/ufs/util.h
+++ b/fs/ufs/util.h
@@ -11,12 +11,6 @@
#include <linux/fs.h>
#include "swab.h"
-
-/*
- * some useful macros
- */
-#define in_range(b,first,len) ((b)>=(first)&&(b)<(first)+(len))
-
/*
* functions used for retyping
*/
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index dd52969698f7..d4bc394b449e 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -5,6 +5,7 @@
#include <linux/build_bug.h>
#include <linux/compiler.h>
#include <linux/const.h>
+#include <linux/types.h>
/*
* min()/max()/clamp() macros must accomplish three things:
@@ -192,6 +193,32 @@
*/
#define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi)
+static inline bool in_range64(u64 val, u64 start, u64 len)
+{
+ return (val - start) < len;
+}
+
+static inline bool in_range32(u32 val, u32 start, u32 len)
+{
+ return (val - start) < len;
+}
+
+/**
+ * in_range - Determine if a value lies within a range.
+ * @val: Value to test.
+ * @start: First value in range.
+ * @len: Number of values in range.
+ *
+ * This is more efficient than "if (start <= val && val < (start + len))".
+ * It also gives a different answer if @start + @len overflows the size of
+ * the type by a sufficient amount to encompass @val. Decide for yourself
+ * which behaviour you want, or prove that start + len never overflow.
+ * Do not blindly replace one form with the other.
+ */
+#define in_range(val, start, len) \
+ ((sizeof(start) | sizeof(len) | sizeof(val)) <= sizeof(u32) ? \
+ in_range32(val, start, len) : in_range64(val, start, len))
+
/**
* swap - swap values of @a and @b
* @a: first value
diff --git a/lib/logic_pio.c b/lib/logic_pio.c
index 07b4b9a1f54b..2ea564a40064 100644
--- a/lib/logic_pio.c
+++ b/lib/logic_pio.c
@@ -20,9 +20,6 @@
static LIST_HEAD(io_range_list);
static DEFINE_MUTEX(io_range_mutex);
-/* Consider a kernel general helper for this */
-#define in_range(b, first, len) ((b) >= (first) && (b) < (first) + (len))
-
/**
* logic_pio_register_range - register logical PIO range for a host
* @new_range: pointer to the IO range to be registered.
diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c
index b776b3af78ca..1dd160b84d05 100644
--- a/net/netfilter/nf_nat_core.c
+++ b/net/netfilter/nf_nat_core.c
@@ -242,7 +242,7 @@ static bool l4proto_in_range(const struct nf_conntrack_tuple *tuple,
/* If we source map this tuple so reply looks like reply_tuple, will
* that meet the constraints of range.
*/
-static int in_range(const struct nf_conntrack_tuple *tuple,
+static int nf_in_range(const struct nf_conntrack_tuple *tuple,
const struct nf_nat_range2 *range)
{
/* If we are supposed to map IPs, then we must be in the
@@ -291,7 +291,7 @@ find_appropriate_src(struct net *net,
&ct->tuplehash[IP_CT_DIR_REPLY].tuple);
result->dst = tuple->dst;
- if (in_range(result, range))
+ if (nf_in_range(result, range))
return 1;
}
}
@@ -523,7 +523,7 @@ get_unique_tuple(struct nf_conntrack_tuple *tuple,
if (maniptype == NF_NAT_MANIP_SRC &&
!(range->flags & NF_NAT_RANGE_PROTO_RANDOM_ALL)) {
/* try the original tuple first */
- if (in_range(orig_tuple, range)) {
+ if (nf_in_range(orig_tuple, range)) {
if (!nf_nat_used_tuple(orig_tuple, ct)) {
*tuple = *orig_tuple;
return;
diff --git a/net/tipc/core.h b/net/tipc/core.h
index 0a3f7a70a50a..7eccd97e0609 100644
--- a/net/tipc/core.h
+++ b/net/tipc/core.h
@@ -197,7 +197,7 @@ static inline int less(u16 left, u16 right)
return less_eq(left, right) && (mod(right) != mod(left));
}
-static inline int in_range(u16 val, u16 min, u16 max)
+static inline int tipc_in_range(u16 val, u16 min, u16 max)
{
return !less(val, min) && !more(val, max);
}
diff --git a/net/tipc/link.c b/net/tipc/link.c
index b098b74516d1..c8433ec7661d 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -1623,7 +1623,7 @@ static int tipc_link_advance_transmq(struct tipc_link *l, struct tipc_link *r,
last_ga->bgack_cnt);
}
/* Check against the last Gap ACK block */
- if (in_range(seqno, start, end))
+ if (tipc_in_range(seqno, start, end))
continue;
/* Update/release the packet peer is acking */
bc_has_acked = true;
@@ -2251,12 +2251,12 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
strncpy(if_name, data, TIPC_MAX_IF_NAME);
/* Update own tolerance if peer indicates a non-zero value */
- if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) {
+ if (tipc_in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) {
l->tolerance = peers_tol;
l->bc_rcvlink->tolerance = peers_tol;
}
/* Update own priority if peer's priority is higher */
- if (in_range(peers_prio, l->priority + 1, TIPC_MAX_LINK_PRI))
+ if (tipc_in_range(peers_prio, l->priority + 1, TIPC_MAX_LINK_PRI))
l->priority = peers_prio;
/* If peer is going down we want full re-establish cycle */
@@ -2299,13 +2299,13 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
l->rcv_nxt_state = msg_seqno(hdr) + 1;
/* Update own tolerance if peer indicates a non-zero value */
- if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) {
+ if (tipc_in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) {
l->tolerance = peers_tol;
l->bc_rcvlink->tolerance = peers_tol;
}
/* Update own prio if peer indicates a different value */
if ((peers_prio != l->priority) &&
- in_range(peers_prio, 1, TIPC_MAX_LINK_PRI)) {
+ tipc_in_range(peers_prio, 1, TIPC_MAX_LINK_PRI)) {
l->priority = peers_prio;
rc = tipc_link_fsm_evt(l, LINK_FAILURE_EVT);
}
--
2.47.3
^ permalink raw reply related
* [PATCH v3 02/19 5.15.y] minmax: Introduce {min,max}_array()
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Andy Shevchenko, Christophe Leroy
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: Herve Codina <herve.codina@bootlin.com>
[ Upstream commit c952c748c7a983a8bda9112984e6f2c1f6e441a5 ]
Introduce min_array() (resp max_array()) in order to get the
minimal (resp maximum) of values present in an array.
Signed-off-by: Herve Codina <herve.codina@bootlin.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Link: https://lore.kernel.org/r/20230623085830.749991-8-herve.codina@bootlin.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
include/linux/minmax.h | 64 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index d4bc394b449e..aac0b7d23768 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -168,6 +168,70 @@
*/
#define max_t(type, x, y) __careful_cmp(max, (type)(x), (type)(y))
+/*
+ * Remove a const qualifier from integer types
+ * _Generic(foo, type-name: association, ..., default: association) performs a
+ * comparison against the foo type (not the qualified type).
+ * Do not use the const keyword in the type-name as it will not match the
+ * unqualified type of foo.
+ */
+#define __unconst_integer_type_cases(type) \
+ unsigned type: (unsigned type)0, \
+ signed type: (signed type)0
+
+#define __unconst_integer_typeof(x) typeof( \
+ _Generic((x), \
+ char: (char)0, \
+ __unconst_integer_type_cases(char), \
+ __unconst_integer_type_cases(short), \
+ __unconst_integer_type_cases(int), \
+ __unconst_integer_type_cases(long), \
+ __unconst_integer_type_cases(long long), \
+ default: (x)))
+
+/*
+ * Do not check the array parameter using __must_be_array().
+ * In the following legit use-case where the "array" passed is a simple pointer,
+ * __must_be_array() will return a failure.
+ * --- 8< ---
+ * int *buff
+ * ...
+ * min = min_array(buff, nb_items);
+ * --- 8< ---
+ *
+ * The first typeof(&(array)[0]) is needed in order to support arrays of both
+ * 'int *buff' and 'int buff[N]' types.
+ *
+ * The array can be an array of const items.
+ * typeof() keeps the const qualifier. Use __unconst_integer_typeof() in order
+ * to discard the const qualifier for the __element variable.
+ */
+#define __minmax_array(op, array, len) ({ \
+ typeof(&(array)[0]) __array = (array); \
+ typeof(len) __len = (len); \
+ __unconst_integer_typeof(__array[0]) __element = __array[--__len]; \
+ while (__len--) \
+ __element = op(__element, __array[__len]); \
+ __element; })
+
+/**
+ * min_array - return minimum of values present in an array
+ * @array: array
+ * @len: array length
+ *
+ * Note that @len must not be zero (empty array).
+ */
+#define min_array(array, len) __minmax_array(min, array, len)
+
+/**
+ * max_array - return maximum of values present in an array
+ * @array: array
+ * @len: array length
+ *
+ * Note that @len must not be zero (empty array).
+ */
+#define max_array(array, len) __minmax_array(max, array, len)
+
/**
* clamp_t - return a value clamped to a given range using a given type
* @type: the type of variable to use
--
2.47.3
^ permalink raw reply related
* [PATCH v3 03/19 5.15.y] minmax: deduplicate __unconst_integer_typeof()
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
[ Upstream commit 5e57418a2031cd5e1863efdf3d7447a16a368172 ]
It appears that compiler_types.h already have an implementation of the
__unconst_integer_typeof() called __unqual_scalar_typeof(). Use it
instead of the copy.
Link: https://lkml.kernel.org/r/20230911154913.4176033-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Herve Codina <herve.codina@bootlin.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
include/linux/minmax.h | 25 ++-----------------------
1 file changed, 2 insertions(+), 23 deletions(-)
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index aac0b7d23768..62b0c0a3cf30 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -168,27 +168,6 @@
*/
#define max_t(type, x, y) __careful_cmp(max, (type)(x), (type)(y))
-/*
- * Remove a const qualifier from integer types
- * _Generic(foo, type-name: association, ..., default: association) performs a
- * comparison against the foo type (not the qualified type).
- * Do not use the const keyword in the type-name as it will not match the
- * unqualified type of foo.
- */
-#define __unconst_integer_type_cases(type) \
- unsigned type: (unsigned type)0, \
- signed type: (signed type)0
-
-#define __unconst_integer_typeof(x) typeof( \
- _Generic((x), \
- char: (char)0, \
- __unconst_integer_type_cases(char), \
- __unconst_integer_type_cases(short), \
- __unconst_integer_type_cases(int), \
- __unconst_integer_type_cases(long), \
- __unconst_integer_type_cases(long long), \
- default: (x)))
-
/*
* Do not check the array parameter using __must_be_array().
* In the following legit use-case where the "array" passed is a simple pointer,
@@ -203,13 +182,13 @@
* 'int *buff' and 'int buff[N]' types.
*
* The array can be an array of const items.
- * typeof() keeps the const qualifier. Use __unconst_integer_typeof() in order
+ * typeof() keeps the const qualifier. Use __unqual_scalar_typeof() in order
* to discard the const qualifier for the __element variable.
*/
#define __minmax_array(op, array, len) ({ \
typeof(&(array)[0]) __array = (array); \
typeof(len) __len = (len); \
- __unconst_integer_typeof(__array[0]) __element = __array[--__len]; \
+ __unqual_scalar_typeof(__array[0]) __element = __array[--__len];\
while (__len--) \
__element = op(__element, __array[__len]); \
__element; })
--
2.47.3
^ permalink raw reply related
* [PATCH v3 04/19 5.15.y] minmax: fix indentation of __cmp_once() and __clamp_once()
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Christoph Hellwig, Jason A. Donenfeld, Linus Torvalds
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: David Laight <David.Laight@ACULAB.COM>
[ Upstream commit f4b84b2ff851f01d0fac619eadef47eb41648534 ]
Remove the extra indentation and align continuation markers.
Link: https://lkml.kernel.org/r/bed41317a05c498ea0209eafbcab45a5@AcuMS.aculab.com
Signed-off-by: David Laight <david.laight@aculab.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Jason A. Donenfeld <Jason@zx2c4.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
include/linux/minmax.h | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index 62b0c0a3cf30..2ec559284a9f 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -46,11 +46,11 @@
#define __cmp(op, x, y) ((x) __cmp_op_##op (y) ? (x) : (y))
#define __cmp_once(op, x, y, unique_x, unique_y) ({ \
- typeof(x) unique_x = (x); \
- typeof(y) unique_y = (y); \
- static_assert(__types_ok(x, y), \
- #op "(" #x ", " #y ") signedness error, fix types or consider u" #op "() before " #op "_t()"); \
- __cmp(op, unique_x, unique_y); })
+ typeof(x) unique_x = (x); \
+ typeof(y) unique_y = (y); \
+ static_assert(__types_ok(x, y), \
+ #op "(" #x ", " #y ") signedness error, fix types or consider u" #op "() before " #op "_t()"); \
+ __cmp(op, unique_x, unique_y); })
#define __careful_cmp(op, x, y) \
__builtin_choose_expr(__is_constexpr((x) - (y)), \
@@ -60,16 +60,16 @@
#define __clamp(val, lo, hi) \
((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
-#define __clamp_once(val, lo, hi, unique_val, unique_lo, unique_hi) ({ \
- typeof(val) unique_val = (val); \
- typeof(lo) unique_lo = (lo); \
- typeof(hi) unique_hi = (hi); \
- static_assert(__builtin_choose_expr(__is_constexpr((lo) > (hi)), \
- (lo) <= (hi), true), \
- "clamp() low limit " #lo " greater than high limit " #hi); \
- static_assert(__types_ok(val, lo), "clamp() 'lo' signedness error"); \
- static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
- __clamp(unique_val, unique_lo, unique_hi); })
+#define __clamp_once(val, lo, hi, unique_val, unique_lo, unique_hi) ({ \
+ typeof(val) unique_val = (val); \
+ typeof(lo) unique_lo = (lo); \
+ typeof(hi) unique_hi = (hi); \
+ static_assert(__builtin_choose_expr(__is_constexpr((lo) > (hi)), \
+ (lo) <= (hi), true), \
+ "clamp() low limit " #lo " greater than high limit " #hi); \
+ static_assert(__types_ok(val, lo), "clamp() 'lo' signedness error"); \
+ static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
+ __clamp(unique_val, unique_lo, unique_hi); })
#define __careful_clamp(val, lo, hi) ({ \
__builtin_choose_expr(__is_constexpr((val) - (lo) + (hi)), \
--
2.47.3
^ permalink raw reply related
* [PATCH v3 05/19 5.15.y] minmax: avoid overly complicated constant expressions in VM code
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Linus Torvalds, Lorenzo Stoakes, David Laight
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: Linus Torvalds <torvalds@linux-foundation.org>
[ Upstream commit 3a7e02c040b130b5545e4b115aada7bacd80a2b6 ]
The minmax infrastructure is overkill for simple constants, and can
cause huge expansions because those simple constants are then used by
other things.
For example, 'pageblock_order' is a core VM constant, but because it was
implemented using 'min_t()' and all the type-checking that involves, it
actually expanded to something like 2.5kB of preprocessor noise.
And when that simple constant was then used inside other expansions:
#define pageblock_nr_pages (1UL << pageblock_order)
#define pageblock_start_pfn(pfn) ALIGN_DOWN((pfn), pageblock_nr_pages)
and we then use that inside a 'max()' macro:
case ISOLATE_SUCCESS:
update_cached = false;
last_migrated_pfn = max(cc->zone->zone_start_pfn,
pageblock_start_pfn(cc->migrate_pfn - 1));
the end result was that one statement expanding to 253kB in size.
There are probably other cases of this, but this one case certainly
stood out.
I've added 'MIN_T()' and 'MAX_T()' macros for this kind of "core simple
constant with specific type" use. These macros skip the type checking,
and as such need to be very sparingly used only for obvious cases that
have active issues like this.
Reported-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Link: https://lore.kernel.org/all/36aa2cad-1db1-4abf-8dd2-fb20484aabc3@lucifer.local/
Cc: David Laight <David.Laight@aculab.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
include/linux/minmax.h | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index 2ec559284a9f..a7ef65f78933 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -270,4 +270,11 @@ static inline bool in_range32(u32 val, u32 start, u32 len)
#define swap(a, b) \
do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
+/*
+ * Use these carefully: no type checking, and uses the arguments
+ * multiple times. Use for obvious constants only.
+ */
+#define MIN_T(type,a,b) __cmp(min,(type)(a),(type)(b))
+#define MAX_T(type,a,b) __cmp(max,(type)(a),(type)(b))
+
#endif /* _LINUX_MINMAX_H */
--
2.47.3
^ permalink raw reply related
* [PATCH v3 06/19 5.15.y] minmax: add a few more MIN_T/MAX_T users
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Linus Torvalds, David Laight, Lorenzo Stoakes
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: Linus Torvalds <torvalds@linux-foundation.org>
[ Upstream commit 4477b39c32fdc03363affef4b11d48391e6dc9ff ]
Commit 3a7e02c040b1 ("minmax: avoid overly complicated constant
expressions in VM code") added the simpler MIN_T/MAX_T macros in order
to avoid some excessive expansion from the rather complicated regular
min/max macros.
The complexity of those macros stems from two issues:
(a) trying to use them in situations that require a C constant
expression (in static initializers and for array sizes)
(b) the type sanity checking
and MIN_T/MAX_T avoids both of these issues.
Now, in the whole (long) discussion about all this, it was pointed out
that the whole type sanity checking is entirely unnecessary for
min_t/max_t which get a fixed type that the comparison is done in.
But that still leaves min_t/max_t unnecessarily complicated due to
worries about the C constant expression case.
However, it turns out that there really aren't very many cases that use
min_t/max_t for this, and we can just force-convert those.
This does exactly that.
Which in turn will then allow for much simpler implementations of
min_t()/max_t(). All the usual "macros in all upper case will evaluate
the arguments multiple times" rules apply.
We should do all the same things for the regular min/max() vs MIN/MAX()
cases, but that has the added complexity of various drivers defining
their own local versions of MIN/MAX, so that needs another level of
fixes first.
Link: https://lore.kernel.org/all/b47fad1d0cf8449886ad148f8c013dae@AcuMS.aculab.com/
Cc: David Laight <David.Laight@aculab.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
V2 -> V3:
Fix fs/erofs/zdata.h to use MIN_T instead of min_t to fix build on the
following patch:
In file included from ./include/linux/kernel.h:16,
from ./include/linux/list.h:9,
from ./include/linux/wait.h:7,
from ./include/linux/wait_bit.h:8,
from ./include/linux/fs.h:6,
from fs/erofs/internal.h:10,
from fs/erofs/zdata.h:9,
from fs/erofs/zdata.c:6:
fs/erofs/zdata.c: In function ‘z_erofs_decompress_pcluster’:
fs/erofs/zdata.h:185:61: error: ISO C90 forbids variable length array ‘pages_onstack’ [-Werror=vla]
185 | min_t(unsigned int, THREAD_SIZE / 8 / sizeof(struct page *), 96U)
| ^~~~
./include/linux/minmax.h:49:23: note: in definition of macro ‘__cmp_once_unique’
49 | ({ type ux = (x); type uy = (y); __cmp(op, ux, uy); })
| ^
./include/linux/minmax.h:164:27: note: in expansion of macro ‘__cmp_once’
164 | #define min_t(type, x, y) __cmp_once(min, type, x, y)
| ^~~~~~~~~~
fs/erofs/zdata.h:185:9: note: in expansion of macro ‘min_t’
185 | min_t(unsigned int, THREAD_SIZE / 8 / sizeof(struct page *), 96U)
| ^~~~~
fs/erofs/zdata.c:847:36: note: in expansion of macro ‘Z_EROFS_VMAP_ONSTACK_PAGES’
847 | struct page *pages_onstack[Z_EROFS_VMAP_ONSTACK_PAGES];
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
V1 -> V2:
Use `[ Upstream commit <HASH> ]` instead of `commit <HASH> upstream.`
like in all other patches.
arch/x86/mm/pgtable.c | 2 +-
drivers/edac/sb_edac.c | 4 ++--
drivers/gpu/drm/drm_color_mgmt.c | 2 +-
drivers/md/dm-integrity.c | 2 +-
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 +-
fs/erofs/zdata.h | 2 +-
net/ipv4/proc.c | 2 +-
net/ipv6/proc.c | 2 +-
8 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
index 3481b35cb4ec..e649161eb6fc 100644
--- a/arch/x86/mm/pgtable.c
+++ b/arch/x86/mm/pgtable.c
@@ -107,7 +107,7 @@ static inline void pgd_list_del(pgd_t *pgd)
#define UNSHARED_PTRS_PER_PGD \
(SHARED_KERNEL_PMD ? KERNEL_PGD_BOUNDARY : PTRS_PER_PGD)
#define MAX_UNSHARED_PTRS_PER_PGD \
- max_t(size_t, KERNEL_PGD_BOUNDARY, PTRS_PER_PGD)
+ MAX_T(size_t, KERNEL_PGD_BOUNDARY, PTRS_PER_PGD)
static void pgd_set_mm(pgd_t *pgd, struct mm_struct *mm)
diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c
index 1522d4aa2ca6..714020e7405a 100644
--- a/drivers/edac/sb_edac.c
+++ b/drivers/edac/sb_edac.c
@@ -109,8 +109,8 @@ static const u32 knl_interleave_list[] = {
0x104, 0x10c, 0x114, 0x11c, /* 20-23 */
};
#define MAX_INTERLEAVE \
- (max_t(unsigned int, ARRAY_SIZE(sbridge_interleave_list), \
- max_t(unsigned int, ARRAY_SIZE(ibridge_interleave_list), \
+ (MAX_T(unsigned int, ARRAY_SIZE(sbridge_interleave_list), \
+ MAX_T(unsigned int, ARRAY_SIZE(ibridge_interleave_list), \
ARRAY_SIZE(knl_interleave_list))))
struct interleave_pkg {
diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_mgmt.c
index bb14f488c8f6..1ff572d8744e 100644
--- a/drivers/gpu/drm/drm_color_mgmt.c
+++ b/drivers/gpu/drm/drm_color_mgmt.c
@@ -528,7 +528,7 @@ int drm_plane_create_color_properties(struct drm_plane *plane,
{
struct drm_device *dev = plane->dev;
struct drm_property *prop;
- struct drm_prop_enum_list enum_list[max_t(int, DRM_COLOR_ENCODING_MAX,
+ struct drm_prop_enum_list enum_list[MAX_T(int, DRM_COLOR_ENCODING_MAX,
DRM_COLOR_RANGE_MAX)];
int i, len;
diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c
index e9d553eea9cd..8e2b00536c3e 100644
--- a/drivers/md/dm-integrity.c
+++ b/drivers/md/dm-integrity.c
@@ -2536,7 +2536,7 @@ static void do_journal_write(struct dm_integrity_c *ic, unsigned write_start,
unlikely(from_replay) &&
#endif
ic->internal_hash) {
- char test_tag[max_t(size_t, HASH_MAX_DIGESTSIZE, MAX_TAG_SIZE)];
+ char test_tag[MAX_T(size_t, HASH_MAX_DIGESTSIZE, MAX_TAG_SIZE)];
integrity_sector_checksum(ic, sec + ((l - j) << ic->sb->log2_sectors_per_block),
(char *)access_journal_data(ic, i, l), test_tag);
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 2478caeec763..21cc8cd9e023 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -2805,7 +2805,7 @@ static void stmmac_dma_interrupt(struct stmmac_priv *priv)
u32 channels_to_check = tx_channel_count > rx_channel_count ?
tx_channel_count : rx_channel_count;
u32 chan;
- int status[max_t(u32, MTL_MAX_TX_QUEUES, MTL_MAX_RX_QUEUES)];
+ int status[MAX_T(u32, MTL_MAX_TX_QUEUES, MTL_MAX_RX_QUEUES)];
/* Make sure we never check beyond our status buffer. */
if (WARN_ON_ONCE(channels_to_check > ARRAY_SIZE(status)))
diff --git a/fs/erofs/zdata.h b/fs/erofs/zdata.h
index 3a008f1b9f78..43876fd8a2cb 100644
--- a/fs/erofs/zdata.h
+++ b/fs/erofs/zdata.h
@@ -182,7 +182,7 @@ static inline void z_erofs_onlinepage_endio(struct page *page)
}
#define Z_EROFS_VMAP_ONSTACK_PAGES \
- min_t(unsigned int, THREAD_SIZE / 8 / sizeof(struct page *), 96U)
+ MIN_T(unsigned int, THREAD_SIZE / 8 / sizeof(struct page *), 96U)
#define Z_EROFS_VMAP_GLOBAL_PAGES 2048
#endif
diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c
index 4b9280a3b673..d849f61b7519 100644
--- a/net/ipv4/proc.c
+++ b/net/ipv4/proc.c
@@ -43,7 +43,7 @@
#include <net/sock.h>
#include <net/raw.h>
-#define TCPUDP_MIB_MAX max_t(u32, UDP_MIB_MAX, TCP_MIB_MAX)
+#define TCPUDP_MIB_MAX MAX_T(u32, UDP_MIB_MAX, TCP_MIB_MAX)
/*
* Report socket allocation statistics [mea@utu.fi]
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c
index d6306aa46bb1..e07c43bd5cb0 100644
--- a/net/ipv6/proc.c
+++ b/net/ipv6/proc.c
@@ -27,7 +27,7 @@
#include <net/ipv6.h>
#define MAX4(a, b, c, d) \
- max_t(u32, max_t(u32, a, b), max_t(u32, c, d))
+ MAX_T(u32, MAX_T(u32, a, b), MAX_T(u32, c, d))
#define SNMP_MIB_MAX MAX4(UDP_MIB_MAX, TCP_MIB_MAX, \
IPSTATS_MIB_MAX, ICMP_MIB_MAX)
--
2.47.3
^ permalink raw reply related
* [PATCH v3 07/19 5.15.y] minmax: simplify and clarify min_t()/max_t() implementation
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Linus Torvalds, David Laight, Lorenzo Stoakes
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: Linus Torvalds <torvalds@linux-foundation.org>
[ Upstream commit 017fa3e89187848fd056af757769c9e66ac3e93d ]
This simplifies the min_t() and max_t() macros by no longer making them
work in the context of a C constant expression.
That means that you can no longer use them for static initializers or
for array sizes in type definitions, but there were only a couple of
such uses, and all of them were converted (famous last words) to use
MIN_T/MAX_T instead.
Cc: David Laight <David.Laight@aculab.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
V1 -> V2:
Use `[ Upstream commit <HASH> ]` instead of `commit <HASH> upstream.`
like in all other patches.
include/linux/minmax.h | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index a7ef65f78933..9c2848abc804 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -45,17 +45,20 @@
#define __cmp(op, x, y) ((x) __cmp_op_##op (y) ? (x) : (y))
-#define __cmp_once(op, x, y, unique_x, unique_y) ({ \
- typeof(x) unique_x = (x); \
- typeof(y) unique_y = (y); \
+#define __cmp_once_unique(op, type, x, y, ux, uy) \
+ ({ type ux = (x); type uy = (y); __cmp(op, ux, uy); })
+
+#define __cmp_once(op, type, x, y) \
+ __cmp_once_unique(op, type, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_))
+
+#define __careful_cmp_once(op, x, y) ({ \
static_assert(__types_ok(x, y), \
#op "(" #x ", " #y ") signedness error, fix types or consider u" #op "() before " #op "_t()"); \
- __cmp(op, unique_x, unique_y); })
+ __cmp_once(op, __auto_type, x, y); })
#define __careful_cmp(op, x, y) \
__builtin_choose_expr(__is_constexpr((x) - (y)), \
- __cmp(op, x, y), \
- __cmp_once(op, x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y)))
+ __cmp(op, x, y), __careful_cmp_once(op, x, y))
#define __clamp(val, lo, hi) \
((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
@@ -158,7 +161,7 @@
* @x: first value
* @y: second value
*/
-#define min_t(type, x, y) __careful_cmp(min, (type)(x), (type)(y))
+#define min_t(type, x, y) __cmp_once(min, type, x, y)
/**
* max_t - return maximum of two values, using the specified type
@@ -166,7 +169,7 @@
* @x: first value
* @y: second value
*/
-#define max_t(type, x, y) __careful_cmp(max, (type)(x), (type)(y))
+#define max_t(type, x, y) __cmp_once(max, type, x, y)
/*
* Do not check the array parameter using __must_be_array().
--
2.47.3
^ permalink raw reply related
* [PATCH v3 08/19 5.15.y] minmax: make generic MIN() and MAX() macros available everywhere
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Linus Torvalds, David Laight, Lorenzo Stoakes
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: Linus Torvalds <torvalds@linux-foundation.org>
[ Upstream commit 1a251f52cfdc417c84411a056bc142cbd77baef4 ]
This just standardizes the use of MIN() and MAX() macros, with the very
traditional semantics. The goal is to use these for C constant
expressions and for top-level / static initializers, and so be able to
simplify the min()/max() macros.
These macro names were used by various kernel code - they are very
traditional, after all - and all such users have been fixed up, with a
few different approaches:
- trivial duplicated macro definitions have been removed
Note that 'trivial' here means that it's obviously kernel code that
already included all the major kernel headers, and thus gets the new
generic MIN/MAX macros automatically.
- non-trivial duplicated macro definitions are guarded with #ifndef
This is the "yes, they define their own versions, but no, the include
situation is not entirely obvious, and maybe they don't get the
generic version automatically" case.
- strange use case #1
A couple of drivers decided that the way they want to describe their
versioning is with
#define MAJ 1
#define MIN 2
#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN)
which adds zero value and I just did my Alexander the Great
impersonation, and rewrote that pointless Gordian knot as
#define DRV_VERSION "1.2"
instead.
- strange use case #2
A couple of drivers thought that it's a good idea to have a random
'MIN' or 'MAX' define for a value or index into a table, rather than
the traditional macro that takes arguments.
These values were re-written as C enum's instead. The new
function-line macros only expand when followed by an open
parenthesis, and thus don't clash with enum use.
Happily, there weren't really all that many of these cases, and a lot of
users already had the pattern of using '#ifndef' guarding (or in one
case just using '#undef MIN') before defining their own private version
that does the same thing. I left such cases alone.
Cc: David Laight <David.Laight@aculab.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
arch/um/drivers/mconsole_user.c | 2 ++
drivers/edac/skx_common.h | 1 -
drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 ++
.../drm/amd/display/modules/hdcp/hdcp_ddc.c | 2 ++
.../drm/amd/pm/powerplay/hwmgr/ppevvmath.h | 14 +++++++----
.../amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 2 ++
drivers/gpu/drm/radeon/evergreen_cs.c | 2 ++
drivers/hwmon/adt7475.c | 24 +++++++++----------
drivers/media/dvb-frontends/stv0367_priv.h | 3 +++
drivers/net/fjes/fjes_main.c | 4 +---
drivers/nfc/pn544/i2c.c | 2 --
drivers/platform/x86/sony-laptop.c | 1 -
drivers/scsi/isci/init.c | 6 +----
.../pci/hive_isp_css_include/math_support.h | 5 ----
include/linux/minmax.h | 2 ++
kernel/trace/preemptirq_delay_test.c | 2 --
lib/btree.c | 1 -
lib/decompress_unlzma.c | 2 ++
lib/zstd/zstd_internal.h | 2 --
mm/zsmalloc.c | 1 -
tools/testing/selftests/vm/mremap_test.c | 2 ++
21 files changed, 43 insertions(+), 39 deletions(-)
diff --git a/arch/um/drivers/mconsole_user.c b/arch/um/drivers/mconsole_user.c
index e24298a734be..a04cd13c6315 100644
--- a/arch/um/drivers/mconsole_user.c
+++ b/arch/um/drivers/mconsole_user.c
@@ -71,7 +71,9 @@ static struct mconsole_command *mconsole_parse(struct mc_request *req)
return NULL;
}
+#ifndef MIN
#define MIN(a,b) ((a)<(b) ? (a):(b))
+#endif
#define STRINGX(x) #x
#define STRING(x) STRINGX(x)
diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h
index 13f761930b4f..1a78f18cf7fe 100644
--- a/drivers/edac/skx_common.h
+++ b/drivers/edac/skx_common.h
@@ -44,7 +44,6 @@
#define I10NM_NUM_CHANNELS MAX(I10NM_NUM_DDR_CHANNELS, I10NM_NUM_HBM_CHANNELS)
#define I10NM_NUM_DIMMS MAX(I10NM_NUM_DDR_DIMMS, I10NM_NUM_HBM_DIMMS)
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define NUM_IMC MAX(SKX_NUM_IMC, I10NM_NUM_IMC)
#define NUM_CHANNELS MAX(SKX_NUM_CHANNELS, I10NM_NUM_CHANNELS)
#define NUM_DIMMS MAX(SKX_NUM_DIMMS, I10NM_NUM_DIMMS)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index dbef22f56482..1ee8663fd866 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1277,7 +1277,9 @@ int emu_soc_asic_init(struct amdgpu_device *adev);
#define amdgpu_inc_vram_lost(adev) atomic_inc(&((adev)->vram_lost_counter));
+#ifndef MIN
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
+#endif
/* Common functions */
bool amdgpu_device_has_job_running(struct amdgpu_device *adev);
diff --git a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_ddc.c b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_ddc.c
index 1b2df97226a3..40286e8dd4e1 100644
--- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_ddc.c
+++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_ddc.c
@@ -25,7 +25,9 @@
#include "hdcp.h"
+#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
#define HDCP_I2C_ADDR 0x3a /* 0x74 >> 1*/
#define KSV_READ_SIZE 0xf /* 0x6803b - 0x6802c */
#define HDCP_MAX_AUX_TRANSACTION_SIZE 16
diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppevvmath.h b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppevvmath.h
index dac29fe6cfc6..abbdb7731996 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppevvmath.h
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppevvmath.h
@@ -22,12 +22,18 @@
*/
#include <asm/div64.h>
-#define SHIFT_AMOUNT 16 /* We multiply all original integers with 2^SHIFT_AMOUNT to get the fInt representation */
+enum ppevvmath_constants {
+ /* We multiply all original integers with 2^SHIFT_AMOUNT to get the fInt representation */
+ SHIFT_AMOUNT = 16,
-#define PRECISION 5 /* Change this value to change the number of decimal places in the final output - 5 is a good default */
+ /* Change this value to change the number of decimal places in the final output - 5 is a good default */
+ PRECISION = 5,
-#define SHIFTED_2 (2 << SHIFT_AMOUNT)
-#define MAX (1 << (SHIFT_AMOUNT - 1)) - 1 /* 32767 - Might change in the future */
+ SHIFTED_2 = (2 << SHIFT_AMOUNT),
+
+ /* 32767 - Might change in the future */
+ MAX = (1 << (SHIFT_AMOUNT - 1)) - 1,
+};
/* -------------------------------------------------------------------------------
* NEW TYPE - fINT
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index d4fde146bd4c..95894c25881a 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -1964,7 +1964,9 @@ static void sienna_cichlid_get_override_pcie_settings(struct smu_context *smu,
}
}
+#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#endif
static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
uint32_t pcie_gen_cap,
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c
index 820c2c3641d3..1311f10fad66 100644
--- a/drivers/gpu/drm/radeon/evergreen_cs.c
+++ b/drivers/gpu/drm/radeon/evergreen_cs.c
@@ -33,8 +33,10 @@
#include "evergreen_reg_safe.h"
#include "cayman_reg_safe.h"
+#ifndef MIN
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))
+#endif
#define REG_SAFE_BM_SIZE ARRAY_SIZE(evergreen_reg_safe_bm)
diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
index b4c0f01f52c4..1e0678eb0077 100644
--- a/drivers/hwmon/adt7475.c
+++ b/drivers/hwmon/adt7475.c
@@ -23,23 +23,23 @@
#include <linux/util_macros.h>
/* Indexes for the sysfs hooks */
-
-#define INPUT 0
-#define MIN 1
-#define MAX 2
-#define CONTROL 3
-#define OFFSET 3
-#define AUTOMIN 4
-#define THERM 5
-#define HYSTERSIS 6
-
+enum adt_sysfs_id {
+ INPUT = 0,
+ MIN = 1,
+ MAX = 2,
+ CONTROL = 3,
+ OFFSET = 3, // Dup
+ AUTOMIN = 4,
+ THERM = 5,
+ HYSTERSIS = 6,
/*
* These are unique identifiers for the sysfs functions - unlike the
* numbers above, these are not also indexes into an array
*/
+ ALARM = 9,
+ FAULT = 10,
+};
-#define ALARM 9
-#define FAULT 10
/* 7475 Common Registers */
diff --git a/drivers/media/dvb-frontends/stv0367_priv.h b/drivers/media/dvb-frontends/stv0367_priv.h
index 617f605947b2..7f056d1cce82 100644
--- a/drivers/media/dvb-frontends/stv0367_priv.h
+++ b/drivers/media/dvb-frontends/stv0367_priv.h
@@ -25,8 +25,11 @@
#endif
/* MACRO definitions */
+#ifndef MIN
#define MAX(X, Y) ((X) >= (Y) ? (X) : (Y))
#define MIN(X, Y) ((X) <= (Y) ? (X) : (Y))
+#endif
+
#define INRANGE(X, Y, Z) \
((((X) <= (Y)) && ((Y) <= (Z))) || \
(((Z) <= (Y)) && ((Y) <= (X))) ? 1 : 0)
diff --git a/drivers/net/fjes/fjes_main.c b/drivers/net/fjes/fjes_main.c
index 1d1808afd529..792c22ba5b00 100644
--- a/drivers/net/fjes/fjes_main.c
+++ b/drivers/net/fjes/fjes_main.c
@@ -14,9 +14,7 @@
#include "fjes.h"
#include "fjes_trace.h"
-#define MAJ 1
-#define MIN 2
-#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN)
+#define DRV_VERSION "1.2"
#define DRV_NAME "fjes"
char fjes_driver_name[] = DRV_NAME;
char fjes_driver_version[] = DRV_VERSION;
diff --git a/drivers/nfc/pn544/i2c.c b/drivers/nfc/pn544/i2c.c
index 37d26f01986b..fd7026206f58 100644
--- a/drivers/nfc/pn544/i2c.c
+++ b/drivers/nfc/pn544/i2c.c
@@ -126,8 +126,6 @@ struct pn544_i2c_fw_secure_blob {
#define PN544_FW_CMD_RESULT_COMMAND_REJECTED 0xE0
#define PN544_FW_CMD_RESULT_CHUNK_ERROR 0xE6
-#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
-
#define PN544_FW_WRITE_BUFFER_MAX_LEN 0x9f7
#define PN544_FW_I2C_MAX_PAYLOAD PN544_HCI_I2C_LLC_MAX_SIZE
#define PN544_FW_I2C_WRITE_FRAME_HEADER_LEN 8
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
index 336dee9485d4..3c27d6b66bb4 100644
--- a/drivers/platform/x86/sony-laptop.c
+++ b/drivers/platform/x86/sony-laptop.c
@@ -757,7 +757,6 @@ static union acpi_object *__call_snc_method(acpi_handle handle, char *method,
return result;
}
-#define MIN(a, b) (a > b ? b : a)
static int sony_nc_buffer_call(acpi_handle handle, char *name, u64 *value,
void *buffer, size_t buflen)
{
diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c
index bd73f6925a9d..73144b2966ba 100644
--- a/drivers/scsi/isci/init.c
+++ b/drivers/scsi/isci/init.c
@@ -65,11 +65,7 @@
#include "task.h"
#include "probe_roms.h"
-#define MAJ 1
-#define MIN 2
-#define BUILD 0
-#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \
- __stringify(BUILD)
+#define DRV_VERSION "1.2.0"
MODULE_VERSION(DRV_VERSION);
diff --git a/drivers/staging/media/atomisp/pci/hive_isp_css_include/math_support.h b/drivers/staging/media/atomisp/pci/hive_isp_css_include/math_support.h
index a444ec14ff9d..1c17a87a8572 100644
--- a/drivers/staging/media/atomisp/pci/hive_isp_css_include/math_support.h
+++ b/drivers/staging/media/atomisp/pci/hive_isp_css_include/math_support.h
@@ -31,11 +31,6 @@
/* A => B */
#define IMPLIES(a, b) (!(a) || (b))
-/* for preprocessor and array sizing use MIN and MAX
- otherwise use min and max */
-#define MAX(a, b) (((a) > (b)) ? (a) : (b))
-#define MIN(a, b) (((a) < (b)) ? (a) : (b))
-
#define ROUND_DIV(a, b) (((b) != 0) ? ((a) + ((b) >> 1)) / (b) : 0)
#define CEIL_DIV(a, b) (((b) != 0) ? ((a) + (b) - 1) / (b) : 0)
#define CEIL_MUL(a, b) (CEIL_DIV(a, b) * (b))
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index 9c2848abc804..fc384714da45 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -277,6 +277,8 @@ static inline bool in_range32(u32 val, u32 start, u32 len)
* Use these carefully: no type checking, and uses the arguments
* multiple times. Use for obvious constants only.
*/
+#define MIN(a,b) __cmp(min,a,b)
+#define MAX(a,b) __cmp(max,a,b)
#define MIN_T(type,a,b) __cmp(min,(type)(a),(type)(b))
#define MAX_T(type,a,b) __cmp(max,(type)(a),(type)(b))
diff --git a/kernel/trace/preemptirq_delay_test.c b/kernel/trace/preemptirq_delay_test.c
index 8af92dbe98f0..acb0c971a408 100644
--- a/kernel/trace/preemptirq_delay_test.c
+++ b/kernel/trace/preemptirq_delay_test.c
@@ -34,8 +34,6 @@ MODULE_PARM_DESC(cpu_affinity, "Cpu num test is running on");
static struct completion done;
-#define MIN(x, y) ((x) < (y) ? (x) : (y))
-
static void busy_wait(ulong time)
{
u64 start, end;
diff --git a/lib/btree.c b/lib/btree.c
index b4cf08a5c267..b12f99d4c45c 100644
--- a/lib/btree.c
+++ b/lib/btree.c
@@ -43,7 +43,6 @@
#include <linux/slab.h>
#include <linux/module.h>
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define NODESIZE MAX(L1_CACHE_BYTES, 128)
struct btree_geo {
diff --git a/lib/decompress_unlzma.c b/lib/decompress_unlzma.c
index 20a858031f12..9d34d35908da 100644
--- a/lib/decompress_unlzma.c
+++ b/lib/decompress_unlzma.c
@@ -37,7 +37,9 @@
#include <linux/decompress/mm.h>
+#ifndef MIN
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#endif
static long long INIT read_int(unsigned char *ptr, int size)
{
diff --git a/lib/zstd/zstd_internal.h b/lib/zstd/zstd_internal.h
index dac753397f86..927ed4e8c11c 100644
--- a/lib/zstd/zstd_internal.h
+++ b/lib/zstd/zstd_internal.h
@@ -36,8 +36,6 @@
/*-*************************************
* shared macros
***************************************/
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define CHECK_F(f) \
{ \
size_t const errcod = f; \
diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
index 79f389d620c9..fd01f6922874 100644
--- a/mm/zsmalloc.c
+++ b/mm/zsmalloc.c
@@ -126,7 +126,6 @@
#define ISOLATED_BITS 3
#define MAGIC_VAL_BITS 8
-#define MAX(a, b) ((a) >= (b) ? (a) : (b))
/* ZS_MIN_ALLOC_SIZE must be multiple of ZS_ALIGN */
#define ZS_MIN_ALLOC_SIZE \
MAX(32, (ZS_MAX_PAGES_PER_ZSPAGE << PAGE_SHIFT >> OBJ_INDEX_BITS))
diff --git a/tools/testing/selftests/vm/mremap_test.c b/tools/testing/selftests/vm/mremap_test.c
index 58775dab3cc6..92fb74865f26 100644
--- a/tools/testing/selftests/vm/mremap_test.c
+++ b/tools/testing/selftests/vm/mremap_test.c
@@ -22,7 +22,9 @@
#define VALIDATION_DEFAULT_THRESHOLD 4 /* 4MB */
#define VALIDATION_NO_THRESHOLD 0 /* Verify the entire region */
+#ifndef MIN
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
+#endif
struct config {
unsigned long long src_alignment;
--
2.47.3
^ permalink raw reply related
* [PATCH v3 09/19 5.15.y] minmax: don't use max() in situations that want a C constant expression
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Linus Torvalds, David Laight, Lorenzo Stoakes
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: Linus Torvalds <torvalds@linux-foundation.org>
[ Upstream commit cb04e8b1d2f24c4c2c92f7b7529031fc35a16fed ]
We only had a couple of array[] declarations, and changing them to just
use 'MAX()' instead of 'max()' fixes the issue.
This will allow us to simplify our min/max macros enormously, since they
can now unconditionally use temporary variables to avoid using the
argument values multiple times.
Cc: David Laight <David.Laight@aculab.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
drivers/input/touchscreen/cyttsp4_core.c | 2 +-
drivers/irqchip/irq-sun6i-r.c | 2 +-
drivers/md/dm-integrity.c | 2 +-
fs/btrfs/tree-checker.c | 2 +-
lib/vsprintf.c | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/input/touchscreen/cyttsp4_core.c b/drivers/input/touchscreen/cyttsp4_core.c
index dccbcb942fe5..936d69da3bda 100644
--- a/drivers/input/touchscreen/cyttsp4_core.c
+++ b/drivers/input/touchscreen/cyttsp4_core.c
@@ -871,7 +871,7 @@ static void cyttsp4_get_mt_touches(struct cyttsp4_mt_data *md, int num_cur_tch)
struct cyttsp4_touch tch;
int sig;
int i, j, t = 0;
- int ids[max(CY_TMA1036_MAX_TCH, CY_TMA4XX_MAX_TCH)];
+ int ids[MAX(CY_TMA1036_MAX_TCH, CY_TMA4XX_MAX_TCH)];
memset(ids, 0, si->si_ofs.tch_abs[CY_TCH_T].max * sizeof(int));
for (i = 0; i < num_cur_tch; i++) {
diff --git a/drivers/irqchip/irq-sun6i-r.c b/drivers/irqchip/irq-sun6i-r.c
index 4cd3e533740b..74b1bd331425 100644
--- a/drivers/irqchip/irq-sun6i-r.c
+++ b/drivers/irqchip/irq-sun6i-r.c
@@ -268,7 +268,7 @@ static const struct irq_domain_ops sun6i_r_intc_domain_ops = {
static int sun6i_r_intc_suspend(void)
{
- u32 buf[BITS_TO_U32(max(SUN6I_NR_TOP_LEVEL_IRQS, SUN6I_NR_MUX_BITS))];
+ u32 buf[BITS_TO_U32(MAX(SUN6I_NR_TOP_LEVEL_IRQS, SUN6I_NR_MUX_BITS))];
int i;
/* Wake IRQs are enabled during system sleep and shutdown. */
diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c
index 8e2b00536c3e..9e2bbfe328f0 100644
--- a/drivers/md/dm-integrity.c
+++ b/drivers/md/dm-integrity.c
@@ -1705,7 +1705,7 @@ static void integrity_metadata(struct work_struct *w)
struct bio *bio = dm_bio_from_per_bio_data(dio, sizeof(struct dm_integrity_io));
char *checksums;
unsigned extra_space = unlikely(digest_size > ic->tag_size) ? digest_size - ic->tag_size : 0;
- char checksums_onstack[max((size_t)HASH_MAX_DIGESTSIZE, MAX_TAG_SIZE)];
+ char checksums_onstack[MAX(HASH_MAX_DIGESTSIZE, MAX_TAG_SIZE)];
sector_t sector;
unsigned sectors_to_process;
diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c
index 51e04efe3e20..8f96ddaceb9a 100644
--- a/fs/btrfs/tree-checker.c
+++ b/fs/btrfs/tree-checker.c
@@ -608,7 +608,7 @@ static int check_dir_item(struct extent_buffer *leaf,
*/
if (key->type == BTRFS_DIR_ITEM_KEY ||
key->type == BTRFS_XATTR_ITEM_KEY) {
- char namebuf[max(BTRFS_NAME_LEN, XATTR_NAME_MAX)];
+ char namebuf[MAX(BTRFS_NAME_LEN, XATTR_NAME_MAX)];
read_extent_buffer(leaf, namebuf,
(unsigned long)(di + 1), name_len);
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index d86abdc77c26..e46eb93c115d 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -1100,7 +1100,7 @@ char *resource_string(char *buf, char *end, struct resource *res,
#define FLAG_BUF_SIZE (2 * sizeof(res->flags))
#define DECODED_BUF_SIZE sizeof("[mem - 64bit pref window disabled]")
#define RAW_BUF_SIZE sizeof("[mem - flags 0x]")
- char sym[max(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE,
+ char sym[MAX(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE,
2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)];
char *p = sym, *pend = sym + sizeof(sym);
--
2.47.3
^ permalink raw reply related
* [PATCH v3 10/19 5.15.y] minmax: simplify min()/max()/clamp() implementation
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Linus Torvalds, David Laight, Lorenzo Stoakes
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: Linus Torvalds <torvalds@linux-foundation.org>
[ Upstream commit dc1c8034e31b14a2e5e212104ec508aec44ce1b9 ]
Now that we no longer have any C constant expression contexts (ie array
size declarations or static initializers) that use min() or max(), we
can simpify the implementation by not having to worry about the result
staying as a C constant expression.
So now we can unconditionally just use temporary variables of the right
type, and get rid of the excessive expansion that used to come from the
use of
__builtin_choose_expr(__is_constexpr(...), ..
to pick the specialized code for constant expressions.
Another expansion simplification is to pass the temporary variables (in
addition to the original expression) to our __types_ok() macro. That
may superficially look like it complicates the macro, but when we only
want the type of the expression, expanding the temporary variable names
is much simpler and smaller than expanding the potentially complicated
original expression.
As a result, on my machine, doing a
$ time make drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_1.0/ia_css_ynr.host.i
goes from
real 0m16.621s
user 0m15.360s
sys 0m1.221s
to
real 0m2.532s
user 0m2.091s
sys 0m0.452s
because the token expansion goes down dramatically.
In particular, the longest line expansion (which was line 71 of that
'ia_css_ynr.host.c' file) shrinks from 23,338kB (yes, 23MB for one
single line) to "just" 1,444kB (now "only" 1.4MB).
And yes, that line is still the line from hell, because it's doing
multiple levels of "min()/max()" expansion thanks to some of them being
hidden inside the uDIGIT_FITTING() macro.
Lorenzo has a nice cleanup patch that makes that driver use inline
functions instead of macros for sDIGIT_FITTING() and uDIGIT_FITTING(),
which will fix that line once and for all, but the 16-fold reduction in
this case does show why we need to simplify these helpers.
Cc: David Laight <David.Laight@aculab.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
include/linux/minmax.h | 43 ++++++++++++++++++++----------------------
1 file changed, 20 insertions(+), 23 deletions(-)
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index fc384714da45..e3e4353df983 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -35,10 +35,10 @@
#define __is_noneg_int(x) \
(__builtin_choose_expr(__is_constexpr(x) && __is_signed(x), x, -1) >= 0)
-#define __types_ok(x, y) \
- (__is_signed(x) == __is_signed(y) || \
- __is_signed((x) + 0) == __is_signed((y) + 0) || \
- __is_noneg_int(x) || __is_noneg_int(y))
+#define __types_ok(x, y, ux, uy) \
+ (__is_signed(ux) == __is_signed(uy) || \
+ __is_signed((ux) + 0) == __is_signed((uy) + 0) || \
+ __is_noneg_int(x) || __is_noneg_int(y))
#define __cmp_op_min <
#define __cmp_op_max >
@@ -51,34 +51,31 @@
#define __cmp_once(op, type, x, y) \
__cmp_once_unique(op, type, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_))
-#define __careful_cmp_once(op, x, y) ({ \
- static_assert(__types_ok(x, y), \
+#define __careful_cmp_once(op, x, y, ux, uy) ({ \
+ __auto_type ux = (x); __auto_type uy = (y); \
+ static_assert(__types_ok(x, y, ux, uy), \
#op "(" #x ", " #y ") signedness error, fix types or consider u" #op "() before " #op "_t()"); \
- __cmp_once(op, __auto_type, x, y); })
+ __cmp(op, ux, uy); })
-#define __careful_cmp(op, x, y) \
- __builtin_choose_expr(__is_constexpr((x) - (y)), \
- __cmp(op, x, y), __careful_cmp_once(op, x, y))
+#define __careful_cmp(op, x, y) \
+ __careful_cmp_once(op, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_))
#define __clamp(val, lo, hi) \
((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
-#define __clamp_once(val, lo, hi, unique_val, unique_lo, unique_hi) ({ \
- typeof(val) unique_val = (val); \
- typeof(lo) unique_lo = (lo); \
- typeof(hi) unique_hi = (hi); \
+#define __clamp_once(val, lo, hi, uval, ulo, uhi) ({ \
+ __auto_type uval = (val); \
+ __auto_type ulo = (lo); \
+ __auto_type uhi = (hi); \
static_assert(__builtin_choose_expr(__is_constexpr((lo) > (hi)), \
(lo) <= (hi), true), \
"clamp() low limit " #lo " greater than high limit " #hi); \
- static_assert(__types_ok(val, lo), "clamp() 'lo' signedness error"); \
- static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
- __clamp(unique_val, unique_lo, unique_hi); })
-
-#define __careful_clamp(val, lo, hi) ({ \
- __builtin_choose_expr(__is_constexpr((val) - (lo) + (hi)), \
- __clamp(val, lo, hi), \
- __clamp_once(val, lo, hi, __UNIQUE_ID(__val), \
- __UNIQUE_ID(__lo), __UNIQUE_ID(__hi))); })
+ static_assert(__types_ok(uval, lo, uval, ulo), "clamp() 'lo' signedness error"); \
+ static_assert(__types_ok(uval, hi, uval, uhi), "clamp() 'hi' signedness error"); \
+ __clamp(uval, ulo, uhi); })
+
+#define __careful_clamp(val, lo, hi) \
+ __clamp_once(val, lo, hi, __UNIQUE_ID(v_), __UNIQUE_ID(l_), __UNIQUE_ID(h_))
/**
* min - return minimum of two values of the same or compatible types
--
2.47.3
^ permalink raw reply related
* [PATCH v3 11/19 5.15.y] minmax: improve macro expansion and type checking
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Linus Torvalds, Arnd Bergmann, David Laight, Lorenzo Stoakes
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: Linus Torvalds <torvalds@linux-foundation.org>
[ Upstream commit 22f5468731491e53356ba7c028f0fdea20b18e2c ]
This clarifies the rules for min()/max()/clamp() type checking and makes
them a much more efficient macro expansion.
In particular, we now look at the type and range of the inputs to see
whether they work together, generating a mask of acceptable comparisons,
and then just verifying that the inputs have a shared case:
- an expression with a signed type can be used for
(1) signed comparisons
(2) unsigned comparisons if it is statically known to have a
non-negative value
- an expression with an unsigned type can be used for
(3) unsigned comparison
(4) signed comparisons if the type is smaller than 'int' and thus
the C integer promotion rules will make it signed anyway
Here rule (1) and (3) are obvious, and rule (2) is important in order to
allow obvious trivial constants to be used together with unsigned
values.
Rule (4) is not necessarily a good idea, but matches what we used to do,
and we have extant cases of this situation in the kernel. Notably with
bcachefs having an expression like
min(bch2_bucket_sectors_dirty(a), ca->mi.bucket_size)
where bch2_bucket_sectors_dirty() returns an 's64', and
'ca->mi.bucket_size' is of type 'u16'.
Technically that bcachefs comparison is clearly sensible on a C type
level, because the 'u16' will go through the normal C integer promotion,
and become 'int', and then we're comparing two signed values and
everything looks sane.
However, it's not entirely clear that a 'min(s64,u16)' operation makes a
lot of conceptual sense, and it's possible that we will remove rule (4).
After all, the _reason_ we have these complicated type checks is exactly
that the C type promotion rules are not very intuitive.
But at least for now the rule is in place for backwards compatibility.
Also note that rule (2) existed before, but is hugely relaxed by this
commit. It used to be true only for the simplest compile-time
non-negative integer constants. The new macro model will allow cases
where the compiler can trivially see that an expression is non-negative
even if it isn't necessarily a constant.
For example, the amdgpu driver does
min_t(size_t, sizeof(fru_info->serial), pia[addr] & 0x3F));
because our old 'min()' macro would see that 'pia[addr] & 0x3F' is of
type 'int' and clearly not a C constant expression, so doing a 'min()'
with a 'size_t' is a signedness violation.
Our new 'min()' macro still sees that 'pia[addr] & 0x3F' is of type
'int', but is smart enough to also see that it is clearly non-negative,
and thus would allow that case without any complaints.
Cc: Arnd Bergmann <arnd@kernel.org>
Cc: David Laight <David.Laight@aculab.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
include/linux/compiler.h | 9 +++++
include/linux/minmax.h | 74 ++++++++++++++++++++++++++++++++--------
2 files changed, 68 insertions(+), 15 deletions(-)
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 4f03dfb6de0d..ee9e39d315c8 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -258,6 +258,15 @@ static inline void *offset_to_ptr(const int *off)
*/
#define is_signed_type(type) (((type)(-1)) < (__force type)1)
+/*
+ * Useful shorthand for "is this condition known at compile-time?"
+ *
+ * Note that the condition may involve non-constant values,
+ * but the compiler may know enough about the details of the
+ * values to determine that the condition is statically true.
+ */
+#define statically_true(x) (__builtin_constant_p(x) && (x))
+
/*
* This is needed in functions which generate the stack canary, see
* arch/x86/kernel/smpboot.c::start_secondary() for an example.
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index e3e4353df983..41da6f85a407 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -26,19 +26,63 @@
#define __typecheck(x, y) \
(!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
-/* is_signed_type() isn't a constexpr for pointer types */
-#define __is_signed(x) \
- __builtin_choose_expr(__is_constexpr(is_signed_type(typeof(x))), \
- is_signed_type(typeof(x)), 0)
+/*
+ * __sign_use for integer expressions:
+ * bit #0 set if ok for unsigned comparisons
+ * bit #1 set if ok for signed comparisons
+ *
+ * In particular, statically non-negative signed integer
+ * expressions are ok for both.
+ *
+ * NOTE! Unsigned types smaller than 'int' are implicitly
+ * converted to 'int' in expressions, and are accepted for
+ * signed conversions for now. This is debatable.
+ *
+ * Note that 'x' is the original expression, and 'ux' is
+ * the unique variable that contains the value.
+ *
+ * We use 'ux' for pure type checking, and 'x' for when
+ * we need to look at the value (but without evaluating
+ * it for side effects! Careful to only ever evaluate it
+ * with sizeof() or __builtin_constant_p() etc).
+ *
+ * Pointers end up being checked by the normal C type
+ * rules at the actual comparison, and these expressions
+ * only need to be careful to not cause warnings for
+ * pointer use.
+ */
+#define __signed_type_use(x,ux) (2+__is_nonneg(x,ux))
+#define __unsigned_type_use(x,ux) (1+2*(sizeof(ux)<4))
+#define __sign_use(x,ux) (is_signed_type(typeof(ux))? \
+ __signed_type_use(x,ux):__unsigned_type_use(x,ux))
+
+/*
+ * To avoid warnings about casting pointers to integers
+ * of different sizes, we need that special sign type.
+ *
+ * On 64-bit we can just always use 'long', since any
+ * integer or pointer type can just be cast to that.
+ *
+ * This does not work for 128-bit signed integers since
+ * the cast would truncate them, but we do not use s128
+ * types in the kernel (we do use 'u128', but they will
+ * be handled by the !is_signed_type() case).
+ *
+ * NOTE! The cast is there only to avoid any warnings
+ * from when values that aren't signed integer types.
+ */
+#ifdef CONFIG_64BIT
+ #define __signed_type(ux) long
+#else
+ #define __signed_type(ux) typeof(__builtin_choose_expr(sizeof(ux)>4,1LL,1L))
+#endif
+#define __is_nonneg(x,ux) statically_true((__signed_type(ux))(x)>=0)
-/* True for a non-negative signed int constant */
-#define __is_noneg_int(x) \
- (__builtin_choose_expr(__is_constexpr(x) && __is_signed(x), x, -1) >= 0)
+#define __types_ok(x,y,ux,uy) \
+ (__sign_use(x,ux) & __sign_use(y,uy))
-#define __types_ok(x, y, ux, uy) \
- (__is_signed(ux) == __is_signed(uy) || \
- __is_signed((ux) + 0) == __is_signed((uy) + 0) || \
- __is_noneg_int(x) || __is_noneg_int(y))
+#define __types_ok3(x,y,z,ux,uy,uz) \
+ (__sign_use(x,ux) & __sign_use(y,uy) & __sign_use(z,uz))
#define __cmp_op_min <
#define __cmp_op_max >
@@ -53,8 +97,8 @@
#define __careful_cmp_once(op, x, y, ux, uy) ({ \
__auto_type ux = (x); __auto_type uy = (y); \
- static_assert(__types_ok(x, y, ux, uy), \
- #op "(" #x ", " #y ") signedness error, fix types or consider u" #op "() before " #op "_t()"); \
+ BUILD_BUG_ON_MSG(!__types_ok(x,y,ux,uy), \
+ #op"("#x", "#y") signedness error"); \
__cmp(op, ux, uy); })
#define __careful_cmp(op, x, y) \
@@ -70,8 +114,8 @@
static_assert(__builtin_choose_expr(__is_constexpr((lo) > (hi)), \
(lo) <= (hi), true), \
"clamp() low limit " #lo " greater than high limit " #hi); \
- static_assert(__types_ok(uval, lo, uval, ulo), "clamp() 'lo' signedness error"); \
- static_assert(__types_ok(uval, hi, uval, uhi), "clamp() 'hi' signedness error"); \
+ BUILD_BUG_ON_MSG(!__types_ok3(val,lo,hi,uval,ulo,uhi), \
+ "clamp("#val", "#lo", "#hi") signedness error"); \
__clamp(uval, ulo, uhi); })
#define __careful_clamp(val, lo, hi) \
--
2.47.3
^ permalink raw reply related
* [PATCH v3 12/19 5.15.y] minmax: fix up min3() and max3() too
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Linus Torvalds, David Laight, Arnd Bergmann
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: Linus Torvalds <torvalds@linux-foundation.org>
[ Upstream commit 21b136cc63d2a9ddd60d4699552b69c214b32964 ]
David Laight pointed out that we should deal with the min3() and max3()
mess too, which still does excessive expansion.
And our current macros are actually rather broken.
In particular, the macros did this:
#define min3(x, y, z) min((typeof(x))min(x, y), z)
#define max3(x, y, z) max((typeof(x))max(x, y), z)
and that not only is a nested expansion of possibly very complex
arguments with all that involves, the typing with that "typeof()" cast
is completely wrong.
For example, imagine what happens in max3() if 'x' happens to be a
'unsigned char', but 'y' and 'z' are 'unsigned long'. The types are
compatible, and there's no warning - but the result is just random
garbage.
No, I don't think we've ever hit that issue in practice, but since we
now have sane infrastructure for doing this right, let's just use it.
It fixes any excessive expansion, and also avoids these kinds of broken
type issues.
Requested-by: David Laight <David.Laight@aculab.com>
Acked-by: Arnd Bergmann <arnd@kernel.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
include/linux/minmax.h | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index 41da6f85a407..98008dd92153 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -152,13 +152,20 @@
#define umax(x, y) \
__careful_cmp(max, (x) + 0u + 0ul + 0ull, (y) + 0u + 0ul + 0ull)
+#define __careful_op3(op, x, y, z, ux, uy, uz) ({ \
+ __auto_type ux = (x); __auto_type uy = (y);__auto_type uz = (z);\
+ BUILD_BUG_ON_MSG(!__types_ok3(x,y,z,ux,uy,uz), \
+ #op"3("#x", "#y", "#z") signedness error"); \
+ __cmp(op, ux, __cmp(op, uy, uz)); })
+
/**
* min3 - return minimum of three values
* @x: first value
* @y: second value
* @z: third value
*/
-#define min3(x, y, z) min((typeof(x))min(x, y), z)
+#define min3(x, y, z) \
+ __careful_op3(min, x, y, z, __UNIQUE_ID(x_), __UNIQUE_ID(y_), __UNIQUE_ID(z_))
/**
* max3 - return maximum of three values
@@ -166,7 +173,8 @@
* @y: second value
* @z: third value
*/
-#define max3(x, y, z) max((typeof(x))max(x, y), z)
+#define max3(x, y, z) \
+ __careful_op3(max, x, y, z, __UNIQUE_ID(x_), __UNIQUE_ID(y_), __UNIQUE_ID(z_))
/**
* min_not_zero - return the minimum that is _not_ zero, unless both are zero
--
2.47.3
^ permalink raw reply related
* [PATCH v3 13/19 5.15.y] minmax.h: add whitespace around operators and after commas
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Arnd Bergmann, Christoph Hellwig, Dan Carpenter,
Jason A. Donenfeld, Jens Axboe, Lorenzo Stoakes, Mateusz Guzik,
Pedro Falcato
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: David Laight <David.Laight@ACULAB.COM>
[ Upstream commit 71ee9b16251ea4bf7c1fe222517c82bdb3220acc ]
Patch series "minmax.h: Cleanups and minor optimisations".
Some tidyups and minor changes to minmax.h.
This patch (of 7):
Link: https://lkml.kernel.org/r/c50365d214e04f9ba256d417c8bebbc0@AcuMS.aculab.com
Link: https://lkml.kernel.org/r/f04b2e1310244f62826267346fde0553@AcuMS.aculab.com
Signed-off-by: David Laight <david.laight@aculab.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Arnd Bergmann <arnd@kernel.org>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Dan Carpenter <dan.carpenter@linaro.org>
Cc: Jason A. Donenfeld <Jason@zx2c4.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Mateusz Guzik <mjguzik@gmail.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Pedro Falcato <pedro.falcato@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
include/linux/minmax.h | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index 98008dd92153..51b0d988e322 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -51,10 +51,10 @@
* only need to be careful to not cause warnings for
* pointer use.
*/
-#define __signed_type_use(x,ux) (2+__is_nonneg(x,ux))
-#define __unsigned_type_use(x,ux) (1+2*(sizeof(ux)<4))
-#define __sign_use(x,ux) (is_signed_type(typeof(ux))? \
- __signed_type_use(x,ux):__unsigned_type_use(x,ux))
+#define __signed_type_use(x, ux) (2 + __is_nonneg(x, ux))
+#define __unsigned_type_use(x, ux) (1 + 2 * (sizeof(ux) < 4))
+#define __sign_use(x, ux) (is_signed_type(typeof(ux)) ? \
+ __signed_type_use(x, ux) : __unsigned_type_use(x, ux))
/*
* To avoid warnings about casting pointers to integers
@@ -74,15 +74,15 @@
#ifdef CONFIG_64BIT
#define __signed_type(ux) long
#else
- #define __signed_type(ux) typeof(__builtin_choose_expr(sizeof(ux)>4,1LL,1L))
+ #define __signed_type(ux) typeof(__builtin_choose_expr(sizeof(ux) > 4, 1LL, 1L))
#endif
-#define __is_nonneg(x,ux) statically_true((__signed_type(ux))(x)>=0)
+#define __is_nonneg(x, ux) statically_true((__signed_type(ux))(x) >= 0)
-#define __types_ok(x,y,ux,uy) \
- (__sign_use(x,ux) & __sign_use(y,uy))
+#define __types_ok(x, y, ux, uy) \
+ (__sign_use(x, ux) & __sign_use(y, uy))
-#define __types_ok3(x,y,z,ux,uy,uz) \
- (__sign_use(x,ux) & __sign_use(y,uy) & __sign_use(z,uz))
+#define __types_ok3(x, y, z, ux, uy, uz) \
+ (__sign_use(x, ux) & __sign_use(y, uy) & __sign_use(z, uz))
#define __cmp_op_min <
#define __cmp_op_max >
@@ -97,7 +97,7 @@
#define __careful_cmp_once(op, x, y, ux, uy) ({ \
__auto_type ux = (x); __auto_type uy = (y); \
- BUILD_BUG_ON_MSG(!__types_ok(x,y,ux,uy), \
+ BUILD_BUG_ON_MSG(!__types_ok(x, y, ux, uy), \
#op"("#x", "#y") signedness error"); \
__cmp(op, ux, uy); })
@@ -114,7 +114,7 @@
static_assert(__builtin_choose_expr(__is_constexpr((lo) > (hi)), \
(lo) <= (hi), true), \
"clamp() low limit " #lo " greater than high limit " #hi); \
- BUILD_BUG_ON_MSG(!__types_ok3(val,lo,hi,uval,ulo,uhi), \
+ BUILD_BUG_ON_MSG(!__types_ok3(val, lo, hi, uval, ulo, uhi), \
"clamp("#val", "#lo", "#hi") signedness error"); \
__clamp(uval, ulo, uhi); })
@@ -154,7 +154,7 @@
#define __careful_op3(op, x, y, z, ux, uy, uz) ({ \
__auto_type ux = (x); __auto_type uy = (y);__auto_type uz = (z);\
- BUILD_BUG_ON_MSG(!__types_ok3(x,y,z,ux,uy,uz), \
+ BUILD_BUG_ON_MSG(!__types_ok3(x, y, z, ux, uy, uz), \
#op"3("#x", "#y", "#z") signedness error"); \
__cmp(op, ux, __cmp(op, uy, uz)); })
@@ -326,9 +326,9 @@ static inline bool in_range32(u32 val, u32 start, u32 len)
* Use these carefully: no type checking, and uses the arguments
* multiple times. Use for obvious constants only.
*/
-#define MIN(a,b) __cmp(min,a,b)
-#define MAX(a,b) __cmp(max,a,b)
-#define MIN_T(type,a,b) __cmp(min,(type)(a),(type)(b))
-#define MAX_T(type,a,b) __cmp(max,(type)(a),(type)(b))
+#define MIN(a, b) __cmp(min, a, b)
+#define MAX(a, b) __cmp(max, a, b)
+#define MIN_T(type, a, b) __cmp(min, (type)(a), (type)(b))
+#define MAX_T(type, a, b) __cmp(max, (type)(a), (type)(b))
#endif /* _LINUX_MINMAX_H */
--
2.47.3
^ permalink raw reply related
* [PATCH v3 14/19 5.15.y] minmax.h: update some comments
From: Eliav Farber @ 2025-10-08 15:29 UTC (permalink / raw)
To: gregkh, jdike, richard, anton.ivanov, dave.hansen, luto, peterz,
tglx, mingo, bp, x86, hpa, tony.luck, qiuxu.zhuo, james.morse,
rric, airlied, daniel, maarten.lankhorst, mripard, tzimmermann,
robdclark, sean, jdelvare, linux, linus.walleij, dmitry.torokhov,
maz, wens, jernej.skrabec, agk, snitzer, dm-devel, davem, kuba,
mcoquelin.stm32, krzysztof.kozlowski, malattia, hdegoede, mgross,
jejb, martin.petersen, sakari.ailus, clm, josef, dsterba, jack,
tytso, adilger.kernel, dushistov, luc.vanoostenryck, rostedt,
pmladek, senozhatsky, andriy.shevchenko, linux, minchan, ngupta,
akpm, yoshfuji, dsahern, pablo, kadlec, fw, jmaloy, ying.xue,
shuah, willy, farbere, sashal, quic_akhilpo, ruanjinjie,
David.Laight, herve.codina, linux-arm-kernel, linux-kernel,
linux-um, linux-edac, amd-gfx, dri-devel, linux-arm-msm,
freedreno, linux-hwmon, linux-input, linux-sunxi, linux-media,
netdev, linux-stm32, platform-driver-x86, linux-scsi,
linux-staging, linux-btrfs, linux-ext4, linux-sparse, linux-mm,
netfilter-devel, coreteam, tipc-discussion, linux-kselftest,
stable
Cc: Arnd Bergmann, Christoph Hellwig, Dan Carpenter,
Jason A. Donenfeld, Jens Axboe, Lorenzo Stoakes, Mateusz Guzik,
Pedro Falcato
In-Reply-To: <20251008152946.29285-1-farbere@amazon.com>
From: David Laight <David.Laight@ACULAB.COM>
[ Upstream commit 10666e99204818ef45c702469488353b5bb09ec7 ]
- Change three to several.
- Remove the comment about retaining constant expressions, no longer true.
- Realign to nearer 80 columns and break on major punctiation.
- Add a leading comment to the block before __signed_type() and __is_nonneg()
Otherwise the block explaining the cast is a bit 'floating'.
Reword the rest of that comment to improve readability.
Link: https://lkml.kernel.org/r/85b050c81c1d4076aeb91a6cded45fee@AcuMS.aculab.com
Signed-off-by: David Laight <david.laight@aculab.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Arnd Bergmann <arnd@kernel.org>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Dan Carpenter <dan.carpenter@linaro.org>
Cc: Jason A. Donenfeld <Jason@zx2c4.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Mateusz Guzik <mjguzik@gmail.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Pedro Falcato <pedro.falcato@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Eliav Farber <farbere@amazon.com>
---
include/linux/minmax.h | 53 +++++++++++++++++++-----------------------
1 file changed, 24 insertions(+), 29 deletions(-)
diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index 51b0d988e322..24e4b372649a 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -8,13 +8,10 @@
#include <linux/types.h>
/*
- * min()/max()/clamp() macros must accomplish three things:
+ * min()/max()/clamp() macros must accomplish several things:
*
* - Avoid multiple evaluations of the arguments (so side-effects like
* "x++" happen only once) when non-constant.
- * - Retain result as a constant expressions when called with only
- * constant expressions (to avoid tripping VLA warnings in stack
- * allocation usage).
* - Perform signed v unsigned type-checking (to generate compile
* errors instead of nasty runtime surprises).
* - Unsigned char/short are always promoted to signed int and can be
@@ -31,25 +28,23 @@
* bit #0 set if ok for unsigned comparisons
* bit #1 set if ok for signed comparisons
*
- * In particular, statically non-negative signed integer
- * expressions are ok for both.
+ * In particular, statically non-negative signed integer expressions
+ * are ok for both.
*
- * NOTE! Unsigned types smaller than 'int' are implicitly
- * converted to 'int' in expressions, and are accepted for
- * signed conversions for now. This is debatable.
+ * NOTE! Unsigned types smaller than 'int' are implicitly converted to 'int'
+ * in expressions, and are accepted for signed conversions for now.
+ * This is debatable.
*
- * Note that 'x' is the original expression, and 'ux' is
- * the unique variable that contains the value.
+ * Note that 'x' is the original expression, and 'ux' is the unique variable
+ * that contains the value.
*
- * We use 'ux' for pure type checking, and 'x' for when
- * we need to look at the value (but without evaluating
- * it for side effects! Careful to only ever evaluate it
- * with sizeof() or __builtin_constant_p() etc).
+ * We use 'ux' for pure type checking, and 'x' for when we need to look at the
+ * value (but without evaluating it for side effects!
+ * Careful to only ever evaluate it with sizeof() or __builtin_constant_p() etc).
*
- * Pointers end up being checked by the normal C type
- * rules at the actual comparison, and these expressions
- * only need to be careful to not cause warnings for
- * pointer use.
+ * Pointers end up being checked by the normal C type rules at the actual
+ * comparison, and these expressions only need to be careful to not cause
+ * warnings for pointer use.
*/
#define __signed_type_use(x, ux) (2 + __is_nonneg(x, ux))
#define __unsigned_type_use(x, ux) (1 + 2 * (sizeof(ux) < 4))
@@ -57,19 +52,19 @@
__signed_type_use(x, ux) : __unsigned_type_use(x, ux))
/*
- * To avoid warnings about casting pointers to integers
- * of different sizes, we need that special sign type.
+ * Check whether a signed value is always non-negative.
*
- * On 64-bit we can just always use 'long', since any
- * integer or pointer type can just be cast to that.
+ * A cast is needed to avoid any warnings from values that aren't signed
+ * integer types (in which case the result doesn't matter).
*
- * This does not work for 128-bit signed integers since
- * the cast would truncate them, but we do not use s128
- * types in the kernel (we do use 'u128', but they will
- * be handled by the !is_signed_type() case).
+ * On 64-bit any integer or pointer type can safely be cast to 'long'.
+ * But on 32-bit we need to avoid warnings about casting pointers to integers
+ * of different sizes without truncating 64-bit values so 'long' or 'long long'
+ * must be used depending on the size of the value.
*
- * NOTE! The cast is there only to avoid any warnings
- * from when values that aren't signed integer types.
+ * This does not work for 128-bit signed integers since the cast would truncate
+ * them, but we do not use s128 types in the kernel (we do use 'u128',
+ * but they are handled by the !is_signed_type() case).
*/
#ifdef CONFIG_64BIT
#define __signed_type(ux) long
--
2.47.3
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox