All of lore.kernel.org
 help / color / mirror / Atom feed
From: Teodora <teolyub@gmail.com>
To: platform-driver-x86@vger.kernel.org
Subject: Re: OptiPlex 7400 AIO HDMI-IN button requires WMI startup method
Date: Sat, 24 Oct 2026 14:51:00 +0100	[thread overview]
Message-ID: <0TZENT.54P2IBFQRED22@gmail.com> (raw)
In-Reply-To: <OOZENT.01UBB4ITK3LK2@gmail.com>


Hi,

I have a Dell OptiPlex 7400 All-in-One machine and have been 
investigating why its physical HDMI-In/source button works under 
Windows but not under Linux. I wanted to flag a potential solution, 
though I am not a kernel developer but was hoping that perhaps this 
could help the community.

So, my system details are:

- Dell OptiPlex 7400 All-in-One
- Fedora 44
- Kernel: 7.2.11-200.fc44.x86_64
- dell-wmi-aio is present and loaded

While investigating the Dell Windows OSD software, I found that the 
button generates a WMI event through Acpi_OSD_event, GUID: 
02314822-307C-4F66-BF0E-48AEAEB26CC8. The GDat payload generated when 
pressing the source button begins 02 00 00 00 F2 DD which corresponds 
to event/scancode 0xDDF2.

More importantly, Dell's OSD service invokes another WMI method during 
startup:

    Class: AcpiOSD_WMBC_method
    GUID: 2D703EE8-36AC-4F88-BDB5-7556CE6B2946

    Method: PegaOemNotificationStartUp
    WmiMethodId: 1
    Description: "Invoked by AP when system up."

Linux exposes this WMI interface on the machine, with instance_count = 
1. I wrote a minimal test WMI driver which binds only to this GUID and 
invokes: wmidev_invoke_procedure(wdev, 0, 1, &input); using an empty 
input buffer.

The result is reproducible: After a normal Linux boot, the HDMI/source 
button does not switch the display. Then loading the test driver 
invokes WMI method 1 and the firmware reports success. Immediately 
after, the physical source button works correctly and switches the 
panel to HDMI-In. The test module can then be unloaded and the physical 
button continues to work.

After rebooting, the problem returns until method 1 is invoked again. 
This suggests that PegaOemNotificationStartUp is a one-shot firmware 
initialization which Dell's Windows software performs at startup but 
Linux currently does not.

Below I am sharing the small module I use as a workaround; this is 
loaded once on boot.

// SPDX-License-Identifier: GPL-2.0

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/wmi.h>

#define DELL_OSD_WMI_GUID "2D703EE8-36AC-4F88-BDB5-7556CE6B2946"
#define DELL_OSD_STARTUP_METHOD 1

static int dell_osd_probe(struct wmi_device *wdev, const void *context)
{
 struct wmi_buffer input = {
  .length = 0,
  .data = NULL,
 };

 u8 instances;
 int ret;

 (void)context;

 instances = wmidev_instance_count(wdev);

 dev_info(&wdev->dev,
   "Dell OSD test: WMI device found, instance count = %u\n",
   instances);

 if (instances < 1) {
  dev_err(&wdev->dev,
   "Dell OSD test: no WMI instance 0 available\n");
  return -ENODEV;
 }

 dev_info(&wdev->dev,
   "Dell OSD test: calling PegaOemNotificationStartUp, method ID 1\n");

 ret = wmidev_invoke_procedure(
  wdev,
  0,
  DELL_OSD_STARTUP_METHOD,
  &input
 );

 if (ret < 0) {
  dev_err(&wdev->dev,
   "Dell OSD test: startup method failed: %d\n",
   ret);
  return ret;
 }

 dev_info(&wdev->dev,
   "Dell OSD test: startup method returned success\n");

 return 0;
}

static const struct wmi_device_id dell_osd_id_table[] = {
 {
  .guid_string = DELL_OSD_WMI_GUID,
 },
 { }
};

MODULE_DEVICE_TABLE(wmi, dell_osd_id_table);

static struct wmi_driver dell_osd_driver = {
 .driver = {
  .name = "dell-osd-wmi-test",
 },
 .id_table = dell_osd_id_table,
 .probe = dell_osd_probe,
 .no_singleton = true,
};

module_wmi_driver(dell_osd_driver);

MODULE_AUTHOR("Dell OptiPlex 7400 AIO experimental test");
MODULE_DESCRIPTION("Experimental Dell OSD WMI startup-method test");
MODULE_LICENSE("GPL");

I hope this would be useful as not having this function has been such a 
bugbear for me over the years, especially on a business machine.

Thanks,
Teodora



       reply	other threads:[~2026-10-24 13:51 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <OOZENT.01UBB4ITK3LK2@gmail.com>
2026-10-24 13:51 ` Teodora [this message]
2026-10-24 18:52 ` OptiPlex 7400 AIO HDMI-IN button requires WMI startup method Armin Wolf
2026-10-24 19:09   ` Teodora
2026-10-24 19:14     ` Armin Wolf
2026-10-27 17:12       ` Armin Wolf
2026-10-27 18:04         ` Armin Wolf
2026-10-27 20:57           ` teolyub

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0TZENT.54P2IBFQRED22@gmail.com \
    --to=teolyub@gmail.com \
    --cc=platform-driver-x86@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.