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
[-- Attachment #1 --]
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
[-- Attachment #2 --]
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))) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030602222009.A16160>
