Patchwork [U-Boot,v2] mx31: Setup AIPS registers

login
register
mail settings
Submitter Fabio Estevam
Date Feb. 29, 2012, 7:44 p.m.
Message ID <1330544699-21814-1-git-send-email-festevam@gmail.com>
Download mbox | patch
Permalink /patch/143813/
State Changes Requested
Headers show

Comments

Fabio Estevam - Feb. 29, 2012, 7:44 p.m.
Setup mx31 AIPS registers.

It was verified on a mx31pdk that without the AIPS settings it is not possible
to run audio playback.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
---
Changes since v1:
- Use CONFIG_ARCH_CPU_INIT
- Zero-out the 8 MSB of opacr4
- Confirmed that audio playback does work

 arch/arm/cpu/arm1136/mx31/generic.c       |   46 +++++++++++++++++++++++++++++
 arch/arm/include/asm/arch-mx31/imx-regs.h |   13 ++++++++
 include/configs/mx31pdk.h                 |    1 +
 3 files changed, 60 insertions(+), 0 deletions(-)
Dirk Behme - Feb. 29, 2012, 8:03 p.m.
On 29.02.2012 20:44, Fabio Estevam wrote:
> Setup mx31 AIPS registers.
>
> It was verified on a mx31pdk that without the AIPS settings it is not possible
> to run audio playback.
>
> Signed-off-by: Fabio Estevam<fabio.estevam@freescale.com>

Hmm, sorry if I missed anything because it's too late here. But:

Why now an U-Boot patch? What's about the kernel patch you sent earlier?

http://www.spinics.net/lists/arm-kernel/msg162109.html

And why don't you try to create some common parts with

http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=commitdiff;h=f2f7745825ee5f6bae5b480c8e9c6641a7ffa73b

?

Sorry again if I missed anything, best regards

Dirk

> ---
> Changes since v1:
> - Use CONFIG_ARCH_CPU_INIT
> - Zero-out the 8 MSB of opacr4
> - Confirmed that audio playback does work
>
>   arch/arm/cpu/arm1136/mx31/generic.c       |   46 +++++++++++++++++++++++++++++
>   arch/arm/include/asm/arch-mx31/imx-regs.h |   13 ++++++++
>   include/configs/mx31pdk.h                 |    1 +
>   3 files changed, 60 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/cpu/arm1136/mx31/generic.c b/arch/arm/cpu/arm1136/mx31/generic.c
> index d60afc9..a401c9a 100644
> --- a/arch/arm/cpu/arm1136/mx31/generic.c
> +++ b/arch/arm/cpu/arm1136/mx31/generic.c
> @@ -228,3 +228,49 @@ int print_cpuinfo(void)
>   	return 0;
>   }
>   #endif
> +
> +#ifdef CONFIG_ARCH_CPU_INIT
> +void init_aips(void)
> +{
> +	struct aipstz_regs *aips1, *aips2;
> +	unsigned int reg;
> +
> +	aips1 = (struct aipstz_regs *)MX31_AIPS1_BASE_ADDR;
> +	aips2 = (struct aipstz_regs *)MX31_AIPS2_BASE_ADDR;
> +
> +	/*
> +	 * Set all MPROTx to be non-bufferable, trusted for R/W,
> +	 * not forced to user-mode.
> +	 */
> +	writel(0x77777777,&aips1->mprot0);
> +	writel(0x77777777,&aips1->mprot1);
> +	writel(0x77777777,&aips2->mprot0);
> +	writel(0x77777777,&aips2->mprot1);
> +
> +	/*
> +	 * Set all OPACRx to be non-bufferable, not require
> +	 * supervisor privilege level for access, allow for
> +	 * write access and untrusted master access.
> +	 */
> +	writel(0x0,&aips1->opacr0);
> +	writel(0x0,&aips1->opacr1);
> +	writel(0x0,&aips1->opacr2);
> +	writel(0x0,&aips1->opacr3);
> +	reg = readl(&aips1->opacr4)&  0x00FFFFFF;
> +	writel(reg,&aips1->opacr4);
> +
> +	writel(0x0,&aips2->opacr0);
> +	writel(0x0,&aips2->opacr1);
> +	writel(0x0,&aips2->opacr2);
> +	writel(0x0,&aips2->opacr3);
> +	reg = readl(&aips2->opacr4)&  0x00FFFFFF;
> +	writel(reg,&aips2->opacr4);
> +}
> +
> +int arch_cpu_init(void)
> +{
> +	init_aips();
> +
> +	return 0;
> +}
> +#endif
> diff --git a/arch/arm/include/asm/arch-mx31/imx-regs.h b/arch/arm/include/asm/arch-mx31/imx-regs.h
> index 6454acb..11069af 100644
> --- a/arch/arm/include/asm/arch-mx31/imx-regs.h
> +++ b/arch/arm/include/asm/arch-mx31/imx-regs.h
> @@ -539,6 +539,18 @@ struct esdc_regs {
>   	u32 dlyl;
>   };
>
> +/* AIPS registers */
> +struct aipstz_regs {
> +	u32	mprot0;
> +	u32	mprot1;
> +	u32	rsvd[0xe];
> +	u32	opacr0;
> +	u32	opacr1;
> +	u32	opacr2;
> +	u32	opacr3;
> +	u32	opacr4;
> +};
> +
>   #endif
>
>   #define __REG(x)     (*((volatile u32 *)(x)))
> @@ -873,6 +885,7 @@ struct esdc_regs {
>   #define IRAM_SIZE	(16 * 1024)
>
>   #define MX31_AIPS1_BASE_ADDR	0x43f00000
> +#define MX31_AIPS2_BASE_ADDR	0x53f00000
>   #define IMX_USB_BASE		(MX31_AIPS1_BASE_ADDR + 0x88000)
>
>   /* USB portsc */
> diff --git a/include/configs/mx31pdk.h b/include/configs/mx31pdk.h
> index 4da6020..623b1f7 100644
> --- a/include/configs/mx31pdk.h
> +++ b/include/configs/mx31pdk.h
> @@ -40,6 +40,7 @@
>
>   #define CONFIG_DISPLAY_CPUINFO
>   #define CONFIG_DISPLAY_BOARDINFO
> +#define CONFIG_ARCH_CPU_INIT
>
>   #define CONFIG_CMDLINE_TAG			/* enable passing of ATAGs */
>   #define CONFIG_SETUP_MEMORY_TAGS
Fabio Estevam - Feb. 29, 2012, 8:56 p.m.
On Wed, Feb 29, 2012 at 5:03 PM, Dirk Behme <dirk.behme@googlemail.com> wrote:

> Hmm, sorry if I missed anything because it's too late here. But:
>
> Why now an U-Boot patch? What's about the kernel patch you sent earlier?
>
> http://www.spinics.net/lists/arm-kernel/msg162109.html

The motivation for this patch came after I was debugging audio
playback on mx31pdk.

I noticed that audio only worked when I used Redboot.

Comparing the sources of Redboot and U-boot I saw that the aips
registers were not set.

Setting them in U-boot allowed me to get audio playback working.

Why did I send the aips setting to the kernel? Well, it is not always
possible for customers to change the bootloader.

In case the bootloader does not set aips, then this should be done in
the kernel.

You can also think on the possibility of someone using the mainline
U-boot with a kernel that does not set aips, so the safest thing is to
have such settings in the bootloader and in the kernel.

>
> And why don't you try to create some common parts with
>
> http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=commitdiff;h=f2f7745825ee5f6bae5b480c8e9c6641a7ffa73b

I thought about that, but I realized the AIPS settings were not
exactly the same. My main goal at this point was to get the aips
settings in mx31, but I can work on factoring out this code later.

Regards,

Fabio Estevam
Dirk Behme - March 1, 2012, 6:30 a.m.
On 29.02.2012 21:56, Fabio Estevam wrote:
> On Wed, Feb 29, 2012 at 5:03 PM, Dirk Behme <dirk.behme@googlemail.com> wrote:
> 
>> Hmm, sorry if I missed anything because it's too late here. But:
>>
>> Why now an U-Boot patch? What's about the kernel patch you sent earlier?
>>
>> http://www.spinics.net/lists/arm-kernel/msg162109.html
> 
> The motivation for this patch came after I was debugging audio
> playback on mx31pdk.
> 
> I noticed that audio only worked when I used Redboot.
> 
> Comparing the sources of Redboot and U-boot I saw that the aips
> registers were not set.
> 
> Setting them in U-boot allowed me to get audio playback working.
> 
> Why did I send the aips setting to the kernel? Well, it is not always
> possible for customers to change the bootloader.
> 
> In case the bootloader does not set aips, then this should be done in
> the kernel.
> 
> You can also think on the possibility of someone using the mainline
> U-boot with a kernel that does not set aips, so the safest thing is to
> have such settings in the bootloader and in the kernel.

Ah, thanks for the explanation! :)

This does mean that you want the change in both, U-Boot and kernel, correct?

>> And why don't you try to create some common parts with
>>
>> http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=commitdiff;h=f2f7745825ee5f6bae5b480c8e9c6641a7ffa73b
> 
> I thought about that, but I realized the AIPS settings were not
> exactly the same. My main goal at this point was to get the aips
> settings in mx31, but I can work on factoring out this code later.

Yes, we definitely should look at which parts are common. I haven't 
looked at the details, but at least the register definitions [1] are the 
same?

Best regards

Dirk

[1]

+/* AIPS registers */
+struct aipstz_regs {
+	u32	mprot0;
+	u32	mprot1;
+	u32	rsvd[0xe];
+	u32	opacr0;
+	u32	opacr1;
+	u32	opacr2;
+	u32	opacr3;
+	u32	opacr4;
+};
+
Fabio Estevam - March 1, 2012, 12:29 p.m.
On Thu, Mar 1, 2012 at 3:30 AM, Dirk Behme <dirk.behme@de.bosch.com> wrote:

> Ah, thanks for the explanation! :)
>
> This does mean that you want the change in both, U-Boot and kernel, correct?

Correct.

> Yes, we definitely should look at which parts are common. I haven't looked
> at the details, but at least the register definitions [1] are the same?

Yes, I can write a common code for this.

1. The aips register definitions:

/* AIPS registers */
struct aipstz_regs {
	u32	mprot0;
	u32	mprot1;
	u32	rsvd[0xe];
	u32	opacr0;
	u32	opacr1;
	u32	opacr2;
	u32	opacr3;
       u32	opacr4;
};

should be present in each imx-regs.h file (for mx31/35/51/53/6), right?

Or is there a common .h file I could use for placing it in just one location?

2. What would be a good location for putting the common imx_init_aips function?

Regards,

Fabio Estevam
Stefano Babic - March 3, 2012, 9:59 a.m.
On 01/03/2012 13:29, Fabio Estevam wrote:
> On Thu, Mar 1, 2012 at 3:30 AM, Dirk Behme <dirk.behme@de.bosch.com> wrote:
> 
>> Ah, thanks for the explanation! :)
>>
>> This does mean that you want the change in both, U-Boot and kernel, correct?
> 
> Correct.
> 
>> Yes, we definitely should look at which parts are common. I haven't looked
>> at the details, but at least the register definitions [1] are the same?
> 
> Yes, I can write a common code for this.
> 
> 1. The aips register definitions:
> 
> /* AIPS registers */
> struct aipstz_regs {
> 	u32	mprot0;
> 	u32	mprot1;
> 	u32	rsvd[0xe];
> 	u32	opacr0;
> 	u32	opacr1;
> 	u32	opacr2;
> 	u32	opacr3;
>        u32	opacr4;
> };
> 
> should be present in each imx-regs.h file (for mx31/35/51/53/6), right?
> 
> Or is there a common .h file I could use for placing it in just one location?

There is not, but I am also coming to the conclusion that we need some
sort of common files, exactly as the kernel does with plat-imx. Maybe in
arch/arm/include/asm/plat-imx ? Then all imx-regs.h must include the
common file. I am sure we will add them more things, because there are
several parts that are still duplicated in code.

Best regards,
Stefano Babic

Patch

diff --git a/arch/arm/cpu/arm1136/mx31/generic.c b/arch/arm/cpu/arm1136/mx31/generic.c
index d60afc9..a401c9a 100644
--- a/arch/arm/cpu/arm1136/mx31/generic.c
+++ b/arch/arm/cpu/arm1136/mx31/generic.c
@@ -228,3 +228,49 @@  int print_cpuinfo(void)
 	return 0;
 }
 #endif
+
+#ifdef CONFIG_ARCH_CPU_INIT
+void init_aips(void)
+{
+	struct aipstz_regs *aips1, *aips2;
+	unsigned int reg;
+
+	aips1 = (struct aipstz_regs *)MX31_AIPS1_BASE_ADDR;
+	aips2 = (struct aipstz_regs *)MX31_AIPS2_BASE_ADDR;
+
+	/*
+	 * Set all MPROTx to be non-bufferable, trusted for R/W,
+	 * not forced to user-mode.
+	 */
+	writel(0x77777777, &aips1->mprot0);
+	writel(0x77777777, &aips1->mprot1);
+	writel(0x77777777, &aips2->mprot0);
+	writel(0x77777777, &aips2->mprot1);
+
+	/*
+	 * Set all OPACRx to be non-bufferable, not require
+	 * supervisor privilege level for access, allow for
+	 * write access and untrusted master access.
+	 */
+	writel(0x0, &aips1->opacr0);
+	writel(0x0, &aips1->opacr1);
+	writel(0x0, &aips1->opacr2);
+	writel(0x0, &aips1->opacr3);
+	reg = readl(&aips1->opacr4) & 0x00FFFFFF;
+	writel(reg, &aips1->opacr4);
+
+	writel(0x0, &aips2->opacr0);
+	writel(0x0, &aips2->opacr1);
+	writel(0x0, &aips2->opacr2);
+	writel(0x0, &aips2->opacr3);
+	reg = readl(&aips2->opacr4) & 0x00FFFFFF;
+	writel(reg, &aips2->opacr4);
+}
+
+int arch_cpu_init(void)
+{
+	init_aips();
+
+	return 0;
+}
+#endif
diff --git a/arch/arm/include/asm/arch-mx31/imx-regs.h b/arch/arm/include/asm/arch-mx31/imx-regs.h
index 6454acb..11069af 100644
--- a/arch/arm/include/asm/arch-mx31/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx31/imx-regs.h
@@ -539,6 +539,18 @@  struct esdc_regs {
 	u32 dlyl;
 };
 
+/* AIPS registers */
+struct aipstz_regs {
+	u32	mprot0;
+	u32	mprot1;
+	u32	rsvd[0xe];
+	u32	opacr0;
+	u32	opacr1;
+	u32	opacr2;
+	u32	opacr3;
+	u32	opacr4;
+};
+
 #endif
 
 #define __REG(x)     (*((volatile u32 *)(x)))
@@ -873,6 +885,7 @@  struct esdc_regs {
 #define IRAM_SIZE	(16 * 1024)
 
 #define MX31_AIPS1_BASE_ADDR	0x43f00000
+#define MX31_AIPS2_BASE_ADDR	0x53f00000
 #define IMX_USB_BASE		(MX31_AIPS1_BASE_ADDR + 0x88000)
 
 /* USB portsc */
diff --git a/include/configs/mx31pdk.h b/include/configs/mx31pdk.h
index 4da6020..623b1f7 100644
--- a/include/configs/mx31pdk.h
+++ b/include/configs/mx31pdk.h
@@ -40,6 +40,7 @@ 
 
 #define CONFIG_DISPLAY_CPUINFO
 #define CONFIG_DISPLAY_BOARDINFO
+#define CONFIG_ARCH_CPU_INIT
 
 #define CONFIG_CMDLINE_TAG			/* enable passing of ATAGs */
 #define CONFIG_SETUP_MEMORY_TAGS