Re: [PATCH 0/2] mfd: mc13xxx: ADC support

2018-04-10 Thread Sascha Hauer
Hi Andrey,

On Fri, Apr 06, 2018 at 07:33:22PM +0300, Andrey Gusakov wrote:
> This set of pathces adds ADC support for MC13783 and MC13892 PMICs.

Applied, thanks. Out of curiosity, what do you use the ADCs for?

Sascha

> 
> Andrey Gusakov (2):
>   mfd: mc13xxx: add function returning mc13xxx type
>   aiodev: mc13xxx: add adc support
> 
>  drivers/aiodev/Kconfig   |   6 ++
>  drivers/aiodev/Makefile  |   1 +
>  drivers/aiodev/mc13xxx_adc.c | 234 
> +++
>  drivers/mfd/mc13xxx.c|  15 +++
>  include/mfd/mc13xxx.h|  19 
>  5 files changed, 275 insertions(+)
>  create mode 100644 drivers/aiodev/mc13xxx_adc.c
> 
> -- 
> 1.9.1
> 
> ___
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |

___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


Re: [RESEND] doc: bcm283x: update documentation for Raspberry Pi

2018-04-10 Thread Sascha Hauer
On Mon, Apr 09, 2018 at 10:59:33AM +0200, Roland Hieber wrote:
> The old way does not seem to work for RPi 3, as the UART pins are
> mapped differently and the NOOBS bootcode does not seem to read a
> config.txt.
> 
> Signed-off-by: Roland Hieber 
> ---
>  Documentation/boards/bcm2835.rst | 34 ++
>  1 file changed, 26 insertions(+), 8 deletions(-)
> ---
> Although Sascha said he had applied the patch, I cannot find traces of
> it in the current master. It probably got lost, so I'm resending it.
> Note that this patch is independent of Lucas' RPi patch series and also
> applies to the current state of RPi support.

Applied, thanks. Yes, now I *really* did.

Sascha

> 
>  - Roland
> 
> diff --git a/Documentation/boards/bcm2835.rst 
> b/Documentation/boards/bcm2835.rst
> index 13cebb01c4..1a78cfba3c 100644
> --- a/Documentation/boards/bcm2835.rst
> +++ b/Documentation/boards/bcm2835.rst
> @@ -1,17 +1,35 @@
> -Broadcom BCM2835
> +Broadcom BCM283x
>  
>  
>  Raspberry Pi
>  
>  
> -  1. Prepare a card with a FAT filesystem. Download a tiny NOOBS LITE
> - zip archive and unpack it into FAT partition.
> - See http://www.raspberrypi.org/help/noobs-setup/ for details.
> +  1. Prepare an SD or microSD card with a FAT filesystem of at least 30 MB 
> in size.
> +   
> +  2. Download the `Raspberry Pi firmware`_ (120 MB), unzip it, and copy the
> + contents of the ``boot/`` folder to your card.
>  
> -  2. Compile ``barebox.bin`` image (use ``rpi_defconfig``).
> - Copy it to the SD/microSD card and name it ``recovery.img``.
> +  3. Use ``make rpi_defconfig; make`` to build barebox. This will create the 
> following images:
>  
> -  3. Connect to board's UART (115200 8N1);
> + - ``images/barebox-raspberry-pi-1.img`` for the BCM2835/ARM1176JZF-S 
> (Raspberry Pi 1)
> + - ``images/barebox-raspberry-pi-2.img`` for the BCM2836/CORTEX-A7 
> (Raspberry Pi 2)
> + - ``images/barebox-raspberry-pi-3.img`` for the BCM2837/CORTEX-A53 
> (Raspberry Pi 3, Raspberry Pi Zero)
> +
> + Copy the respective image for your model to your SD card and name it
> + ``barebox.img``.
> +
> +  4. Create a text file ``config.txt`` on the SD card with the following 
> content::
> +
> + kernel=barebox.img
> + enable_uart=1
> + dtoverlay=pi3-miniuart-bt
> +
> + (For more information, refer to the `documentation for config.txt`_.)
> +
> +  5. Connect to board's UART (115200 8N1);
>   Use PIN6 (GND), PIN8 (UART_TX), PIN10 (UART_RX) pins.
>  
> -  4. Turn board's power on.
> +  6. Turn board's power on.
> +
> +.. _Raspberry Pi firmware: 
> https://codeload.github.com/raspberrypi/firmware/zip/80e1fbeb78f9df06701d28c0ed3a3060a3f557ef
> +.. _documentation for config.txt: 
> https://www.raspberrypi.org/documentation/configuration/config-txt/
> -- 
> 2.11.0
> 
> 
> ___
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |

___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


Re: [PATCH v3 07/10] ARM: install HYP vectors at PBL and Barebox entry

