All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
To: Gregory CLEMENT <gregory.clement@free-electrons.com>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	linux-pm@vger.kernel.org, Jason Cooper <jason@lakedaemon.net>,
	Andrew Lunn <andrew@lunn.ch>,
	Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>,
	Lior Amsalem <alior@marvell.com>,
	Tawfik Bayouk <tawfik@marvell.com>,
	Nadav Haklai <nadavh@marvell.com>,
	Ezequiel Garcia <ezequiel.garcia@free-electrons.com>,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 02/16] ARM: mvebu: Add a common function for the boot address work around
Date: Tue, 1 Jul 2014 16:34:28 +0200	[thread overview]
Message-ID: <20140701163428.23408c9d@free-electrons.com> (raw)
In-Reply-To: <1403875377-940-3-git-send-email-gregory.clement@free-electrons.com>

Dear Gregory CLEMENT,

On Fri, 27 Jun 2014 15:22:43 +0200, Gregory CLEMENT wrote:

> +extern unsigned char mvebu_boot_wa_start;
> +extern unsigned char mvebu_boot_wa_end;
> +
> +void mvebu_boot_addr_wa(int crypto_eng_id, u32 resume_addr_reg)
> +{
> +	void __iomem *sram_virt_base;
> +	u32 code_len = &mvebu_boot_wa_end - &mvebu_boot_wa_start;
> +
> +	mvebu_mbus_del_window(BOOTROM_BASE, BOOTROM_SIZE);
> +	mvebu_mbus_add_window_by_id(crypto_eng_id, CRYPT0_ENG_ATTR,
> +				SRAM_PHYS_BASE, SZ_64K);
> +	sram_virt_base = ioremap(SRAM_PHYS_BASE, SZ_64K);
> +
> +
> +	memcpy(sram_virt_base, &mvebu_boot_wa_start, code_len);
> +	/*
> +	 * The last word of the code copied in SRAM must contain the
> +	 * physical base address of the PMSU register
> +	 */
> +	*(unsigned long *)(sram_virt_base + code_len - 4) = resume_addr_reg;

Contrary to what I said, use __raw_writel() and not writel() here, to
keep the native endianness of the system when writing the value:

diff --git a/arch/arm/mach-mvebu/pmsu.c b/arch/arm/mach-mvebu/pmsu.c
index 9c56f8c..2b37e01 100644
--- a/arch/arm/mach-mvebu/pmsu.c
+++ b/arch/arm/mach-mvebu/pmsu.c
@@ -135,9 +135,11 @@ void mvebu_boot_addr_wa(int crypto_eng_id, u32 resume_addr_reg)
        memcpy(sram_virt_base, &mvebu_boot_wa_start, code_len);
        /*
         * The last word of the code copied in SRAM must contain the
-        * physical base address of the PMSU register
+        * physical base address of the PMSU register. We
+        * intentionally store this address in the native endianness
+        * of the system.
         */
-       *(unsigned long *)(sram_virt_base + code_len - 4) = resume_addr_reg;
+       __raw_writel(resume_addr_reg, sram_virt_base + code_len - 4);
 }

> +.global mvebu_boot_wa_start
> +.global mvebu_boot_wa_end
> +
> +/* The following code will be executed from SRAM */
> +ENTRY(mvebu_boot_wa_start)
> +mvebu_boot_wa_start:
> +/* use physical address of the boot address register register */
> +	adr     r0, 1f
> +	ldr     r0, [r0]
> +	ldr     r0, [r0]
> +	mov     pc, r0
> +/*
> + * the last word of this piece of code will be filled by the physical
> + * address of the boot address register just after being copied in SRAM
> + */
> +1:
> +	.long   .
> +mvebu_boot_wa_end:
> +ENDPROC(mvebu_boot_wa_end)

And this needs to be changed a bit to work properly in a big-endian
configuration:

diff --git a/arch/arm/mach-mvebu/pmsu_ll.S b/arch/arm/mach-mvebu/pmsu_ll.S
index 15b823d..2f8b021 100644
--- a/arch/arm/mach-mvebu/pmsu_ll.S
+++ b/arch/arm/mach-mvebu/pmsu_ll.S
@@ -43,11 +43,14 @@ ENDPROC(armada_38x_cpu_resume)
 /* The following code will be executed from SRAM */
 ENTRY(mvebu_boot_wa_start)
 mvebu_boot_wa_start:
-/* use physical address of the boot address register register */
+ARM_BE8(setend be )                    @ go BE8 if entered LE
        adr     r0, 1f
-       ldr     r0, [r0]
-       ldr     r0, [r0]
-       mov     pc, r0
+       ldr     r0, [r0]                @ load the address of the
+                                       @ resume register
+       ldr     r0, [r0]                @ load the value in the
+                                       @ resume register
+ARM_BE8(rev    r0, r0)                 @ the value is stored LE
+       mov     pc, r0                  @ jump to this value

Note that the first ldr r0, [r0] does not need a rev r0, r0 because the
value is stored in the native endianness of the system thanks to the
__raw_writel() mentioned before. However, the second ldr r0, [r0] reads
the value in the Resume Address register, which is written in
little-endian by the writel() call in mvebu_pmsu_set_cpu_boot_addr().

Could you include this in your next iteration of the patches?

Thanks,

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

WARNING: multiple messages have this Message-ID (diff)
From: thomas.petazzoni@free-electrons.com (Thomas Petazzoni)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 02/16] ARM: mvebu: Add a common function for the boot address work around
Date: Tue, 1 Jul 2014 16:34:28 +0200	[thread overview]
Message-ID: <20140701163428.23408c9d@free-electrons.com> (raw)
In-Reply-To: <1403875377-940-3-git-send-email-gregory.clement@free-electrons.com>

Dear Gregory CLEMENT,

On Fri, 27 Jun 2014 15:22:43 +0200, Gregory CLEMENT wrote:

> +extern unsigned char mvebu_boot_wa_start;
> +extern unsigned char mvebu_boot_wa_end;
> +
> +void mvebu_boot_addr_wa(int crypto_eng_id, u32 resume_addr_reg)
> +{
> +	void __iomem *sram_virt_base;
> +	u32 code_len = &mvebu_boot_wa_end - &mvebu_boot_wa_start;
> +
> +	mvebu_mbus_del_window(BOOTROM_BASE, BOOTROM_SIZE);
> +	mvebu_mbus_add_window_by_id(crypto_eng_id, CRYPT0_ENG_ATTR,
> +				SRAM_PHYS_BASE, SZ_64K);
> +	sram_virt_base = ioremap(SRAM_PHYS_BASE, SZ_64K);
> +
> +
> +	memcpy(sram_virt_base, &mvebu_boot_wa_start, code_len);
> +	/*
> +	 * The last word of the code copied in SRAM must contain the
> +	 * physical base address of the PMSU register
> +	 */
> +	*(unsigned long *)(sram_virt_base + code_len - 4) = resume_addr_reg;

Contrary to what I said, use __raw_writel() and not writel() here, to
keep the native endianness of the system when writing the value:

diff --git a/arch/arm/mach-mvebu/pmsu.c b/arch/arm/mach-mvebu/pmsu.c
index 9c56f8c..2b37e01 100644
--- a/arch/arm/mach-mvebu/pmsu.c
+++ b/arch/arm/mach-mvebu/pmsu.c
@@ -135,9 +135,11 @@ void mvebu_boot_addr_wa(int crypto_eng_id, u32 resume_addr_reg)
        memcpy(sram_virt_base, &mvebu_boot_wa_start, code_len);
        /*
         * The last word of the code copied in SRAM must contain the
-        * physical base address of the PMSU register
+        * physical base address of the PMSU register. We
+        * intentionally store this address in the native endianness
+        * of the system.
         */
-       *(unsigned long *)(sram_virt_base + code_len - 4) = resume_addr_reg;
+       __raw_writel(resume_addr_reg, sram_virt_base + code_len - 4);
 }

> +.global mvebu_boot_wa_start
> +.global mvebu_boot_wa_end
> +
> +/* The following code will be executed from SRAM */
> +ENTRY(mvebu_boot_wa_start)
> +mvebu_boot_wa_start:
> +/* use physical address of the boot address register register */
> +	adr     r0, 1f
> +	ldr     r0, [r0]
> +	ldr     r0, [r0]
> +	mov     pc, r0
> +/*
> + * the last word of this piece of code will be filled by the physical
> + * address of the boot address register just after being copied in SRAM
> + */
> +1:
> +	.long   .
> +mvebu_boot_wa_end:
> +ENDPROC(mvebu_boot_wa_end)

And this needs to be changed a bit to work properly in a big-endian
configuration:

diff --git a/arch/arm/mach-mvebu/pmsu_ll.S b/arch/arm/mach-mvebu/pmsu_ll.S
index 15b823d..2f8b021 100644
--- a/arch/arm/mach-mvebu/pmsu_ll.S
+++ b/arch/arm/mach-mvebu/pmsu_ll.S
@@ -43,11 +43,14 @@ ENDPROC(armada_38x_cpu_resume)
 /* The following code will be executed from SRAM */
 ENTRY(mvebu_boot_wa_start)
 mvebu_boot_wa_start:
-/* use physical address of the boot address register register */
+ARM_BE8(setend be )                    @ go BE8 if entered LE
        adr     r0, 1f
-       ldr     r0, [r0]
-       ldr     r0, [r0]
-       mov     pc, r0
+       ldr     r0, [r0]                @ load the address of the
+                                       @ resume register
+       ldr     r0, [r0]                @ load the value in the
+                                       @ resume register
+ARM_BE8(rev    r0, r0)                 @ the value is stored LE
+       mov     pc, r0                  @ jump to this value

Note that the first ldr r0, [r0] does not need a rev r0, r0 because the
value is stored in the native endianness of the system thanks to the
__raw_writel() mentioned before. However, the second ldr r0, [r0] reads
the value in the Resume Address register, which is written in
little-endian by the writel() call in mvebu_pmsu_set_cpu_boot_addr().

Could you include this in your next iteration of the patches?

Thanks,

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

  parent reply	other threads:[~2014-07-01 14:57 UTC|newest]

Thread overview: 120+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-27 13:22 [PATCH 00/16] CPU Idle for Armada 370 and Armada 38x Gregory CLEMENT
2014-06-27 13:22 ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 01/16] ARM: mvebu: Sort the headers of pmsu.c in alphabetic order Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 12:16   ` Thomas Petazzoni
2014-06-30 12:16     ` Thomas Petazzoni
2014-07-02 22:57     ` Gregory CLEMENT
2014-07-02 22:57       ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 02/16] ARM: mvebu: Add a common function for the boot address work around Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 12:40   ` Thomas Petazzoni
2014-06-30 12:40     ` Thomas Petazzoni
2014-07-02 22:58     ` Gregory CLEMENT
2014-07-02 22:58       ` Gregory CLEMENT
2014-07-03  7:16       ` Thomas Petazzoni
2014-07-03  7:16         ` Thomas Petazzoni
2014-07-01 14:34   ` Thomas Petazzoni [this message]
2014-07-01 14:34     ` Thomas Petazzoni
2014-07-02 22:58     ` Gregory CLEMENT
2014-07-02 22:58       ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 03/16] ARM: mvebu: Add function to export the physical address of the boot register Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-27 14:14   ` Gregory CLEMENT
2014-06-27 14:14     ` Gregory CLEMENT
2014-06-30 12:46   ` Thomas Petazzoni
2014-06-30 12:46     ` Thomas Petazzoni
2014-07-03  8:39     ` Gregory CLEMENT
2014-07-03  8:39       ` Gregory CLEMENT
2014-07-03  9:25       ` Thomas Petazzoni
2014-07-03  9:25         ` Thomas Petazzoni
2014-07-03 10:07         ` Gregory CLEMENT
2014-07-03 10:07           ` Gregory CLEMENT
2014-07-01 11:46   ` Thomas Petazzoni
2014-07-01 11:46     ` Thomas Petazzoni
2014-07-01 15:02     ` Ezequiel Garcia
2014-07-01 15:02       ` Ezequiel Garcia
2014-06-27 13:22 ` [PATCH 04/16] ARM: mvebu: Use the common function for Armada 375 SMP workaround Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 05/16] ARM: mvebu: Add workaround for cpuidle support for Armada 370 Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 12:50   ` Thomas Petazzoni
2014-06-30 12:50     ` Thomas Petazzoni
2014-07-03  8:44     ` Gregory CLEMENT
2014-07-03  8:44       ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 06/16] ARM: mvebu: Rename the armada_370_xp into mvebu_v7 in pmsu.c file Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 12:57   ` Thomas Petazzoni
2014-06-30 12:57     ` Thomas Petazzoni
2014-07-03  8:47     ` Gregory CLEMENT
2014-07-03  8:47       ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 07/16] ARM: mvebu: Make the CPU idle initialization more generic Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-27 14:15   ` Gregory CLEMENT
2014-06-27 14:15     ` Gregory CLEMENT
2014-06-28 14:56     ` Jason Cooper
2014-06-28 14:56       ` Jason Cooper
2014-06-30 10:30       ` Gregory CLEMENT
2014-06-30 10:30         ` Gregory CLEMENT
2014-06-30 14:07   ` Thomas Petazzoni
2014-06-30 14:07     ` Thomas Petazzoni
2014-07-03  8:54     ` Gregory CLEMENT
2014-07-03  8:54       ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 08/16] ARM: mvebu: Use a local variable to store the resume address Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 15:09   ` Thomas Petazzoni
2014-06-30 15:09     ` Thomas Petazzoni
2014-07-03  9:24     ` Gregory CLEMENT
2014-07-03  9:24       ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 09/16] ARM: mvebu: Make the snoop disable optional in mvebu_v7_pmsu_idle_prepare Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 15:43   ` Thomas Petazzoni
2014-06-30 15:43     ` Thomas Petazzoni
2014-07-03 12:50     ` Gregory CLEMENT
2014-07-03 12:50       ` Gregory CLEMENT
2014-07-03 12:55       ` Thomas Petazzoni
2014-07-03 12:55         ` Thomas Petazzoni
2014-06-27 13:22 ` [PATCH 10/16] ARM: mvebu: Export the SCU address Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 11/16] ARM: mvebu: dts: Add CA9 MPcore SoC Controller node Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 15:37   ` Thomas Petazzoni
2014-06-30 15:37     ` Thomas Petazzoni
2014-07-03 12:51     ` Gregory CLEMENT
2014-07-03 12:51       ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 12/16] cpuidle: mvebu: Rename the driver from armada-370-xp to mvebu-v7 Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 13:28   ` Thomas Petazzoni
2014-06-30 13:28     ` Thomas Petazzoni
2014-07-03 13:08     ` Gregory CLEMENT
2014-07-03 13:08       ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 13/16] cpuidle: mvebu: Move the description of the cpuidle states in the platform part Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 13:32   ` Thomas Petazzoni
2014-06-30 13:32     ` Thomas Petazzoni
2014-07-03 13:23     ` Gregory CLEMENT
2014-07-03 13:23       ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 14/16] ARM: mvebu: Add CPU idle support for Armada 370 Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 13:36   ` Thomas Petazzoni
2014-06-30 13:36     ` Thomas Petazzoni
2014-07-03 15:03     ` Gregory CLEMENT
2014-07-03 15:03       ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 15/16] ARM: mvebu: Add CPU idle support for Armada 38x Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 15:07   ` Thomas Petazzoni
2014-06-30 15:07     ` Thomas Petazzoni
2014-07-03 15:29     ` Gregory CLEMENT
2014-07-03 15:29       ` Gregory CLEMENT
2014-07-01 14:35   ` Thomas Petazzoni
2014-07-01 14:35     ` Thomas Petazzoni
2014-07-03 15:09     ` Gregory CLEMENT
2014-07-03 15:09       ` Gregory CLEMENT
2014-06-27 13:22 ` [PATCH 16/16] ARM: mvebu: defconfig: Enable CPU Idle support in mvebu_v7_defconfig Gregory CLEMENT
2014-06-27 13:22   ` Gregory CLEMENT
2014-06-30 15:45 ` [PATCH 00/16] CPU Idle for Armada 370 and Armada 38x Thomas Petazzoni
2014-06-30 15:45   ` Thomas Petazzoni
2014-06-30 15:51   ` Gregory CLEMENT
2014-06-30 15:51     ` Gregory CLEMENT
2014-07-01 14:38     ` Thomas Petazzoni
2014-07-01 14:38       ` Thomas Petazzoni

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140701163428.23408c9d@free-electrons.com \
    --to=thomas.petazzoni@free-electrons.com \
    --cc=alior@marvell.com \
    --cc=andrew@lunn.ch \
    --cc=daniel.lezcano@linaro.org \
    --cc=ezequiel.garcia@free-electrons.com \
    --cc=gregory.clement@free-electrons.com \
    --cc=jason@lakedaemon.net \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=nadavh@marvell.com \
    --cc=rjw@rjwysocki.net \
    --cc=sebastian.hesselbarth@gmail.com \
    --cc=tawfik@marvell.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.