Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 2 Jun 2003 22:20:09 +0000
From:      Nicolas Souchu <nsouch@free.fr>
To:        Dag-Erling Smorgrav <des@ofug.org>
Cc:        current@freebsd.org
Subject:   Re: viapropm doesnt like sys/dev/pci.c rev 1.214
Message-ID:  <20030602222009.A16160@armor.free.fr>
In-Reply-To: <xzpof1i65d2.fsf@flood.ping.uio.no>; from des@ofug.org on Sun, Jun 01, 2003 at 01:52:57AM %2B0200
References:  <20030531210600.GA670@tombstone.localnet.gomerbud.com> <xzpof1i65d2.fsf@flood.ping.uio.no>

next in thread | previous in thread | raw e-mail | index | archive | help

--HcAYCG3uE/tztfnV
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Sun, Jun 01, 2003 at 01:52:57AM +0200, Dag-Erling Smorgrav wrote:
> "David P. Reese Jr." <daver@gomerbud.com> writes:
> > In rev 1.214 of sys/dev/pci/pci.c, we have started checking if a
> > pci_set_command_bit() was successful with a subsequent PCI_READ_CONFIG
> > and comparing the results.  For some odd reason, this doesnt work when
> > my viapropm tries to attach.
> 
> viapropm is seriously broken for other reasons and needs professional
> help.

What kind of breakage? Setting resources in probe? Right. Anybody having
the viapm driver loaded usually should please try the attached patch.

> >         pci_set_command_bit(dev, child, bit);
> >         command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2);
> >         if (command & bit)
> >                 return (0);
> 
> It should allow the register to "settle" between write and read, which
> may take some time (see chipset docs for timing details).  DELAY(1000)
> should be OK in an attach function.

The datasheet states that the command bits are RW but "fixed at 0".

Nicholas

-- 
Nicholas Souchu - nsouch@free.fr - nsouch@FreeBSD.org

--HcAYCG3uE/tztfnV
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="viapm.diffs"

Index: viapm.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/viapm.c,v
retrieving revision 1.2
diff -u -r1.2 viapm.c
--- viapm.c	9 Nov 2002 20:13:16 -0000	1.2
+++ viapm.c	25 May 2003 22:00:03 -0000
@@ -79,7 +79,6 @@
 #define VIAPM_TYP_8233		5
 
 struct viapm_softc {
-	int type;
 	u_int32_t base;
         bus_space_tag_t st;
         bus_space_handle_t sh;
@@ -179,137 +178,42 @@
 static int
 viapm_586b_probe(device_t dev)
 {
-	struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev);
-	u_int32_t l;
-	u_int16_t s;
-	u_int8_t c;
+	if (pci_get_devid(dev) != VIA_586B_PMU_ID)
+		return ENXIO;
 
-	switch (pci_get_devid(dev)) {
-	case VIA_586B_PMU_ID:
-
-		bzero(viapm, sizeof(struct viapm_softc));
-
-		l = pci_read_config(dev, VIAPM_586B_REVID, 1);
-		switch (l) {
-		case VIAPM_586B_OEM_REV_E:
-			viapm->type = VIAPM_TYP_586B_3040E;
-			viapm->iorid = VIAPM_586B_3040E_BASE;
-
-			/* Activate IO block access */
-			s = pci_read_config(dev, VIAPM_586B_3040E_ACTIV, 2);
-			pci_write_config(dev, VIAPM_586B_3040E_ACTIV, s | 0x1, 2);
-			break;
-
-		case VIAPM_586B_OEM_REV_F:
-		case VIAPM_586B_PROD_REV_A:
-		default:
-			viapm->type = VIAPM_TYP_586B_3040F;
-			viapm->iorid = VIAPM_586B_3040F_BASE;
-
-			/* Activate IO block access */
-			c = pci_read_config(dev, VIAPM_586B_3040F_ACTIV, 1);
-			pci_write_config(dev, VIAPM_586B_3040F_ACTIV, c | 0x80, 1);
-			break;
-		}
-
-		viapm->base = pci_read_config(dev, viapm->iorid, 4) &
-				VIAPM_586B_BA_MASK;
-
-		/*
-		 * We have to set the I/O resources by hand because it is
-		 * described outside the viapmope of the traditional maps
-		 */
-		if (bus_set_resource(dev, SYS_RES_IOPORT, viapm->iorid,
-							viapm->base, 256)) {
-			device_printf(dev, "could not set bus resource\n");
-			return ENXIO;
-		}
-		device_set_desc(dev, "VIA VT82C586B Power Management Unit");
-		return 0;
-
-	default:
-		break;
-	}
-
-	return ENXIO;
+	device_set_desc(dev, "VIA VT82C586B Power Management Unit");
+	return 0;
 }
 
