Hi Daniel, On 7/12/22 22:13, Daniel Dadap wrote: > Thanks, Hans: > > On 7/12/22 14:38, Hans de Goede wrote: >> On some new laptop designs a new Nvidia specific WMI interface is present >> which gives info about panel brightness control and may allow controlling >> the brightness through this interface when the embedded controller is used >> for brightness control. >> >> When this WMI interface is present and indicates that the EC is used, >> then this interface should be used for brightness control. >> >> Signed-off-by: Hans de Goede <hdego...@redhat.com> >> --- >> drivers/acpi/Kconfig | 1 + >> drivers/acpi/video_detect.c | 35 ++++++++++++++++++++++++++++++++++ >> drivers/gpu/drm/gma500/Kconfig | 2 ++ >> drivers/gpu/drm/i915/Kconfig | 2 ++ >> include/acpi/video.h | 1 + >> 5 files changed, 41 insertions(+) >> >> diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig >> index 1e34f846508f..c372385cfc3f 100644 >> --- a/drivers/acpi/Kconfig >> +++ b/drivers/acpi/Kconfig >> @@ -212,6 +212,7 @@ config ACPI_VIDEO >> tristate "Video" >> depends on X86 && BACKLIGHT_CLASS_DEVICE >> depends on INPUT >> + depends on ACPI_WMI >> select THERMAL >> help >> This driver implements the ACPI Extensions For Display Adapters >> diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c >> index 8c2863403040..7b89dc9a04a2 100644 >> --- a/drivers/acpi/video_detect.c >> +++ b/drivers/acpi/video_detect.c >> @@ -75,6 +75,35 @@ find_video(acpi_handle handle, u32 lvl, void *context, >> void **rv) >> return AE_OK; >> } >> +#define WMI_BRIGHTNESS_METHOD_SOURCE 2 >> +#define WMI_BRIGHTNESS_MODE_GET 0 >> +#define WMI_BRIGHTNESS_SOURCE_EC 2 >> + >> +struct wmi_brightness_args { >> + u32 mode; >> + u32 val; >> + u32 ret; >> + u32 ignored[3]; >> +}; >> + >> +static bool nvidia_wmi_ec_supported(void) >> +{ >> + struct wmi_brightness_args args = { >> + .mode = WMI_BRIGHTNESS_MODE_GET, >> + .val = 0, >> + .ret = 0, >> + }; >> + struct acpi_buffer buf = { (acpi_size)sizeof(args), &args }; >> + acpi_status status; >> + >> + status = wmi_evaluate_method("603E9613-EF25-4338-A3D0-C46177516DB7", 0, >> + WMI_BRIGHTNESS_METHOD_SOURCE, &buf, &buf); >> + if (ACPI_FAILURE(status)) >> + return false; >> + >> + return args.ret == WMI_BRIGHTNESS_SOURCE_EC; >> +} >> + > > > The code duplication here with nvidia-wmi-ec-backlight.c is a little > unfortunate. Can we move the constants, struct definition, and WMI GUID from > that file to a header file that's used both by the EC backlight driver and > the ACPI video driver?
Yes that is a good idea. I suggest using include/linux/platform_data/x86/nvidia-wmi-ec-backlight.h to move the shared definitions there. If you can submit 2 patches on top of this series: 1. Moving the definitions from drivers/platform/x86/nvidia-wmi-ec-backlight.c to include/linux/platform_data/x86/nvidia-wmi-ec-backlight.h 2. Switching the code from this patch over to using the new nvidia-wmi-ec-backlight.h Then for the next version I'll add patch 1. to the series and squash patch 2. into this one. > I was thinking it might be nice to add a wrapper around > wmi_brightness_notify() in nvidia-wmi-ec-backlight.c that does this source == > WMI_BRIGHTNESS_SOURCE_EC test, and then export it so that it can be called > both here and in the EC backlight driver's probe routine, but then I guess > that would make video.ko depend on nvidia-wmi-ec-backlight.ko, which seems > wrong. It also seems wrong to implement the WMI plumbing in the ACPI video > driver, and export it so that the EC backlight driver can use it, so I guess > I can live with the duplication of the relatively simple WMI stuff here, it > would just be nice to not have to define all of the API constants, structure, > and GUID twice. Agreed. > > >> /* Force to use vendor driver when the ACPI device is known to be >> * buggy */ >> static int video_detect_force_vendor(const struct dmi_system_id *d) >> @@ -518,6 +547,7 @@ static const struct dmi_system_id >> video_detect_dmi_table[] = { >> static enum acpi_backlight_type __acpi_video_get_backlight_type(bool >> native) >> { >> static DEFINE_MUTEX(init_mutex); >> + static bool nvidia_wmi_ec_present; >> static bool native_available; >> static bool init_done; >> static long video_caps; >> @@ -530,6 +560,7 @@ static enum acpi_backlight_type >> __acpi_video_get_backlight_type(bool native) >> acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, >> ACPI_UINT32_MAX, find_video, NULL, >> &video_caps, NULL); >> + nvidia_wmi_ec_present = nvidia_wmi_ec_supported(); >> init_done = true; >> } >> if (native) >> @@ -547,6 +578,10 @@ static enum acpi_backlight_type >> __acpi_video_get_backlight_type(bool native) >> if (acpi_backlight_dmi != acpi_backlight_undef) >> return acpi_backlight_dmi; >> + /* Special cases such as nvidia_wmi_ec and apple gmux. */ >> + if (nvidia_wmi_ec_present) >> + return acpi_backlight_nvidia_wmi_ec; > > > Should there also be a change to the EC backlight driver to call > acpi_video_get_backlight_type() and make sure we get > acpi_backlight_nvidia_wmi_ec? I don't see such a change in this patch series; > I could implement it (and test it) against your patch if there's some reason > you didn't do so with the current patchset. I was thinking about this myself too and I decided it was not necessary since acpi_video_get_backlight_type() will always return acpi_backlight_nvidia_wmi_ec. But thinking more about this, that is not true, a user might try to force using a different backlight firmware interface by e.g. adding: acpi_backlight=video on the kernel commandline. So yes a patch adding something like this: if (acpi_video_get_backlight_type() != acpi_backlight_nvidia_wmi_ec) return -ENODEV; to the EC backlight driver would be very welcome. > > >> + >> /* On systems with ACPI video use either native or ACPI video. */ >> if (video_caps & ACPI_VIDEO_BACKLIGHT) { >> /* >> diff --git a/drivers/gpu/drm/gma500/Kconfig b/drivers/gpu/drm/gma500/Kconfig >> index 0cff20265f97..807b989e3c77 100644 >> --- a/drivers/gpu/drm/gma500/Kconfig >> +++ b/drivers/gpu/drm/gma500/Kconfig >> @@ -7,6 +7,8 @@ config DRM_GMA500 >> select ACPI_VIDEO if ACPI >> select BACKLIGHT_CLASS_DEVICE if ACPI >> select INPUT if ACPI >> + select X86_PLATFORM_DEVICES if ACPI >> + select ACPI_WMI if ACPI > > > I'm not sure I understand why the Intel DRM drivers pick up the additional > platform/x86 and WMI dependencies here. ACPI_VIDEO already depends on these, > doesn't it? It does. > If Kconfig doesn't otherwise automatically pull in an option's dependencies > when selecting that option Right that is the reason why this is done, for select the Kconfig block must also select all deps > then shouldn't Nouveau's Kconfig get updated as well? > It selects ACPI_VIDEO in some configuration cases. nouveau's Kconfig block already selects ACPI_WMI: config DRM_NOUVEAU tristate "Nouveau (NVIDIA) cards" ... select X86_PLATFORM_DEVICES if ACPI && X86 select ACPI_WMI if ACPI && X86 ... select ACPI_VIDEO if ACPI && X86 That is why this patch does not add this. > (It looks like amdgpu doesn't currently select ACPI_VIDEO, maybe because it > doesn't depend on it the way the Intel drivers do: there are several > AMD+NVIDIA iGPU/dGPU designs out there which use this backlight interface.) Correct, but with this series amdgpu/radeon also start using ACPI_VIDEO functions so these patches: https://patchwork.freedesktop.org/patch/493650/ https://patchwork.freedesktop.org/patch/493653/ Add the necessary selects and I cheated a bit and also made them select ACPI_WMI already even though that is only necessary after this patch (which comes later in the series). I hope this answers al your questions... Regards, Hans > > >> help >> Say yes for an experimental 2D KMS framebuffer driver for the >> Intel GMA500 (Poulsbo), Intel GMA600 (Moorestown/Oak Trail) and >> diff --git a/drivers/gpu/drm/i915/Kconfig b/drivers/gpu/drm/i915/Kconfig >> index 7ae3b7d67fcf..3efce05d7b57 100644 >> --- a/drivers/gpu/drm/i915/Kconfig >> +++ b/drivers/gpu/drm/i915/Kconfig >> @@ -23,6 +23,8 @@ config DRM_I915 >> # but for select to work, need to select ACPI_VIDEO's dependencies, ick >> select BACKLIGHT_CLASS_DEVICE if ACPI >> select INPUT if ACPI >> + select X86_PLATFORM_DEVICES if ACPI >> + select ACPI_WMI if ACPI >> select ACPI_VIDEO if ACPI >> select ACPI_BUTTON if ACPI >> select SYNC_FILE >> diff --git a/include/acpi/video.h b/include/acpi/video.h >> index 0625806d3bbd..91578e77ac4e 100644 >> --- a/include/acpi/video.h >> +++ b/include/acpi/video.h >> @@ -48,6 +48,7 @@ enum acpi_backlight_type { >> acpi_backlight_video, >> acpi_backlight_vendor, >> acpi_backlight_native, >> + acpi_backlight_nvidia_wmi_ec, >> }; >> #if IS_ENABLED(CONFIG_ACPI_VIDEO) >