2018-04-10 Thread Lucas Stach
Am Donnerstag, den 05.04.2018, 09:42 +0200 schrieb Sascha Hauer:
> On Mon, Mar 26, 2018 at 09:20:22PM +0200, Lucas Stach wrote:
> > If the CPU was already in HYP mode when entering the PBL, install a
> > simple trap handler to allow to get back from SVC to HYP before
> > switching to HYP mode.
> > 
> > As the vectors are part of the currently running binary, we need to
> > do the same setup when starting the real Barebox binary, as the PBL
> > setup vectors might get overwritten. To do this we trap into HYP mode
> > just before jumping to Barebox and then re-do the vector setup and
> > SVC switch as the first thing in Barebox proper.
> > 
> > > > Signed-off-by: Lucas Stach 
> > > > Tested-by: Roland Hieber 
> > ---
> >  arch/arm/cpu/lowlevel.S   | 3 +++
> >  arch/arm/cpu/start-pbl.c  | 4 
> >  arch/arm/cpu/start.c  | 3 +++
> >  arch/arm/cpu/uncompress.c | 4 
> >  4 files changed, 14 insertions(+)
> > 
> > diff --git a/arch/arm/cpu/lowlevel.S b/arch/arm/cpu/lowlevel.S
> > index 43665981e48b..13dfe496ad17 100644
> > --- a/arch/arm/cpu/lowlevel.S
> > +++ b/arch/arm/cpu/lowlevel.S
> > @@ -8,6 +8,9 @@ ENTRY(arm_cpu_lowlevel_init)
> > > >     /* save lr, since it may be banked away with a processor mode 
> > > > change */
> > > > > >     mov r2, lr
> >  
> > > > +   /* careful: the hyp install corrupts r0 and r1 */
> > > > > > +   bl  __hyp_install
> > +
> > > >     /* set the cpu to SVC32 mode, mask irq and fiq */
> > > > > >     mrs r12, cpsr
> > > > > >     eor r12, r12, #HYP_MODE
> > diff --git a/arch/arm/cpu/start-pbl.c b/arch/arm/cpu/start-pbl.c
> > index e851b4a2da5e..e0793579e2e8 100644
> > --- a/arch/arm/cpu/start-pbl.c
> > +++ b/arch/arm/cpu/start-pbl.c
> > @@ -26,6 +26,7 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  #include 
> >  #include 
> >  #include 
> > @@ -100,5 +101,8 @@ __noreturn void barebox_single_pbl_start(unsigned long 
> > membase,
> > > >     else
> > > >     barebox = (void *)barebox_base;
> >  
> > > > +   if (__boot_cpu_mode == HYP_MODE)
> > > > +   armv7_switch_to_hyp();
> > +
> > > >     barebox(membase, memsize, boarddata);
> >  }
> > diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
> > index 171e6ad0eb7a..a0db6436f387 100644
> > --- a/arch/arm/cpu/start.c
> > +++ b/arch/arm/cpu/start.c
> > @@ -24,6 +24,7 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  #include 
> >  #include 
> >  #include 
> > @@ -145,6 +146,8 @@ __noreturn void barebox_non_pbl_start(unsigned long 
> > membase,
> > > >     unsigned long malloc_start, malloc_end;
> > > >     unsigned long barebox_size = barebox_image_size + MAX_BSS_SIZE;
> >  
> > +   armv7_hyp_install();
> 
> Calling a armv7 specific function in a generic code path is not so nice.
> If this is really necessary then I suggest to #ifdef it here rather than
> in the header file (where armv7_hyp_install() expands to a noop for
> armv8. And what about the older architectures? A quick test revealed
> this works on armv5, but is this intentional or by accident?

Yep, it is coded to be a quick return on older < ARMv7 with the
executed instructions being compatible. I'll still change this to a
IS_ENABLED condition, as this might save some code size if only !ARMv7
arches are enabled in the config.

Thanks,
Lucas

___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


Re: [PATCH v3 04/10] ARM: add file for HYP mode related setup

2018-04-10 Thread Lucas Stach
Am Donnerstag, den 05.04.2018, 09:54 +0200 schrieb Sascha Hauer:
> On Mon, Mar 26, 2018 at 09:20:19PM +0200, Lucas Stach wrote:
> > This adds routines to add hyp mode vectors and switch back to HYP
> > mode from SVC. This is needed in both the PBL and Barebox proper.
> > 
> > > > Signed-off-by: Lucas Stach 
> > > > Tested-by: Roland Hieber 
> > ---
> > v3:
> > - fix whitespace
> > - use __BARE_INIT
> > ---
> >  arch/arm/cpu/Makefile |   4 ++
> >  arch/arm/cpu/hyp.S| 116 
> > ++
> >  arch/arm/cpu/sm_as.S  |  11 
> >  arch/arm/include/asm/secure.h |   8 +++
> >  4 files changed, 128 insertions(+), 11 deletions(-)
> >  create mode 100644 arch/arm/cpu/hyp.S
> > 
> > diff --git a/arch/arm/cpu/Makefile b/arch/arm/cpu/Makefile
> > index 13fe12c31f6f..f86dff975bb4 100644
> > --- a/arch/arm/cpu/Makefile
> > +++ b/arch/arm/cpu/Makefile
> > @@ -9,6 +9,10 @@ obj-$(CONFIG_ARM_EXCEPTIONS) += exceptions.o
> >  obj-$(CONFIG_MMU) += mmu.o mmu-early.o
> >  pbl-$(CONFIG_MMU) += mmu-early.o
> >  lwl-y += lowlevel.o
> > +obj-y += hyp.o
> > +AFLAGS_hyp.o :=-Wa,-march=armv7-a -Wa,-mcpu=all
> > +pbl-y += hyp.o
> > +AFLAGS_pbl-hyp.o :=-Wa,-march=armv7-a -Wa,-mcpu=all
> >  endif
> >  
> >  obj-$(CONFIG_ARM_EXCEPTIONS) += interrupts.o
> > diff --git a/arch/arm/cpu/hyp.S b/arch/arm/cpu/hyp.S
> > new file mode 100644
> > index ..1314b56eab25
> > --- /dev/null
> > +++ b/arch/arm/cpu/hyp.S
> > @@ -0,0 +1,116 @@
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +
> > +.arch_extension sec
> > +.arch_extension virt
> > +
> > +__BARE_INIT
> > +
> > +.data
> > > > +   .align  2
> > +ENTRY(__boot_cpu_mode)
> > > > +   .long   0
> > +.text
> > +
> > +ENTRY(__hyp_install)
> > > > > > +   mrs r12, cpsr
> > > > > > +   and r12, r12, #MODE_MASK
> > +
> > > > +   @ Save the initial CPU state
> > > > > > +   adr r0, .L__boot_cpu_mode_offset
> > > > > > +   ldr r1, [r0]
> > +   str r12, [r0, r1]
> 
> Naa, this won't work. You save the cpsr value in __boot_cpu_mode, but
> this variable exists both in PBL and regular barebox, __hyp_install
> is called multiple times and cpsr is modified right after saving it.

It does. ;)

I guess its non-obvious from the code flow, but what we do is to drop
down to SVC in the PBL, then jump back to HYP before starting barebox
proper and the dropping down to SVC again on barebox entry.
All in all this is less-than-pretty, but IMHO it's the lesser evil than
trying to implement some communication channel from PBL to barebox
proper to pass information like this.

So I guess this code needs some more comments...

Regards,
Lucas

___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH] ARM: Make use of ALIGN_DOWN macro in barebox-arm.h

2018-04-10 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/include/asm/barebox-arm.h | 9 +++--
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/arch/arm/include/asm/barebox-arm.h 
b/arch/arm/include/asm/barebox-arm.h
index 4b270e7de..67e4d964d 100644
--- a/arch/arm/include/asm/barebox-arm.h
+++ b/arch/arm/include/asm/barebox-arm.h
@@ -114,8 +114,7 @@ static inline unsigned long arm_mem_ttb(unsigned long 
membase,
unsigned long endmem)
 {
endmem = arm_mem_stack(membase, endmem);
-   endmem &= ~(SZ_16K - 1);
-   endmem -= SZ_16K;
+   endmem = ALIGN_DOWN(endmem, SZ_16K) - SZ_16K;
 
return endmem;
 }
