From 8b1c40bc0883d0e56765e3e9942026a36b22f3fa Mon Sep 17 00:00:00 2001 From: tsutsui Date: Sat, 1 Mar 2008 18:13:02 +0000 Subject: [PATCH] Split out a PCI configuration space read function into a separate file so that we could use it in other sources. --- sys/arch/cobalt/stand/boot/Makefile | 4 +-- sys/arch/cobalt/stand/boot/boot.c | 18 +++------- sys/arch/cobalt/stand/boot/boot.h | 7 +++- sys/arch/cobalt/stand/boot/pci.c | 55 +++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 16 deletions(-) create mode 100644 sys/arch/cobalt/stand/boot/pci.c diff --git a/sys/arch/cobalt/stand/boot/Makefile b/sys/arch/cobalt/stand/boot/Makefile index a6fe44229287..1f7df5b0424c 100644 --- a/sys/arch/cobalt/stand/boot/Makefile +++ b/sys/arch/cobalt/stand/boot/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.13 2008/03/01 17:45:11 tsutsui Exp $ +# $NetBSD: Makefile,v 1.14 2008/03/01 18:13:02 tsutsui Exp $ NOMAN= # defined @@ -72,7 +72,7 @@ PROG= boot # common sources SRCS+= start.S boot.c devopen.c conf.c clock.c bootinfo.c SRCS+= prf.c com.c cons.c ns16550.c pciide.c tgets.c wdc.c wd.c -SRCS+= cache.c nif_tlp.c tlp.c +SRCS+= cache.c pci.c nif_tlp.c tlp.c # XXX dev_net.c should really be in libsa, but it doesn't # declare ip_convertaddr correctly. diff --git a/sys/arch/cobalt/stand/boot/boot.c b/sys/arch/cobalt/stand/boot/boot.c index 0b2fc24a7299..e394f5ddbfd2 100644 --- a/sys/arch/cobalt/stand/boot/boot.c +++ b/sys/arch/cobalt/stand/boot/boot.c @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.11 2008/03/01 17:45:11 tsutsui Exp $ */ +/* $NetBSD: boot.c,v 1.12 2008/03/01 18:13:02 tsutsui Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -392,25 +392,17 @@ print_banner(unsigned int memsize) u_int read_board_id(void) { - volatile uint32_t *pcicfg_addr, *pcicfg_data; - uint32_t reg; - u_int id; + uint32_t tag, reg; #define PCIB_PCI_BUS 0 #define PCIB_PCI_DEV 9 #define PCIB_PCI_FUNC 0 #define PCIB_BOARD_ID_REG 0x94 #define COBALT_BOARD_ID(reg) ((reg & 0x000000f0) >> 4) -#define GT_BASE 0x14000000 - pcicfg_addr = (uint32_t *)MIPS_PHYS_TO_KSEG1(GT_BASE + GT_PCICFG_ADDR); - pcicfg_data = (uint32_t *)MIPS_PHYS_TO_KSEG1(GT_BASE + GT_PCICFG_DATA); - - *pcicfg_addr = PCICFG_ENABLE | - (PCIB_PCI_BUS << 16) | (PCIB_PCI_DEV << 11) | (PCIB_PCI_FUNC << 8) | - PCIB_BOARD_ID_REG; - reg = *pcicfg_data; - *pcicfg_addr = 0; + tag = (PCIB_PCI_BUS << 16) | (PCIB_PCI_DEV << 11) | + (PCIB_PCI_FUNC << 8); + reg = pcicfgread(tag, PCIB_BOARD_ID_REG); return COBALT_BOARD_ID(reg); } diff --git a/sys/arch/cobalt/stand/boot/boot.h b/sys/arch/cobalt/stand/boot/boot.h index 7278c4fb4b29..37290ae31e3c 100644 --- a/sys/arch/cobalt/stand/boot/boot.h +++ b/sys/arch/cobalt/stand/boot/boot.h @@ -1,4 +1,4 @@ -/* $NetBSD: boot.h,v 1.7 2008/03/01 17:45:11 tsutsui Exp $ */ +/* $NetBSD: boot.h,v 1.8 2008/03/01 18:13:02 tsutsui Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -102,3 +102,8 @@ int tgets(char *); void pdcache_wb(uint32_t, u_int); void pdcache_inv(uint32_t, u_int); void pdcache_wbinv(uint32_t, u_int); + +/* + * pci + */ +uint32_t pcicfgread(uint32_t, uint32_t); diff --git a/sys/arch/cobalt/stand/boot/pci.c b/sys/arch/cobalt/stand/boot/pci.c new file mode 100644 index 000000000000..bccc37085ceb --- /dev/null +++ b/sys/arch/cobalt/stand/boot/pci.c @@ -0,0 +1,55 @@ +/* $NetBSD: pci.c,v 1.1 2008/03/01 18:13:02 tsutsui Exp $ */ + +/* + * Copyright (c) 2008 Izumi Tsutsui. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include +#include + +#include +#include + +#include "boot.h" + +#define GT_BASE 0x14000000 + +uint32_t +pcicfgread(uint32_t tag, uint32_t off) +{ + uint32_t reg; + volatile uint32_t *pcicfg_addr, *pcicfg_data; + + pcicfg_addr = (uint32_t *)MIPS_PHYS_TO_KSEG1(GT_BASE + GT_PCICFG_ADDR); + pcicfg_data = (uint32_t *)MIPS_PHYS_TO_KSEG1(GT_BASE + GT_PCICFG_DATA); + + *pcicfg_addr = PCICFG_ENABLE | tag | (off & ~3U); + reg = *pcicfg_data; + *pcicfg_addr = 0; + + return reg; +}