diff mbox

[U-Boot,V2,4/7] video: exynos_fimd: Add framework to disable FIMD sysmmu

Message ID 1384259240-7829-5-git-send-email-ajaykumar.rs@samsung.com
State Changes Requested
Delegated to: Minkyu Kang
Headers show

Commit Message

Ajay Kumar Nov. 12, 2013, 12:27 p.m. UTC
On Exynos5420 and newer versions, the FIMD sysmmus are in
"on state" by default.
We have to disable them in order to make FIMD DMA work.
This patch adds the required framework to exynos_fimd driver,
and disables FIMD sysmmu on Exynos5420.

Signed-off-by: Ajay Kumar <ajaykumar.rs@samsung.com>
---
 arch/arm/dts/exynos5420.dtsi                 |  7 +++++++
 doc/device-tree-bindings/video/exynos-fb.txt |  4 ++++
 drivers/video/exynos_fimd.c                  | 24 ++++++++++++++++++++++++
 3 files changed, 35 insertions(+)

Comments

Simon Glass Dec. 19, 2013, 8:39 p.m. UTC | #1
Hi Ajay,

On 12 November 2013 05:27, Ajay Kumar <ajaykumar.rs@samsung.com> wrote:
> On Exynos5420 and newer versions, the FIMD sysmmus are in
> "on state" by default.
> We have to disable them in order to make FIMD DMA work.
> This patch adds the required framework to exynos_fimd driver,
> and disables FIMD sysmmu on Exynos5420.
>
> Signed-off-by: Ajay Kumar <ajaykumar.rs@samsung.com>

Acked-by: Simon Glass <sjg@chromium.org>

See a nit below if you re-issue this series.

> ---
>  arch/arm/dts/exynos5420.dtsi                 |  7 +++++++
>  doc/device-tree-bindings/video/exynos-fb.txt |  4 ++++
>  drivers/video/exynos_fimd.c                  | 24 ++++++++++++++++++++++++
>  3 files changed, 35 insertions(+)
>
> diff --git a/arch/arm/dts/exynos5420.dtsi b/arch/arm/dts/exynos5420.dtsi
> index ca6c605..7443953 100644
> --- a/arch/arm/dts/exynos5420.dtsi
> +++ b/arch/arm/dts/exynos5420.dtsi
> @@ -71,4 +71,11 @@
>                 reg = <0x12E20000 0x100>;
>                 interrupts = <0 203 0>;
>         };
> +
> +       fimd@14400000 {
> +               /* sysmmu is not used in U-Boot */
> +               samsung,disable-sysmmu;
> +               samsung,sysmmu-fimdm0 = <0x14640000>;
> +               samsung,sysmmu-fimdm1 = <0x14680000>;
> +       };
>  };
> diff --git a/doc/device-tree-bindings/video/exynos-fb.txt b/doc/device-tree-bindings/video/exynos-fb.txt
> index bb7441c..9ba2c47 100644
> --- a/doc/device-tree-bindings/video/exynos-fb.txt
> +++ b/doc/device-tree-bindings/video/exynos-fb.txt
> @@ -55,6 +55,10 @@ Board(panel specific):
>         samsung,pclk-name: parent clock identifier: 1(MPLL), 2(EPLL), 3(VPLL)
>         samsung,sclk-div: parent_clock/source_clock ratio
>         samsung,dual-lcd-enabled: 1 if you support two LCD, else 0
> +       samsung,disable-sysmmu: present if you want to disable the sysmmu
> +                       (needed for Exynos5420 and newer versions)
> +       samsung,sysmmu-fimdm0: Address of sysmmufimdm0 MMU_CTRL
> +       samsung,sysmmu-fimdm1: Address of sysmmufimdm1 MMU_CTRL

Is this a kernel binding?

