[U-Boot] [PATCH] nios2: convert nios2 cpu to driver model

2015-09-30 Thread Thomas Chou
Convert nios2 cpu to driver model. The cpu parameters are
extracted from device tree and saved to global data structure.
We will use them to replace the custom_fpga.h .

Signed-off-by: Thomas Chou 
---
v2
  move cpu param setup to arch_cpu_init_dm, remove probe.
v3
  fix coding style as Marek suggested.
  select CMD_CPU.
v4
  revert to v1 probe method.
  doc dts binding.
  check uclass_first_device() return.
  clean up as Simon suggested.

 arch/Kconfig   |  3 ++
 arch/nios2/cpu/cpu.c   | 88 --
 arch/nios2/dts/3c120_devboard.dts  |  1 +
 arch/nios2/include/asm/global_data.h   |  8 
 configs/nios2-generic_defconfig|  3 +-
 doc/device-tree-bindings/cpu/nios2.txt | 54 +
 6 files changed, 152 insertions(+), 5 deletions(-)
 create mode 100644 doc/device-tree-bindings/cpu/nios2.txt

diff --git a/arch/Kconfig b/arch/Kconfig
index 207c778..9be1538 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -64,6 +64,9 @@ config NIOS2
select HAVE_GENERIC_BOARD
select SYS_GENERIC_BOARD
select SUPPORT_OF_CONTROL
+   select OF_CONTROL
+   select DM
+   select CPU
 
 config OPENRISC
bool "OpenRISC architecture"
diff --git a/arch/nios2/cpu/cpu.c b/arch/nios2/cpu/cpu.c
index 39ae972..bd11abc 100644
--- a/arch/nios2/cpu/cpu.c
+++ b/arch/nios2/cpu/cpu.c
@@ -6,7 +6,9 @@
  */
 
 #include 
-#include 
+#include 
+#include 
+#include 
 #include 
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -51,10 +53,90 @@ void dcache_disable(void)
flush_dcache(CONFIG_SYS_DCACHE_SIZE, CONFIG_SYS_DCACHELINE_SIZE);
 }
 
-int arch_cpu_init(void)
+int arch_cpu_init_dm(void)
 {
-   gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
+   struct udevice *dev;
+   int ret;
+
+   ret = uclass_first_device(UCLASS_CPU, &dev);
+   if (ret)
+   return ret;
+   if (!dev)
+   return -ENODEV;
+
gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
 
return 0;
 }
+
+static int altera_nios2_get_desc(struct udevice *dev, char *buf, int size)
+{
+   const char *cpu_name = "Nios-II";
+
+   if (size < strlen(cpu_name))
+   return -ENOSPC;
+   strcpy(buf, cpu_name);
+
+   return 0;
+}
+
+static int altera_nios2_get_info(struct udevice *dev, struct cpu_info *info)
+{
+   info->cpu_freq = gd->cpu_clk;
+   info->features = (1 << CPU_FEAT_L1_CACHE) |
+   (gd->arch.has_mmu ? (1 << CPU_FEAT_MMU) : 0);
+
+   return 0;
+}
+
+static int altera_nios2_get_count(struct udevice *dev)
+{
+   return 1;
+}
+
+static int altera_nios2_probe(struct udevice *dev)
+{
+   const void *blob = gd->fdt_blob;
+   int node = dev->of_offset;
+
+   gd->cpu_clk = fdtdec_get_int(blob, node,
+   "clock-frequency", 0);
+   gd->arch.dcache_line_size = fdtdec_get_int(blob, node,
+   "dcache-line-size", 0);
+   gd->arch.icache_line_size = fdtdec_get_int(blob, node,
+   "icache-line-size", 0);
+   gd->arch.dcache_size = fdtdec_get_int(blob, node,
+   "dcache-size", 0);
+   gd->arch.icache_size = fdtdec_get_int(blob, node,
+   "icache-size", 0);
+   gd->arch.reset_addr = fdtdec_get_int(blob, node,
+   "altr,reset-addr", 0);
+   gd->arch.exception_addr = fdtdec_get_int(blob, node,
+   "altr,exception-addr", 0);
+   gd->arch.has_mmu = fdtdec_get_int(blob, node,
+   "altr,has-mmu", 0);
+   gd->arch.io_region_base = gd->arch.has_mmu ? 0xe000 : 0x800;
+
+   return 0;
+}
+
+static const struct cpu_ops altera_nios2_ops = {
+   .get_desc   = altera_nios2_get_desc,
+   .get_info   = altera_nios2_get_info,
+   .get_count  = altera_nios2_get_count,
+};
+
+static const struct udevice_id altera_nios2_ids[] = {
+   { .compatible = "altr,nios2-1.0" },
+   { .compatible = "altr,nios2-1.1" },
+   { }
+};
+
+U_BOOT_DRIVER(altera_nios2) = {
+   .name   = "altera_nios2",
+   .id = UCLASS_CPU,
+   .of_match   = altera_nios2_ids,
+   .probe  = altera_nios2_probe,
+   .ops= &altera_nios2_ops,
+   .flags  = DM_FLAG_PRE_RELOC,
+};
diff --git a/arch/nios2/dts/3c120_devboard.dts 
b/arch/nios2/dts/3c120_devboard.dts
index 781a652..2e2956f 100644
--- a/arch/nios2/dts/3c120_devboard.dts
+++ b/arch/nios2/dts/3c120_devboard.dts
@@ -41,6 +41,7 @@
altr,exception-addr = <0xd020>;
altr,has-initda = <1>;
altr,has-mmu = <1>;
+   u-boot,dm-pre-reloc;
};
};
 
diff --git a/arch/nios2/include/asm/global_data.h 
b/arch/nios2/include/asm/global_data.h
index 580b019..ee5180b 100644
--- a/arch/nios2/include/asm/global_data.h
+++ b/arch/nios2/include/asm/global_data.h
@@ -9,6 +9,14 @@
 
 /* Architecture-specific global data */
 struct arch_global_data {
+   

[U-Boot] [PATCH] nios2: convert nios2 cpu to driver model

2015-09-27 Thread Thomas Chou
Convert nios2 cpu to driver model. The cpu parameters are
extracted from device tree and saved to global data structure.
We will use them to replace the custom_fpga.h .

Signed-off-by: Thomas Chou 
---
 arch/Kconfig |  3 ++
 arch/nios2/cpu/cpu.c | 80 ++--
 arch/nios2/dts/3c120_devboard.dts|  1 +
 arch/nios2/include/asm/global_data.h |  8 
 configs/nios2-generic_defconfig  |  2 -
 5 files changed, 89 insertions(+), 5 deletions(-)

diff --git a/arch/Kconfig b/arch/Kconfig
index 207c778..9be1538 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -64,6 +64,9 @@ config NIOS2
select HAVE_GENERIC_BOARD
select SYS_GENERIC_BOARD
select SUPPORT_OF_CONTROL
+   select OF_CONTROL
+   select DM
+   select CPU
 
 config OPENRISC
bool "OpenRISC architecture"
diff --git a/arch/nios2/cpu/cpu.c b/arch/nios2/cpu/cpu.c
index 39ae972..f2cb022 100644
--- a/arch/nios2/cpu/cpu.c
+++ b/arch/nios2/cpu/cpu.c
@@ -6,7 +6,9 @@
  */
 
 #include 
-#include 
+#include 
+#include 
+#include 
 #include 
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -51,10 +53,82 @@ void dcache_disable(void)
flush_dcache(CONFIG_SYS_DCACHE_SIZE, CONFIG_SYS_DCACHELINE_SIZE);
 }
 
-int arch_cpu_init(void)
+int arch_cpu_init_dm(void)
 {
-   gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
+   struct udevice *dev;
+
+   uclass_first_device(UCLASS_CPU, &dev);
gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
 
return 0;
 }
+
+static int altera_nios2_get_desc(struct udevice *dev, char *buf, int size)
+{
+   const char *cpu_name = "Nios-II";
+
+   if (size < strlen(cpu_name))
+   return -ENOSPC;
+   strcpy(buf, cpu_name);
+
+   return 0;
+}
+
+static int altera_nios2_get_info(struct udevice *dev, struct cpu_info *info)
+{
+
+   info->cpu_freq = gd->cpu_clk;
+   info->features = 1 << CPU_FEAT_L1_CACHE
+   | (gd->arch.has_mmu ? 1 << CPU_FEAT_MMU : 0);
+
+   return 0;
+}
+
+static int altera_nios2_get_count(struct udevice *dev)
+{
+   return 1;
+}
+
+static int altera_nios2_probe(struct udevice *dev)
+{
+   gd->cpu_clk = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+   "clock-frequency", 0);
+   gd->arch.dcache_line_size = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+   "dcache-line-size", 0);
+   gd->arch.icache_line_size = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+   "icache-line-size", 0);
+   gd->arch.dcache_size = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+   "dcache-size", 0);
+   gd->arch.icache_size = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+   "icache-size", 0);
+   gd->arch.reset_addr = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+   "altr,reset-addr", 0);
+   gd->arch.exception_addr = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+   "altr,exception-addr", 0);
+   gd->arch.has_mmu = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+   "altr,has-mmu", 0);
+   gd->arch.io_region_base = gd->arch.has_mmu ? 0xe000 : 0x800;
+
+   return 0;
+}
+
+static const struct cpu_ops altera_nios2_ops = {
+   .get_desc   = altera_nios2_get_desc,
+   .get_info   = altera_nios2_get_info,
+   .get_count  = altera_nios2_get_count,
+};
+
+static const struct udevice_id altera_nios2_ids[] = {
+   { .compatible = "altr,nios2-1.0" },
+   { .compatible = "altr,nios2-1.1" },
+   { }
+};
+
+U_BOOT_DRIVER(altera_nios2) = {
+   .name   = "altera_nios2",
+   .id = UCLASS_CPU,
+   .of_match   = altera_nios2_ids,
+   .probe  = altera_nios2_probe,
+   .ops= &altera_nios2_ops,
+   .flags  = DM_FLAG_PRE_RELOC,
+};
diff --git a/arch/nios2/dts/3c120_devboard.dts 
b/arch/nios2/dts/3c120_devboard.dts
index 781a652..2e2956f 100644
--- a/arch/nios2/dts/3c120_devboard.dts
+++ b/arch/nios2/dts/3c120_devboard.dts
@@ -41,6 +41,7 @@
altr,exception-addr = <0xd020>;
altr,has-initda = <1>;
altr,has-mmu = <1>;
+   u-boot,dm-pre-reloc;
};
};
 