@@ -138,7 +137,7 @@ static inline unsigned long arm_mem_ramoops(unsigned long 
membase,
endmem = arm_mem_ttb(membase, endmem);
 #ifdef CONFIG_FS_PSTORE_RAMOOPS
endmem -= CONFIG_FS_PSTORE_RAMOOPS_SIZE;
-   endmem &= ~(SZ_4K - 1); /* Align to 4K */
+   endmem = ALIGN_DOWN(endmem, SZ_4K);
 #endif
 
return endmem;
@@ -151,9 +150,7 @@ static inline unsigned long arm_mem_barebox_image(unsigned 
long membase,
endmem = arm_mem_ramoops(membase, endmem);
 
if (IS_ENABLED(CONFIG_RELOCATABLE)) {
-   endmem -= size;
-   endmem &= ~(SZ_1M - 1);
-   return endmem;
+   return ALIGN_DOWN(endmem - size, SZ_1M);
} else {
if (TEXT_BASE >= membase && TEXT_BASE < endmem)
return TEXT_BASE;
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH] pinctrl-vf610: Make use of BIT macro

2018-04-10 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/pinctrl/pinctrl-vf610.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/pinctrl/pinctrl-vf610.c b/drivers/pinctrl/pinctrl-vf610.c
index 4234263d3..a46b0e2ca 100644
--- a/drivers/pinctrl/pinctrl-vf610.c
+++ b/drivers/pinctrl/pinctrl-vf610.c
@@ -29,9 +29,9 @@
 enum {
PINCTRL_VF610_MUX_LINE_SIZE = 20,
 
-   PINCTRL_VF610_IBE = 1 << 0,
-   PINCTRL_VF610_OBE = 1 << 1,
-   PINCTRL_VF610_xBE = 0b11,
+   PINCTRL_VF610_IBE = BIT(0),
+   PINCTRL_VF610_OBE = BIT(1),
+   PINCTRL_VF610_xBE = PINCTRL_VF610_OBE | PINCTRL_VF610_IBE,
 };
 
 struct pinctrl_vf610 {
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 2/2] i.MX: vf610-twr: Convert to use vf610_setup_pad()

2018-04-10 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/freescale-vf610-twr/lowlevel.c | 8 +---
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/arch/arm/boards/freescale-vf610-twr/lowlevel.c 
b/arch/arm/boards/freescale-vf610-twr/lowlevel.c
index 65956fdd2..8fec9f4b9 100644
--- a/arch/arm/boards/freescale-vf610-twr/lowlevel.c
+++ b/arch/arm/boards/freescale-vf610-twr/lowlevel.c
@@ -14,13 +14,7 @@ static inline void setup_uart(void)
void __iomem *iomuxbase = IOMEM(VF610_IOMUXC_BASE_ADDR);
 
vf610_ungate_all_peripherals();
-
-   /*
-* VF610_PAD_PTB4__UART1_TX
-*/
-   writel(VF610_UART_PAD_CTRL | (2 << 20), iomuxbase + 0x0068);
-   writel(0, iomuxbase + 0x0380);
-
+   vf610_setup_pad(iomuxbase, VF610_PAD_PTB4__UART1_TX);
vf610_uart_setup_ll();
 
putc_ll('>');
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 1/2] i.MX: vf610-twr: Print '>' when DEBUG_LL is enabled

2018-04-10 Thread Andrey Smirnov
Majority of others boards prints '>' as soon as DEBUG_LL related
configuration is done, so do so for VF610-TWR as well.

Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/freescale-vf610-twr/lowlevel.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm/boards/freescale-vf610-twr/lowlevel.c 
b/arch/arm/boards/freescale-vf610-twr/lowlevel.c
index a043dd421..65956fdd2 100644
--- a/arch/arm/boards/freescale-vf610-twr/lowlevel.c
+++ b/arch/arm/boards/freescale-vf610-twr/lowlevel.c
@@ -22,6 +22,8 @@ static inline void setup_uart(void)
writel(0, iomuxbase + 0x0380);
 
vf610_uart_setup_ll();
+
+   putc_ll('>');
 }
 
 extern char __dtb_vf610_twr_start[];
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH] ARM: start: Avoid calling arm_mem_barebox_image() twice

2018-04-10 Thread Andrey Smirnov
Avoid calling arm_mem_barebox_image() twice by making barebox_base
function-wide in scope

