Skip to contentSkip to conversation

Feroceon: fix kexec by setting outer_cache.inv_all

PATCH New Elijah Ragozin 2 participants 5 messages Mar 23, 2013 – Mar 25, 2013 Arm (32-bit)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Feroceon: fix kexec by setting outer_cache.inv_all

Hello,

I have a simple fix for kexec on Marvell Feroceon SoC. Originally created and tested on kernel version 2.6.39.2, but appliable for the 3.9 kernel as well.
Could you pls review. The patch is below.

From: Illia Ragozin <[email protected]>
Subject: [PATCH] [ARM] Feroceon: fix kexec by setting outer_cache.inv_all

Before the calling kexec l2 cache must be invalidated,
this is done by outer_cache.inv_all()
For Feroceon SoC inv_all function does not set in outer_cache structure and new kernel unpacking failed due to l2 cache still was not invalidated at this point.

Setting outer_cache.inv_all fixes the issue.

---
  arch/arm/mm/cache-feroceon-l2.c | 1 +
  1 file changed, 1 insertion(+)
(quoted diff) +0 -0

b/arch/arm/mm/cache-feroceon-l2.c
index e0b0e7a..09f8851 100644

arch/arm/mm/cache-feroceon-l2.c +1 -0
@@ -342,6 +342,7 @@ void __init feroceon_l2_init(int __l2_wt_override)
         outer_cache.inv_range = feroceon_l2_inv_range;
         outer_cache.clean_range = feroceon_l2_clean_range;
         outer_cache.flush_range = feroceon_l2_flush_range;
+       outer_cache.inv_all = l2_inv_all;
 
         enable_l2();
 
Signature · 5 lines
1.8.1.4

-- 
Best Regards,
Illia Ragozin.
#1 lore raw

PATCH 1/1 Feroceon: fix kexec by setting outer_cache.inv_all

Quoted 6 lines · Elijah Ragozin

Hello,

I have a simple fix for kexec on Marvell Feroceon SoC. Originally created and tested on kernel version 2.6.39.2, but appliable for the 3.9 kernel as well.
Could you pls review. The patch is below.

Hmm, I am using kexec on Kirkwood (a Feroceon SOC) and haven't had any problems with L2 coherency.. What exactly goes wrong here?

The only reason I could think of that this would make a difference is if something along the boot path was turning on/off the L2? However if you turn off the L2 then it needs to be invalidated before it is turned on again. enable_l2 already does this properly..

Is the decompressor fiddling with the L2?

Jason

#2 lore raw

PATCH 1/1 Feroceon: fix kexec by setting outer_cache.inv_all

Hi Jason,

thanks for your answer.

That's not about the boot path. I have zImage decompression error after kexec.

So on this stage boot process is not started yet, enable_l2 is called later - after zImage decompressed and started.

Please look at arch/arm/kernel/machine_kexec.c
Just before the run the code which load and run the new kernel we do:

         setup_mm_for_reboot(0);
         flush_cache_all();
         outer_flush_all(); // <- this has no map in cache-feroceon-l2.c 
, do nothing
         outer_disable(); // <- and this has no map in 
cache-feroceon-l2.c , do nothing
         cpu_proc_fin();
         outer_inv_all(); // <- and my patch is supposed to add this 
function, w/o the patch do nothing
         flush_cache_all();
         cpu_reset(reboot_code_buffer_phys);

So there is no actually disable and invalidation cache after the old kernel finished and the new one is not started yet, we're not safe to relocate and decompress the kernel.

If in your case everything is working could you please send for me .config and your kernel version, probably I also miss smth. But I think the patch is necessary, it just adds the call of function used for other ARMs, but missed for Feroceon.
--
BR, Illia.

Quoted 19 lines · Jason Gunthorpe
Quoted 6 lines · Elijah Ragozin

Hello,

I have a simple fix for kexec on Marvell Feroceon SoC. Originally created and tested on kernel version 2.6.39.2, but appliable for the 3.9 kernel as well.
Could you pls review. The patch is below.

Hmm, I am using kexec on Kirkwood (a Feroceon SOC) and haven't had any problems with L2 coherency.. What exactly goes wrong here?

The only reason I could think of that this would make a difference is if something along the boot path was turning on/off the L2? However if you turn off the L2 then it needs to be invalidated before it is turned on again. enable_l2 already does this properly..

Is the decompressor fiddling with the L2?

Jason

Signature · 2 lines
Best Regards,
Illia Ragozin.
#3 lore raw

PATCH 1/1 Feroceon: fix kexec by setting outer_cache.inv_all

Quoted 3 lines · Elijah Ragozin

So there is no actually disable and invalidation cache after the old kernel finished and the new one is not started yet, we're not safe to relocate and decompress the kernel.

Upon closer inspection I found the spec passage that the L2 becomes non-coherent with the CPU once the L1 D cache is turned off.

So, the L2 has to be invalidated after the L1 D cache is turned off, or before the L1 D cache is turned on..

Looks likes 'cpu_proc_fin' turns off the both L1 caches, so the invalidate is properly after.

This looks right to me then.

You might want to add some additional info to the the commit message along the lines of:

On Feroceon the L2 cache becomes non-coherent with the CPU when the L1 caches are disabled. Thus the L2 needs to be invalidated after both L1 caches are disabled.

.. text about kexec being the motivation ..

Quoted 2 lines

If in your case everything is working could you please send for me .config and your kernel version, probably I also miss smth.

Upon deeper reflection, in my case the L2 is re-initialized by a boot stub we use on the kexec path...

Also, I will warn you that I could not figure out how to get Linux to shut off the DMA's in things like the ethernet, so kexec is very flaky on these systems.

Jason

#4 lore raw

PATCH 1/1 Feroceon: fix kexec by setting outer_cache.inv_all

Quoted 28 lines · Jason Gunthorpe
Quoted 3 lines · Elijah Ragozin

So there is no actually disable and invalidation cache after the old kernel finished and the new one is not started yet, we're not safe to relocate and decompress the kernel.

Upon closer inspection I found the spec passage that the L2 becomes non-coherent with the CPU once the L1 D cache is turned off.

So, the L2 has to be invalidated after the L1 D cache is turned off, or before the L1 D cache is turned on..

Looks likes 'cpu_proc_fin' turns off the both L1 caches, so the invalidate is properly after.

This looks right to me then.

You might want to add some additional info to the the commit message along the lines of:

On Feroceon the L2 cache becomes non-coherent with the CPU when the L1 caches are disabled. Thus the L2 needs to be invalidated after both L1 caches are disabled.

.. text about kexec being the motivation ..

Quoted 2 lines

If in your case everything is working could you please send for me .config and your kernel version, probably I also miss smth.

Quoted 9 lines

Upon deeper reflection, in my case the L2 is re-initialized by a boot stub we use on the kexec path...

Also, I will warn you that I could not figure out how to get Linux to shut off the DMA's in things like the ethernet, so kexec is very flaky on these systems.

Jason

Thank you for this clarification,
I'll rework the commit message and resend the patch then.

Signature · 2 lines
Best Regards,
Illia Ragozin.