Patchwork [1/2] powerpc/booke: move fdt loading to rom infrastructure

login
register
mail settings
Submitter Liu Yu-B13201
Date Feb. 2, 2010, 8:49 a.m.
Message ID <1265100543-15528-1-git-send-email-yu.liu@freescale.com>
Download mbox | patch
Permalink /patch/44249/
State New
Headers show

Comments

Liu Yu-B13201 - Feb. 2, 2010, 8:49 a.m.
It's convinent to use rom to checking overlap, to reset etc.
And uImage and ramdisk loading has already moved to it.

Also, after we add fdt to rom, free it.

Signed-off-by: Liu Yu <yu.liu@freescale.com>
---
 hw/ppc440_bamboo.c     |   15 ++++++++-------
 hw/ppce500_mpc8544ds.c |   17 ++++++++++-------
 2 files changed, 18 insertions(+), 14 deletions(-)
Aurelien Jarno - Feb. 27, 2010, 3:33 p.m.
On Tue, Feb 02, 2010 at 04:49:02PM +0800, Liu Yu wrote:
> It's convinent to use rom to checking overlap, to reset etc.
> And uImage and ramdisk loading has already moved to it.
> 
> Also, after we add fdt to rom, free it.

This does not build if CONFIG_FDT is not set:

|   CC    ppc-softmmu/ppc440_bamboo.o
| /home/aurel32/git/qemu/hw/ppc440_bamboo.c: In function 'bamboo_load_device_tree':
| /home/aurel32/git/qemu/hw/ppc440_bamboo.c:86: error: 'ret' undeclared (first use in this function)
| /home/aurel32/git/qemu/hw/ppc440_bamboo.c:86: error: (Each undeclared identifier is reported only once
| /home/aurel32/git/qemu/hw/ppc440_bamboo.c:86: error: for each function it appears in.)
| cc1: warnings being treated as errors
| /home/aurel32/git/qemu/hw/ppc440_bamboo.c:36: error: unused variable 'fdt'
| make[1]: *** [ppc440_bamboo.o] Error 1
| make: *** [subdir-ppc-softmmu] Error 2