diff --git a/arch/nios2/include/asm/global_data.h 
b/arch/nios2/include/asm/global_data.h
index 580b019..ee5180b 100644
--- a/arch/nios2/include/asm/global_data.h
+++ b/arch/nios2/include/asm/global_data.h
@@ -9,6 +9,14 @@
 
 /* Architecture-specific global data */
 struct arch_global_data {
+   u32 dcache_line_size;
+   u32 icache_line_size;
+   u32 dcache_size;
+   u32 icache_size;
+   u32 reset_addr;
+   u32 exception_addr;
+   int has_mmu;
+   u32 io_region_base;
 };
 
 #include 
diff --git a/configs/nios2-generic_defconfig b/configs/nios2-generic_defconfig
index ad72272..63d99d8 100644
--- a/configs/nios2-generic_defconfig
+++ b/configs/nios2-generic_defconfig
@@ -13,9 +13,7 @@ CONFIG_

Re: [U-Boot] [PATCH] nios2: convert nios2 cpu to driver model

2015-10-02 Thread Simon Glass
On Wednesday, 30 September 2015, Thomas Chou  wrote:
>
> Convert nios2 cpu to driver model. The cpu parameters are
> extracted from device tree and saved to global data structure.
> We will use them to replace the custom_fpga.h .
>
> Signed-off-by: Thomas Chou 
> ---
> v2
>   move cpu param setup to arch_cpu_init_dm, remove probe.
> v3
>   fix coding style as Marek suggested.
>   select CMD_CPU.
> v4
>   revert to v1 probe method.
>   doc dts binding.
>   check uclass_first_device() return.
>   clean up as Simon suggested.
>
>  arch/Kconfig   |  3 ++
>  arch/nios2/cpu/cpu.c   | 88 
> --
>  arch/nios2/dts/3c120_devboard.dts  |  1 +
>  arch/nios2/include/asm/global_data.h   |  8 
>  configs/nios2-generic_defconfig|  3 +-
>  doc/device-tree-bindings/cpu/nios2.txt | 54 +
>  6 files changed, 152 insertions(+), 5 deletions(-)
>  create mode 100644 doc/device-tree-bindings/cpu/nios2.txt



 Reviewed-by: Simon Glass 
>
>
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH] nios2: convert nios2 cpu to driver model

2015-10-04 Thread Thomas Chou



On 10/01/2015 10:31 AM, Thomas Chou wrote:

Convert nios2 cpu to driver model. The cpu parameters are
extracted from device tree and saved to global data structure.
We will use them to replace the custom_fpga.h .

Signed-off-by: Thomas Chou 
---
v2
   move cpu param setup to arch_cpu_init_dm, remove probe.
v3
   fix coding style as Marek suggested.
   select CMD_CPU.
v4
   revert to v1 probe method.
   doc dts binding.
   check uclass_first_device() return.
   clean up as Simon suggested.

  arch/Kconfig   |  3 ++
  arch/nios2/cpu/cpu.c   | 88 --
  arch/nios2/dts/3c120_devboard.dts  |  1 +
  arch/nios2/include/asm/global_data.h   |  8 
  configs/nios2-generic_defconfig|  3 +-
  doc/device-tree-bindings/cpu/nios2.txt | 54 +
  6 files changed, 152 insertions(+), 5 deletions(-)
  create mode 100644 doc/device-tree-bindings/cpu/nios2.txt


Applied to u-boot-nios.
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot