[PATCH 1/1] platform/x86/tuxedo: Add virtual LampArray for TUXEDO NB04 devices
Benjamin Tissoires
bentiss at kernel.org
Tue Oct 22 09:05:21 UTC 2024
Sorry I should have answered earlier...
On Oct 09 2024, Werner Sembach wrote:
> Resend because HTML mail ..., but I think I now know when Thunderbird does
> it: Every time I include a link it gets converted.
>
> Hi
>
> Am 08.10.24 um 17:21 schrieb Benjamin Tissoires:
> > On Oct 08 2024, Werner Sembach wrote:
> > > [...]
> > Yeah, it just means that you can query or send the data. You can also
> > use HIDIOCGINPUT() and HIDIOCSOUTPUT() to get a current input report and
> > set an output report through the hidraw ioctl...
> >
> > Internally, HIDIOCGINPUT() uses the same code path than
> > HIDIOCGFEATURE(), but with the report type being an Input instead of a
> > Feature. Same for HIDIOCSOUTPUT() and HIDIOCSFEATURE().
>
> Ok so just a difference in definition not in implementation.
>
> Then I use a get feature report for the device status function and use it as
> input and output at the same time, and use a set output report for the led
> update function (which technically has a return value but i think it's
> always 0 anyway).
not quite. You can not use a get feature to set something on the device.
The semantic is:
Set -> "write" something on the device (from host to device)
Get -> "read" something from the device (from device to host)
Features can be set/get.
Input can only be get.
Output can only be set.
The implementation in the kernel should enforce that.
>
> I scoured the old thread about exposing WMI calls to userspace, because I
> remembered that something here came up already.
>
> 1. https://lore.kernel.org/all/6b32fb73-0544-4a68-95ba-e82406a4b188@gmx.de/
> -> Should be no problem? Because this is not generally exposing wmi calls,
> just mapping two explicitly with sanitized input (whitelisting basically).
>
> 2.
> https://lore.kernel.org/all/b6d79727-ae94-44b1-aa88-069416435c14@redhat.com/
> -> Do this concerns this apply here? The actual API to be used is LampArray
> and the HID mapped WMI calls are just an "internal" interface for the BPF
> driver, but technically UAPI.
>
> Also at Armin and Hans: Do you have comments on this approach?
>
> > > (well as far as I can tell the hut doesn't actual specify, if they need to
> > > be feature reports, or am I missing something?)
> > They can be both actually. The HUT is missing what's expected here :(.
> >
> > However, looking at the HUT RR 84:
> > https://www.usb.org/sites/default/files/hutrr84_-_lighting_and_illumination_page.pdf
> >
> > There is an example of a report descriptor, and they are using Features.
> > Not Input+Output.
> >
> > And looking even further (above), in 3.5 Usage Definitions:
> > 3.5.2, 3.5.3 and 3.5.5 all of them are meant to be a feature, like:
> > LampArrayAttributesReport CL – Feature -
> > LampAttributesRequestReport CL – Feature –
> > LampAttributesResponseReport CL – Feature –
> > LampArrayControlReport CL – Feature –
> >
> > 3.5.4: can be either feature or output, like:
> > LampMultiUpdateReport CL – Feature/Output –
> > LampRangeUpdateReport CL – Feature/ Output –
> >
> > So I guess the MS implementation can handle Feature only for all but the
> > update commands.
> Thanks for the link, I guess for the BPF driver I will stick to feature
> reports for the LampArray part until there is actually a hid descriptor
> spotted in the wild defining LampMultiUpdateReport and LampRangeUpdateReport
> as Output and not feature.
> > > and there is the pair with LampAttributesRequestReport and
> > > LampAttributesResponseReport.
> > Yeah, not a big deal. The bold IN and OUT are just to say that calling a
> > setReport on a LampAttributesResponseReport is just ignored AFAIU.
> >
> > > Sorry for my confusion over the hid spec.
> > No worries. It is definitely confusing :)
>
> On this note as I fathom:
>
> Input Report (usually always get report): Interrupts (the ioctl just there
> to repeat the last one?)
yeah, but from hidraw the kernel calls the device directly to query the
report, so some device don't like that and just hang.
Rule of thumbs: never use get_report on an input report, unless the
specification explicitely says that the device is supposed to support
it for the given usage.
>
> Output Report (usually always set report): Async write, no return value
> (Buffer should stay untouched)
yep
>
> Feature report set: Sync write, no return value (Buffer should stay untouched)
yep
>
> Feature report get: Sync read/write (intended only for read, but not limited
> to it, uses singular buffer for both input and output)
sync read only, no write. The existing values in the incoming buffer are
just overwritten.
>
> I kind of don't get why feature report set exists, but well it's the specs ^^.
if "feature report set" doesn't exist, you can not write a vlaue to a
feature on a device (because get doesn't allow you to write).
Anyway, it's a USB implementation detail: input/output are using URB, so
direct USB read/write, when Features are using the control endpoint,
which allows for a slightly different approach.
And this transfered as output being async, when features are
synchronous.
Cheers,
Benjamin
More information about the dri-devel
mailing list