* [PATCH 0/2] HID: appletb-kbd: fix UAF and mutex-in-atomic in inactivity timer
From: Sangyun Kim @ 2026-04-20 5:13 UTC (permalink / raw)
To: jikos, bentiss; +Cc: qasdev00, gargaditya08, linux-input, linux-kernel
This series addresses two defects in hid-appletb-kbd's inactivity
timer subsystem. The two patches target different bugs and are
logically independent; they are sent together because they touch the
same tear-down code and because the same maintainer will review both.
Patch 1 fixes a slab use-after-free with two related tear-down windows
introduced by commit 38224c472a03 ("HID: appletb-kbd: fix slab
use-after-free bug in appletb_kbd_probe"):
A) Within "if (kbd->backlight_dev)" the order was
put_device() then timer_delete_sync(). A concurrent
hid_appletb_bl unbind between those two calls can drop the last
devm reference and free the backlight_device; the still-armed
inactivity timer softirq then dereferences the freed object
through backlight_device_set_brightness() -> mutex_lock(&ops_lock).
B) The "if (kbd->backlight_dev)" block ran before
hid_hw_close()/hid_hw_stop(), so even after window A is closed a
late ".event" callback from the HID core (USB URB completion on
real hardware) can arrive between timer_delete_sync() and
put_device(), reach reset_inactivity_timer(), re-arm the timer
via mod_timer(), and reopen the same UAF.
Both windows produce the same KASAN slab-use-after-free on the object
allocated by devm_backlight_device_register(). Patch 1 closes them
together by moving hid_hw_close()/hid_hw_stop() before the backlight
cleanup and, inside that cleanup block, calling timer_delete_sync()
before put_device(). Shipping both as one commit avoids leaving
stable kernels in a half-fixed state where only window A is closed.
Patch 2 fixes a separate "sleeping function called from invalid
context" bug in the same subsystem. The inactivity timer is a
struct timer_list, so the callback runs in softirq context and calls
backlight_device_set_brightness() -> mutex_lock() from atomic
context; reset_inactivity_timer() has the same issue on the
brightness-restore path (it is called from appletb_kbd_hid_event()
and appletb_kbd_inp_event(), which run in softirq/IRQ context on
real USB hardware). Convert the inactivity timer to a delayed_work
and defer the brightness-restore call to a dedicated work_struct so
both sleeping calls run in process context.
Sangyun Kim (2):
HID: appletb-kbd: fix UAF in inactivity-timer cleanup path
HID: appletb-kbd: run inactivity autodim from workqueues
drivers/hid/hid-appletb-kbd.c | 56 ++++++++++++++++++++++-------------
1 file changed, 36 insertions(+), 20 deletions(-)
--
2.34.1
^ permalink raw reply
* Re: [PATCH v5 4/4] Input: charlieplex_keypad: add GPIO charlieplex keypad
From: Dmitry Torokhov @ 2026-04-20 4:47 UTC (permalink / raw)
To: Hugo Villeneuve
Cc: robin, andy, geert, robh, krzk+dt, conor+dt, hvilleneuve,
mkorpershoek, matthias.bgg, angelogioacchino.delregno, lee,
alexander.sverdlin, marek.vasut, akurz, devicetree, linux-kernel,
linux-input, linux-arm-kernel, linux-mediatek
In-Reply-To: <20260312180304.3865850-5-hugo@hugovil.com>
Hi Hugo,
On Thu, Mar 12, 2026 at 02:00:58PM -0400, Hugo Villeneuve wrote:
> +
> +static void charlieplex_keypad_report_key(struct input_dev *input)
> +{
> + struct charlieplex_keypad *keypad = input_get_drvdata(input);
> + const unsigned short *keycodes = input->keycode;
> +
> + if (keypad->current_code > 0) {
> + input_event(input, EV_MSC, MSC_SCAN, keypad->current_code);
> + input_report_key(input, keycodes[keypad->current_code], 0);
This needs input_sync() as otherwise userspace is free to only recognize
the last MSC_SCAN event.
> + }
> +
> + if (keypad->debounce_code) {
> + input_event(input, EV_MSC, MSC_SCAN, keypad->debounce_code);
> + input_report_key(input, keycodes[keypad->debounce_code], 1);
> + }
> +
> + input_sync(input);
> + keypad->current_code = keypad->debounce_code;
> +}
> +
> +static void charlieplex_keypad_check_switch_change(struct input_dev *input,
> + int code)
> +{
> + struct charlieplex_keypad *keypad = input_get_drvdata(input);
> +
> + if (code != keypad->debounce_code) {
> + keypad->debounce_count = 0;
> + keypad->debounce_code = code;
> + } else if (keypad->debounce_count < keypad->debounce_threshold) {
This does not work if debouncing is disabled (debounce threshold is 0).
> + keypad->debounce_count++;
> +
> + if (keypad->debounce_count >= keypad->debounce_threshold &&
> + keypad->debounce_code != keypad->current_code)
> + charlieplex_keypad_report_key(input);
> + }
> +}
> +
> +static void charlieplex_keypad_poll(struct input_dev *input)
> +{
> + struct charlieplex_keypad *keypad = input_get_drvdata(input);
> + int code;
> +
> + code = 0;
> + for (unsigned int oline = 0; oline < keypad->nlines; oline++) {
> + DECLARE_BITMAP(values, MATRIX_MAX_ROWS);
> + int err;
> +
> + /* Activate only one line as output at a time. */
> + gpiod_direction_output(keypad->line_gpios->desc[oline], 1);
> +
> + if (keypad->settling_time_us)
> + fsleep(keypad->settling_time_us);
> +
> + /* Read input on all other lines. */
> + err = gpiod_get_array_value_cansleep(keypad->line_gpios->ndescs,
> + keypad->line_gpios->desc,
> + keypad->line_gpios->info, values);
> + if (err)
> + return;
We need to deactivate the line on error too.
> +
> + for (unsigned int iline = 0; iline < keypad->nlines; iline++) {
> + if (iline == oline)
> + continue; /* Do not read active output line. */
> +
> + /* Check if GPIO is asserted. */
> + if (test_bit(iline, values)) {
> + code = MATRIX_SCAN_CODE(oline, iline,
> + get_count_order(keypad->nlines));
> + /*
> + * Exit loop immediately since we cannot detect
> + * more than one key press at a time.
> + */
> + break;
> + }
> + }
> +
> + gpiod_direction_input(keypad->line_gpios->desc[oline]);
> +
> + if (code)
> + break;
> + }
> +
> + charlieplex_keypad_check_switch_change(input, code);
> +}
> +
> +static int charlieplex_keypad_init_gpio(struct platform_device *pdev,
> + struct charlieplex_keypad *keypad)
> +{
> + char **pin_names;
> + char label[32];
> +
> + snprintf(label, sizeof(label), "%s-pin", pdev->name);
> +
> + keypad->line_gpios = devm_gpiod_get_array(&pdev->dev, "line", GPIOD_IN);
> + if (IS_ERR(keypad->line_gpios))
> + return PTR_ERR(keypad->line_gpios);
> +
> + keypad->nlines = keypad->line_gpios->ndescs;
> +
> + if (keypad->nlines > MATRIX_MAX_ROWS)
> + return -EINVAL;
> +
> + pin_names = devm_kasprintf_strarray(&pdev->dev, label, keypad->nlines);
> + if (IS_ERR(pin_names))
> + return PTR_ERR(pin_names);
> +
> + for (unsigned int i = 0; i < keypad->line_gpios->ndescs; i++)
> + gpiod_set_consumer_name(keypad->line_gpios->desc[i], pin_names[i]);
> +
> + return 0;
> +}
> +
> +static int charlieplex_keypad_probe(struct platform_device *pdev)
> +{
> + struct charlieplex_keypad *keypad;
> + unsigned int debounce_interval_ms;
> + unsigned int poll_interval_ms;
> + struct input_dev *input_dev;
> + int err;
> +
> + keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL);
> + if (!keypad)
> + return -ENOMEM;
> +
> + input_dev = devm_input_allocate_device(&pdev->dev);
> + if (!input_dev)
> + return -ENOMEM;
> +
> + keypad->input_dev = input_dev;
> +
> + device_property_read_u32(&pdev->dev, "poll-interval", &poll_interval_ms);
> + device_property_read_u32(&pdev->dev, "debounce-delay-ms", &debounce_interval_ms);
> + device_property_read_u32(&pdev->dev, "settling-time-us", &keypad->settling_time_us);
Not all of these are required properties. If they are missing the driver
will operate on garbage values.
> +
> + keypad->current_code = -1;
> + keypad->debounce_code = -1;
> + keypad->debounce_threshold = DIV_ROUND_UP(debounce_interval_ms, poll_interval_ms);
This will bomb if poll interval is 0.
> +
> + err = charlieplex_keypad_init_gpio(pdev, keypad);
> + if (err)
> + return err;
> +
> + input_dev->name = pdev->name;
> + input_dev->id.bustype = BUS_HOST;
> +
> + err = matrix_keypad_build_keymap(NULL, NULL, keypad->nlines,
> + keypad->nlines, NULL, input_dev);
> + if (err)
> + dev_err_probe(&pdev->dev, -ENOMEM, "failed to build keymap\n");
Missing "return".
> +
> + if (device_property_read_bool(&pdev->dev, "autorepeat"))
> + __set_bit(EV_REP, input_dev->evbit);
> +
> + input_set_capability(input_dev, EV_MSC, MSC_SCAN);
> +
> + err = input_setup_polling(input_dev, charlieplex_keypad_poll);
> + if (err)
> + dev_err_probe(&pdev->dev, err, "unable to set up polling\n");
Missing "return".
I fixed it up and applied, please take a look in my 'next' branch and
tell me if I messed up.
Thanks.
--
Dmitry
^ permalink raw reply
* Re: [PATCH] Input: imx_keypad - Fix spelling mistake "Colums" -> "Columns"
From: Frank Li @ 2026-04-20 1:57 UTC (permalink / raw)
To: Ethan Carter Edwards
Cc: Dmitry Torokhov, Sascha Hauer, Pengutronix Kernel Team,
Fabio Estevam, linux-input, imx, linux-arm-kernel, linux-kernel,
kernel-janitors
In-Reply-To: <20260418-imx-typo-v1-1-2a15e54ad4e7@ethancedwards.com>
On Sat, Apr 18, 2026 at 08:58:32PM -0400, Ethan Carter Edwards wrote:
> There is a spelling mistake in a two comments. Fix them.
>
> Signed-off-by: Ethan Carter Edwards <ethan@ethancedwards.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/input/keyboard/imx_keypad.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c
> index 069c1d6376e1..ccde60cd6bb3 100644
> --- a/drivers/input/keyboard/imx_keypad.c
> +++ b/drivers/input/keyboard/imx_keypad.c
> @@ -324,7 +324,7 @@ static void imx_keypad_config(struct imx_keypad *keypad)
> reg_val |= (keypad->cols_en_mask & 0xff) << 8; /* cols */
> writew(reg_val, keypad->mmio_base + KPCR);
>
> - /* Write 0's to KPDR[15:8] (Colums) */
> + /* Write 0's to KPDR[15:8] (Columns) */
> reg_val = readw(keypad->mmio_base + KPDR);
> reg_val &= 0x00ff;
> writew(reg_val, keypad->mmio_base + KPDR);
> @@ -357,7 +357,7 @@ static void imx_keypad_inhibit(struct imx_keypad *keypad)
> reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD;
> writew(reg_val, keypad->mmio_base + KPSR);
>
> - /* Colums as open drain and disable all rows */
> + /* Columns as open drain and disable all rows */
> reg_val = (keypad->cols_en_mask & 0xff) << 8;
> writew(reg_val, keypad->mmio_base + KPCR);
> }
>
> ---
> base-commit: c7275b05bc428c7373d97aa2da02d3a7fa6b9f66
> change-id: 20260418-imx-typo-14370bd2ce47
>
> Best regards,
> --
> Ethan Carter Edwards <ethan@ethancedwards.com>
>
^ permalink raw reply
* Re: [PATCH] Input: touchscreen: tsc2007: Reduce I2C transactions for Z2 read
From: Dmitry Torokhov @ 2026-04-20 0:18 UTC (permalink / raw)
To: Yuki Horii; +Cc: clamor95, johannes.kirchmair, linux-input, Andreas Kemnade
In-Reply-To: <20260410074100.1660-1-horiiyuk@ishida.co.jp>
Hi Yuki,
On Fri, Apr 10, 2026 at 04:41:00PM +0900, Yuki Horii wrote:
> From: Yuki Horii <yuuki198708@gmail.com>
>
> The current implementation sends a separate power-down command
> after reading the Z2 value, resulting in an extra I2C
> transaction per measurement cycle.
>
> The TSC2007 command byte contains a 2-bit power-down mode
> selection field. By selecting the power-down state in the Z2
> measurement command, the device powers down after the Z2 A/D
> conversion completes, eliminating the subsequent power-down
> transaction.
>
> This reduces the number of I2C transactions by one per touch
> measurement cycle, decreasing I2C bus overhead and improving
> touch sampling performance.
>
> Signed-off-by: Yuki Horii <yuuki198708@gmail.com>
> ---
> drivers/input/touchscreen/tsc2007_core.c | 6 ++----
> 1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/input/touchscreen/tsc2007_core.c b/drivers/input/touchscreen/tsc2007_core.c
> index 948935de894b..ff60245baa96 100644
> --- a/drivers/input/touchscreen/tsc2007_core.c
> +++ b/drivers/input/touchscreen/tsc2007_core.c
> @@ -61,10 +61,8 @@ static void tsc2007_read_values(struct tsc2007 *tsc, struct ts_event *tc)
>
> /* turn y+ off, x- on; we'll use formula #1 */
> tc->z1 = tsc2007_xfer(tsc, READ_Z1);
> - tc->z2 = tsc2007_xfer(tsc, READ_Z2);
> -
> - /* Prepare for next touch reading - power down ADC, enable PENIRQ */
> - tsc2007_xfer(tsc, PWRDOWN);
> + /* Read Z2 and power down ADC after A/D conversion, enable PENIRQ */
> + tc->z2 = tsc2007_xfer(tsc, (TSC2007_POWER_OFF_IRQ_EN | TSC2007_MEASURE_Z2));
> }
>
> u32 tsc2007_calculate_resistance(struct tsc2007 *tsc, struct ts_event *tc)
Thank you for the patch.
I'd like people using this part to chime in (CCed).
Thanks.
--
Dmitry
^ permalink raw reply
* Re: [PATCH v2 1/2] Input: ads7846 - restore half-duplex support
From: Dmitry Torokhov @ 2026-04-20 0:13 UTC (permalink / raw)
To: Aaro Koskinen
Cc: Oleksij Rempel, Janusz Krzysztofik, Tony Lindgren, Linus Walleij,
linux-input, linux-kernel, linux-omap
In-Reply-To: <20260419161848.825831-2-aaro.koskinen@iki.fi>
Hi Aaro,
On Sun, Apr 19, 2026 at 07:18:47PM +0300, Aaro Koskinen wrote:
> +static void ads7846_halfd_read_state(struct ads7846 *ts)
> +{
> + struct ads7846_packet *packet = ts->packet;
> + int msg_idx = 0;
> +
> + packet->ignore = false;
> +
> + while (msg_idx < ts->msg_count) {
> + int error;
> +
> + ads7846_wait_for_hsync(ts);
> +
> + error = spi_sync(ts->spi, &ts->msg[msg_idx]);
> + if (error) {
> + dev_err_ratelimited(&ts->spi->dev, "spi_sync --> %d\n",
> + error);
> + packet->ignore = true;
> + return;
Sashiko recommends trying to power down ADC on errors, what do you
think?
Thanks.
--
Dmitry
^ permalink raw reply
* Re: [PATCH v2 2/2] Input: ads7846 - fix up the pendown GPIO setup on Nokia 770
From: Dmitry Torokhov @ 2026-04-20 0:06 UTC (permalink / raw)
To: Aaro Koskinen
Cc: Oleksij Rempel, Janusz Krzysztofik, Tony Lindgren, Linus Walleij,
linux-input, linux-kernel, linux-omap
In-Reply-To: <20260419161848.825831-3-aaro.koskinen@iki.fi>
Hi Aaro,
On Sun, Apr 19, 2026 at 07:18:48PM +0300, Aaro Koskinen wrote:
> Commit 767d83361aaa6 ("Input: ads7846 - Convert to use software nodes")
> added gpiod set up for the IRQ in the 770 board file, then another in
> the touchscreen driver for reading the pen state. This will make the probe
> fail:
>
> [ 1.347381] ads7846 spi2.0: failed to request pendown GPIO
> [ 1.361846] ads7846: probe of spi2.0 failed with error -16
>
> I originally tried to fix it using non-exclusive flag, but that was not
> found acceptable. Instead, just use a single gpiod.
>
> Fixes: 767d83361aaa6 ("Input: ads7846 - Convert to use software nodes")
> Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
> ---
> arch/arm/mach-omap1/board-nokia770.c | 11 -----------
> drivers/input/touchscreen/ads7846.c | 12 +++++++-----
> 2 files changed, 7 insertions(+), 16 deletions(-)
>
> diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c
> index a5bf5554800f..8b8013ab4590 100644
> --- a/arch/arm/mach-omap1/board-nokia770.c
> +++ b/arch/arm/mach-omap1/board-nokia770.c
> @@ -285,9 +285,6 @@ static void __init nokia770_cbus_init(void)
> static struct gpiod_lookup_table nokia770_irq_gpio_table = {
> .dev_id = NULL,
> .table = {
> - /* GPIO used by SPI device 1 */
> - GPIO_LOOKUP("gpio-0-15", 15, "ads7846_irq",
> - GPIO_ACTIVE_HIGH),
> /* GPIO used for retu IRQ */
> GPIO_LOOKUP("gpio-48-63", 14, "retu_irq",
> GPIO_ACTIVE_HIGH),
> @@ -307,8 +304,6 @@ static struct gpiod_lookup_table nokia770_irq_gpio_table = {
>
> static void __init omap_nokia770_init(void)
> {
> - struct gpio_desc *d;
> -
> /* On Nokia 770, the SleepX signal is masked with an
> * MPUIO line by default. It has to be unmasked for it
> * to become functional */
> @@ -322,12 +317,6 @@ static void __init omap_nokia770_init(void)
> platform_add_devices(nokia770_devices, ARRAY_SIZE(nokia770_devices));
>
> gpiod_add_lookup_table(&nokia770_irq_gpio_table);
> - d = gpiod_get(NULL, "ads7846_irq", GPIOD_IN);
> - if (IS_ERR(d))
> - pr_err("Unable to get ADS7846 IRQ GPIO descriptor\n");
> - else
> - nokia770_spi_board_info[1].irq = gpiod_to_irq(d);
No, I think what we need here is a simple gpiod_put(). The mapping is
not going to change unless someone tries to unload gpiochip, but then
the device is not going to work anyway.
Longer term we need to figure out how to describe interrupts with
software nodes (or wait long enough for everything to get converted to
device tree).
Thanks.
--
Dmitry
^ permalink raw reply
* Re: [PATCH v2 0/2] Input/omap1: fix touchscreen functionality on Nokia 770
From: Linus Walleij @ 2026-04-19 20:10 UTC (permalink / raw)
To: Aaro Koskinen
Cc: Dmitry Torokhov, Oleksij Rempel, Janusz Krzysztofik,
Tony Lindgren, linux-input, linux-kernel, linux-omap
In-Reply-To: <20260419161848.825831-1-aaro.koskinen@iki.fi>
On Sun, Apr 19, 2026 at 6:21 PM Aaro Koskinen <aaro.koskinen@iki.fi> wrote:
> Another attempt to make 770 touchscreen work again.
>
> v2: Unrelated fbdev patch dropped (already merged)
> GPIO setup fixed by deleting the conflicting descriptor.
>
> v1: https://lore.kernel.org/linux-input/20250102181953.1020878-1-aaro.koskinen@iki.fi/
>
> Aaro Koskinen (2):
> Input: ads7846 - restore half-duplex support
> Input: ads7846 - fix up the pendown GPIO setup on Nokia 770
Patches look good to me!
Reviewed-by: Linus Walleij <linusw@kernel.org>
Yours,
Linus Walleij
^ permalink raw reply
* Re: [PATCH 2/3] Input: adafruit-seesaw - add interrupt support
From: Charles Dias @ 2026-04-19 19:24 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Anshul Dalal, Shuah Khan, Brigham Campbell, linux-input,
linux-kernel, Charles Dias
In-Reply-To: <CAHua+AMP-gwgFCX67rdDrfS8RUGpiw2msKYRn07AVWy+u_vTwQ@mail.gmail.com>
On Tue, Mar 24, 2026 at 10:59 AM Charles Dias
<charles.embedded@gmail.com> wrote:
>
> On Mon, Mar 23, 2026 at 2:12 AM Dmitry Torokhov
> <dmitry.torokhov@gmail.com> wrote:
> >
> > Hi Charles,
> >
> > On Sat, Mar 21, 2026 at 05:24:45PM -0300, charles.embedded@gmail.com wrote:
> > > @@ -289,6 +341,19 @@ static int seesaw_probe(struct i2c_client *client)
> > > input_set_max_poll_interval(seesaw->input_dev, SEESAW_GAMEPAD_POLL_MAX);
> > > input_set_min_poll_interval(seesaw->input_dev, SEESAW_GAMEPAD_POLL_MIN);
> > >
> > > + if (client->irq) {
> > > + err = seesaw_register_write_u32(client, SEESAW_GPIO_INTENSET, SEESAW_BUTTON_MASK);
> > > + if (err)
> > > + return dev_err_probe(&client->dev, err,
> > > + "failed to enable hardware interrupts\n");
> >
> > Maybe this should be in seesaw_open()?
> >
> > Thanks.
> >
> > --
> > Dmitry
>
> Hi Dmitry. Thank you for your review!
>
> Since this is a one-time setup, I believe it should remain as is
> within the seesaw_probe() function, similar to other pin
> configurations.
>
> Please let me know if I'm missing any point here.
>
> Best regards,
> Charles Dias
Hi Dmitry,
I just wanted to follow up on my previous response regarding the initialization.
Please let me know if there is anything else you'd like me to address
or if there are any further changes needed on my end. Thank you!
Best regards,
Charles Dias
^ permalink raw reply
* [PATCH v2] iio: magnetometer: hid-sensor-magn-3d: prefer 'unsigned int'
From: Joshua Crofts @ 2026-04-19 18:05 UTC (permalink / raw)
To: jikos, jic23, srinivas.pandruvada
Cc: dlechner, nuno.sa, andy, linux-input, linux-iio, linux-kernel,
Joshua Crofts
Use 'u32' instead of bare 'unsigned' to resolve checkpatch.pl warnings
and correct type use as defined in the hid_sensor_hub_callbacks struct.
No functional change.
Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
---
v2:
- changed 'unsigned int' to 'u32' per struct definition
drivers/iio/magnetometer/hid-sensor-magn-3d.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/iio/magnetometer/hid-sensor-magn-3d.c b/drivers/iio/magnetometer/hid-sensor-magn-3d.c
index c673f9323e..b01dd53eb1 100644
--- a/drivers/iio/magnetometer/hid-sensor-magn-3d.c
+++ b/drivers/iio/magnetometer/hid-sensor-magn-3d.c
@@ -280,7 +280,7 @@ static const struct iio_info magn_3d_info = {
/* Callback handler to send event after all samples are received and captured */
static int magn_3d_proc_event(struct hid_sensor_hub_device *hsdev,
- unsigned usage_id,
+ u32 usage_id,
void *priv)
{
struct iio_dev *indio_dev = platform_get_drvdata(priv);
@@ -302,7 +302,7 @@ static int magn_3d_proc_event(struct hid_sensor_hub_device *hsdev,
/* Capture samples in local storage */
static int magn_3d_capture_sample(struct hid_sensor_hub_device *hsdev,
- unsigned usage_id,
+ u32 usage_id,
size_t raw_len, char *raw_data,
void *priv)
{
@@ -350,7 +350,7 @@ static int magn_3d_parse_report(struct platform_device *pdev,
struct hid_sensor_hub_device *hsdev,
struct iio_chan_spec **channels,
int *chan_count,
- unsigned usage_id,
+ u32 usage_id,
struct magn_3d_state *st)
{
int i;
--
2.34.1
^ permalink raw reply related
* Re: [PATCH v2 1/4] HID: pass the buffer size to hid_report_raw_event
From: Icenowy Zheng @ 2026-04-19 16:26 UTC (permalink / raw)
To: Benjamin Tissoires, Jiri Kosina, Filipe Laíns,
Bastien Nocera, Ping Cheng, Jason Gerecke, Viresh Kumar,
Johan Hovold, Alex Elder, Greg Kroah-Hartman, Lee Jones
Cc: linux-input, linux-kernel, greybus-dev, linux-staging, linux-usb,
stable
In-Reply-To: <20260416-wip-fix-core-v2-1-be92570e5627@kernel.org>
在 2026-04-16四的 16:48 +0200,Benjamin Tissoires写道:
> commit 0a3fe972a7cb ("HID: core: Mitigate potential OOB by removing
> bogus memset()") enforced the provided data to be at least the size
> of
> the declared buffer in the report descriptor to prevent a buffer
> overflow. However, we can try to be smarter by providing both the
> buffer
> size and the data size, meaning that hid_report_raw_event() can make
> better decision whether we should plaining reject the buffer (buffer
> overflow attempt) or if we can safely memset it to 0 and pass it to
> the
> rest of the stack.
>
> Fixes: 0a3fe972a7cb ("HID: core: Mitigate potential OOB by removing
> bogus memset()")
> Cc: stable@vger.kernel.org
> Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
> ---
> drivers/hid/bpf/hid_bpf_dispatch.c | 6 ++++--
> drivers/hid/hid-core.c | 42 +++++++++++++++++++++++++---
> ----------
> drivers/hid/hid-gfrm.c | 4 ++--
> drivers/hid/hid-logitech-hidpp.c | 2 +-
> drivers/hid/hid-multitouch.c | 2 +-
> drivers/hid/hid-primax.c | 2 +-
> drivers/hid/hid-vivaldi-common.c | 2 +-
> drivers/hid/wacom_sys.c | 6 +++---
> drivers/staging/greybus/hid.c | 2 +-
> include/linux/hid.h | 4 ++--
> include/linux/hid_bpf.h | 14 ++++++++-----
> 11 files changed, 53 insertions(+), 33 deletions(-)
============ 8< ===================
> diff --git a/drivers/staging/greybus/hid.c
> b/drivers/staging/greybus/hid.c
> index 1f58c907c036..37e8605c6767 100644
> --- a/drivers/staging/greybus/hid.c
> +++ b/drivers/staging/greybus/hid.c
> @@ -201,7 +201,7 @@ static void gb_hid_init_report(struct gb_hid
> *ghid, struct hid_report *report)
> * we just need to setup the input fields, so using
> * hid_report_raw_event is safe.
> */
> - hid_report_raw_event(ghid->hid, report->type, ghid->inbuf,
> size, 1);
> + hid_report_raw_event(ghid->hid, report->type, ghid->inbuf,
> ghib->bufsize, size, 1);
Oops, "ghid" is misspelled here...
Found this when building some gaint kernel with this patchset.
Thanks,
Icenowy
> }
>
> static void gb_hid_init_reports(struct gb_hid *ghid)
^ permalink raw reply
* [PATCH v2 2/2] Input: ads7846 - fix up the pendown GPIO setup on Nokia 770
From: Aaro Koskinen @ 2026-04-19 16:18 UTC (permalink / raw)
To: Dmitry Torokhov, Oleksij Rempel, Janusz Krzysztofik,
Tony Lindgren, Linus Walleij, linux-input
Cc: linux-kernel, linux-omap, Aaro Koskinen
In-Reply-To: <20260419161848.825831-1-aaro.koskinen@iki.fi>
Commit 767d83361aaa6 ("Input: ads7846 - Convert to use software nodes")
added gpiod set up for the IRQ in the 770 board file, then another in
the touchscreen driver for reading the pen state. This will make the probe
fail:
[ 1.347381] ads7846 spi2.0: failed to request pendown GPIO
[ 1.361846] ads7846: probe of spi2.0 failed with error -16
I originally tried to fix it using non-exclusive flag, but that was not
found acceptable. Instead, just use a single gpiod.
Fixes: 767d83361aaa6 ("Input: ads7846 - Convert to use software nodes")
Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
---
arch/arm/mach-omap1/board-nokia770.c | 11 -----------
drivers/input/touchscreen/ads7846.c | 12 +++++++-----
2 files changed, 7 insertions(+), 16 deletions(-)
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c
index a5bf5554800f..8b8013ab4590 100644
--- a/arch/arm/mach-omap1/board-nokia770.c
+++ b/arch/arm/mach-omap1/board-nokia770.c
@@ -285,9 +285,6 @@ static void __init nokia770_cbus_init(void)
static struct gpiod_lookup_table nokia770_irq_gpio_table = {
.dev_id = NULL,
.table = {
- /* GPIO used by SPI device 1 */
- GPIO_LOOKUP("gpio-0-15", 15, "ads7846_irq",
- GPIO_ACTIVE_HIGH),
/* GPIO used for retu IRQ */
GPIO_LOOKUP("gpio-48-63", 14, "retu_irq",
GPIO_ACTIVE_HIGH),
@@ -307,8 +304,6 @@ static struct gpiod_lookup_table nokia770_irq_gpio_table = {
static void __init omap_nokia770_init(void)
{
- struct gpio_desc *d;
-
/* On Nokia 770, the SleepX signal is masked with an
* MPUIO line by default. It has to be unmasked for it
* to become functional */
@@ -322,12 +317,6 @@ static void __init omap_nokia770_init(void)
platform_add_devices(nokia770_devices, ARRAY_SIZE(nokia770_devices));
gpiod_add_lookup_table(&nokia770_irq_gpio_table);
- d = gpiod_get(NULL, "ads7846_irq", GPIOD_IN);
- if (IS_ERR(d))
- pr_err("Unable to get ADS7846 IRQ GPIO descriptor\n");
- else
- nokia770_spi_board_info[1].irq = gpiod_to_irq(d);
-
spi_register_board_info(nokia770_spi_board_info,
ARRAY_SIZE(nokia770_spi_board_info));
omap_serial_init();
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
index 4f8cc450e779..ca7dbd3afe29 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -1084,6 +1084,8 @@ static int ads7846_setup_pendown(struct spi_device *spi,
dev_err(&spi->dev, "failed to request pendown GPIO\n");
return PTR_ERR(ts->gpio_pendown);
}
+ if (!spi->irq)
+ spi->irq = gpiod_to_irq(ts->gpio_pendown);
if (pdata->gpio_pendown_debounce)
gpiod_set_debounce(ts->gpio_pendown,
pdata->gpio_pendown_debounce);
@@ -1374,11 +1376,6 @@ static int ads7846_probe(struct spi_device *spi)
unsigned long irq_flags;
int err;
- if (!spi->irq) {
- dev_dbg(dev, "no IRQ?\n");
- return -EINVAL;
- }
-
/* don't exceed max specified sample rate */
if (spi->max_speed_hz > (125000 * SAMPLE_BITS)) {
dev_err(dev, "f(sample) %d KHz?\n",
@@ -1455,6 +1452,11 @@ static int ads7846_probe(struct spi_device *spi)
if (err)
return err;
+ if (!spi->irq) {
+ dev_dbg(dev, "no IRQ?\n");
+ return -EINVAL;
+ }
+
if (pdata->penirq_recheck_delay_usecs)
ts->penirq_recheck_delay_usecs =
pdata->penirq_recheck_delay_usecs;
--
2.39.2
^ permalink raw reply related
* [PATCH v2 1/2] Input: ads7846 - restore half-duplex support
From: Aaro Koskinen @ 2026-04-19 16:18 UTC (permalink / raw)
To: Dmitry Torokhov, Oleksij Rempel, Janusz Krzysztofik,
Tony Lindgren, Linus Walleij, linux-input
Cc: linux-kernel, linux-omap, Aaro Koskinen
In-Reply-To: <20260419161848.825831-1-aaro.koskinen@iki.fi>
On some boards, the SPI controller is limited to half-duplex and the driver
fails spamming "ads7846 spi2.1: spi_sync --> -22". Restore half-duplex
support with multiple SPI transfers.
Fixes: 9c9509717b53 ("Input: ads7846 - convert to full duplex")
Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
---
drivers/input/touchscreen/ads7846.c | 168 +++++++++++++++++++++++++++-
1 file changed, 166 insertions(+), 2 deletions(-)
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
index 0963b1a78a0c..4f8cc450e779 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -134,6 +134,9 @@ struct ads7846 {
bool disabled; /* P: lock */
bool suspended; /* P: lock */
+ int (*setup_spi_msg)(struct ads7846 *ts,
+ const struct ads7846_platform_data *pdata);
+ void (*read_state)(struct ads7846 *ts);
int (*filter)(void *data, int data_idx, int *val);
void *filter_data;
int (*get_pendown_state)(void);
@@ -797,6 +800,22 @@ static int ads7846_filter(struct ads7846 *ts)
return 0;
}
+static int ads7846_filter_one(struct ads7846 *ts, unsigned int cmd_idx)
+{
+ struct ads7846_packet *packet = ts->packet;
+ struct ads7846_buf_layout *l = &packet->l[cmd_idx];
+ int action, val;
+
+ val = ads7846_get_value(&packet->rx[l->offset + l->count - 1]);
+ action = ts->filter(ts->filter_data, cmd_idx, &val);
+ if (action == ADS7846_FILTER_REPEAT)
+ return -EAGAIN;
+ else if (action != ADS7846_FILTER_OK)
+ return -EIO;
+ ads7846_set_cmd_val(ts, cmd_idx, val);
+ return 0;
+}
+
static void ads7846_wait_for_hsync(struct ads7846 *ts)
{
if (ts->wait_for_sync) {
@@ -819,6 +838,45 @@ static void ads7846_wait_for_hsync(struct ads7846 *ts)
cpu_relax();
}
+static void ads7846_halfd_read_state(struct ads7846 *ts)
+{
+ struct ads7846_packet *packet = ts->packet;
+ int msg_idx = 0;
+
+ packet->ignore = false;
+
+ while (msg_idx < ts->msg_count) {
+ int error;
+
+ ads7846_wait_for_hsync(ts);
+
+ error = spi_sync(ts->spi, &ts->msg[msg_idx]);
+ if (error) {
+ dev_err_ratelimited(&ts->spi->dev, "spi_sync --> %d\n",
+ error);
+ packet->ignore = true;
+ return;
+ }
+
+ /*
+ * Last message is power down request, no need to convert
+ * or filter the value.
+ */
+ if (msg_idx == ts->msg_count - 1)
+ break;
+
+ error = ads7846_filter_one(ts, msg_idx);
+ if (error == -EAGAIN) {
+ continue;
+ } else if (error) {
+ packet->ignore = true;
+ msg_idx = ts->msg_count - 1;
+ } else {
+ msg_idx++;
+ }
+ }
+}
+
static void ads7846_read_state(struct ads7846 *ts)
{
struct ads7846_packet *packet = ts->packet;
@@ -947,7 +1005,7 @@ static irqreturn_t ads7846_irq(int irq, void *handle)
while (!ts->stopped && get_pendown_state(ts)) {
/* pen is down, continue with the measurement */
- ads7846_read_state(ts);
+ ts->read_state(ts);
if (!ts->stopped)
ads7846_report_state(ts);
@@ -1034,6 +1092,102 @@ static int ads7846_setup_pendown(struct spi_device *spi,
return 0;
}
+/*
+ * Set up the transfers to read touchscreen state; this assumes we
+ * use formula #2 for pressure, not #3.
+ */
+static int ads7846_halfd_spi_msg(struct ads7846 *ts,
+ const struct ads7846_platform_data *pdata)
+{
+ struct spi_message *m = ts->msg;
+ struct spi_transfer *x = ts->xfer;
+ struct ads7846_packet *packet = ts->packet;
+ int vref = pdata->keep_vref_on;
+ unsigned int offset = 0;
+ unsigned int cmd_idx, b;
+ size_t size = 0;
+
+ if (pdata->settle_delay_usecs)
+ packet->count = 2;
+ else
+ packet->count = 1;
+
+ if (ts->model == 7846)
+ packet->cmds = 5; /* x, y, z1, z2, pwdown */
+ else
+ packet->cmds = 3; /* x, y, pwdown */
+
+ for (cmd_idx = 0; cmd_idx < packet->cmds; cmd_idx++) {
+ struct ads7846_buf_layout *l = &packet->l[cmd_idx];
+ unsigned int max_count;
+
+ if (cmd_idx == packet->cmds - 1) {
+ cmd_idx = ADS7846_PWDOWN;
+ max_count = 1;
+ } else {
+ max_count = packet->count;
+ }
+
+ l->offset = offset;
+ offset += max_count;
+ l->count = max_count;
+ l->skip = 0;
+ size += sizeof(*packet->rx) * max_count;
+ }
+
+ /* We use two transfers per command. */
+ if (ARRAY_SIZE(ts->xfer) < offset * 2)
+ return -ENOMEM;
+
+ packet->rx = devm_kzalloc(&ts->spi->dev, size, GFP_KERNEL);
+ if (!packet->rx)
+ return -ENOMEM;
+
+ if (ts->model == 7873) {
+ /*
+ * The AD7873 is almost identical to the ADS7846
+ * keep VREF off during differential/ratiometric
+ * conversion modes.
+ */
+ ts->model = 7846;
+ vref = 0;
+ }
+
+ ts->msg_count = 0;
+
+ for (cmd_idx = 0; cmd_idx < packet->cmds; cmd_idx++) {
+ struct ads7846_buf_layout *l = &packet->l[cmd_idx];
+ u8 cmd;
+
+ ts->msg_count++;
+ spi_message_init(m);
+ m->context = ts;
+
+ if (cmd_idx == packet->cmds - 1)
+ cmd_idx = ADS7846_PWDOWN;
+
+ cmd = ads7846_get_cmd(cmd_idx, vref);
+
+ for (b = 0; b < l->count; b++) {
+ packet->rx[l->offset + b].cmd = cmd;
+ x->tx_buf = &packet->rx[l->offset + b].cmd;
+ x->len = 1;
+ spi_message_add_tail(x, m);
+ x++;
+ x->rx_buf = &packet->rx[l->offset + b].data;
+ x->len = 2;
+ if (b < l->count - 1 && l->count > 1) {
+ x->delay.value = pdata->settle_delay_usecs;
+ x->delay.unit = SPI_DELAY_UNIT_USECS;
+ }
+ spi_message_add_tail(x, m);
+ x++;
+ }
+ m++;
+ }
+ return 0;
+}
+
/*
* Set up the transfers to read touchscreen state; this assumes we
* use formula #2 for pressure, not #3.
@@ -1248,6 +1402,14 @@ static int ads7846_probe(struct spi_device *spi)
if (!ts)
return -ENOMEM;
+ if (spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX) {
+ ts->setup_spi_msg = ads7846_halfd_spi_msg;
+ ts->read_state = ads7846_halfd_read_state;
+ } else {
+ ts->setup_spi_msg = ads7846_setup_spi_msg;
+ ts->read_state = ads7846_read_state;
+ }
+
packet = devm_kzalloc(dev, sizeof(struct ads7846_packet), GFP_KERNEL);
if (!packet)
return -ENOMEM;
@@ -1342,7 +1504,9 @@ static int ads7846_probe(struct spi_device *spi)
ts->core_prop.swap_x_y = true;
}
- ads7846_setup_spi_msg(ts, pdata);
+ err = ts->setup_spi_msg(ts, pdata);
+ if (err)
+ return err;
ts->reg = devm_regulator_get(dev, "vcc");
if (IS_ERR(ts->reg)) {
--
2.39.2
^ permalink raw reply related
* [PATCH v2 0/2] Input/omap1: fix touchscreen functionality on Nokia 770
From: Aaro Koskinen @ 2026-04-19 16:18 UTC (permalink / raw)
To: Dmitry Torokhov, Oleksij Rempel, Janusz Krzysztofik,
Tony Lindgren, Linus Walleij, linux-input
Cc: linux-kernel, linux-omap, Aaro Koskinen
Hi,
Another attempt to make 770 touchscreen work again.
v2: Unrelated fbdev patch dropped (already merged)
GPIO setup fixed by deleting the conflicting descriptor.
v1: https://lore.kernel.org/linux-input/20250102181953.1020878-1-aaro.koskinen@iki.fi/
Aaro Koskinen (2):
Input: ads7846 - restore half-duplex support
Input: ads7846 - fix up the pendown GPIO setup on Nokia 770
arch/arm/mach-omap1/board-nokia770.c | 11 --
drivers/input/touchscreen/ads7846.c | 180 +++++++++++++++++++++++++--
2 files changed, 173 insertions(+), 18 deletions(-)
--
2.39.2
^ permalink raw reply
* Re: [PATCH v2 00/19] tracepoint: Avoid double static_branch evaluation at guarded call sites
From: Vineeth Remanan Pillai @ 2026-04-19 13:14 UTC (permalink / raw)
To: Steven Rostedt
Cc: Peter Zijlstra, Dmitry Ilvokhin, Masami Hiramatsu,
Mathieu Desnoyers, Ingo Molnar, Jens Axboe, io-uring,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Alexei Starovoitov, Daniel Borkmann, Marcelo Ricardo Leitner,
Xin Long, Jon Maloy, Aaron Conole, Eelco Chaudron, Ilya Maximets,
netdev, bpf, linux-sctp, tipc-discussion, dev, Jiri Pirko,
Oded Gabbay, Koby Elbaz, dri-devel, Rafael J. Wysocki,
Viresh Kumar, Gautham R. Shenoy, Huang Rui, Mario Limonciello,
Len Brown, Srinivas Pandruvada, linux-pm, MyungJoo Ham,
Kyungmin Park, Chanwoo Choi, Christian König, Sumit Semwal,
linaro-mm-sig, Eddie James, Andrew Jeffery, Joel Stanley,
linux-fsi, David Airlie, Simona Vetter, Alex Deucher,
Danilo Krummrich, Matthew Brost, Philipp Stanner, Harry Wentland,
Leo Li, amd-gfx, Jiri Kosina, Benjamin Tissoires, linux-input,
Wolfram Sang, linux-i2c, Mark Brown, Michael Hennerich,
Nuno Sá, linux-spi, James E.J. Bottomley, Martin K. Petersen,
linux-scsi, Chris Mason, David Sterba, linux-btrfs,
Thomas Gleixner, Andrew Morton, SeongJae Park, linux-mm,
Borislav Petkov, Dave Hansen, x86, linux-trace-kernel,
linux-kernel
In-Reply-To: <20260418190456.631df6f3@fedora>
On Sat, Apr 18, 2026 at 7:05 PM Steven Rostedt <rostedt@goodmis.org> wrote:
>
> On Mon, 23 Mar 2026 12:00:19 -0400
> "Vineeth Pillai (Google)" <vineeth@bitbyteword.org> wrote:
>
> > if (trace_foo_enabled() && cond)
> > trace_call__foo(args); /* calls __do_trace_foo() directly */
>
> Hi Vineeth,
>
> Could you rebase this series on top of 7.1-rc1 when it comes out?
> Several of these patches were accepted already. Obviously drop those.
> They were the patches that added the feature, and any where the
> maintainer acked the patch.
>
> Now that the feature has been accepted, if you post the patch series
> again after 7.1-rc1 with all the patches that haven't been accepted
> yet, then the maintainers can simply take them directly. As the feature
> is now accepted, there's no dependency on it, and they don't need to go
> through the tracing tree.
>
Sure, will do. Thanks for merging this feature.
Thanks,
Vineeth
^ permalink raw reply
* Re: [PATCH 0/7] iio: HID: Add helper method hid_sensor_adjust_channel_bit_mask()
From: Jonathan Cameron @ 2026-04-19 13:10 UTC (permalink / raw)
To: Natália Salvino André
Cc: andy, bentiss, dlechner, jikos, nuno.sa, srinivas.pandruvada,
linux-iio, linux-input
In-Reply-To: <20260417225959.16688-1-natalia.andre@ime.usp.br>
On Fri, 17 Apr 2026 19:58:43 -0300
Natália Salvino André <natalia.andre@ime.usp.br> wrote:
> This patch series introduces a generic helper function to handle channel bit mask adjustments
> for HID sensors. Currently, multiple drivers implement identical logic for this task
>
Other than the stuff David already raised, all looks fine to me.
> Natália Salvino André (7):
> iio: HID: Add helper method hid_sensor_adjust_channel_bit_mask()
> iio: accel: HID: Replace method accel_3d_adjust_channel_bit_mask()
> iio: gyro: HID: Replace method gyro_3d_adjust_channel_bit_mask()
> iio: light: HID: Replace method als_adjust_channel_bit_mask()
> iio: light: HID: Replace method prox_adjust_channel_bit_mask()
> iio: magnetometer: HID: Replace method
> magn_3d_adjust_channel_bit_mask()
> iio: pressure: HID: Replace method press_adjust_channel_bit_mask()
>
> drivers/iio/accel/hid-sensor-accel-3d.c | 13 +------------
> .../iio/common/hid-sensors/hid-sensor-attributes.c | 11 +++++++++++
> drivers/iio/gyro/hid-sensor-gyro-3d.c | 13 +------------
> drivers/iio/light/hid-sensor-als.c | 13 +------------
> drivers/iio/light/hid-sensor-prox.c | 13 +------------
> drivers/iio/magnetometer/hid-sensor-magn-3d.c | 13 +------------
> drivers/iio/pressure/hid-sensor-press.c | 13 +------------
> include/linux/hid-sensor-hub.h | 3 +++
> 8 files changed, 20 insertions(+), 72 deletions(-)
>
^ permalink raw reply
* [PATCH v4 5/5] HID: hid-oxp: Add Vibration Intensity Attribute
From: Derek J. Clark @ 2026-04-19 4:26 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires
Cc: Pierre-Loup A . Griffais, Lambert Fan, Zhouwang Huang,
Derek J . Clark, linux-input, linux-doc, linux-kernel
In-Reply-To: <20260419042624.625746-1-derekjohn.clark@gmail.com>
Adds attribute for setting the rumble intensity level. This setting must
be re-applied after the gamepad mode is set as doing so resets this to
the default value.
Reviewed-by: Zhouwang Huang <honjow311@gmail.com>
Tested-by: Zhouwang Huang <honjow311@gmail.com>
Signed-off-by: Derek J. Clark <derekjohn.clark@gmail.com>
---
drivers/hid/hid-oxp.c | 78 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/drivers/hid/hid-oxp.c b/drivers/hid/hid-oxp.c
index 52002d4cbd0b..20a54f337220 100644
--- a/drivers/hid/hid-oxp.c
+++ b/drivers/hid/hid-oxp.c
@@ -34,6 +34,7 @@ enum oxp_function_index {
OXP_FID_GEN1_RGB_SET = 0x07,
OXP_FID_GEN1_RGB_REPLY = 0x0f,
OXP_FID_GEN2_TOGGLE_MODE = 0xb2,
+ OXP_FID_GEN2_RUMBLE_SET = 0xb3,
OXP_FID_GEN2_KEY_STATE = 0xb4,
OXP_FID_GEN2_STATUS_EVENT = 0xb8,
};
@@ -181,6 +182,7 @@ static struct oxp_hid_cfg {
struct mutex cfg_mutex; /*ensure single synchronous output report*/
u8 rgb_brightness;
u8 gamepad_mode;
+ u8 rumble_intensity;
u8 rgb_effect;
u8 rgb_speed;
u8 rgb_en;
@@ -266,6 +268,11 @@ static const char *const oxp_rgb_effect_text[] = {
[OXP_EFFECT_MONO_LIST] = "monocolor",
};
+enum oxp_rumble_side_index {
+ OXP_RUMBLE_LEFT = 0x00,
+ OXP_RUMBLE_RIGHT,
+};
+
struct oxp_gen_1_rgb_report {
u8 report_id;
u8 message_id;
@@ -341,6 +348,7 @@ static int oxp_hid_raw_event_gen_1(struct hid_device *hdev,
static int oxp_gen_2_property_out(enum oxp_function_index fid, u8 *data, u8 data_size);
static int oxp_set_buttons(void);
+static int oxp_rumble_intensity_set(u8 intensity);
static void oxp_mcu_init_fn(struct work_struct *work)
{
@@ -368,6 +376,12 @@ static void oxp_mcu_init_fn(struct work_struct *work)
if (ret)
dev_err(&drvdata.hdev->dev,
"Error: Failed to set gamepad mode: %i\n", ret);
+
+ /* Set vibration level */
+ ret = oxp_rumble_intensity_set(drvdata.rumble_intensity);
+ if (ret)
+ dev_err(&drvdata.hdev->dev,
+ "Error: Failed to set rumble intensity: %i\n", ret);
}
static int oxp_hid_raw_event_gen_2(struct hid_device *hdev,
@@ -514,6 +528,14 @@ static ssize_t gamepad_mode_store(struct device *dev,
drvdata.gamepad_mode = data[0];
+ if (drvdata.gamepad_mode == OXP_GP_MODE_DEBUG)
+ return count;
+
+ /* Re-apply rumble settings as switching gamepad mode will override */
+ ret = oxp_rumble_intensity_set(drvdata.rumble_intensity);
+ if (ret)
+ return ret;
+
return count;
}
@@ -857,6 +879,59 @@ static ssize_t button_mapping_options_show(struct device *dev,
}
static DEVICE_ATTR_RO(button_mapping_options);
+static int oxp_rumble_intensity_set(u8 intensity)
+{
+ u8 header[15] = { 0x02, 0x38, 0x02, 0xe3, 0x39, 0xe3, 0x39, 0xe3,
+ 0x39, 0x01, intensity, 0x05, 0xe3, 0x39, 0xe3 };
+ u8 footer[9] = { 0x39, 0xe3, 0x39, 0xe3, 0xe3, 0x02, 0x04, 0x39, 0x39 };
+ size_t footer_size = ARRAY_SIZE(footer);
+ size_t header_size = ARRAY_SIZE(header);
+ u8 data[59] = { 0x0 };
+ size_t data_size = ARRAY_SIZE(data);
+
+ memcpy(data, header, header_size);
+ memcpy(data + data_size - footer_size, footer, footer_size);
+
+ return oxp_gen_2_property_out(OXP_FID_GEN2_RUMBLE_SET, data, data_size);
+}
+
+static ssize_t rumble_intensity_store(struct device *dev,
+ struct device_attribute *attr, const char *buf,
+ size_t count)
+{
+ int ret;
+ u8 val;
+
+ ret = kstrtou8(buf, 10, &val);
+ if (ret)
+ return ret;
+
+ if (val < 0 || val > 5)
+ return -EINVAL;
+
+ ret = oxp_rumble_intensity_set(val);
+ if (ret)
+ return ret;
+
+ drvdata.rumble_intensity = val;
+
+ return count;
+}
+
+static ssize_t rumble_intensity_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return sysfs_emit(buf, "%i\n", drvdata.rumble_intensity);
+}
+static DEVICE_ATTR_RW(rumble_intensity);
+
+static ssize_t rumble_intensity_range_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return sysfs_emit(buf, "0-5\n");
+}
+static DEVICE_ATTR_RO(rumble_intensity_range);
+
#define OXP_DEVICE_ATTR_RW(_name, _group) \
static ssize_t _name##_store(struct device *dev, \
struct device_attribute *attr, \
@@ -948,6 +1023,8 @@ static struct attribute *oxp_cfg_attrs[] = {
&dev_attr_gamepad_mode.attr,
&dev_attr_gamepad_mode_index.attr,
&dev_attr_reset_buttons.attr,
+ &dev_attr_rumble_intensity.attr,
+ &dev_attr_rumble_intensity_range.attr,
NULL,
};
@@ -1422,6 +1499,7 @@ static int oxp_cfg_probe(struct hid_device *hdev, u16 up)
INIT_DELAYED_WORK(&drvdata.oxp_btn_queue, oxp_btn_queue_fn);
drvdata.gamepad_mode = OXP_GP_MODE_XINPUT;
+ drvdata.rumble_intensity = 5;
INIT_DELAYED_WORK(&drvdata.oxp_mcu_init, oxp_mcu_init_fn);
mod_delayed_work(system_wq, &drvdata.oxp_mcu_init, msecs_to_jiffies(50));
--
2.53.0
^ permalink raw reply related
* [PATCH v4 4/5] HID: hid-oxp: Add Button Mapping Interface
From: Derek J. Clark @ 2026-04-19 4:26 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires
Cc: Pierre-Loup A . Griffais, Lambert Fan, Zhouwang Huang,
Derek J . Clark, linux-input, linux-doc, linux-kernel
In-Reply-To: <20260419042624.625746-1-derekjohn.clark@gmail.com>
Adds button mapping interface for second generation OneXPlayer
configuration HID interfaces. This interface allows the MCU to swap
button mappings at the hardware level. The current state cannot be
retrieved, and the mappings may have been modified in Windows prior, so
we reset the button mapping at init and expose an attribute to allow
userspace to do this again at any time.
The interface requires two pages of button mapping data to be sent
before the settings will take place. Since the MCU requires a 200ms
delay after each message (total 400ms for these attributes) use the same
debounce work queue method we used for RGB. This will allow for
userspace or udev rules to rapidly map all buttons. The values will
be cached before the final write is finally sent to the device.
Reviewed-by: Zhouwang Huang <honjow311@gmail.com>
Tested-by: Zhouwang Huang <honjow311@gmail.com>
Signed-off-by: Derek J. Clark <derekjohn.clark@gmail.com>
---
v4:
- Make oxp_btn_queue delayed work struct part of drvdata, add cancel
delayed work during remove.
v3:
- Ensure default button map is properly init during probe.
v2:
- Add detection of post-suspend MCU init to trigger setting the button
map again.
---
drivers/hid/hid-oxp.c | 568 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 568 insertions(+)
diff --git a/drivers/hid/hid-oxp.c b/drivers/hid/hid-oxp.c
index 2504b56b8f8a..52002d4cbd0b 100644
--- a/drivers/hid/hid-oxp.c
+++ b/drivers/hid/hid-oxp.c
@@ -34,11 +34,147 @@ enum oxp_function_index {
OXP_FID_GEN1_RGB_SET = 0x07,
OXP_FID_GEN1_RGB_REPLY = 0x0f,
OXP_FID_GEN2_TOGGLE_MODE = 0xb2,
+ OXP_FID_GEN2_KEY_STATE = 0xb4,
OXP_FID_GEN2_STATUS_EVENT = 0xb8,
};
+#define OXP_MAPPING_GAMEPAD 0x01
+#define OXP_MAPPING_KEYBOARD 0x02
+
+struct oxp_button_data {
+ u8 mode;
+ u8 index;
+ u8 key_id;
+ u8 padding[2];
+} __packed;
+
+struct oxp_button_entry {
+ struct oxp_button_data data;
+ const char *name;
+};
+
+static const struct oxp_button_entry oxp_button_table[] = {
+ /* Gamepad Buttons */
+ { { OXP_MAPPING_GAMEPAD, 0x01 }, "BTN_A" },
+ { { OXP_MAPPING_GAMEPAD, 0x02 }, "BTN_B" },
+ { { OXP_MAPPING_GAMEPAD, 0x03 }, "BTN_X" },
+ { { OXP_MAPPING_GAMEPAD, 0x04 }, "BTN_Y" },
+ { { OXP_MAPPING_GAMEPAD, 0x05 }, "BTN_LB" },
+ { { OXP_MAPPING_GAMEPAD, 0x06 }, "BTN_RB" },
+ { { OXP_MAPPING_GAMEPAD, 0x07 }, "BTN_LT" },
+ { { OXP_MAPPING_GAMEPAD, 0x08 }, "BTN_RT" },
+ { { OXP_MAPPING_GAMEPAD, 0x09 }, "BTN_START" },
+ { { OXP_MAPPING_GAMEPAD, 0x0a }, "BTN_SELECT" },
+ { { OXP_MAPPING_GAMEPAD, 0x0b }, "BTN_L3" },
+ { { OXP_MAPPING_GAMEPAD, 0x0c }, "BTN_R3" },
+ { { OXP_MAPPING_GAMEPAD, 0x0d }, "DPAD_UP" },
+ { { OXP_MAPPING_GAMEPAD, 0x0e }, "DPAD_DOWN" },
+ { { OXP_MAPPING_GAMEPAD, 0x0f }, "DPAD_LEFT" },
+ { { OXP_MAPPING_GAMEPAD, 0x10 }, "DPAD_RIGHT" },
+ { { OXP_MAPPING_GAMEPAD, 0x11 }, "JOY_L_UP" },
+ { { OXP_MAPPING_GAMEPAD, 0x12 }, "JOY_L_UP_RIGHT" },
+ { { OXP_MAPPING_GAMEPAD, 0x13 }, "JOY_L_RIGHT" },
+ { { OXP_MAPPING_GAMEPAD, 0x14 }, "JOY_L_DOWN_RIGHT" },
+ { { OXP_MAPPING_GAMEPAD, 0x15 }, "JOY_L_DOWN" },
+ { { OXP_MAPPING_GAMEPAD, 0x16 }, "JOY_L_DOWN_LEFT" },
+ { { OXP_MAPPING_GAMEPAD, 0x17 }, "JOY_L_LEFT" },
+ { { OXP_MAPPING_GAMEPAD, 0x18 }, "JOY_L_UP_LEFT" },
+ { { OXP_MAPPING_GAMEPAD, 0x19 }, "JOY_R_UP" },
+ { { OXP_MAPPING_GAMEPAD, 0x1a }, "JOY_R_UP_RIGHT" },
+ { { OXP_MAPPING_GAMEPAD, 0x1b }, "JOY_R_RIGHT" },
+ { { OXP_MAPPING_GAMEPAD, 0x1c }, "JOY_R_DOWN_RIGHT" },
+ { { OXP_MAPPING_GAMEPAD, 0x1d }, "JOY_R_DOWN" },
+ { { OXP_MAPPING_GAMEPAD, 0x1e }, "JOY_R_DOWN_LEFT" },
+ { { OXP_MAPPING_GAMEPAD, 0x1f }, "JOY_R_LEFT" },
+ { { OXP_MAPPING_GAMEPAD, 0x20 }, "JOY_R_UP_LEFT" },
+ { { OXP_MAPPING_GAMEPAD, 0x22 }, "BTN_GUIDE" },
+ /* Keyboard Keys */
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x5a }, "KEY_F1" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x5b }, "KEY_F2" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x5c }, "KEY_F3" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x5d }, "KEY_F4" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x5e }, "KEY_F5" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x5f }, "KEY_F6" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x60 }, "KEY_F7" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x61 }, "KEY_F8" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x62 }, "KEY_F9" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x63 }, "KEY_F10" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x64 }, "KEY_F11" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x65 }, "KEY_F12" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x66 }, "KEY_F13" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x67 }, "KEY_F14" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x68 }, "KEY_F15" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x69 }, "KEY_F16" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x6a }, "KEY_F17" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x6b }, "KEY_F18" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x6c }, "KEY_F19" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x6d }, "KEY_F20" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x6e }, "KEY_F21" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x6f }, "KEY_F22" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x70 }, "KEY_F23" },
+ { { OXP_MAPPING_KEYBOARD, 0x01, 0x71 }, "KEY_F24" },
+};
+
+enum oxp_joybutton_index {
+ BUTTON_A = 0x01,
+ BUTTON_B,
+ BUTTON_X,
+ BUTTON_Y,
+ BUTTON_LB,
+ BUTTON_RB,
+ BUTTON_LT,
+ BUTTON_RT,
+ BUTTON_START,
+ BUTTON_SELECT,
+ BUTTON_L3,
+ BUTTON_R3,
+ BUTTON_DUP,
+ BUTTON_DDOWN,
+ BUTTON_DLEFT,
+ BUTTON_DRIGHT,
+ BUTTON_M1 = 0x22,
+ BUTTON_M2,
+ /* These are unused currently, reserved for future devices */
+ BUTTON_M3,
+ BUTTON_M4,
+ BUTTON_M5,
+ BUTTON_M6,
+};
+
+struct oxp_button_idx {
+ enum oxp_joybutton_index button_idx;
+ u8 mapping_idx;
+} __packed;
+
+struct oxp_bmap_page_1 {
+ struct oxp_button_idx btn_a;
+ struct oxp_button_idx btn_b;
+ struct oxp_button_idx btn_x;
+ struct oxp_button_idx btn_y;
+ struct oxp_button_idx btn_lb;
+ struct oxp_button_idx btn_rb;
+ struct oxp_button_idx btn_lt;
+ struct oxp_button_idx btn_rt;
+ struct oxp_button_idx btn_start;
+} __packed;
+
+struct oxp_bmap_page_2 {
+ struct oxp_button_idx btn_select;
+ struct oxp_button_idx btn_l3;
+ struct oxp_button_idx btn_r3;
+ struct oxp_button_idx btn_dup;
+ struct oxp_button_idx btn_ddown;
+ struct oxp_button_idx btn_dleft;
+ struct oxp_button_idx btn_dright;
+ struct oxp_button_idx btn_m1;
+ struct oxp_button_idx btn_m2;
+} __packed;
+
static struct oxp_hid_cfg {
struct delayed_work oxp_rgb_queue;
+ struct delayed_work oxp_btn_queue;
+ struct oxp_bmap_page_1 *bmap_1;
+ struct oxp_bmap_page_2 *bmap_2;
struct delayed_work oxp_mcu_init;
struct led_classdev_mc *led_mc;
struct hid_device *hdev;
@@ -50,6 +186,10 @@ static struct oxp_hid_cfg {
u8 rgb_en;
} drvdata;
+#define OXP_FILL_PAGE_SLOT(page, btn) \
+ { .button_idx = (page)->btn.button_idx, \
+ .mapping_idx = (page)->btn.mapping_idx }
+
enum oxp_gamepad_mode_index {
OXP_GP_MODE_XINPUT = 0x00,
OXP_GP_MODE_DEBUG = 0x03,
@@ -155,6 +295,10 @@ struct oxp_gen_2_rgb_report {
u8 effect;
} __packed;
+struct oxp_attr {
+ u8 index;
+};
+
static u16 get_usage_page(struct hid_device *hdev)
{
return hdev->collection[0].usage >> 16;
@@ -196,12 +340,19 @@ static int oxp_hid_raw_event_gen_1(struct hid_device *hdev,
}
static int oxp_gen_2_property_out(enum oxp_function_index fid, u8 *data, u8 data_size);
+static int oxp_set_buttons(void);
static void oxp_mcu_init_fn(struct work_struct *work)
{
u8 gp_mode_data[3] = { OXP_GP_MODE_DEBUG, 0x01, 0x02 };
int ret;
+ /* Re-apply the button mapping */
+ ret = oxp_set_buttons();
+ if (ret)
+ dev_err(&drvdata.hdev->dev,
+ "Error: Failed to set button mapping: %i\n", ret);
+
/* Cycle the gamepad mode */
ret = oxp_gen_2_property_out(OXP_FID_GEN2_TOGGLE_MODE, gp_mode_data, 3);
if (ret)
@@ -395,9 +546,408 @@ static ssize_t gamepad_mode_index_show(struct device *dev,
}
static DEVICE_ATTR_RO(gamepad_mode_index);
+static void oxp_set_defaults_bmap_1(struct oxp_bmap_page_1 *bmap)
+{
+ bmap->btn_a.button_idx = BUTTON_A;
+ bmap->btn_a.mapping_idx = 0;
+ bmap->btn_b.button_idx = BUTTON_B;
+ bmap->btn_b.mapping_idx = 1;
+ bmap->btn_x.button_idx = BUTTON_X;
+ bmap->btn_x.mapping_idx = 2;
+ bmap->btn_y.button_idx = BUTTON_Y;
+ bmap->btn_y.mapping_idx = 3;
+ bmap->btn_lb.button_idx = BUTTON_LB;
+ bmap->btn_lb.mapping_idx = 4;
+ bmap->btn_rb.button_idx = BUTTON_RB;
+ bmap->btn_rb.mapping_idx = 5;
+ bmap->btn_lt.button_idx = BUTTON_LT;
+ bmap->btn_lt.mapping_idx = 6;
+ bmap->btn_rt.button_idx = BUTTON_RT;
+ bmap->btn_rt.mapping_idx = 7;
+ bmap->btn_start.button_idx = BUTTON_START;
+ bmap->btn_start.mapping_idx = 8;
+}
+
+static void oxp_set_defaults_bmap_2(struct oxp_bmap_page_2 *bmap)
+{
+ bmap->btn_select.button_idx = BUTTON_SELECT;
+ bmap->btn_select.mapping_idx = 9;
+ bmap->btn_l3.button_idx = BUTTON_L3;
+ bmap->btn_l3.mapping_idx = 10;
+ bmap->btn_r3.button_idx = BUTTON_R3;
+ bmap->btn_r3.mapping_idx = 11;
+ bmap->btn_dup.button_idx = BUTTON_DUP;
+ bmap->btn_dup.mapping_idx = 12;
+ bmap->btn_ddown.button_idx = BUTTON_DDOWN;
+ bmap->btn_ddown.mapping_idx = 13;
+ bmap->btn_dleft.button_idx = BUTTON_DLEFT;
+ bmap->btn_dleft.mapping_idx = 14;
+ bmap->btn_dright.button_idx = BUTTON_DRIGHT;
+ bmap->btn_dright.mapping_idx = 15;
+ bmap->btn_m1.button_idx = BUTTON_M1;
+ bmap->btn_m1.mapping_idx = 48; /* KEY_F15 */
+ bmap->btn_m2.button_idx = BUTTON_M2;
+ bmap->btn_m2.mapping_idx = 49; /* KEY_F16 */
+}
+
+static void oxp_page_fill_data(char *buf, const struct oxp_button_idx *buttons,
+ size_t len)
+{
+ size_t offset_increment = sizeof(u8) + sizeof(struct oxp_button_idx);
+ size_t offset = 5;
+ unsigned int i;
+
+ for (i = 0; i < len; i++, offset += offset_increment) {
+ buf[offset] = (u8)buttons[i].button_idx;
+ memcpy(buf + offset + 1,
+ &oxp_button_table[buttons[i].mapping_idx].data,
+ sizeof(struct oxp_button_data));
+ }
+}
+
+static int oxp_set_buttons(void)
+{
+ u8 page_1[59] = { 0x02, 0x38, 0x20, 0x01, 0x01 };
+ u8 page_2[59] = { 0x02, 0x38, 0x20, 0x02, 0x01 };
+ u16 up = get_usage_page(drvdata.hdev);
+ int ret;
+
+ if (up != GEN2_USAGE_PAGE)
+ return -EINVAL;
+
+ const struct oxp_button_idx p1[] = {
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_1, btn_a),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_1, btn_b),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_1, btn_x),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_1, btn_y),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_1, btn_lb),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_1, btn_rb),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_1, btn_lt),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_1, btn_rt),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_1, btn_start),
+ };
+
+ const struct oxp_button_idx p2[] = {
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_2, btn_select),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_2, btn_l3),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_2, btn_r3),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_2, btn_dup),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_2, btn_ddown),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_2, btn_dleft),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_2, btn_dright),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_2, btn_m1),
+ OXP_FILL_PAGE_SLOT(drvdata.bmap_2, btn_m2),
+ };
+
+ oxp_page_fill_data(page_1, p1, ARRAY_SIZE(p1));
+ oxp_page_fill_data(page_2, p2, ARRAY_SIZE(p2));
+
+ ret = oxp_gen_2_property_out(OXP_FID_GEN2_KEY_STATE, page_1, ARRAY_SIZE(page_1));
+ if (ret)
+ return ret;
+
+ return oxp_gen_2_property_out(OXP_FID_GEN2_KEY_STATE, page_2, ARRAY_SIZE(page_2));
+}
+
+static void oxp_reset_buttons(void)
+{
+ oxp_set_defaults_bmap_1(drvdata.bmap_1);
+ oxp_set_defaults_bmap_2(drvdata.bmap_2);
+}
+
+static ssize_t reset_buttons_store(struct device *dev,
+ struct device_attribute *attr, const char *buf,
+ size_t count)
+{
+ int val, ret;
+
+ ret = kstrtoint(buf, 10, &val);
+ if (ret)
+ return ret;
+
+ if (val != 1)
+ return -EINVAL;
+
+ oxp_reset_buttons();
+ ret = oxp_set_buttons();
+ if (ret)
+ return ret;
+
+ return count;
+}
+static DEVICE_ATTR_WO(reset_buttons);
+
+static void oxp_btn_queue_fn(struct work_struct *work)
+{
+ int ret;
+
+ ret = oxp_set_buttons();
+ if (ret)
+ dev_err(&drvdata.hdev->dev,
+ "Error: Failed to write button mapping: %i\n", ret);
+}
+
+static int oxp_button_idx_from_str(const char *buf)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(oxp_button_table); i++)
+ if (sysfs_streq(buf, oxp_button_table[i].name))
+ return i;
+
+ return -EINVAL;
+}
+
+static ssize_t map_button_store(struct device *dev,
+ struct device_attribute *attr, const char *buf,
+ size_t count, u8 index)
+{
+ int idx;
+
+ idx = oxp_button_idx_from_str(buf);
+ if (idx < 0)
+ return idx;
+
+ switch (index) {
+ case BUTTON_A:
+ drvdata.bmap_1->btn_a.mapping_idx = idx;
+ break;
+ case BUTTON_B:
+ drvdata.bmap_1->btn_b.mapping_idx = idx;
+ break;
+ case BUTTON_X:
+ drvdata.bmap_1->btn_x.mapping_idx = idx;
+ break;
+ case BUTTON_Y:
+ drvdata.bmap_1->btn_y.mapping_idx = idx;
+ break;
+ case BUTTON_LB:
+ drvdata.bmap_1->btn_lb.mapping_idx = idx;
+ break;
+ case BUTTON_RB:
+ drvdata.bmap_1->btn_rb.mapping_idx = idx;
+ break;
+ case BUTTON_LT:
+ drvdata.bmap_1->btn_lt.mapping_idx = idx;
+ break;
+ case BUTTON_RT:
+ drvdata.bmap_1->btn_rt.mapping_idx = idx;
+ break;
+ case BUTTON_START:
+ drvdata.bmap_1->btn_start.mapping_idx = idx;
+ break;
+ case BUTTON_SELECT:
+ drvdata.bmap_2->btn_select.mapping_idx = idx;
+ break;
+ case BUTTON_L3:
+ drvdata.bmap_2->btn_l3.mapping_idx = idx;
+ break;
+ case BUTTON_R3:
+ drvdata.bmap_2->btn_r3.mapping_idx = idx;
+ break;
+ case BUTTON_DUP:
+ drvdata.bmap_2->btn_dup.mapping_idx = idx;
+ break;
+ case BUTTON_DDOWN:
+ drvdata.bmap_2->btn_ddown.mapping_idx = idx;
+ break;
+ case BUTTON_DLEFT:
+ drvdata.bmap_2->btn_dleft.mapping_idx = idx;
+ break;
+ case BUTTON_DRIGHT:
+ drvdata.bmap_2->btn_dright.mapping_idx = idx;
+ break;
+ case BUTTON_M1:
+ drvdata.bmap_2->btn_m1.mapping_idx = idx;
+ break;
+ case BUTTON_M2:
+ drvdata.bmap_2->btn_m2.mapping_idx = idx;
+ break;
+ default:
+ return -EINVAL;
+ }
+ mod_delayed_work(system_wq, &drvdata.oxp_btn_queue, msecs_to_jiffies(50));
+ return count;
+}
+
+static ssize_t map_button_show(struct device *dev,
+ struct device_attribute *attr, char *buf,
+ u8 index)
+{
+ u8 i;
+
+ switch (index) {
+ case BUTTON_A:
+ i = drvdata.bmap_1->btn_a.mapping_idx;
+ break;
+ case BUTTON_B:
+ i = drvdata.bmap_1->btn_b.mapping_idx;
+ break;
+ case BUTTON_X:
+ i = drvdata.bmap_1->btn_x.mapping_idx;
+ break;
+ case BUTTON_Y:
+ i = drvdata.bmap_1->btn_y.mapping_idx;
+ break;
+ case BUTTON_LB:
+ i = drvdata.bmap_1->btn_lb.mapping_idx;
+ break;
+ case BUTTON_RB:
+ i = drvdata.bmap_1->btn_rb.mapping_idx;
+ break;
+ case BUTTON_LT:
+ i = drvdata.bmap_1->btn_lt.mapping_idx;
+ break;
+ case BUTTON_RT:
+ i = drvdata.bmap_1->btn_rt.mapping_idx;
+ break;
+ case BUTTON_START:
+ i = drvdata.bmap_1->btn_start.mapping_idx;
+ break;
+ case BUTTON_SELECT:
+ i = drvdata.bmap_2->btn_select.mapping_idx;
+ break;
+ case BUTTON_L3:
+ i = drvdata.bmap_2->btn_l3.mapping_idx;
+ break;
+ case BUTTON_R3:
+ i = drvdata.bmap_2->btn_r3.mapping_idx;
+ break;
+ case BUTTON_DUP:
+ i = drvdata.bmap_2->btn_dup.mapping_idx;
+ break;
+ case BUTTON_DDOWN:
+ i = drvdata.bmap_2->btn_ddown.mapping_idx;
+ break;
+ case BUTTON_DLEFT:
+ i = drvdata.bmap_2->btn_dleft.mapping_idx;
+ break;
+ case BUTTON_DRIGHT:
+ i = drvdata.bmap_2->btn_dright.mapping_idx;
+ break;
+ case BUTTON_M1:
+ i = drvdata.bmap_2->btn_m1.mapping_idx;
+ break;
+ case BUTTON_M2:
+ i = drvdata.bmap_2->btn_m2.mapping_idx;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ if (i >= ARRAY_SIZE(oxp_button_table))
+ return -EINVAL;
+
+ return sysfs_emit(buf, "%s\n", oxp_button_table[i].name);
+}
+
+static ssize_t button_mapping_options_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ ssize_t count = 0;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(oxp_button_table); i++)
+ count += sysfs_emit_at(buf, count, "%s ", oxp_button_table[i].name);
+
+ if (count)
+ buf[count - 1] = '\n';
+
+ return count;
+}
+static DEVICE_ATTR_RO(button_mapping_options);
+
+#define OXP_DEVICE_ATTR_RW(_name, _group) \
+ static ssize_t _name##_store(struct device *dev, \
+ struct device_attribute *attr, \
+ const char *buf, size_t count) \
+ { \
+ return _group##_store(dev, attr, buf, count, _name.index); \
+ } \
+ static ssize_t _name##_show(struct device *dev, \
+ struct device_attribute *attr, char *buf) \
+ { \
+ return _group##_show(dev, attr, buf, _name.index); \
+ } \
+ static DEVICE_ATTR_RW(_name)
+
+static struct oxp_attr button_a = { BUTTON_A };
+OXP_DEVICE_ATTR_RW(button_a, map_button);
+
+static struct oxp_attr button_b = { BUTTON_B };
+OXP_DEVICE_ATTR_RW(button_b, map_button);
+
+static struct oxp_attr button_x = { BUTTON_X };
+OXP_DEVICE_ATTR_RW(button_x, map_button);
+
+static struct oxp_attr button_y = { BUTTON_Y };
+OXP_DEVICE_ATTR_RW(button_y, map_button);
+
+static struct oxp_attr button_lb = { BUTTON_LB };
+OXP_DEVICE_ATTR_RW(button_lb, map_button);
+
+static struct oxp_attr button_rb = { BUTTON_RB };
+OXP_DEVICE_ATTR_RW(button_rb, map_button);
+
+static struct oxp_attr button_lt = { BUTTON_LT };
+OXP_DEVICE_ATTR_RW(button_lt, map_button);
+
+static struct oxp_attr button_rt = { BUTTON_RT };
+OXP_DEVICE_ATTR_RW(button_rt, map_button);
+
+static struct oxp_attr button_start = { BUTTON_START };
+OXP_DEVICE_ATTR_RW(button_start, map_button);
+
+static struct oxp_attr button_select = { BUTTON_SELECT };
+OXP_DEVICE_ATTR_RW(button_select, map_button);
+
+static struct oxp_attr button_l3 = { BUTTON_L3 };
+OXP_DEVICE_ATTR_RW(button_l3, map_button);
+
+static struct oxp_attr button_r3 = { BUTTON_R3 };
+OXP_DEVICE_ATTR_RW(button_r3, map_button);
+
+static struct oxp_attr button_d_up = { BUTTON_DUP };
+OXP_DEVICE_ATTR_RW(button_d_up, map_button);
+
+static struct oxp_attr button_d_down = { BUTTON_DDOWN };
+OXP_DEVICE_ATTR_RW(button_d_down, map_button);
+
+static struct oxp_attr button_d_left = { BUTTON_DLEFT };
+OXP_DEVICE_ATTR_RW(button_d_left, map_button);
+
+static struct oxp_attr button_d_right = { BUTTON_DRIGHT };
+OXP_DEVICE_ATTR_RW(button_d_right, map_button);
+
+static struct oxp_attr button_m1 = { BUTTON_M1 };
+OXP_DEVICE_ATTR_RW(button_m1, map_button);
+
+static struct oxp_attr button_m2 = { BUTTON_M2 };
+OXP_DEVICE_ATTR_RW(button_m2, map_button);
+
static struct attribute *oxp_cfg_attrs[] = {
+ &dev_attr_button_a.attr,
+ &dev_attr_button_b.attr,
+ &dev_attr_button_d_down.attr,
+ &dev_attr_button_d_left.attr,
+ &dev_attr_button_d_right.attr,
+ &dev_attr_button_d_up.attr,
+ &dev_attr_button_l3.attr,
+ &dev_attr_button_lb.attr,
+ &dev_attr_button_lt.attr,
+ &dev_attr_button_m1.attr,
+ &dev_attr_button_m2.attr,
+ &dev_attr_button_mapping_options.attr,
+ &dev_attr_button_r3.attr,
+ &dev_attr_button_rb.attr,
+ &dev_attr_button_rt.attr,
+ &dev_attr_button_select.attr,
+ &dev_attr_button_start.attr,
+ &dev_attr_button_x.attr,
+ &dev_attr_button_y.attr,
&dev_attr_gamepad_mode.attr,
&dev_attr_gamepad_mode_index.attr,
+ &dev_attr_reset_buttons.attr,
NULL,
};
@@ -821,6 +1371,8 @@ static bool oxp_hybrid_mcu_device(void)
static int oxp_cfg_probe(struct hid_device *hdev, u16 up)
{
+ struct oxp_bmap_page_1 *bmap_1;
+ struct oxp_bmap_page_2 *bmap_2;
int ret;
hid_set_drvdata(hdev, &drvdata);
@@ -854,6 +1406,21 @@ static int oxp_cfg_probe(struct hid_device *hdev, u16 up)
return 0;
skip_rgb:
+ bmap_1 = devm_kzalloc(&hdev->dev, sizeof(struct oxp_bmap_page_1), GFP_KERNEL);
+ if (!bmap_1)
+ return dev_err_probe(&hdev->dev, -ENOMEM,
+ "Unable to allocate button map page 1\n");
+
+ bmap_2 = devm_kzalloc(&hdev->dev, sizeof(struct oxp_bmap_page_2), GFP_KERNEL);
+ if (!bmap_2)
+ return dev_err_probe(&hdev->dev, -ENOMEM,
+ "Unable to allocate button map page 2\n");
+
+ drvdata.bmap_1 = bmap_1;
+ drvdata.bmap_2 = bmap_2;
+ oxp_reset_buttons();
+ INIT_DELAYED_WORK(&drvdata.oxp_btn_queue, oxp_btn_queue_fn);
+
drvdata.gamepad_mode = OXP_GP_MODE_XINPUT;
INIT_DELAYED_WORK(&drvdata.oxp_mcu_init, oxp_mcu_init_fn);
@@ -908,6 +1475,7 @@ static int oxp_hid_probe(struct hid_device *hdev,
static void oxp_hid_remove(struct hid_device *hdev)
{
cancel_delayed_work(&drvdata.oxp_rgb_queue);
+ cancel_delayed_work(&drvdata.oxp_btn_queue);
cancel_delayed_work(&drvdata.oxp_mcu_init);
hid_hw_close(hdev);
hid_hw_stop(hdev);
--
2.53.0
^ permalink raw reply related
* [PATCH v4 3/5] HID: hid-oxp: Add Second Generation Gamepad Mode Switch
From: Derek J. Clark @ 2026-04-19 4:26 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires
Cc: Pierre-Loup A . Griffais, Lambert Fan, Zhouwang Huang,
Derek J . Clark, linux-input, linux-doc, linux-kernel
In-Reply-To: <20260419042624.625746-1-derekjohn.clark@gmail.com>
Adds "gamepad_mode" attribute to second generation OneXPlayer
configuration HID devices. This attribute initiates a mode shift in the
device MCU that puts it into a state where all events are routed to an
hidraw interface instead of the xpad evdev interface. This allows for
debugging the hardware input mapping added in the next patch.
Reviewed-by: Zhouwang Huang <honjow311@gmail.com>
Tested-by: Zhouwang Huang <honjow311@gmail.com>
Signed-off-by: Derek J. Clark <derekjohn.clark@gmail.com>
---
v4:
- Add oxp_mcu_init delayed work struct to drvdata & properly init,
add cancel delayed work during remove.
v2:
- Rename to gamepad_mode & show relevant gamepad modes instead of
using a debug enable/disable paradigm, to match other drivers.
---
drivers/hid/hid-oxp.c | 131 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 131 insertions(+)
diff --git a/drivers/hid/hid-oxp.c b/drivers/hid/hid-oxp.c
index 835de2118e3c..2504b56b8f8a 100644
--- a/drivers/hid/hid-oxp.c
+++ b/drivers/hid/hid-oxp.c
@@ -33,20 +33,33 @@
enum oxp_function_index {
OXP_FID_GEN1_RGB_SET = 0x07,
OXP_FID_GEN1_RGB_REPLY = 0x0f,
+ OXP_FID_GEN2_TOGGLE_MODE = 0xb2,
OXP_FID_GEN2_STATUS_EVENT = 0xb8,
};
static struct oxp_hid_cfg {
struct delayed_work oxp_rgb_queue;
+ struct delayed_work oxp_mcu_init;
struct led_classdev_mc *led_mc;
struct hid_device *hdev;
struct mutex cfg_mutex; /*ensure single synchronous output report*/
u8 rgb_brightness;
+ u8 gamepad_mode;
u8 rgb_effect;
u8 rgb_speed;
u8 rgb_en;
} drvdata;
+enum oxp_gamepad_mode_index {
+ OXP_GP_MODE_XINPUT = 0x00,
+ OXP_GP_MODE_DEBUG = 0x03,
+};
+
+static const char *const oxp_gamepad_mode_text[] = {
+ [OXP_GP_MODE_XINPUT] = "xinput",
+ [OXP_GP_MODE_DEBUG] = "debug",
+};
+
enum oxp_feature_en_index {
OXP_FEAT_DISABLED,
OXP_FEAT_ENABLED,
@@ -182,6 +195,30 @@ static int oxp_hid_raw_event_gen_1(struct hid_device *hdev,
return 0;
}
+static int oxp_gen_2_property_out(enum oxp_function_index fid, u8 *data, u8 data_size);
+
+static void oxp_mcu_init_fn(struct work_struct *work)
+{
+ u8 gp_mode_data[3] = { OXP_GP_MODE_DEBUG, 0x01, 0x02 };
+ int ret;
+
+ /* Cycle the gamepad mode */
+ ret = oxp_gen_2_property_out(OXP_FID_GEN2_TOGGLE_MODE, gp_mode_data, 3);
+ if (ret)
+ dev_err(&drvdata.hdev->dev,
+ "Error: Failed to set gamepad mode: %i\n", ret);
+
+ /* Remainder only applies for xinput mode */
+ if (drvdata.gamepad_mode == OXP_GP_MODE_DEBUG)
+ return;
+
+ gp_mode_data[0] = OXP_GP_MODE_XINPUT;
+ ret = oxp_gen_2_property_out(OXP_FID_GEN2_TOGGLE_MODE, gp_mode_data, 3);
+ if (ret)
+ dev_err(&drvdata.hdev->dev,
+ "Error: Failed to set gamepad mode: %i\n", ret);
+}
+
static int oxp_hid_raw_event_gen_2(struct hid_device *hdev,
struct hid_report *report, u8 *data,
int size)
@@ -192,6 +229,14 @@ static int oxp_hid_raw_event_gen_2(struct hid_device *hdev,
if (data[0] != OXP_FID_GEN2_STATUS_EVENT)
return 0;
+ /* Sent ~6s after resume event, indicating the MCU has fully reset.
+ * Re-apply our settings after this has been received.
+ */
+ if (data[3] == OXP_EFFECT_MONO_TRUE) {
+ mod_delayed_work(system_wq, &drvdata.oxp_mcu_init, msecs_to_jiffies(50));
+ return 0;
+ }
+
if (data[3] != OXP_GET_PROPERTY)
return 0;
@@ -289,6 +334,77 @@ static int oxp_gen_2_property_out(enum oxp_function_index fid, u8 *data,
footer_size);
}
+static ssize_t gamepad_mode_store(struct device *dev,
+ struct device_attribute *attr, const char *buf,
+ size_t count)
+{
+ u16 up = get_usage_page(drvdata.hdev);
+ u8 data[3] = { 0x00, 0x01, 0x02 };
+ int ret = -EINVAL;
+ int i;
+
+ if (up != GEN2_USAGE_PAGE)
+ return ret;
+
+ for (i = 0; i < ARRAY_SIZE(oxp_gamepad_mode_text); i++) {
+ if (oxp_gamepad_mode_text[i] && sysfs_streq(buf, oxp_gamepad_mode_text[i])) {
+ ret = i;
+ break;
+ }
+ }
+ if (ret < 0)
+ return ret;
+
+ data[0] = ret;
+
+ ret = oxp_gen_2_property_out(OXP_FID_GEN2_TOGGLE_MODE, data, 3);
+ if (ret)
+ return ret;
+
+ drvdata.gamepad_mode = data[0];
+
+ return count;
+}
+
+static ssize_t gamepad_mode_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return sysfs_emit(buf, "%s\n", oxp_gamepad_mode_text[drvdata.gamepad_mode]);
+}
+static DEVICE_ATTR_RW(gamepad_mode);
+
+static ssize_t gamepad_mode_index_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ ssize_t count = 0;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(oxp_gamepad_mode_text); i++) {
+ if (!oxp_gamepad_mode_text[i] ||
+ oxp_gamepad_mode_text[i][0] == '\0')
+ continue;
+
+ count += sysfs_emit_at(buf, count, "%s ", oxp_gamepad_mode_text[i]);
+ }
+
+ if (count)
+ buf[count - 1] = '\n';
+
+ return count;
+}
+static DEVICE_ATTR_RO(gamepad_mode_index);
+
+static struct attribute *oxp_cfg_attrs[] = {
+ &dev_attr_gamepad_mode.attr,
+ &dev_attr_gamepad_mode_index.attr,
+ NULL,
+};
+
+static const struct attribute_group oxp_cfg_attrs_group = {
+ .attrs = oxp_cfg_attrs,
+};
+
static int oxp_rgb_status_store(u8 enabled, u8 speed, u8 brightness)
{
u16 up = get_usage_page(drvdata.hdev);
@@ -733,7 +849,21 @@ static int oxp_cfg_probe(struct hid_device *hdev, u16 up)
dev_warn(drvdata.led_mc->led_cdev.dev,
"Failed to query RGB initial state: %i\n", ret);
+ /* Below features are only implemented in gen 2 */
+ if (up != GEN2_USAGE_PAGE)
+ return 0;
+
skip_rgb:
+ drvdata.gamepad_mode = OXP_GP_MODE_XINPUT;
+
+ INIT_DELAYED_WORK(&drvdata.oxp_mcu_init, oxp_mcu_init_fn);
+ mod_delayed_work(system_wq, &drvdata.oxp_mcu_init, msecs_to_jiffies(50));
+
+ ret = devm_device_add_group(&hdev->dev, &oxp_cfg_attrs_group);
+ if (ret)
+ return dev_err_probe(&hdev->dev, ret,
+ "Failed to attach configuration attributes\n");
+
return 0;
}
@@ -778,6 +908,7 @@ static int oxp_hid_probe(struct hid_device *hdev,
static void oxp_hid_remove(struct hid_device *hdev)
{
cancel_delayed_work(&drvdata.oxp_rgb_queue);
+ cancel_delayed_work(&drvdata.oxp_mcu_init);
hid_hw_close(hdev);
hid_hw_stop(hdev);
}
--
2.53.0
^ permalink raw reply related
* [PATCH v4 2/5] HID: hid-oxp: Add Second Generation RGB Control
From: Derek J. Clark @ 2026-04-19 4:26 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires
Cc: Pierre-Loup A . Griffais, Lambert Fan, Zhouwang Huang,
Derek J . Clark, linux-input, linux-doc, linux-kernel
In-Reply-To: <20260419042624.625746-1-derekjohn.clark@gmail.com>
Adds support for the second generation of RGB Control for OneXPlayer
devices. The interface mirrors the first generation, with some
differences to how messages are formatted.
Some devices have both a GEN1 MCU for RGB control and a GEN2 MCU for
button mapping. To avoid conflicts, quirk these devices to skip RGB
setup for the GEN2_USAGE_PAGE.
Reviewed-by: Zhouwang Huang <honjow311@gmail.com>
Tested-by: Zhouwang Huang <honjow311@gmail.com>
Signed-off-by: Derek J. Clark <derekjohn.clark@gmail.com>
---
v2:
- Add DMI quirks table.
---
drivers/hid/Kconfig | 1 +
drivers/hid/hid-ids.h | 3 +
drivers/hid/hid-oxp.c | 151 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 155 insertions(+)
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 2deaec9f467d..b779088b80b6 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -924,6 +924,7 @@ config HID_OXP
depends on USB_HID
depends on LEDS_CLASS
depends on LEDS_CLASS_MULTICOLOR
+ depends on DMI
help
Say Y here if you would like to enable support for OneXPlayer handheld
devices that come with RGB LED rings around the joysticks and macro buttons.
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index dcc5a3a70eaf..0d1ff879e959 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -1134,6 +1134,9 @@
#define USB_VENDOR_ID_CRSC 0x1a2c
#define USB_DEVICE_ID_ONEXPLAYER_GEN1 0xb001
+#define USB_VENDOR_ID_WCH 0x1a86
+#define USB_DEVICE_ID_ONEXPLAYER_GEN2 0xfe00
+
#define USB_VENDOR_ID_ONTRAK 0x0a07
#define USB_DEVICE_ID_ONTRAK_ADU100 0x0064
diff --git a/drivers/hid/hid-oxp.c b/drivers/hid/hid-oxp.c
index f72bc74a7e6e..835de2118e3c 100644
--- a/drivers/hid/hid-oxp.c
+++ b/drivers/hid/hid-oxp.c
@@ -10,6 +10,7 @@
#include <linux/delay.h>
#include <linux/dev_printk.h>
#include <linux/device.h>
+#include <linux/dmi.h>
#include <linux/hid.h>
#include <linux/jiffies.h>
#include <linux/kstrtox.h>
@@ -24,12 +25,15 @@
#define OXP_PACKET_SIZE 64
#define GEN1_MESSAGE_ID 0xff
+#define GEN2_MESSAGE_ID 0x3f
#define GEN1_USAGE_PAGE 0xff01
+#define GEN2_USAGE_PAGE 0xff00
enum oxp_function_index {
OXP_FID_GEN1_RGB_SET = 0x07,
OXP_FID_GEN1_RGB_REPLY = 0x0f,
+ OXP_FID_GEN2_STATUS_EVENT = 0xb8,
};
static struct oxp_hid_cfg {
@@ -122,6 +126,22 @@ struct oxp_gen_1_rgb_report {
u8 blue;
} __packed;
+struct oxp_gen_2_rgb_report {
+ u8 report_id;
+ u8 header_id;
+ u8 padding_2;
+ u8 message_id;
+ u8 padding_4[2];
+ u8 enabled;
+ u8 speed;
+ u8 brightness;
+ u8 red;
+ u8 green;
+ u8 blue;
+ u8 padding_12[3];
+ u8 effect;
+} __packed;
+
static u16 get_usage_page(struct hid_device *hdev)
{
return hdev->collection[0].usage >> 16;
@@ -162,6 +182,44 @@ static int oxp_hid_raw_event_gen_1(struct hid_device *hdev,
return 0;
}
+static int oxp_hid_raw_event_gen_2(struct hid_device *hdev,
+ struct hid_report *report, u8 *data,
+ int size)
+{
+ struct led_classdev_mc *led_mc = drvdata.led_mc;
+ struct oxp_gen_2_rgb_report *rgb_rep;
+
+ if (data[0] != OXP_FID_GEN2_STATUS_EVENT)
+ return 0;
+
+ if (data[3] != OXP_GET_PROPERTY)
+ return 0;
+
+ rgb_rep = (struct oxp_gen_2_rgb_report *)data;
+ /* Ensure we save monocolor as the list value */
+ drvdata.rgb_effect = rgb_rep->effect == OXP_EFFECT_MONO_TRUE ?
+ OXP_EFFECT_MONO_LIST :
+ rgb_rep->effect;
+ drvdata.rgb_speed = rgb_rep->speed;
+ drvdata.rgb_en = rgb_rep->enabled == 0 ? OXP_FEAT_DISABLED :
+ OXP_FEAT_ENABLED;
+ drvdata.rgb_brightness = rgb_rep->brightness;
+ led_mc->led_cdev.brightness = rgb_rep->brightness / 4 *
+ led_mc->led_cdev.max_brightness;
+ /* If monocolor had less than 100% brightness on the previous boot,
+ * there will be no reliable way to determine the real intensity.
+ * Since intensity scaling is used with a hardware brightness set at max,
+ * our brightness will always look like 100%. Use the last set value to
+ * prevent successive boots from lowering the brightness further.
+ * Brightness will be "wrong" but the effect will remain the same visually.
+ */
+ led_mc->subled_info[0].intensity = rgb_rep->red;
+ led_mc->subled_info[1].intensity = rgb_rep->green;
+ led_mc->subled_info[2].intensity = rgb_rep->blue;
+
+ return 0;
+}
+
static int oxp_hid_raw_event(struct hid_device *hdev, struct hid_report *report,
u8 *data, int size)
{
@@ -172,6 +230,8 @@ static int oxp_hid_raw_event(struct hid_device *hdev, struct hid_report *report,
switch (up) {
case GEN1_USAGE_PAGE:
return oxp_hid_raw_event_gen_1(hdev, report, data, size);
+ case GEN2_USAGE_PAGE:
+ return oxp_hid_raw_event_gen_2(hdev, report, data, size);
default:
break;
}
@@ -217,6 +277,18 @@ static int oxp_gen_1_property_out(enum oxp_function_index fid, u8 *data,
return mcu_property_out(header, header_size, data, data_size, NULL, 0);
}
+static int oxp_gen_2_property_out(enum oxp_function_index fid, u8 *data,
+ u8 data_size)
+{
+ u8 header[] = { fid, GEN2_MESSAGE_ID, 0x01 };
+ u8 footer[] = { GEN2_MESSAGE_ID, fid };
+ size_t header_size = ARRAY_SIZE(header);
+ size_t footer_size = ARRAY_SIZE(footer);
+
+ return mcu_property_out(header, header_size, data, data_size, footer,
+ footer_size);
+}
+
static int oxp_rgb_status_store(u8 enabled, u8 speed, u8 brightness)
{
u16 up = get_usage_page(drvdata.hdev);
@@ -231,6 +303,11 @@ static int oxp_rgb_status_store(u8 enabled, u8 speed, u8 brightness)
if (drvdata.rgb_effect == OXP_EFFECT_MONO_LIST)
data[3] = 0x04;
return oxp_gen_1_property_out(OXP_FID_GEN1_RGB_SET, data, 4);
+ case GEN2_USAGE_PAGE:
+ data = (u8[6]) { OXP_SET_PROPERTY, 0x00, 0x02, enabled, speed, brightness };
+ if (drvdata.rgb_effect == OXP_EFFECT_MONO_LIST)
+ data[5] = 0x04;
+ return oxp_gen_2_property_out(OXP_FID_GEN2_STATUS_EVENT, data, 6);
default:
return -ENODEV;
}
@@ -245,6 +322,9 @@ static ssize_t oxp_rgb_status_show(void)
case GEN1_USAGE_PAGE:
data = (u8[1]) { OXP_GET_PROPERTY };
return oxp_gen_1_property_out(OXP_FID_GEN1_RGB_SET, data, 1);
+ case GEN2_USAGE_PAGE:
+ data = (u8[3]) { OXP_GET_PROPERTY, 0x00, 0x02 };
+ return oxp_gen_2_property_out(OXP_FID_GEN2_STATUS_EVENT, data, 3);
default:
return -ENODEV;
}
@@ -275,6 +355,16 @@ static int oxp_rgb_color_set(void)
data[3 * i + 3] = blue;
}
return oxp_gen_1_property_out(OXP_FID_GEN1_RGB_SET, data, size);
+ case GEN2_USAGE_PAGE:
+ size = 57;
+ data = (u8[57]) { OXP_EFFECT_MONO_TRUE, 0x00, 0x02 };
+
+ for (i = 1; i < size / 3; i++) {
+ data[3 * i] = red;
+ data[3 * i + 1] = green;
+ data[3 * i + 2] = blue;
+ }
+ return oxp_gen_2_property_out(OXP_FID_GEN2_STATUS_EVENT, data, size);
default:
return -ENODEV;
}
@@ -311,6 +401,10 @@ static int oxp_rgb_effect_set(u8 effect)
data = (u8[1]) { effect };
ret = oxp_gen_1_property_out(OXP_FID_GEN1_RGB_SET, data, 1);
break;
+ case GEN2_USAGE_PAGE:
+ data = (u8[3]) { effect, 0x00, 0x02 };
+ ret = oxp_gen_2_property_out(OXP_FID_GEN2_STATUS_EVENT, data, 3);
+ break;
default:
ret = -ENODEV;
}
@@ -559,6 +653,56 @@ static struct led_classdev_mc oxp_cdev_rgb = {
.subled_info = oxp_rgb_subled_info,
};
+struct quirk_entry {
+ bool hybrid_mcu;
+};
+
+static struct quirk_entry quirk_hybrid_mcu = {
+ .hybrid_mcu = true,
+};
+
+static const struct dmi_system_id oxp_hybrid_mcu_list[] = {
+ {
+ .ident = "OneXPlayer Apex",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "ONE-NETBOOK"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "ONEXPLAYER APEX"),
+ },
+ .driver_data = &quirk_hybrid_mcu,
+ },
+ {
+ .ident = "OneXPlayer G1 AMD",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "ONE-NETBOOK"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "ONEXPLAYER G1 A"),
+ },
+ .driver_data = &quirk_hybrid_mcu,
+ },
+ {
+ .ident = "OneXPlayer G1 Intel",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "ONE-NETBOOK"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "ONEXPLAYER G1 i"),
+ },
+ .driver_data = &quirk_hybrid_mcu,
+ },
+ {},
+};
+
+static bool oxp_hybrid_mcu_device(void)
+{
+ const struct dmi_system_id *dmi_id;
+ struct quirk_entry *quirks;
+
+ dmi_id = dmi_first_match(oxp_hybrid_mcu_list);
+ if (!dmi_id)
+ return false;
+
+ quirks = dmi_id->driver_data;
+
+ return quirks->hybrid_mcu;
+}
+
static int oxp_cfg_probe(struct hid_device *hdev, u16 up)
{
int ret;
@@ -566,6 +710,10 @@ static int oxp_cfg_probe(struct hid_device *hdev, u16 up)
hid_set_drvdata(hdev, &drvdata);
mutex_init(&drvdata.cfg_mutex);
drvdata.hdev = hdev;
+
+ if (up == GEN2_USAGE_PAGE && oxp_hybrid_mcu_device())
+ goto skip_rgb;
+
drvdata.led_mc = &oxp_cdev_rgb;
INIT_DELAYED_WORK(&drvdata.oxp_rgb_queue, oxp_rgb_queue_fn);
@@ -585,6 +733,7 @@ static int oxp_cfg_probe(struct hid_device *hdev, u16 up)
dev_warn(drvdata.led_mc->led_cdev.dev,
"Failed to query RGB initial state: %i\n", ret);
+skip_rgb:
return 0;
}
@@ -613,6 +762,7 @@ static int oxp_hid_probe(struct hid_device *hdev,
switch (up) {
case GEN1_USAGE_PAGE:
+ case GEN2_USAGE_PAGE:
ret = oxp_cfg_probe(hdev, up);
if (ret) {
hid_hw_close(hdev);
@@ -634,6 +784,7 @@ static void oxp_hid_remove(struct hid_device *hdev)
static const struct hid_device_id oxp_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_CRSC, USB_DEVICE_ID_ONEXPLAYER_GEN1) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_WCH, USB_DEVICE_ID_ONEXPLAYER_GEN2) },
{}
};
--
2.53.0
^ permalink raw reply related
* [PATCH v4 1/5] HID: hid-oxp: Add OneXPlayer configuration driver
From: Derek J. Clark @ 2026-04-19 4:26 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires
Cc: Pierre-Loup A . Griffais, Lambert Fan, Zhouwang Huang,
Derek J . Clark, linux-input, linux-doc, linux-kernel
In-Reply-To: <20260419042624.625746-1-derekjohn.clark@gmail.com>
Adds OneXPlayer HID configuration driver. In this initial driver patch,
add the RGB interface for the first generation of HID based RGB control.
This interface provides the following attributes:
- brightness: provided by the LED core, this works in a fairly unique
way on this device. The hardware accepts 5 brightness values (0-4),
which affects the brightness of the multicolor and animated effects
built into the MCU firmware. For monocolor settings, the device
expects the hardware brightness value to be pushed to maximum, then we
apply brightness adjustments mathematically based on % (0-100). This
leads to some odd conversion as we need the brightness slider to reach
the full range, but it has no affect when incrementing between the
division points for other effects.
- multi-intensity: provided by the LED core for red, green, and blue.
- effect: Allows the MCU to set 19 individual effects.
- effect_index: Lists the 19 valid effect names for the interface.
- enabled: Allows the MCU to toggle the RGB interface on/off.
- enabled_index: Lists the valid states for enabled.
- speed: Allows the MCU to set the animation rate for the various
effects.
- speed_range: Lists the valid range of speed (0-9).
The MCU also has a few odd quirks that make sending multiple synchronous
events challenging. It will essentially freeze if it receives another
message before it has finished processing the last command. It also will
not reply if you wait on it using a completion. To get around this, we
do a 200ms sleep inside a work queue thread and debounce all but the most
recent message using a 50ms mod_delayed_work. This will cache the last
write, queue the work, then return so userspace can release its write
thread. The work queue is only used for brightness/multi-intensity as
that is the path likely to receive rapid successive writes.
Reviewed-by: Zhouwang Huang <honjow311@gmail.com>
Tested-by: Zhouwang Huang <honjow311@gmail.com>
Signed-off-by: Derek J. Clark <derekjohn.clark@gmail.com>
---
v4:
- Make oxp_rgb_queue delayed work struct part of drvdata and properly
init, add cancel during remove.
---
MAINTAINERS | 6 +
drivers/hid/Kconfig | 12 +
drivers/hid/Makefile | 1 +
drivers/hid/hid-ids.h | 3 +
drivers/hid/hid-oxp.c | 652 ++++++++++++++++++++++++++++++++++++++++++
5 files changed, 674 insertions(+)
create mode 100644 drivers/hid/hid-oxp.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 6f6517bf4f97..dae814192fa4 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -19707,6 +19707,12 @@ S: Maintained
F: drivers/mtd/nand/onenand/
F: include/linux/mtd/onenand*.h
+ONEXPLAYER HID DRIVER
+M: Derek J. Clark <derekjohn.clark@gmail.com>
+L: linux-input@vger.kernel.org
+S: Maintained
+F: drivers/hid/hid-oxp.c
+
ONEXPLAYER PLATFORM EC DRIVER
M: Antheas Kapenekakis <lkml@antheas.dev>
M: Derek John Clark <derekjohn.clark@gmail.com>
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 3c034cd32fa8..2deaec9f467d 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -919,6 +919,18 @@ config HID_ORTEK
- Ortek WKB-2000
- Skycable wireless presenter
+config HID_OXP
+ tristate "OneXPlayer handheld controller configuration support"
+ depends on USB_HID
+ depends on LEDS_CLASS
+ depends on LEDS_CLASS_MULTICOLOR
+ help
+ Say Y here if you would like to enable support for OneXPlayer handheld
+ devices that come with RGB LED rings around the joysticks and macro buttons.
+
+ To compile this driver as a module, choose M here: the module will
+ be called hid-oxp.
+
config HID_PANTHERLORD
tristate "Pantherlord/GreenAsia game controller"
help
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index 03ef72ec4499..bda8a24c9257 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -99,6 +99,7 @@ obj-$(CONFIG_HID_NTI) += hid-nti.o
obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o
obj-$(CONFIG_HID_NVIDIA_SHIELD) += hid-nvidia-shield.o
obj-$(CONFIG_HID_ORTEK) += hid-ortek.o
+obj-$(CONFIG_HID_OXP) += hid-oxp.o
obj-$(CONFIG_HID_PRODIKEYS) += hid-prodikeys.o
obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o
obj-$(CONFIG_HID_PENMOUNT) += hid-penmount.o
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 5bad81222c6e..dcc5a3a70eaf 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -1131,6 +1131,9 @@
#define USB_VENDOR_ID_NVIDIA 0x0955
#define USB_DEVICE_ID_NVIDIA_THUNDERSTRIKE_CONTROLLER 0x7214
+#define USB_VENDOR_ID_CRSC 0x1a2c
+#define USB_DEVICE_ID_ONEXPLAYER_GEN1 0xb001
+
#define USB_VENDOR_ID_ONTRAK 0x0a07
#define USB_DEVICE_ID_ONTRAK_ADU100 0x0064
diff --git a/drivers/hid/hid-oxp.c b/drivers/hid/hid-oxp.c
new file mode 100644
index 000000000000..f72bc74a7e6e
--- /dev/null
+++ b/drivers/hid/hid-oxp.c
@@ -0,0 +1,652 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * HID driver for OneXPlayer gamepad configuration devices.
+ *
+ * Copyright (c) 2026 Valve Corporation
+ */
+
+#include <linux/array_size.h>
+#include <linux/cleanup.h>
+#include <linux/delay.h>
+#include <linux/dev_printk.h>
+#include <linux/device.h>
+#include <linux/hid.h>
+#include <linux/jiffies.h>
+#include <linux/kstrtox.h>
+#include <linux/led-class-multicolor.h>
+#include <linux/mutex.h>
+#include <linux/sysfs.h>
+#include <linux/types.h>
+#include <linux/workqueue.h>
+
+#include "hid-ids.h"
+
+#define OXP_PACKET_SIZE 64
+
+#define GEN1_MESSAGE_ID 0xff
+
+#define GEN1_USAGE_PAGE 0xff01
+
+enum oxp_function_index {
+ OXP_FID_GEN1_RGB_SET = 0x07,
+ OXP_FID_GEN1_RGB_REPLY = 0x0f,
+};
+
+static struct oxp_hid_cfg {
+ struct delayed_work oxp_rgb_queue;
+ struct led_classdev_mc *led_mc;
+ struct hid_device *hdev;
+ struct mutex cfg_mutex; /*ensure single synchronous output report*/
+ u8 rgb_brightness;
+ u8 rgb_effect;
+ u8 rgb_speed;
+ u8 rgb_en;
+} drvdata;
+
+enum oxp_feature_en_index {
+ OXP_FEAT_DISABLED,
+ OXP_FEAT_ENABLED,
+};
+
+static const char *const oxp_feature_en_text[] = {
+ [OXP_FEAT_DISABLED] = "false",
+ [OXP_FEAT_ENABLED] = "true",
+};
+
+enum oxp_rgb_effect_index {
+ OXP_UNKNOWN,
+ OXP_EFFECT_AURORA,
+ OXP_EFFECT_BIRTHDAY,
+ OXP_EFFECT_FLOWING,
+ OXP_EFFECT_CHROMA_1,
+ OXP_EFFECT_NEON,
+ OXP_EFFECT_CHROMA_2,
+ OXP_EFFECT_DREAMY,
+ OXP_EFFECT_WARM,
+ OXP_EFFECT_CYBERPUNK,
+ OXP_EFFECT_SEA,
+ OXP_EFFECT_SUNSET,
+ OXP_EFFECT_COLORFUL,
+ OXP_EFFECT_MONSTER,
+ OXP_EFFECT_GREEN,
+ OXP_EFFECT_BLUE,
+ OXP_EFFECT_YELLOW,
+ OXP_EFFECT_TEAL,
+ OXP_EFFECT_PURPLE,
+ OXP_EFFECT_FOGGY,
+ OXP_EFFECT_MONO_LIST, /* placeholder for effect_index_show */
+};
+
+/* These belong to rgb_effect_index, but we want to hide them from
+ * rgb_effect_text
+ */
+
+#define OXP_GET_PROPERTY 0xfc
+#define OXP_SET_PROPERTY 0xfd
+#define OXP_EFFECT_MONO_TRUE 0xfe /* actual index for monocolor */
+
+static const char *const oxp_rgb_effect_text[] = {
+ [OXP_UNKNOWN] = "unknown",
+ [OXP_EFFECT_AURORA] = "aurora",
+ [OXP_EFFECT_BIRTHDAY] = "birthday_cake",
+ [OXP_EFFECT_FLOWING] = "flowing_light",
+ [OXP_EFFECT_CHROMA_1] = "chroma_popping",
+ [OXP_EFFECT_NEON] = "neon",
+ [OXP_EFFECT_CHROMA_2] = "chroma_breathing",
+ [OXP_EFFECT_DREAMY] = "dreamy",
+ [OXP_EFFECT_WARM] = "warm_sun",
+ [OXP_EFFECT_CYBERPUNK] = "cyberpunk",
+ [OXP_EFFECT_SEA] = "sea_foam",
+ [OXP_EFFECT_SUNSET] = "sunset_afterglow",
+ [OXP_EFFECT_COLORFUL] = "colorful",
+ [OXP_EFFECT_MONSTER] = "monster_woke",
+ [OXP_EFFECT_GREEN] = "green_breathing",
+ [OXP_EFFECT_BLUE] = "blue_breathing",
+ [OXP_EFFECT_YELLOW] = "yellow_breathing",
+ [OXP_EFFECT_TEAL] = "teal_breathing",
+ [OXP_EFFECT_PURPLE] = "purple_breathing",
+ [OXP_EFFECT_FOGGY] = "foggy_haze",
+ [OXP_EFFECT_MONO_LIST] = "monocolor",
+};
+
+struct oxp_gen_1_rgb_report {
+ u8 report_id;
+ u8 message_id;
+ u8 padding_2[2];
+ u8 effect;
+ u8 enabled;
+ u8 speed;
+ u8 brightness;
+ u8 red;
+ u8 green;
+ u8 blue;
+} __packed;
+
+static u16 get_usage_page(struct hid_device *hdev)
+{
+ return hdev->collection[0].usage >> 16;
+}
+
+static int oxp_hid_raw_event_gen_1(struct hid_device *hdev,
+ struct hid_report *report, u8 *data,
+ int size)
+{
+ struct led_classdev_mc *led_mc = drvdata.led_mc;
+ struct oxp_gen_1_rgb_report *rgb_rep;
+
+ if (data[1] != OXP_FID_GEN1_RGB_REPLY)
+ return 0;
+
+ rgb_rep = (struct oxp_gen_1_rgb_report *)data;
+ /* Ensure we save monocolor as the list value */
+ drvdata.rgb_effect = rgb_rep->effect == OXP_EFFECT_MONO_TRUE ?
+ OXP_EFFECT_MONO_LIST :
+ rgb_rep->effect;
+ drvdata.rgb_speed = rgb_rep->speed;
+ drvdata.rgb_en = rgb_rep->enabled == 0 ? OXP_FEAT_DISABLED :
+ OXP_FEAT_ENABLED;
+ drvdata.rgb_brightness = rgb_rep->brightness;
+ led_mc->led_cdev.brightness = rgb_rep->brightness / 4 *
+ led_mc->led_cdev.max_brightness;
+ /* If monocolor had less than 100% brightness on the previous boot,
+ * there will be no reliable way to determine the real intensity.
+ * Since intensity scaling is used with a hardware brightness set at max,
+ * our brightness will always look like 100%. Use the last set value to
+ * prevent successive boots from lowering the brightness further.
+ * Brightness will be "wrong" but the effect will remain the same visually.
+ */
+ led_mc->subled_info[0].intensity = rgb_rep->red;
+ led_mc->subled_info[1].intensity = rgb_rep->green;
+ led_mc->subled_info[2].intensity = rgb_rep->blue;
+
+ return 0;
+}
+
+static int oxp_hid_raw_event(struct hid_device *hdev, struct hid_report *report,
+ u8 *data, int size)
+{
+ u16 up = get_usage_page(hdev);
+
+ dev_dbg(&hdev->dev, "raw event data: [%*ph]\n", OXP_PACKET_SIZE, data);
+
+ switch (up) {
+ case GEN1_USAGE_PAGE:
+ return oxp_hid_raw_event_gen_1(hdev, report, data, size);
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static int mcu_property_out(u8 *header, size_t header_size, u8 *data,
+ size_t data_size, u8 *footer, size_t footer_size)
+{
+ unsigned char *dmabuf __free(kfree) = kzalloc(OXP_PACKET_SIZE, GFP_KERNEL);
+ int ret;
+
+ if (!dmabuf)
+ return -ENOMEM;
+
+ if (header_size + data_size + footer_size > OXP_PACKET_SIZE)
+ return -EINVAL;
+
+ guard(mutex)(&drvdata.cfg_mutex);
+ memcpy(dmabuf, header, header_size);
+ memcpy(dmabuf + header_size, data, data_size);
+ if (footer_size)
+ memcpy(dmabuf + OXP_PACKET_SIZE - footer_size, footer, footer_size);
+
+ dev_dbg(&drvdata.hdev->dev, "raw data: [%*ph]\n", OXP_PACKET_SIZE, dmabuf);
+
+ ret = hid_hw_output_report(drvdata.hdev, dmabuf, OXP_PACKET_SIZE);
+ if (ret < 0)
+ return ret;
+
+ /* MCU takes 200ms to be ready for another command. */
+ msleep(200);
+ return ret == OXP_PACKET_SIZE ? 0 : -EIO;
+}
+
+static int oxp_gen_1_property_out(enum oxp_function_index fid, u8 *data,
+ u8 data_size)
+{
+ u8 header[] = { fid, GEN1_MESSAGE_ID };
+ size_t header_size = ARRAY_SIZE(header);
+
+ return mcu_property_out(header, header_size, data, data_size, NULL, 0);
+}
+
+static int oxp_rgb_status_store(u8 enabled, u8 speed, u8 brightness)
+{
+ u16 up = get_usage_page(drvdata.hdev);
+ u8 *data;
+
+ /* Always default to max brightness and use intensity scaling when in
+ * monocolor mode.
+ */
+ switch (up) {
+ case GEN1_USAGE_PAGE:
+ data = (u8[4]) { OXP_SET_PROPERTY, enabled, speed, brightness };
+ if (drvdata.rgb_effect == OXP_EFFECT_MONO_LIST)
+ data[3] = 0x04;
+ return oxp_gen_1_property_out(OXP_FID_GEN1_RGB_SET, data, 4);
+ default:
+ return -ENODEV;
+ }
+}
+
+static ssize_t oxp_rgb_status_show(void)
+{
+ u16 up = get_usage_page(drvdata.hdev);
+ u8 *data;
+
+ switch (up) {
+ case GEN1_USAGE_PAGE:
+ data = (u8[1]) { OXP_GET_PROPERTY };
+ return oxp_gen_1_property_out(OXP_FID_GEN1_RGB_SET, data, 1);
+ default:
+ return -ENODEV;
+ }
+}
+
+static int oxp_rgb_color_set(void)
+{
+ u8 max_br = drvdata.led_mc->led_cdev.max_brightness;
+ u8 br = drvdata.led_mc->led_cdev.brightness;
+ u16 up = get_usage_page(drvdata.hdev);
+ u8 green, red, blue;
+ size_t size;
+ u8 *data;
+ int i;
+
+ red = br * drvdata.led_mc->subled_info[0].intensity / max_br;
+ green = br * drvdata.led_mc->subled_info[1].intensity / max_br;
+ blue = br * drvdata.led_mc->subled_info[2].intensity / max_br;
+
+ switch (up) {
+ case GEN1_USAGE_PAGE:
+ size = 55;
+ data = (u8[55]) { OXP_EFFECT_MONO_TRUE };
+
+ for (i = 0; i < (size - 1) / 3; i++) {
+ data[3 * i + 1] = red;
+ data[3 * i + 2] = green;
+ data[3 * i + 3] = blue;
+ }
+ return oxp_gen_1_property_out(OXP_FID_GEN1_RGB_SET, data, size);
+ default:
+ return -ENODEV;
+ }
+}
+
+static int oxp_rgb_effect_set(u8 effect)
+{
+ u16 up = get_usage_page(drvdata.hdev);
+ u8 *data;
+ int ret;
+
+ switch (effect) {
+ case OXP_EFFECT_AURORA:
+ case OXP_EFFECT_BIRTHDAY:
+ case OXP_EFFECT_FLOWING:
+ case OXP_EFFECT_CHROMA_1:
+ case OXP_EFFECT_NEON:
+ case OXP_EFFECT_CHROMA_2:
+ case OXP_EFFECT_DREAMY:
+ case OXP_EFFECT_WARM:
+ case OXP_EFFECT_CYBERPUNK:
+ case OXP_EFFECT_SEA:
+ case OXP_EFFECT_SUNSET:
+ case OXP_EFFECT_COLORFUL:
+ case OXP_EFFECT_MONSTER:
+ case OXP_EFFECT_GREEN:
+ case OXP_EFFECT_BLUE:
+ case OXP_EFFECT_YELLOW:
+ case OXP_EFFECT_TEAL:
+ case OXP_EFFECT_PURPLE:
+ case OXP_EFFECT_FOGGY:
+ switch (up) {
+ case GEN1_USAGE_PAGE:
+ data = (u8[1]) { effect };
+ ret = oxp_gen_1_property_out(OXP_FID_GEN1_RGB_SET, data, 1);
+ break;
+ default:
+ ret = -ENODEV;
+ }
+ break;
+ case OXP_EFFECT_MONO_LIST:
+ ret = oxp_rgb_color_set();
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ if (ret)
+ return ret;
+
+ drvdata.rgb_effect = effect;
+
+ return 0;
+}
+
+static ssize_t enabled_store(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ int ret;
+ u8 val;
+
+ ret = sysfs_match_string(oxp_feature_en_text, buf);
+ if (ret < 0)
+ return ret;
+ val = ret;
+
+ ret = oxp_rgb_status_store(val, drvdata.rgb_speed,
+ drvdata.rgb_brightness);
+ if (ret)
+ return ret;
+
+ drvdata.rgb_en = val;
+ return count;
+}
+
+static ssize_t enabled_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ int ret;
+
+ ret = oxp_rgb_status_show();
+ if (ret)
+ return ret;
+
+ if (drvdata.rgb_en >= ARRAY_SIZE(oxp_feature_en_text))
+ return -EINVAL;
+
+ return sysfs_emit(buf, "%s\n", oxp_feature_en_text[drvdata.rgb_en]);
+}
+static DEVICE_ATTR_RW(enabled);
+
+static ssize_t enabled_index_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ size_t count = 0;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(oxp_feature_en_text); i++)
+ count += sysfs_emit_at(buf, count, "%s ", oxp_feature_en_text[i]);
+
+ if (count)
+ buf[count - 1] = '\n';
+
+ return count;
+}
+static DEVICE_ATTR_RO(enabled_index);
+
+static ssize_t effect_store(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ int ret;
+ u8 val;
+
+ ret = sysfs_match_string(oxp_rgb_effect_text, buf);
+ if (ret < 0)
+ return ret;
+
+ val = ret;
+
+ ret = oxp_rgb_status_store(drvdata.rgb_en, drvdata.rgb_speed,
+ drvdata.rgb_brightness);
+ if (ret)
+ return ret;
+
+ ret = oxp_rgb_effect_set(val);
+ if (ret)
+ return ret;
+
+ return count;
+}
+
+static ssize_t effect_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ int ret;
+
+ ret = oxp_rgb_status_show();
+ if (ret)
+ return ret;
+
+ if (drvdata.rgb_effect >= ARRAY_SIZE(oxp_rgb_effect_text))
+ return -EINVAL;
+
+ return sysfs_emit(buf, "%s\n", oxp_rgb_effect_text[drvdata.rgb_effect]);
+}
+
+static DEVICE_ATTR_RW(effect);
+
+static ssize_t effect_index_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ size_t count = 0;
+ unsigned int i;
+
+ for (i = 1; i < ARRAY_SIZE(oxp_rgb_effect_text); i++)
+ count += sysfs_emit_at(buf, count, "%s ", oxp_rgb_effect_text[i]);
+
+ if (count)
+ buf[count - 1] = '\n';
+
+ return count;
+}
+static DEVICE_ATTR_RO(effect_index);
+
+static ssize_t speed_store(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ int ret;
+ u8 val;
+
+ ret = kstrtou8(buf, 10, &val);
+ if (ret)
+ return ret;
+
+ if (val > 9)
+ return -EINVAL;
+
+ ret = oxp_rgb_status_store(drvdata.rgb_en, val, drvdata.rgb_brightness);
+ if (ret)
+ return ret;
+
+ drvdata.rgb_speed = val;
+ return count;
+}
+
+static ssize_t speed_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ int ret;
+
+ ret = oxp_rgb_status_show();
+ if (ret)
+ return ret;
+
+ if (drvdata.rgb_speed > 9)
+ return -EINVAL;
+
+ return sysfs_emit(buf, "%hhu\n", drvdata.rgb_speed);
+}
+static DEVICE_ATTR_RW(speed);
+
+static ssize_t speed_range_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return sysfs_emit(buf, "0-9\n");
+}
+static DEVICE_ATTR_RO(speed_range);
+
+static void oxp_rgb_queue_fn(struct work_struct *work)
+{
+ unsigned int max_brightness = drvdata.led_mc->led_cdev.max_brightness;
+ unsigned int brightness = drvdata.led_mc->led_cdev.brightness;
+ u8 val = 4 * brightness / max_brightness;
+ int ret;
+
+ if (drvdata.rgb_brightness != val) {
+ ret = oxp_rgb_status_store(drvdata.rgb_en, drvdata.rgb_speed, val);
+ if (ret)
+ dev_err(drvdata.led_mc->led_cdev.dev,
+ "Error: Failed to write RGB Status: %i\n", ret);
+
+ drvdata.rgb_brightness = val;
+ }
+
+ if (drvdata.rgb_effect != OXP_EFFECT_MONO_LIST)
+ return;
+
+ ret = oxp_rgb_effect_set(drvdata.rgb_effect);
+ if (ret)
+ dev_err(drvdata.led_mc->led_cdev.dev, "Error: Failed to write RGB color: %i\n",
+ ret);
+}
+
+static void oxp_rgb_brightness_set(struct led_classdev *led_cdev,
+ enum led_brightness brightness)
+{
+ led_cdev->brightness = brightness;
+ mod_delayed_work(system_wq, &drvdata.oxp_rgb_queue, msecs_to_jiffies(50));
+}
+
+static struct attribute *oxp_rgb_attrs[] = {
+ &dev_attr_effect.attr,
+ &dev_attr_effect_index.attr,
+ &dev_attr_enabled.attr,
+ &dev_attr_enabled_index.attr,
+ &dev_attr_speed.attr,
+ &dev_attr_speed_range.attr,
+ NULL,
+};
+
+static const struct attribute_group oxp_rgb_attr_group = {
+ .attrs = oxp_rgb_attrs,
+};
+
+static struct mc_subled oxp_rgb_subled_info[] = {
+ {
+ .color_index = LED_COLOR_ID_RED,
+ .intensity = 0x24,
+ .channel = 0x1,
+ },
+ {
+ .color_index = LED_COLOR_ID_GREEN,
+ .intensity = 0x22,
+ .channel = 0x2,
+ },
+ {
+ .color_index = LED_COLOR_ID_BLUE,
+ .intensity = 0x99,
+ .channel = 0x3,
+ },
+};
+
+static struct led_classdev_mc oxp_cdev_rgb = {
+ .led_cdev = {
+ .name = "oxp:rgb:joystick_rings",
+ .color = LED_COLOR_ID_RGB,
+ .brightness = 0x64,
+ .max_brightness = 0x64,
+ .brightness_set = oxp_rgb_brightness_set,
+ },
+ .num_colors = ARRAY_SIZE(oxp_rgb_subled_info),
+ .subled_info = oxp_rgb_subled_info,
+};
+
+static int oxp_cfg_probe(struct hid_device *hdev, u16 up)
+{
+ int ret;
+
+ hid_set_drvdata(hdev, &drvdata);
+ mutex_init(&drvdata.cfg_mutex);
+ drvdata.hdev = hdev;
+ drvdata.led_mc = &oxp_cdev_rgb;
+
+ INIT_DELAYED_WORK(&drvdata.oxp_rgb_queue, oxp_rgb_queue_fn);
+ ret = devm_led_classdev_multicolor_register(&hdev->dev, &oxp_cdev_rgb);
+ if (ret)
+ return dev_err_probe(&hdev->dev, ret,
+ "Failed to create RGB device\n");
+
+ ret = devm_device_add_group(drvdata.led_mc->led_cdev.dev,
+ &oxp_rgb_attr_group);
+ if (ret)
+ return dev_err_probe(drvdata.led_mc->led_cdev.dev, ret,
+ "Failed to create RGB configuration attributes\n");
+
+ ret = oxp_rgb_status_show();
+ if (ret)
+ dev_warn(drvdata.led_mc->led_cdev.dev,
+ "Failed to query RGB initial state: %i\n", ret);
+
+ return 0;
+}
+
+static int oxp_hid_probe(struct hid_device *hdev,
+ const struct hid_device_id *id)
+{
+ int ret;
+ u16 up;
+
+ ret = hid_parse(hdev);
+ if (ret)
+ return dev_err_probe(&hdev->dev, ret, "Failed to parse HID device\n");
+
+ ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
+ if (ret)
+ return dev_err_probe(&hdev->dev, ret, "Failed to start HID device\n");
+
+ ret = hid_hw_open(hdev);
+ if (ret) {
+ hid_hw_stop(hdev);
+ return dev_err_probe(&hdev->dev, ret, "Failed to open HID device\n");
+ }
+
+ up = get_usage_page(hdev);
+ dev_dbg(&hdev->dev, "Got usage page %04x\n", up);
+
+ switch (up) {
+ case GEN1_USAGE_PAGE:
+ ret = oxp_cfg_probe(hdev, up);
+ if (ret) {
+ hid_hw_close(hdev);
+ hid_hw_stop(hdev);
+ }
+
+ return ret;
+ default:
+ return 0;
+ }
+}
+
+static void oxp_hid_remove(struct hid_device *hdev)
+{
+ cancel_delayed_work(&drvdata.oxp_rgb_queue);
+ hid_hw_close(hdev);
+ hid_hw_stop(hdev);
+}
+
+static const struct hid_device_id oxp_devices[] = {
+ { HID_USB_DEVICE(USB_VENDOR_ID_CRSC, USB_DEVICE_ID_ONEXPLAYER_GEN1) },
+ {}
+};
+
+MODULE_DEVICE_TABLE(hid, oxp_devices);
+static struct hid_driver hid_oxp = {
+ .name = "hid-oxp",
+ .id_table = oxp_devices,
+ .probe = oxp_hid_probe,
+ .remove = oxp_hid_remove,
+ .raw_event = oxp_hid_raw_event,
+};
+module_hid_driver(hid_oxp);
+
+MODULE_AUTHOR("Derek J. Clark <derekjohn.clark@gmail.com>");
+MODULE_DESCRIPTION("Driver for OneXPlayer HID Interfaces");
+MODULE_LICENSE("GPL");
--
2.53.0
^ permalink raw reply related
* [PATCH v4 0/5] Add OneXPlayer Configuration HID Driver
From: Derek J. Clark @ 2026-04-19 4:26 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires
Cc: Pierre-Loup A . Griffais, Lambert Fan, Zhouwang Huang,
Derek J . Clark, linux-input, linux-doc, linux-kernel
Adds an HID driver for OneXPlayer HID configuration devices. There are
currently 2 generations of OneXPlayer HID protocol. The first (OneXPlayer
F1 series) only provides an RGB control interface over HID. The Second
(X1 mini series, G1 series, AOKZOE A1X) also includes a hardware level
button mapping interface, vibration intensity settings, and the ability
to switch output between xinput and a debug mode that can be used to debug
the button mapping. Some devices (G1 Series, APEX) use a hybrid of Gen1
RGB control and Gen 2 controller settings. To ensure there is no conflicts
when the driver is loaded, we skip creating the RGB interface for Gen 2
devices if there is a DMI match.
I'll also add a note that Gen 1 devices also have an interface for
setting the key map and debug mode, but that is done entirely over a
serial TTY device so it is not able to be added to this driver. There
are also some "Gen 0" devices (OneXPlayer 2 Series) also use it, but
the TTY interface also handles the RGB control so no support is
provided by this driver for those interfaces.
Signed-off-by: Derel J. Clark <derekjohn.clark@gmail.com>
---
v4:
- Make all delayed work part of drvdata & ensure they are canceled
during remove.
v3: https://lore.kernel.org/linux-input/20260412213444.2231505-1-derekjohn.clark@gmail.com/
- Ensure default button map is properly init during probe.
v2: https://lore.kernel.org/linux-input/20260407041354.2283201-1-derekjohn.clark@gmail.com/
- Add DMI quirks for certain devices that ship with both GEN1 and GEN2
MCU to avoid clashing when initializing the RGB interface.
- Add left & right vibration intensity attributes.
- Add additional mappings for keyboard inputs.
- Add a delayed work trigger to re-apply settings after the MCU
completes initializing after a suspend/resume cycle.
v1: https://lore.kernel.org/linux-input/20260322031615.1524307-1-derekjohn.clark@gmail.com/
Derek J. Clark (5):
HID: hid-oxp: Add OneXPlayer configuration driver
HID: hid-oxp: Add Second Generation RGB Control
HID: hid-oxp: Add Second Generation Gamepad Mode Switch
HID: hid-oxp: Add Button Mapping Interface
HID: hid-oxp: Add Vibration Intensity Attribute
MAINTAINERS | 6 +
drivers/hid/Kconfig | 13 +
drivers/hid/Makefile | 1 +
drivers/hid/hid-ids.h | 6 +
drivers/hid/hid-oxp.c | 1580 +++++++++++++++++++++++++++++++++++++++++
5 files changed, 1606 insertions(+)
create mode 100644 drivers/hid/hid-oxp.c
--
2.53.0
^ permalink raw reply
* [PATCH] Input: imx_keypad - Fix spelling mistake "Colums" -> "Columns"
From: Ethan Carter Edwards @ 2026-04-19 0:58 UTC (permalink / raw)
To: Dmitry Torokhov, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
Fabio Estevam
Cc: linux-input, imx, linux-arm-kernel, linux-kernel, kernel-janitors,
Ethan Carter Edwards
There is a spelling mistake in a two comments. Fix them.
Signed-off-by: Ethan Carter Edwards <ethan@ethancedwards.com>
---
drivers/input/keyboard/imx_keypad.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c
index 069c1d6376e1..ccde60cd6bb3 100644
--- a/drivers/input/keyboard/imx_keypad.c
+++ b/drivers/input/keyboard/imx_keypad.c
@@ -324,7 +324,7 @@ static void imx_keypad_config(struct imx_keypad *keypad)
reg_val |= (keypad->cols_en_mask & 0xff) << 8; /* cols */
writew(reg_val, keypad->mmio_base + KPCR);
- /* Write 0's to KPDR[15:8] (Colums) */
+ /* Write 0's to KPDR[15:8] (Columns) */
reg_val = readw(keypad->mmio_base + KPDR);
reg_val &= 0x00ff;
writew(reg_val, keypad->mmio_base + KPDR);
@@ -357,7 +357,7 @@ static void imx_keypad_inhibit(struct imx_keypad *keypad)
reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD;
writew(reg_val, keypad->mmio_base + KPSR);
- /* Colums as open drain and disable all rows */
+ /* Columns as open drain and disable all rows */
reg_val = (keypad->cols_en_mask & 0xff) << 8;
writew(reg_val, keypad->mmio_base + KPCR);
}
---
base-commit: c7275b05bc428c7373d97aa2da02d3a7fa6b9f66
change-id: 20260418-imx-typo-14370bd2ce47
Best regards,
--
Ethan Carter Edwards <ethan@ethancedwards.com>
^ permalink raw reply related
* Re: [PATCH v2 00/19] tracepoint: Avoid double static_branch evaluation at guarded call sites
From: Steven Rostedt @ 2026-04-18 23:04 UTC (permalink / raw)
To: Vineeth Pillai (Google)
Cc: Peter Zijlstra, Dmitry Ilvokhin, Masami Hiramatsu,
Mathieu Desnoyers, Ingo Molnar, Jens Axboe, io-uring,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Alexei Starovoitov, Daniel Borkmann, Marcelo Ricardo Leitner,
Xin Long, Jon Maloy, Aaron Conole, Eelco Chaudron, Ilya Maximets,
netdev, bpf, linux-sctp, tipc-discussion, dev, Jiri Pirko,
Oded Gabbay, Koby Elbaz, dri-devel, Rafael J. Wysocki,
Viresh Kumar, Gautham R. Shenoy, Huang Rui, Mario Limonciello,
Len Brown, Srinivas Pandruvada, linux-pm, MyungJoo Ham,
Kyungmin Park, Chanwoo Choi, Christian König, Sumit Semwal,
linaro-mm-sig, Eddie James, Andrew Jeffery, Joel Stanley,
linux-fsi, David Airlie, Simona Vetter, Alex Deucher,
Danilo Krummrich, Matthew Brost, Philipp Stanner, Harry Wentland,
Leo Li, amd-gfx, Jiri Kosina, Benjamin Tissoires, linux-input,
Wolfram Sang, linux-i2c, Mark Brown, Michael Hennerich,
Nuno Sá, linux-spi, James E.J. Bottomley, Martin K. Petersen,
linux-scsi, Chris Mason, David Sterba, linux-btrfs,
Thomas Gleixner, Andrew Morton, SeongJae Park, linux-mm,
Borislav Petkov, Dave Hansen, x86, linux-trace-kernel,
linux-kernel
In-Reply-To: <20260323160052.17528-1-vineeth@bitbyteword.org>
On Mon, 23 Mar 2026 12:00:19 -0400
"Vineeth Pillai (Google)" <vineeth@bitbyteword.org> wrote:
> if (trace_foo_enabled() && cond)
> trace_call__foo(args); /* calls __do_trace_foo() directly */
Hi Vineeth,
Could you rebase this series on top of 7.1-rc1 when it comes out?
Several of these patches were accepted already. Obviously drop those.
They were the patches that added the feature, and any where the
maintainer acked the patch.
Now that the feature has been accepted, if you post the patch series
again after 7.1-rc1 with all the patches that haven't been accepted
yet, then the maintainers can simply take them directly. As the feature
is now accepted, there's no dependency on it, and they don't need to go
through the tracing tree.
Thanks,
-- Steve
^ permalink raw reply
* USB: core: sanitize string descriptors against C0 control characters
From: Taylor Hewetson @ 2026-04-18 19:08 UTC (permalink / raw)
To: Greg Kroah-Hartman, Jiri Kosina, Benjamin Tissoires
Cc: linux-usb, linux-input, linux-kernel, Taylor Hewetson
In-Reply-To: <20260418025823.21767-1-taylor@exponent.digital>
Some USB devices report string descriptors with a declared length
greater than the actual string, leaving uninitialized firmware memory
- often including C0 control characters such as 0x18 - appended to
the returned string. This has been observed on the ASUS ROG Azoth
2.4GHz dongle (USB ID 0b05:1a85), where the trailing bytes make their
way into hid->uniq and then /sys/class/input/inputN/uniq.
Downstream userspace components then reject the device. systemd's
sd-device property_is_valid() treats any string property containing
control characters as invalid and refuses to set ID_SERIAL_SHORT,
which in turn prevents the device from being tagged with seat. On
GNOME Wayland, mutter silently declines to open input devices that
are missing this tagging, leaving the keyboard visible and producing
keycodes at the kernel layer but dead to the user in a graphical
session.
Truncate the returned UTF-8 string at the first C0 control character
(0x00..0x1F) or DEL (0x7F). Printable Unicode beyond ASCII is left
intact, so legitimate non-ASCII serials (e.g. European manufacturers)
continue to work. Callers that previously received a string with
trailing garbage now receive the clean leading portion, which is
well-formed UTF-8 and safe for all downstream consumers.
Signed-off-by: Taylor Hewetson <taylor@exponent.digital>
---
Changes since v1:
- Move the sanitization from drivers/hid/usbhid/hid-core.c to
drivers/usb/core/message.c so that all usb_string() callers
benefit, not just usbhid. (Greg KH)
- Broaden the scope from "ASUS Azoth workaround" to "well-formed
string guarantee for usb_string()"; update commit message
accordingly.
v1: https://lore.kernel.org/all/20260418025823.21767-1-taylor@exponent.digital/
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -1052,6 +1052,25 @@
UTF16_LITTLE_ENDIAN, buf, size);
buf[err] = 0;
+ /*
+ * Some devices report string descriptors with a declared length
+ * greater than the actual serial, leaving uninitialized firmware
+ * memory (often including C0 control characters) appended to the
+ * returned string. Truncate at the first control character so
+ * callers get a clean, well-formed string.
+ */
+ {
+ int i;
+ for (i = 0; i < err; i++) {
+ unsigned char c = buf[i];
+ if (c < 0x20 || c == 0x7f) {
+ buf[i] = 0;
+ err = i;
+ break;
+ }
+ }
+ }
+
if (tbuf[1] != USB_DT_STRING)
dev_dbg(&dev->dev,
"wrong descriptor type %02x for string %d (\"%s\")\n",
^ permalink raw reply
* Samsung NP900X3E: Sometime non-working keyboard (`atkbd serio0: Failed to enable keyboard on isa0060/serio0`)
From: Paul Menzel @ 2026-04-18 18:17 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: linux-input, LKML, Hans de Goede
[-- Attachment #1: Type: text/plain, Size: 895 bytes --]
Dear Linux folks,
Trying Linux on an older Samsung Series 9 Ultrabook NP900X3E [1], the
keyboard always works in GRUB, and sometimes it does not in Linux, so I
am unable to enter the LUKS passphrase. In that case, Linux logs:
atkbd serio0: Failed to deactivate keyboard on isa0060/serio0
atkbd serio0: Failed to enable keyboard on isa0060/serio0
As Ctrl + Alt + Del does not work, I have to hold the power button for
ten(?) seconds to power off the device, and then try again. In my
experience it takes up to three tries, but of course sometimes it also
works from the beginning.
As the drive is encrypted, I do not have full Linux logs from the
failure case. Please find the output of `dmesg` with Linux
6.19.10+deb14-amd64 attached for the success case.
Kind regards,
Paul
[1]:
https://www.samsung.com/us/business/support/owners/product/series-9-ultrabook-np900x3e/
[-- Attachment #2: 20260402--linux-6.19.10+deb14-amd64--messages.txt --]
[-- Type: text/plain, Size: 69106 bytes --]
[ 0.000000] Linux version 6.19.10+deb14-amd64 (debian-kernel@lists.debian.org) (x86_64-linux-gnu-gcc-15 (Debian 15.2.0-16) 15.2.0, GNU ld (GNU Binutils for Debian) 2.46) #1 SMP PREEMPT_DYNAMIC Debian 6.19.10-1 (2026-03-27)
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-6.19.10+deb14-amd64 root=UUID=b46a4afc-bd06-4cad-853f-b83ef92fae8d ro quiet
[ 0.000000] BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009cfff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009d000-0x00000000000bffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000001fffffff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000020000000-0x00000000201fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000020200000-0x0000000040003fff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000040004000-0x0000000040004fff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000040005000-0x00000000b8e6cfff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000b8e6d000-0x00000000b906efff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000b906f000-0x00000000c93eefff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000c93ef000-0x00000000daeeefff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000daeef000-0x00000000daf9efff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x00000000daf9f000-0x00000000daffefff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x00000000dafff000-0x00000000daffffff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000db000000-0x00000000df9fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000f80f8000-0x00000000f80f8fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed1ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000011f5fffff] usable
[ 0.000000] NX (Execute Disable) protection: active
[ 0.000000] APIC: Static calls initialized
[ 0.000000] efi: EFI v2.3.1 by Phoenix Technologies Ltd.
[ 0.000000] efi: ACPI=0xdaffe000 ACPI 2.0=0xdaffe014 SMBIOS=0xdac66000 INITRD=0xb9916d18
[ 0.000000] efi: Not removing mem49: MMIO range=[0xf80f8000-0xf80f8fff] (4KB) from e820 map
[ 0.000000] efi: Not removing mem50: MMIO range=[0xfed1c000-0xfed1ffff] (16KB) from e820 map
[ 0.000000] secureboot: Secure boot disabled
[ 0.000000] SMBIOS 2.7 present.
[ 0.000000] DMI: SAMSUNG ELECTRONICS CO., LTD. 900X3C/900X3D/900X3E/900X4C/900X4D/NP900X3E-A06DE, BIOS P06ABK 03/09/2013
[ 0.000000] DMI: Memory slots populated: 1/4
[ 0.000000] tsc: Fast TSC calibration using PIT
[ 0.000000] tsc: Detected 2494.086 MHz processor
[ 0.000049] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
[ 0.000053] e820: remove [mem 0x000a0000-0x000fffff] usable
[ 0.000065] last_pfn = 0x11f600 max_arch_pfn = 0x400000000
[ 0.000073] MTRR map: 8 entries (3 fixed + 5 variable; max 23), built from 10 variable MTRRs
[ 0.000076] x86/PAT: Configuration [0-7]: WB WC UC- UC WB WP UC- WT
[ 0.000568] last_pfn = 0xdb000 max_arch_pfn = 0x400000000
[ 0.017125] RAMDISK: [mem 0xb103c000-0xb463dfff]
[ 0.017688] ACPI: Early table checksum verification disabled
[ 0.017692] ACPI: RSDP 0x00000000DAFFE014 000024 (v02 SECCSD)
[ 0.017699] ACPI: XSDT 0x00000000DAFFE170 00009C (v01 SECCSD LH43STAR 00000002 PTL 00000002)
[ 0.017707] ACPI: FACP 0x00000000DAFEE000 00010C (v05 SECCSD LH43STAR 00000002 PTL 00000002)
[ 0.017715] ACPI: DSDT 0x00000000DAFF1000 0097F2 (v02 SECCSD IVB-CPT 00000000 INTL 20061109)
[ 0.017721] ACPI: FACS 0x00000000DAF7B000 000040
[ 0.017725] ACPI: SLIC 0x00000000DAFFD000 000176 (v01 SECCSD LH43STAR 00000002 PTL 00000001)
[ 0.017730] ACPI: SSDT 0x00000000DAFFB000 001068 (v01 SECCSD PtidDevc 00001000 INTL 20061109)
[ 0.017735] ACPI: ASF! 0x00000000DAFF0000 0000A5 (v32 SECCSD LH43STAR 00000002 PTL 00000002)
[ 0.017740] ACPI: HPET 0x00000000DAFED000 000038 (v01 SECCSD LH43STAR 00000002 PTL 00000002)
[ 0.017744] ACPI: APIC 0x00000000DAFEC000 000098 (v03 SECCSD LH43STAR 00000002 PTL 00000002)
[ 0.017749] ACPI: MCFG 0x00000000DAFEB000 00003C (v01 SECCSD LH43STAR 00000002 PTL 00000002)
[ 0.017754] ACPI: FPDT 0x00000000DAFEA000 000064 (v01 SECCSD LH43STAR 00000002 PTL 00000002)
[ 0.017759] ACPI: SSDT 0x00000000DAFE9000 0009E7 (v01 PmRef Cpu0Ist 00003000 INTL 20061109)
[ 0.017764] ACPI: SSDT 0x00000000DAFE8000 000B60 (v01 PmRef CpuPm 00003000 INTL 20061109)
[ 0.017769] ACPI: UEFI 0x00000000DAFE7000 000042 (v01 PTL COMBUF 00000001 PTL 00000001)
[ 0.017773] ACPI: MSDM 0x00000000DAF78000 000055 (v03 SECCSD LH43STAR 00000002 PTL 00000002)
[ 0.017778] ACPI: UEFI 0x00000000DAFE6000 00003E (v01 SECCSD LH43STAR 00000002 PTL 00000002)
[ 0.017783] ACPI: UEFI 0x00000000DAFE5000 00022E (v01 SECCSD LH43STAR 00000002 PTL 00000002)
[ 0.017788] ACPI: BGRT 0x00000000DAFE4000 000038 (v00 SECCSD LH43STAR 00000002 PTL 00000002)
[ 0.017791] ACPI: Reserving FACP table memory at [mem 0xdafee000-0xdafee10b]
[ 0.017794] ACPI: Reserving DSDT table memory at [mem 0xdaff1000-0xdaffa7f1]
[ 0.017795] ACPI: Reserving FACS table memory at [mem 0xdaf7b000-0xdaf7b03f]
[ 0.017796] ACPI: Reserving SLIC table memory at [mem 0xdaffd000-0xdaffd175]
[ 0.017798] ACPI: Reserving SSDT table memory at [mem 0xdaffb000-0xdaffc067]
[ 0.017799] ACPI: Reserving ASF! table memory at [mem 0xdaff0000-0xdaff00a4]
[ 0.017800] ACPI: Reserving HPET table memory at [mem 0xdafed000-0xdafed037]
[ 0.017801] ACPI: Reserving APIC table memory at [mem 0xdafec000-0xdafec097]
[ 0.017803] ACPI: Reserving MCFG table memory at [mem 0xdafeb000-0xdafeb03b]
[ 0.017804] ACPI: Reserving FPDT table memory at [mem 0xdafea000-0xdafea063]
[ 0.017805] ACPI: Reserving SSDT table memory at [mem 0xdafe9000-0xdafe99e6]
[ 0.017806] ACPI: Reserving SSDT table memory at [mem 0xdafe8000-0xdafe8b5f]
[ 0.017808] ACPI: Reserving UEFI table memory at [mem 0xdafe7000-0xdafe7041]
[ 0.017809] ACPI: Reserving MSDM table memory at [mem 0xdaf78000-0xdaf78054]
[ 0.017810] ACPI: Reserving UEFI table memory at [mem 0xdafe6000-0xdafe603d]
[ 0.017812] ACPI: Reserving UEFI table memory at [mem 0xdafe5000-0xdafe522d]
[ 0.017813] ACPI: Reserving BGRT table memory at [mem 0xdafe4000-0xdafe4037]
[ 0.017984] No NUMA configuration found
[ 0.017985] Faking a node at [mem 0x0000000000000000-0x000000011f5fffff]
[ 0.018003] NODE_DATA(0) allocated [mem 0x11f5d5500-0x11f5fffff]
[ 0.018430] Zone ranges:
[ 0.018431] DMA [mem 0x0000000000001000-0x0000000000ffffff]
[ 0.018434] DMA32 [mem 0x0000000001000000-0x00000000ffffffff]
[ 0.018436] Normal [mem 0x0000000100000000-0x000000011f5fffff]
[ 0.018438] Device empty
[ 0.018439] Movable zone start for each node
[ 0.018443] Early memory node ranges
[ 0.018444] node 0: [mem 0x0000000000001000-0x000000000009cfff]
[ 0.018446] node 0: [mem 0x0000000000100000-0x000000001fffffff]
[ 0.018448] node 0: [mem 0x0000000020200000-0x0000000040003fff]
[ 0.018449] node 0: [mem 0x0000000040005000-0x00000000b8e6cfff]
[ 0.018451] node 0: [mem 0x00000000b906f000-0x00000000c93eefff]
[ 0.018452] node 0: [mem 0x00000000dafff000-0x00000000daffffff]
[ 0.018454] node 0: [mem 0x0000000100000000-0x000000011f5fffff]
[ 0.018456] Initmem setup node 0 [mem 0x0000000000001000-0x000000011f5fffff]
[ 0.018465] On node 0, zone DMA: 1 pages in unavailable ranges
[ 0.018499] On node 0, zone DMA: 99 pages in unavailable ranges
[ 0.022062] On node 0, zone DMA32: 512 pages in unavailable ranges
[ 0.029379] On node 0, zone DMA32: 1 pages in unavailable ranges
[ 0.030374] On node 0, zone DMA32: 514 pages in unavailable ranges
[ 0.030990] On node 0, zone DMA32: 39952 pages in unavailable ranges
[ 0.031810] On node 0, zone Normal: 20480 pages in unavailable ranges
[ 0.031858] On node 0, zone Normal: 2560 pages in unavailable ranges
[ 0.031868] Reserving Intel graphics memory at [mem 0xdba00000-0xdf9fffff]
[ 0.032019] ACPI: PM-Timer IO Port: 0x408
[ 0.032033] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
[ 0.032035] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
[ 0.032048] IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-23
[ 0.032052] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
[ 0.032055] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
[ 0.032062] ACPI: Using ACPI (MADT) for SMP configuration information
[ 0.032064] ACPI: HPET id: 0x8086a301 base: 0xfed00000
[ 0.032078] e820: update [mem 0xbc7f6000-0xbc821fff] usable ==> reserved
[ 0.032095] TSC deadline timer available
[ 0.032100] CPU topo: Max. logical packages: 1
[ 0.032102] CPU topo: Max. logical nodes: 1
[ 0.032103] CPU topo: Num. nodes per package: 1
[ 0.032107] CPU topo: Max. logical dies: 1
[ 0.032108] CPU topo: Max. dies per package: 1
[ 0.032115] CPU topo: Max. threads per core: 2
[ 0.032117] CPU topo: Num. cores per package: 2
[ 0.032118] CPU topo: Num. threads per package: 4
[ 0.032118] CPU topo: Allowing 4 present CPUs plus 0 hotplug CPUs
[ 0.032144] PM: hibernation: Registered nosave memory: [mem 0x00000000-0x00000fff]
[ 0.032147] PM: hibernation: Registered nosave memory: [mem 0x0009d000-0x000fffff]
[ 0.032150] PM: hibernation: Registered nosave memory: [mem 0x20000000-0x201fffff]
[ 0.032152] PM: hibernation: Registered nosave memory: [mem 0x40004000-0x40004fff]
[ 0.032155] PM: hibernation: Registered nosave memory: [mem 0xb8e6d000-0xb906efff]
[ 0.032158] PM: hibernation: Registered nosave memory: [mem 0xbc7f6000-0xbc821fff]
[ 0.032160] PM: hibernation: Registered nosave memory: [mem 0xc93ef000-0xdaffefff]
[ 0.032163] PM: hibernation: Registered nosave memory: [mem 0xdb000000-0xffffffff]
[ 0.032166] [mem 0xdfa00000-0xf80f7fff] available for PCI devices
[ 0.032168] Booting paravirtualized kernel on bare hardware
[ 0.032171] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645519600211568 ns
[ 0.041683] setup_percpu: NR_CPUS:8192 nr_cpumask_bits:4 nr_cpu_ids:4 nr_node_ids:1
[ 0.042217] percpu: Embedded 62 pages/cpu s217088 r8192 d28672 u524288
[ 0.042228] pcpu-alloc: s217088 r8192 d28672 u524288 alloc=1*2097152
[ 0.042232] pcpu-alloc: [0] 0 1 2 3
[ 0.042263] Kernel command line: BOOT_IMAGE=/vmlinuz-6.19.10+deb14-amd64 root=UUID=b46a4afc-bd06-4cad-853f-b83ef92fae8d ro quiet
[ 0.042335] random: crng init done
[ 0.042336] printk: log buffer data + meta data: 131072 + 458752 = 589824 bytes
[ 0.043139] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[ 0.043631] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[ 0.043746] software IO TLB: area num 4.
[ 0.075948] Fallback order for Node 0: 0
[ 0.075957] Built 1 zonelists, mobility grouping on. Total pages: 951689
[ 0.075959] Policy zone: Normal
[ 0.075975] mem auto-init: stack:all(zero), heap alloc:on, heap free:off
[ 0.093686] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[ 0.093729] Kernel/User page tables isolation: enabled
[ 0.106425] ftrace: allocating 48556 entries in 192 pages
[ 0.106430] ftrace: allocated 192 pages with 2 groups
[ 0.107254] Dynamic Preempt: lazy
[ 0.107321] rcu: Preemptible hierarchical RCU implementation.
[ 0.107322] rcu: RCU restricting CPUs from NR_CPUS=8192 to nr_cpu_ids=4.
[ 0.107324] Trampoline variant of Tasks RCU enabled.
[ 0.107325] Rude variant of Tasks RCU enabled.
[ 0.107326] Tracing variant of Tasks RCU enabled.
[ 0.107327] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[ 0.107328] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[ 0.107342] RCU Tasks: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=4.
[ 0.107345] RCU Tasks Rude: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=4.
[ 0.107347] RCU Tasks Trace: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=4.
[ 0.116776] NR_IRQS: 524544, nr_irqs: 456, preallocated irqs: 16
[ 0.117023] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[ 0.117130] Console: colour dummy device 80x25
[ 0.117134] printk: legacy console [tty0] enabled
[ 0.117202] ACPI: Core revision 20250807
[ 0.117340] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484882848 ns
[ 0.117361] APIC: Switch to symmetric I/O mode setup
[ 0.117436] x2apic: IRQ remapping doesn't support X2APIC mode
[ 0.117873] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1
[ 0.137363] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x23f3674fddb, max_idle_ns: 440795320195 ns
[ 0.137371] Calibrating delay loop (skipped), value calculated using timer frequency.. 4988.17 BogoMIPS (lpj=9976344)
[ 0.137409] CPU0: Thermal monitoring enabled (TM1)
[ 0.137446] Last level iTLB entries: 4KB 512, 2MB 8, 4MB 8
[ 0.137449] Last level dTLB entries: 4KB 512, 2MB 32, 4MB 32, 1GB 0
[ 0.137453] process: using mwait in idle threads
[ 0.137456] mitigations: Enabled attack vectors: user_kernel, user_user, guest_host, guest_guest, SMT mitigations: auto
[ 0.137464] Speculative Store Bypass: Mitigation: Speculative Store Bypass disabled via prctl
[ 0.137466] SRBDS: Vulnerable: No microcode
[ 0.137468] Spectre V2 : Mitigation: Retpolines
[ 0.137470] Spectre V2 : User space: Mitigation: STIBP via prctl
[ 0.137471] MDS: Mitigation: Clear CPU buffers
[ 0.137473] VMSCAPE: Mitigation: IBPB before exit to userspace
[ 0.137474] Spectre V1 : Mitigation: usercopy/swapgs barriers and __user pointer sanitization
[ 0.137476] Spectre V2 : Spectre v2 / SpectreRSB: Filling RSB on context switch and VMEXIT
[ 0.137477] Spectre V2 : Enabling Restricted Speculation for firmware calls
[ 0.137480] Spectre V2 : mitigation: Enabling conditional Indirect Branch Prediction Barrier
[ 0.137489] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[ 0.137492] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[ 0.137494] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
[ 0.137496] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
[ 0.137498] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[ 0.181258] Freeing SMP alternatives memory: 44K
[ 0.181272] pid_max: default: 32768 minimum: 301
[ 0.181422] landlock: Up and running.
[ 0.181424] Yama: disabled by default; enable with sysctl kernel.yama.*
[ 0.181549] AppArmor: AppArmor initialized
[ 0.181579] TOMOYO Linux initialized
[ 0.181830] LSM support for eBPF active
[ 0.181916] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[ 0.181926] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[ 0.183921] smpboot: CPU0: Intel(R) Core(TM) i7-3537U CPU @ 2.00GHz (family: 0x6, model: 0x3a, stepping: 0x9)
[ 0.184277] Performance Events: PEBS fmt1+, IvyBridge events, 16-deep LBR, full-width counters, Intel PMU driver.
[ 0.184304] ... version: 3
[ 0.184305] ... bit width: 48
[ 0.184307] ... generic counters: 4
[ 0.184308] ... generic bitmap: 000000000000000f
[ 0.184310] ... fixed-purpose counters: 3
[ 0.184311] ... fixed-purpose bitmap: 0000000000000007
[ 0.184312] ... value mask: 0000ffffffffffff
[ 0.184314] ... max period: 00007fffffffffff
[ 0.184315] ... global_ctrl mask: 000000070000000f
[ 0.184639] signal: max sigframe size: 1776
[ 0.184667] Estimated ratio of average max frequency by base frequency (times 1024): 1187
[ 0.185706] rcu: Hierarchical SRCU implementation.
[ 0.185710] rcu: Max phase no-delay instances is 1000.
[ 0.185803] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level
[ 0.186485] NMI watchdog: Enabled. Permanently consumes one hw-PMU counter.
[ 0.186575] smp: Bringing up secondary CPUs ...
[ 0.186772] smpboot: x86: Booting SMP configuration:
[ 0.186774] .... node #0, CPUs: #2 #1 #3
[ 0.191373] MDS CPU bug present and SMT on, data leak possible. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html for more details.
[ 0.191373] VMSCAPE: SMT on, STIBP is required for full protection. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/vmscape.html for more details.
[ 0.193427] smp: Brought up 1 node, 4 CPUs
[ 0.193427] smpboot: Total of 4 processors activated (19952.68 BogoMIPS)
[ 0.195176] node 0 deferred pages initialised in 0ms
[ 0.195176] Memory: 3502152K/3806756K available (17878K kernel code, 3350K rwdata, 13048K rodata, 4476K init, 5524K bss, 297520K reserved, 0K cma-reserved)
[ 0.195176] devtmpfs: initialized
[ 0.195176] x86/mm: Memory block size: 128MB
[ 0.197723] ACPI: PM: Registering ACPI NVS region [mem 0xdaeef000-0xdaf9efff] (720896 bytes)
[ 0.197723] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[ 0.197723] posixtimers hash table entries: 2048 (order: 3, 32768 bytes, linear)
[ 0.197723] futex hash table entries: 1024 (65536 bytes on 1 NUMA nodes, total 64 KiB, linear).
[ 0.198313] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[ 0.198535] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
[ 0.198588] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
[ 0.198642] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[ 0.198659] audit: initializing netlink subsys (disabled)
[ 0.198691] audit: type=2000 audit(1775143038.000:1): state=initialized audit_enabled=0 res=1
[ 0.198691] thermal_sys: Registered thermal governor 'fair_share'
[ 0.198691] thermal_sys: Registered thermal governor 'bang_bang'
[ 0.198691] thermal_sys: Registered thermal governor 'step_wise'
[ 0.198691] thermal_sys: Registered thermal governor 'user_space'
[ 0.198691] thermal_sys: Registered thermal governor 'power_allocator'
[ 0.198691] cpuidle: using governor ladder
[ 0.198691] cpuidle: using governor menu
[ 0.204928] efi: Freeing EFI boot services memory: 52928K
[ 0.204935] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
[ 0.205083] PCI: ECAM [mem 0xf8000000-0xfbffffff] (base 0xf8000000) for domain 0000 [bus 00-3f]
[ 0.205092] PCI: not using ECAM ([mem 0xf8000000-0xfbffffff] not reserved)
[ 0.205095] PCI: Using configuration type 1 for base access
[ 0.205171] core: PMU erratum BJ122, BV98, HSD29 worked around, HT is on
[ 0.205219] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[ 0.205558] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
[ 0.205558] HugeTLB: 28 KiB vmemmap can be freed for a 2.00 MiB page
[ 0.205895] ACPI: Added _OSI(Module Device)
[ 0.205900] ACPI: Added _OSI(Processor Device)
[ 0.205903] ACPI: Added _OSI(Processor Aggregator Device)
[ 0.217610] ACPI: 4 ACPI AML tables successfully acquired and loaded
[ 0.225860] ACPI: Dynamic OEM Table Load:
[ 0.225876] ACPI: SSDT 0xFFFF8F11C08E7000 000784 (v01 PmRef Cpu0Cst 00003001 INTL 20061109)
[ 0.226941] ACPI: Dynamic OEM Table Load:
[ 0.226954] ACPI: SSDT 0xFFFF8F11C1021C00 000303 (v01 PmRef ApIst 00003000 INTL 20061109)
[ 0.229699] ACPI: Dynamic OEM Table Load:
[ 0.229710] ACPI: SSDT 0xFFFF8F11C0A8FA00 000119 (v01 PmRef ApCst 00003000 INTL 20061109)
[ 0.231232] ACPI: EC: EC started
[ 0.231236] ACPI: EC: interrupt blocked
[ 0.633449] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
[ 0.633454] ACPI: \_SB_.PCI0.LPCB.H_EC: Boot DSDT EC used to handle transactions
[ 0.633457] ACPI: Interpreter enabled
[ 0.633487] ACPI: PM: (supports S0 S3 S4 S5)
[ 0.633489] ACPI: Using IOAPIC for interrupt routing
[ 0.633529] PCI: ECAM [mem 0xf8000000-0xfbffffff] (base 0xf8000000) for domain 0000 [bus 00-3f]
[ 0.633896] PCI: ECAM [mem 0xf8000000-0xfbffffff] reserved as ACPI motherboard resource
[ 0.633913] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
[ 0.633916] PCI: Using E820 reservations for host bridge windows
[ 0.634132] ACPI: Enabled 9 GPEs in block 00 to 3F
[ 0.642023] ACPI: \_TZ_.FN00: New power resource
[ 0.642123] ACPI: \_TZ_.FN01: New power resource
[ 0.642219] ACPI: \_TZ_.FN02: New power resource
[ 0.642318] ACPI: \_TZ_.FN03: New power resource
[ 0.642411] ACPI: \_TZ_.FN04: New power resource
[ 0.643127] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-3e])
[ 0.643137] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI HPX-Type3]
[ 0.643234] acpi PNP0A08:00: _OSC: OS requested [PCIeHotplug SHPCHotplug PME AER PCIeCapability LTR]
[ 0.643237] acpi PNP0A08:00: _OSC: platform willing to grant [PCIeHotplug SHPCHotplug PME AER PCIeCapability LTR]
[ 0.643240] acpi PNP0A08:00: _OSC: platform retains control of PCIe features (AE_ERROR)
[ 0.643777] PCI host bridge to bus 0000:00
[ 0.643783] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
[ 0.643787] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
[ 0.643791] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000dffff window]
[ 0.643793] pci_bus 0000:00: root bus resource [mem 0xdfa00000-0xfeafffff window]
[ 0.643796] pci_bus 0000:00: root bus resource [bus 00-3e]
[ 0.643814] pci 0000:00:00.0: [8086:0154] type 00 class 0x060000 conventional PCI endpoint
[ 0.643920] pci 0000:00:02.0: [8086:0166] type 00 class 0x030000 conventional PCI endpoint
[ 0.643942] pci 0000:00:02.0: BAR 0 [mem 0xf0000000-0xf03fffff 64bit]
[ 0.643946] pci 0000:00:02.0: BAR 2 [mem 0xe0000000-0xefffffff 64bit pref]
[ 0.643949] pci 0000:00:02.0: BAR 4 [io 0x3000-0x303f]
[ 0.643962] pci 0000:00:02.0: Video device with shadowed ROM at [mem 0x000c0000-0x000dffff]
[ 0.644104] pci 0000:00:16.0: [8086:1e3a] type 00 class 0x078000 conventional PCI endpoint
[ 0.644149] pci 0000:00:16.0: BAR 0 [mem 0xf0705000-0xf070500f 64bit]
[ 0.644193] pci 0000:00:16.0: PME# supported from D0 D3hot D3cold
[ 0.644295] pci 0000:00:1b.0: [8086:1e20] type 00 class 0x040300 PCIe Root Complex Integrated Endpoint
[ 0.644339] pci 0000:00:1b.0: BAR 0 [mem 0xf0700000-0xf0703fff 64bit]
[ 0.644404] pci 0000:00:1b.0: PME# supported from D0 D3hot D3cold
[ 0.644546] pci 0000:00:1c.0: [8086:1e10] type 01 class 0x060400 PCIe Root Port
[ 0.644580] pci 0000:00:1c.0: PCI bridge to [bus 01]
[ 0.644591] pci 0000:00:1c.0: bridge window [mem 0xf0600000-0xf06fffff]
[ 0.644674] pci 0000:00:1c.0: PME# supported from D0 D3hot D3cold
[ 0.644816] pci 0000:00:1c.3: [8086:1e16] type 01 class 0x060400 PCIe Root Port
[ 0.644848] pci 0000:00:1c.3: PCI bridge to [bus 02]
[ 0.644855] pci 0000:00:1c.3: bridge window [io 0x2000-0x2fff]
[ 0.644870] pci 0000:00:1c.3: bridge window [mem 0xf0400000-0xf04fffff 64bit pref]
[ 0.644942] pci 0000:00:1c.3: PME# supported from D0 D3hot D3cold
[ 0.645087] pci 0000:00:1c.4: [8086:1e18] type 01 class 0x060400 PCIe Root Port
[ 0.645134] pci 0000:00:1c.4: PCI bridge to [bus 03]
[ 0.645145] pci 0000:00:1c.4: bridge window [mem 0xf0500000-0xf05fffff]
[ 0.645266] pci 0000:00:1c.4: PME# supported from D0 D3hot D3cold
[ 0.645419] pci 0000:00:1d.0: [8086:1e26] type 00 class 0x0c0320 conventional PCI endpoint
[ 0.645469] pci 0000:00:1d.0: BAR 0 [mem 0xf0709000-0xf07093ff]
[ 0.645524] pci 0000:00:1d.0: PME# supported from D0 D3hot D3cold
[ 0.645652] pci 0000:00:1f.0: [8086:1e5d] type 00 class 0x060100 conventional PCI endpoint
[ 0.645869] pci 0000:00:1f.2: [8086:1e03] type 00 class 0x010601 conventional PCI endpoint
[ 0.645909] pci 0000:00:1f.2: BAR 0 [io 0x3088-0x308f]
[ 0.645913] pci 0000:00:1f.2: BAR 1 [io 0x3094-0x3097]
[ 0.645917] pci 0000:00:1f.2: BAR 2 [io 0x3080-0x3087]
[ 0.645921] pci 0000:00:1f.2: BAR 3 [io 0x3090-0x3093]
[ 0.645925] pci 0000:00:1f.2: BAR 4 [io 0x3060-0x307f]
[ 0.645929] pci 0000:00:1f.2: BAR 5 [mem 0xf0708000-0xf07087ff]
[ 0.645972] pci 0000:00:1f.2: PME# supported from D3hot
[ 0.646075] pci 0000:00:1f.3: [8086:1e22] type 00 class 0x0c0500 conventional PCI endpoint
[ 0.646118] pci 0000:00:1f.3: BAR 0 [mem 0xf0704000-0xf07040ff 64bit]
[ 0.646125] pci 0000:00:1f.3: BAR 4 [io 0xefa0-0xefbf]
[ 0.646516] pci 0000:01:00.0: [8086:088e] type 00 class 0x028000 PCIe Endpoint
[ 0.646915] pci 0000:01:00.0: BAR 0 [mem 0xf0600000-0xf0601fff 64bit]
[ 0.647569] pci 0000:01:00.0: PME# supported from D0 D3hot D3cold
[ 0.648373] pci 0000:00:1c.0: PCI bridge to [bus 01]
[ 0.648566] pci 0000:02:00.0: [10ec:8168] type 00 class 0x020000 PCIe Endpoint
[ 0.648828] pci 0000:02:00.0: BAR 0 [io 0x2000-0x20ff]
[ 0.648852] pci 0000:02:00.0: BAR 2 [mem 0xf0404000-0xf0404fff 64bit pref]
[ 0.648868] pci 0000:02:00.0: BAR 4 [mem 0xf0400000-0xf0403fff 64bit pref]
[ 0.649326] pci 0000:02:00.0: supports D1 D2
[ 0.649329] pci 0000:02:00.0: PME# supported from D0 D1 D2 D3hot D3cold
[ 0.649914] pci 0000:00:1c.3: PCI bridge to [bus 02]
[ 0.650110] pci 0000:03:00.0: [1912:0015] type 00 class 0x0c0330 PCIe Endpoint
[ 0.650241] pci 0000:03:00.0: BAR 0 [mem 0xf0500000-0xf0501fff 64bit]
[ 0.650445] pci 0000:03:00.0: PME# supported from D0 D3hot D3cold
[ 0.650754] pci 0000:00:1c.4: PCI bridge to [bus 03]
[ 0.652959] ACPI: PCI: Interrupt link LNKA configured for IRQ 0
[ 0.652963] ACPI: PCI: Interrupt link LNKA disabled
[ 0.653023] ACPI: PCI: Interrupt link LNKB configured for IRQ 0
[ 0.653025] ACPI: PCI: Interrupt link LNKB disabled
[ 0.653082] ACPI: PCI: Interrupt link LNKC configured for IRQ 0
[ 0.653085] ACPI: PCI: Interrupt link LNKC disabled
[ 0.653140] ACPI: PCI: Interrupt link LNKD configured for IRQ 0
[ 0.653142] ACPI: PCI: Interrupt link LNKD disabled
[ 0.653197] ACPI: PCI: Interrupt link LNKE configured for IRQ 0
[ 0.653200] ACPI: PCI: Interrupt link LNKE disabled
[ 0.653254] ACPI: PCI: Interrupt link LNKF configured for IRQ 0
[ 0.653257] ACPI: PCI: Interrupt link LNKF disabled
[ 0.653311] ACPI: PCI: Interrupt link LNKG configured for IRQ 0
[ 0.653314] ACPI: PCI: Interrupt link LNKG disabled
[ 0.653368] ACPI: PCI: Interrupt link LNKH configured for IRQ 0
[ 0.653372] ACPI: PCI: Interrupt link LNKH disabled
[ 0.654228] ACPI: EC: interrupt unblocked
[ 0.654231] ACPI: EC: event unblocked
[ 0.654245] ACPI: EC: 0 stale EC events cleared
[ 0.654245] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
[ 0.654245] ACPI: EC: GPE=0x17
[ 0.654245] ACPI: \_SB_.PCI0.LPCB.H_EC: Boot DSDT EC initialization complete
[ 0.654245] ACPI: \_SB_.PCI0.LPCB.H_EC: EC: Used to handle transactions and events
[ 0.654245] iommu: Default domain type: Translated
[ 0.654245] iommu: DMA domain TLB invalidation policy: lazy mode
[ 0.654245] pps_core: LinuxPPS API ver. 1 registered
[ 0.654245] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[ 0.654245] PTP clock support registered
[ 0.654245] EDAC MC: Ver: 3.0.0
[ 0.654245] efivars: Registered efivars operations
[ 0.654245] NetLabel: Initializing
[ 0.654245] NetLabel: domain hash size = 128
[ 0.654245] NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO
[ 0.654245] NetLabel: unlabeled traffic allowed by default
[ 0.654245] PCI: Using ACPI for IRQ routing
[ 0.654245] PCI: pci_cache_line_size set to 64 bytes
[ 0.654245] e820: reserve RAM buffer [mem 0x0009d000-0x0009ffff]
[ 0.654245] e820: reserve RAM buffer [mem 0x40004000-0x43ffffff]
[ 0.654245] e820: reserve RAM buffer [mem 0xb8e6d000-0xbbffffff]
[ 0.654245] e820: reserve RAM buffer [mem 0xbc7f6000-0xbfffffff]
[ 0.654245] e820: reserve RAM buffer [mem 0xc93ef000-0xcbffffff]
[ 0.654245] e820: reserve RAM buffer [mem 0xdb000000-0xdbffffff]
[ 0.654245] e820: reserve RAM buffer [mem 0x11f600000-0x11fffffff]
[ 0.657415] pci 0000:00:02.0: vgaarb: setting as boot VGA device
[ 0.657415] pci 0000:00:02.0: vgaarb: bridge control possible
[ 0.657415] pci 0000:00:02.0: vgaarb: VGA device added: decodes=io+mem,owns=io+mem,locks=none
[ 0.657415] vgaarb: loaded
[ 0.657510] hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0, 0, 0, 0, 0, 0
[ 0.657528] hpet0: 8 comparators, 64-bit 14.318180 MHz counter
[ 0.659599] clocksource: Switched to clocksource tsc-early
[ 0.659624] VFS: Disk quotas dquot_6.6.0
[ 0.659624] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[ 0.659624] AppArmor: AppArmor Filesystem Enabled
[ 0.659624] pnp: PnP ACPI init
[ 0.659624] system 00:00: [io 0x0680-0x069f] has been reserved
[ 0.659624] system 00:00: [io 0x1000-0x100f] has been reserved
[ 0.659624] system 00:00: [io 0x5000-0x5003] has been reserved
[ 0.659624] system 00:00: [io 0xffff] has been reserved
[ 0.659624] system 00:00: [io 0x0400-0x0453] has been reserved
[ 0.659624] system 00:00: [io 0x0458-0x047f] has been reserved
[ 0.659624] system 00:00: [io 0x0500-0x057f] has been reserved
[ 0.659624] system 00:00: [io 0x0a00-0x0a0f] has been reserved
[ 0.659624] system 00:00: [io 0x164e-0x164f] has been reserved
[ 0.659624] system 00:00: [io 0x5000-0x500f] could not be reserved
[ 0.659647] system 00:04: [mem 0xfed1c000-0xfed1ffff] has been reserved
[ 0.659652] system 00:04: [mem 0xfed10000-0xfed17fff] has been reserved
[ 0.659655] system 00:04: [mem 0xfed18000-0xfed18fff] has been reserved
[ 0.659658] system 00:04: [mem 0xfed19000-0xfed19fff] has been reserved
[ 0.659661] system 00:04: [mem 0xf8000000-0xfbffffff] could not be reserved
[ 0.659664] system 00:04: [mem 0xfed20000-0xfed3ffff] has been reserved
[ 0.659666] system 00:04: [mem 0xfed90000-0xfed93fff] has been reserved
[ 0.659669] system 00:04: [mem 0xfed45000-0xfed8ffff] has been reserved
[ 0.659672] system 00:04: [mem 0xff000000-0xffffffff] has been reserved
[ 0.659675] system 00:04: [mem 0xfee00000-0xfeefffff] has been reserved
[ 0.659678] system 00:04: [mem 0xfffff000-0xffffffff] has been reserved
[ 0.660054] pnp: PnP ACPI: found 5 devices
[ 0.667067] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[ 0.667156] NET: Registered PF_INET protocol family
[ 0.667232] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
[ 0.686843] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
[ 0.686876] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[ 0.686904] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
[ 0.687046] TCP bind hash table entries: 32768 (order: 8, 1048576 bytes, linear)
[ 0.687236] TCP: Hash tables configured (established 32768 bind 32768)
[ 0.687319] MPTCP token hash table entries: 4096 (order: 5, 98304 bytes, linear)
[ 0.687365] UDP hash table entries: 2048 (order: 5, 131072 bytes, linear)
[ 0.687405] UDP-Lite hash table entries: 2048 (order: 5, 131072 bytes, linear)
[ 0.687480] NET: Registered PF_UNIX/PF_LOCAL protocol family
[ 0.687490] NET: Registered PF_XDP protocol family
[ 0.687511] pci 0000:00:1c.0: PCI bridge to [bus 01]
[ 0.687522] pci 0000:00:1c.0: bridge window [mem 0xf0600000-0xf06fffff]
[ 0.687534] pci 0000:00:1c.3: PCI bridge to [bus 02]
[ 0.687539] pci 0000:00:1c.3: bridge window [io 0x2000-0x2fff]
[ 0.687548] pci 0000:00:1c.3: bridge window [mem 0xf0400000-0xf04fffff 64bit pref]
[ 0.687557] pci 0000:00:1c.4: PCI bridge to [bus 03]
[ 0.687565] pci 0000:00:1c.4: bridge window [mem 0xf0500000-0xf05fffff]
[ 0.687579] pci_bus 0000:00: resource 4 [io 0x0000-0x0cf7 window]
[ 0.687582] pci_bus 0000:00: resource 5 [io 0x0d00-0xffff window]
[ 0.687584] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000dffff window]
[ 0.687586] pci_bus 0000:00: resource 7 [mem 0xdfa00000-0xfeafffff window]
[ 0.687589] pci_bus 0000:01: resource 1 [mem 0xf0600000-0xf06fffff]
[ 0.687591] pci_bus 0000:02: resource 0 [io 0x2000-0x2fff]
[ 0.687593] pci_bus 0000:02: resource 2 [mem 0xf0400000-0xf04fffff 64bit pref]
[ 0.687596] pci_bus 0000:03: resource 1 [mem 0xf0500000-0xf05fffff]
[ 0.688197] PCI: CLS 64 bytes, default 64
[ 0.688223] PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
[ 0.688225] software IO TLB: mapped [mem 0x00000000c5033000-0x00000000c9033000] (64MB)
[ 0.688338] Trying to unpack rootfs image as initramfs...
[ 0.731124] Initialise system trusted keyrings
[ 0.731151] Key type blacklist registered
[ 0.731307] workingset: timestamp_bits=36 max_order=20 bucket_order=0
[ 0.731699] fuse: init (API version 7.45)
[ 0.732060] integrity: Platform Keyring initialized
[ 0.732067] integrity: Machine keyring initialized
[ 0.779587] Key type asymmetric registered
[ 0.779597] Asymmetric key parser 'x509' registered
[ 0.780338] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
[ 0.780468] io scheduler mq-deadline registered
[ 0.793399] ledtrig-cpu: registered to indicate activity on CPUs
[ 0.798727] thermal LNXTHERM:00: registered as thermal_zone0
[ 0.798735] ACPI: thermal: Thermal Zone [TZ00] (42 C)
[ 0.799038] thermal LNXTHERM:01: registered as thermal_zone1
[ 0.799042] ACPI: thermal: Thermal Zone [TZ01] (30 C)
[ 0.799297] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[ 0.800186] Linux agpgart interface v0.103
[ 0.801852] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:EPAD] at 0x60,0x64 irq 1,12
[ 0.807210] serio: i8042 KBD port at 0x60,0x64 irq 1
[ 0.807224] serio: i8042 AUX port at 0x60,0x64 irq 12
[ 0.807408] mousedev: PS/2 mouse device common for all mice
[ 0.807755] rtc_cmos 00:01: registered as rtc0
[ 0.807792] rtc_cmos 00:01: setting system clock to 2026-04-02T15:17:19 UTC (1775143039)
[ 0.807835] rtc_cmos 00:01: alarms up to one month, y3k, 242 bytes nvram, hpet irqs
[ 0.812389] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input0
[ 0.817462] intel_pstate: Intel P-state driver initializing
[ 0.819847] efifb: probing for efifb
[ 0.819921] efifb: framebuffer at 0xe0000000, using 8100k, total 8100k
[ 0.819932] efifb: mode is 1920x1080x32, linelength=7680, pages=1
[ 0.819941] efifb: scrolling: redraw
[ 0.819945] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
[ 0.820244] Console: switching to colour frame buffer device 240x67
[ 0.822278] fb0: EFI VGA frame buffer device
[ 0.822519] NET: Registered PF_INET6 protocol family
[ 0.822930] Segment Routing with IPv6
[ 0.822933] RPL Segment Routing with IPv6
[ 0.822944] In-situ OAM (IOAM) with IPv6
[ 0.822969] mip6: Mobile IPv6
[ 0.822973] NET: Registered PF_PACKET protocol family
[ 0.823035] mpls_gso: MPLS GSO support
[ 0.825493] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
[ 0.829417] microcode: Current revision: 0x00000021
[ 0.829421] microcode: Updated early from: 0x00000017
[ 0.833414] IPI shorthand broadcast: enabled
[ 0.836425] sched_clock: Marking stable (833077473, 310531)->(861382755, -27994751)
[ 0.836755] registered taskstats version 1
[ 0.837043] Loading compiled-in X.509 certificates
[ 0.886806] Freeing initrd memory: 55304K
[ 0.928164] Loaded X.509 cert 'Build time autogenerated kernel key: b2fa1c83d2a702a480e50634270fb636ee930080'
[ 0.930161] Demotion targets for Node 0: null
[ 0.930532] Key type .fscrypt registered
[ 0.930538] Key type fscrypt-provisioning registered
[ 0.945101] Key type encrypted registered
[ 0.945109] AppArmor: AppArmor sha256 policy hashing enabled
[ 0.945113] ima: No TPM chip found, activating TPM-bypass!
[ 0.945116] ima: Allocated hash algorithm: sha256
[ 0.945406] ima: No architecture policies found
[ 0.945442] evm: Initialising EVM extended attributes:
[ 0.945445] evm: security.selinux
[ 0.945447] evm: security.SMACK64 (disabled)
[ 0.945449] evm: security.SMACK64EXEC (disabled)
[ 0.945451] evm: security.SMACK64TRANSMUTE (disabled)
[ 0.945452] evm: security.SMACK64MMAP (disabled)
[ 0.945454] evm: security.apparmor
[ 0.945455] evm: security.ima
[ 0.945457] evm: security.capability
[ 0.945459] evm: HMAC attrs: 0x1
[ 0.946008] integrity: Loading X.509 certificate: UEFI:db
[ 0.946055] integrity: Loaded X.509 cert ': 3d5bb49f5d3b7b9741b5cf19e3a82ced'
[ 0.946059] integrity: Loading X.509 certificate: UEFI:db
[ 0.946100] integrity: Loaded X.509 cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4'
[ 0.946103] integrity: Loading X.509 certificate: UEFI:db
[ 0.946134] integrity: Loaded X.509 cert 'Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53'
[ 0.967123] RAS: Correctable Errors collector initialized.
[ 0.974048] clk: Disabling unused clocks
[ 0.974053] PM: genpd: Disabling unused power domains
[ 0.975862] Freeing unused decrypted memory: 2028K
[ 0.976556] Freeing unused kernel image (initmem) memory: 4476K
[ 0.976643] Write protecting the kernel read-only data: 32768k
[ 0.976908] Freeing unused kernel image (text/rodata gap) memory: 552K
[ 0.977202] Freeing unused kernel image (rodata/data gap) memory: 1288K
[ 1.024921] x86/mm: Checked W+X mappings: passed, no W+X pages found.
[ 1.024924] x86/mm: Checking user space page tables
[ 1.070708] x86/mm: Checked W+X mappings: passed, no W+X pages found.
[ 1.070714] Run /init as init process
[ 1.070716] with arguments:
[ 1.070717] /init
[ 1.070718] with environment:
[ 1.070719] HOME=/
[ 1.070720] TERM=linux
[ 1.434905] ACPI Warning: SystemIO range 0x0000000000000428-0x000000000000042F conflicts with OpRegion 0x0000000000000400-0x000000000000047F (\PMIO) (20250807/utaddress-204)
[ 1.434918] ACPI: OSL: Resource conflict; ACPI support missing from driver?
[ 1.434923] ACPI Warning: SystemIO range 0x0000000000000540-0x000000000000054F conflicts with OpRegion 0x0000000000000500-0x0000000000000563 (\GPIO) (20250807/utaddress-204)
[ 1.434929] ACPI: OSL: Resource conflict; ACPI support missing from driver?
[ 1.434931] ACPI Warning: SystemIO range 0x0000000000000530-0x000000000000053F conflicts with OpRegion 0x0000000000000500-0x0000000000000563 (\GPIO) (20250807/utaddress-204)
[ 1.434937] ACPI: OSL: Resource conflict; ACPI support missing from driver?
[ 1.434939] ACPI Warning: SystemIO range 0x0000000000000500-0x000000000000052F conflicts with OpRegion 0x0000000000000500-0x0000000000000563 (\GPIO) (20250807/utaddress-204)
[ 1.434944] ACPI: OSL: Resource conflict; ACPI support missing from driver?
[ 1.434945] lpc_ich: Resource conflict(s) found affecting gpio_ich
[ 1.444002] i801_smbus 0000:00:1f.3: SMBus using PCI interrupt
[ 1.471885] SCSI subsystem initialized
[ 1.496431] r8169 0000:02:00.0: can't disable ASPM; OS doesn't have ASPM control
[ 1.498410] ACPI: bus type USB registered
[ 1.498456] usbcore: registered new interface driver usbfs
[ 1.498474] usbcore: registered new interface driver hub
[ 1.498492] usbcore: registered new device driver usb
[ 1.533019] libata version 3.00 loaded.
[ 1.548760] ACPI: battery: Slot [BAT1] (battery present)
[ 1.559113] ehci-pci 0000:00:1d.0: EHCI Host Controller
[ 1.559127] ehci-pci 0000:00:1d.0: new USB bus registered, assigned bus number 1
[ 1.559144] ehci-pci 0000:00:1d.0: debug port 2
[ 1.563090] ehci-pci 0000:00:1d.0: irq 23, io mem 0xf0709000
[ 1.565695] r8169 0000:02:00.0 eth0: RTL8168evl/8111evl, 18:67:b0:2c:15:1b, XID 2c9, IRQ 24
[ 1.565701] r8169 0000:02:00.0 eth0: jumbo features [frames: 9194 bytes, tx checksumming: ko]
[ 1.572365] ehci-pci 0000:00:1d.0: USB 2.0 started, EHCI 1.00
[ 1.572477] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.19
[ 1.572483] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.572486] usb usb1: Product: EHCI Host Controller
[ 1.572489] usb usb1: Manufacturer: Linux 6.19.10+deb14-amd64 ehci_hcd
[ 1.572492] usb usb1: SerialNumber: 0000:00:1d.0
[ 1.572793] hub 1-0:1.0: USB hub found
[ 1.572810] hub 1-0:1.0: 3 ports detected
[ 1.580710] xhci-pci-renesas 0000:03:00.0: firmware: failed to load renesas_usb_fw.mem (-2)
[ 1.580733] xhci-pci-renesas 0000:03:00.0: firmware: failed to load renesas_usb_fw.mem (-2)
[ 1.580750] xhci-pci-renesas 0000:03:00.0: firmware: failed to load renesas_usb_fw.mem (-2)
[ 1.580756] xhci-pci-renesas 0000:03:00.0: failed to load firmware renesas_usb_fw.mem, fallback to ROM
[ 1.580929] xhci-pci-renesas 0000:03:00.0: xHCI Host Controller
[ 1.580942] xhci-pci-renesas 0000:03:00.0: new USB bus registered, assigned bus number 2
[ 1.586220] xhci-pci-renesas 0000:03:00.0: hcc params 0x014051c7 hci version 0x100 quirks 0x0000000100000090
[ 1.586625] xhci-pci-renesas 0000:03:00.0: xHCI Host Controller
[ 1.586634] xhci-pci-renesas 0000:03:00.0: new USB bus registered, assigned bus number 3
[ 1.586640] xhci-pci-renesas 0000:03:00.0: Host supports USB 3.0 SuperSpeed
[ 1.589857] usb usb2: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.19
[ 1.589860] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.589862] usb usb2: Product: xHCI Host Controller
[ 1.589864] usb usb2: Manufacturer: Linux 6.19.10+deb14-amd64 xhci-hcd
[ 1.589865] usb usb2: SerialNumber: 0000:03:00.0
[ 1.590028] hub 2-0:1.0: USB hub found
[ 1.590228] hub 2-0:1.0: 2 ports detected
[ 1.590444] usb usb3: We don't know the algorithms for LPM for this host, disabling LPM.
[ 1.590477] usb usb3: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.19
[ 1.590479] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.590481] usb usb3: Product: xHCI Host Controller
[ 1.590482] usb usb3: Manufacturer: Linux 6.19.10+deb14-amd64 xhci-hcd
[ 1.590483] usb usb3: SerialNumber: 0000:03:00.0
[ 1.591221] hub 3-0:1.0: USB hub found
[ 1.591288] hub 3-0:1.0: 2 ports detected
[ 1.591468] ahci 0000:00:1f.2: AHCI vers 0001.0300, 32 command slots, 6 Gbps, SATA mode
[ 1.591474] ahci 0000:00:1f.2: 1/6 ports implemented (port mask 0x1)
[ 1.591477] ahci 0000:00:1f.2: flags: 64bit ncq pm led clo pio slum part ems apst
[ 1.592865] scsi host0: ahci
[ 1.593052] scsi host1: ahci
[ 1.593177] scsi host2: ahci
[ 1.593300] scsi host3: ahci
[ 1.593432] scsi host4: ahci
[ 1.593554] scsi host5: ahci
[ 1.593604] ata1: SATA max UDMA/133 abar m2048@0xf0708000 port 0xf0708100 irq 30 lpm-pol 3
[ 1.593606] ata2: DUMMY
[ 1.593607] ata3: DUMMY
[ 1.593608] ata4: DUMMY
[ 1.593609] ata5: DUMMY
[ 1.593610] ata6: DUMMY
[ 1.606788] r8169 0000:02:00.0 enp2s0: renamed from eth0
[ 1.720382] tsc: Refined TSC clocksource calibration: 2494.333 MHz
[ 1.720422] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x23f45085418, max_idle_ns: 440795285711 ns
[ 1.720490] clocksource: Switched to clocksource tsc
[ 1.820395] usb 1-1: new high-speed USB device number 2 using ehci-pci
[ 1.903401] ata1: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
[ 1.904372] ata1.00: ATA-9: SAMSUNG MZMTD512HAGL-000, DXT41K0Q, max UDMA/133
[ 1.905305] ata1.00: NCQ Send/Recv Log not supported
[ 1.905320] ata1.00: 1000215216 sectors, multi 16: LBA48 NCQ (depth 32), AA
[ 1.905653] ata1.00: Features: Dev-Sleep DIPM
[ 1.906385] ata1.00: Invalid log directory version 0x0000
[ 1.906398] ata1.00: NCQ Send/Recv Log not supported
[ 1.906701] ata1.00: configured for UDMA/133
[ 1.917330] scsi 0:0:0:0: Direct-Access ATA SAMSUNG MZMTD512 1K0Q PQ: 0 ANSI: 5
[ 1.924354] iTCO_vendor_support: vendor-support=0
[ 1.933451] iTCO_wdt iTCO_wdt.1.auto: Found a Panther Point TCO device (Version=2, TCOBASE=0x0460)
[ 1.933603] iTCO_wdt iTCO_wdt.1.auto: initialized. heartbeat=30 sec (nowayout=0)
[ 1.934780] sd 0:0:0:0: [sda] 1000215216 512-byte logical blocks: (512 GB/477 GiB)
[ 1.934801] sd 0:0:0:0: [sda] Write Protect is off
[ 1.934805] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
[ 1.934834] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 1.934886] sd 0:0:0:0: [sda] Preferred minimum I/O size 512 bytes
[ 1.964684] usb 1-1: New USB device found, idVendor=8087, idProduct=0024, bcdDevice= 0.00
[ 1.964689] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 1.964942] hub 1-1:1.0: USB hub found
[ 1.965027] hub 1-1:1.0: 6 ports detected
[ 2.003757] sda: sda1 sda2 sda3 sda4
[ 2.003954] sd 0:0:0:0: [sda] Attached SCSI disk
[ 2.089941] device-mapper: core: CONFIG_IMA_DISABLE_HTABLE is disabled. Duplicate IMA measurements will not be recorded in the IMA log.
[ 2.089981] device-mapper: uevent: version 1.0.3
[ 2.090131] device-mapper: ioctl: 4.50.0-ioctl (2025-04-28) initialised: dm-devel@lists.linux.dev
[ 2.244397] usb 1-1.5: new full-speed USB device number 3 using ehci-pci
[ 2.258384] psmouse serio1: elantech: assuming hardware version 4 (with firmware version 0x575f03)
[ 2.272738] psmouse serio1: elantech: Synaptics capabilities query result 0x40, 0x14, 0x0d.
[ 2.288969] psmouse serio1: elantech: Elan sample query result 0a, 03, 87
[ 2.345313] usb 1-1.5: New USB device found, idVendor=8087, idProduct=07da, bcdDevice=78.69
[ 2.345330] usb 1-1.5: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 2.370432] input: ETPS/2 Elantech Touchpad as /devices/platform/i8042/serio1/input/input2
[ 2.420396] usb 1-1.6: new high-speed USB device number 4 using ehci-pci
[ 2.841148] usb 1-1.6: New USB device found, idVendor=2232, idProduct=1024, bcdDevice= 0.21
[ 2.841165] usb 1-1.6: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 2.841172] usb 1-1.6: Product: Webcam SC-13HDL11624N
[ 2.841177] usb 1-1.6: Manufacturer: Namugaÿ
[ 29.620831] EXT4-fs (dm-0): orphan cleanup on readonly fs
[ 29.621294] EXT4-fs (dm-0): mounted filesystem b46a4afc-bd06-4cad-853f-b83ef92fae8d ro with ordered data mode. Quota mode: none.
[ 29.706123] Not activating Mandatory Access Control as /sbin/tomoyo-init does not exist.
[ 29.953842] systemd[1]: Inserted module 'autofs4'
[ 30.384250] systemd[1]: systemd 260.1-1 running in system mode (+PAM +AUDIT +SELINUX +APPARMOR +IMA +IPE +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK +BTF -XKBCOMMON -UTMP +LIBARCHIVE)
[ 30.384281] systemd[1]: Detected architecture x86-64.
[ 30.404667] systemd[1]: Hostname set to <dove>.
[ 30.640464] systemd[1]: bpf-restrict-fs: LSM BPF program attached
[ 30.917475] systemd[1]: Queued start job for default target graphical.target.
[ 30.951007] systemd[1]: Created slice system-cups.slice - CUPS Slice.
[ 30.951724] systemd[1]: Created slice system-getty.slice - Slice /system/getty.
[ 30.952400] systemd[1]: Created slice system-modprobe.slice - Slice /system/modprobe.
[ 30.953018] systemd[1]: Created slice system-systemd\x2dfsck.slice - Slice /system/systemd-fsck.
[ 30.953437] systemd[1]: Created slice user.slice - User and Session Slice.
[ 30.953562] systemd[1]: Started systemd-ask-password-console.path - Dispatch Password Requests to Console Directory Watch.
[ 30.953651] systemd[1]: Started systemd-ask-password-wall.path - Forward Password Requests to Wall Directory Watch.
[ 30.954400] systemd[1]: Set up automount proc-sys-fs-binfmt_misc.automount - Arbitrary Executable File Formats File System Automount Point.
[ 30.954458] systemd[1]: Expecting device dev-disk-by\x2ddiskseq-1\x2dpart4.device - /dev/disk/by-diskseq/1-part4...
[ 30.954481] systemd[1]: Expecting device dev-disk-by\x2duuid-5823\x2d9F86.device - /dev/disk/by-uuid/5823-9F86...
[ 30.954497] systemd[1]: Expecting device dev-sda2.device - /dev/sda2...
[ 30.954546] systemd[1]: Reached target imports.target - Image Downloads.
[ 30.954603] systemd[1]: Reached target nss-user-lookup.target - User and Group Name Lookups.
[ 30.954635] systemd[1]: Reached target remote-fs.target - Remote File Systems.
[ 30.954667] systemd[1]: Reached target slices.target - Slice Units.
[ 30.957260] systemd[1]: Listening on systemd-ask-password.socket - Query the User Interactively for a Password.
[ 30.959927] systemd[1]: Listening on systemd-coredump.socket - Process Core Dump Socket.
[ 30.961705] systemd[1]: Listening on systemd-creds.socket - Credential Encryption/Decryption.
[ 30.964143] systemd[1]: Listening on systemd-factory-reset.socket - Factory Reset Management.
[ 30.964403] systemd[1]: Listening on systemd-journald-dev-log.socket - Journal Socket (/dev/log).
[ 30.964614] systemd[1]: Listening on systemd-journald.socket - Journal Sockets.
[ 30.967499] systemd[1]: Listening on systemd-mute-console.socket - Console Output Muting Service Socket.
[ 30.967779] systemd[1]: Listening on systemd-oomd.socket - Userspace Out-Of-Memory (OOM) Killer Socket.
[ 30.968668] systemd[1]: systemd-pcrextend.socket - TPM PCR Measurements skipped, unmet condition check ConditionSecurity=measured-uki
[ 30.968726] systemd[1]: systemd-pcrlock.socket - Make TPM PCR Policy skipped, unmet condition check ConditionSecurity=measured-uki
[ 30.968938] systemd[1]: Listening on systemd-udevd-control.socket - udev Control Socket.
[ 30.969076] systemd[1]: Listening on systemd-udevd-kernel.socket - udev Kernel Socket.
[ 30.969266] systemd[1]: Listening on systemd-udevd-varlink.socket - udev Varlink Socket.
[ 30.969449] systemd[1]: Listening on systemd-userdbd.socket - User Database Manager Socket.
[ 30.971636] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[ 30.972931] systemd[1]: Mounting dev-mqueue.mount - POSIX Message Queue File System...
[ 30.974150] systemd[1]: Mounting sys-kernel-debug.mount - Kernel Debug File System...
[ 30.975013] systemd[1]: Mounting sys-kernel-tracing.mount - Kernel Trace File System...
[ 30.981979] systemd[1]: Starting keyboard-setup.service - Set the console keyboard layout...
[ 30.983557] systemd[1]: Starting kmod-static-nodes.service - Create List of Static Device Nodes...
[ 30.985256] systemd[1]: Starting modprobe@configfs.service - Load Kernel Module configfs...
[ 30.988459] systemd[1]: Starting modprobe@drm.service - Load Kernel Module drm...
[ 30.992585] systemd[1]: Starting modprobe@efi_pstore.service - Load Kernel Module efi_pstore...
[ 30.992670] systemd[1]: modprobe@fuse.service - Load Kernel Module fuse skipped, unmet condition check ConditionKernelModuleLoaded=!fuse
[ 30.995620] systemd[1]: Mounting sys-fs-fuse-connections.mount - FUSE Control File System...
[ 30.995781] systemd[1]: systemd-fsck-root.service - File System Check on Root Device skipped, unmet condition check ConditionPathExists=!/run/initramfs/fsck-root
[ 30.995842] systemd[1]: systemd-hibernate-clear.service - Clear Stale Hibernate Storage Info skipped, unmet condition check ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-8cf2644b-4b0b-428f-9387-6d876050dc67
[ 30.999102] systemd[1]: Starting systemd-journald.service - Journal Service...
[ 31.012810] systemd[1]: Starting systemd-modules-load.service - Load Kernel Modules...
[ 31.012864] systemd[1]: systemd-pcrmachine.service - TPM PCR Machine ID Measurement skipped, unmet condition check ConditionSecurity=measured-uki
[ 31.012942] systemd[1]: systemd-pcrproduct.service - TPM NvPCR Product ID Measurement skipped, unmet condition check ConditionSecurity=measured-uki
[ 31.016460] systemd[1]: Starting systemd-remount-fs.service - Remount Root and Kernel File Systems...
[ 31.016555] systemd[1]: systemd-tpm2-setup-early.service - Early TPM SRK Setup skipped, unmet condition check ConditionSecurity=measured-uki
[ 31.019841] pstore: Using crash dump compression: deflate
[ 31.021354] systemd[1]: Starting systemd-udev-load-credentials.service - Load udev Rules from Credentials...
[ 31.026870] systemd[1]: Starting systemd-udev-trigger.service - Coldplug All udev Devices...
[ 31.035961] systemd[1]: Finished kmod-static-nodes.service - Create List of Static Device Nodes.
[ 31.049255] systemd[1]: modprobe@configfs.service: Deactivated successfully.
[ 31.049577] systemd[1]: Finished modprobe@configfs.service - Load Kernel Module configfs.
[ 31.056983] pstore: Registered efi_pstore as persistent store backend
[ 31.071757] systemd[1]: Mounting sys-kernel-config.mount - Kernel Configuration File System...
[ 31.073248] systemd[1]: Starting systemd-tmpfiles-setup-dev-early.service - Create Static Device Nodes in /dev gracefully...
[ 31.073798] systemd[1]: modprobe@efi_pstore.service: Deactivated successfully.
[ 31.074089] systemd[1]: Finished modprobe@efi_pstore.service - Load Kernel Module efi_pstore.
[ 31.092269] i2c_dev: i2c /dev entries driver
[ 31.102184] systemd[1]: Mounted sys-kernel-tracing.mount - Kernel Trace File System.
[ 31.102412] systemd[1]: Mounted dev-mqueue.mount - POSIX Message Queue File System.
[ 31.102587] systemd[1]: Mounted sys-kernel-debug.mount - Kernel Debug File System.
[ 31.102767] systemd[1]: Mounted sys-fs-fuse-connections.mount - FUSE Control File System.
[ 31.102940] systemd[1]: Mounted sys-kernel-config.mount - Kernel Configuration File System.
[ 31.104102] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[ 31.105290] systemd-journald[634]: Collecting audit messages is disabled.
[ 31.112955] systemd[1]: Finished keyboard-setup.service - Set the console keyboard layout.
[ 31.121267] ppdev: user-space parallel port driver
[ 31.127103] EXT4-fs (dm-0): re-mounted b46a4afc-bd06-4cad-853f-b83ef92fae8d r/w.
[ 31.140830] systemd[1]: Finished systemd-remount-fs.service - Remount Root and Kernel File Systems.
[ 31.144405] systemd[1]: Finished systemd-udev-load-credentials.service - Load udev Rules from Credentials.
[ 31.148533] systemd[1]: systemd-hwdb-update.service - Rebuild Hardware Database skipped, unmet condition check ConditionNeedsUpdate=/etc
[ 31.148606] systemd[1]: systemd-pstore.service - Platform Persistent Storage Archival skipped, unmet condition check ConditionDirectoryNotEmpty=/sys/fs/pstore
[ 31.149910] systemd[1]: Starting systemd-random-seed.service - Load/Save OS Random Seed...
[ 31.149943] systemd[1]: systemd-tpm2-setup.service - TPM SRK Setup skipped, unmet condition check ConditionSecurity=measured-uki
[ 31.149970] systemd[1]: systemd-pcrnvdone.service - TPM PCR NvPCR Initialization Separator skipped, unmet condition check ConditionSecurity=measured-uki
[ 31.159958] ACPI: bus type drm_connector registered
[ 31.161216] systemd[1]: modprobe@drm.service: Deactivated successfully.
[ 31.162924] lp: driver loaded but no devices found
[ 31.174791] systemd[1]: Finished modprobe@drm.service - Load Kernel Module drm.
[ 31.175449] systemd[1]: Finished systemd-modules-load.service - Load Kernel Modules.
[ 31.176094] systemd[1]: Finished systemd-tmpfiles-setup-dev-early.service - Create Static Device Nodes in /dev gracefully.
[ 31.177806] systemd[1]: Starting systemd-sysctl.service - Apply Kernel Variables...
[ 31.177880] systemd[1]: systemd-sysusers.service - Create System Users skipped, no trigger condition checks were met.
[ 31.185346] systemd[1]: Starting systemd-journalctl.socket - Journal Log Access Socket...
[ 31.192469] systemd[1]: Starting systemd-timesyncd.service - Network Time Synchronization...
[ 31.193933] systemd[1]: Starting systemd-tmpfiles-setup-dev.service - Create Static Device Nodes in /dev...
[ 31.194831] systemd[1]: Listening on systemd-journalctl.socket - Journal Log Access Socket.
[ 31.203611] systemd[1]: Started systemd-journald.service - Journal Service.
[ 31.910803] systemd-journald[634]: Received client request to flush runtime journal.
[ 32.730383] sd 0:0:0:0: Attached scsi generic sg0 type 0
[ 32.834998] input: Lid Switch as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00/input/input3
[ 32.849276] ACPI: AC: AC Adapter [ADP1] (on-line)
[ 32.870376] ACPI: button: Lid Switch [LID0]
[ 32.870464] input: Power Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input4
[ 32.896359] ACPI: button: Power Button [PWRB]
[ 32.900394] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input5
[ 32.942924] ACPI: button: Power Button [PWRF]
[ 33.071439] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[ 33.082659] Loaded X.509 cert 'benh@debian.org: 577e021cb980e0e820821ba7b54b4961b8b4fadf'
[ 33.082889] Loaded X.509 cert 'romain.perier@gmail.com: 3abbc6ec146e09d1b6016ab9d6cf71dd233f0328'
[ 33.083089] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[ 33.083284] Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600'
[ 33.159213] iwlwifi 0000:01:00.0: can't disable ASPM; OS doesn't have ASPM control
[ 33.168683] iwlwifi 0000:01:00.0: Detected crf-id 0xa5a5a5a1, cnv-id 0xa5a5a5a1 wfpm id 0xa5a5a5a1
[ 33.168726] iwlwifi 0000:01:00.0: PCI dev 088e/4060, rev=0xb0, rfid=0xd55555d5
[ 33.168732] iwlwifi 0000:01:00.0: Detected Intel(R) Centrino(R) Advanced-N 6235 AGN
[ 33.182517] iwlwifi 0000:01:00.0: loaded firmware version 18.168.6.1 6000g2b-6.ucode op_mode iwldvm
[ 33.489651] mc: Linux media interface: v0.10
[ 33.508501] iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEBUG disabled
[ 33.508507] iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEBUGFS disabled
[ 33.508510] iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEVICE_TRACING enabled
[ 33.508512] iwlwifi 0000:01:00.0: Detected Intel(R) Centrino(R) Advanced-N 6235 AGN, REV=0xB0
[ 33.514484] input: PC Speaker as /devices/platform/pcspkr/input/input6
[ 33.578466] RAPL PMU: API unit is 2^-32 Joules, 3 fixed counters, 163840 ms ovfl timer
[ 33.578477] RAPL PMU: hw unit of domain pp0-core 2^-16 Joules
[ 33.578480] RAPL PMU: hw unit of domain package 2^-16 Joules
[ 33.578481] RAPL PMU: hw unit of domain pp1-gpu 2^-16 Joules
[ 33.580780] ieee80211 phy0: Selected rate control algorithm 'iwl-agn-rs'
[ 33.722993] iwlwifi 0000:01:00.0 wlp1s0: renamed from wlan0
[ 33.745461] Adding 8387904k swap on /dev/sda4. Priority:-1 extents:1 across:8387904k SS
[ 34.193484] videodev: Linux video capture interface: v2.00
[ 34.201996] i915 0000:00:02.0: [drm] Found ivybridge (device ID 0166) integrated display version 7.00 stepping N/A
[ 34.234001] Bluetooth: Core ver 2.22
[ 34.234031] NET: Registered PF_BLUETOOTH protocol family
[ 34.234034] Bluetooth: HCI device and connection manager initialized
[ 34.234039] Bluetooth: HCI socket layer initialized
[ 34.234043] Bluetooth: L2CAP socket layer initialized
[ 34.234049] Bluetooth: SCO socket layer initialized
[ 34.241229] Console: switching to colour dummy device 80x25
[ 34.241275] i915 0000:00:02.0: vgaarb: deactivate vga console
[ 34.295462] EXT4-fs (sda2): mounted filesystem d8deeb42-11f1-4f2d-8dac-d8c6bd0c1152 r/w with ordered data mode. Quota mode: none.
[ 34.346603] i915 0000:00:02.0: [drm] Skipping intel_backlight registration
[ 34.348440] i915 0000:00:02.0: [drm] Registered 3 planes with drm panic
[ 34.376372] [drm] Initialized i915 1.6.0 for 0000:00:02.0 on minor 0
[ 34.376912] ACPI: video: Video Device [GFX0] (multi-head: yes rom: no post: no)
[ 34.377282] acpi device:39: registered as cooling_device9
[ 34.377394] input: Video Bus as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input7
[ 34.378308] uvcvideo 1-1.6:1.0: Found UVC 1.00 device Webcam SC-13HDL11624N (2232:1024)
[ 34.386335] usbcore: registered new interface driver btusb
[ 34.388201] Bluetooth: hci0: unexpected event for opcode 0x0000
[ 34.397587] fbcon: i915drmfb (fb0) is primary device
[ 34.456281] intel_rapl_common: Found RAPL domain package
[ 34.456285] intel_rapl_common: Found RAPL domain core
[ 34.456286] intel_rapl_common: Found RAPL domain uncore
[ 34.456293] intel_rapl_common: package-0:package:long_term locked by BIOS
[ 34.456295] intel_rapl_common: package-0:package:short_term locked by BIOS
[ 34.456297] intel_rapl_common: package-0:core:long_term locked by BIOS
[ 34.456299] intel_rapl_common: package-0:uncore:long_term locked by BIOS
[ 34.492976] usbcore: registered new interface driver uvcvideo
[ 35.511742] Console: switching to colour frame buffer device 240x67
[ 35.511779] snd_hda_intel 0000:00:1b.0: bound 0000:00:02.0 (ops intel_audio_component_bind_ops [i915])
[ 35.533017] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device
[ 35.598276] snd_hda_codec_alc269 hdaudioC0D0: autoconfig for ALC269VC: line_outs=1 (0x14/0x0/0x0/0x0/0x0) type:speaker
[ 35.598285] snd_hda_codec_alc269 hdaudioC0D0: speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
[ 35.598288] snd_hda_codec_alc269 hdaudioC0D0: hp_outs=1 (0x15/0x0/0x0/0x0/0x0)
[ 35.598291] snd_hda_codec_alc269 hdaudioC0D0: mono: mono_out=0x0
[ 35.598293] snd_hda_codec_alc269 hdaudioC0D0: inputs:
[ 35.598295] snd_hda_codec_alc269 hdaudioC0D0: Internal Mic=0x12
[ 35.598297] snd_hda_codec_alc269 hdaudioC0D0: Mic=0x18
[ 35.634244] input: HDA Intel PCH Mic as /devices/pci0000:00/0000:00:1b.0/sound/card0/input8
[ 35.634309] input: HDA Intel PCH Headphone as /devices/pci0000:00/0000:00:1b.0/sound/card0/input9
[ 35.634363] input: HDA Intel PCH HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1b.0/sound/card0/input10
[ 35.728542] audit: type=1400 audit(1775143074.416:2): apparmor="STATUS" operation="profile_load" profile="unconfined" name="1password" pid=848 comm="apparmor_parser"
[ 35.728588] audit: type=1400 audit(1775143074.416:3): apparmor="STATUS" operation="profile_load" profile="unconfined" name=4D6F6E676F444220436F6D70617373 pid=850 comm="apparmor_parser"
[ 35.728817] audit: type=1400 audit(1775143074.416:4): apparmor="STATUS" operation="profile_load" profile="unconfined" name="QtWebEngineProcess" pid=851 comm="apparmor_parser"
[ 35.728823] audit: type=1400 audit(1775143074.416:5): apparmor="STATUS" operation="profile_load" profile="unconfined" name="Discord" pid=849 comm="apparmor_parser"
[ 35.731064] audit: type=1400 audit(1775143074.416:6): apparmor="STATUS" operation="profile_load" profile="unconfined" name="balena-etcher" pid=853 comm="apparmor_parser"
[ 35.731104] audit: type=1400 audit(1775143074.416:7): apparmor="STATUS" operation="profile_load" profile="unconfined" name="brave" pid=854 comm="apparmor_parser"
[ 35.731841] audit: type=1400 audit(1775143074.416:8): apparmor="STATUS" operation="profile_load" profile="unconfined" name="buildah" pid=855 comm="apparmor_parser"
[ 35.733304] audit: type=1400 audit(1775143074.420:9): apparmor="STATUS" operation="profile_load" profile="unconfined" name="cam" pid=857 comm="apparmor_parser"
[ 35.733638] audit: type=1400 audit(1775143074.420:10): apparmor="STATUS" operation="profile_load" profile="unconfined" name="busybox" pid=856 comm="apparmor_parser"
[ 35.733939] audit: type=1400 audit(1775143074.420:11): apparmor="STATUS" operation="profile_load" profile="unconfined" name="ch-checkns" pid=858 comm="apparmor_parser"
[ 36.174009] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[ 36.174017] Bluetooth: BNEP filters: protocol multicast
[ 36.174023] Bluetooth: BNEP socket layer initialized
[ 36.183630] Bluetooth: MGMT ver 1.23
[ 36.199388] NET: Registered PF_ALG protocol family
[ 36.438935] NET: Registered PF_QIPCRTR protocol family
[ 36.477719] RTL8211E Gigabit Ethernet r8169-0-200:00: attached PHY driver (mii_bus:phy_addr=r8169-0-200:00, irq=MAC)
[ 36.675092] r8169 0000:02:00.0 enp2s0: Link is Down
[ 36.693160] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 36.990719] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 37.113880] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 37.420794] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 37.763485] Initializing XFRM netlink socket
[ 37.801351] IPsec XFRM device driver
[ 38.812915] Bluetooth: RFCOMM TTY layer initialized
[ 38.812928] Bluetooth: RFCOMM socket layer initialized
[ 38.812935] Bluetooth: RFCOMM ver 1.11
[ 40.746143] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 41.042874] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 41.148380] wlp1s0: authenticate with 94:64:24:4d:d7:f2 (local address=c8:f7:33:e2:38:12)
[ 41.148397] wlp1s0: send auth to 94:64:24:4d:d7:f2 (try 1/3)
[ 41.252010] wlp1s0: authenticated
[ 41.252343] wlp1s0: associate with 94:64:24:4d:d7:f2 (try 1/3)
[ 41.259934] wlp1s0: RX AssocResp from 94:64:24:4d:d7:f2 (capab=0x1 status=0 aid=1)
[ 41.277984] wlp1s0: associated
[ 43.351689] rfkill: input handler disabled
[ 50.269668] rfkill: input handler enabled
[ 52.394547] rfkill: input handler disabled
[ 496.792074] wlp1s0: deauthenticating from 94:64:24:4d:d7:f2 by local choice (Reason: 3=DEAUTH_LEAVING)
[ 496.943623] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 497.245903] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 497.979040] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 498.291170] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 527.023990] PM: suspend entry (deep)
[ 527.067955] Filesystems sync: 0.043 seconds
[ 527.070969] Freezing user space processes
[ 527.072397] Freezing user space processes completed (elapsed 0.001 seconds)
[ 527.072401] OOM killer disabled.
[ 527.072403] Freezing remaining freezable tasks
[ 527.073669] Freezing remaining freezable tasks completed (elapsed 0.001 seconds)
[ 527.073689] printk: Suspending console(s) (use no_console_suspend to debug)
[ 527.155918] sd 0:0:0:0: [sda] Synchronizing SCSI cache
[ 527.159004] ata1.00: Entering standby power mode
[ 527.614228] ACPI: EC: interrupt blocked
[ 527.638242] ACPI: PM: Preparing to enter system sleep state S3
[ 527.639176] ACPI: EC: event blocked
[ 527.639180] ACPI: EC: EC stopped
[ 527.639182] ACPI: PM: Saving platform NVS memory
[ 527.639283] Disabling non-boot CPUs ...
[ 527.640987] smpboot: CPU 3 is now offline
[ 527.642819] smpboot: CPU 2 is now offline
[ 527.645294] smpboot: CPU 1 is now offline
[ 527.647237] ACPI: PM: Low-level resume complete
[ 527.647265] ACPI: EC: EC started
[ 527.647266] ACPI: PM: Restoring platform NVS memory
[ 527.647626] Enabling non-boot CPUs ...
[ 527.647665] smpboot: Booting Node 0 Processor 1 APIC 0x1
[ 527.651149] CPU1 is up
[ 527.651180] smpboot: Booting Node 0 Processor 2 APIC 0x2
[ 527.654732] CPU2 is up
[ 527.654761] smpboot: Booting Node 0 Processor 3 APIC 0x3
[ 527.657801] CPU3 is up
[ 527.659605] ACPI: PM: Waking up from system sleep state S3
[ 527.662332] ACPI: EC: interrupt unblocked
[ 527.665250] ACPI: EC: event unblocked
[ 527.665773] usb usb2: root hub lost power or was reset
[ 527.665777] usb usb3: root hub lost power or was reset
[ 527.665924] ACPI: EC: 0 stale EC events cleared
[ 527.676244] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 527.739996] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 527.929409] usb 1-1.6: reset high-speed USB device number 4 using ehci-pci
[ 527.981178] ata1: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
[ 528.050270] iwlwifi 0000:01:00.0: Radio type=0x2-0x1-0x0
[ 528.186162] ata1.00: NCQ Send/Recv Log not supported
[ 528.186525] sd 0:0:0:0: [sda] Starting disk
[ 528.187046] ata1.00: NCQ Send/Recv Log not supported
[ 528.187278] ata1.00: configured for UDMA/133
[ 528.269463] usb 1-1.5: reset full-speed USB device number 3 using ehci-pci
[ 528.370243] OOM killer enabled.
[ 528.370248] Restarting tasks: Starting
[ 528.371730] Bluetooth: hci0: unexpected event for opcode 0x0000
[ 528.376260] Restarting tasks: Done
[ 528.376270] efivarfs: resyncing variable state
[ 528.419799] efivarfs: finished resyncing variable state
[ 528.419822] random: crng reseeded on system resumption
[ 528.434073] video LNXVIDEO:00: Restoring backlight state
[ 528.434186] PM: suspend exit
[ 528.555999] Bluetooth: MGMT ver 1.23
[ 528.620978] RTL8211E Gigabit Ethernet r8169-0-200:00: attached PHY driver (mii_bus:phy_addr=r8169-0-200:00, irq=MAC)
[ 528.816114] r8169 0000:02:00.0 enp2s0: Link is Down
[ 531.961411] wlp1s0: authenticate with 94:64:24:4d:d7:f2 (local address=c8:f7:33:e2:38:12)
[ 531.961419] wlp1s0: send auth to 94:64:24:4d:d7:f2 (try 1/3)
[ 531.962495] wlp1s0: authenticated
[ 531.965291] wlp1s0: associate with 94:64:24:4d:d7:f2 (try 1/3)
[ 531.970893] wlp1s0: RX AssocResp from 94:64:24:4d:d7:f2 (capab=0x1 status=0 aid=1)
[ 531.989963] wlp1s0: associated
^ permalink raw reply
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