summaryrefslogtreecommitdiffstats
path: root/sys/boot/ofw
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2006-10-09 07:00:59 +0000
committerkmacy <kmacy@FreeBSD.org>2006-10-09 07:00:59 +0000
commit5a59ed693d2185a154bd9952e28b5e19933cfd0c (patch)
tree7d19c160d41a83f69fb9ac23d0a035b84faf572c /sys/boot/ofw
parentd81c54abb9922f7f8c2556a46722df6321c10b97 (diff)
downloadFreeBSD-src-5a59ed693d2185a154bd9952e28b5e19933cfd0c.zip
FreeBSD-src-5a59ed693d2185a154bd9952e28b5e19933cfd0c.tar.gz
more sun4v fallout - missed add
Approved by: rwatson (mentor)
Diffstat (limited to 'sys/boot/ofw')
-rw-r--r--sys/boot/ofw/libofw/openfirm_mmu.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/sys/boot/ofw/libofw/openfirm_mmu.c b/sys/boot/ofw/libofw/openfirm_mmu.c
new file mode 100644
index 0000000..c92baa0
--- /dev/null
+++ b/sys/boot/ofw/libofw/openfirm_mmu.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2006 Kip Macy
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 TOOLS GMBH 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>
+__FBSDID("$FreeBSD$");
+
+#include <machine/stdarg.h>
+#include <stand.h>
+
+#include "openfirm.h"
+
+static ihandle_t
+OF_mmu_ihandle(void)
+{
+ static ihandle_t immu;
+
+ if (immu != (ihandle_t)0)
+ return (immu);
+
+ if (OF_getproplen(OF_chosennode(), "mmu") != sizeof (ihandle_t))
+ return (immu = (ihandle_t)-1);
+
+ (void) OF_getprop(OF_chosennode(), "mmu", (caddr_t)(&immu), sizeof immu);
+ return (immu);
+}
+
+
+int
+OF_translate_virt(vm_offset_t va, int *valid, vm_paddr_t *physaddr, int *mode)
+{
+ int rv;
+ static struct {
+ cell_t name;
+ cell_t nargs;
+ cell_t nreturns;
+ cell_t method;
+ cell_t immu;
+ cell_t va;
+ cell_t result;
+ cell_t valid;
+ cell_t mode;
+ cell_t phys_hi;
+ cell_t phys_lo;
+ } args = {
+ (cell_t)"call-method",
+ 3,
+ 5,
+ (cell_t)"translate",
+ };
+
+ args.immu = (cell_t) OF_mmu_ihandle();
+ args.result = 0;
+ args.valid = 0;
+ args.mode = 0;
+ rv = openfirmware(&args);
+ if (rv == -1)
+ return (-1);
+ if (args.result != 0)
+ return (-1);
+
+ *valid = args.valid;
+ *mode = args.mode;
+ *physaddr = (vm_paddr_t)(args.phys_hi << 32 | args.phys_lo);
+
+ return (0);
+}
+
+vm_paddr_t
+OF_vtophys(vm_offset_t va)
+{
+ int mode, valid, error;
+ vm_paddr_t physaddr;
+
+ error = OF_translate_virt(va, &valid, &physaddr, &mode);
+
+ if (error == 0 && valid == -1)
+ return physaddr;
+
+ return (0);
+}
+
+int
+OF_map_phys(int mode, size_t size, vm_offset_t va, uint64_t pa)
+{
+ int rv;
+
+ static struct {
+ cell_t name;
+ cell_t nargs;
+ cell_t nreturns;
+ cell_t method;
+ cell_t immu;
+ cell_t mode;
+ cell_t size;
+ cell_t va;
+ cell_t pa_hi;
+ cell_t pa_lo;
+ cell_t result;
+ } args = {
+ (cell_t)"call-method",
+ 7,
+ 1,
+ (cell_t)"map",
+ };
+ args.immu = (cell_t)OF_mmu_ihandle();
+ args.mode = (cell_t)mode;
+ args.size = (cell_t)size;
+ args.va = (cell_t)va;
+ args.pa_hi = (cell_t)(pa >> 32);
+ args.pa_lo = (cell_t)((uint32_t)pa);
+
+ rv = openfirmware(&args);
+ if (rv == -1)
+ return (-1);
+ if (args.result != 0)
+ return (-1);
+
+ return (0);
+}
OpenPOWER on IntegriCloud