Patch review [was: Re: viapropm doesnt like sys/dev/pci.c rev 1.214]

From: Nicolas Souchu <nsouch_at_free.fr>
Date: Sun, 15 Jun 2003 16:22:14 +0000
On Thu, Jun 05, 2003 at 04:17:38AM -0700, Terry Lambert wrote:
> How about RF_DONTCHECK or RF_ALWAYSWORKS?  It better implies
> what's happening here, since you're going to assume success in
> the face of diagnostics to the contrary.
> 
> So instead of:
> 
> 	if (flag)
> 		return (0);
> 	command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2);
> 	if (command & bit)
> 		return (0);
> 	device_printf(child, "failed to enable %s mapping!\n", error);
> 	return (ENXIO);
> 
> You do:
> 
> 	command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2);
> 	if ((command & bit) || flag)
> 		return (0);
> 	device_printf(child, "failed to enable %s mapping!\n", error);
> 	return (ENXIO);
> 
> Yeah, I know the disctinction is subtle, but there migh be other
> PCI_READ_CONFIG() results later that people care about, besides
> just this one bit, which *do* work on some other chip with the
> same issue.

Sounds good like that? (ignore more changes in amdpm.c. Just consider
that RF_DONTCHECK was added to the resource allocation). Note that
AMD-768 PM has the same flaw as the VIA chipset.

Index: dev/cardbus/cardbus_cis.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/cardbus/cardbus_cis.c,v
retrieving revision 1.37
diff -u -r1.37 cardbus_cis.c
--- dev/cardbus/cardbus_cis.c	24 May 2003 23:23:41 -0000	1.37
+++ dev/cardbus/cardbus_cis.c	15 Jun 2003 16:05:16 -0000
_at__at_ -457,7 +457,7 _at__at_
 	 * Mark the appropriate bit in the PCI command register so that
 	 * device drivers will know which type of BARs can be used.
 	 */
-	pci_enable_io(child, type);
+	pci_enable_io(child, type, 0);
 	return (0);
 }
 
_at__at_ -624,7 +624,7 _at__at_
 	    rman_get_start(res) | ((*rid == CARDBUS_ROM_REG)?
 		CARDBUS_ROM_ENABLE : 0),
 	    4);
-	PCI_ENABLE_IO(cbdev, child, SYS_RES_MEMORY);
+	PCI_ENABLE_IO(cbdev, child, SYS_RES_MEMORY, 0);
 
 	/* Flip to the right ROM image if CIS is in ROM */
 	if (CARDBUS_CIS_SPACE(*start) == CARDBUS_CIS_ASI_ROM) {
Index: dev/hifn/hifn7751.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/hifn/hifn7751.c,v
retrieving revision 1.13
diff -u -r1.13 hifn7751.c
--- dev/hifn/hifn7751.c	11 Mar 2003 22:47:06 -0000	1.13
+++ dev/hifn/hifn7751.c	15 Jun 2003 16:03:43 -0000
_at__at_ -616,7 +616,7 _at__at_
 
 	/* reenable busmastering */
 	pci_enable_busmaster(dev);
-	pci_enable_io(dev, HIFN_RES);
+	pci_enable_io(dev, HIFN_RES, 0);
 
         /* reinitialize interface if necessary */
         if (ifp->if_flags & IFF_UP)
Index: dev/pci/pci.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/pci.c,v
retrieving revision 1.214
diff -u -r1.214 pci.c
--- dev/pci/pci.c	16 Apr 2003 03:15:08 -0000	1.214
+++ dev/pci/pci.c	15 Jun 2003 15:25:57 -0000
_at__at_ -583,7 +583,7 _at__at_
 }
 
 int
-pci_enable_io_method(device_t dev, device_t child, int space)
+pci_enable_io_method(device_t dev, device_t child, int space, u_int flags)
 {
 	u_int16_t command;
 	u_int16_t bit;
_at__at_ -607,7 +607,7 _at__at_
 	}
 	pci_set_command_bit(dev, child, bit);
 	command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2);
-	if (command & bit)
+	if ((command & bit) || (flags & RF_DONTCHECK))
 		return (0);
 	device_printf(child, "failed to enable %s mapping!\n", error);
 	return (ENXIO);
_at__at_ -1365,7 +1365,7 _at__at_
 			 * Enable the I/O mode.  We should also be allocating
 			 * resources too. XXX
 			 */
-			if (PCI_ENABLE_IO(dev, child, type))
+			if (PCI_ENABLE_IO(dev, child, type, flags))
 				return (NULL);
 			break;
 		}
Index: dev/pci/pci_if.m
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/pci_if.m,v
retrieving revision 1.5
diff -u -r1.5 pci_if.m
--- dev/pci/pci_if.m	16 Apr 2003 03:15:08 -0000	1.5
+++ dev/pci/pci_if.m	15 Jun 2003 15:23:23 -0000
_at__at_ -70,6 +70,7 _at__at_
 	device_t	dev;
 	device_t	child;
 	int		space;
+	u_int		flags;
 };
 
 METHOD int disable_io {
Index: dev/pci/pci_private.h
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/pci_private.h,v
retrieving revision 1.8
diff -u -r1.8 pci_private.h
--- dev/pci/pci_private.h	16 Apr 2003 03:15:08 -0000	1.8
+++ dev/pci/pci_private.h	15 Jun 2003 15:27:55 -0000
_at__at_ -56,7 +56,8 _at__at_
 		    int reg, u_int32_t val, int width);
 int		pci_enable_busmaster_method(device_t dev, device_t child);
 int		pci_disable_busmaster_method(device_t dev, device_t child);
-int		pci_enable_io_method(device_t dev, device_t child, int space);
+int		pci_enable_io_method(device_t dev, device_t child, int space,
+		    u_int flags);
 int		pci_disable_io_method(device_t dev, device_t child, int space);
 struct resource	*pci_alloc_resource(device_t dev, device_t child, 
 		    int type, int *rid, u_long start, u_long end, u_long count,
Index: dev/pci/pcivar.h
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/pcivar.h,v
retrieving revision 1.61
diff -u -r1.61 pcivar.h
--- dev/pci/pcivar.h	16 Apr 2003 03:15:08 -0000	1.61
+++ dev/pci/pcivar.h	15 Jun 2003 15:24:02 -0000
_at__at_ -262,9 +262,9 _at__at_
 }
 
 static __inline int
-pci_enable_io(device_t dev, int space)
+pci_enable_io(device_t dev, int space, u_int flags)
 {
-    return(PCI_ENABLE_IO(device_get_parent(dev), dev, space));
+    return(PCI_ENABLE_IO(device_get_parent(dev), dev, space, flags));
 }
 
 static __inline int
Index: pci/amdpm.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/amdpm.c,v
retrieving revision 1.6
diff -u -r1.6 amdpm.c
--- pci/amdpm.c	15 Apr 2003 06:37:29 -0000	1.6
+++ pci/amdpm.c	15 Jun 2003 15:31:21 -0000
_at__at_ -66,6 +66,7 _at__at_
 
 #define AMDPM_VENDORID_AMD 0x1022
 #define AMDPM_DEVICEID_AMD756PM 0x740b
+#define AMDPM_DEVICEID_AMD768PM 0x7443
 
 /* nVidia nForce chipset */
 #define AMDPM_VENDORID_NVIDIA 0x10de