>
>  Example:
>  SOC specific part:
> diff --git a/drivers/video/exynos_fimd.c b/drivers/video/exynos_fimd.c
> index f962c4f..bffc8fa 100644
> --- a/drivers/video/exynos_fimd.c
> +++ b/drivers/video/exynos_fimd.c
> @@ -257,6 +257,7 @@ void exynos_fimd_lcd_init(vidinfo_t *vid)
>         unsigned int offset;
>  #ifdef CONFIG_OF_CONTROL
>         unsigned int node;
> +       u32 *sysmmufimdm0, *sysmmufimdm1;
>
>         node = fdtdec_next_compatible(gd->fdt_blob,
>                                         0, COMPAT_SAMSUNG_EXYNOS_FIMD);
> @@ -267,6 +268,29 @@ void exynos_fimd_lcd_init(vidinfo_t *vid)
>                                                                 node, "reg");
>         if (fimd_ctrl == NULL)
>                 debug("Can't get the FIMD base address\n");
> +
> +       if (fdtdec_get_bool(gd->fdt_blob, node, "samsung,disable-sysmmu")) {
> +               /*
> +               * The reset value for FIMD SYSMMU register MMU_CTRL is 3
> +               * on Exynos5420 and newer versions.
> +               * This means FIMD SYSMMU is on by default on Exynos5420
> +               * and newer versions.
> +               * Since in u-boot we don't use SYSMMU, we should disable
> +               * those FIMD SYSMMU.
> +               */
> +               sysmmufimdm0 = (u32 *)fdtdec_get_int(gd->fdt_blob, node,
> +                                               "samsung,sysmmu-fimdm0", 0);

fdtdec_get_addr() might be better.

> +               if (!sysmmufimdm0)
> +                       debug("Can't get sysmmufimdm0");
> +
> +               sysmmufimdm1 = (u32 *)fdtdec_get_int(gd->fdt_blob, node,
> +                                               "samsung,sysmmu-fimdm1", 0);
> +               if (!sysmmufimdm1)
> +                       debug("Can't get sysmmufimdm1");
> +
> +               writel(0x0, sysmmufimdm0);
> +               writel(0x0, sysmmufimdm1);
> +       }
>  #else
>         fimd_ctrl = (struct exynos_fb *)samsung_get_base_fimd();
>  #endif
> --
> 1.7.12.4
>

Regards,
Simon
Ajay kumar Dec. 20, 2013, 9:04 a.m. UTC | #2
Hi Simon,
>
>
> On Fri, Dec 20, 2013 at 2:09 AM, Simon Glass <sjg@chromium.org> wrote:
>
>> Hi Ajay,
>>
>> On 12 November 2013 05:27, Ajay Kumar <ajaykumar.rs@samsung.com> wrote:
>> > On Exynos5420 and newer versions, the FIMD sysmmus are in
>> > "on state" by default.
>> > We have to disable them in order to make FIMD DMA work.
>> > This patch adds the required framework to exynos_fimd driver,
>> > and disables FIMD sysmmu on Exynos5420.
>> >
>> > Signed-off-by: Ajay Kumar <ajaykumar.rs@samsung.com>
>>
>> Acked-by: Simon Glass <sjg@chromium.org>
>>
>> See a nit below if you re-issue this series.
>>
>> > ---
>> >  arch/arm/dts/exynos5420.dtsi                 |  7 +++++++
>> >  doc/device-tree-bindings/video/exynos-fb.txt |  4 ++++
>> >  drivers/video/exynos_fimd.c                  | 24
>> ++++++++++++++++++++++++
>> >  3 files changed, 35 insertions(+)
>> >
>> > diff --git a/arch/arm/dts/exynos5420.dtsi b/arch/arm/dts/exynos5420.dtsi
>> > index ca6c605..7443953 100644
>> > --- a/arch/arm/dts/exynos5420.dtsi
>> > +++ b/arch/arm/dts/exynos5420.dtsi
>> > @@ -71,4 +71,11 @@
>> >                 reg = <0x12E20000 0x100>;
>> >                 interrupts = <0 203 0>;
>> >         };
>> > +
>> > +       fimd@14400000 {
>> > +               /* sysmmu is not used in U-Boot */
>> > +               samsung,disable-sysmmu;
>> > +               samsung,sysmmu-fimdm0 = <0x14640000>;
>> > +               samsung,sysmmu-fimdm1 = <0x14680000>;
>> > +       };
>> >  };
>> > diff --git a/doc/device-tree-bindings/video/exynos-fb.txt
>> b/doc/device-tree-bindings/video/exynos-fb.txt
>> > index bb7441c..9ba2c47 100644
>> > --- a/doc/device-tree-bindings/video/exynos-fb.txt
>> > +++ b/doc/device-tree-bindings/video/exynos-fb.txt
>> > @@ -55,6 +55,10 @@ Board(panel specific):
>> >         samsung,pclk-name: parent clock identifier: 1(MPLL), 2(EPLL),
>> 3(VPLL)
>> >         samsung,sclk-div: parent_clock/source_clock ratio
>> >         samsung,dual-lcd-enabled: 1 if you support two LCD, else 0
>> > +       samsung,disable-sysmmu: present if you want to disable the
>> sysmmu
>> > +                       (needed for Exynos5420 and newer versions)
>> > +       samsung,sysmmu-fimdm0: Address of sysmmufimdm0 MMU_CTRL
>> > +       samsung,sysmmu-fimdm1: Address of sysmmufimdm1 MMU_CTRL
>>
>> Is this a kernel binding?
>>
>> No. In kernel, we have DT nodes for FIMD symmus as well.
> How about creating FIMD sysmmu nodes in u-boot as well and use them inside
> exynos_fimd.c, rather than giving the sysmmu base addresses as a FIMD DT
> property?
>
>> >
>> >  Example:
>> >  SOC specific part:
>> > diff --git a/drivers/video/exynos_fimd.c b/drivers/video/exynos_fimd.c
>> > index f962c4f..bffc8fa 100644
>> > --- a/drivers/video/exynos_fimd.c
>> > +++ b/drivers/video/exynos_fimd.c
>> > @@ -257,6 +257,7 @@ void exynos_fimd_lcd_init(vidinfo_t *vid)
>> >         unsigned int offset;
>> >  #ifdef CONFIG_OF_CONTROL
>> >         unsigned int node;
>> > +       u32 *sysmmufimdm0, *sysmmufimdm1;
>> >
>> >         node = fdtdec_next_compatible(gd->fdt_blob,
>> >                                         0, COMPAT_SAMSUNG_EXYNOS_FIMD);
>> > @@ -267,6 +268,29 @@ void exynos_fimd_lcd_init(vidinfo_t *vid)
>> >                                                                 node,
>> "reg");
>> >         if (fimd_ctrl == NULL)
>> >                 debug("Can't get the FIMD base address\n");
>> > +
>> > +       if (fdtdec_get_bool(gd->fdt_blob, node,
>> "samsung,disable-sysmmu")) {
>> > +               /*
>> > +               * The reset value for FIMD SYSMMU register MMU_CTRL is 3
>> > +               * on Exynos5420 and newer versions.
>> > +               * This means FIMD SYSMMU is on by default on Exynos5420
>> > +               * and newer versions.
>> > +               * Since in u-boot we don't use SYSMMU, we should disable
>> > +               * those FIMD SYSMMU.
>> > +               */
>> > +               sysmmufimdm0 = (u32 *)fdtdec_get_int(gd->fdt_blob, node,
>> > +
>> "samsung,sysmmu-fimdm0", 0);
>>
>> fdtdec_get_addr() might be better.
>
>
>> > +               if (!sysmmufimdm0)
>> > +                       debug("Can't get sysmmufimdm0");
>> > +
>> > +               sysmmufimdm1 = (u32 *)fdtdec_get_int(gd->fdt_blob, node,
>> > +
>> "samsung,sysmmu-fimdm1", 0);
>> > +               if (!sysmmufimdm1)
>> > +                       debug("Can't get sysmmufimdm1");
>> > +
>> > +               writel(0x0, sysmmufimdm0);
>> > +               writel(0x0, sysmmufimdm1);
>> > +       }
>> >  #else
>> >         fimd_ctrl = (struct exynos_fb *)samsung_get_base_fimd();
>> >  #endif
>> > --
>> > 1.7.12.4
>> >
>>
>> Regards,
>> Simon
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot@lists.denx.de
>> http://lists.denx.de/mailman/listinfo/u-boot
>>
>
>
> Thanks and Regards,
> Ajay
>
>
Simon Glass Dec. 20, 2013, 4:27 p.m. UTC | #3
Hi Ajay,

