From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Jacopo Mondi <jacopo+renesas@jmondi.org>
Cc: ysato@users.sourceforge.jp, dalias@libc.org,
linux-sh@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] sh: migor: Reserve memory block for CEU
Date: Thu, 09 Nov 2017 01:39:42 +0000 [thread overview]
Message-ID: <2038988.rgqq23lX41@avalon> (raw)
In-Reply-To: <1510164346-21134-1-git-send-email-jacopo+renesas@jmondi.org>
Hi Jacopo,
Thank you for the patch.
On Wednesday, 8 November 2017 20:05:46 EET Jacopo Mondi wrote:
> A memory region for CEU video buffer has to be reserved during machine
> initialization.
>
> Originally, it was allocated through DMA API helpers and stored in the
> second IORESOURCE_MEM entry, to be later remapped by the CEU driver with
> a call to 'dma_declare_coherent_memory()'
>
> As Linux does not allow anymore to remap system RAM regions with
> 'memremap' function, sh_mobile_ceu driver fails when trying to remap the
> memory area:
>
> WARN_ONCE(1, "memremap attempted on ram %pa size: %#lx\n",
> &offset, (unsigned long) size)
>
> from 'memremap()' function in kernel/memremap.c
>
> To avoid hitting that WARN_ONCE() and have memory successfully remapped,
> reserve a region using '.mv_mem_reserve' member of SH's 'struct
> sh_machine_vector' to make sure memory is reserved early enough, and
> removed from the available system RAM.
I'd phrase it the other way around. The important point here is that the
reserved memory block must be removed from system memory in order to be
remapable. This requires usage of the memblock API, and as this API is only
usable very early during the boot process, we have to use the .mv_mem_reserve
operation.
> This is similar to what happens on ARM architecture with
> 'arm_memblock_steal()' function.
>
> Suggested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
> ---
> arch/sh/boards/mach-migor/setup.c | 28 ++++++++++++++++++++++++++--
> 1 file changed, 26 insertions(+), 2 deletions(-)
>
> diff --git a/arch/sh/boards/mach-migor/setup.c
> b/arch/sh/boards/mach-migor/setup.c index 0bcbe58..080627c 100644
> --- a/arch/sh/boards/mach-migor/setup.c
> +++ b/arch/sh/boards/mach-migor/setup.c
> @@ -12,6 +12,7 @@
> #include <linux/interrupt.h>
> #include <linux/input.h>
> #include <linux/input/sh_keysc.h>
> +#include <linux/memblock.h>
> #include <linux/mmc/host.h>
> #include <linux/mtd/physmap.h>
> #include <linux/mfd/tmio.h>
> @@ -45,6 +46,9 @@
> * 0x18000000 8GB 8 NAND Flash (K9K8G08U0A)
> */
>
> +#define CEU_BUFFER_MEMORY_SIZE (4 << 20)
> +static phys_addr_t ceu_dma_membase;
> +
> static struct smc91x_platdata smc91x_info = {
> .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
> };
> @@ -501,6 +505,8 @@ extern char migor_sdram_leave_end;
>
> static int __init migor_devices_setup(void)
> {
> + struct resource *r = &migor_ceu_device.resource[2];
> +
> /* register board specific self-refresh code */
> sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF,
> &migor_sdram_enter_start,
> @@ -632,8 +638,6 @@ static int __init migor_devices_setup(void)
> #endif
> __raw_writew(__raw_readw(PORT_MSELCRB) | 0x2000, PORT_MSELCRB); /* D15->D8
> */
>
> - platform_resource_setup_memory(&migor_ceu_device, "ceu", 4 << 20);
> -
> /* SIU: Port B */
> gpio_request(GPIO_FN_SIUBOLR, NULL);
> gpio_request(GPIO_FN_SIUBOBT, NULL);
> @@ -647,6 +651,12 @@ static int __init migor_devices_setup(void)
> */
> __raw_writew(__raw_readw(PORT_MSELCRA) | 1, PORT_MSELCRA);
>
> + /* Setup additional memory resources for Migo-R */
I would initialize the r variable here instead of at declaration time to make
the code more readable. Otherwise the reader will have to scroll back to find
out what r points to.
Other than that,
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> + r->flags = IORESOURCE_MEM;
> + r->start = ceu_dma_membase;
> + r->end = r->start + CEU_BUFFER_MEMORY_SIZE - 1;
> + r->name = "ceu";
> +
> i2c_register_board_info(0, migor_i2c_devices,
> ARRAY_SIZE(migor_i2c_devices));
>
> @@ -665,10 +675,24 @@ static int migor_mode_pins(void)
> return MODE_PIN0 | MODE_PIN1 | MODE_PIN5;
> }
>
> +/* Reserve a portion of memory for CEU buffers */
> +static void __init migor_mv_mem_reserve(void)
> +{
> + phys_addr_t phys;
> + phys_addr_t size = CEU_BUFFER_MEMORY_SIZE;
> +
> + phys = memblock_alloc_base(size, PAGE_SIZE, MEMBLOCK_ALLOC_ANYWHERE);
> + memblock_free(phys, size);
> + memblock_remove(phys, size);
> +
> + ceu_dma_membase = phys;
> +}
> +
> /*
> * The Machine Vector
> */
> static struct sh_machine_vector mv_migor __initmv = {
> .mv_name = "Migo-R",
> .mv_mode_pins = migor_mode_pins,
> + .mv_mem_reserve = migor_mv_mem_reserve,
> };
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2017-11-09 1:39 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-08 18:05 [PATCH] sh: migor: Reserve memory block for CEU Jacopo Mondi
2017-11-08 18:31 ` Geert Uytterhoeven
2017-11-09 1:32 ` Laurent Pinchart
2017-11-09 1:39 ` Laurent Pinchart [this message]
2017-11-14 16:59 ` jacopo mondi
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=2038988.rgqq23lX41@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=dalias@libc.org \
--cc=jacopo+renesas@jmondi.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=linux-sh@vger.kernel.org \
--cc=ysato@users.sourceforge.jp \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).