[PATCH v2] ARM: cache-l2x0: add resume entry for l2 in secure mode
Russell King - ARM Linux
linux at arm.linux.org.uk
Thu Sep 29 09:26:49 EDT 2011
On Thu, Sep 29, 2011 at 09:12:31PM +0800, Shawn Guo wrote:
> On Thu, Sep 29, 2011 at 01:50:26PM +0100, Russell King - ARM Linux wrote:
> > On Thu, Sep 29, 2011 at 08:44:20PM +0800, Shawn Guo wrote:
> > > Yeah, that's why I want to get imx6q stay away from this infrastructure
> > > right now. I do not see any simplicity and cleanup on imx6q current
> > > code by migrating to this infrastructure.
> >
> > Why? If the data is already saved for you, then there's no reason not
> > to use it. The fact that some generic code doesn't give you _exactly_
> > everything you'd want is not a reason to avoid it.
> >
> > The cleanup for imx6q is that it would no longer have to have its own
> > distinct code for saving the register values - and that's a danmed good
> > thing.
> >
> It cleans up the register saving but requires additional code handling
> physical address of l2x0_saved_regs.
>
> > The idea here is that we consolidate what _can_ be consolidated (which
> > is the register saving.)
> >
> > If you feel soo strongly that it's not worth doing, then let's stop
> > wasting time and review effort on this, and instead have _every_ SoC
> > implementing their own private L2 cache handling on resume.
> >
> This infrastructure is definitely good thing for platform that L2 will
> be lost during suspend. But for imx6q which retains L2, I would not
> migrate it until the physical base of L2 and l2x0_saved_regs itself can
> be retrieved from infrastructure too.
Putting the physical base of the L2 cache inside l2x0_saved_regs is
trivial (and I think will probably be done.)
What _can't_ be done - because it's _totally_ idiotic as I previously
described - is to do anything about the physical address of l2x0_saved_regs
itself.
Look - think about it for a moment. Let's say we do:
struct l2x0_saved_regs l2x0_saved_regs;
unsigned long phys_l2x0_saved_regs;
l2x0_init()
{
phys_l2x0_saved_regs = __pa(&l2x0_saved_regs);
}
Does this buy us anything? It most certainly does not - it actually
buys us additional complexity, because now we need to have platform
code knowing the _physical_ address of phys_l2x0_saved_regs in order to
get the _physical_ address of l2x0_saved_regs. Totally idiotic and
pointless - platform code might as well just use __pa(&l2x0_saved_regs)
directly in its suspend path to place it _somewhere_ that its own L2
resume code (which common code has no knowledge of) can access.
It's not that big a deal in any case - you can do this in your platform
code:
.data
.globl phys_l2x0_saved_regs
phys_l2x0_saved_regs:
.long 0
which the resume code can then access directly - and then obtain the values
directly from the l2x0_saved_reg structure.
And in your suspend initialization:
extern unsigned long phys_l2x0_saved_regs;
int my_suspend_init()
{
...
phys_l2x0_saved_regs = __pa(&l2x0_saved_regs);
}
So I think you're barking up the wrong tree if you think there's
*anything* which generic code can do to make access to l2x0_saved_regs
any easier than it is in this patch.
More information about the linux-arm-kernel
mailing list