gigabyte-wmi: smbus over wmi?

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

 



Hi,

the new gigabyte-wmi driver only works only for a subset of current boards.

For boards with two ITE chips like the X570 AORUS ULTRA the corresponding functions on the WMBB method are just not handled:


  ...
  ElseIf (((Arg1 >= 0x0118) && (Arg1 <= 0x0121))) {}
  // GET_TEMP is 0x125.
  ElseIf ((Arg1 == 0x012C)) {}
  ...

One way to handle other gigabyte boards may be using the smbus functions that are exposed through ACPI:

$ sudo cat /sys/bus/wmi/drivers/wmi-bmof/05901221-D566-11D1-B2F0-00A0C9062910/bmof | bmf2mof

...
[WmiMethodId(98)] void SMBQuickWrite([in] uint8 bus, [in] uint8 addr, [out] GSA1_ret32 ret); [WmiMethodId(99)] void SMBQuickRead([in] uint8 bus, [in] uint8 addr, [out] GSA1_ret32 ret);
  [WmiMethodId(100)] void SMBIoBaseAddr([out] uint16 data);
[WmiMethodId(101)] void SMBSendByte([in] uint8 bus, [in] uint8 addr, [in] uint8 data, [out] GSA1_ret32 ret); [WmiMethodId(102)] void SMBReceiveByte([in] uint8 bus, [in] uint8 addr, [out] GSA1_ret32 ret); [WmiMethodId(103)] void SMBWriteByte([in] uint8 bus, [in] uint8 addr, [in] uint8 cmd, [in] uint8 data, [out] GSA1_ret32 ret); [WmiMethodId(104)] void SMBReadByte([in] uint8 bus, [in] uint8 addr, [in] uint8 cmd, [out] GSA1_ret32 ret); [WmiMethodId(105)] void SMBWriteWord([in] uint8 bus, [in] uint8 addr, [in] uint8 cmd, [in] uint16 data, [out] GSA1_ret32 ret); [WmiMethodId(106)] void SMBReadWord([in] uint8 bus, [in] uint8 addr, [in] uint8 cmd, [out] GSA1_ret32 ret); [WmiMethodId(107)] void SMBBlockWrite([in] uint8 bus, [in] uint8 addr, [in] uint8 cmd, [in] uint8 data[260], [out] GSA1_ret32 ret); [WmiMethodId(108)] void SMBBlockRead([in] uint8 bus, [in] uint8 addr, [in] uint8 cmd, [out] GSA1_Buff260 ret); [WmiMethodId(109)] void SMBBlockWriteE32B([in] uint8 bus, [in] uint8 addr, [in] uint8 cmd, [in] uint8 data[260], [out] GSA1_ret32 ret);
...

This time, those methods are wired up in WMBB:

  ElseIf (((Arg1 >= 0x62) && (Arg1 <= 0x6D))) {
    ...
    if (Arg1 == 0x67) { ... SMM2(...); }
    ...
  }

SMM2(bus, addr, ret) locks a mutex SMMB|SMME, calls SMB2(bus, addr, ret) to call the low-level, unlocked smbus_write_byte().

  // bus==0x02
  Mutex (SMMB, 0x00)
  OperationRegion (SMBI, SystemIO, 0x0B00, 0x10)

  // bus==0x03
  Mutex (SMME, 0x00)
  OperationRegion (SMG0, SystemIO, 0x0B20, 0x20)

The same pattern repeats for the other smbus methods.

It looks like this should be enough to expose the smbus as /dev/i2c-* which calls those WMI functions.

From there the it87 should be able take over the rest.

Has that been done for other drivers yet? Is that even reasonable?

Bonus:

There are also methods exposed for:

- MEM(Read|Write)(8|16|32)
- PCI(Read|Write)(8|16|32)
- PIO(Read|Write)(8|16|32)

if that's needed for the it87 driver.

regards,
  Jan







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

  Powered by Linux