[U-Boot] [PATCH 1/1] ARM: Move SYS_CACHELINE_SIZE over to Kconfig
Masahiro Yamada
yamada.masahiro at socionext.com
Mon Aug 22 13:36:15 CEST 2016
Hi Tom,
2016-08-22 5:18 GMT+09:00 Tom Rini <trini at konsulko.com>:
> On Mon, Aug 22, 2016 at 01:32:52AM +0900, Masahiro Yamada wrote:
>> Hi Tom,
>>
>>
>> 2016-08-22 0:43 GMT+09:00 Tom Rini <trini at konsulko.com>:
>> > On Mon, Aug 22, 2016 at 12:28:19AM +0900, Masahiro Yamada wrote:
>> >> Hi Tom,
>> >>
>> >>
>> >>
>> >> > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
>> >> > index aef901c..15cd66a 100644
>> >> > --- a/arch/arm/Kconfig
>> >> > +++ b/arch/arm/Kconfig
>> >> > @@ -79,6 +79,11 @@ config SYS_ARM_ARCH
>> >> > default 4 if CPU_SA1100
>> >> > default 8 if ARM64
>> >> >
>> >> > +config SYS_CACHELINE_SIZE
>> >> > + int
>> >> > + default 64 if CPU_V7 || ARM64
>> >
>> > Note! I had a brain fart here last night and used 'printf %x' when I
>> > thought I was doing 'printf %d', so, no, ARM64 should get moved up to
>> > shift 7 / 128 bytes.
>>
>>
>> As far as I know, the line size of the cores from ARM Ltd. (CA-53, 57, 72)
>> is 64 byte.
>>
>>
>> ARM64 Linux increased the line size up to 128 byte for the Cavium's core
>> because it is multi-platform.
>>
>>
>> ------------------------------>8--------------------------------------
>>
>> commit 97303480753e48fb313dc0e15daaf11b0451cdb8
>> Author: Tirumalesh Chalamarla <tchalamarla at cavium.com>
>> Date: Tue Sep 22 19:59:48 2015 +0200
>>
>> arm64: Increase the max granular size
>>
>> Increase the standard cacheline size to avoid having locks in the same
>> cacheline.
>>
>> Cavium's ThunderX core implements cache lines of 128 byte size. With
>> current granulare size of 64 bytes (L1_CACHE_SHIFT=6) two locks could
>> share the same cache line leading a performance degradation.
>> Increasing the size fixes that.
>>
>> Increasing the size has no negative impact to cache invalidation on
>> systems with a smaller cache line. There is an impact on memory usage,
>> but that's not too important for arm64 use cases.
>>
>> Signed-off-by: Tirumalesh Chalamarla <tchalamarla at cavium.com>
>> Signed-off-by: Robert Richter <rrichter at cavium.com>
>> Acked-by: Timur Tabi <timur at codeaurora.org>
>> Signed-off-by: Catalin Marinas <catalin.marinas at arm.com>
>>
>> diff --git a/arch/arm64/include/asm/cache.h b/arch/arm64/include/asm/cache.h
>> index bde4499..5082b30 100644
>> --- a/arch/arm64/include/asm/cache.h
>> +++ b/arch/arm64/include/asm/cache.h
>> @@ -18,7 +18,7 @@
>>
>> #include <asm/cachetype.h>
>>
>> -#define L1_CACHE_SHIFT 6
>> +#define L1_CACHE_SHIFT 7
>> #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
>>
>> /*
>>
>> --------------------------------------8<-------------------------------------
>>
>>
>> U-Boot does not adopt multi-platform,
>> so we can make the ARCH_THUNDERX select CACHESHIFT_7
>> and allow other ARM64 SoCs to stay at CACHESHIFT_6.
>> Just my 2 cents.
>
> OK, good point, thanks!
>
>> >> This idea was borrowed from Linux.
>> >> (you can grep "_L1_CACHE_SHIFT" in Linux Kconfig files.)
>> >
>> > I'm agreeable to moving over to shift to more obviously align with the
>> > Linux Kernel (and it will make other arches easier to migrate too). But
>> > the UniPhier case currently looks to me like it's overloading what
>> > CONFIG_SYS_CACHELINE_SIZE is doing,
>>
>> First, I'd like to know if CONFIG_SYS_CACHELINE_SIZE
>> means the line size of L1 cache,
>> or the largest line size across all the cache levels.
>
> Good question. This I think ends up being a historical ambiguity. My
> poking around in git log suggests that when CFG_SYS_CACHELINE_SIZE was
> added it was implicitly L1. It's gone on to mean "cache alignment
> required for DMA". It is often defined as L1 and only occasionally
> defined differently. Presumably because it needs to be higher on those
> systems for DMA/etc. In sum, I remove my objection to UniPhier maybe
> overloading something that it shouldn't, it's doing the right thing.
Right.
Given that
likely(CONFIG_SYS_CACHELINE_SIZE == ARCH_DMA_ALIGN)
I have to set CONFIG_SYS_CACHELINE_SIZE to 128
when the outer cache is enabled because
DMA engines are located outside of the cache topology.
>> > ie in the Linux Kernel it's not
>> > setting the shift to 7, in 32bit. Or is this a 64bit only feature?
>> > Thanks!
>>
>> CACHE_UNIPHIER is a full-custom outer cache
>> only implemented in its 32bit SoC lineup.
>>
>>
>> UniPhier (32bit) is a very unfortunate case
>> where outer-cache has a different line size
>> than the L1 line size.
>>
>>
>> L1 (ARM native, inner): 32byte line (shift 5)
>> L2 (UniPhier outer cache): 128byte line (shift 7)
>>
>>
>>
>> For Linux, it is just not upstreamed yet.
>>
>>
>> If you are interested, check the following:
>> http://lists.infradead.org/pipermail/linux-arm-kernel/2016-January/400289.html
>>
>>
>> If I set the shift to 7, it would affect all the other SoCs in
>> multi_v7_defconfig,
>> which other vendors would probably be unhappy about.
>>
>> Again, it is no problem in U-Boot, which is not multi-platform.
>
> Ah, OK. So then the question is, are we OK with things like the
> following in the .config file:
> CONFIG_SYS_CACHE_SHIFT_6=y
> CONFIG_SYS_CACHE_SHIFT_7=y
> CONFIG_SYS_CACHELINE_SIZE=128
>
> ?
Yes, I think it is OK.
--
Best Regards
Masahiro Yamada
More information about the U-Boot
mailing list