_at__at_ -141,20 +142,17 _at__at_
 static int
 amdpm_probe(device_t dev)
 {
-	u_long base;
-	
-	if ((pci_get_vendor(dev) == AMDPM_VENDORID_AMD) &&
-	    (pci_get_device(dev) == AMDPM_DEVICEID_AMD756PM)) {
-	      device_set_desc(dev, "AMD 756 Power Management Controller");
-	      
-	      /* 
-	       * We have to do this, since the BIOS won't give us the
-	       * resource info (not mine, anyway).
-	       */
-	      base = pci_read_config(dev, AMDPCI_PMBASE, 4);
-	      base &= 0xff00;
-	      bus_set_resource(dev, SYS_RES_IOPORT, AMDPCI_PMBASE, base, 256);
-	      return (0);
+	if ((pci_get_vendor(dev) == AMDPM_VENDORID_AMD)) {
+		switch (pci_get_device(dev)) {
+		case AMDPM_DEVICEID_AMD756PM:
+			device_set_desc(dev, "AMD 756 Power Management Controller");
+			return (0);
+		case AMDPM_DEVICEID_AMD768PM:
+			device_set_desc(dev, "AMD 768 Power Management Controller");
+			return (0);
+		default:
+			break;
+		}
 	}
 	return ENXIO;
 }
_at__at_ -164,6 +162,15 _at__at_
 {
 	struct amdpm_softc *amdpm_sc = device_get_softc(dev);
 	u_char val_b;
+	u_long base;
+	      
+	/* 
+	 * We have to do this, since the BIOS won't give us the
+	 * resource info (not mine, anyway).
+	 */
+	base = pci_read_config(dev, AMDPCI_PMBASE, 4);
+	base &= 0xff00;
+	bus_set_resource(dev, SYS_RES_IOPORT, AMDPCI_PMBASE, base, 256);
 	
 	/* Enable I/O block access */
 	val_b = pci_read_config(dev, AMDPCI_GEN_CONFIG_PM, 1);
_at__at_ -171,7 +178,7 _at__at_
 
 	/* Allocate I/O space */
 	amdpm_sc->rid = AMDPCI_PMBASE;
-	amdpm_sc->res = bus_alloc_resource(dev, SYS_RES_IOPORT, &amdpm_sc->rid, 0, ~0, 1, RF_ACTIVE);
+	amdpm_sc->res = bus_alloc_resource(dev, SYS_RES_IOPORT, &amdpm_sc->rid, 0, ~0, 1, RF_ACTIVE | RF_DONTCHECK);
 	
 	if (amdpm_sc->res == NULL) {
 		device_printf(dev, "could not map i/o space\n");
_at__at_ -211,22 +218,9 _at__at_
 static int
 nfpm_probe(device_t dev)
 {
-	u_long base;
-	
 	if ((pci_get_vendor(dev) == AMDPM_VENDORID_NVIDIA) &&
 	    (pci_get_device(dev) == AMDPM_DEVICEID_NF_SMB)) {
 		device_set_desc(dev, "nForce SMBus Controller");
-
-		/* 
-		* We have to do this, since the BIOS won't give us the
-		* resource info (not mine, anyway).
-		*/
-		base = pci_read_config(dev, NFPCI_PMBASE, 4);
-		base &= 0xff00;
-		bus_set_resource(dev, SYS_RES_IOPORT, NFPCI_PMBASE, base, 256);
-
-		pm_reg_offset = 0x00;
-		  
 		return (0);
 	}
 	return ENXIO;
_at__at_ -237,6 +231,17 _at__at_
 {
 	struct amdpm_softc *amdpm_sc = device_get_softc(dev);
 	u_char val_b;
+	u_long base;
+
+	/* 
+	 * We have to do this, since the BIOS won't give us the
+	 * resource info (not mine, anyway).
+	 */
+	base = pci_read_config(dev, NFPCI_PMBASE, 4);
+	base &= 0xff00;
+	bus_set_resource(dev, SYS_RES_IOPORT, NFPCI_PMBASE, base, 256);
+
+	pm_reg_offset = 0x00;
 	
 	/* Enable I/O block access */
 	val_b = pci_read_config(dev, AMDPCI_GEN_CONFIG_PM, 1);
_at__at_ -244,7 +249,7 _at__at_
 
 	/* Allocate I/O space */
 	amdpm_sc->rid = NFPCI_PMBASE;
-	amdpm_sc->res = bus_alloc_resource(dev, SYS_RES_IOPORT, &amdpm_sc->rid, 0, ~0, 1, RF_ACTIVE);
+	amdpm_sc->res = bus_alloc_resource(dev, SYS_RES_IOPORT, &amdpm_sc->rid, 0, ~0, 1, RF_ACTIVE | RF_DONTCHECK);
 	
 	if (amdpm_sc->res == NULL) {
 		device_printf(dev, "could not map i/o space\n");
Index: pci/if_dc.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_dc.c,v
retrieving revision 1.108
diff -u -r1.108 if_dc.c
--- pci/if_dc.c	15 May 2003 16:53:29 -0000	1.108
+++ pci/if_dc.c	15 Jun 2003 16:04:06 -0000
_at__at_ -3760,7 +3760,7 _at__at_
 
 	/* reenable busmastering */
 	pci_enable_busmaster(dev);
-	pci_enable_io(dev, DC_RES);
+	pci_enable_io(dev, DC_RES, 0);
 
 	/* reinitialize interface if necessary */
 	if (ifp->if_flags & IFF_UP)
Index: pci/if_rl.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_rl.c,v
retrieving revision 1.98
diff -u -r1.98 if_rl.c
--- pci/if_rl.c	21 Apr 2003 18:34:04 -0000	1.98
+++ pci/if_rl.c	15 Jun 2003 16:04:21 -0000
_at__at_ -1894,7 +1894,7 _at__at_
 
 	/* reenable busmastering */
 	pci_enable_busmaster(dev);
-	pci_enable_io(dev, RL_RES);
+	pci_enable_io(dev, RL_RES, 0);
 
 	/* reinitialize interface if necessary */
 	if (ifp->if_flags & IFF_UP)
Index: sys/rman.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/rman.h,v
retrieving revision 1.19
diff -u -r1.19 rman.h
--- sys/rman.h	12 Feb 2003 07:00:59 -0000	1.19
+++ sys/rman.h	15 Jun 2003 15:21:02 -0000
_at__at_ -43,6 +43,7 _at__at_
 #define	RF_WANTED	0x0010	/* somebody is waiting for this resource */
 #define	RF_FIRSTSHARE	0x0020	/* first in sharing list */
 #define	RF_PREFETCHABLE	0x0040	/* resource is prefetchable */
+#define	RF_DONTCHECK	0x0080	/* don't perform extra checks on the resource */
 
 #define	RF_ALIGNMENT_SHIFT	10 /* alignment size bit starts bit 10 */
 #define	RF_ALIGNMENT_MASK	(0x003F << RF_ALIGNMENT_SHIFT)

-- 
Nicholas Souchu - nsouch_at_free.fr - nsouch_at_FreeBSD.org
Received on Sun Jun 15 2003 - 05:07:50 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:12 UTC