Changeset d22645e in mainline
- Timestamp:
- 2006-06-25T21:51:11Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b7b5f83
- Parents:
- ce8725be
- Location:
- arch/ppc64/loader
- Files:
-
- 2 deleted
- 3 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
arch/ppc64/loader/Makefile
rce8725be rd22645e 47 47 endif 48 48 49 CFLAGS = - nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -mcpu=powerpc64 -msoft-float -m6449 CFLAGS = -I. -I../../../generic -I../../../genarch -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -mcpu=powerpc64 -msoft-float -m64 50 50 DEFS = 51 51 52 52 SOURCES = \ 53 53 main.c \ 54 ofw.c \55 printf.c \54 ../../../genarch/ofw.c \ 55 ../../../generic/printf.c \ 56 56 asm.S \ 57 57 boot.S -
arch/ppc64/loader/main.c
rce8725be rd22645e 28 28 29 29 #include "main.h" 30 #include "printf.h"30 #include <printf.h> 31 31 #include "asm.h" 32 32 #include "_components.h" -
arch/ppc64/loader/ofw.c
rce8725be rd22645e 27 27 */ 28 28 29 #include "ofw.h" 30 #include "asm.h" 31 #include "printf.h" 29 #include <ofw.h> 30 #include <printf.h> 32 31 33 #define MAX_OFW_ARGS 10 34 #define BUF_SIZE 1024 35 36 typedef unsigned int ofw_arg_t; 37 typedef unsigned int ihandle; 38 typedef unsigned int phandle; 39 40 /** OpenFirmware command structure 41 * 42 */ 43 typedef struct { 44 const char *service; /**< Command name */ 45 unsigned int nargs; /**< Number of in arguments */ 46 unsigned int nret; /**< Number of out arguments */ 47 ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */ 48 } ofw_args_t; 49 50 typedef void (*ofw_entry)(ofw_args_t *); 51 52 53 ofw_entry ofw; 54 55 phandle ofw_chosen; 56 ihandle ofw_stdout; 57 phandle ofw_root; 58 ihandle ofw_mmu; 59 phandle ofw_memory; 60 phandle ofw_aliases; 61 62 63 static int ofw_call(const char *service, const int nargs, const int nret, ofw_arg_t *rets, ...) 32 void write(const char *str, const long len) 64 33 { 65 va_list list; 66 ofw_args_t args; 67 int i; 68 69 args.service = service; 70 args.nargs = nargs; 71 args.nret = nret; 72 73 va_start(list, rets); 74 for (i = 0; i < nargs; i++) 75 args.args[i] = va_arg(list, ofw_arg_t); 76 va_end(list); 77 78 for (i = 0; i < nret; i++) 79 args.args[i + nargs] = 0; 80 81 ofw(&args); 82 83 for (i = 1; i < nret; i++) 84 rets[i - 1] = args.args[i + nargs]; 85 86 return args.args[nargs]; 34 ofw_write(str, len); 87 35 } 88 89 90 static phandle ofw_find_device(const char *name)91 {92 return ofw_call("finddevice", 1, 1, NULL, name);93 }94 95 96 static int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen)97 {98 return ofw_call("getprop", 4, 1, NULL, device, name, buf, buflen);99 }100 101 102 static unsigned int ofw_get_address_cells(const phandle device)103 {104 unsigned int ret;105 106 if (ofw_get_property(device, "#address-cells", &ret, sizeof(ret)) <= 0)107 if (ofw_get_property(ofw_root, "#address-cells", &ret, sizeof(ret)) <= 0)108 ret = 1;109 110 return ret;111 }112 113 114 static unsigned int ofw_get_size_cells(const phandle device)115 {116 unsigned int ret;117 118 if (ofw_get_property(device, "#size-cells", &ret, sizeof(ret)) <= 0)119 if (ofw_get_property(ofw_root, "#size-cells", &ret, sizeof(ret)) <= 0)120 ret = 1;121 122 return ret;123 }124 125 126 static ihandle ofw_open(const char *name)127 {128 return ofw_call("open", 1, 1, NULL, name);129 }130 131 132 void init(void)133 {134 ofw_chosen = ofw_find_device("/chosen");135 if (ofw_chosen == -1)136 halt();137 138 if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0)139 ofw_stdout = 0;140 141 ofw_root = ofw_find_device("/");142 if (ofw_root == -1) {143 puts("\r\nError: Unable to find / device, halted.\r\n");144 halt();145 }146 147 if (ofw_get_property(ofw_chosen, "mmu", &ofw_mmu, sizeof(ofw_mmu)) <= 0) {148 puts("\r\nError: Unable to get mmu property, halted.\r\n");149 halt();150 }151 152 ofw_memory = ofw_find_device("/memory");153 if (ofw_memory == -1) {154 puts("\r\nError: Unable to find /memory device, halted.\r\n");155 halt();156 }157 158 ofw_aliases = ofw_find_device("/aliases");159 if (ofw_aliases == -1) {160 puts("\r\nError: Unable to find /aliases device, halted.\r\n");161 halt();162 }163 }164 165 166 void ofw_write(const char *str, const long len)167 {168 if (ofw_stdout == 0)169 return;170 171 ofw_call("write", 3, 1, NULL, ofw_stdout, str, len);172 }173 174 175 void *ofw_translate(const void *virt)176 {177 ofw_arg_t result[3];178 179 if (ofw_call("call-method", 4, 4, result, "translate", ofw_mmu, (unsigned long) virt, 1) != 0) {180 puts("Error: MMU method translate() failed, halting.\n");181 halt();182 }183 return (void *) (unsigned long) result[2];184 }185 186 187 int ofw_map(const void *phys, const void *virt, const long size, const int mode)188 {189 return ofw_call("call-method", 6, 1, NULL, "map", ofw_mmu, mode, size, virt, phys);190 }191 192 193 int ofw_memmap(memmap_t *map)194 {195 unsigned int buf[BUF_SIZE];196 int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(unsigned int) * BUF_SIZE);197 if (ret <= 0)198 return false;199 200 unsigned int ac = ofw_get_address_cells(ofw_memory);201 unsigned int sc = ofw_get_size_cells(ofw_memory);202 203 int pos;204 map->total = 0;205 map->count = 0;206 for (pos = 0; (pos < ret / sizeof(unsigned int)) && (map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) {207 void * start = (void *) (unsigned long) buf[pos + ac - 1];208 unsigned int size = buf[pos + ac + sc - 1];209 210 if (size > 0) {211 map->zones[map->count].start = start;212 map->zones[map->count].size = size;213 map->count++;214 map->total += size;215 }216 }217 }218 219 220 int ofw_screen(screen_t *screen)221 {222 char device_name[BUF_SIZE];223 224 if (ofw_get_property(ofw_aliases, "screen", device_name, sizeof(char) * BUF_SIZE) <= 0)225 return false;226 227 phandle device = ofw_find_device(device_name);228 if (device == -1)229 return false;230 231 if (ofw_get_property(device, "address", &screen->addr, sizeof(screen->addr)) <= 0)232 return false;233 234 if (ofw_get_property(device, "width", &screen->width, sizeof(screen->width)) <= 0)235 return false;236 237 if (ofw_get_property(device, "height", &screen->height, sizeof(screen->height)) <= 0)238 return false;239 240 if (ofw_get_property(device, "depth", &screen->bpp, sizeof(screen->bpp)) <= 0)241 return false;242 243 if (ofw_get_property(device, "linebytes", &screen->scanline, sizeof(screen->scanline)) <= 0)244 return false;245 246 return true;247 } -
arch/ppc64/loader/types.h
rce8725be rd22645e 27 27 */ 28 28 29 #ifndef __PRINTF_H__30 #define __PRINTF_H__29 #ifndef TYPES_H__ 30 #define TYPES_H__ 31 31 32 #define INT8 1 33 #define INT16 2 34 #define INT32 4 35 #define INT64 8 32 #include <gentypes.h> 36 33 37 34 typedef signed char __s8; … … 40 37 typedef unsigned short __u16; 41 38 typedef unsigned int __u32; 42 typedef unsigned long __u64;39 typedef unsigned long __u64; 43 40 44 41 typedef __u64 __address; 45 42 typedef __u64 __native; 46 43 47 typedef char *char_ptr;48 49 void puts(const char *str);50 void printf(const char *fmt, ...);51 52 44 #endif
Note:
See TracChangeset
for help on using the changeset viewer.