> Signed-off-by: Liu Yu <yu.liu@freescale.com>
> ---
>  hw/ppc440_bamboo.c     |   15 ++++++++-------
>  hw/ppce500_mpc8544ds.c |   17 ++++++++++-------
>  2 files changed, 18 insertions(+), 14 deletions(-)
> 
> diff --git a/hw/ppc440_bamboo.c b/hw/ppc440_bamboo.c
> index 1ab9872..9d95417 100644
> --- a/hw/ppc440_bamboo.c
> +++ b/hw/ppc440_bamboo.c
> @@ -27,7 +27,7 @@
>  
>  #define BINARY_DEVICE_TREE_FILE "bamboo.dtb"
>  
> -static void *bamboo_load_device_tree(target_phys_addr_t addr,
> +static int bamboo_load_device_tree(target_phys_addr_t addr,
>                                       uint32_t ramsize,
>                                       target_phys_addr_t initrd_base,
>                                       target_phys_addr_t initrd_size,
> @@ -42,11 +42,13 @@ static void *bamboo_load_device_tree(target_phys_addr_t addr,
>  
>      filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, BINARY_DEVICE_TREE_FILE);
>      if (!filename) {
> +        ret = -1;
>          goto out;
>      }
>      fdt = load_device_tree(filename, &fdt_size);
>      qemu_free(filename);
>      if (fdt == NULL) {
> +        ret = -1;
>          goto out;
>      }
>  
> @@ -75,12 +77,13 @@ static void *bamboo_load_device_tree(target_phys_addr_t addr,
>      if (kvm_enabled())
>          kvmppc_fdt_update(fdt);
>  
> -    cpu_physical_memory_write (addr, (void *)fdt, fdt_size);
> +    ret = rom_add_blob_fixed(BINARY_DEVICE_TREE_FILE, fdt, fdt_size, addr);
> +    qemu_free(fdt);
>  
>  out:
>  #endif
>  
> -    return fdt;
> +    return ret;
>  }
>  
>  static void bamboo_init(ram_addr_t ram_size,
> @@ -101,7 +104,6 @@ static void bamboo_init(ram_addr_t ram_size,
>      target_ulong initrd_base = 0;
>      target_long initrd_size = 0;
>      target_ulong dt_base = 0;
> -    void *fdt;
>      int i;
>  
>      /* Setup CPU. */
> @@ -153,9 +155,8 @@ static void bamboo_init(ram_addr_t ram_size,
>          else
>              dt_base = kernel_size + loadaddr;
>  
> -        fdt = bamboo_load_device_tree(dt_base, ram_size,
> -                                      initrd_base, initrd_size, kernel_cmdline);
> -        if (fdt == NULL) {
> +        if (bamboo_load_device_tree(dt_base, ram_size,
> +                        initrd_base, initrd_size, kernel_cmdline) < 0) {
>              fprintf(stderr, "couldn't load device tree\n");
>              exit(1);
>          }
> diff --git a/hw/ppce500_mpc8544ds.c b/hw/ppce500_mpc8544ds.c
> index ea30816..9a5654b 100644
> --- a/hw/ppce500_mpc8544ds.c
> +++ b/hw/ppce500_mpc8544ds.c
> @@ -72,7 +72,7 @@ out:
>  }
>  #endif
>  
> -static void *mpc8544_load_device_tree(target_phys_addr_t addr,
> +static int mpc8544_load_device_tree(target_phys_addr_t addr,
>                                       uint32_t ramsize,
>                                       target_phys_addr_t initrd_base,
>                                       target_phys_addr_t initrd_size,
> @@ -87,11 +87,13 @@ static void *mpc8544_load_device_tree(target_phys_addr_t addr,
>  
>      filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, BINARY_DEVICE_TREE_FILE);
>      if (!filename) {
> +        ret = -1;
>          goto out;
>      }
>      fdt = load_device_tree(filename, &fdt_size);
>      qemu_free(filename);
>      if (fdt == NULL) {
> +        ret = -1;
>          goto out;
>      }
>  
> @@ -123,6 +125,7 @@ static void *mpc8544_load_device_tree(target_phys_addr_t addr,
>  
>          if ((dp = opendir("/proc/device-tree/cpus/")) == NULL) {
>              printf("Can't open directory /proc/device-tree/cpus/\n");
> +            ret = -1;
>              goto out;
>          }
>  
> @@ -136,6 +139,7 @@ static void *mpc8544_load_device_tree(target_phys_addr_t addr,
>          closedir(dp);
>          if (buf[0] == '\0') {
>              printf("Unknow host!\n");
> +            ret = -1;
>              goto out;
>          }
>  
> @@ -143,12 +147,13 @@ static void *mpc8544_load_device_tree(target_phys_addr_t addr,
>          mpc8544_copy_soc_cell(fdt, buf, "timebase-frequency");
>      }
>  
> -    cpu_physical_memory_write (addr, (void *)fdt, fdt_size);
> +    ret = rom_add_blob_fixed(BINARY_DEVICE_TREE_FILE, fdt, fdt_size, addr);
> +    qemu_free(fdt);
>  
>  out:
>  #endif
>  
> -    return fdt;
> +    return ret;
>  }
>  
>  static void mpc8544ds_init(ram_addr_t ram_size,
> @@ -168,7 +173,6 @@ static void mpc8544ds_init(ram_addr_t ram_size,
>      target_ulong dt_base=DTB_LOAD_BASE;
>      target_ulong initrd_base=INITRD_LOAD_BASE;
>      target_long initrd_size=0;
> -    void *fdt;
>      int i=0;
>      unsigned int pci_irq_nrs[4] = {1, 2, 3, 4};
>      qemu_irq *irqs, *mpic, *pci_irqs;
> @@ -254,9 +258,8 @@ static void mpc8544ds_init(ram_addr_t ram_size,
>  
>      /* If we're loading a kernel directly, we must load the device tree too. */
>      if (kernel_filename) {
> -        fdt = mpc8544_load_device_tree(dt_base, ram_size,
> -                                      initrd_base, initrd_size, kernel_cmdline);
> -        if (fdt == NULL) {
> +        if (mpc8544_load_device_tree(dt_base, ram_size,
> +                    initrd_base, initrd_size, kernel_cmdline) < 0) {
>              fprintf(stderr, "couldn't load device tree\n");
>              exit(1);
>          }
> -- 
> 1.6.4
> 
> 
> 
>
Aurelien Jarno - Feb. 27, 2010, 6:49 p.m.
On Sat, Feb 27, 2010 at 04:33:02PM +0100, Aurelien Jarno wrote:
> On Tue, Feb 02, 2010 at 04:49:02PM +0800, Liu Yu wrote:
> > It's convinent to use rom to checking overlap, to reset etc.
> > And uImage and ramdisk loading has already moved to it.
> > 
> > Also, after we add fdt to rom, free it.
> 
> This does not build if CONFIG_FDT is not set:
> 
> |   CC    ppc-softmmu/ppc440_bamboo.o
> | /home/aurel32/git/qemu/hw/ppc440_bamboo.c: In function 'bamboo_load_device_tree':
> | /home/aurel32/git/qemu/hw/ppc440_bamboo.c:86: error: 'ret' undeclared (first use in this function)
> | /home/aurel32/git/qemu/hw/ppc440_bamboo.c:86: error: (Each undeclared identifier is reported only once
> | /home/aurel32/git/qemu/hw/ppc440_bamboo.c:86: error: for each function it appears in.)
> | cc1: warnings being treated as errors
> | /home/aurel32/git/qemu/hw/ppc440_bamboo.c:36: error: unused variable 'fdt'
> | make[1]: *** [ppc440_bamboo.o] Error 1
> | make: *** [subdir-ppc-softmmu] Error 2
> 

As I have pushed the patch by mistake to the git tree, and it is mostly
ok, I have committed a patch to fix the above issue.

Patch

diff --git a/hw/ppc440_bamboo.c b/hw/ppc440_bamboo.c
index 1ab9872..9d95417 100644
--- a/hw/ppc440_bamboo.c
+++ b/hw/ppc440_bamboo.c
@@ -27,7 +27,7 @@ 
 
 #define BINARY_DEVICE_TREE_FILE "bamboo.dtb"
 
-static void *bamboo_load_device_tree(target_phys_addr_t addr,
+static int bamboo_load_device_tree(target_phys_addr_t addr,
                                      uint32_t ramsize,
                                      target_phys_addr_t initrd_base,
                                      target_phys_addr_t initrd_size,
@@ -42,11 +42,13 @@  static void *bamboo_load_device_tree(target_phys_addr_t addr,
 
     filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, BINARY_DEVICE_TREE_FILE);
     if (!filename) {
+        ret = -1;
         goto out;
     }
     fdt = load_device_tree(filename, &fdt_size);
     qemu_free(filename);
     if (fdt == NULL) {
+        ret = -1;
         goto out;
     }
 
@@ -75,12 +77,13 @@  static void *bamboo_load_device_tree(target_phys_addr_t addr,
     if (kvm_enabled())
         kvmppc_fdt_update(fdt);
 
-    cpu_physical_memory_write (addr, (void *)fdt, fdt_size);
+    ret = rom_add_blob_fixed(BINARY_DEVICE_TREE_FILE, fdt, fdt_size, addr);
+    qemu_free(fdt);
 
 out:
 #endif
 
-    return fdt;
+    return ret;
 }
 
 static void bamboo_init(ram_addr_t ram_size,
@@ -101,7 +104,6 @@  static void bamboo_init(ram_addr_t ram_size,
     target_ulong initrd_base = 0;
     target_long initrd_size = 0;
     target_ulong dt_base = 0;
-    void *fdt;
     int i;
 
     /* Setup CPU. */
@@ -153,9 +155,8 @@  static void bamboo_init(ram_addr_t ram_size,
         else
             dt_base = kernel_size + loadaddr;
 
-        fdt = bamboo_load_device_tree(dt_base, ram_size,
-                                      initrd_base, initrd_size, kernel_cmdline);
-        if (fdt == NULL) {
+        if (bamboo_load_device_tree(dt_base, ram_size,
+                        initrd_base, initrd_size, kernel_cmdline) < 0) {
             fprintf(stderr, "couldn't load device tree\n");
             exit(1);
         }
diff --git a/hw/ppce500_mpc8544ds.c b/hw/ppce500_mpc8544ds.c
index ea30816..9a5654b 100644
--- a/hw/ppce500_mpc8544ds.c
+++ b/hw/ppce500_mpc8544ds.c
@@ -72,7 +72,7 @@  out:
 }
 #endif
 
-static void *mpc8544_load_device_tree(target_phys_addr_t addr,
+static int mpc8544_load_device_tree(target_phys_addr_t addr,
                                      uint32_t ramsize,
                                      target_phys_addr_t initrd_base,
                                      target_phys_addr_t initrd_size,
@@ -87,11 +87,13 @@  static void *mpc8544_load_device_tree(target_phys_addr_t addr,
 
     filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, BINARY_DEVICE_TREE_FILE);
     if (!filename) {
+        ret = -1;
         goto out;
     }
     fdt = load_device_tree(filename, &fdt_size);
     qemu_free(filename);
     if (fdt == NULL) {
+        ret = -1;
         goto out;
     }
 
@@ -123,6 +125,7 @@  static void *mpc8544_load_device_tree(target_phys_addr_t addr,
 
         if ((dp = opendir("/proc/device-tree/cpus/")) == NULL) {
             printf("Can't open directory /proc/device-tree/cpus/\n");
+            ret = -1;
             goto out;
         }
 
@@ -136,6 +139,7 @@  static void *mpc8544_load_device_tree(target_phys_addr_t addr,
         closedir(dp);
         if (buf[0] == '\0') {
             printf("Unknow host!\n");
+            ret = -1;
             goto out;
         }
 
@@ -143,12 +147,13 @@  static void *mpc8544_load_device_tree(target_phys_addr_t addr,
         mpc8544_copy_soc_cell(fdt, buf, "timebase-frequency");
     }
 
-    cpu_physical_memory_write (addr, (void *)fdt, fdt_size);
+    ret = rom_add_blob_fixed(BINARY_DEVICE_TREE_FILE, fdt, fdt_size, addr);
+    qemu_free(fdt);
 
 out:
 #endif
 
-    return fdt;
+    return ret;
 }
 
 static void mpc8544ds_init(ram_addr_t ram_size,
@@ -168,7 +173,6 @@  static void mpc8544ds_init(ram_addr_t ram_size,
     target_ulong dt_base=DTB_LOAD_BASE;
     target_ulong initrd_base=INITRD_LOAD_BASE;
     target_long initrd_size=0;
-    void *fdt;
     int i=0;
     unsigned int pci_irq_nrs[4] = {1, 2, 3, 4};
     qemu_irq *irqs, *mpic, *pci_irqs;
@@ -254,9 +258,8 @@  static void mpc8544ds_init(ram_addr_t ram_size,
 
     /* If we're loading a kernel directly, we must load the device tree too. */
     if (kernel_filename) {
-        fdt = mpc8544_load_device_tree(dt_base, ram_size,
-                                      initrd_base, initrd_size, kernel_cmdline);
-        if (fdt == NULL) {
+        if (mpc8544_load_device_tree(dt_base, ram_size,
+                    initrd_base, initrd_size, kernel_cmdline) < 0) {
             fprintf(stderr, "couldn't load device tree\n");
             exit(1);
         }