Date: Mon, 22 Jan 2001 04:00:48 -0600 From: "Steve Shoecraft" <sshoecraft@safepages.com> To: <dmaddox@sc.rr.com>, "'Nicolas Souchu'" <nsouch@alcove.fr> Cc: <freebsd-hackers@FreeBSD.ORG> Subject: RE: more info about: odd result of pci_read_config Message-ID: <001201c0845a$33089f20$89ccdacf@max.home.org> In-Reply-To: <20010120192739.A2127@cae88-102-101.sc.rr.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Nic - 0x6 is the return value from the error_method routine. > -----Original Message----- > From: owner-freebsd-hackers@FreeBSD.ORG > [mailto:owner-freebsd-hackers@FreeBSD.ORG]On Behalf Of Donald > J . Maddox > Sent: Saturday, January 20, 2001 6:28 PM > To: Nicolas Souchu > Cc: freebsd-hackers@FreeBSD.ORG > Subject: Re: more info about: odd result of pci_read_config > > > Heh, this is pretty wierd :) > > I was intrigued by your little problem, so I started looking around. > In sys/dev/pci/pciar.h is: > > static __inline u_int32_t > pci_read_config(device_t dev, int reg, int width) > { > return PCI_READ_CONFIG(device_get_parent(dev), dev, reg, width); > } > > However, this is the only occurence of the string "PCI_READ_CONFIG" > that I can find in the whole damn source tree! Where is this defined? > > > On Sun, Jan 21, 2001 at 12:43:49AM +0100, Nicolas Souchu wrote: > > On Sat, Jan 20, 2001 at 04:18:35PM +0100, Nicolas Souchu wrote: > > > Hi folks, > > > > > > I have a problem with R4.2. The device driver I'm currently > > > writing can't retrieve correctly the value from a PCI > configuration > > > register. What is strange is that when using the pciconf > tool I get > > > the result I expect, not with pci_read_config(). > > > > > > pciconf -r pci0:7:3: 0x48 returns 0x00006001 > > > > > > but > > > > > > value = pci_read_config(dev, 0x48, 4); returns 0x6 !!! > > > > > > > Here is some more testing: > > > > Reading any configuration register gives 0x6! > > > > But > > > > when creating a cfg structure with bus=0, slot=7 and func=3 in the > > attach routine then pass it to pci_cfgread(), it works. Also, when > > querying the pci bus with BUS_READ_IVAR() for BUS, SLOT and FUNC, > > I get 0,7,3. > > > > What is the hose field? > > > > Note also that I had to return NULL on the detection of the device > > 0x30401106 in pcisupport.c pcib_match() because it has a > bridge class and the > > pcib driver was attached to it before viapm. > > > > Here is the piece of code: > > > > static int > > viapm_attach(device_t dev) > > { > > u_int32_t l, base_cfgreg; > > u_int16_t s; > > u_int8_t c; > > struct viapm_data *viapm; > > struct resource *res; > > device_t bitbang; > > pcicfgregs cfg; > > > > if (!(viapm = (struct viapm_data *)device_get_softc(dev))) > > return ENXIO; > > > > bzero(viapm, sizeof(struct viapm_data)); > > > > l = pci_read_config(dev, 0x8, 1); > > printf("%s: rev id 0x%x\n", __FUNCTION__, l); > > > > ## returns 0x6! Which is stupid > > > > switch (l) { > > case VIAPM_OEM_REV_E: > > base_cfgreg = VIAPM_CFG_3040E_BASE; > > > > /* Activate IO block access */ > > s = pci_read_config(dev, VIAPM_CFG_3040E_ACTIV, 2); > > pci_write_config(dev, VIAPM_CFG_3040F_ACTIV, > > s | VIAPM_ACTIV_E_MASK, 2); > > break; > > case VIAPM_OEM_REV_F: > > case VIAPM_PROD_REV_A: > > default: > > base_cfgreg = VIAPM_CFG_3040F_BASE; > > > > /* Activate IO block access */ > > c = pci_read_config(dev, VIAPM_CFG_3040F_ACTIV, 1); > > pci_write_config(dev, VIAPM_CFG_3040F_ACTIV, > > c | VIAPM_ACTIV_F_MASK, 1); > > break; > > } > > > > cfg.hose = -1; > > cfg.bus = 0; > > cfg.slot = 7; > > cfg.func = 3; > > l = pci_cfgread(&cfg, VIAPM_CFG_3040F_BASE, 4); > > printf("%s: base addr 0x%x\n", __FUNCTION__, l); > > > > ## return 0x6001! the correct value > > > > BUS_READ_IVAR(device_get_parent(dev), dev, PCI_IVAR_BUS, &l); > > printf("bus=%d\n", l); > > BUS_READ_IVAR(device_get_parent(dev), dev, PCI_IVAR_SLOT, &l); > > printf("slot=%d\n", l); > > BUS_READ_IVAR(device_get_parent(dev), dev, > PCI_IVAR_FUNCTION, &l); > > printf("func=%d\n", l); > > > > ## return 0,7,3 > > > > if (!(res = bus_alloc_resource(dev, SYS_RES_IOPORT, > &base_cfgreg, > > 0l, ~0l, 1, RF_ACTIVE))) { > > device_printf(dev, "could not allocate bus space\n"); > > return ENXIO; > > } > > viapm->st = rman_get_bustag(res); > > viapm->sh = rman_get_bushandle(res); > > > > printf("viapm: 0x%x and 0x%x\n", viapm->st, viapm->sh); > > > > VIAPM_OUTB(GPIO_DIR, VIAPM_INB(GPIO_DIR) | VIAPM_SCL | > VIAPM_SDA); > > > > device_printf(dev, "attaching bitbanging...\n"); > > > > /* add generic bit-banging code */ > > if (!(bitbang = device_add_child(dev, "iicbb", -1))) > > return ENXIO; > > > > return (device_probe_and_attach(bitbang)); > > } > > > > -- > > Nicolas.Souchu@alcove.fr > > Alcôve - Open Source Software Engineer - http://www.alcove.fr > > > > > > To Unsubscribe: send mail to majordomo@FreeBSD.org > > with "unsubscribe freebsd-hackers" in the body of the message > > > To Unsubscribe: send mail to majordomo@FreeBSD.org > with "unsubscribe freebsd-hackers" in the body of the message > To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?001201c0845a$33089f20$89ccdacf>