hwmon: (it87) Set second Super-IO chip in configuration mode

On various Gigabyte AM4 boards (AB350, AX370), the second Super-IO chip
(IT8792E) needs to be in configuration mode before accessing the first
due to a bug in IT8792E which otherwise results in LPC bus access errors.
This needs to be done before accessing the first Super-IO chip since
the second chip may have been accessed prior to loading this driver.

The problem is also reported to affect IT8795E, which is used on X299
boards and has the same chip ID as IT8792E (0x8733). It also appears
to affect systems with IT8790E, which is used on some Z97X-Gaming boards
as well as Z87X-OC, and other more recent Gigabyte boards.

Signed-off-by: Frank Crawford <frank@crawford.emu.id.au>
Link: https://lore.kernel.org/r/20230104060926.619686-3-frank@crawford.emu.id.au
[groeck: Made description pass checkpatch]
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Frank Crawford 2023-01-04 17:09:26 +11:00 committed by Guenter Roeck
parent d47e377c7b
commit ff9dedd2da

View File

@ -3315,6 +3315,27 @@ static int it87_dmi_cb(const struct dmi_system_id *dmi_entry)
return 1;
}
/*
* On various Gigabyte AM4 boards (AB350, AX370), the second Super-IO chip
* (IT8792E) needs to be in configuration mode before accessing the first
* due to a bug in IT8792E which otherwise results in LPC bus access errors.
* This needs to be done before accessing the first Super-IO chip since
* the second chip may have been accessed prior to loading this driver.
*
* The problem is also reported to affect IT8795E, which is used on X299 boards
* and has the same chip ID as IT8792E (0x8733). It also appears to affect
* systems with IT8790E, which is used on some Z97X-Gaming boards as well as
* Z87X-OC.
* DMI entries for those systems will be added as they become available and
* as the problem is confirmed to affect those boards.
*/
static int it87_sio_force(const struct dmi_system_id *dmi_entry)
{
__superio_enter(REG_4E);
return it87_dmi_cb(dmi_entry);
};
/*
* On the Shuttle SN68PT, FAN_CTL2 is apparently not
* connected to a fan, but to something else. One user
@ -3337,7 +3358,34 @@ static struct it87_dmi_data nvidia_fn68pt = {
.driver_data = data, \
}
#define IT87_DMI_MATCH_GBT(name, cb, data) \
IT87_DMI_MATCH_VND("Gigabyte Technology Co., Ltd.", name, cb, data)
static const struct dmi_system_id it87_dmi_table[] __initconst = {
IT87_DMI_MATCH_GBT("AB350", it87_sio_force, NULL),
/* ? + IT8792E/IT8795E */
IT87_DMI_MATCH_GBT("AX370", it87_sio_force, NULL),
/* ? + IT8792E/IT8795E */
IT87_DMI_MATCH_GBT("Z97X-Gaming G1", it87_sio_force, NULL),
/* ? + IT8790E */
IT87_DMI_MATCH_GBT("TRX40 AORUS XTREME", it87_sio_force, NULL),
/* IT8688E + IT8792E/IT8795E */
IT87_DMI_MATCH_GBT("Z390 AORUS ULTRA-CF", it87_sio_force, NULL),
/* IT8688E + IT8792E/IT8795E */
IT87_DMI_MATCH_GBT("B550 AORUS PRO AC", it87_sio_force, NULL),
/* IT8688E + IT8792E/IT8795E */
IT87_DMI_MATCH_GBT("X570 AORUS MASTER", it87_sio_force, NULL),
/* IT8688E + IT8792E/IT8795E */
IT87_DMI_MATCH_GBT("X570 AORUS PRO", it87_sio_force, NULL),
/* IT8688E + IT8792E/IT8795E */
IT87_DMI_MATCH_GBT("X570 AORUS PRO WIFI", it87_sio_force, NULL),
/* IT8688E + IT8792E/IT8795E */
IT87_DMI_MATCH_GBT("X570S AERO G", it87_sio_force, NULL),
/* IT8689E + IT87952E */
IT87_DMI_MATCH_GBT("Z690 AORUS PRO DDR4", it87_sio_force, NULL),
/* IT8689E + IT87952E */
IT87_DMI_MATCH_GBT("Z690 AORUS PRO", it87_sio_force, NULL),
/* IT8689E + IT87952E */
IT87_DMI_MATCH_VND("nVIDIA", "FN68PT", it87_dmi_cb, &nvidia_fn68pt),
{ }