Re: Why is wmi_bus_type not exported?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On 18-Nov-24 8:57 PM, Armin Wolf wrote:
> Am 18.11.24 um 20:32 schrieb Werner Sembach:
> 
>>
>> Am 18.11.24 um 19:25 schrieb Armin Wolf:
>>> Am 18.11.24 um 14:11 schrieb Werner Sembach:
>>>
>>>>
>>>> Am 18.11.24 um 12:20 schrieb Hans de Goede:
>>>>> Hi,
>>>>>
>>>>> On 18-Nov-24 12:16 PM, Werner Sembach wrote:
>>>>>> Hi,
>>>>>>
>>>>>> Am 18.11.24 um 12:09 schrieb Hans de Goede:
>>>>>>> Hi,
>>>>>>>
>>>>>>> On 13-Nov-24 11:04 PM, Armin Wolf wrote:
>>>>>>>> Am 13.11.24 um 13:12 schrieb Hans de Goede:
>>>>>>>>
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> On 13-Nov-24 12:47 PM, Werner Sembach wrote:
>>>>>>>>>> Am 13.11.24 um 12:19 schrieb Hans de Goede:
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> On 13-Nov-24 12:11 PM, Werner Sembach wrote:
>>>>>>>>>>>> Am 13.11.24 um 12:05 schrieb Hans de Goede:
>>>>>>>>>>>>> Hi All,
>>>>>>>>>>>>>
>>>>>>>>>>>>> On 12-Nov-24 5:31 PM, Armin Wolf wrote:
>>>>>>>>>>>>>> Am 12.11.24 um 16:10 schrieb Werner Sembach:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Am 12.11.24 um 13:51 schrieb Armin Wolf:
>>>>>>>>>>>>>>>> Am 12.11.24 um 13:42 schrieb Werner Sembach:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Am 12.11.24 um 13:01 schrieb Armin Wolf:
>>>>>>>>>>>>>>>>>> Am 12.11.24 um 12:52 schrieb Werner Sembach:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> quick learning question: Why is wmi_bus_type not
>>>>>>>>>>>>>>>>>>> exported unlike, for
>>>>>>>>>>>>>>>>>>> example, acpi_bus_type, and platform_bus_type?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Wanted to use bus_find_device_by_name in an acpi driver
>>>>>>>>>>>>>>>>>>> that might
>>>>>>>>>>>>>>>>>>> need additional infos from a wmi interface that might
>>>>>>>>>>>>>>>>>>> or might not be
>>>>>>>>>>>>>>>>>>> present.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Kind regards,
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Werner Sembach
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> What kind of information do you have in mind?
>>>>>>>>>>>>>>>>>> wmi_bus_type is not
>>>>>>>>>>>>>>>>>> being exported for historic reasons, i can change that
>>>>>>>>>>>>>>>>>> if necessary.
>>>>>>>>>>>>>>>>> It's for the tuxedo-drivers part for the Sirius 16 Gen 1
>>>>>>>>>>>>>>>>> & 2 which has
>>>>>>>>>>>>>>>>> a slow wmi and a quick acpi interface, however the quick
>>>>>>>>>>>>>>>>> acpi
>>>>>>>>>>>>>>>>> interface can not get the max rpm of the cooling fans,
>>>>>>>>>>>>>>>>> but the wmi
>>>>>>>>>>>>>>>>> interface can.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Thing is for the acpi driver we might plan an earlier
>>>>>>>>>>>>>>>>> upstream date
>>>>>>>>>>>>>>>>> and it might get multi-odm support, while the wmi
>>>>>>>>>>>>>>>>> interface is and
>>>>>>>>>>>>>>>>> stays odm specific. So my idea was to only couple both
>>>>>>>>>>>>>>>>> drivers in a
>>>>>>>>>>>>>>>>> dynamic way using bus_find_device_by_name.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Interesting, how is the ACPI interface not ODM specific?
>>>>>>>>>>>>>>>> Can you
>>>>>>>>>>>>>>>> elaborate a bit on how the ACPI and the WMI interfaces
>>>>>>>>>>>>>>>> work?
>>>>>>>>>>>>>>> We have an ODM that was willing to include ACPI code by us
>>>>>>>>>>>>>>> in their
>>>>>>>>>>>>>>> BIOS blob and we hope that in the future we can carry that
>>>>>>>>>>>>>>> API over to
>>>>>>>>>>>>>>> other ODMs for future TUXEDO devices.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> In pseudocode that API looks like this:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> v1:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> void SMOD(bool mode): Toggle firmware controlled fans vs
>>>>>>>>>>>>>>> manually (aka
>>>>>>>>>>>>>>> via the commands below) controlled fans
>>>>>>>>>>>>>>> bool GMOD(): Get current SMOD setting
>>>>>>>>>>>>>>> int GCNT(): Get number of fans
>>>>>>>>>>>>>>> enum GTYP(int index): Returns "CPU-fan" or "GPU-fan"
>>>>>>>>>>>>>>> void SSPD(int index, int value): Set fan speed target as a
>>>>>>>>>>>>>>> fraction of
>>>>>>>>>>>>>>> max speed
>>>>>>>>>>>>>>> int GSPD(int index): Get current fan speed target as a
>>>>>>>>>>>>>>> fraction of max
>>>>>>>>>>>>>>> speed
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> v2 same as v1 but with added:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> int GRPM(int index): Get current actual fan speed in
>>>>>>>>>>>>>>> revolutions per
>>>>>>>>>>>>>>> minute
>>>>>>>>>>>>>>> int GTMP(int index): Get temperature of thing fan with
>>>>>>>>>>>>>>> respective
>>>>>>>>>>>>>>> index is pointed at (CPU or GPU die, see GTYP)
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Like I said, what is missing is a "Get Max RPM" function
>>>>>>>>>>>>>>> even in v2,
>>>>>>>>>>>>>>> which we might add a future iteration, but, well this bios
>>>>>>>>>>>>>>> is now out
>>>>>>>>>>>>>>> in the wild. However these released devices have a "get
>>>>>>>>>>>>>>> info" function
>>>>>>>>>>>>>>> in the wmi code which returns the v2 infos and the max rpm.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I want to write the code in a way that it probes the acpi
>>>>>>>>>>>>>>> interface
>>>>>>>>>>>>>>> for function existence and wherever something is missing
>>>>>>>>>>>>>>> tries to fall
>>>>>>>>>>>>>>> back to infos gathered from the wmi interface, but that
>>>>>>>>>>>>>>> one is
>>>>>>>>>>>>>>> implemented in a stand alone module (the tuxedo_nb04_*
>>>>>>>>>>>>>>> stuff in
>>>>>>>>>>>>>>> tuxedo-drivers) and I would like to keep it that way in
>>>>>>>>>>>>>>> honor of KISS.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> My plan is that the first time max rpm is pulled the acpi
>>>>>>>>>>>>>>> driver uses
>>>>>>>>>>>>>>> bus_find_device_* to get the wmi device, if present, and
>>>>>>>>>>>>>>> pulls max rpm
>>>>>>>>>>>>>>> from the driver data there and copies it over to it's own
>>>>>>>>>>>>>>> driver data.
>>>>>>>>>>>>>>> If not possible it returns a dummy value or falls back to
>>>>>>>>>>>>>>> another
>>>>>>>>>>>>>>> method. Maybe a hard coded list of max rpm values,
>>>>>>>>>>>>>>> currently only 2
>>>>>>>>>>>>>>> devices have the new interface, so it wouldn't be a long
>>>>>>>>>>>>>>> list.
>>>>>>>>>>>>>>> Directly going to the hard coded list is our current
>>>>>>>>>>>>>>> fallback plan,
>>>>>>>>>>>>>>> but it is not an elegant solution as the info is actually
>>>>>>>>>>>>>>> there, if
>>>>>>>>>>>>>>> you know what i mean?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Kind regards,
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Werner
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I see, we once had a similar case with the dell-wmi driver,
>>>>>>>>>>>>>> see commit f97e058cfe80 ("platform/x86: wmi: Don't allow
>>>>>>>>>>>>>> drivers to get each other's GUIDs"):
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>          The only driver using this was dell-wmi, and it
>>>>>>>>>>>>>> really was a hack.
>>>>>>>>>>>>>>              The driver was getting a data attribute from
>>>>>>>>>>>>>> another driver and this
>>>>>>>>>>>>>>              type of action should not be encouraged.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>              Rather drivers that need to interact with one
>>>>>>>>>>>>>> another should pass
>>>>>>>>>>>>>>              data back and forth via exported functions.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I would be quite unhappy with drivers interacting with WMI
>>>>>>>>>>>>>> devices without a proper WMI driver, but i can see your
>>>>>>>>>>>>>> point here.
>>>>>>>>>>>>> Agreed on that 1 driver should not be poking the [wmi_]dev of
>>>>>>>>>>>>> another
>>>>>>>>>>>>> driver. This usually works until it doesn't for some reason
>>>>>>>>>>>>> so it
>>>>>>>>>>>>> should just be avoided.
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Maybe we can keep the retrieval of the fanX_max values out
>>>>>>>>>>>>>> of the kernel? I propose the following:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> - have a driver for your generic ACPI interface
>>>>>>>>>>>>>> - have a driver for the WMI interface (with fanX_max hwmon
>>>>>>>>>>>>>> attributes)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The driver for the generic ACPI interface exposes the fan
>>>>>>>>>>>>>> speed controls as pwmX attributes if the interface does not
>>>>>>>>>>>>>> support
>>>>>>>>>>>>>> the "Get Max RPM" function. The userspace application in
>>>>>>>>>>>>>> this case searches for the hwmon chip exposed by the WMI
>>>>>>>>>>>>>> driver and
>>>>>>>>>>>>>> reads the fanX_max attributes there. Then the application
>>>>>>>>>>>>>> can convert the target fan speed into values for the pwmX
>>>>>>>>>>>>>> attributes
>>>>>>>>>>>>>> itself.
>>>>>>>>>>>>>> If the ACPI interface however supports the "Get Max RPM"
>>>>>>>>>>>>>> function, then it exposes fanX_max and fanX_target hwmon
>>>>>>>>>>>>>> attributes
>>>>>>>>>>>>>> themself and the userspace application uses them directly.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> This would keep the kernel drivers simple.
>>>>>>>>>>>>> That would indeed keep the kernel drivers simple, but at the
>>>>>>>>>>>>> cost of
>>>>>>>>>>>>> providing a non standard hwmon interface.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Whatever implementation is written it really MUST follow the
>>>>>>>>>>>>> standard
>>>>>>>>>>>>> hwmon API so that any hwmon tools like the lm_sensors
>>>>>>>>>>>>> fancontrol script
>>>>>>>>>>>>> will work properly.
>>>>>>>>>>>>>
>>>>>>>>>>>>> So NACK from me for exposing fanX_max on a separate hwmon
>>>>>>>>>>>>> device.
>>>>>>>> I think there is a misunderstanding here: the hwmon device
>>>>>>>> exported by the WMI interface
>>>>>>>> will also contain temperature and fan speed sensors (provided by
>>>>>>>> the WMI interface), so
>>>>>>>> this would be a standard hwmon device.
>>>>>>>>
>>>>>>>> The only difference between this hwmon device and the hwmon device
>>>>>>>> exposed by the ACPI interface
>>>>>>>> would be that:
>>>>>>>>
>>>>>>>> - the hwmon interface exposed by the ACPI interface also allows
>>>>>>>> for manual fan control
>>>>>>>> - the hwmon interface exposed by the ACPI interface does not
>>>>>>>> support the fanx_max attribute
>>>>>>>>
>>>>>>>> So i think there should be no problem with having two hwmon
>>>>>>>> devices on some models, since both are
>>>>>>>> usable independently from each other.
>>>>>>> Ah I see I thought the suggestion was to have the WMI hwmon
>>>>>>> interface only export
>>>>>>> the fanx_max attribute attribute and then require userspace to
>>>>>>> treat the 2 hwmon
>>>>>>> interfaces as one.
>>>>>>>
>>>>>>> If you duplicate all the functionality of the ACPI hwmon device on
>>>>>>> the WMI hwmon device,
>>>>>>> then the question becomes why have the ACPI hwmon interface there
>>>>>>> at all ? If it is less
>>>>>>> functional and duplicate IMHO we should just leave it out ?
>>>>>> Without knowing the details because a collegue write the wmi code:
>>>>>> The WMI fucntions are signigifanctly less performant then the acpi
>>>>>> ones where it has measurable performance impact to the whole system
>>>>>> when you continuously poll them.
>>>>>>
>>>>>> Luckily the only wmi exclusive information (max rpm) doesn't change
>>>>>> and only needs to be polled once during initialization).
>>>>> Right, but both offer the same information / functionality right
>>>>> (except for the missing max rpm).
>>>>>
>>> The ACPI interface allows for manual fan control, something the WMI
>>> interface does not support.
>> oh you got me wrong here: the wmi interface also supports fan control
>> (albeit I'm not sure if it is implemented in tuxedo-drivers)
> 
> I see, in this case hiding the WMI-based hwmon device would indeed be beneficial to avoid problems should different userspace applications
> use different hwmon devices for fan control.
> 
> Ideally this should happen inside the ACPI BIOS, but we can implement a blacklist if only a limited number of device are affected.

I don't think we need a deny-list, instead the WMI driver can just
check for presence of the new ACPI interface and if that is there
exit its probe() with -ENODEV.

This avoids the need to maintain a list.

Regards,

Hans






[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux