Revert "i82371eb: Drop support for older PIIX chips"

This reverts commit 2b9004de602f98a404b17584ab3e1451f165c1f4.

Reason for revert: QEMU emulates that chipset and with that commit a Linux guest kernel can't find IDE devices anymore.

Change-Id: Iad75af4ea9993d6a2ec5433ad30d39900dab874e
Signed-off-by: Patrick Georgi <pgeorgi@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/39238
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-by: Keith Hui <buurin@gmail.com>
diff --git a/src/southbridge/intel/i82371eb/i82371eb.c b/src/southbridge/intel/i82371eb/i82371eb.c
index 02812ce..898cdff 100644
--- a/src/southbridge/intel/i82371eb/i82371eb.c
+++ b/src/southbridge/intel/i82371eb/i82371eb.c
@@ -14,9 +14,22 @@
  * GNU General Public License for more details.
  */
 
-/* Note: This code supports the 82371AB/EB/MB. */
+/* Note: This code supports the 82371FB/SB/MX/AB/EB/MB and 82437MX. */
 
 /* Datasheets:
+ *   - Name: 82371FB (PIIX) AND 82371SB (PIIX3) PCI ISA IDE XCELERATOR
+ *   - URL: http://www.intel.com/design/intarch/datashts/290550.htm
+ *   - PDF: http://download.intel.com/design/intarch/datashts/29055002.pdf
+ *   - Date: April 1997
+ *   - Order Number: 290550-002
+ *
+ *   - Name: 82371FB (PIIX) and 82371SB (PIIX3) PCI ISA IDE Xcelerator
+ *           Specification Update
+ *   - URL: http://www.intel.com/design/chipsets/specupdt/297658.htm
+ *   - PDF: http://download.intel.com/design/chipsets/specupdt/29765801.pdf
+ *   - Date: March 1998
+ *   - Order Number: 297658-004
+ *
  *   - Name: 82371AB PCI-TO-ISA / IDE XCELERATOR (PIIX4)
  *           (applies to 82371AB/EB/MB, a.k.a. PIIX4/PIIX4E/PIIX4M)
  *   - URL: http://www.intel.com/design/intarch/datashts/290562.htm
@@ -31,8 +44,10 @@
  *   - Order Number: 297738-017
  */
 
+/* TODO: List the other datasheets. */
+
 #include <device/device.h>
 
 const struct chip_operations southbridge_intel_i82371eb_ops = {
-	CHIP_NAME("Intel 82371AB/EB/MB Southbridge")
+	CHIP_NAME("Intel 82371FB/SB/MX/AB/EB/MB Southbridge")
 };
diff --git a/src/southbridge/intel/i82371eb/ide.c b/src/southbridge/intel/i82371eb/ide.c
index 1b8136a..7a72a65 100644
--- a/src/southbridge/intel/i82371eb/ide.c
+++ b/src/southbridge/intel/i82371eb/ide.c
@@ -119,6 +119,18 @@
 }
 
 /**
+ * IDE init for the Intel 82371FB/SB IDE controller.
+ *
+ * These devices do not support UDMA/33, so don't attempt to enable it.
+ *
+ * @param dev The device to use.
+ */
+static void ide_init_i82371fb_sb(struct device *dev)
+{
+	ide_init_enable(dev);
+}
+
+/**
  * IDE init for the Intel 82371AB/EB/MB IDE controller.
  *
  * @param dev The device to use.
@@ -129,6 +141,17 @@
 	ide_init_udma33(dev);
 }
 
+/* Intel 82371FB/SB */
+static const struct device_operations ide_ops_fb_sb = {
+	.read_resources		= pci_dev_read_resources,
+	.set_resources		= pci_dev_set_resources,
+	.enable_resources	= pci_dev_enable_resources,
+	.init			= ide_init_i82371fb_sb,
+	.scan_bus		= 0,
+	.enable			= 0,
+	.ops_pci		= 0, /* No subsystem IDs on 82371XX! */
+};
+
 /* Intel 82371AB/EB/MB */
 static const struct device_operations ide_ops_ab_eb_mb = {
 	.read_resources		= pci_dev_read_resources,
@@ -140,6 +163,34 @@
 	.ops_pci		= 0, /* No subsystem IDs on 82371XX! */
 };
 
+/* Intel 82371FB (PIIX) */
+static const struct pci_driver ide_driver_fb __pci_driver = {
+	.ops	= &ide_ops_fb_sb,
+	.vendor	= PCI_VENDOR_ID_INTEL,
+	.device	= PCI_DEVICE_ID_INTEL_82371FB_IDE,
+};
+
+/* Intel 82371SB (PIIX3) */
+static const struct pci_driver ide_driver_sb __pci_driver = {
+	.ops	= &ide_ops_fb_sb,
+	.vendor	= PCI_VENDOR_ID_INTEL,
+	.device	= PCI_DEVICE_ID_INTEL_82371SB_IDE,
+};
+
+/* Intel 82371MX (MPIIX) */
+static const struct pci_driver ide_driver_mx __pci_driver = {
+	.ops	= &ide_ops_fb_sb,
+	.vendor	= PCI_VENDOR_ID_INTEL,
+	.device	= PCI_DEVICE_ID_INTEL_82371MX_ISA_IDE,
+};
+
+/* Intel 82437MX (part of the 430MX chipset) */
+static const struct pci_driver ide_driver_82437mx __pci_driver = {
+	.ops	= &ide_ops_fb_sb,
+	.vendor	= PCI_VENDOR_ID_INTEL,
+	.device	= PCI_DEVICE_ID_INTEL_82437MX_ISA_IDE,
+};
+
 /* Intel 82371AB/EB/MB */
 static const struct pci_driver ide_driver_ab_eb_mb __pci_driver = {
 	.ops	= &ide_ops_ab_eb_mb,
diff --git a/src/southbridge/intel/i82371eb/isa.c b/src/southbridge/intel/i82371eb/isa.c
index bdad959..3d1970c 100644
--- a/src/southbridge/intel/i82371eb/isa.c
+++ b/src/southbridge/intel/i82371eb/isa.c
@@ -145,3 +145,9 @@
 	.vendor	= PCI_VENDOR_ID_INTEL,
 	.device	= PCI_DEVICE_ID_INTEL_82371AB_ISA,
 };
+
+static const struct pci_driver isa_SB_driver __pci_driver = {
+	.ops	= &isa_ops,
+	.vendor	= PCI_VENDOR_ID_INTEL,
+	.device	= PCI_DEVICE_ID_INTEL_82371SB_ISA,
+};
diff --git a/src/southbridge/intel/i82371eb/usb.c b/src/southbridge/intel/i82371eb/usb.c
index 38ab167..80b19a1 100644
--- a/src/southbridge/intel/i82371eb/usb.c
+++ b/src/southbridge/intel/i82371eb/usb.c
@@ -43,6 +43,15 @@
 	.ops_pci		= 0, /* No subsystem IDs on 82371EB! */
 };
 
+/* Note: No USB on 82371FB/MX (PIIX/MPIIX) and 82437MX. */
+
+/* Intel 82371SB (PIIX3) */
+static const struct pci_driver usb_driver_sb __pci_driver = {
+	.ops	= &usb_ops,
+	.vendor	= PCI_VENDOR_ID_INTEL,
+	.device	= PCI_DEVICE_ID_INTEL_82371SB_USB,
+};
+
 /* Intel 82371AB/EB/MB (PIIX4/PIIX4E/PIIX4M) */
 /* The 440MX (82443MX) consists of 82443BX + 82371EB (uses same PCI IDs). */
 static const struct pci_driver usb_driver_ab_eb_mb __pci_driver = {