[U-Boot] [PATCH 8/9] MIPS: L2 cache support

Paul Burton paul.burton at imgtec.com
Thu Sep 8 13:24:37 CEST 2016


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.burton at 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
>>
> 
> 


More information about the U-Boot mailing list