Skip site navigation (1)Skip section navigation (2)
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>