void *of_claim(unsigned long virt, unsigned long size, unsigned long align) { int ret; unsigned int result; if (need_map < 0) need_map = check_of_version(); if (align || !need_map) return (void *) of_call_prom("claim", 3, 1, virt, size, align); ret = of_call_prom_ret("call-method", 5, 2, &result, "claim", memory, align, size, virt); if (ret != 0 || result == -1) return (void *) -1; ret = of_call_prom_ret("call-method", 5, 2, &result, "claim", chosen_mmu, align, size, virt); /* */ ret = of_call_prom("call-method", 6, 1, "map", chosen_mmu, 0x12, size, virt, virt); return (void *) virt; }
static int check_of_version(void) { phandle oprom, chosen; char version[64]; oprom = of_finddevice("/openprom"); if (oprom == (phandle) -1) return 0; if (of_getprop(oprom, "model", version, sizeof(version)) <= 0) return 0; version[sizeof(version)-1] = 0; printf("OF version = '%s'\r\n", version); if (!string_match(version, "Open Firmware, 1.") && !string_match(version, "FirmWorks,3.")) return 0; chosen = of_finddevice("/chosen"); if (chosen == (phandle) -1) { chosen = of_finddevice("/chosen@0"); if (chosen == (phandle) -1) { printf("no chosen\n"); return 0; } } if (of_getprop(chosen, "mmu", &chosen_mmu, sizeof(chosen_mmu)) <= 0) { printf("no mmu\n"); return 0; } memory = (ihandle) of_call_prom("open", 1, 1, "/memory"); if (memory == (ihandle) -1) { memory = (ihandle) of_call_prom("open", 1, 1, "/memory@0"); if (memory == (ihandle) -1) { printf("no memory node\n"); return 0; } } printf("old OF detected\r\n"); return 1; }
static int of_setprop(const void *phandle, const char *name, const void *buf, const int buflen) { return of_call_prom("setprop", 4, 1, phandle, name, buf, buflen); }
/* * OF device tree routines */ static void *of_finddevice(const char *name) { return (phandle) of_call_prom("finddevice", 1, 1, name); }
void of_exit(void) { of_call_prom("exit", 0, 0); }