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 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).

So unless I am missing something if both drivers are loaded then there will be 2 hwmon devices registered with duplicate functionality?

If I have understood that correctly then the WMI interface really should be hidden (the WMI drivers' probe() can simply return -ENODEV without doing anything) when the ACPI interface is there.

We do NOT want 2 hwmon devices with duplicate functionality.

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