Commit 7ec632b45c223bc6a01a8f5a6549854e8624b0c0
1 parent
5c130f65
Wean device tree code off phys_ram_base.
Signed-off-by: Paul Brook <paul@codesourcery.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7068 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
31 additions
and
25 deletions
device_tree.c
| @@ -25,34 +25,35 @@ | @@ -25,34 +25,35 @@ | ||
| 25 | 25 | ||
| 26 | #include <libfdt.h> | 26 | #include <libfdt.h> |
| 27 | 27 | ||
| 28 | -void *load_device_tree(const char *filename_path, void *load_addr) | 28 | +void *load_device_tree(const char *filename_path, int *sizep) |
| 29 | { | 29 | { |
| 30 | - int dt_file_size; | 30 | + int dt_size; |
| 31 | int dt_file_load_size; | 31 | int dt_file_load_size; |
| 32 | int new_dt_size; | 32 | int new_dt_size; |
| 33 | int ret; | 33 | int ret; |
| 34 | - void *dt_file = NULL; | ||
| 35 | - void *fdt; | 34 | + void *fdt = NULL; |
| 36 | 35 | ||
| 37 | - dt_file_size = get_image_size(filename_path); | ||
| 38 | - if (dt_file_size < 0) { | 36 | + *sizep = 0; |
| 37 | + dt_size = get_image_size(filename_path); | ||
| 38 | + if (dt_size < 0) { | ||
| 39 | printf("Unable to get size of device tree file '%s'\n", | 39 | printf("Unable to get size of device tree file '%s'\n", |
| 40 | filename_path); | 40 | filename_path); |
| 41 | goto fail; | 41 | goto fail; |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | + /* Expand to 2x size to give enough room for manipulation. */ | ||
| 45 | + dt_size *= 2; | ||
| 44 | /* First allocate space in qemu for device tree */ | 46 | /* First allocate space in qemu for device tree */ |
| 45 | - dt_file = qemu_mallocz(dt_file_size); | 47 | + fdt = qemu_mallocz(dt_size); |
| 46 | 48 | ||
| 47 | - dt_file_load_size = load_image(filename_path, dt_file); | ||
| 48 | - | ||
| 49 | - /* Second we place new copy of 2x size in guest memory | ||
| 50 | - * This give us enough room for manipulation. | ||
| 51 | - */ | ||
| 52 | - new_dt_size = dt_file_size * 2; | 49 | + dt_file_load_size = load_image(filename_path, fdt); |
| 50 | + if (dt_file_load_size < 0) { | ||
| 51 | + printf("Unable to open device tree file '%s'\n", | ||
| 52 | + filename_path); | ||
| 53 | + goto fail; | ||
| 54 | + } | ||
| 53 | 55 | ||
| 54 | - fdt = load_addr; | ||
| 55 | - ret = fdt_open_into(dt_file, fdt, new_dt_size); | 56 | + ret = fdt_open_into(fdt, fdt, dt_size); |
| 56 | if (ret) { | 57 | if (ret) { |
| 57 | printf("Unable to copy device tree in memory\n"); | 58 | printf("Unable to copy device tree in memory\n"); |
| 58 | goto fail; | 59 | goto fail; |
| @@ -64,12 +65,11 @@ void *load_device_tree(const char *filename_path, void *load_addr) | @@ -64,12 +65,11 @@ void *load_device_tree(const char *filename_path, void *load_addr) | ||
| 64 | filename_path); | 65 | filename_path); |
| 65 | goto fail; | 66 | goto fail; |
| 66 | } | 67 | } |
| 67 | - /* free qemu memory with old device tree */ | ||
| 68 | - qemu_free(dt_file); | 68 | + *sizep = dt_size; |
| 69 | return fdt; | 69 | return fdt; |
| 70 | 70 | ||
| 71 | fail: | 71 | fail: |
| 72 | - qemu_free(dt_file); | 72 | + qemu_free(fdt); |
| 73 | return NULL; | 73 | return NULL; |
| 74 | } | 74 | } |
| 75 | 75 |
device_tree.h
| @@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
| 14 | #ifndef __DEVICE_TREE_H__ | 14 | #ifndef __DEVICE_TREE_H__ |
| 15 | #define __DEVICE_TREE_H__ | 15 | #define __DEVICE_TREE_H__ |
| 16 | 16 | ||
| 17 | -void *load_device_tree(const char *filename_path, void *load_addr); | 17 | +void *load_device_tree(const char *filename_path, int *sizep); |
| 18 | 18 | ||
| 19 | int qemu_devtree_setprop(void *fdt, const char *node_path, | 19 | int qemu_devtree_setprop(void *fdt, const char *node_path, |
| 20 | const char *property, uint32_t *val_array, int size); | 20 | const char *property, uint32_t *val_array, int size); |
hw/ppc440_bamboo.c
| @@ -27,7 +27,7 @@ | @@ -27,7 +27,7 @@ | ||
| 27 | 27 | ||
| 28 | #define BINARY_DEVICE_TREE_FILE "bamboo.dtb" | 28 | #define BINARY_DEVICE_TREE_FILE "bamboo.dtb" |
| 29 | 29 | ||
| 30 | -static void *bamboo_load_device_tree(void *addr, | 30 | +static void *bamboo_load_device_tree(target_phys_addr_t addr, |
| 31 | uint32_t ramsize, | 31 | uint32_t ramsize, |
| 32 | target_phys_addr_t initrd_base, | 32 | target_phys_addr_t initrd_base, |
| 33 | target_phys_addr_t initrd_size, | 33 | target_phys_addr_t initrd_size, |
| @@ -37,6 +37,7 @@ static void *bamboo_load_device_tree(void *addr, | @@ -37,6 +37,7 @@ static void *bamboo_load_device_tree(void *addr, | ||
| 37 | #ifdef HAVE_FDT | 37 | #ifdef HAVE_FDT |
| 38 | uint32_t mem_reg_property[] = { 0, 0, ramsize }; | 38 | uint32_t mem_reg_property[] = { 0, 0, ramsize }; |
| 39 | char *path; | 39 | char *path; |
| 40 | + int fdt_size; | ||
| 40 | int pathlen; | 41 | int pathlen; |
| 41 | int ret; | 42 | int ret; |
| 42 | 43 | ||
| @@ -45,7 +46,7 @@ static void *bamboo_load_device_tree(void *addr, | @@ -45,7 +46,7 @@ static void *bamboo_load_device_tree(void *addr, | ||
| 45 | 46 | ||
| 46 | snprintf(path, pathlen, "%s/%s", bios_dir, BINARY_DEVICE_TREE_FILE); | 47 | snprintf(path, pathlen, "%s/%s", bios_dir, BINARY_DEVICE_TREE_FILE); |
| 47 | 48 | ||
| 48 | - fdt = load_device_tree(path, addr); | 49 | + fdt = load_device_tree(path, &fdt_size); |
| 49 | free(path); | 50 | free(path); |
| 50 | if (fdt == NULL) | 51 | if (fdt == NULL) |
| 51 | goto out; | 52 | goto out; |
| @@ -75,6 +76,8 @@ static void *bamboo_load_device_tree(void *addr, | @@ -75,6 +76,8 @@ static void *bamboo_load_device_tree(void *addr, | ||
| 75 | if (kvm_enabled()) | 76 | if (kvm_enabled()) |
| 76 | kvmppc_fdt_update(fdt); | 77 | kvmppc_fdt_update(fdt); |
| 77 | 78 | ||
| 79 | + cpu_physical_memory_write (addr, (void *)fdt, fdt_size); | ||
| 80 | + | ||
| 78 | out: | 81 | out: |
| 79 | #endif | 82 | #endif |
| 80 | 83 | ||
| @@ -165,7 +168,7 @@ static void bamboo_init(ram_addr_t ram_size, int vga_ram_size, | @@ -165,7 +168,7 @@ static void bamboo_init(ram_addr_t ram_size, int vga_ram_size, | ||
| 165 | else | 168 | else |
| 166 | dt_base = kernel_size + loadaddr; | 169 | dt_base = kernel_size + loadaddr; |
| 167 | 170 | ||
| 168 | - fdt = bamboo_load_device_tree(phys_ram_base + dt_base, ram_size, | 171 | + fdt = bamboo_load_device_tree(dt_base, ram_size, |
| 169 | initrd_base, initrd_size, kernel_cmdline); | 172 | initrd_base, initrd_size, kernel_cmdline); |
| 170 | if (fdt == NULL) { | 173 | if (fdt == NULL) { |
| 171 | fprintf(stderr, "couldn't load device tree\n"); | 174 | fprintf(stderr, "couldn't load device tree\n"); |
hw/ppce500_mpc8544ds.c
| @@ -71,7 +71,7 @@ out: | @@ -71,7 +71,7 @@ out: | ||
| 71 | } | 71 | } |
| 72 | #endif | 72 | #endif |
| 73 | 73 | ||
| 74 | -static void *mpc8544_load_device_tree(void *addr, | 74 | +static void *mpc8544_load_device_tree(target_phys_addr_t addr, |
| 75 | uint32_t ramsize, | 75 | uint32_t ramsize, |
| 76 | target_phys_addr_t initrd_base, | 76 | target_phys_addr_t initrd_base, |
| 77 | target_phys_addr_t initrd_size, | 77 | target_phys_addr_t initrd_size, |
| @@ -81,6 +81,7 @@ static void *mpc8544_load_device_tree(void *addr, | @@ -81,6 +81,7 @@ static void *mpc8544_load_device_tree(void *addr, | ||
| 81 | #ifdef HAVE_FDT | 81 | #ifdef HAVE_FDT |
| 82 | uint32_t mem_reg_property[] = {0, ramsize}; | 82 | uint32_t mem_reg_property[] = {0, ramsize}; |
| 83 | char *path; | 83 | char *path; |
| 84 | + int fdt_size; | ||
| 84 | int pathlen; | 85 | int pathlen; |
| 85 | int ret; | 86 | int ret; |
| 86 | 87 | ||
| @@ -89,7 +90,7 @@ static void *mpc8544_load_device_tree(void *addr, | @@ -89,7 +90,7 @@ static void *mpc8544_load_device_tree(void *addr, | ||
| 89 | 90 | ||
| 90 | snprintf(path, pathlen, "%s/%s", bios_dir, BINARY_DEVICE_TREE_FILE); | 91 | snprintf(path, pathlen, "%s/%s", bios_dir, BINARY_DEVICE_TREE_FILE); |
| 91 | 92 | ||
| 92 | - fdt = load_device_tree(path, addr); | 93 | + fdt = load_device_tree(path, &fdt_size); |
| 93 | qemu_free(path); | 94 | qemu_free(path); |
| 94 | if (fdt == NULL) | 95 | if (fdt == NULL) |
| 95 | goto out; | 96 | goto out; |
| @@ -142,6 +143,8 @@ static void *mpc8544_load_device_tree(void *addr, | @@ -142,6 +143,8 @@ static void *mpc8544_load_device_tree(void *addr, | ||
| 142 | mpc8544_copy_soc_cell(fdt, buf, "timebase-frequency"); | 143 | mpc8544_copy_soc_cell(fdt, buf, "timebase-frequency"); |
| 143 | } | 144 | } |
| 144 | 145 | ||
| 146 | + cpu_physical_memory_write (addr, (void *)fdt, fdt_size); | ||
| 147 | + | ||
| 145 | out: | 148 | out: |
| 146 | #endif | 149 | #endif |
| 147 | 150 | ||
| @@ -259,7 +262,7 @@ static void mpc8544ds_init(ram_addr_t ram_size, int vga_ram_size, | @@ -259,7 +262,7 @@ static void mpc8544ds_init(ram_addr_t ram_size, int vga_ram_size, | ||
| 259 | 262 | ||
| 260 | /* If we're loading a kernel directly, we must load the device tree too. */ | 263 | /* If we're loading a kernel directly, we must load the device tree too. */ |
| 261 | if (kernel_filename) { | 264 | if (kernel_filename) { |
| 262 | - fdt = mpc8544_load_device_tree(phys_ram_base + dt_base, ram_size, | 265 | + fdt = mpc8544_load_device_tree(dt_base, ram_size, |
| 263 | initrd_base, initrd_size, kernel_cmdline); | 266 | initrd_base, initrd_size, kernel_cmdline); |
| 264 | if (fdt == NULL) { | 267 | if (fdt == NULL) { |
| 265 | fprintf(stderr, "couldn't load device tree\n"); | 268 | fprintf(stderr, "couldn't load device tree\n"); |