Skip to content

Commit

Permalink
i2c: piix4: Fix probing of reserved ports on AMD Family 16h Model 30h
Browse files Browse the repository at this point in the history
Prevent bus timeouts and resets on Family 16h Model 30h by not probing
reserved Ports 3 and 4.

According to the AMD BIOS and Kernel Developer's Guides (BKDG), Port 3
and Port 4 are reserved on the following devices:
 - Family 15h Model 60h-6Fh
 - Family 15h Model 70h-7Fh
 - Family 16h Model 30h-3Fh

Based on earlier work by Andrew Cooks.

Reported-by: Andrew Cooks <[email protected]>
Signed-off-by: Jean Delvare <[email protected]>
Signed-off-by: Wolfram Sang <[email protected]>
  • Loading branch information
jdelvare authored and Wolfram Sang committed Aug 29, 2019
1 parent ba91940 commit 528d53a
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions drivers/i2c/busses/i2c-piix4.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@
#define PIIX4_BLOCK_DATA 0x14

/* Multi-port constants */
#define PIIX4_MAX_ADAPTERS 4
#define PIIX4_MAX_ADAPTERS 4
#define HUDSON2_MAIN_PORTS 2 /* HUDSON2, KERNCZ reserves ports 3, 4 */

/* SB800 constants */
#define SB800_PIIX4_SMB_IDX 0xcd6
Expand Down Expand Up @@ -808,6 +809,7 @@ MODULE_DEVICE_TABLE (pci, piix4_ids);

static struct i2c_adapter *piix4_main_adapters[PIIX4_MAX_ADAPTERS];
static struct i2c_adapter *piix4_aux_adapter;
static int piix4_adapter_count;

static int piix4_add_adapter(struct pci_dev *dev, unsigned short smba,
bool sb800_main, u8 port, bool notify_imc,
Expand Down Expand Up @@ -867,7 +869,15 @@ static int piix4_add_adapters_sb800(struct pci_dev *dev, unsigned short smba,
int port;
int retval;

for (port = 0; port < PIIX4_MAX_ADAPTERS; port++) {
if (dev->device == PCI_DEVICE_ID_AMD_KERNCZ_SMBUS ||
(dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS &&
dev->revision >= 0x1F)) {
piix4_adapter_count = HUDSON2_MAIN_PORTS;
} else {
piix4_adapter_count = PIIX4_MAX_ADAPTERS;
}

for (port = 0; port < piix4_adapter_count; port++) {
retval = piix4_add_adapter(dev, smba, true, port, notify_imc,
piix4_main_port_names_sb800[port],
&piix4_main_adapters[port]);
Expand Down Expand Up @@ -989,7 +999,7 @@ static void piix4_adap_remove(struct i2c_adapter *adap)

static void piix4_remove(struct pci_dev *dev)
{
int port = PIIX4_MAX_ADAPTERS;
int port = piix4_adapter_count;

while (--port >= 0) {
if (piix4_main_adapters[port]) {
Expand Down

0 comments on commit 528d53a

Please sign in to comment.