Module Name: src Committed By: dyoung Date: Tue Feb 16 00:03:48 UTC 2010
Modified Files: src/sys/arch/i386/pci: pcibios.c src/sys/arch/x86/include: pci_machdep.h src/sys/arch/x86/pci: pci_machdep.c Log Message: Get rid of all PCI_CONF_MODE #ifdef'age except for the little bit that initializes pci_mode, which I have moved to the top. Make pci_mode private to pci_machdep.c. Provide pci_mode_set() for pcibios.c to configure the PCI Configuration Mechanism. KASSERT() in pci_mode_set() that the mechanism is not changing from anything but the "don't know" value, -1. To generate a diff of this commit: cvs rdiff -u -r1.36 -r1.37 src/sys/arch/i386/pci/pcibios.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/x86/include/pci_machdep.h cvs rdiff -u -r1.37 -r1.38 src/sys/arch/x86/pci/pci_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/i386/pci/pcibios.c diff -u src/sys/arch/i386/pci/pcibios.c:1.36 src/sys/arch/i386/pci/pcibios.c:1.37 --- src/sys/arch/i386/pci/pcibios.c:1.36 Mon Apr 28 20:23:25 2008 +++ src/sys/arch/i386/pci/pcibios.c Tue Feb 16 00:03:47 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pcibios.c,v 1.36 2008/04/28 20:23:25 martin Exp $ */ +/* $NetBSD: pcibios.c,v 1.37 2010/02/16 00:03:47 dyoung Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pcibios.c,v 1.36 2008/04/28 20:23:25 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pcibios.c,v 1.37 2010/02/16 00:03:47 dyoung Exp $"); #include "opt_pcibios.h" #include "opt_pcifixup.h" @@ -180,7 +180,7 @@ * The PCI BIOS tells us the config mechanism; fill it in now * so that pci_mode_detect() doesn't have to look for it. */ - pci_mode = mech1 ? 1 : 2; + pci_mode_set(mech1 ? 1 : 2); pcibios_present = 1; Index: src/sys/arch/x86/include/pci_machdep.h diff -u src/sys/arch/x86/include/pci_machdep.h:1.8 src/sys/arch/x86/include/pci_machdep.h:1.9 --- src/sys/arch/x86/include/pci_machdep.h:1.8 Fri May 30 09:49:07 2008 +++ src/sys/arch/x86/include/pci_machdep.h Tue Feb 16 00:03:47 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_machdep.h,v 1.8 2008/05/30 09:49:07 joerg Exp $ */ +/* $NetBSD: pci_machdep.h,v 1.9 2010/02/16 00:03:47 dyoung Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. @@ -82,7 +82,7 @@ * i386-specific PCI variables and functions. * NOT TO BE USED DIRECTLY BY MACHINE INDEPENDENT CODE. */ -extern int pci_mode; +void pci_mode_set(int); int pci_mode_detect(void); int pci_bus_flags(void); struct pci_attach_args; Index: src/sys/arch/x86/pci/pci_machdep.c diff -u src/sys/arch/x86/pci/pci_machdep.c:1.37 src/sys/arch/x86/pci/pci_machdep.c:1.38 --- src/sys/arch/x86/pci/pci_machdep.c:1.37 Tue Aug 18 16:41:03 2009 +++ src/sys/arch/x86/pci/pci_machdep.c Tue Feb 16 00:03:47 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_machdep.c,v 1.37 2009/08/18 16:41:03 jmcneill Exp $ */ +/* $NetBSD: pci_machdep.c,v 1.38 2010/02/16 00:03:47 dyoung Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.37 2009/08/18 16:41:03 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.38 2010/02/16 00:03:47 dyoung Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -119,7 +119,15 @@ #endif #endif -int pci_mode = -1; +#ifdef PCI_CONF_MODE +#if (PCI_CONF_MODE == 1) || (PCI_CONF_MODE == 2) +static int pci_mode = PCI_CONF_MODE; +#else +#error Invalid PCI configuration mode. +#endif +#else +static int pci_mode = -1; +#endif static void pci_bridge_hook(pci_chipset_tag_t, pcitag_t, void *); struct pci_bridge_hook_arg { @@ -284,41 +292,25 @@ { pcitag_t tag; -#ifndef PCI_CONF_MODE switch (pci_mode) { case 1: - goto mode1; + if (bus >= 256 || device >= 32 || function >= 8) + panic("pci_make_tag: bad request"); + + tag.mode1 = PCI_MODE1_ENABLE | + (bus << 16) | (device << 11) | (function << 8); + return tag; case 2: - goto mode2; + if (bus >= 256 || device >= 16 || function >= 8) + panic("pci_make_tag: bad request"); + + tag.mode2.port = 0xc000 | (device << 8); + tag.mode2.enable = 0xf0 | (function << 1); + tag.mode2.forward = bus; + return tag; default: panic("pci_make_tag: mode not configured"); } -#endif - -#if !defined(PCI_CONF_MODE) || (PCI_CONF_MODE == 1) -#ifndef PCI_CONF_MODE -mode1: -#endif - if (bus >= 256 || device >= 32 || function >= 8) - panic("pci_make_tag: bad request"); - - tag.mode1 = PCI_MODE1_ENABLE | - (bus << 16) | (device << 11) | (function << 8); - return tag; -#endif - -#if !defined(PCI_CONF_MODE) || (PCI_CONF_MODE == 2) -#ifndef PCI_CONF_MODE -mode2: -#endif - if (bus >= 256 || device >= 16 || function >= 8) - panic("pci_make_tag: bad request"); - - tag.mode2.port = 0xc000 | (device << 8); - tag.mode2.enable = 0xf0 | (function << 1); - tag.mode2.forward = bus; - return tag; -#endif } void @@ -326,41 +318,26 @@ int *bp, int *dp, int *fp) { -#ifndef PCI_CONF_MODE switch (pci_mode) { case 1: - goto mode1; + if (bp != NULL) + *bp = (tag.mode1 >> 16) & 0xff; + if (dp != NULL) + *dp = (tag.mode1 >> 11) & 0x1f; + if (fp != NULL) + *fp = (tag.mode1 >> 8) & 0x7; + return; case 2: - goto mode2; + if (bp != NULL) + *bp = tag.mode2.forward & 0xff; + if (dp != NULL) + *dp = (tag.mode2.port >> 8) & 0xf; + if (fp != NULL) + *fp = (tag.mode2.enable >> 1) & 0x7; + return; default: panic("pci_decompose_tag: mode not configured"); } -#endif - -#if !defined(PCI_CONF_MODE) || (PCI_CONF_MODE == 1) -#ifndef PCI_CONF_MODE -mode1: -#endif - if (bp != NULL) - *bp = (tag.mode1 >> 16) & 0xff; - if (dp != NULL) - *dp = (tag.mode1 >> 11) & 0x1f; - if (fp != NULL) - *fp = (tag.mode1 >> 8) & 0x7; - return; -#endif - -#if !defined(PCI_CONF_MODE) || (PCI_CONF_MODE == 2) -#ifndef PCI_CONF_MODE -mode2: -#endif - if (bp != NULL) - *bp = tag.mode2.forward & 0xff; - if (dp != NULL) - *dp = (tag.mode2.port >> 8) & 0xf; - if (fp != NULL) - *fp = (tag.mode2.enable >> 1) & 0x7; -#endif } pcireg_t @@ -380,41 +357,25 @@ } #endif -#ifndef PCI_CONF_MODE switch (pci_mode) { case 1: - goto mode1; + PCI_CONF_LOCK(s); + outl(PCI_MODE1_ADDRESS_REG, tag.mode1 | reg); + data = inl(PCI_MODE1_DATA_REG); + outl(PCI_MODE1_ADDRESS_REG, 0); + PCI_CONF_UNLOCK(s); + return data; case 2: - goto mode2; + PCI_CONF_LOCK(s); + outb(PCI_MODE2_ENABLE_REG, tag.mode2.enable); + outb(PCI_MODE2_FORWARD_REG, tag.mode2.forward); + data = inl(tag.mode2.port | reg); + outb(PCI_MODE2_ENABLE_REG, 0); + PCI_CONF_UNLOCK(s); + return data; default: panic("pci_conf_read: mode not configured"); } -#endif - -#if !defined(PCI_CONF_MODE) || (PCI_CONF_MODE == 1) -#ifndef PCI_CONF_MODE -mode1: -#endif - PCI_CONF_LOCK(s); - outl(PCI_MODE1_ADDRESS_REG, tag.mode1 | reg); - data = inl(PCI_MODE1_DATA_REG); - outl(PCI_MODE1_ADDRESS_REG, 0); - PCI_CONF_UNLOCK(s); - return data; -#endif - -#if !defined(PCI_CONF_MODE) || (PCI_CONF_MODE == 2) -#ifndef PCI_CONF_MODE -mode2: -#endif - PCI_CONF_LOCK(s); - outb(PCI_MODE2_ENABLE_REG, tag.mode2.enable); - outb(PCI_MODE2_FORWARD_REG, tag.mode2.forward); - data = inl(tag.mode2.port | reg); - outb(PCI_MODE2_ENABLE_REG, 0); - PCI_CONF_UNLOCK(s); - return data; -#endif } void @@ -433,53 +394,38 @@ } #endif -#ifndef PCI_CONF_MODE switch (pci_mode) { case 1: - goto mode1; + PCI_CONF_LOCK(s); + outl(PCI_MODE1_ADDRESS_REG, tag.mode1 | reg); + outl(PCI_MODE1_DATA_REG, data); + outl(PCI_MODE1_ADDRESS_REG, 0); + PCI_CONF_UNLOCK(s); + return; case 2: - goto mode2; + PCI_CONF_LOCK(s); + outb(PCI_MODE2_ENABLE_REG, tag.mode2.enable); + outb(PCI_MODE2_FORWARD_REG, tag.mode2.forward); + outl(tag.mode2.port | reg, data); + outb(PCI_MODE2_ENABLE_REG, 0); + PCI_CONF_UNLOCK(s); + return; default: panic("pci_conf_write: mode not configured"); } -#endif +} -#if !defined(PCI_CONF_MODE) || (PCI_CONF_MODE == 1) -#ifndef PCI_CONF_MODE -mode1: -#endif - PCI_CONF_LOCK(s); - outl(PCI_MODE1_ADDRESS_REG, tag.mode1 | reg); - outl(PCI_MODE1_DATA_REG, data); - outl(PCI_MODE1_ADDRESS_REG, 0); - PCI_CONF_UNLOCK(s); - return; -#endif +void +pci_mode_set(int mode) +{ + KASSERT(pci_mode == -1 || pci_mode == mode); -#if !defined(PCI_CONF_MODE) || (PCI_CONF_MODE == 2) -#ifndef PCI_CONF_MODE -mode2: -#endif - PCI_CONF_LOCK(s); - outb(PCI_MODE2_ENABLE_REG, tag.mode2.enable); - outb(PCI_MODE2_FORWARD_REG, tag.mode2.forward); - outl(tag.mode2.port | reg, data); - outb(PCI_MODE2_ENABLE_REG, 0); - PCI_CONF_UNLOCK(s); -#endif + pci_mode = mode; } int pci_mode_detect(void) { - -#ifdef PCI_CONF_MODE -#if (PCI_CONF_MODE == 1) || (PCI_CONF_MODE == 2) - return (pci_mode = PCI_CONF_MODE); -#else -#error Invalid PCI configuration mode. -#endif -#else uint32_t sav, val; int i; pcireg_t idreg; @@ -553,7 +499,6 @@ not2: return (pci_mode = 0); -#endif } /*