[PATCH] ARM: CSR: call l2x0_of_init to init L2 cache of SiRFprimaII

Barry Song 21cnbao at gmail.com
Tue Sep 13 10:43:34 EDT 2011


2011/9/13 Rob Herring <robherring2 at gmail.com>:
> On 09/13/2011 04:10 AM, Barry Song wrote:
>> Cc: Rob Herring <robherring2 at gmail.com>
>> Signed-off-by: Barry Song <Baohua.Song at csr.com>
>> ---
>>
>> This patch depends on:
>> [1]Rob Herring
>> ARM: 7009/1: l2x0: Add OF based initialization
>> http://www.spinics.net/lists/arm-kernel/msg131123.html
>> it has been in rmk/for-next
>>
>> [2]Barry Song
>> ARM: CACHE-L2X0: filter start address can be 0 and is often 0
>> http://www.spinics.net/lists/arm-kernel/msg140126.html
>> this patch fixes the filter start address error of Rob Herring'patch
>>
>>  arch/arm/mach-prima2/l2x0.c |   48 ++----------------------------------------
>>  1 files changed, 3 insertions(+), 45 deletions(-)
>>
>> diff --git a/arch/arm/mach-prima2/l2x0.c b/arch/arm/mach-prima2/l2x0.c
>> index 9cda205..5587958 100644
>> --- a/arch/arm/mach-prima2/l2x0.c
>> +++ b/arch/arm/mach-prima2/l2x0.c
>> @@ -8,52 +8,10 @@
>>
>>  #include <linux/init.h>
>>  #include <linux/kernel.h>
>> -#include <linux/io.h>
>> -#include <linux/errno.h>
>> -#include <linux/of.h>
>> -#include <linux/of_address.h>
>>  #include <asm/hardware/cache-l2x0.h>
>> -#include <mach/memory.h>
>>
>> -#define L2X0_ADDR_FILTERING_START       0xC00
>> -#define L2X0_ADDR_FILTERING_END         0xC04
>> -
>> -static struct of_device_id l2x_ids[]  = {
>> -     { .compatible = "arm,pl310-cache" },
>> -};
>> -
>> -static int __init sirfsoc_of_l2x_init(void)
>> +static int __init sirfsoc_l2x0_init(void)
>>  {
>> -     struct device_node *np;
>> -     void __iomem *sirfsoc_l2x_base;
>> -
>> -     np = of_find_matching_node(NULL, l2x_ids);
>> -     if (!np)
>> -             panic("unable to find compatible l2x node in dtb\n");
>> -
>> -     sirfsoc_l2x_base = of_iomap(np, 0);
>> -     if (!sirfsoc_l2x_base)
>> -             panic("unable to map l2x cpu registers\n");
>> -
>> -     of_node_put(np);
>> -
>> -     if (!(readl_relaxed(sirfsoc_l2x_base + L2X0_CTRL) & 1)) {
>> -             /*
>> -              * set the physical memory windows L2 cache will cover
>> -              */
>> -             writel_relaxed(PLAT_PHYS_OFFSET + 1024 * 1024 * 1024,
>> -                     sirfsoc_l2x_base + L2X0_ADDR_FILTERING_END);
>> -             writel_relaxed(PLAT_PHYS_OFFSET | 0x1,
>> -                     sirfsoc_l2x_base + L2X0_ADDR_FILTERING_START);
>> -
>> -             writel_relaxed(0,
>> -                     sirfsoc_l2x_base + L2X0_TAG_LATENCY_CTRL);
>> -             writel_relaxed(0,
>> -                     sirfsoc_l2x_base + L2X0_DATA_LATENCY_CTRL);
>> -     }
>> -     l2x0_init((void __iomem *)sirfsoc_l2x_base, 0x00040000,
>> -             0x00000000);
>> -
>> -     return 0;
>> +     return l2x0_of_init(0x40000, 0);
>>  }
>> -early_initcall(sirfsoc_of_l2x_init);
>> +early_initcall(sirfsoc_l2x0_init);
>
> This needs to be called from a prima2 function that is only run for this
> platform rather than an initcall. This will run all platforms in a
> single kernel build. However, the that's not really a new problem with
> this patch, so you could fix in a follow-on patch.

then it is difficult to find a place to call it. this function needs
to be called after mm_init since l2x0_of_init needs of_iomap, irq init
is the thing closely following mm_init, but it is strange to call it
in .init_irq.  .init_machine looks ok, but it is much later than
early_initcall but we want to enable l2 as early as possible.

before sending this patch, i thought much. an early_initcall seems to
be better since it is early and not embedded into function like
.init_irq.

which function did you intend to call l2x0_of_init while you sent your
original patch?

>
> Rob

-barry



More information about the linux-arm-kernel mailing list