On 20 December 2013 02:04, Ajay kumar <ajaynumb@gmail.com> wrote:
>
>
>> Hi Simon,
>>
>>
>> On Fri, Dec 20, 2013 at 2:09 AM, Simon Glass <sjg@chromium.org> wrote:
>>>
>>> Hi Ajay,
>>>
>>> On 12 November 2013 05:27, Ajay Kumar <ajaykumar.rs@samsung.com> wrote:
>>> > On Exynos5420 and newer versions, the FIMD sysmmus are in
>>> > "on state" by default.
>>> > We have to disable them in order to make FIMD DMA work.
>>> > This patch adds the required framework to exynos_fimd driver,
>>> > and disables FIMD sysmmu on Exynos5420.
>>> >
>>> > Signed-off-by: Ajay Kumar <ajaykumar.rs@samsung.com>
>>>
>>> Acked-by: Simon Glass <sjg@chromium.org>
>>>
>>> See a nit below if you re-issue this series.
>>>
>>> > ---
>>> >  arch/arm/dts/exynos5420.dtsi                 |  7 +++++++
>>> >  doc/device-tree-bindings/video/exynos-fb.txt |  4 ++++
>>> >  drivers/video/exynos_fimd.c                  | 24
>>> > ++++++++++++++++++++++++
>>> >  3 files changed, 35 insertions(+)
>>> >
>>> > diff --git a/arch/arm/dts/exynos5420.dtsi
>>> > b/arch/arm/dts/exynos5420.dtsi
>>> > index ca6c605..7443953 100644
>>> > --- a/arch/arm/dts/exynos5420.dtsi
>>> > +++ b/arch/arm/dts/exynos5420.dtsi
>>> > @@ -71,4 +71,11 @@
>>> >                 reg = <0x12E20000 0x100>;
>>> >                 interrupts = <0 203 0>;
>>> >         };
>>> > +
>>> > +       fimd@14400000 {
>>> > +               /* sysmmu is not used in U-Boot */
>>> > +               samsung,disable-sysmmu;
>>> > +               samsung,sysmmu-fimdm0 = <0x14640000>;
>>> > +               samsung,sysmmu-fimdm1 = <0x14680000>;
>>> > +       };
>>> >  };
>>> > diff --git a/doc/device-tree-bindings/video/exynos-fb.txt
>>> > b/doc/device-tree-bindings/video/exynos-fb.txt
>>> > index bb7441c..9ba2c47 100644
>>> > --- a/doc/device-tree-bindings/video/exynos-fb.txt
>>> > +++ b/doc/device-tree-bindings/video/exynos-fb.txt
>>> > @@ -55,6 +55,10 @@ Board(panel specific):
>>> >         samsung,pclk-name: parent clock identifier: 1(MPLL), 2(EPLL),
>>> > 3(VPLL)
>>> >         samsung,sclk-div: parent_clock/source_clock ratio
>>> >         samsung,dual-lcd-enabled: 1 if you support two LCD, else 0
>>> > +       samsung,disable-sysmmu: present if you want to disable the
>>> > sysmmu
>>> > +                       (needed for Exynos5420 and newer versions)
>>> > +       samsung,sysmmu-fimdm0: Address of sysmmufimdm0 MMU_CTRL
>>> > +       samsung,sysmmu-fimdm1: Address of sysmmufimdm1 MMU_CTRL
>>>
>>> Is this a kernel binding?
>>>
>> No. In kernel, we have DT nodes for FIMD symmus as well.
>> How about creating FIMD sysmmu nodes in u-boot as well and use them inside
>> exynos_fimd.c, rather than giving the sysmmu base addresses as a FIMD DT
>> property?

That does seem better. We should be careful about creating new
bindings that don't exist in the kernel.

>>>
>>> >
>>> >  Example:
>>> >  SOC specific part:
>>> > diff --git a/drivers/video/exynos_fimd.c b/drivers/video/exynos_fimd.c
>>> > index f962c4f..bffc8fa 100644
>>> > --- a/drivers/video/exynos_fimd.c
>>> > +++ b/drivers/video/exynos_fimd.c
>>> > @@ -257,6 +257,7 @@ void exynos_fimd_lcd_init(vidinfo_t *vid)
>>> >         unsigned int offset;
>>> >  #ifdef CONFIG_OF_CONTROL
>>> >         unsigned int node;
>>> > +       u32 *sysmmufimdm0, *sysmmufimdm1;
>>> >
>>> >         node = fdtdec_next_compatible(gd->fdt_blob,
>>> >                                         0, COMPAT_SAMSUNG_EXYNOS_FIMD);
>>> > @@ -267,6 +268,29 @@ void exynos_fimd_lcd_init(vidinfo_t *vid)
>>> >                                                                 node,
>>> > "reg");
>>> >         if (fimd_ctrl == NULL)
>>> >                 debug("Can't get the FIMD base address\n");
>>> > +
>>> > +       if (fdtdec_get_bool(gd->fdt_blob, node,
>>> > "samsung,disable-sysmmu")) {
>>> > +               /*
>>> > +               * The reset value for FIMD SYSMMU register MMU_CTRL is
>>> > 3
>>> > +               * on Exynos5420 and newer versions.
>>> > +               * This means FIMD SYSMMU is on by default on Exynos5420
>>> > +               * and newer versions.
>>> > +               * Since in u-boot we don't use SYSMMU, we should
>>> > disable
>>> > +               * those FIMD SYSMMU.
>>> > +               */
>>> > +               sysmmufimdm0 = (u32 *)fdtdec_get_int(gd->fdt_blob,
>>> > node,
>>> > +
>>> > "samsung,sysmmu-fimdm0", 0);
>>>
>>> fdtdec_get_addr() might be better.
>>>
>>>
>>> > +               if (!sysmmufimdm0)
>>> > +                       debug("Can't get sysmmufimdm0");
>>> > +
>>> > +               sysmmufimdm1 = (u32 *)fdtdec_get_int(gd->fdt_blob,
>>> > node,
>>> > +
>>> > "samsung,sysmmu-fimdm1", 0);
>>> > +               if (!sysmmufimdm1)
>>> > +                       debug("Can't get sysmmufimdm1");
>>> > +
>>> > +               writel(0x0, sysmmufimdm0);
>>> > +               writel(0x0, sysmmufimdm1);
>>> > +       }
>>> >  #else
>>> >         fimd_ctrl = (struct exynos_fb *)samsung_get_base_fimd();
>>> >  #endif
>>> > --
>>> > 1.7.12.4
>>> >
>>>
>>> Regards,
>>> Simon
>>> _______________________________________________
>>> U-Boot mailing list
>>> U-Boot@lists.denx.de
>>> http://lists.denx.de/mailman/listinfo/u-boot
>>
>>
>>
>> Thanks and Regards,
>> Ajay
>>
>

Regards,
Simon
diff mbox

Patch

diff --git a/arch/arm/dts/exynos5420.dtsi b/arch/arm/dts/exynos5420.dtsi
index ca6c605..7443953 100644
--- a/arch/arm/dts/exynos5420.dtsi
+++ b/arch/arm/dts/exynos5420.dtsi
@@ -71,4 +71,11 @@ 
 		reg = <0x12E20000 0x100>;
 		interrupts = <0 203 0>;
 	};
+
+	fimd@14400000 {
+		/* sysmmu is not used in U-Boot */
+		samsung,disable-sysmmu;
+		samsung,sysmmu-fimdm0 = <0x14640000>;
+		samsung,sysmmu-fimdm1 = <0x14680000>;
+	};
 };
diff --git a/doc/device-tree-bindings/video/exynos-fb.txt b/doc/device-tree-bindings/video/exynos-fb.txt
index bb7441c..9ba2c47 100644
--- a/doc/device-tree-bindings/video/exynos-fb.txt
+++ b/doc/device-tree-bindings/video/exynos-fb.txt
@@ -55,6 +55,10 @@  Board(panel specific):
 	samsung,pclk-name: parent clock identifier: 1(MPLL), 2(EPLL), 3(VPLL)
 	samsung,sclk-div: parent_clock/source_clock ratio
 	samsung,dual-lcd-enabled: 1 if you support two LCD, else 0
+	samsung,disable-sysmmu: present if you want to disable the sysmmu
+			(needed for Exynos5420 and newer versions)
+	samsung,sysmmu-fimdm0: Address of sysmmufimdm0 MMU_CTRL
+	samsung,sysmmu-fimdm1: Address of sysmmufimdm1 MMU_CTRL
 
 Example:
 SOC specific part:
diff --git a/drivers/video/exynos_fimd.c b/drivers/video/exynos_fimd.c
index f962c4f..bffc8fa 100644
--- a/drivers/video/exynos_fimd.c
+++ b/drivers/video/exynos_fimd.c
@@ -257,6 +257,7 @@  void exynos_fimd_lcd_init(vidinfo_t *vid)
 	unsigned int offset;
 #ifdef CONFIG_OF_CONTROL
 	unsigned int node;
+	u32 *sysmmufimdm0, *sysmmufimdm1;
 
 	node = fdtdec_next_compatible(gd->fdt_blob,
 					0, COMPAT_SAMSUNG_EXYNOS_FIMD);
@@ -267,6 +268,29 @@  void exynos_fimd_lcd_init(vidinfo_t *vid)
 								node, "reg");
 	if (fimd_ctrl == NULL)
 		debug("Can't get the FIMD base address\n");
+
+	if (fdtdec_get_bool(gd->fdt_blob, node, "samsung,disable-sysmmu")) {
+		/*
+		* The reset value for FIMD SYSMMU register MMU_CTRL is 3
+		* on Exynos5420 and newer versions.
+		* This means FIMD SYSMMU is on by default on Exynos5420
+		* and newer versions.
+		* Since in u-boot we don't use SYSMMU, we should disable
+		* those FIMD SYSMMU.
+		*/
+		sysmmufimdm0 = (u32 *)fdtdec_get_int(gd->fdt_blob, node,
+						"samsung,sysmmu-fimdm0", 0);
+		if (!sysmmufimdm0)
+			debug("Can't get sysmmufimdm0");
+
+		sysmmufimdm1 = (u32 *)fdtdec_get_int(gd->fdt_blob, node,
+						"samsung,sysmmu-fimdm1", 0);
+		if (!sysmmufimdm1)
+			debug("Can't get sysmmufimdm1");
+
+		writel(0x0, sysmmufimdm0);
+		writel(0x0, sysmmufimdm1);
+	}
 #else
 	fimd_ctrl = (struct exynos_fb *)samsung_get_base_fimd();
 #endif