Changeset View
Changeset View
Standalone View
Standalone View
stand/powerpc/ofw/ofwfdt.c
| Show First 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | ofwfdt_fixups(void *fdtp) | ||||
| offset = fdt_path_offset(fdtp, "/rtas"); | offset = fdt_path_offset(fdtp, "/rtas"); | ||||
| if (offset > 0) { | if (offset > 0) { | ||||
| uint32_t base; | uint32_t base; | ||||
| void *rtasmem; | void *rtasmem; | ||||
| char path[255]; | char path[255]; | ||||
| node = OF_finddevice("/rtas"); | node = OF_finddevice("/rtas"); | ||||
| OF_package_to_path(node, path, sizeof(path)); | OF_package_to_path(node, path, sizeof(path)); | ||||
| OF_getprop(node, "rtas-size", &len, sizeof(len)); | OF_getencprop(node, "rtas-size", &len, sizeof(len)); | ||||
| /* Allocate memory */ | /* Allocate memory */ | ||||
| rtasmem = OF_claim(0, len, 4096); | rtasmem = OF_claim(0, len, 4096); | ||||
| /* Instantiate RTAS */ | /* Instantiate RTAS */ | ||||
| rtas = OF_open(path); | rtas = OF_open(path); | ||||
| base = 0; | base = 0; | ||||
| OF_call_method("instantiate-rtas", rtas, 1, 1, (cell_t)rtasmem, | OF_call_method("instantiate-rtas", rtas, 1, 1, (cell_t)rtasmem, | ||||
| &base); | &base); | ||||
| /* Store info to FDT using Linux convention */ | /* Store info to FDT using Linux convention */ | ||||
| base = cpu_to_fdt32(base); | base = cpu_to_fdt32(base); | ||||
| fdt_setprop(fdtp, offset, "linux,rtas-entry", &base, | fdt_setprop(fdtp, offset, "linux,rtas-entry", &base, | ||||
| sizeof(base)); | sizeof(base)); | ||||
| base = cpu_to_fdt32((uint32_t)rtasmem); | base = cpu_to_fdt32((uint32_t)rtasmem); | ||||
| offset = fdt_path_offset(fdtp, "/rtas"); | offset = fdt_path_offset(fdtp, "/rtas"); | ||||
| fdt_setprop(fdtp, offset, "linux,rtas-base", &base, | fdt_setprop(fdtp, offset, "linux,rtas-base", &base, | ||||
| sizeof(base)); | sizeof(base)); | ||||
| /* Mark RTAS private data area reserved */ | /* Mark RTAS private data area reserved */ | ||||
| base = fdt32_to_cpu(base); | |||||
| fdt_add_mem_rsv(fdtp, base, len); | fdt_add_mem_rsv(fdtp, base, len); | ||||
| } else { | } else { | ||||
| /* | /* | ||||
| * Remove /memory/available properties, which reflect long-gone | * Remove /memory/available properties, which reflect long-gone | ||||
| * OF state. Note that this doesn't work if we need RTAS still, | * OF state. Note that this doesn't work if we need RTAS still, | ||||
| * since that's part of the firmware. | * since that's part of the firmware. | ||||
| */ | */ | ||||
| offset = fdt_path_offset(fdtp, "/memory@0"); | offset = fdt_path_offset(fdtp, "/memory@0"); | ||||
| if (offset > 0) | if (offset > 0) | ||||
| fdt_delprop(fdtp, offset, "available"); | fdt_delprop(fdtp, offset, "available"); | ||||
| } | } | ||||
| /* | /* | ||||
| * Convert stored ihandles under /chosen to xref phandles | * Convert stored ihandles under /chosen to xref phandles | ||||
| */ | */ | ||||
| offset = fdt_path_offset(fdtp, "/chosen"); | offset = fdt_path_offset(fdtp, "/chosen"); | ||||
| if (offset > 0) { | if (offset > 0) { | ||||
| const char *chosenprops[] = {"stdout", "stdin", "mmu", "cpu", | const char *chosenprops[] = {"stdout", "stdin", "mmu", "cpu", | ||||
| NULL}; | NULL}; | ||||
| const uint32_t *ihand; | const uint32_t *ihand; | ||||
| for (i = 0; chosenprops[i] != NULL; i++) { | for (i = 0; chosenprops[i] != NULL; i++) { | ||||
| ihand = fdt_getprop(fdtp, offset, chosenprops[i], &len); | ihand = fdt_getprop(fdtp, offset, chosenprops[i], &len); | ||||
| if (ihand != NULL && len == sizeof(*ihand)) { | if (ihand != NULL && len == sizeof(*ihand)) { | ||||
| node = OF_instance_to_package( | node = OF_instance_to_package(*ihand); | ||||
| fdt32_to_cpu(*ihand)); | |||||
| if (OF_hasprop(node, "phandle")) | if (OF_hasprop(node, "phandle")) | ||||
| OF_getprop(node, "phandle", &node, | OF_getprop(node, "phandle", &node, | ||||
| sizeof(node)); | sizeof(node)); | ||||
| else if (OF_hasprop(node, "linux,phandle")) | else if (OF_hasprop(node, "linux,phandle")) | ||||
| OF_getprop(node, "linux,phandle", &node, | OF_getprop(node, "linux,phandle", &node, | ||||
| sizeof(node)); | sizeof(node)); | ||||
| else if (OF_hasprop(node, "ibm,phandle")) | else if (OF_hasprop(node, "ibm,phandle")) | ||||
| OF_getprop(node, "ibm,phandle", &node, | OF_getprop(node, "ibm,phandle", &node, | ||||
| sizeof(node)); | sizeof(node)); | ||||
| node = cpu_to_fdt32(node); | |||||
| fdt_setprop(fdtp, offset, chosenprops[i], &node, | fdt_setprop(fdtp, offset, chosenprops[i], &node, | ||||
| sizeof(node)); | sizeof(node)); | ||||
| } | } | ||||
| /* Refind node in case it moved */ | /* Refind node in case it moved */ | ||||
| offset = fdt_path_offset(fdtp, "/chosen"); | offset = fdt_path_offset(fdtp, "/chosen"); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 41 Lines • Show Last 20 Lines | |||||