-
 static int
 viapm_pro_probe(device_t dev)
 {
-	struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev);
-#ifdef VIAPM_BASE_ADDR
-	u_int32_t l;
-#endif
-	u_int32_t base_cfgreg;
 	char *desc;
 
 	switch (pci_get_devid(dev)) {
 	case VIA_596A_PMU_ID:
 		desc = "VIA VT82C596A Power Management Unit";
-		viapm->type = VIAPM_TYP_596B;
-		base_cfgreg = VIAPM_PRO_BASE;
-		goto viapro;
+		break;
 
 	case VIA_596B_PMU_ID:
 		desc = "VIA VT82C596B Power Management Unit";
-		viapm->type = VIAPM_TYP_596B;
-		base_cfgreg = VIAPM_PRO_BASE;
-		goto viapro;
+		break;
 
 	case VIA_686A_PMU_ID:
 		desc = "VIA VT82C686A Power Management Unit";
-		viapm->type = VIAPM_TYP_686A;
-		base_cfgreg = VIAPM_PRO_BASE;
-		goto viapro;
+		break;
 
 	case VIA_8233_PMU_ID:
 		desc = "VIA VT8233 Power Management Unit";
-		viapm->type = VIAPM_TYP_UNKNOWN;
-		base_cfgreg = VIAPM_8233_BASE;
-		goto viapro;
-
-	viapro:
-
-#ifdef VIAPM_BASE_ADDR
-		/* force VIAPM I/O base address */
-
-		/* enable the SMBus controller function */
-		l = pci_read_config(dev, VIAPM_PRO_SMBCTRL, 1);
-		pci_write_config(dev, VIAPM_PRO_SMBCTRL, l | 1, 1);
-
-		/* write the base address */
-		pci_write_config(dev, base_cfgreg,
-				 VIAPM_BASE_ADDR & VIAPM_PRO_BA_MASK, 4);
-#endif
-
-		viapm->base = pci_read_config(dev, base_cfgreg, 4) & VIAPM_PRO_BA_MASK;
-
-		/*
-		 * We have to set the I/O resources by hand because it is
-		 * described outside the viapmope of the traditional maps
-		 */
-		viapm->iorid = base_cfgreg;
-		if (bus_set_resource(dev, SYS_RES_IOPORT, viapm->iorid,
-				     viapm->base, 16)) {
-			device_printf(dev, "could not set bus resource 0x%x\n",
-					viapm->base);
-			return ENXIO;
-		}
-
-		if (1 || bootverbose) {
-			device_printf(dev, "SMBus I/O base at 0x%x\n", viapm->base);
-		}
-
-		device_set_desc(dev, desc);
-		return 0;
+		break;
 
 	default:
-		break;
+		return ENXIO;
+		/* not reached */
 	}
 
-	return ENXIO;
+	device_set_desc(dev, desc);
+	return 0;
 }
 
 static int
@@ -317,6 +221,39 @@
 {
 	struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev);
 	u_int32_t l;
+	u_int32_t base_cfgreg;
+
+	bzero(viapm, sizeof(struct viapm_softc));
+
+	if (pci_get_devid(dev) == VIA_8233_PMU_ID)
+		base_cfgreg = VIAPM_8233_BASE;
+	else
+		base_cfgreg = VIAPM_PRO_BASE;
+
+#ifdef VIAPM_BASE_ADDR
+	/* force VIAPM I/O base address */
+
+	/* enable the SMBus controller function */
+	l = pci_read_config(dev, VIAPM_PRO_SMBCTRL, 1);
+	pci_write_config(dev, VIAPM_PRO_SMBCTRL, l | 1, 1);
+
+	/* write the base address */
+	pci_write_config(dev, base_cfgreg,
+			 VIAPM_BASE_ADDR & VIAPM_PRO_BA_MASK, 4);
+#endif
+
+	viapm->base = pci_read_config(dev, base_cfgreg, 4) & VIAPM_PRO_BA_MASK;
+
+	/*
+	 * We have to set the I/O resources by hand because it is
+	 * described outside the viapmope of the traditional maps
+	 */
+	viapm->iorid = base_cfgreg;
+	bus_set_resource(dev, SYS_RES_IOPORT, viapm->iorid, viapm->base, 16);
+
+	if (1 || bootverbose) {
+		device_printf(dev, "SMBus I/O base at 0x%x\n", viapm->base);
+	}
 
 	if (!(viapm->iores = bus_alloc_resource(dev, SYS_RES_IOPORT,
 		&viapm->iorid, 0l, ~0l, 1, RF_ACTIVE))) {
@@ -385,6 +322,40 @@
 viapm_586b_attach(device_t dev)
 {
 	struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev);
+	u_int32_t l;
+	u_int16_t s;
+	u_int8_t c;
+
+	bzero(viapm, sizeof(struct viapm_softc));
+
+	l = pci_read_config(dev, VIAPM_586B_REVID, 1);
+	switch (l) {
+	case VIAPM_586B_OEM_REV_E:
+	  viapm->iorid = VIAPM_586B_3040E_BASE;
+
+	  /* Activate IO block access */
+	  s = pci_read_config(dev, VIAPM_586B_3040E_ACTIV, 2);
+	  pci_write_config(dev, VIAPM_586B_3040E_ACTIV, s | 0x1, 2);
+	  break;
+
+	case VIAPM_586B_OEM_REV_F:
+	case VIAPM_586B_PROD_REV_A:
+	default:
+	  viapm->iorid = VIAPM_586B_3040F_BASE;
+
+	  /* Activate IO block access */
+	  c = pci_read_config(dev, VIAPM_586B_3040F_ACTIV, 1);
+	  pci_write_config(dev, VIAPM_586B_3040F_ACTIV, c | 0x80, 1);
+	  break;
+	}
+
+	viapm->base = pci_read_config(dev, viapm->iorid, 4) & VIAPM_586B_BA_MASK;
+
+	/*
+	 * We have to set the I/O resources by hand because it is
+	 * described outside the viapmope of the traditional maps
+	 */
+	bus_set_resource(dev, SYS_RES_IOPORT, viapm->iorid, viapm->base, 256);
 	
 	if (!(viapm->iores = bus_alloc_resource(dev, SYS_RES_IOPORT,
 		&viapm->iorid, 0ul, ~0ul, 1, RF_ACTIVE | RF_SHAREABLE))) {

--HcAYCG3uE/tztfnV--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030602222009.A16160>