diff options
author | bcollins <tailor@grayson> | 2006-06-01 13:19:11 -0400 |
---|---|---|
committer | Ben Collins <bcollins@ubuntu.com> | 2006-06-01 13:19:11 -0400 |
commit | ffdb0d4bf3ec6362089ea9bbaea166f07a0999ba (patch) | |
tree | c5aa36d9be40f478b70a6343e925878326af2a33 | |
parent | 6cc6daa8a3895d7c6b3bcc03948f4a8fea077c35 (diff) | |
download | silo-ffdb0d4bf3ec6362089ea9bbaea166f07a0999ba.tar.gz |
[silo @ 112]
Oops, missed some things with the last commit.#
-rw-r--r-- | common/prom.c | 48 | ||||
-rw-r--r-- | include/promlib.h | 21 | ||||
-rw-r--r-- | include/silo.h | 2 |
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); |