devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Rob Herring <robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: "Heiko Stübner" <heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
Cc: Russell King <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>,
	Greg Kroah-Hartman
	<gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>,
	"devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org"
	<devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org>,
	"linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	Grant Likely
	<grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	Ulrich Prinz
	<ulrich.prinz-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>,
	Philipp Zabel <p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>,
	"linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org"
	<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>
Subject: Re: [PATCH v3 2/6] misc: sram: add ability to mark sram sections as reserved
Date: Sun, 7 Jul 2013 14:46:36 -0500	[thread overview]
Message-ID: <CAL_JsqJDDg5Z2sN+VLArDU3vox-fLCVynkPg7Pe0LJjksXaGkw@mail.gmail.com> (raw)
In-Reply-To: <201307051441.27605.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>

On Fri, Jul 5, 2013 at 7:41 AM, Heiko Stübner <heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org> wrote:
> Some SoCs need parts of their sram for special purposes. So while being part
> of the periphal, it should not be part of the genpool controlling the sram.

s/periphal/peripheral/

>
> Threfore add an option mmio-sram-reserved to keep arbitary portions of the

s/Threfore/Therefore/
s/arbitary/arbitrary/

> sram from being part of the pool.
>
> Suggested-by: Rob Herring <robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> Signed-off-by: Heiko Stuebner <heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
> Tested-by: Ulrich Prinz <ulrich.prinz-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>
> ---
>  Documentation/devicetree/bindings/misc/sram.txt |    8 +++
>  drivers/misc/sram.c                             |   80 +++++++++++++++++++++--
>  2 files changed, 82 insertions(+), 6 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/misc/sram.txt b/Documentation/devicetree/bindings/misc/sram.txt
> index 4d0a00e..eae080e 100644
> --- a/Documentation/devicetree/bindings/misc/sram.txt
> +++ b/Documentation/devicetree/bindings/misc/sram.txt
> @@ -8,9 +8,17 @@ Required properties:
>
>  - reg : SRAM iomem address range
>
> +Optional properties:
> +
> +- mmio-sram-reserved: ordered list of reserved chunks inside the sram that
> +  should not become part of the genalloc pool.

genalloc is linux specific. "should not be used by the OS" would be better.

> +  Format is <base size>, <base size>, ...; with base being relative to the
> +  reg property base.
> +
>  Example:
>
>  sram: sram@5c000000 {
>         compatible = "mmio-sram";
>         reg = <0x5c000000 0x40000>; /* 256 KiB SRAM at address 0x5c000000 */
> +       mmio-sram-reserved = <0x0 0x100>; /* reserve 0x5c000000-0x5c000100 */
>  };
> diff --git a/drivers/misc/sram.c b/drivers/misc/sram.c
> index afe66571..9131e4a 100644
> --- a/drivers/misc/sram.c
> +++ b/drivers/misc/sram.c
> @@ -42,6 +42,13 @@ static int sram_probe(struct platform_device *pdev)
>         struct sram_dev *sram;
>         struct resource *res;
>         unsigned long size;
> +       const __be32 *reserved_list = NULL;
> +       int reserved_size = 0;
> +       unsigned int cur_start = 0;
> +       unsigned int cur_size;
> +       unsigned int rstart;
> +       unsigned int rsize;

Use one line for each type.

> +       int i;
>         int ret;
>
>         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> @@ -65,12 +72,73 @@ static int sram_probe(struct platform_device *pdev)
>         if (!sram->pool)
>                 return -ENOMEM;
>
> -       ret = gen_pool_add_virt(sram->pool, (unsigned long)virt_base,
> -                               res->start, size, -1);
> -       if (ret < 0) {
> -               if (sram->clk)
> -                       clk_disable_unprepare(sram->clk);
> -               return ret;
> +       if (pdev->dev.of_node) {
> +               reserved_list = of_get_property(pdev->dev.of_node,
> +                                               "mmio-sram-reserved",
> +                                               &reserved_size);
> +               if (reserved_list) {
> +                       reserved_size /= sizeof(*reserved_list);
> +                       if (!reserved_size || reserved_size % 2) {
> +                               dev_warn(&pdev->dev, "wrong number of arguments in mmio-sram-reserved\n");
> +                               reserved_list = NULL;
> +                       }
> +               }
> +       }
> +
> +       if (!reserved_list)
> +               reserved_size = 0;

This can be moved to where you set reserved_list to NULL.

> +
> +       for (i = 0; i < (reserved_size + 2); i += 2) {
> +               if (i < reserved_size) {

This loop is hard to follow. For example, it is not immediate obvious
why you loop an extra time. I think it would be more straight forward
to determine the free regions first and then do the allocations. This
will require a kmalloc or fixed max number of regions, but would
improve readability.

Rob

> +                       /* get the next reserved block */
> +                       rstart = be32_to_cpu(*reserved_list++);
> +                       rsize = be32_to_cpu(*reserved_list++);
> +
> +                       /* catch unsorted list entries */
> +                       if (rstart < cur_start) {
> +                               dev_err(&pdev->dev,
> +                                       "unsorted reserved list (0x%x before current 0x%x)\n",
> +                                       rstart, cur_start);
> +                               if (sram->clk)
> +                                       clk_disable_unprepare(sram->clk);
> +                               return -EINVAL;
> +                       }
> +
> +                       dev_dbg(&pdev->dev,
> +                               "found reserved block 0x%x-0x%x\n",
> +                               rstart, rstart + rsize);
> +               } else {
> +                       /* the last chunk extends to the end of the region */
> +                       rstart = size;
> +                       rsize = 0;
> +               }
> +
> +               /* current start is in a reserved block */
> +               if (rstart <= cur_start) {
> +                       cur_start = rstart + rsize;
> +                       continue;
> +               }
> +
> +               /*
> +                * allocate the space between the current starting
> +                * address and the following reserved block, or the
> +                * end of the region.
> +                */
> +               cur_size = rstart - cur_start;
> +
> +               dev_dbg(&pdev->dev, "adding chunk 0x%x-0x%x\n",
> +                       cur_start, cur_start + cur_size);
> +               ret = gen_pool_add_virt(sram->pool,
> +                               (unsigned long)virt_base + cur_start,
> +                               res->start + cur_start, cur_size, -1);
> +               if (ret < 0) {
> +                       if (sram->clk)
> +                               clk_disable_unprepare(sram->clk);
> +                       return ret;
> +               }
> +
> +               /* next allocation after this reserved block */
> +               cur_start = rstart + rsize;
>         }
>
>         platform_set_drvdata(pdev, sram);
> --
> 1.7.10.4
>

  parent reply	other threads:[~2013-07-07 19:46 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-05 12:40 [PATCH v3 0/6] ARM: rockchip: add smp functionality Heiko Stübner
2013-07-05 12:42 ` [PATCH v3 4/6] ARM: rockchip: add sram dt nodes and documentation Heiko Stübner
     [not found] ` <201307051440.19428.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
2013-07-05 12:40   ` [PATCH v3 1/6] misc: sram: fix error path in sram_probe Heiko Stübner
     [not found]     ` <201307051440.53993.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
2013-07-05 14:23       ` Philipp Zabel
2013-07-05 12:41   ` [PATCH v3 2/6] misc: sram: add ability to mark sram sections as reserved Heiko Stübner
     [not found]     ` <201307051441.27605.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
2013-07-05 12:55       ` Fabio Estevam
     [not found]         ` <CAOMZO5AHX0UpeKQh+faPT=MfCf53eo=kXigtOZd7iuKrz-sFeA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-07-05 14:23           ` Heiko Stübner
2013-07-05 14:24       ` Philipp Zabel
2013-07-07 19:46       ` Rob Herring [this message]
2013-07-05 12:41   ` [PATCH v3 3/6] ARM: rockchip: add snoop-control-unit Heiko Stübner
2013-07-05 12:42   ` [PATCH v3 5/6] ARM: rockchip: add power-management-unit dt node Heiko Stübner
2013-07-05 12:43   ` [PATCH v3 6/6] ARM: rockchip: add smp bringup code Heiko Stübner
2013-07-05 14:55     ` Fabio Estevam

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=CAL_JsqJDDg5Z2sN+VLArDU3vox-fLCVynkPg7Pe0LJjksXaGkw@mail.gmail.com \
    --to=robherring2-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
    --cc=grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
    --cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
    --cc=heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org \
    --cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org \
    --cc=p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org \
    --cc=ulrich.prinz-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org \
    /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).