Signed-off-by: Andrey Smirnov 
---
 arch/arm/cpu/start.c | 13 +
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
index 68fff892e..64bd942ad 100644
--- a/arch/arm/cpu/start.c
+++ b/arch/arm/cpu/start.c
@@ -144,13 +144,11 @@ __noreturn void barebox_non_pbl_start(unsigned long 
membase,
unsigned long endmem = membase + memsize;
unsigned long malloc_start, malloc_end;
unsigned long barebox_size = barebox_image_size + MAX_BSS_SIZE;
-
-   if (IS_ENABLED(CONFIG_RELOCATABLE)) {
-   unsigned long barebox_base = arm_mem_barebox_image(membase,
-  endmem,
-  
barebox_size);
+   unsigned long barebox_base = arm_mem_barebox_image(membase,
+  endmem,
+  barebox_size);
+   if (IS_ENABLED(CONFIG_RELOCATABLE))
relocate_to_adr(barebox_base);
-   }
 
setup_c();
 
@@ -160,8 +158,7 @@ __noreturn void barebox_non_pbl_start(unsigned long membase,
 
arm_stack_top = arm_mem_stack_top(membase, endmem);
arm_barebox_size = barebox_size;
-   malloc_end = arm_mem_barebox_image(membase, endmem,
-   arm_barebox_size);
+   malloc_end = barebox_base;
 
if (IS_ENABLED(CONFIG_MMU_EARLY)) {
unsigned long ttb = arm_mem_ttb(membase, endmem);
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 01/10] ARM: i.MX: esdctl: Use IOMEM instead of (void *)

2018-04-10 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/mach-imx/esdctl.c | 42 +-
 1 file changed, 21 insertions(+), 21 deletions(-)

diff --git a/arch/arm/mach-imx/esdctl.c b/arch/arm/mach-imx/esdctl.c
index 1eebc77b6..895761e73 100644
--- a/arch/arm/mach-imx/esdctl.c
+++ b/arch/arm/mach-imx/esdctl.c
@@ -498,9 +498,9 @@ void __noreturn imx1_barebox_entry(void *boarddata)
unsigned long base, size;
 
upper_or_coalesced_range(MX1_CSD0_BASE_ADDR,
-   imx_v1_sdram_size((void *)MX1_SDRAMC_BASE_ADDR, 0),
+   imx_v1_sdram_size(IOMEM(MX1_SDRAMC_BASE_ADDR), 0),
MX1_CSD1_BASE_ADDR,
-   imx_v1_sdram_size((void *)MX1_SDRAMC_BASE_ADDR, 1),
+   imx_v1_sdram_size(IOMEM(MX1_SDRAMC_BASE_ADDR), 1),
&base, &size);
 
barebox_arm_entry(base, size, boarddata);
@@ -511,9 +511,9 @@ void __noreturn imx25_barebox_entry(void *boarddata)
unsigned long base, size;
 
upper_or_coalesced_range(MX25_CSD0_BASE_ADDR,
-   imx_v2_sdram_size((void *)MX25_ESDCTL_BASE_ADDR, 0),
+   imx_v2_sdram_size(IOMEM(MX25_ESDCTL_BASE_ADDR), 0),
MX25_CSD1_BASE_ADDR,
-   imx_v2_sdram_size((void *)MX25_ESDCTL_BASE_ADDR, 1),
+   imx_v2_sdram_size(IOMEM(MX25_ESDCTL_BASE_ADDR), 1),
&base, &size);
 
barebox_arm_entry(base, size, boarddata);
@@ -523,12 +523,12 @@ void __noreturn imx27_barebox_entry(void *boarddata)
 {
unsigned long base, size;
 
-   imx_esdctl_v2_disable_default((void *)MX27_ESDCTL_BASE_ADDR);
+   imx_esdctl_v2_disable_default(IOMEM(MX27_ESDCTL_BASE_ADDR));
 
upper_or_coalesced_range(MX27_CSD0_BASE_ADDR,
-   imx_v2_sdram_size((void *)MX27_ESDCTL_BASE_ADDR, 0),
+   imx_v2_sdram_size(IOMEM(MX27_ESDCTL_BASE_ADDR), 0),
MX27_CSD1_BASE_ADDR,
-   imx_v2_sdram_size((void *)MX27_ESDCTL_BASE_ADDR, 1),
+   imx_v2_sdram_size(IOMEM(MX27_ESDCTL_BASE_ADDR), 1),
&base, &size);
 
barebox_arm_entry(base, size, boarddata);
@@ -538,12 +538,12 @@ void __noreturn imx31_barebox_entry(void *boarddata)
 {
unsigned long base, size;
 
-   imx_esdctl_v2_disable_default((void *)MX31_ESDCTL_BASE_ADDR);
+   imx_esdctl_v2_disable_default(IOMEM(MX31_ESDCTL_BASE_ADDR));
 
upper_or_coalesced_range(MX31_CSD0_BASE_ADDR,
-   imx_v2_sdram_size((void *)MX31_ESDCTL_BASE_ADDR, 0),
+   imx_v2_sdram_size(IOMEM(MX31_ESDCTL_BASE_ADDR), 0),
MX31_CSD1_BASE_ADDR,
-   imx_v2_sdram_size((void *)MX31_ESDCTL_BASE_ADDR, 1),
+   imx_v2_sdram_size(IOMEM(MX31_ESDCTL_BASE_ADDR), 1),
&base, &size);
 
barebox_arm_entry(base, size, boarddata);
@@ -553,12 +553,12 @@ void __noreturn imx35_barebox_entry(void *boarddata)
 {
unsigned long base, size;
 
-   imx_esdctl_v2_disable_default((void *)MX35_ESDCTL_BASE_ADDR);
+   imx_esdctl_v2_disable_default(IOMEM(MX35_ESDCTL_BASE_ADDR));
 
upper_or_coalesced_range(MX35_CSD0_BASE_ADDR,
-   imx_v2_sdram_size((void *)MX35_ESDCTL_BASE_ADDR, 0),
+   imx_v2_sdram_size(IOMEM(MX35_ESDCTL_BASE_ADDR), 0),
MX35_CSD1_BASE_ADDR,
-   imx_v2_sdram_size((void *)MX35_ESDCTL_BASE_ADDR, 1),
+   imx_v2_sdram_size(IOMEM(MX35_ESDCTL_BASE_ADDR), 1),
&base, &size);
 
barebox_arm_entry(base, size, boarddata);
@@ -569,9 +569,9 @@ void __noreturn imx51_barebox_entry(void *boarddata)
unsigned long base, size;
 
upper_or_coalesced_range(MX51_CSD0_BASE_ADDR,
-   imx_v3_sdram_size((void *)MX51_ESDCTL_BASE_ADDR, 0),
+   imx_v3_sdram_size(IOMEM(MX51_ESDCTL_BASE_ADDR), 0),
MX51_CSD1_BASE_ADDR,
-   imx_v3_sdram_size((void *)MX51_ESDCTL_BASE_ADDR, 1),
+   imx_v3_sdram_size(IOMEM(MX51_ESDCTL_BASE_ADDR), 1),
&base, &size);
 
barebox_arm_entry(base, size, boarddata);
@@ -582,9 +582,9 @@ void __noreturn imx53_barebox_entry(void *boarddata)
unsigned long base, size;
 
upper_or_coalesced_range(MX53_CSD0_BASE_ADDR,
-   imx_v4_sdram_size((void *)MX53_ESDCTL_BASE_ADDR, 0),
+   imx_v4_sdram_size(IOMEM(MX53_ESDCTL_BASE_ADDR), 0),
MX53_CSD1_BASE_ADDR,
-   imx_v4_sdram_size((void *)MX53_ESDCTL_BASE_ADDR, 1),
+   imx_v4_sdram_size(IOMEM(MX53_ESDCTL_BASE_ADDR), 1),
&base, &size);
 
barebox_arm_entry(base, size, boarddata);
@

[PATCH 02/10] ARM: i.MX51: esdctl: Replace magic value with ESDMISC_DDR2_8_BANK

2018-04-10 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/mach-imx/esdctl.c  | 2 +-
 arch/arm/mach-imx/include/mach/esdctl.h | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-imx/esdctl.c b/arch/arm/mach-imx/esdctl.c
index 895761e73..1d6fa2995 100644
--- a/arch/arm/mach-imx/esdctl.c
+++ b/arch/arm/mach-imx/esdctl.c
@@ -120,7 +120,7 @@ static inline unsigned long imx_v3_sdram_size(void __iomem 
*esdctlbase, int num)
 
size = imx_v2_sdram_size(esdctlbase, num);
 
-   if (readl(esdctlbase + IMX_ESDMISC) & (1 << 6))
+   if (readl(esdctlbase + IMX_ESDMISC) & ESDMISC_DDR2_8_BANK)
size *= 2;
 
if (size > SZ_256M)
diff --git a/arch/arm/mach-imx/include/mach/esdctl.h 
b/arch/arm/mach-imx/include/mach/esdctl.h
index 66dcc8974..53710b0f2 100644
--- a/arch/arm/mach-imx/include/mach/esdctl.h
+++ b/arch/arm/mach-imx/include/mach/esdctl.h
@@ -48,6 +48,7 @@
 #define ESDMISC_MDDR_MDIS  0x0010
 #define ESDMISC_LHD0x0020
 #define ESDMISC_SDRAMRDY   0x8000
+#define ESDMISC_DDR2_8_BANKBIT(6)
 
 #defineESDCFGx_tXP_MASK0x0060
 #define ESDCFGx_tXP_1  0x
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 00/10] Vybrid MMDC support and misc ESDCTL fixes

2018-04-10 Thread Andrey Smirnov
Everyone:

This series is a bit of code I developed to support automatic
configured DRAM size detection on Vybrid platform as well as some
small fixes/cleanup I made while looking at esdctl.c.

All feedback is wellcome!

Thanks,
Andrey Smirnov

Andrey Smirnov (10):
  ARM: i.MX: esdctl: Use IOMEM instead of (void *)
  ARM: i.MX51: esdctl: Replace magic value with ESDMISC_DDR2_8_BANK
  ARM: i.MX6: esdctl: Share memory size calculation code
  ARM: i.MX6: esdctl: Factor out common code in imx6*_barebox_entry()
  ARM: i.MX6: esdctl: Use symbolic constants for RAM base address
  ARM: i.MX: esdctl: Make use of min_t()
  ARM: i.MX: esdctl: Introduce memory_sdram_size()
  ARM: i.MX: esdctl: Add support for Vybrid's memory controller
  i.MX: vf610-twr: Make use of vf610_barebox_entry()
  i.MX: zii-vf610-dev: Make use of vf610_barebox_entry()

 arch/arm/boards/freescale-vf610-twr/lowlevel.c |   5 +-
 arch/arm/boards/zii-imx6q-rdu2/lowlevel.c  |   2 +-
 arch/arm/boards/zii-vf610-dev/lowlevel.c   |   3 +-
 arch/arm/dts/vf610-ddrmc.dtsi  |  15 +++
 arch/arm/dts/vf610-twr.dts |   1 +
 arch/arm/dts/vf610-zii-dev.dtsi|   4 +-
 arch/arm/mach-imx/esdctl.c | 144 ++---
 arch/arm/mach-imx/include/mach/esdctl.h|   2 +
 arch/arm/mach-imx/include/mach/imx6-regs.h |   4 +-
 arch/arm/mach-imx/include/mach/vf610-ddrmc.h   |  18 
 arch/arm/mach-imx/include/mach/vf610-regs.h|   2 +
 include/memory.h   |   8 ++
 12 files changed, 141 insertions(+), 67 deletions(-)
 create mode 100644 arch/arm/dts/vf610-ddrmc.dtsi
 create mode 100644 arch/arm/mach-imx/include/mach/vf610-ddrmc.h

-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 04/10] ARM: i.MX6: esdctl: Factor out common code in imx6*_barebox_entry()

2018-04-10 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/mach-imx/esdctl.c | 14 +-
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/arch/arm/mach-imx/esdctl.c b/arch/arm/mach-imx/esdctl.c
index a7114effa..eda8184a0 100644
--- a/arch/arm/mach-imx/esdctl.c
+++ b/arch/arm/mach-imx/esdctl.c
@@ -595,16 +595,20 @@ void __noreturn imx53_barebox_entry(void *boarddata)
barebox_arm_entry(base, size, boarddata);
 }
 
-void __noreturn imx6q_barebox_entry(void *boarddata)
+static void __noreturn
+imx6_barebox_entry(unsigned long membase, void *boarddata)
 {
-   barebox_arm_entry(0x1000,
+   barebox_arm_entry(membase,
  imx6_mmdc_sdram_size(IOMEM(MX6_MMDC_P0_BASE_ADDR)),
  boarddata);
 }
 
+void __noreturn imx6q_barebox_entry(void *boarddata)
+{
+   imx6_barebox_entry(0x1000, boarddata);
+}
+
 void __noreturn imx6ul_barebox_entry(void *boarddata)
 {
-   barebox_arm_entry(0x8000,
- imx6_mmdc_sdram_size(IOMEM(MX6_MMDC_P0_BASE_ADDR)),
- boarddata);
+   imx6_barebox_entry(0x8000, boarddata);
 }
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 03/10] ARM: i.MX6: esdctl: Share memory size calculation code

2018-04-10 Thread Andrey Smirnov
Code for calculating total amount of memory found in
imx6_mmdc_add_mem(), imx6q_barebox_entry() and imx6ul_barebox_entry()
is exaclty the same, so refactor the code to avoid duplication.

Signed-off-by: Andrey Smirnov 
---
 arch/arm/mach-imx/esdctl.c | 35 ---
 1 file changed, 16 insertions(+), 19 deletions(-)

diff --git a/arch/arm/mach-imx/esdctl.c b/arch/arm/mach-imx/esdctl.c
index 1d6fa2995..a7114effa 100644
--- a/arch/arm/mach-imx/esdctl.c
+++ b/arch/arm/mach-imx/esdctl.c
@@ -171,7 +171,7 @@ static inline unsigned long imx_v4_sdram_size(void __iomem 
*esdctlbase, int cs)
  * MMDC - found on i.MX6
  */
 
-static inline u64 imx6_mmdc_sdram_size(void __iomem *mmdcbase, int cs)
+static inline u64 __imx6_mmdc_sdram_size(void __iomem *mmdcbase, int cs)
 {
u32 ctlval = readl(mmdcbase + MDCTL);
u32 mdmisc = readl(mmdcbase + MDMISC);
@@ -286,7 +286,7 @@ static void imx_esdctl_v4_add_mem(void *esdctlbase, struct 
imx_esdctl_data *data
  */
 #define IMX6_MAX_SDRAM_SIZE 0xF000
 
-static void imx6_mmdc_add_mem(void *mmdcbase, struct imx_esdctl_data *data)
+static inline resource_size_t imx6_mmdc_sdram_size(void __iomem *mmdcbase)
 {
/*
 * It is possible to have a configuration in which both chip
@@ -296,14 +296,19 @@ static void imx6_mmdc_add_mem(void *mmdcbase, struct 
imx_esdctl_data *data)
 * IMX6_MAX_SDRAM_SIZE bytes of memory available.
 */
 
-   u64 size_cs0 = imx6_mmdc_sdram_size(mmdcbase, 0);
-   u64 size_cs1 = imx6_mmdc_sdram_size(mmdcbase, 1);
+   u64 size_cs0 = __imx6_mmdc_sdram_size(mmdcbase, 0);
+   u64 size_cs1 = __imx6_mmdc_sdram_size(mmdcbase, 1);
u64 total= size_cs0 + size_cs1;
 
resource_size_t size = min(total, (u64)IMX6_MAX_SDRAM_SIZE);
 
+   return size;
+}
+
+static void imx6_mmdc_add_mem(void *mmdcbase, struct imx_esdctl_data *data)
+{
arm_add_mem_device("ram0", data->base0,
-   size);
+  imx6_mmdc_sdram_size(mmdcbase));
 }
 
 static int imx_esdctl_probe(struct device_d *dev)
@@ -592,22 +597,14 @@ void __noreturn imx53_barebox_entry(void *boarddata)
 
 void __noreturn imx6q_barebox_entry(void *boarddata)
 {
-   u64 size_cs0 = imx6_mmdc_sdram_size(IOMEM(MX6_MMDC_P0_BASE_ADDR), 0);
-   u64 size_cs1 = imx6_mmdc_sdram_size(IOMEM(MX6_MMDC_P0_BASE_ADDR), 1);
-   u64 total= size_cs0 + size_cs1;
-
-   resource_size_t size = min(total, (u64)IMX6_MAX_SDRAM_SIZE);
-
-   barebox_arm_entry(0x1000, size, boarddata);
+   barebox_arm_entry(0x1000,
+ imx6_mmdc_sdram_size(IOMEM(MX6_MMDC_P0_BASE_ADDR)),
+ boarddata);
 }
 
 void __noreturn imx6ul_barebox_entry(void *boarddata)
 {
-   u64 size_cs0 = imx6_mmdc_sdram_size(IOMEM(MX6_MMDC_P0_BASE_ADDR), 0);
-   u64 size_cs1 = imx6_mmdc_sdram_size(IOMEM(MX6_MMDC_P0_BASE_ADDR), 1);
-   u64 total= size_cs0 + size_cs1;
-
-   resource_size_t size = min(total, (u64)IMX6_MAX_SDRAM_SIZE);
-
-   barebox_arm_entry(0x8000, size, boarddata);
+   barebox_arm_entry(0x8000,
+ imx6_mmdc_sdram_size(IOMEM(MX6_MMDC_P0_BASE_ADDR)),
+ boarddata);
 }
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 05/10] ARM: i.MX6: esdctl: Use symbolic constants for RAM base address

2018-04-10 Thread Andrey Smirnov
Use symbolic constants for RAM base address, to do that rename
MX6_MMDC_PORT0_BASE_ADDR to MX6_MMDC_PORT01_BASE_ADDR to distinguish
it from SoCs with only one DDR controller (i.MX6UL) where port 0 will
always be at 0x8000.

Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/zii-imx6q-rdu2/lowlevel.c  | 2 +-
 arch/arm/mach-imx/esdctl.c | 8 
 arch/arm/mach-imx/include/mach/imx6-regs.h | 4 +++-
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/arch/arm/boards/zii-imx6q-rdu2/lowlevel.c 
b/arch/arm/boards/zii-imx6q-rdu2/lowlevel.c
index 22ffdf85e..c9ef16ae0 100644
--- a/arch/arm/boards/zii-imx6q-rdu2/lowlevel.c
+++ b/arch/arm/boards/zii-imx6q-rdu2/lowlevel.c
@@ -304,7 +304,7 @@ ENTRY_FUNCTION(start_imx6_zii_rdu2, r0, r1, r2)
 * When still running in SRAM, we need to setup the DRAM now and load
 * the remaining image.
 */
-   if (get_pc() < MX6_MMDC_PORT0_BASE_ADDR)
+   if (get_pc() < MX6_MMDC_PORT01_BASE_ADDR)
rdu2_sram_setup();
 
if (__imx6_cpu_revision() == IMX_CHIP_REV_2_0)
diff --git a/arch/arm/mach-imx/esdctl.c b/arch/arm/mach-imx/esdctl.c
index eda8184a0..3cd7c5738 100644
--- a/arch/arm/mach-imx/esdctl.c
+++ b/arch/arm/mach-imx/esdctl.c
@@ -378,12 +378,12 @@ static __maybe_unused struct imx_esdctl_data imx53_data = 
{
 };
 
 static __maybe_unused struct imx_esdctl_data imx6q_data = {
-   .base0 = MX6_MMDC_PORT0_BASE_ADDR,
+   .base0 = MX6_MMDC_PORT01_BASE_ADDR,
.add_mem = imx6_mmdc_add_mem,
 };
 
 static __maybe_unused struct imx_esdctl_data imx6ul_data = {
-   .base0 = 0x8000,
+   .base0 = MX6_MMDC_PORT0_BASE_ADDR,
.add_mem = imx6_mmdc_add_mem,
 };
 
@@ -605,10 +605,10 @@ imx6_barebox_entry(unsigned long membase, void *boarddata)
 
 void __noreturn imx6q_barebox_entry(void *boarddata)
 {
-   imx6_barebox_entry(0x1000, boarddata);
+   imx6_barebox_entry(MX6_MMDC_PORT01_BASE_ADDR, boarddata);
 }
 
 void __noreturn imx6ul_barebox_entry(void *boarddata)
 {
-   imx6_barebox_entry(0x8000, boarddata);
+   imx6_barebox_entry(MX6_MMDC_PORT0_BASE_ADDR, boarddata);
 }
diff --git a/arch/arm/mach-imx/include/mach/imx6-regs.h 
b/arch/arm/mach-imx/include/mach/imx6-regs.h
index ac2aa2109..1ba22b5bc 100644
--- a/arch/arm/mach-imx/include/mach/imx6-regs.h
+++ b/arch/arm/mach-imx/include/mach/imx6-regs.h
@@ -117,6 +117,8 @@
 
 #define MX6_SATA_BASE_ADDR 0x0220
 
-#define MX6_MMDC_PORT0_BASE_ADDR   0x1000
+#define MX6_MMDC_PORT01_BASE_ADDR  0x1000
+#define MX6_MMDC_PORT0_BASE_ADDR   0x8000
+
 
 #endif /* __MACH_IMX6_REGS_H */
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 07/10] ARM: i.MX: esdctl: Introduce memory_sdram_size()

2018-04-10 Thread Andrey Smirnov
Introduce memory_sdram_size() - subroutine to calculate size of SDRAM
chip base on its parameters such as # or rows, columns, banks and bus
width.

Signed-off-by: Andrey Smirnov 
---
 arch/arm/mach-imx/esdctl.c | 14 --
 include/memory.h   |  8 
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/arch/arm/mach-imx/esdctl.c b/arch/arm/mach-imx/esdctl.c
index a4eb3f196..b8f048ee6 100644
--- a/arch/arm/mach-imx/esdctl.c
+++ b/arch/arm/mach-imx/esdctl.c
@@ -75,7 +75,7 @@ static inline unsigned long imx_v1_sdram_size(void __iomem 
*esdctlbase, int num)
if (ctlval & (1 << 17))
width = 4;
 
-   size = (1 << cols) * (1 << rows) * banks * width;
+   size = memory_sdram_size(cols, rows, banks, width);
 
return min_t(unsigned long, size, SZ_64M);
 }
