Hi, On 7/15/22 17:32, Daniel Dadap wrote: > > >> On Jul 15, 2022, at 06:59, Hans de Goede <hdego...@redhat.com> wrote: >> >> 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... >> > > Yes, thank you. I don’t have to work with Kconfig much, but that reasoning > lined up with my best guess. Sorry for not looking at the other patches in > the series, or at Nouveau’s Kconfig more closely. > > I will work on and test the three patches we discussed above. Would you > prefer if I sent them and set In-reply-to a message in this thread, or as a > separate message with no In-reply-to?
I have no real preference. Whatever is easiest for you. 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) >>> >>