summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbcollins <tailor@grayson>2006-06-01 13:19:11 -0400
committerBen Collins <bcollins@ubuntu.com>2006-06-01 13:19:11 -0400
commitffdb0d4bf3ec6362089ea9bbaea166f07a0999ba (patch)
treec5aa36d9be40f478b70a6343e925878326af2a33
parent6cc6daa8a3895d7c6b3bcc03948f4a8fea077c35 (diff)
downloadsilo-ffdb0d4bf3ec6362089ea9bbaea166f07a0999ba.tar.gz
[silo @ 112]
Oops, missed some things with the last commit.#
-rw-r--r--common/prom.c48
-rw-r--r--include/promlib.h21
-rw-r--r--include/silo.h2
3 files changed, 69 insertions, 2 deletions
diff --git a/common/prom.c b/common/prom.c
index 5525535..2f5940d 100644
--- a/common/prom.c
+++ b/common/prom.c
@@ -168,3 +168,51 @@ prom_halt(void)
p1275_cmd ("exit", 0);
/* Not reached */
}
+
+static int mmu_ihandle_cache = 0;
+
+static int prom_get_mmu_ihandle(void)
+{
+ int node, ret;
+
+ if (mmu_ihandle_cache != 0)
+ return mmu_ihandle_cache;
+
+ node = prom_finddevice("/chosen");
+ ret = prom_getint(node, "mmu");
+ if (ret == -1 || ret == 0)
+ mmu_ihandle_cache = -1;
+ else
+ mmu_ihandle_cache = ret;
+
+ return ret;
+}
+
+int prom_map(int mode, unsigned long long size,
+ unsigned long long vaddr,
+ unsigned long long paddr)
+{
+ int ret = p1275_cmd("call-method",
+ P1275_ARG_64B(3) | P1275_ARG_64B(4) |
+ P1275_ARG_64B(6) | 7,
+ "map",
+ prom_get_mmu_ihandle(),
+ mode,
+ size,
+ vaddr,
+ 0,
+ paddr);
+
+ return ret;
+}
+
+void prom_unmap(unsigned long long size, unsigned long long vaddr)
+{
+ p1275_cmd("call-method",
+ P1275_ARG_64B(0) | P1275_ARG_64B(2) |
+ P1275_ARG_64B(3) | 4,
+ "unmap",
+ prom_get_mmu_ihandle(),
+ size,
+ vaddr);
+}
diff --git a/include/promlib.h b/include/promlib.h
index cdd5ce3..5fdea70 100644
--- a/include/promlib.h
+++ b/include/promlib.h
@@ -41,11 +41,28 @@ char prom_getchar (void);
int prom_nbputchar (char);
int prom_nbgetchar (void);
void prom_printf (char *, ...);
+#define printf prom_printf
int p1275_cmd (char *, unsigned, ...);
-
#define P1275_ARG_64B(x) (1 << ((x) + 8))
-#define printf prom_printf
+/* Map/Unmap client program address ranges. First the format of
+ * the mapping mode argument.
+ */
+#define PROM_MAP_WRITE 0x0001 /* Writable */
+#define PROM_MAP_READ 0x0002 /* Readable - sw */
+#define PROM_MAP_EXEC 0x0004 /* Executable - sw */
+#define PROM_MAP_LOCKED 0x0010 /* Locked, use i/dtlb load calls for this instead */
+#define PROM_MAP_CACHED 0x0020 /* Cacheable in both L1 and L2 caches */
+#define PROM_MAP_SE 0x0040 /* Side-Effects */
+#define PROM_MAP_GLOB 0x0080 /* Global */
+#define PROM_MAP_IE 0x0100 /* Invert-Endianness */
+#define PROM_MAP_DEFAULT (PROM_MAP_WRITE | PROM_MAP_READ | PROM_MAP_EXEC | PROM_MAP_CACHED)
+
+int prom_map(int mode, unsigned long long size,
+ unsigned long long vaddr,
+ unsigned long long paddr);
+void prom_unmap(unsigned long long size, unsigned long long vaddr);
+
enum prom_major_version { PROM_V0, PROM_V2, PROM_V3, PROM_P1275 };
extern enum prom_major_version prom_vers;
diff --git a/include/silo.h b/include/silo.h
index 0930dd1..1034e9b 100644
--- a/include/silo.h
+++ b/include/silo.h
@@ -128,6 +128,8 @@ void reset_ticks (void);
/* memory.c */
char *memory_find (int);
void memory_release (void);
+char *image_memory_find (unsigned int len);
+void image_memory_release (void);
struct linux_mlist_v0 *prom_meminit (void);
int sun4c_mapio (unsigned long, unsigned long, int);
void sun4c_unmapio (unsigned long);