diff mbox

[Resend] ARM: EXYNOS: Map SYSRAM address through DT

Message ID 1397649051-3288-1-git-send-email-sachin.kamat@linaro.org
State Superseded
Headers show

Commit Message

Sachin Kamat April 16, 2014, 11:50 a.m. UTC
Instead of hardcoding the SYSRAM details for each SoC,
pass this information through device tree (DT) and make
the code SoC agnostic.

Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org>
---
Rebased on latest linux-next.
---
 .../devicetree/bindings/arm/samsung-boards.txt     |   11 +++
 arch/arm/boot/dts/exynos4210-universal_c210.dts    |    9 ++
 arch/arm/boot/dts/exynos4210.dtsi                  |   10 ++
 arch/arm/boot/dts/exynos4x12.dtsi                  |   10 ++
 arch/arm/boot/dts/exynos5.dtsi                     |    5 +
 arch/arm/boot/dts/exynos5250.dtsi                  |    5 +
 arch/arm/boot/dts/exynos5420.dtsi                  |    5 +
 arch/arm/mach-exynos/exynos.c                      |  104 ++++++++------------
 arch/arm/mach-exynos/include/mach/map.h            |    7 --
 9 files changed, 95 insertions(+), 71 deletions(-)

Comments

Chanwoo Choi April 16, 2014, 12:07 p.m. UTC | #1
Hi,