@@ -100,7 +100,7 @@ static inline unsigned long imx_v2_sdram_size(void __iomem 
*esdctlbase, int num)
if ((ctlval & ESDCTL0_DSIZ_MASK) == ESDCTL0_DSIZ_31_0)
width = 4;
 
-   size = (1 << cols) * (1 << rows) * banks * width;
+   size = memory_sdram_size(cols, rows, banks, width);
 
return min_t(unsigned long, size, SZ_256M);
 }
@@ -127,7 +127,6 @@ static inline unsigned long imx_v4_sdram_size(void __iomem 
*esdctlbase, int cs)
 {
u32 ctlval = readl(esdctlbase + ESDCTL_V4_ESDCTL0);
u32 esdmisc = readl(esdctlbase + ESDCTL_V4_ESDMISC);
-   unsigned long size;
int rows, cols, width = 2, banks = 8;
 
if (cs == 0 && !(ctlval & ESDCTL_V4_ESDCTLx_SDE0))
@@ -153,9 +152,7 @@ static inline unsigned long imx_v4_sdram_size(void __iomem 
*esdctlbase, int cs)
if (esdmisc & ESDCTL_V4_ESDMISC_BANKS_4)
banks = 4;
 
-   size = (1 << cols) * (1 << rows) * banks * width;
-
-   return size;
+   return memory_sdram_size(cols, rows, banks, width);
 }
 
 /*
@@ -166,7 +163,6 @@ static inline u64 __imx6_mmdc_sdram_size(void __iomem 
*mmdcbase, int cs)
 {
u32 ctlval = readl(mmdcbase + MDCTL);
u32 mdmisc = readl(mmdcbase + MDMISC);
-   u64 size;
int rows, cols, width = 2, banks = 8;
 
if (cs == 0 && !(ctlval & MMDCx_MDCTL_SDE0))
@@ -192,9 +188,7 @@ static inline u64 __imx6_mmdc_sdram_size(void __iomem 
*mmdcbase, int cs)
if (mdmisc & MMDCx_MDMISC_DDR_4_BANKS)
banks = 4;
 
-   size = (u64)(1 << cols) * (1 << rows) * banks * width;
-
-   return size;
+   return memory_sdram_size(cols, rows, banks, width);
 }
 
 static void add_mem(unsigned long base0, unsigned long size0,
diff --git a/include/memory.h b/include/memory.h
index 56d16d20c..73ee7661e 100644
--- a/include/memory.h
+++ b/include/memory.h
@@ -32,4 +32,12 @@ void memory_bank_find_space(struct memory_bank *bank, 
resource_size_t *retstart,
 int memory_bank_first_find_space(resource_size_t *retstart,
 resource_size_t *retend);
 
+static inline u64 memory_sdram_size(unsigned int cols,
+   unsigned int rows,
+   unsigned int banks,
+   unsigned int width)
+{
+   return (u64)banks * width << (rows + cols);
+}
+
 #endif
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 06/10] ARM: i.MX: esdctl: Make use of min_t()

2018-04-10 Thread Andrey Smirnov
Use min_t() instead of explicit if ().

Signed-off-by: Andrey Smirnov 
---
 arch/arm/mach-imx/esdctl.c | 15 +++
 1 file changed, 3 insertions(+), 12 deletions(-)

diff --git a/arch/arm/mach-imx/esdctl.c b/arch/arm/mach-imx/esdctl.c
index 3cd7c5738..a4eb3f196 100644
--- a/arch/arm/mach-imx/esdctl.c
+++ b/arch/arm/mach-imx/esdctl.c
@@ -77,10 +77,7 @@ static inline unsigned long imx_v1_sdram_size(void __iomem 
*esdctlbase, int num)
 
size = (1 << cols) * (1 << rows) * banks * width;
 
-   if (size > SZ_64M)
-   size = SZ_64M;
-
-   return size;
+   return min_t(unsigned long, size, SZ_64M);
 }
 
 /*
@@ -105,10 +102,7 @@ static inline unsigned long imx_v2_sdram_size(void __iomem 
*esdctlbase, int num)
 
size = (1 << cols) * (1 << rows) * banks * width;
 
-   if (size > SZ_256M)
-   size = SZ_256M;
-
-   return size;
+   return min_t(unsigned long, size, SZ_256M);
 }
 
 /*
@@ -123,10 +117,7 @@ static inline unsigned long imx_v3_sdram_size(void __iomem 
*esdctlbase, int num)
if (readl(esdctlbase + IMX_ESDMISC) & ESDMISC_DDR2_8_BANK)
size *= 2;
 
-   if (size > SZ_256M)
-   size = SZ_256M;
-
-   return size;
+   return min_t(unsigned long, size, SZ_256M);
 }
 
 /*
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 09/10] i.MX: vf610-twr: Make use of vf610_barebox_entry()

2018-04-10 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/freescale-vf610-twr/lowlevel.c | 5 ++---
 arch/arm/dts/vf610-twr.dts | 1 +
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/arm/boards/freescale-vf610-twr/lowlevel.c 
b/arch/arm/boards/freescale-vf610-twr/lowlevel.c
index deabe4e37..a043dd421 100644
--- a/arch/arm/boards/freescale-vf610-twr/lowlevel.c
+++ b/arch/arm/boards/freescale-vf610-twr/lowlevel.c
@@ -3,6 +3,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -27,13 +28,11 @@ extern char __dtb_vf610_twr_start[];
 
 ENTRY_FUNCTION(start_vf610_twr, r0, r1, r2)
 {
-   void *fdt;
 
vf610_cpu_lowlevel_init();
 
if (IS_ENABLED(CONFIG_DEBUG_LL))
setup_uart();
 
-   fdt = __dtb_vf610_twr_start + get_runtime_offset();
-   barebox_arm_entry(0x8000, SZ_128M, fdt);
+   vf610_barebox_entry(__dtb_vf610_twr_start + get_runtime_offset());
 }
diff --git a/arch/arm/dts/vf610-twr.dts b/arch/arm/dts/vf610-twr.dts
index 5947fdbda..2456ade5f 100644
--- a/arch/arm/dts/vf610-twr.dts
+++ b/arch/arm/dts/vf610-twr.dts
@@ -8,6 +8,7 @@
  */
 
 #include 
+#include "vf610-ddrmc.dtsi"
 
 &usbdev0 {
status = "disabled";
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 08/10] ARM: i.MX: esdctl: Add support for Vybrid's memory controller

2018-04-10 Thread Andrey Smirnov
Add code needed to dynamically detect the amount of RAM DDR controller
is configured to use as well as a simple entry function making use of
that functionality.

Signed-off-by: Andrey Smirnov 
---
 arch/arm/dts/vf610-ddrmc.dtsi| 15 +++
 arch/arm/mach-imx/esdctl.c   | 38 
 arch/arm/mach-imx/include/mach/esdctl.h  |  1 +
 arch/arm/mach-imx/include/mach/vf610-ddrmc.h | 18 +
 arch/arm/mach-imx/include/mach/vf610-regs.h  |  2 ++
 5 files changed, 74 insertions(+)
 create mode 100644 arch/arm/dts/vf610-ddrmc.dtsi
 create mode 100644 arch/arm/mach-imx/include/mach/vf610-ddrmc.h

diff --git a/arch/arm/dts/vf610-ddrmc.dtsi b/arch/arm/dts/vf610-ddrmc.dtsi
new file mode 100644
index 0..772131ec2
--- /dev/null
+++ b/arch/arm/dts/vf610-ddrmc.dtsi
@@ -0,0 +1,15 @@
+/*
+ * Include file to switch board DTS form using hardcoded memory node
+ * to dynamic memory size detection based on DDR controller settings
+ */
+
+/ {
+   /delete-node/ memory;
+};
+
+&aips1 {
+   ddrmc@400ae000 {
+   compatible = "fsl,vf610-ddrmc";
+   reg = <0x400ae000 0x1000>;
+   };
+};
diff --git a/arch/arm/mach-imx/esdctl.c b/arch/arm/mach-imx/esdctl.c
index b8f048ee6..c1680d5ff 100644
--- a/arch/arm/mach-imx/esdctl.c
+++ b/arch/arm/mach-imx/esdctl.c
@@ -37,6 +37,7 @@
 #include 
 #include 
 #include 
+#include 
 
 struct imx_esdctl_data {
unsigned long base0;
@@ -296,6 +297,28 @@ static void imx6_mmdc_add_mem(void *mmdcbase, struct 
imx_esdctl_data *data)
   imx6_mmdc_sdram_size(mmdcbase));
 }
 
+static inline resource_size_t vf610_ddrmc_sdram_size(void __iomem *ddrmc)
+{
+   const u32 cr01 = readl(ddrmc + DDRMC_CR(1));
+   const u32 cr73 = readl(ddrmc + DDRMC_CR(73));
+   const u32 cr78 = readl(ddrmc + DDRMC_CR(78));
+
+   unsigned int rows, cols, width, banks;
+
+   rows  = DDRMC_CR01_MAX_ROW_REG(cr01) - DDRMC_CR73_ROW_DIFF(cr73);
+   cols  = DDRMC_CR01_MAX_COL_REG(cr01) - DDRMC_CR73_COL_DIFF(cr73);
+   banks = 1 << (3 - DDRMC_CR73_BANK_DIFF(cr73));
+   width = (cr78 & DDRMC_CR78_REDUC) ? sizeof(u8) : sizeof(u16);
+
+   return memory_sdram_size(cols, rows, banks, width);
+}
+
+static void vf610_ddrmc_add_mem(void *mmdcbase, struct imx_esdctl_data *data)
+{
+   arm_add_mem_device("ram0", data->base0,
+  vf610_ddrmc_sdram_size(mmdcbase));
+}
+
 static int imx_esdctl_probe(struct device_d *dev)
 {
struct resource *iores;
@@ -372,6 +395,11 @@ static __maybe_unused struct imx_esdctl_data imx6ul_data = 
{
.add_mem = imx6_mmdc_add_mem,
 };
 
+static __maybe_unused struct imx_esdctl_data vf610_data = {
+   .base0 = VF610_RAM_BASE_ADDR,
+   .add_mem = vf610_ddrmc_add_mem,
+};
+
 static struct platform_device_id imx_esdctl_ids[] = {
 #ifdef CONFIG_ARCH_IMX1
{
@@ -430,6 +458,9 @@ static __maybe_unused struct of_device_id 
imx_esdctl_dt_ids[] = {
}, {
.compatible = "fsl,imx6q-mmdc",
.data = &imx6q_data
+   }, {
+   .compatible = "fsl,vf610-ddrmc",
+   .data = &vf610_data
}, {
/* sentinel */
}
@@ -597,3 +628,10 @@ void __noreturn imx6ul_barebox_entry(void *boarddata)
 {
imx6_barebox_entry(MX6_MMDC_PORT0_BASE_ADDR, boarddata);
 }
+
+void __noreturn vf610_barebox_entry(void *boarddata)
+{
+   barebox_arm_entry(VF610_RAM_BASE_ADDR,
+ vf610_ddrmc_sdram_size(IOMEM(VF610_DDR_BASE_ADDR)),
+ boarddata);
+}
diff --git a/arch/arm/mach-imx/include/mach/esdctl.h 
b/arch/arm/mach-imx/include/mach/esdctl.h
index 53710b0f2..117e2bbad 100644
--- a/arch/arm/mach-imx/include/mach/esdctl.h
+++ b/arch/arm/mach-imx/include/mach/esdctl.h
@@ -138,6 +138,7 @@ void __noreturn imx51_barebox_entry(void *boarddata);
 void __noreturn imx53_barebox_entry(void *boarddata);
 void __noreturn imx6q_barebox_entry(void *boarddata);
 void __noreturn imx6ul_barebox_entry(void *boarddata);
+void __noreturn vf610_barebox_entry(void *boarddata);
 void imx_esdctl_disable(void);
 #endif
 
diff --git a/arch/arm/mach-imx/include/mach/vf610-ddrmc.h 
b/arch/arm/mach-imx/include/mach/vf610-ddrmc.h
new file mode 100644
index 0..07feb036e
--- /dev/null
+++ b/arch/arm/mach-imx/include/mach/vf610-ddrmc.h
@@ -0,0 +1,18 @@
+#ifndef __MACH_DDRMC_H
+#define __MACH_DDRMC_H
+
+#include 
+
+
+#define DDRMC_CR(x)((x) * 4)
+
+#define DDRMC_CR01_MAX_COL_REG(reg)(((reg) >>  8) & 0b0)
+#define DDRMC_CR01_MAX_ROW_REG(reg)(((reg) >>  0) & 0b1)
+#define DDRMC_CR73_COL_DIFF(reg)   (((reg) >> 16) & 0b00111)
+#define DDRMC_CR73_ROW_DIFF(reg)   (((reg) >>  8) & 0b00011)
+#define DDRMC_CR73_BANK_DIFF(reg)  (((reg) >>  0) & 0b00011)
+
+#define DDRMC_CR78_REDUC   BIT(8)
+
+
+#endif /* __MACH_MMDC_H */
diff --git a/arch/arm/mach-imx/include/mach/vf610-regs.h 
b/arch/arm/mach-imx/inc

[PATCH 10/10] i.MX: zii-vf610-dev: Make use of vf610_barebox_entry()

2018-04-10 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/zii-vf610-dev/lowlevel.c | 3 ++-
 arch/arm/dts/vf610-zii-dev.dtsi  | 4 +++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/arch/arm/boards/zii-vf610-dev/lowlevel.c 
b/arch/arm/boards/zii-vf610-dev/lowlevel.c
index c6663c141..f3d67501a 100644
--- a/arch/arm/boards/zii-vf610-dev/lowlevel.c
+++ b/arch/arm/boards/zii-vf610-dev/lowlevel.c
@@ -18,6 +18,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -133,5 +134,5 @@ ENTRY_FUNCTION(start_zii_vf610_dev, r0, r1, r2)
break;
}
 
-   barebox_arm_entry(0x8000, SZ_512M, fdt + get_runtime_offset());
+   vf610_barebox_entry(fdt + get_runtime_offset());
 }
diff --git a/arch/arm/dts/vf610-zii-dev.dtsi b/arch/arm/dts/vf610-zii-dev.dtsi
index 4bf81451a..dc16280bc 100644
--- a/arch/arm/dts/vf610-zii-dev.dtsi
+++ b/arch/arm/dts/vf610-zii-dev.dtsi
@@ -40,7 +40,9 @@ n * copy, modify, merge, publish, distribute, sublicense, 
and/or
  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  * OTHER DEALINGS IN THE SOFTWARE.
- */
+*/
+
+#include "vf610-ddrmc.dtsi"
 
 / {
audio_ext: mclk_osc {
-- 
2.14.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox