[PATCH V2 3/6] arm: cache-l2x0: add support for Aurora L2 cache ctrl
Gregory CLEMENT
gregory.clement at free-electrons.com
Wed Sep 5 05:23:38 EDT 2012
On 09/04/2012 07:26 PM, Will Deacon wrote:
> On Tue, Sep 04, 2012 at 03:50:18PM +0100, Gregory CLEMENT wrote:
>>>> + /*
>>>> + * Clean and invalidate partial last cache line.
>>>> + */
>>>> + if (start < end && end & (CACHE_LINE_SIZE - 1)) {
>>>> + writel((end & ~(CACHE_LINE_SIZE - 1)) & ~0x1f,
>>>> + l2x0_base + AURORA_FLUSH_PHY_ADDR_REG);
>>>> + cache_sync();
>>>> + end &= ~(CACHE_LINE_SIZE - 1);
>>>> + }
>>>> +
>>>> + /*
>>>> + * Invalidate all full cache lines between 'start' and 'end'.
>>>> + */
>>>> + while (start < end) {
>>>> + unsigned long range_end = calc_range_end(start, end);
>>>> + aurora_pa_range(start, range_end - CACHE_LINE_SIZE,
>>>> + AURORA_INVAL_RANGE_REG);
>>>> + start = range_end;
>>>> + }
>>>> +
>>>> + dsb();
>>>
>>> Why? (same for the other dsbs following writels/cache_syncs).
>>
>> I will ask if it is really needed.
>
> I just think you'll get the dsb() via aurora_pa_range, so you shouldn't need
> the extra one after the loop.
Well actually we get a cache_sync() and not a dsb from aurora_pa_range. But
I've just received the confirmation that the cache_sync is enough, so I will
remove the dsb.
>
>>>> +static void aurora_resume(void)
>>>> +{
>>>> + u32 u;
>>>> +
>>>> + u = readl(l2x0_base + L2X0_CTRL);
>>>> + if (!(u & 1)) {
>>>
>>> We should probably add a L2X0_CTRL_EN define and use that (also update the
>>> enabling code to use it as well).
>>>
>>
>> Should it be a separate patch or can I include it with this one?
>
> I think you can just include it here (it's trivial to implement).
OK (it's already done).
>
>>>> +static void __init aurora_of_setup(const struct device_node *np,
>>>> + u32 *aux_val, u32 *aux_mask)
>>>> +{
>>>> + u32 val = AURORA_ACR_REPLACEMENT_TYPE_SEMIPLRU;
>>>> + u32 mask = AURORA_ACR_REPLACEMENT_MASK;
>>>> +
>>>> + of_property_read_u32(np, "cache-id-part",
>>>> + &cache_id_part_number_from_dt);
>>>> +
>>>> + /* Determine and save the write policy */
>>>> + l2_wt_override = of_property_read_bool(np, "wt-override");
>>>> +
>>>> + if (l2_wt_override) {
>>>> + val |= AURORA_ACR_FORCE_WRITE_THRO_POLICY;
>>>> + mask |= AURORA_ACR_FORCE_WRITE_POLICY_MASK;
>>>> + }
>>>
>>> smp_mb() after the assignment to l2_wt_override?
>>
>> Sorry I don't get your point, why do you think we need this?
>
> In case you get an outer_cache operation from a different core before the
> assignment to l2_wt_override has become visible, in which case you might
> accidentally skip the operation (e.g. if it's clean). This may well be
> overkill, since we probably have the same problem for stuff like the base
> address already.
But aurora_of_setup is called during the init, and this init is called
before any smp initializations: when this function is called only one
core is running. So there is no need to worry about it.
>
> Will
>
--
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
More information about the linux-arm-kernel
mailing list