Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/mips/alchemy Add a bus_space that makes use of wire...
details: https://anonhg.NetBSD.org/src/rev/09b8c23cbc5a
branches: trunk
changeset: 588046:09b8c23cbc5a
user: gdamore <gdamore%NetBSD.org@localhost>
date: Mon Feb 06 03:07:44 2006 +0000
description:
Add a bus_space that makes use of wired TLB entries, as required for PCI,
PCMCIA, and perhaps other devices on Alchemy parts.
Closes PR port-evbmips/32298
Reviewed as part of PCI changes by matt@, izumi@, and probably also simonb@.
This implementation has been tested seperately with my PCI code. This commit
does not add the necessary changes to configuration files to include this in
current configurations yet, as I intend to add that when I add the
multi-platform configuration support for evbmips/alchemy (which will be
required for PCI anyway.)
diffstat:
sys/arch/mips/alchemy/au_wired_space.c | 749 +++++++++++++++++++++++++
sys/arch/mips/alchemy/include/au_wired_space.h | 50 +
2 files changed, 799 insertions(+), 0 deletions(-)
diffs (truncated from 807 to 300 lines):
diff -r 695175964ec1 -r 09b8c23cbc5a sys/arch/mips/alchemy/au_wired_space.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/mips/alchemy/au_wired_space.c Mon Feb 06 03:07:44 2006 +0000
@@ -0,0 +1,749 @@
+/* $NetBSD: au_wired_space.c,v 1.1 2006/02/06 03:07:44 gdamore Exp $ */
+
+/*-
+ * Copyright (c) 2006 Itronix Inc.
+ * All rights reserved.
+ *
+ * Written by Garrett D'Amore for Itronix Inc.
+ *
+ * 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 Itronix Inc. may not be used to endorse
+ * or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``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 ITRONIX INC. 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) 1996, 1997, 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Charles M. Hannum and 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.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: au_wired_space.c,v 1.1 2006/02/06 03:07:44 gdamore Exp $");
+
+/*
+ * This provides mappings for the upper I/O regions used on some
+ * Alchemy parts, e.g. PCI and PCMCIA spaces. These spaces require
+ * the use of wired TLB entries.
+ *
+ * Earlier Alchemy parts with all of peripherials located in the
+ * bottom 4GB of physical memory, do not need this.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/extent.h>
+#include <sys/malloc.h>
+#include <sys/endian.h>
+
+#include <machine/bus.h>
+#include <machine/locore.h>
+#include <machine/wired_map.h>
+#include <mips/alchemy/include/au_wired_space.h>
+
+#ifndef AU_WIRED_EXTENT_SZ
+#define AU_WIRED_EXTENT_SZ EXTENT_FIXED_STORAGE_SIZE(10)
+#endif
+
+typedef struct au_wired_cookie {
+ const char *c_name;
+ bus_addr_t c_start;
+ bus_size_t c_size;
+ paddr_t c_pbase;
+ int c_flags;
+ int c_swswap;
+ boolean_t c_hwswap;
+ struct extent *c_extent;
+ long c_exstore[AU_WIRED_EXTENT_SZ/sizeof (long)];
+} au_wired_cookie_t;
+
+int au_wired_map(void *, bus_addr_t, bus_size_t, int,
+ bus_space_handle_t *, int);
+void au_wired_unmap(void *, bus_space_handle_t, bus_size_t, int);
+void *au_wired_vaddr(void *, bus_space_handle_t);
+int au_wired_subregion(void *, bus_space_handle_t, bus_size_t, bus_size_t,
+ bus_space_handle_t *);
+paddr_t au_wired_mmap(void *, bus_addr_t, off_t, int, int);
+int au_wired_alloc(void *, bus_addr_t, bus_addr_t, bus_size_t, bus_size_t,
+ bus_size_t, int, bus_addr_t *, bus_space_handle_t *);
+void au_wired_free(void *, bus_space_handle_t, bus_size_t);
+void au_wired_barrier(void *, bus_space_handle_t, bus_size_t, bus_size_t, int);
+uint8_t au_wired_r_1(void *, bus_space_handle_t, bus_size_t);
+uint16_t au_wired_r_2(void *, bus_space_handle_t, bus_size_t);
+uint32_t au_wired_r_4(void *, bus_space_handle_t, bus_size_t);
+uint64_t au_wired_r_8(void *, bus_space_handle_t, bus_size_t);
+void au_wired_rm_1(void *, bus_space_handle_t, bus_size_t, uint8_t *,
+ bus_size_t);
+void au_wired_rm_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
+ bus_size_t);
+void au_wired_rm_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
+ bus_size_t);
+void au_wired_rm_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
+ bus_size_t);
+void au_wired_rr_1(void *, bus_space_handle_t, bus_size_t, uint8_t *,
+ bus_size_t);
+void au_wired_rr_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
+ bus_size_t);
+void au_wired_rr_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
+ bus_size_t);
+void au_wired_rr_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
+ bus_size_t);
+void au_wired_w_1(void *, bus_space_handle_t, bus_size_t, uint8_t);
+void au_wired_w_2(void *, bus_space_handle_t, bus_size_t, uint16_t);
+void au_wired_w_4(void *, bus_space_handle_t, bus_size_t, uint32_t);
+void au_wired_w_8(void *, bus_space_handle_t, bus_size_t, uint64_t);
+void au_wired_wm_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *,
+ bus_size_t);
+void au_wired_wm_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
+ bus_size_t);
+void au_wired_wm_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
+ bus_size_t);
+void au_wired_wm_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
+ bus_size_t);
+void au_wired_wr_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *,
+ bus_size_t);
+void au_wired_wr_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
+ bus_size_t);
+void au_wired_wr_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
+ bus_size_t);
+void au_wired_wr_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
+ bus_size_t);
+void au_wired_sm_1(void *, bus_space_handle_t, bus_size_t, uint8_t,
+ bus_size_t);
+void au_wired_sm_2(void *, bus_space_handle_t, bus_size_t, uint16_t,
+ bus_size_t);
+void au_wired_sm_4(void *, bus_space_handle_t, bus_size_t, uint32_t,
+ bus_size_t);
+void au_wired_sm_8(void *, bus_space_handle_t, bus_size_t, uint64_t,
+ bus_size_t);
+void au_wired_sr_1(void *, bus_space_handle_t, bus_size_t, uint8_t,
+ bus_size_t);
+void au_wired_sr_2(void *, bus_space_handle_t, bus_size_t, uint16_t,
+ bus_size_t);
+void au_wired_sr_4(void *, bus_space_handle_t, bus_size_t, uint32_t,
+ bus_size_t);
+void au_wired_sr_8(void *, bus_space_handle_t, bus_size_t, uint64_t,
+ bus_size_t);
+void au_wired_c_1(void *, bus_space_handle_t, bus_size_t,
+ bus_space_handle_t, bus_size_t, bus_size_t);
+void au_wired_c_2(void *, bus_space_handle_t, bus_size_t,
+ bus_space_handle_t, bus_size_t, bus_size_t);
+void au_wired_c_4(void *, bus_space_handle_t, bus_size_t,
+ bus_space_handle_t, bus_size_t, bus_size_t);
+void au_wired_c_8(void *, bus_space_handle_t, bus_size_t,
+ bus_space_handle_t, bus_size_t, bus_size_t);
+uint16_t au_wired_rs_2(void *, bus_space_handle_t, bus_size_t);
+uint32_t au_wired_rs_4(void *, bus_space_handle_t, bus_size_t);
+uint64_t au_wired_rs_8(void *, bus_space_handle_t, bus_size_t);
+void au_wired_ws_2(void *, bus_space_handle_t, bus_size_t, uint16_t);
+void au_wired_ws_4(void *, bus_space_handle_t, bus_size_t, uint32_t);
+void au_wired_ws_8(void *, bus_space_handle_t, bus_size_t, uint64_t);
+void au_wired_rms_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
+ bus_size_t);
+void au_wired_rms_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
+ bus_size_t);
+void au_wired_rms_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
+ bus_size_t);
+void au_wired_rrs_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
+ bus_size_t);
+void au_wired_rrs_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
+ bus_size_t);
+void au_wired_rrs_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
+ bus_size_t);
+void au_wired_wms_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
+ bus_size_t);
+void au_wired_wms_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
+ bus_size_t);
+void au_wired_wms_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
+ bus_size_t);
+void au_wired_wrs_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
+ bus_size_t);
+void au_wired_wrs_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
+ bus_size_t);
+void au_wired_wrs_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
+ bus_size_t);
+
+int
+au_wired_map(void *cookie, bus_addr_t addr, bus_size_t size,
+ int flags, bus_space_handle_t *bshp, int acct)
+{
+ int err;
+ au_wired_cookie_t *c = (au_wired_cookie_t *)cookie;
+ paddr_t pa;
+
+ /* make sure we can map this bus address */
+ if (addr < c->c_start ||
+ addr + size > c->c_start + c->c_size)
+ return EINVAL;
+
+ pa = c->c_pbase + (addr - c->c_start);
+
+ if (!mips3_wired_enter_region(addr, pa, size))
+ return ENOMEM;
+
+ /*
+ * bus addresses are taken from virtual address space.
+ */
+ if (acct && c->c_extent != NULL) {
+ err = extent_alloc_region(c->c_extent, addr, size, EX_NOWAIT);
+ if (err)
+ return err;
+ }
+
+ *bshp = addr;
+
+ return 0;
+}
+
+void
+au_wired_unmap(void *cookie, bus_space_handle_t bsh, bus_size_t size, int acct)
+{
+ au_wired_cookie_t *c = (au_wired_cookie_t *)cookie;
+
+ if (acct != 0 && c->c_extent != NULL) {
+ extent_free(c->c_extent, (vaddr_t)bsh, size, EX_NOWAIT);
+ }
+}
+
+int
+au_wired_subregion(void *cookie, bus_space_handle_t bsh,
+ bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)
+{
+
+ *nbshp = bsh + offset;
+ return 0;
+}
+
+void *
+au_wired_vaddr(void *cookie, bus_space_handle_t bsh)
+{
+
+ return ((void *)bsh);
+}
+
+paddr_t
+au_wired_mmap(void *cookie, bus_addr_t addr, off_t off, int prot, int flags)
+{
+ au_wired_cookie_t *c = (au_wired_cookie_t *)cookie;
+
+ /* I/O spaces should not be directly mmap'ed */
+ if (c->c_flags & AU_WIRED_SPACE_IO)
+ return -1;
+
+ if (addr < c->c_start || (addr + off) >= (c->c_start + c->c_size))
+ return -1;
+
+ return mips_btop(c->c_pbase + (addr - c->c_start) + off);
+}
+
+int
+au_wired_alloc(void *cookie, bus_addr_t start, bus_addr_t end,
+ bus_size_t size, bus_size_t align, bus_size_t boundary, int flags,
+ bus_addr_t *addrp, bus_space_handle_t *bshp)
+{
+ au_wired_cookie_t *c = (au_wired_cookie_t *)cookie;
+ vaddr_t addr;
+ int err;
+ paddr_t pa;
Home |
Main Index |
Thread Index |
Old Index