On 04/16/2014 08:50 PM, Sachin Kamat wrote:
> Instead of hardcoding the SYSRAM details for each SoC,
> pass this information through device tree (DT) and make
> the code SoC agnostic.
> 
> Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org>
> ---
> Rebased on latest linux-next.
> ---
>  .../devicetree/bindings/arm/samsung-boards.txt     |   11 +++
>  arch/arm/boot/dts/exynos4210-universal_c210.dts    |    9 ++
>  arch/arm/boot/dts/exynos4210.dtsi                  |   10 ++
>  arch/arm/boot/dts/exynos4x12.dtsi                  |   10 ++
>  arch/arm/boot/dts/exynos5.dtsi                     |    5 +
>  arch/arm/boot/dts/exynos5250.dtsi                  |    5 +
>  arch/arm/boot/dts/exynos5420.dtsi                  |    5 +
>  arch/arm/mach-exynos/exynos.c                      |  104 ++++++++------------
>  arch/arm/mach-exynos/include/mach/map.h            |    7 --
>  9 files changed, 95 insertions(+), 71 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/arm/samsung-boards.txt b/Documentation/devicetree/bindings/arm/samsung-boards.txt
> index 2168ed31e1b0..f79710eb7e79 100644
> --- a/Documentation/devicetree/bindings/arm/samsung-boards.txt
> +++ b/Documentation/devicetree/bindings/arm/samsung-boards.txt
> @@ -7,6 +7,17 @@ Required root node properties:
>          (a) "samsung,smdkv310" - for Samsung's SMDKV310 eval board.
>          (b) "samsung,exynos4210"  - for boards based on Exynos4210 SoC.
>  
> +    - sysram node, specifying the type (secure or non-secure) of SYSRAM
> +	- compatible: following types are supported
> +		"samsung,exynos4210-sysram" : Secure SYSRAM
> +		"samsung,exynos4210-sysram-ns" : Non-secure SYSRAM
> +	- reg: address of SYSRAM bank
> +
> +	sysram@02020000 {
> +		compatible = "samsung,exynos4210-sysram";
> +		reg = <0x02020000 0x1000>;
> +	};
> +
>  Optional:
>      - firmware node, specifying presence and type of secure firmware:
>          - compatible: only "samsung,secure-firmware" is currently supported
> diff --git a/arch/arm/boot/dts/exynos4210-universal_c210.dts b/arch/arm/boot/dts/exynos4210-universal_c210.dts
> index 63e34b24b04f..cf4158728108 100644
> --- a/arch/arm/boot/dts/exynos4210-universal_c210.dts
> +++ b/arch/arm/boot/dts/exynos4210-universal_c210.dts
> @@ -28,6 +28,15 @@
>  		bootargs = "console=ttySAC2,115200N8 root=/dev/mmcblk0p5 rw rootwait earlyprintk panic=5 maxcpus=1";
>  	};
>  
> +	sysram@02020000 {
> +		status = "disabled";
> +	};
> +
> +	sysram@02025000 {
> +		compatible = "samsung,exynos4210-sysram";
> +		reg = <0x02025000 0x1000>;
> +	};
> +
>  	mct@10050000 {
>  		compatible = "none";
>  	};
> diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi
> index cacf6140dd2f..a3f4bba099e6 100644
> --- a/arch/arm/boot/dts/exynos4210.dtsi
> +++ b/arch/arm/boot/dts/exynos4210.dtsi
> @@ -31,6 +31,16 @@
>  		pinctrl2 = &pinctrl_2;
>  	};
>  
> +	sysram@02020000 {
> +		compatible = "samsung,exynos4210-sysram";
> +		reg = <0x02020000 0x1000>;
> +	};
> +
> +	sysram-ns@0203F000 {
> +		compatible = "samsung,exynos4210-sysram-ns";
> +		reg = <0x0203F000 0x1000>;
> +	};
> +
>  	pd_lcd1: lcd1-power-domain@10023CA0 {
>  		compatible = "samsung,exynos4210-pd";
>  		reg = <0x10023CA0 0x20>;
> diff --git a/arch/arm/boot/dts/exynos4x12.dtsi b/arch/arm/boot/dts/exynos4x12.dtsi
> index c4a9306f8529..d57e3120223f 100644
> --- a/arch/arm/boot/dts/exynos4x12.dtsi
> +++ b/arch/arm/boot/dts/exynos4x12.dtsi
> @@ -37,6 +37,16 @@
>  		interrupts = <2 2>, <3 2>, <18 2>, <19 2>;
>  	};
>  
> +	sysram@02020000 {
> +		compatible = "samsung,exynos4210-sysram";
> +		reg = <0x02020000 0x1000>;
> +	};
> +
> +	sysram-ns@0204F000 {
> +		compatible = "samsung,exynos4210-sysram-ns";
> +		reg = <0x0204F000 0x1000>;
> +	};
> +
>  	pd_isp: isp-power-domain@10023CA0 {
>  		compatible = "samsung,exynos4210-pd";
>  		reg = <0x10023CA0 0x20>;
> diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
> index 79d0608d6dcc..c03bd09ec37d 100644
> --- a/arch/arm/boot/dts/exynos5.dtsi
> +++ b/arch/arm/boot/dts/exynos5.dtsi
> @@ -18,6 +18,11 @@
>  / {
>  	interrupt-parent = <&gic>;
>  
> +	sysram@02020000 {
> +		compatible = "samsung,exynos4210-sysram";
> +		reg = <0x02020000 0x1000>;
> +	};
> +
>  	chipid@10000000 {
>  		compatible = "samsung,exynos4210-chipid";
>  		reg = <0x10000000 0x100>;
> diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi
> index 37423314a028..bae6c3f253f0 100644
> --- a/arch/arm/boot/dts/exynos5250.dtsi
> +++ b/arch/arm/boot/dts/exynos5250.dtsi
> @@ -72,6 +72,11 @@
>  		};
>  	};
>  
> +	sysram-ns@0204F000 {
> +		compatible = "samsung,exynos4210-sysram-ns";
> +		reg = <0x0204F000 0x1000>;
> +	};
> +
>  	pd_gsc: gsc-power-domain@10044000 {
>  		compatible = "samsung,exynos4210-pd";
>  		reg = <0x10044000 0x20>;
> diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi
> index c3a9a66c5767..217376fe1d82 100644
> --- a/arch/arm/boot/dts/exynos5420.dtsi
> +++ b/arch/arm/boot/dts/exynos5420.dtsi
> @@ -110,6 +110,11 @@
>  		};
>  	};
>  
> +	sysram-ns@02073000 {
> +		compatible = "samsung,exynos4210-sysram-ns";
> +		reg = <0x02073000 0x1000>;
> +	};
> +
>  	clock: clock-controller@10010000 {
>  		compatible = "samsung,exynos5420-clock";
>  		reg = <0x10010000 0x30000>;
> diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c
> index b32a907d021d..6a5fe18ec9b1 100644
> --- a/arch/arm/mach-exynos/exynos.c
> +++ b/arch/arm/mach-exynos/exynos.c
> @@ -114,51 +114,6 @@ static struct map_desc exynos4_iodesc[] __initdata = {
>  	},
>  };
>  
> -static struct map_desc exynos4_iodesc0[] __initdata = {
> -	{
> -		.virtual	= (unsigned long)S5P_VA_SYSRAM,
> -		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSRAM0),
> -		.length		= SZ_4K,
> -		.type		= MT_DEVICE,
> -	},
> -};
> -
> -static struct map_desc exynos4_iodesc1[] __initdata = {
> -	{
> -		.virtual	= (unsigned long)S5P_VA_SYSRAM,
> -		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSRAM1),
> -		.length		= SZ_4K,
> -		.type		= MT_DEVICE,
> -	},
> -};
> -
> -static struct map_desc exynos4210_iodesc[] __initdata = {
> -	{
> -		.virtual	= (unsigned long)S5P_VA_SYSRAM_NS,
> -		.pfn		= __phys_to_pfn(EXYNOS4210_PA_SYSRAM_NS),
> -		.length		= SZ_4K,
> -		.type		= MT_DEVICE,
> -	},
> -};
> -
> -static struct map_desc exynos4x12_iodesc[] __initdata = {
> -	{
> -		.virtual	= (unsigned long)S5P_VA_SYSRAM_NS,
> -		.pfn		= __phys_to_pfn(EXYNOS4x12_PA_SYSRAM_NS),
> -		.length		= SZ_4K,
> -		.type		= MT_DEVICE,
> -	},
> -};
> -
> -static struct map_desc exynos5250_iodesc[] __initdata = {
> -	{
> -		.virtual	= (unsigned long)S5P_VA_SYSRAM_NS,
> -		.pfn		= __phys_to_pfn(EXYNOS5250_PA_SYSRAM_NS),
> -		.length		= SZ_4K,
> -		.type		= MT_DEVICE,
> -	},
> -};
> -
>  static struct map_desc exynos5_iodesc[] __initdata = {
>  	{
>  		.virtual	= (unsigned long)S3C_VA_SYS,
> @@ -181,11 +136,6 @@ static struct map_desc exynos5_iodesc[] __initdata = {
>  		.length		= SZ_4K,
>  		.type		= MT_DEVICE,
>  	}, {
> -		.virtual	= (unsigned long)S5P_VA_SYSRAM,
> -		.pfn		= __phys_to_pfn(EXYNOS5_PA_SYSRAM),
> -		.length		= SZ_4K,
> -		.type		= MT_DEVICE,
> -	}, {
>  		.virtual	= (unsigned long)S5P_VA_CMU,
>  		.pfn		= __phys_to_pfn(EXYNOS5_PA_CMU),
>  		.length		= 144 * SZ_1K,
> @@ -268,6 +218,44 @@ static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
>  	return 1;
>  }
>  
> +struct __sysram_desc {
> +	char name[32];
> +	unsigned long addr;
> +};
> +
> +static struct __sysram_desc sysram_desc[] __initdata = {
> +	{
> +		.name = "samsung,exynos4210-sysram",
> +		.addr = (unsigned long)S5P_VA_SYSRAM,
> +	}, {
> +		.name = "samsung,exynos4210-sysram-ns",
> +		.addr = (unsigned long)S5P_VA_SYSRAM_NS,
> +	},
> +};
> +
> +static int __init exynos_fdt_map_sysram(unsigned long node, const char *uname,
> +					int depth, void *data)
> +{
> +	struct map_desc iodesc;
> +	__be32 *reg;
> +	unsigned long len;
> +	int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(sysram_desc); i++) {
> +		if (of_flat_dt_is_compatible(node, sysram_desc[i].name)) {
> +			reg = of_get_flat_dt_prop(node, "reg", &len);
> +			if (!reg || len != (sizeof(unsigned long) * 2))
> +				return -ENODEV;
> +			iodesc.virtual = sysram_desc[i].addr;
> +			iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
> +			iodesc.length = be32_to_cpu(reg[1]);
> +			iodesc.type = MT_DEVICE;
> +			iotable_init(&iodesc, 1);
> +		}
> +	}
> +	return 0;
> +}
> +
>  /*
>   * exynos_map_io
>   *
> @@ -280,20 +268,6 @@ static void __init exynos_map_io(void)
>  
>  	if (soc_is_exynos5())
>  		iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
> -
> -	if (soc_is_exynos4210()) {
> -		if (samsung_rev() == EXYNOS4210_REV_0)
> -			iotable_init(exynos4_iodesc0,
> -						ARRAY_SIZE(exynos4_iodesc0));
> -		else
> -			iotable_init(exynos4_iodesc1,
> -						ARRAY_SIZE(exynos4_iodesc1));
> -		iotable_init(exynos4210_iodesc, ARRAY_SIZE(exynos4210_iodesc));
> -	}
> -	if (soc_is_exynos4212() || soc_is_exynos4412())
> -		iotable_init(exynos4x12_iodesc, ARRAY_SIZE(exynos4x12_iodesc));
> -	if (soc_is_exynos5250())
> -		iotable_init(exynos5250_iodesc, ARRAY_SIZE(exynos5250_iodesc));
>  }
>  
>  void __init exynos_init_io(void)
> @@ -306,6 +280,8 @@ void __init exynos_init_io(void)
>  	s5p_init_cpu(S5P_VA_CHIPID);
>  
>  	exynos_map_io();
> +
> +	of_scan_flat_dt(exynos_fdt_map_sysram, NULL);
>  }
>  
>  struct bus_type exynos_subsys = {
> diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h
> index 7b046b59d9ec..548269a60634 100644
> --- a/arch/arm/mach-exynos/include/mach/map.h
> +++ b/arch/arm/mach-exynos/include/mach/map.h
> @@ -23,13 +23,6 @@
>  
>  #include <plat/map-s5p.h>
>  
> -#define EXYNOS4_PA_SYSRAM0		0x02025000
> -#define EXYNOS4_PA_SYSRAM1		0x02020000
> -#define EXYNOS5_PA_SYSRAM		0x02020000
> -#define EXYNOS4210_PA_SYSRAM_NS		0x0203F000
> -#define EXYNOS4x12_PA_SYSRAM_NS		0x0204F000
> -#define EXYNOS5250_PA_SYSRAM_NS		0x0204F000
> -
>  #define EXYNOS_PA_CHIPID		0x10000000
>  
>  #define EXYNOS4_PA_SYSCON		0x10010000
> 

I tested this patch to turn on CPU1 of Exynos3250
without mapping static SYSRAM memory.

Tested-by: Chanwoo Choi <cw00.choi@samsung.com>

Thanks,
Chanwoo Choi
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rob Herring April 16, 2014, 3:16 p.m. UTC | #2
On Wed, Apr 16, 2014 at 6:50 AM, Sachin Kamat <sachin.kamat@linaro.org> wrote:
> Instead of hardcoding the SYSRAM details for each SoC,
> pass this information through device tree (DT) and make
> the code SoC agnostic.
>
> Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org>
> ---
> Rebased on latest linux-next.
> ---
>  .../devicetree/bindings/arm/samsung-boards.txt     |   11 +++
>  arch/arm/boot/dts/exynos4210-universal_c210.dts    |    9 ++
>  arch/arm/boot/dts/exynos4210.dtsi                  |   10 ++
>  arch/arm/boot/dts/exynos4x12.dtsi                  |   10 ++
>  arch/arm/boot/dts/exynos5.dtsi                     |    5 +
>  arch/arm/boot/dts/exynos5250.dtsi                  |    5 +
>  arch/arm/boot/dts/exynos5420.dtsi                  |    5 +
>  arch/arm/mach-exynos/exynos.c                      |  104 ++++++++------------
>  arch/arm/mach-exynos/include/mach/map.h            |    7 --
>  9 files changed, 95 insertions(+), 71 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/arm/samsung-boards.txt b/Documentation/devicetree/bindings/arm/samsung-boards.txt
> index 2168ed31e1b0..f79710eb7e79 100644
> --- a/Documentation/devicetree/bindings/arm/samsung-boards.txt
> +++ b/Documentation/devicetree/bindings/arm/samsung-boards.txt
> @@ -7,6 +7,17 @@ Required root node properties:
>          (a) "samsung,smdkv310" - for Samsung's SMDKV310 eval board.
>          (b) "samsung,exynos4210"  - for boards based on Exynos4210 SoC.
>
> +    - sysram node, specifying the type (secure or non-secure) of SYSRAM
> +       - compatible: following types are supported
> +               "samsung,exynos4210-sysram" : Secure SYSRAM
> +               "samsung,exynos4210-sysram-ns" : Non-secure SYSRAM

Base this on mmio-sram binding please.

> +       - reg: address of SYSRAM bank
> +
> +       sysram@02020000 {
> +               compatible = "samsung,exynos4210-sysram";
> +               reg = <0x02020000 0x1000>;
> +       };
> +
>  Optional:
>      - firmware node, specifying presence and type of secure firmware:
>          - compatible: only "samsung,secure-firmware" is currently supported
> diff --git a/arch/arm/boot/dts/exynos4210-universal_c210.dts b/arch/arm/boot/dts/exynos4210-universal_c210.dts
> index 63e34b24b04f..cf4158728108 100644
> --- a/arch/arm/boot/dts/exynos4210-universal_c210.dts
> +++ b/arch/arm/boot/dts/exynos4210-universal_c210.dts
> @@ -28,6 +28,15 @@
>                 bootargs = "console=ttySAC2,115200N8 root=/dev/mmcblk0p5 rw rootwait earlyprintk panic=5 maxcpus=1";
>         };
>
> +       sysram@02020000 {
> +               status = "disabled";
> +       };
> +
> +       sysram@02025000 {
> +               compatible = "samsung,exynos4210-sysram";
> +               reg = <0x02025000 0x1000>;
> +       };
> +
>         mct@10050000 {
>                 compatible = "none";
>         };
> diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi
> index cacf6140dd2f..a3f4bba099e6 100644
> --- a/arch/arm/boot/dts/exynos4210.dtsi
> +++ b/arch/arm/boot/dts/exynos4210.dtsi
> @@ -31,6 +31,16 @@
>                 pinctrl2 = &pinctrl_2;
>         };
>
> +       sysram@02020000 {
> +               compatible = "samsung,exynos4210-sysram";
> +               reg = <0x02020000 0x1000>;
> +       };
> +
> +       sysram-ns@0203F000 {
> +               compatible = "samsung,exynos4210-sysram-ns";
> +               reg = <0x0203F000 0x1000>;

hex should be lower case.


[...]

> @@ -268,6 +218,44 @@ static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
>         return 1;
>  }
>
> +struct __sysram_desc {
> +       char name[32];
> +       unsigned long addr;
> +};
> +
> +static struct __sysram_desc sysram_desc[] __initdata = {
> +       {
> +               .name = "samsung,exynos4210-sysram",
> +               .addr = (unsigned long)S5P_VA_SYSRAM,
> +       }, {
> +               .name = "samsung,exynos4210-sysram-ns",
> +               .addr = (unsigned long)S5P_VA_SYSRAM_NS,
> +       },
> +};
> +
> +static int __init exynos_fdt_map_sysram(unsigned long node, const char *uname,
> +                                       int depth, void *data)
> +{
> +       struct map_desc iodesc;
> +       __be32 *reg;
> +       unsigned long len;
> +       int i;
> +
> +       for (i = 0; i < ARRAY_SIZE(sysram_desc); i++) {
> +               if (of_flat_dt_is_compatible(node, sysram_desc[i].name)) {
> +                       reg = of_get_flat_dt_prop(node, "reg", &len);
> +                       if (!reg || len != (sizeof(unsigned long) * 2))
> +                               return -ENODEV;
> +                       iodesc.virtual = sysram_desc[i].addr;
> +                       iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
> +                       iodesc.length = be32_to_cpu(reg[1]);
> +                       iodesc.type = MT_DEVICE;
> +                       iotable_init(&iodesc, 1);

I don't think this needs to be a static mapping at all. Fix your SMP
code. Move the code setting the boot address in prepare_cpus to
boot_secondary.

Also, the pen code is all unnecessary if you can properly reset a core
on hotplug. Given this code:

if (!(__raw_readl(S5P_ARM_CORE1_STATUS) & S5P_CORE_LOCAL_PWR_EN)) {
__raw_writel(S5P_CORE_LOCAL_PWR_EN,
    S5P_ARM_CORE1_CONFIGURATION);

and:

/* make cpu1 to be turned off at next WFI command */
if (cpu == 1)
__raw_writel(0, S5P_ARM_CORE1_CONFIGURATION);

It would appear you probably have this capability and the exynos smp
code is pure mindless cut n' paste.

Rob
--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kukjin Kim April 22, 2014, 2:09 a.m. UTC | #3
Rob Herring wrote:
> 
> On Wed, Apr 16, 2014 at 6:50 AM, Sachin Kamat <sachin.kamat@linaro.org>
> wrote:
> > Instead of hardcoding the SYSRAM details for each SoC,
> > pass this information through device tree (DT) and make
> > the code SoC agnostic.
> >
> > Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org>
> > ---
> > Rebased on latest linux-next.
> > ---
> >  .../devicetree/bindings/arm/samsung-boards.txt     |   11 +++
> >  arch/arm/boot/dts/exynos4210-universal_c210.dts    |    9 ++
> >  arch/arm/boot/dts/exynos4210.dtsi                  |   10 ++
> >  arch/arm/boot/dts/exynos4x12.dtsi                  |   10 ++
> >  arch/arm/boot/dts/exynos5.dtsi                     |    5 +
> >  arch/arm/boot/dts/exynos5250.dtsi                  |    5 +
> >  arch/arm/boot/dts/exynos5420.dtsi                  |    5 +
> >  arch/arm/mach-exynos/exynos.c                      |  104 ++++++++-----------
> -
> >  arch/arm/mach-exynos/include/mach/map.h            |    7 --
> >  9 files changed, 95 insertions(+), 71 deletions(-)
> >
> > diff --git a/Documentation/devicetree/bindings/arm/samsung-boards.txt
> b/Documentation/devicetree/bindings/arm/samsung-boards.txt
> > index 2168ed31e1b0..f79710eb7e79 100644
> > --- a/Documentation/devicetree/bindings/arm/samsung-boards.txt
> > +++ b/Documentation/devicetree/bindings/arm/samsung-boards.txt
> > @@ -7,6 +7,17 @@ Required root node properties:
> >          (a) "samsung,smdkv310" - for Samsung's SMDKV310 eval board.
> >          (b) "samsung,exynos4210"  - for boards based on Exynos4210 SoC.
> >
> > +    - sysram node, specifying the type (secure or non-secure) of SYSRAM
> > +       - compatible: following types are supported
> > +               "samsung,exynos4210-sysram" : Secure SYSRAM
> > +               "samsung,exynos4210-sysram-ns" : Non-secure SYSRAM
> 
> Base this on mmio-sram binding please.
> 
> > +       - reg: address of SYSRAM bank
> > +
> > +       sysram@02020000 {
> > +               compatible = "samsung,exynos4210-sysram";
> > +               reg = <0x02020000 0x1000>;
> > +       };
> > +
> >  Optional:
> >      - firmware node, specifying presence and type of secure firmware:
> >          - compatible: only "samsung,secure-firmware" is currently
> supported
> > diff --git a/arch/arm/boot/dts/exynos4210-universal_c210.dts
> b/arch/arm/boot/dts/exynos4210-universal_c210.dts
> > index 63e34b24b04f..cf4158728108 100644
> > --- a/arch/arm/boot/dts/exynos4210-universal_c210.dts
> > +++ b/arch/arm/boot/dts/exynos4210-universal_c210.dts
> > @@ -28,6 +28,15 @@
> >                 bootargs = "console=ttySAC2,115200N8 root=/dev/mmcblk0p5 rw
> rootwait earlyprintk panic=5 maxcpus=1";
> >         };
> >
> > +       sysram@02020000 {
> > +               status = "disabled";
> > +       };
> > +
> > +       sysram@02025000 {
> > +               compatible = "samsung,exynos4210-sysram";
> > +               reg = <0x02025000 0x1000>;
> > +       };
> > +
> >         mct@10050000 {
> >                 compatible = "none";
> >         };
> > diff --git a/arch/arm/boot/dts/exynos4210.dtsi
> b/arch/arm/boot/dts/exynos4210.dtsi
> > index cacf6140dd2f..a3f4bba099e6 100644
> > --- a/arch/arm/boot/dts/exynos4210.dtsi
> > +++ b/arch/arm/boot/dts/exynos4210.dtsi
> > @@ -31,6 +31,16 @@
> >                 pinctrl2 = &pinctrl_2;
> >         };
> >
> > +       sysram@02020000 {
> > +               compatible = "samsung,exynos4210-sysram";
> > +               reg = <0x02020000 0x1000>;
> > +       };
> > +
> > +       sysram-ns@0203F000 {
> > +               compatible = "samsung,exynos4210-sysram-ns";
> > +               reg = <0x0203F000 0x1000>;
> 
> hex should be lower case.
> 
> 
> [...]
> 
> > @@ -268,6 +218,44 @@ static int __init exynos_fdt_map_chipid(unsigned
> long node, const char *uname,
> >         return 1;
> >  }
> >
> > +struct __sysram_desc {
> > +       char name[32];
> > +       unsigned long addr;
> > +};
> > +
> > +static struct __sysram_desc sysram_desc[] __initdata = {
> > +       {
> > +               .name = "samsung,exynos4210-sysram",
> > +               .addr = (unsigned long)S5P_VA_SYSRAM,
> > +       }, {
> > +               .name = "samsung,exynos4210-sysram-ns",
> > +               .addr = (unsigned long)S5P_VA_SYSRAM_NS,
> > +       },
> > +};
> > +
> > +static int __init exynos_fdt_map_sysram(unsigned long node, const char
> *uname,
> > +                                       int depth, void *data)
> > +{
> > +       struct map_desc iodesc;
> > +       __be32 *reg;
> > +       unsigned long len;
> > +       int i;
> > +
> > +       for (i = 0; i < ARRAY_SIZE(sysram_desc); i++) {
> > +               if (of_flat_dt_is_compatible(node, sysram_desc[i].name)) {
> > +                       reg = of_get_flat_dt_prop(node, "reg", &len);
> > +                       if (!reg || len != (sizeof(unsigned long) * 2))
> > +                               return -ENODEV;
> > +                       iodesc.virtual = sysram_desc[i].addr;
> > +                       iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
> > +                       iodesc.length = be32_to_cpu(reg[1]);
> > +                       iodesc.type = MT_DEVICE;
> > +                       iotable_init(&iodesc, 1);
> 
> I don't think this needs to be a static mapping at all. Fix your SMP
> code. Move the code setting the boot address in prepare_cpus to
> boot_secondary.
> 
> Also, the pen code is all unnecessary if you can properly reset a core
> on hotplug. Given this code:
> 
> if (!(__raw_readl(S5P_ARM_CORE1_STATUS) & S5P_CORE_LOCAL_PWR_EN)) {
> __raw_writel(S5P_CORE_LOCAL_PWR_EN,
>     S5P_ARM_CORE1_CONFIGURATION);
> 
> and:
> 
> /* make cpu1 to be turned off at next WFI command */
> if (cpu == 1)
> __raw_writel(0, S5P_ARM_CORE1_CONFIGURATION);
> 
> It would appear you probably have this capability and the exynos smp
> code is pure mindless cut n' paste.
> 
Basically, I have no strong objection on Rob's suggestion but I'd like to pick this one after small addressing because of other patches' dependency. Then how about addressing comments?

- Kukjin

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/arm/samsung-boards.txt b/Documentation/devicetree/bindings/arm/samsung-boards.txt
index 2168ed31e1b0..f79710eb7e79 100644
--- a/Documentation/devicetree/bindings/arm/samsung-boards.txt
+++ b/Documentation/devicetree/bindings/arm/samsung-boards.txt
@@ -7,6 +7,17 @@  Required root node properties:
         (a) "samsung,smdkv310" - for Samsung's SMDKV310 eval board.
         (b) "samsung,exynos4210"  - for boards based on Exynos4210 SoC.
 
+    - sysram node, specifying the type (secure or non-secure) of SYSRAM
+	- compatible: following types are supported
+		"samsung,exynos4210-sysram" : Secure SYSRAM
+		"samsung,exynos4210-sysram-ns" : Non-secure SYSRAM
+	- reg: address of SYSRAM bank
+
+	sysram@02020000 {
+		compatible = "samsung,exynos4210-sysram";
+		reg = <0x02020000 0x1000>;
+	};
+
 Optional:
     - firmware node, specifying presence and type of secure firmware:
         - compatible: only "samsung,secure-firmware" is currently supported
diff --git a/arch/arm/boot/dts/exynos4210-universal_c210.dts b/arch/arm/boot/dts/exynos4210-universal_c210.dts
index 63e34b24b04f..cf4158728108 100644
--- a/arch/arm/boot/dts/exynos4210-universal_c210.dts
+++ b/arch/arm/boot/dts/exynos4210-universal_c210.dts
@@ -28,6 +28,15 @@ 
 		bootargs = "console=ttySAC2,115200N8 root=/dev/mmcblk0p5 rw rootwait earlyprintk panic=5 maxcpus=1";
 	};
 
+	sysram@02020000 {
+		status = "disabled";
+	};
+
+	sysram@02025000 {
+		compatible = "samsung,exynos4210-sysram";
+		reg = <0x02025000 0x1000>;
+	};
+
 	mct@10050000 {
 		compatible = "none";
 	};
diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi
index cacf6140dd2f..a3f4bba099e6 100644
--- a/arch/arm/boot/dts/exynos4210.dtsi
+++ b/arch/arm/boot/dts/exynos4210.dtsi
@@ -31,6 +31,16 @@ 
 		pinctrl2 = &pinctrl_2;
 	};
 
+	sysram@02020000 {
+		compatible = "samsung,exynos4210-sysram";
+		reg = <0x02020000 0x1000>;
+	};
+
+	sysram-ns@0203F000 {
+		compatible = "samsung,exynos4210-sysram-ns";
+		reg = <0x0203F000 0x1000>;
+	};
+
 	pd_lcd1: lcd1-power-domain@10023CA0 {
 		compatible = "samsung,exynos4210-pd";
 		reg = <0x10023CA0 0x20>;
diff --git a/arch/arm/boot/dts/exynos4x12.dtsi b/arch/arm/boot/dts/exynos4x12.dtsi
index c4a9306f8529..d57e3120223f 100644
--- a/arch/arm/boot/dts/exynos4x12.dtsi
+++ b/arch/arm/boot/dts/exynos4x12.dtsi
@@ -37,6 +37,16 @@ 
 		interrupts = <2 2>, <3 2>, <18 2>, <19 2>;
 	};
 
+	sysram@02020000 {
+		compatible = "samsung,exynos4210-sysram";
+		reg = <0x02020000 0x1000>;
+	};
+
+	sysram-ns@0204F000 {
+		compatible = "samsung,exynos4210-sysram-ns";
+		reg = <0x0204F000 0x1000>;
+	};
+
 	pd_isp: isp-power-domain@10023CA0 {
 		compatible = "samsung,exynos4210-pd";
 		reg = <0x10023CA0 0x20>;
diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
index 79d0608d6dcc..c03bd09ec37d 100644
--- a/arch/arm/boot/dts/exynos5.dtsi
+++ b/arch/arm/boot/dts/exynos5.dtsi
@@ -18,6 +18,11 @@ 
 / {
 	interrupt-parent = <&gic>;
 
+	sysram@02020000 {
+		compatible = "samsung,exynos4210-sysram";
+		reg = <0x02020000 0x1000>;
+	};
+
 	chipid@10000000 {
 		compatible = "samsung,exynos4210-chipid";
 		reg = <0x10000000 0x100>;
diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi
index 37423314a028..bae6c3f253f0 100644
--- a/arch/arm/boot/dts/exynos5250.dtsi
+++ b/arch/arm/boot/dts/exynos5250.dtsi
@@ -72,6 +72,11 @@ 
 		};
 	};
 
+	sysram-ns@0204F000 {
+		compatible = "samsung,exynos4210-sysram-ns";
+		reg = <0x0204F000 0x1000>;
+	};
+
 	pd_gsc: gsc-power-domain@10044000 {
 		compatible = "samsung,exynos4210-pd";
 		reg = <0x10044000 0x20>;
diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi
index c3a9a66c5767..217376fe1d82 100644
--- a/arch/arm/boot/dts/exynos5420.dtsi
+++ b/arch/arm/boot/dts/exynos5420.dtsi
@@ -110,6 +110,11 @@ 
 		};
 	};
 
+	sysram-ns@02073000 {
+		compatible = "samsung,exynos4210-sysram-ns";
+		reg = <0x02073000 0x1000>;
+	};
+
 	clock: clock-controller@10010000 {
 		compatible = "samsung,exynos5420-clock";
 		reg = <0x10010000 0x30000>;
diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c
index b32a907d021d..6a5fe18ec9b1 100644
--- a/arch/arm/mach-exynos/exynos.c
+++ b/arch/arm/mach-exynos/exynos.c
@@ -114,51 +114,6 @@  static struct map_desc exynos4_iodesc[] __initdata = {
 	},
 };
 
-static struct map_desc exynos4_iodesc0[] __initdata = {
-	{
-		.virtual	= (unsigned long)S5P_VA_SYSRAM,
-		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSRAM0),
-		.length		= SZ_4K,
-		.type		= MT_DEVICE,
-	},
-};
-
-static struct map_desc exynos4_iodesc1[] __initdata = {
-	{
-		.virtual	= (unsigned long)S5P_VA_SYSRAM,
-		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSRAM1),
-		.length		= SZ_4K,
-		.type		= MT_DEVICE,
-	},
-};
-
-static struct map_desc exynos4210_iodesc[] __initdata = {
-	{
-		.virtual	= (unsigned long)S5P_VA_SYSRAM_NS,
-		.pfn		= __phys_to_pfn(EXYNOS4210_PA_SYSRAM_NS),
-		.length		= SZ_4K,
-		.type		= MT_DEVICE,
-	},
-};
-
-static struct map_desc exynos4x12_iodesc[] __initdata = {
-	{
-		.virtual	= (unsigned long)S5P_VA_SYSRAM_NS,
-		.pfn		= __phys_to_pfn(EXYNOS4x12_PA_SYSRAM_NS),
-		.length		= SZ_4K,
-		.type		= MT_DEVICE,
-	},
-};
-
-static struct map_desc exynos5250_iodesc[] __initdata = {
-	{
-		.virtual	= (unsigned long)S5P_VA_SYSRAM_NS,
-		.pfn		= __phys_to_pfn(EXYNOS5250_PA_SYSRAM_NS),
-		.length		= SZ_4K,
-		.type		= MT_DEVICE,
-	},
-};
-
 static struct map_desc exynos5_iodesc[] __initdata = {
 	{
 		.virtual	= (unsigned long)S3C_VA_SYS,
@@ -181,11 +136,6 @@  static struct map_desc exynos5_iodesc[] __initdata = {
 		.length		= SZ_4K,
 		.type		= MT_DEVICE,
 	}, {
-		.virtual	= (unsigned long)S5P_VA_SYSRAM,
-		.pfn		= __phys_to_pfn(EXYNOS5_PA_SYSRAM),
-		.length		= SZ_4K,
-		.type		= MT_DEVICE,
-	}, {
 		.virtual	= (unsigned long)S5P_VA_CMU,
 		.pfn		= __phys_to_pfn(EXYNOS5_PA_CMU),
 		.length		= 144 * SZ_1K,
@@ -268,6 +218,44 @@  static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
 	return 1;
 }
 
+struct __sysram_desc {
+	char name[32];
+	unsigned long addr;
+};
+
+static struct __sysram_desc sysram_desc[] __initdata = {
+	{
+		.name = "samsung,exynos4210-sysram",
+		.addr = (unsigned long)S5P_VA_SYSRAM,
+	}, {
+		.name = "samsung,exynos4210-sysram-ns",
+		.addr = (unsigned long)S5P_VA_SYSRAM_NS,
+	},
+};
+
+static int __init exynos_fdt_map_sysram(unsigned long node, const char *uname,
+					int depth, void *data)
+{
+	struct map_desc iodesc;
+	__be32 *reg;
+	unsigned long len;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(sysram_desc); i++) {
+		if (of_flat_dt_is_compatible(node, sysram_desc[i].name)) {
+			reg = of_get_flat_dt_prop(node, "reg", &len);
+			if (!reg || len != (sizeof(unsigned long) * 2))
+				return -ENODEV;
+			iodesc.virtual = sysram_desc[i].addr;
+			iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
+			iodesc.length = be32_to_cpu(reg[1]);
+			iodesc.type = MT_DEVICE;
+			iotable_init(&iodesc, 1);
+		}
+	}
+	return 0;
+}
+
 /*
  * exynos_map_io
  *
@@ -280,20 +268,6 @@  static void __init exynos_map_io(void)
 
 	if (soc_is_exynos5())
 		iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
-
-	if (soc_is_exynos4210()) {
-		if (samsung_rev() == EXYNOS4210_REV_0)
-			iotable_init(exynos4_iodesc0,
-						ARRAY_SIZE(exynos4_iodesc0));
-		else
-			iotable_init(exynos4_iodesc1,
-						ARRAY_SIZE(exynos4_iodesc1));
-		iotable_init(exynos4210_iodesc, ARRAY_SIZE(exynos4210_iodesc));
-	}
-	if (soc_is_exynos4212() || soc_is_exynos4412())
-		iotable_init(exynos4x12_iodesc, ARRAY_SIZE(exynos4x12_iodesc));
-	if (soc_is_exynos5250())
-		iotable_init(exynos5250_iodesc, ARRAY_SIZE(exynos5250_iodesc));
 }
 
 void __init exynos_init_io(void)
@@ -306,6 +280,8 @@  void __init exynos_init_io(void)
 	s5p_init_cpu(S5P_VA_CHIPID);
 
 	exynos_map_io();
+
+	of_scan_flat_dt(exynos_fdt_map_sysram, NULL);
 }
 
 struct bus_type exynos_subsys = {
diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h
index 7b046b59d9ec..548269a60634 100644
--- a/arch/arm/mach-exynos/include/mach/map.h
+++ b/arch/arm/mach-exynos/include/mach/map.h
@@ -23,13 +23,6 @@ 
 
 #include <plat/map-s5p.h>
 
-#define EXYNOS4_PA_SYSRAM0		0x02025000
-#define EXYNOS4_PA_SYSRAM1		0x02020000
-#define EXYNOS5_PA_SYSRAM		0x02020000
-#define EXYNOS4210_PA_SYSRAM_NS		0x0203F000
-#define EXYNOS4x12_PA_SYSRAM_NS		0x0204F000
-#define EXYNOS5250_PA_SYSRAM_NS		0x0204F000
-
 #define EXYNOS_PA_CHIPID		0x10000000
 
 #define EXYNOS4_PA_SYSCON		0x10010000