Date: Fri, 27 Nov 2015 11:57:26 +0000 From: "jpa-semihalf.com (Jakub Palider)" <phabric-noreply@FreeBSD.org> To: freebsd-arm@freebsd.org Subject: [Differential] [Request, 35 lines] D4301: Disable MSI-x for AHCI on Alpine plaftrorm Message-ID: <differential-rev-PHID-DREV-boik72iv2f64smtes2dn-req@FreeBSD.org>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --] jpa-semihalf.com created this revision. jpa-semihalf.com added reviewers: imp, andrew, zbb. jpa-semihalf.com added a subscriber: freebsd-arm-list. REVISION SUMMARY Changes introduced to AHCI code adding support for MSI-x caused interrupt storm on Alpine boards. This is unintended behaviour so added quirk to omit this functionality. This is a small and non-intrusive patch so I hope no problems will arise, anyway, have a look at this, please. REVISION DETAIL https://reviews.freebsd.org/D4301 AFFECTED FILES sys/dev/ahci/ahci.h sys/dev/ahci/ahci_pci.c CHANGE DETAILS diff --git a/sys/dev/ahci/ahci_pci.c b/sys/dev/ahci/ahci_pci.c --- a/sys/dev/ahci/ahci_pci.c +++ b/sys/dev/ahci/ahci_pci.c @@ -293,7 +293,7 @@ {0x11851039, 0x00, "SiS 968", 0}, {0x01861039, 0x00, "SiS 968", 0}, {0xa01c177d, 0x00, "ThunderX", AHCI_Q_ABAR0|AHCI_Q_1MSI}, - {0x00311c36, 0x00, "Annapurna", AHCI_Q_FORCE_PI|AHCI_Q_RESTORE_CAP}, + {0x00311c36, 0x00, "Annapurna", AHCI_Q_FORCE_PI|AHCI_Q_RESTORE_CAP|AHCI_Q_NOMSIX}, {0x00000000, 0x00, NULL, 0} }; @@ -437,6 +437,9 @@ &ctlr->r_rid, RF_ACTIVE))) return ENXIO; + if (ctlr->quirks & AHCI_Q_NOMSIX) + msix_count = 0; + /* Read MSI-x BAR IDs if supported */ if (msix_count > 0) { error = ahci_pci_read_msix_bars(dev, &table_bar, &pba_bar); diff --git a/sys/dev/ahci/ahci.h b/sys/dev/ahci/ahci.h --- a/sys/dev/ahci/ahci.h +++ b/sys/dev/ahci/ahci.h @@ -576,13 +576,14 @@ #define AHCI_Q_NOCOUNT 0x00000400 #define AHCI_Q_ALTSIG 0x00000800 #define AHCI_Q_NOMSI 0x00001000 -#define AHCI_Q_ATI_PMP_BUG 0x00002000 -#define AHCI_Q_MAXIO_64K 0x00004000 -#define AHCI_Q_SATA1_UNIT0 0x00008000 /* need better method for this */ -#define AHCI_Q_ABAR0 0x00010000 -#define AHCI_Q_1MSI 0x00020000 -#define AHCI_Q_FORCE_PI 0x00040000 -#define AHCI_Q_RESTORE_CAP 0x00080000 +#define AHCI_Q_NOMSIX 0x00002000 +#define AHCI_Q_ATI_PMP_BUG 0x00004000 +#define AHCI_Q_MAXIO_64K 0x00008000 +#define AHCI_Q_SATA1_UNIT0 0x00010000 /* need better method for this */ +#define AHCI_Q_ABAR0 0x00020000 +#define AHCI_Q_1MSI 0x00040000 +#define AHCI_Q_FORCE_PI 0x00080000 +#define AHCI_Q_RESTORE_CAP 0x00100000 #define AHCI_Q_BIT_STRING \ "\020" \ @@ -599,13 +600,14 @@ "\013NOCOUNT" \ "\014ALTSIG" \ "\015NOMSI" \ - "\016ATI_PMP_BUG" \ - "\017MAXIO_64K" \ - "\020SATA1_UNIT0" \ - "\021ABAR0" \ - "\0221MSI" \ - "\023FORCE_PI" \ - "\024RESTORE_CAP" + "\016NOMSIX" \ + "\017ATI_PMP_BUG" \ + "\018MAXIO_64K" \ + "\019SATA1_UNIT0" \ + "\020ABAR0" \ + "\0211MSI" \ + "\022FORCE_PI" \ + "\023RESTORE_CAP" int ahci_attach(device_t dev); int ahci_detach(device_t dev); EMAIL PREFERENCES https://reviews.freebsd.org/settings/panel/emailpreferences/ To: jpa-semihalf.com, imp, andrew, zbb Cc: freebsd-arm-list [-- Attachment #2 --] diff --git a/sys/dev/ahci/ahci_pci.c b/sys/dev/ahci/ahci_pci.c --- a/sys/dev/ahci/ahci_pci.c +++ b/sys/dev/ahci/ahci_pci.c @@ -293,7 +293,7 @@ {0x11851039, 0x00, "SiS 968", 0}, {0x01861039, 0x00, "SiS 968", 0}, {0xa01c177d, 0x00, "ThunderX", AHCI_Q_ABAR0|AHCI_Q_1MSI}, - {0x00311c36, 0x00, "Annapurna", AHCI_Q_FORCE_PI|AHCI_Q_RESTORE_CAP}, + {0x00311c36, 0x00, "Annapurna", AHCI_Q_FORCE_PI|AHCI_Q_RESTORE_CAP|AHCI_Q_NOMSIX}, {0x00000000, 0x00, NULL, 0} }; @@ -437,6 +437,9 @@ &ctlr->r_rid, RF_ACTIVE))) return ENXIO; + if (ctlr->quirks & AHCI_Q_NOMSIX) + msix_count = 0; + /* Read MSI-x BAR IDs if supported */ if (msix_count > 0) { error = ahci_pci_read_msix_bars(dev, &table_bar, &pba_bar); diff --git a/sys/dev/ahci/ahci.h b/sys/dev/ahci/ahci.h --- a/sys/dev/ahci/ahci.h +++ b/sys/dev/ahci/ahci.h @@ -576,13 +576,14 @@ #define AHCI_Q_NOCOUNT 0x00000400 #define AHCI_Q_ALTSIG 0x00000800 #define AHCI_Q_NOMSI 0x00001000 -#define AHCI_Q_ATI_PMP_BUG 0x00002000 -#define AHCI_Q_MAXIO_64K 0x00004000 -#define AHCI_Q_SATA1_UNIT0 0x00008000 /* need better method for this */ -#define AHCI_Q_ABAR0 0x00010000 -#define AHCI_Q_1MSI 0x00020000 -#define AHCI_Q_FORCE_PI 0x00040000 -#define AHCI_Q_RESTORE_CAP 0x00080000 +#define AHCI_Q_NOMSIX 0x00002000 +#define AHCI_Q_ATI_PMP_BUG 0x00004000 +#define AHCI_Q_MAXIO_64K 0x00008000 +#define AHCI_Q_SATA1_UNIT0 0x00010000 /* need better method for this */ +#define AHCI_Q_ABAR0 0x00020000 +#define AHCI_Q_1MSI 0x00040000 +#define AHCI_Q_FORCE_PI 0x00080000 +#define AHCI_Q_RESTORE_CAP 0x00100000 #define AHCI_Q_BIT_STRING \ "\020" \ @@ -599,13 +600,14 @@ "\013NOCOUNT" \ "\014ALTSIG" \ "\015NOMSI" \ - "\016ATI_PMP_BUG" \ - "\017MAXIO_64K" \ - "\020SATA1_UNIT0" \ - "\021ABAR0" \ - "\0221MSI" \ - "\023FORCE_PI" \ - "\024RESTORE_CAP" + "\016NOMSIX" \ + "\017ATI_PMP_BUG" \ + "\018MAXIO_64K" \ + "\019SATA1_UNIT0" \ + "\020ABAR0" \ + "\0211MSI" \ + "\022FORCE_PI" \ + "\023RESTORE_CAP" int ahci_attach(device_t dev); int ahci_detach(device_t dev);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?differential-rev-PHID-DREV-boik72iv2f64smtes2dn-req>
