From: Paul Cercueil <paul@crapouillou.net>
To: Mike Yang <reimu@sudomaker.com>
Cc: linux-mips@vger.kernel.org,
Zhou Yanjie <zhouyanjie@wanyeetech.com>,
aidanmacdonald.0x0@gmail.com
Subject: Re: RFC: Proper suspend-to-ram implementation of Ingenic SoCs
Date: Tue, 12 Jul 2022 21:28:27 +0100 [thread overview]
Message-ID: <FVCXER.DV642VYMZNVS1@crapouillou.net> (raw)
In-Reply-To: <e58406ce-a79b-fe91-9587-09e87953d0ab@sudomaker.com>
Hi Mike,
Le mer., juil. 13 2022 at 03:19:32 +0800, Mike Yang
<reimu@sudomaker.com> a écrit :
> The suspend-to-ram implementation of Ingenic SoCs in the current
> kernel is nowhere near usable, especially for the X series SoCs.
> Since it involves turning off CPU core power and putting DRAM into
> self-refresh mode, things are a bit complicated. Turning off CPU core
> power means all register files and cache contents are lost. Putting
> DRAM into self-refresh mode means it will no longer respond to bus
> transactions.
Suspend-to-RAM is well-tested and has been working fine for ages on all
JZ SoCs, so I wouldn't call it "nowhere near usable". Zhou also
implemented it on X-series SoCs.
> I ported the implementation from Ingenic's 3.10 kernel to 5.18, and
> it worked. But it involves a separate piece of executable code, and
> apparently there's no way to eliminate it. During pm_enter(), various
> CPM registers are configured to turn off CPU core and put DRAM into
> self-refresh upon issuing the "wait" instruction, this piece of
> executable code will be copied to the on-chip SRAM, and its entry
> address will be written into the CPM.SLPC register. Then, cache will
> be flushed and CPU register files (incl. CP0, CP1 stuff) will also be
> saved in the SRAM. Finally, the "wait" instruction will be issued,
> and the suspend procedure completed. When any external events trigger
> a resume, the CPU is powered on, and immediately jumps to the PC
> stored in CPM.SLPC, and starts executing the piece of code. The code
> will perform the usual crt0 stuff on MIPS machines, reconfigure the
> DRAM into normal mode, and finally restore the register files. Then
> the control flow goes back to pm_enter(), and the resume procedure is
> completed.
This sounds extremely complex and way overkill. But you don't need any
of this.
> The suspend-to-ram really saves a lot of power. For my particular
> board, the idle power consumption is about 0.24W (1.25V Vcore,
> 1.2GHz, 1000Hz, preempt). After suspend-to-ram, it drops to only
> 0.045W.
Yes, doesn't surprise me. The RG-350 (JZ4770 based) can last about ~6
hours of up-time, and when put to sleep it will survive a few weeks.
> So here are my questions:
> 1. I don't see a way to eliminate the piece of executable code in
> SRAM. Is there any other ways?
There is what's already implemented, yes. When triggering a suspend,
the CPM.LCR.LPM setting is set to SLEEP mode
(drivers/clk/ingenic/pm.c), then the ingenic_pm_enter() function
(arch/mips/generic/board-ingenic.c) just executes the "wait" CPU
instruction to put the CPU to sleep. All clocks but the RTC one are
disabled until an interrupt is raised.
> 2. If we can't eliminate the code in SRAM, what's the accepted way of
> integrating it into the kernel tree?
Already upstream :)
> 3. If the hardware doesn't have 32k crystal connected, or the RTC is
> stripped off (e.g. X1501), some CPM registers need to be configured
> differently. How could we provide this configuration?
It's already supported. The RTC clock can be re-parented (in device
tree) to the EXT/512 clock, which is (as its name suggests) derived
from the external EXT oscillator.
Hopefully I answered all your questions.
Cheers,
-Paul
next prev parent reply other threads:[~2022-07-12 20:28 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-12 19:19 RFC: Proper suspend-to-ram implementation of Ingenic SoCs Mike Yang
2022-07-12 20:28 ` Paul Cercueil [this message]
2022-07-12 20:51 ` Mike Yang
2022-07-12 22:20 ` Paul Cercueil
2022-07-13 11:31 ` Mike Yang
2022-07-13 16:08 ` Paul Cercueil
2022-07-13 16:13 ` Zhou Yanjie
2022-07-13 16:16 ` Paul Cercueil
2022-07-13 18:22 ` Zhou Yanjie
2022-07-13 19:44 ` Mike Yang
2022-07-13 20:57 ` Paul Cercueil
2022-07-14 4:14 ` Zhou Yanjie
2022-07-14 9:18 ` Paul Cercueil
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=FVCXER.DV642VYMZNVS1@crapouillou.net \
--to=paul@crapouillou.net \
--cc=aidanmacdonald.0x0@gmail.com \
--cc=linux-mips@vger.kernel.org \
--cc=reimu@sudomaker.com \
--cc=zhouyanjie@wanyeetech.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox