On 08/09/16 11:40, Marek Vasut wrote:
> On 09/08/2016 12:31 PM, Paul Burton wrote:
>> On 08/09/16 11:04, Marek Vasut wrote:
>>> On 09/07/2016 07:48 PM, Paul Burton wrote:
>>>> This patch adds support for initialising & maintaining L2 caches on MIPS
>>>> systems. The L2 cache configuration may be advertised through either
>>>> coprocessor 0 or the MIPS Coherence Manager depending upon the system,
>>>> and support for both is included.
>>>>
>>>> If the L2 can be bypassed then we bypass it early in boot & initialise
>>>> the L1 caches first, such that we can start making use of the L1
>>>> instruction cache as early as possible. Otherwise we initialise the L2
>>>> first such that the L1s have no opportunity to generate access to the
>>>> uninitialised L2.
>>>>
>>>> Signed-off-by: Paul Burton <paul.bur...@imgtec.com>
>>>> ---
>>>>
>>>>  arch/mips/Kconfig                   |   6 ++
>>>>  arch/mips/include/asm/cm.h          |  38 ++++++++
>>>>  arch/mips/include/asm/global_data.h |   3 +
>>>>  arch/mips/include/asm/mipsregs.h    |   5 +
>>>>  arch/mips/lib/cache.c               |  62 ++++++++++++-
>>>>  arch/mips/lib/cache_init.S          | 180 
>>>> +++++++++++++++++++++++++++++++++++-
>>>>  6 files changed, 288 insertions(+), 6 deletions(-)
>>>>
>>>> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
>>>> index 732d129..8f97727 100644
>>>> --- a/arch/mips/Kconfig
>>>> +++ b/arch/mips/Kconfig
>>>> @@ -301,6 +301,12 @@ config MIPS_L1_CACHE_SHIFT
>>>>    default "4" if MIPS_L1_CACHE_SHIFT_4
>>>>    default "5"
>>>>  
>>>> +config MIPS_L2_CACHE
>>>> +  bool
>>>> +  help
>>>> +    Select this if your system includes an L2 cache and you want U-Boot
>>>> +    to initialise & maintain it.
>>>> +
>>>>  config DYNAMIC_IO_PORT_BASE
>>>>    bool
>>>>  
>>>> diff --git a/arch/mips/include/asm/cm.h b/arch/mips/include/asm/cm.h
>>>> index 0261733..62ecef2 100644
>>>> --- a/arch/mips/include/asm/cm.h
>>>> +++ b/arch/mips/include/asm/cm.h
>>>> @@ -12,8 +12,46 @@
>>>>  #define GCR_BASE                  0x0008
>>>>  #define GCR_BASE_UPPER                    0x000c
>>>>  #define GCR_REV                           0x0030
>>>> +#define GCR_L2_CONFIG                     0x0130
>>>> +#define GCR_L2_TAG_ADDR                   0x0600
>>>> +#define GCR_L2_TAG_ADDR_UPPER             0x0604
>>>> +#define GCR_L2_TAG_STATE          0x0608
>>>> +#define GCR_L2_TAG_STATE_UPPER            0x060c
>>>> +#define GCR_L2_DATA                       0x0610
>>>> +#define GCR_L2_DATA_UPPER         0x0614
>>>>  
>>>>  /* GCR_REV CM versions */
>>>>  #define GCR_REV_CM3                       0x0800
>>>>  
>>>> +/* GCR_L2_CONFIG fields */
>>>> +#define GCR_L2_CONFIG_ASSOC_SHIFT 0
>>>> +#define GCR_L2_CONFIG_ASSOC_BITS  8
>>>> +#define GCR_L2_CONFIG_LINESZ_SHIFT        8
>>>> +#define GCR_L2_CONFIG_LINESZ_BITS 4
>>>> +#define GCR_L2_CONFIG_SETSZ_SHIFT 12
>>>> +#define GCR_L2_CONFIG_SETSZ_BITS  4
>>>> +#define GCR_L2_CONFIG_BYPASS              (1 << 20)
>>>> +
>>>> +#ifndef __ASSEMBLY__
>>>> +
>>>> +#include <asm/io.h>
>>>> +
>>>> +static inline void *mips_cm_base(void)
>>>> +{
>>>> +  return (void *)CKSEG1ADDR(CONFIG_MIPS_CM_BASE);
>>>> +}
>>>> +
>>>> +static inline unsigned long mips_cm_l2_line_size(void)
>>>> +{
>>>> +  unsigned long l2conf, line_sz;
>>>> +
>>>> +  l2conf = __raw_readl(mips_cm_base() + GCR_L2_CONFIG);
>>>> +
>>>> +  line_sz = l2conf >> GCR_L2_CONFIG_LINESZ_SHIFT;
>>>> +  line_sz &= GENMASK(GCR_L2_CONFIG_LINESZ_BITS - 1, 0);
>>>> +  return line_sz ? (2 << line_sz) : 0;
>>>> +}
>>>
>>> Drop the inline stuff, the compiler can decide that itself, especially
>>> on static functions. The inline is only a hint anyway.
>>>
>>> [...]
>>
>> Hi Marek,
>>
>> Nope - inline does have an impact for functions in headers. If it's not
>> there & a file includes a header but doesn't use *all* of the functions
>> in it then the compiler will warn about the functions being unused. With
>> inline that isn't the case. Thus "static inline" is used quite
>> extensively in many of the headers under include/.
> 
> Uh, I didn't notice these functions were placed in a header file. Is
> that really necessary at all or can you move them to a C file ?

I could move them, but then the compiler wouldn't get an opportunity to
inline these short functions. I don't see any downside to keeping these
in the same place as the registers they access are defined.

Thanks,
    Paul

> 
>> Thanks,
>>     Paul
>>
> 
> 
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to