Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-1-4]: src/sys/arch/alpha/pci Pull up revision 1.51 (requested by ...
details: https://anonhg.NetBSD.org/src/rev/99bead5fe186
branches: netbsd-1-4
changeset: 470290:99bead5fe186
user: he <he%NetBSD.org@localhost>
date: Sun Feb 06 17:29:37 2000 +0000
description:
Pull up revision 1.51 (requested by thorpej):
Fix host->device DMA data corruption problem on DEC Miata
workstations.
diffstat:
sys/arch/alpha/pci/cia.c | 399 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 399 insertions(+), 0 deletions(-)
diffs (truncated from 403 to 300 lines):
diff -r 687ccd9d1ebc -r 99bead5fe186 sys/arch/alpha/pci/cia.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/alpha/pci/cia.c Sun Feb 06 17:29:37 2000 +0000
@@ -0,0 +1,399 @@
+/* $NetBSD: cia.c,v 1.47.2.2 2000/02/06 17:29:37 he Exp $ */
+
+/*-
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+
+/*
+ * Copyright (c) 1995, 1996 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Chris G. Demetriou
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution%CS.CMU.EDU@localhost
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+#include "opt_dec_eb164.h"
+#include "opt_dec_kn20aa.h"
+#include "opt_dec_550.h"
+#include "opt_dec_1000a.h"
+#include "opt_dec_1000.h"
+
+#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
+
+__KERNEL_RCSID(0, "$NetBSD: cia.c,v 1.47.2.2 2000/02/06 17:29:37 he Exp $");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/device.h>
+#include <vm/vm.h>
+
+#include <machine/autoconf.h>
+#include <machine/rpb.h>
+
+#include <dev/isa/isareg.h>
+#include <dev/isa/isavar.h>
+
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcivar.h>
+#include <alpha/pci/ciareg.h>
+#include <alpha/pci/ciavar.h>
+
+#ifdef DEC_KN20AA
+#include <alpha/pci/pci_kn20aa.h>
+#endif
+#ifdef DEC_EB164
+#include <alpha/pci/pci_eb164.h>
+#endif
+#ifdef DEC_550
+#include <alpha/pci/pci_550.h>
+#endif
+#ifdef DEC_1000A
+#include <alpha/pci/pci_1000a.h>
+#endif
+#ifdef DEC_1000
+#include <alpha/pci/pci_1000.h>
+#endif
+
+int ciamatch __P((struct device *, struct cfdata *, void *));
+void ciaattach __P((struct device *, struct device *, void *));
+
+struct cfattach cia_ca = {
+ sizeof(struct cia_softc), ciamatch, ciaattach,
+};
+
+extern struct cfdriver cia_cd;
+
+static int ciaprint __P((void *, const char *pnp));
+
+/* There can be only one. */
+int ciafound;
+struct cia_config cia_configuration;
+
+/*
+ * This determines if we attempt to use BWX for PCI bus and config space
+ * access. Some systems, notably with Pyxis, don't fare so well unless
+ * BWX is used.
+ *
+ * EXCEPT! Some devices have a really hard time if BWX is used (WHY?!).
+ * So, we decouple the uses for PCI config space and PCI bus space.
+ */
+
+#ifndef CIA_PCI_USE_BWX
+#define CIA_PCI_USE_BWX 1
+#endif
+
+#ifndef CIA_BUS_USE_BWX
+#define CIA_BUS_USE_BWX 0
+#endif
+
+int cia_pci_use_bwx = CIA_PCI_USE_BWX;
+int cia_bus_use_bwx = CIA_BUS_USE_BWX;
+
+int
+ciamatch(parent, match, aux)
+ struct device *parent;
+ struct cfdata *match;
+ void *aux;
+{
+ struct mainbus_attach_args *ma = aux;
+
+ /* Make sure that we're looking for a CIA. */
+ if (strcmp(ma->ma_name, cia_cd.cd_name) != 0)
+ return (0);
+
+ if (ciafound)
+ return (0);
+
+ return (1);
+}
+
+/*
+ * Set up the chipset's function pointers.
+ */
+void
+cia_init(ccp, mallocsafe)
+ struct cia_config *ccp;
+ int mallocsafe;
+{
+
+ ccp->cc_hae_mem = REGVAL(CIA_CSR_HAE_MEM);
+ ccp->cc_hae_io = REGVAL(CIA_CSR_HAE_IO);
+ ccp->cc_rev = REGVAL(CIA_CSR_REV) & REV_MASK;
+
+ /*
+ * Determine if we have a Pyxis. Only two systypes can
+ * have this: the EB164 systype (AlphaPC164LX and AlphaPC164SX)
+ * and the DEC_550 systype (Miata).
+ */
+ if ((cputype == ST_EB164 &&
+ (hwrpb->rpb_variation & SV_ST_MASK) >= SV_ST_ALPHAPC164LX_400) ||
+ cputype == ST_DEC_550)
+ ccp->cc_flags |= CCF_ISPYXIS;
+
+ /*
+ * ALCOR/ALCOR2 Revisions >= 2 and Pyxis have the CNFG register.
+ */
+ if (ccp->cc_rev >= 2 || (ccp->cc_flags & CCF_ISPYXIS) != 0)
+ ccp->cc_cnfg = REGVAL(CIA_CSR_CNFG);
+ else
+ ccp->cc_cnfg = 0;
+
+ /*
+ * Use BWX iff:
+ *
+ * - It hasn't been disbled by the user,
+ * - it's enabled in CNFG,
+ * - we're implementation version ev5,
+ * - BWX is enabled in the CPU's capabilities mask (yes,
+ * the bit is really cleared if the capability exists...)
+ */
+ if ((cia_pci_use_bwx || cia_bus_use_bwx) &&
+ (ccp->cc_cnfg & CNFG_BWEN) != 0 &&
+ alpha_implver() == ALPHA_IMPLVER_EV5 &&
+ alpha_amask(ALPHA_AMASK_BWX) == 0) {
+ u_int32_t ctrl;
+
+ if (cia_pci_use_bwx)
+ ccp->cc_flags |= CCF_PCI_USE_BWX;
+ if (cia_bus_use_bwx)
+ ccp->cc_flags |= CCF_BUS_USE_BWX;
+
+ /*
+ * For whatever reason, the firmware seems to enable PCI
+ * loopback mode if it also enables BWX. Make sure it's
+ * enabled if we have an old, buggy firmware rev.
+ */
+ alpha_mb();
+ ctrl = REGVAL(CIA_CSR_CTRL);
+ if ((ctrl & CTRL_PCI_LOOP_EN) == 0) {
+ REGVAL(CIA_CSR_CTRL) = ctrl | CTRL_PCI_LOOP_EN;
+ alpha_mb();
+ }
+ }
+
+ if (!ccp->cc_initted) {
+ /* don't do these twice since they set up extents */
+ if (ccp->cc_flags & CCF_BUS_USE_BWX) {
+ cia_bwx_bus_io_init(&ccp->cc_iot, ccp);
+ cia_bwx_bus_mem_init(&ccp->cc_memt, ccp);
+ } else {
+ cia_swiz_bus_io_init(&ccp->cc_iot, ccp);
+ cia_swiz_bus_mem_init(&ccp->cc_memt, ccp);
+ }
+ }
+ ccp->cc_mallocsafe = mallocsafe;
+
+ cia_pci_init(&ccp->cc_pc, ccp);
+
+ ccp->cc_initted = 1;
+}
+
+void
+ciaattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
+{
+ struct cia_softc *sc = (struct cia_softc *)self;
+ struct cia_config *ccp;
+ struct pcibus_attach_args pba;
+ char bits[64];
+ const char *name;
+ int pass;
+
+ /* note that we've attached the chipset; can't have 2 CIAs. */
+ ciafound = 1;
+
+ /*
+ * set up the chipset's info; done once at console init time
+ * (maybe), but we must do it here as well to take care of things
+ * that need to use memory allocation.
+ */
+ ccp = sc->sc_ccp = &cia_configuration;
+ cia_init(ccp, 1);
+
+ if (ccp->cc_flags & CCF_ISPYXIS) {
+ name = "Pyxis";
+ pass = ccp->cc_rev;
+ } else {
+ name = "ALCOR/ALCOR2";
+ pass = ccp->cc_rev + 1;
+ }
+
+ printf(": DECchip 2117x Core Logic Chipset (%s), pass %d\n",
+ name, pass);
+ if (ccp->cc_cnfg)
+ printf("%s: extended capabilities: %s\n", self->dv_xname,
+ bitmask_snprintf(ccp->cc_cnfg, CIA_CSR_CNFG_BITS,
+ bits, sizeof(bits)));
+
+ switch (ccp->cc_flags & (CCF_PCI_USE_BWX|CCF_BUS_USE_BWX)) {
+ case CCF_PCI_USE_BWX|CCF_BUS_USE_BWX:
+ name = "PCI config and bus";
+ break;
+ case CCF_PCI_USE_BWX:
+ name = "PCI config";
+ break;
+ case CCF_BUS_USE_BWX:
+ name = "bus";
+ break;
+ default:
+ name = NULL;
+ break;
+ }
Home |
Main Index |
Thread Index |
Old Index