From: Catalin Marinas <catalin.marinas-5wv7dgnIgG8@public.gmane.org>
To: Stephen Warren <swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
Cc: Olof Johansson <olof-nZhT3qVonbNeoWH0uzbU5w@public.gmane.org>,
"paul-DWxLp4Yu+b8AvxtiuMwx3w@public.gmane.org"
<paul-DWxLp4Yu+b8AvxtiuMwx3w@public.gmane.org>,
Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org>,
Greg Kroah-Hartman
<gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>,
Peter De Schrijver
<pdeschrijver-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>,
"arm-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org"
<arm-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
"linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
"linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org"
<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>,
Pawel Moll <Pawel.Moll-5wv7dgnIgG8@public.gmane.org>
Subject: Re: [GIT PULL 2/3] ARM: tegra: move fuse code out of arch/arm
Date: Tue, 22 Jul 2014 12:26:51 +0100 [thread overview]
Message-ID: <20140722112651.GC2219@arm.com> (raw)
In-Reply-To: <53CD4201.5070705-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
On Mon, Jul 21, 2014 at 05:38:25PM +0100, Stephen Warren wrote:
> On 07/21/2014 09:54 AM, Catalin Marinas wrote:
> > On arm64, I really want to get away from any SoC specific early
> > initcall. One of the main reason is for things like SCU, interconnects,
> > system cache configurations (even certain clocks) to be enabled in
> > firmware before Linux starts (it's an education process but that's a way
> > for example to prevent people sending patches to enable SoC coherency
> > because they haven't thought about it before upstreaming).
> >
> > It would be nice to be able to initialise SoC stuff at device_initcall()
> > level (and even keep such code as modules in initramfs) but one of the
> > problems we have is dependency on clocks (and the clock model which
> > doesn't follow the device/driver model). The of_platform_populate() is
> > called at arch_initcall_sync (after arch_initcall to still allow some
> > SoC code, if needed, to run at arch_initcall).
>
> The main thing I want to avoid is a ton of separate drivers that all
> rely on each-other getting resolved by deferred probe. While that might
> work out, it seems pointless to make the kernel try and probe a bunch of
> stuff just to have it fail and get repeated, when we know exactly which
> order everything should get initialized in.
So of_platform_populate() is called at arch_initcall_sync() level on
arm64. This allows at least two levels of probing separation before
(e.g. drivers registered as arch_initcall) and after (device_initcall).
If you register a driver earlier than arch_initcall_sync (see for
example vexpress_osc_init), it will get probed when the platform devices
are populated. Any later device_initcalls will get probed when the
corresponding drivers are registered. If you need ordering between
device_initcalls, I would recommend deferred probing.
The tricky part is if you need more drivers to be initialised at
arch_initcall_sync() in a specific order. Here it looks like the node
ordering in DT has an effect on probing. I don't say the DT should list
them in the order they should be probed but maybe we can improve the
model and do some sorting during unflattening (as I suggested in my
reply to Olof). In the meantime, for vexpress we worked around it by
explicitly checking the compatible node during a pre-arch_initcall.
> Another issue is that we have SoCs which only differ in the CPU.
Do you mean ARMv7 vs ARMv8 CPUs?
> I want
> the code to work identically on both SoCs so the CPU has limited affect
> on the low-level IO code. If we're going to enforce a "no machine
> descriptors" rule on arch/arm64, I think we should do the same thing in
> arch/arm for consistency.
We've done this with vexpress thanks to Pawel. As he said, the difficult
part was converting the existing code to the Linux device model. The
32-bit v2m_dt_init() function simply calls of_platform_populate(). If
you don't have a machine_desc at all, this would be the default (see
customize_machine()). If you use PSCI, there is no need for SoC specific
smp_ops either. So you basically get the same code base with no
additional arch/arm/mach-* machine_desc.
> > We have a similar issue with arm64 vexpress (well, just on the model)
> > where vexpress_sysreg_init() is a core_initcall (should be fine as
> > arch_initcall) as it needs to be done before of_platform_populate().
> > Pawel on cc should know more of the history here.
> >
> > I recall there were also some discussions about a SoC driver model which
> > hangs off the top compatible string in the DT (e.g. "arm,vexpress") and
> > allow (minimal) code to be run slightly earlier, though still not
> > earlier than arch_initcall.
>
> I guess that would work out OK; if we force the driver that binds to a
> top-level compatible value of "nvidia,tegraNNN" to probe first, and it
> then calls out to all the low-level init code in a sane order, that
> would solve the problem. I'm not sure that's any better than having a
> machine descriptor with an "init" function though; wrapping all this in
> a driver just seems like overhead, but it would work out OK.
Looking at the tegra_init_early(), I think for arm64 as
pre-arch_initcall_sync you would only need:
tegra_init_fuse();
tegra_powergate_init();
(I'm not sure about trusted foundations but that's a 32-bit only project
for the time being)
From tegra_dt_init() you need clocks but isn't CLK_OF_DECLARE enough?
You also have PMC code and I'm not familiar with your implementation. A
lot of the functionality could be moved to PSCI-capable firmware.
--
Catalin
WARNING: multiple messages have this Message-ID (diff)
From: catalin.marinas@arm.com (Catalin Marinas)
To: linux-arm-kernel@lists.infradead.org
Subject: [GIT PULL 2/3] ARM: tegra: move fuse code out of arch/arm
Date: Tue, 22 Jul 2014 12:26:51 +0100 [thread overview]
Message-ID: <20140722112651.GC2219@arm.com> (raw)
In-Reply-To: <53CD4201.5070705@wwwdotorg.org>
On Mon, Jul 21, 2014 at 05:38:25PM +0100, Stephen Warren wrote:
> On 07/21/2014 09:54 AM, Catalin Marinas wrote:
> > On arm64, I really want to get away from any SoC specific early
> > initcall. One of the main reason is for things like SCU, interconnects,
> > system cache configurations (even certain clocks) to be enabled in
> > firmware before Linux starts (it's an education process but that's a way
> > for example to prevent people sending patches to enable SoC coherency
> > because they haven't thought about it before upstreaming).
> >
> > It would be nice to be able to initialise SoC stuff at device_initcall()
> > level (and even keep such code as modules in initramfs) but one of the
> > problems we have is dependency on clocks (and the clock model which
> > doesn't follow the device/driver model). The of_platform_populate() is
> > called at arch_initcall_sync (after arch_initcall to still allow some
> > SoC code, if needed, to run at arch_initcall).
>
> The main thing I want to avoid is a ton of separate drivers that all
> rely on each-other getting resolved by deferred probe. While that might
> work out, it seems pointless to make the kernel try and probe a bunch of
> stuff just to have it fail and get repeated, when we know exactly which
> order everything should get initialized in.
So of_platform_populate() is called at arch_initcall_sync() level on
arm64. This allows at least two levels of probing separation before
(e.g. drivers registered as arch_initcall) and after (device_initcall).
If you register a driver earlier than arch_initcall_sync (see for
example vexpress_osc_init), it will get probed when the platform devices
are populated. Any later device_initcalls will get probed when the
corresponding drivers are registered. If you need ordering between
device_initcalls, I would recommend deferred probing.
The tricky part is if you need more drivers to be initialised at
arch_initcall_sync() in a specific order. Here it looks like the node
ordering in DT has an effect on probing. I don't say the DT should list
them in the order they should be probed but maybe we can improve the
model and do some sorting during unflattening (as I suggested in my
reply to Olof). In the meantime, for vexpress we worked around it by
explicitly checking the compatible node during a pre-arch_initcall.
> Another issue is that we have SoCs which only differ in the CPU.
Do you mean ARMv7 vs ARMv8 CPUs?
> I want
> the code to work identically on both SoCs so the CPU has limited affect
> on the low-level IO code. If we're going to enforce a "no machine
> descriptors" rule on arch/arm64, I think we should do the same thing in
> arch/arm for consistency.
We've done this with vexpress thanks to Pawel. As he said, the difficult
part was converting the existing code to the Linux device model. The
32-bit v2m_dt_init() function simply calls of_platform_populate(). If
you don't have a machine_desc at all, this would be the default (see
customize_machine()). If you use PSCI, there is no need for SoC specific
smp_ops either. So you basically get the same code base with no
additional arch/arm/mach-* machine_desc.
> > We have a similar issue with arm64 vexpress (well, just on the model)
> > where vexpress_sysreg_init() is a core_initcall (should be fine as
> > arch_initcall) as it needs to be done before of_platform_populate().
> > Pawel on cc should know more of the history here.
> >
> > I recall there were also some discussions about a SoC driver model which
> > hangs off the top compatible string in the DT (e.g. "arm,vexpress") and
> > allow (minimal) code to be run slightly earlier, though still not
> > earlier than arch_initcall.
>
> I guess that would work out OK; if we force the driver that binds to a
> top-level compatible value of "nvidia,tegraNNN" to probe first, and it
> then calls out to all the low-level init code in a sane order, that
> would solve the problem. I'm not sure that's any better than having a
> machine descriptor with an "init" function though; wrapping all this in
> a driver just seems like overhead, but it would work out OK.
Looking at the tegra_init_early(), I think for arm64 as
pre-arch_initcall_sync you would only need:
tegra_init_fuse();
tegra_powergate_init();
(I'm not sure about trusted foundations but that's a 32-bit only project
for the time being)
>From tegra_dt_init() you need clocks but isn't CLK_OF_DECLARE enough?
You also have PMC code and I'm not familiar with your implementation. A
lot of the functionality could be moved to PSCI-capable firmware.
--
Catalin
next prev parent reply other threads:[~2014-07-22 11:26 UTC|newest]
Thread overview: 96+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-23 21:23 [GIT PULL 1/3] ARM: tegra: rework PCIe regulators Stephen Warren
2014-06-23 21:23 ` Stephen Warren
[not found] ` <1403558626-13422-1-git-send-email-swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-06-23 21:23 ` [GIT PULL 2/3] ARM: tegra: move fuse code out of arch/arm Stephen Warren
2014-06-23 21:23 ` Stephen Warren
[not found] ` <1403558626-13422-2-git-send-email-swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-07-07 0:44 ` Olof Johansson
2014-07-07 0:44 ` Olof Johansson
[not found] ` <20140707004417.GE8469-O5ziIzlqnXUVNXGz7ipsyg@public.gmane.org>
2014-07-08 13:43 ` Peter De Schrijver
2014-07-08 13:43 ` Peter De Schrijver
[not found] ` <20140708134359.GA23218-Rysk9IDjsxmJz7etNGeUX8VPkgjIgRvpAL8bYrjMMd8@public.gmane.org>
2014-07-08 17:47 ` Olof Johansson
2014-07-08 17:47 ` Olof Johansson
[not found] ` <CAOesGMhoqvqf-dktp-OfUNTPLahPwkyAPiTeDngr4QjH=VfOGA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-09 11:16 ` Peter De Schrijver
2014-07-09 11:16 ` Peter De Schrijver
[not found] ` <20140709111633.GG23218-Rysk9IDjsxmJz7etNGeUX8VPkgjIgRvpAL8bYrjMMd8@public.gmane.org>
2014-07-09 12:50 ` Arnd Bergmann
2014-07-09 12:50 ` Arnd Bergmann
2014-07-11 12:56 ` Thierry Reding
2014-07-11 12:56 ` Thierry Reding
2014-07-18 2:45 ` Stephen Warren
2014-07-18 2:45 ` Stephen Warren
[not found] ` <53C88A4C.3070304-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-07-18 5:33 ` Olof Johansson
2014-07-18 5:33 ` Olof Johansson
[not found] ` <CAOesGMh+zLV781wzdR5=_Bpzh+XMwJfWL-5XMDP6DwG_Hg80kw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-21 15:06 ` Stephen Warren
2014-07-21 15:06 ` Stephen Warren
[not found] ` <53CD2C58.6060601-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-07-21 15:54 ` Catalin Marinas
2014-07-21 15:54 ` Catalin Marinas
[not found] ` <20140721155451.GF32578-5wv7dgnIgG8@public.gmane.org>
2014-07-21 16:14 ` Pawel Moll
2014-07-21 16:14 ` Pawel Moll
2014-07-21 16:38 ` Stephen Warren
2014-07-21 16:38 ` Stephen Warren
[not found] ` <53CD4201.5070705-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-07-21 16:46 ` Olof Johansson
2014-07-21 16:46 ` Olof Johansson
[not found] ` <CAOesGMgvd1HbjywN7BDPtr8ZU7vucWH48B=AW3TZjng73YA8WA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-21 17:00 ` [PATCH] platform: Make platform_bus device a platform device Pawel Moll
2014-07-21 17:00 ` Pawel Moll
[not found] ` <1405962034-25482-1-git-send-email-pawel.moll-5wv7dgnIgG8@public.gmane.org>
2014-07-21 18:40 ` Greg Kroah-Hartman
2014-07-21 18:40 ` Greg Kroah-Hartman
[not found] ` <20140721184007.GB572-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2014-07-22 10:02 ` [PATCH v2] " Pawel Moll
2014-07-22 10:02 ` Pawel Moll
[not found] ` <1406023327-18525-1-git-send-email-pawel.moll-5wv7dgnIgG8@public.gmane.org>
2014-07-22 17:10 ` Greg Kroah-Hartman
2014-07-22 17:10 ` Greg Kroah-Hartman
[not found] ` <20140722171013.GA6605-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2014-07-22 17:30 ` Pawel Moll
2014-07-22 17:30 ` Pawel Moll
2014-07-22 17:37 ` Greg Kroah-Hartman
2014-07-22 17:37 ` Greg Kroah-Hartman
[not found] ` <20140722173713.GA8959-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2014-07-22 17:55 ` [PATCH v3] " Pawel Moll
2014-07-22 17:55 ` Pawel Moll
[not found] ` <1406051719-17354-1-git-send-email-pawel.moll-5wv7dgnIgG8@public.gmane.org>
2014-07-22 18:01 ` Pawel Moll
2014-07-22 18:01 ` Pawel Moll
2014-07-22 18:15 ` Greg Kroah-Hartman
2014-07-22 18:15 ` Greg Kroah-Hartman
[not found] ` <20140722181505.GA9898-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2014-07-23 17:16 ` Pawel Moll
2014-07-23 17:16 ` Pawel Moll
2014-07-23 19:34 ` Greg Kroah-Hartman
2014-07-23 19:34 ` Greg Kroah-Hartman
[not found] ` <20140723193434.GA31983-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2014-07-24 17:12 ` Pawel Moll
2014-07-24 17:12 ` Pawel Moll
2014-07-22 19:46 ` Olof Johansson
2014-07-22 19:46 ` Olof Johansson
[not found] ` <CAOesGMgya9i=zc_AVO_mgrC_FjYz-RWxwXguNueVA=7gpq=5sA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-23 14:26 ` Pawel Moll
2014-07-23 14:26 ` Pawel Moll
2014-07-22 22:16 ` Greg Kroah-Hartman
2014-07-22 22:16 ` Greg Kroah-Hartman
[not found] ` <20140722221619.GA15781-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2014-07-23 14:27 ` Pawel Moll
2014-07-23 14:27 ` Pawel Moll
2014-07-22 10:27 ` [GIT PULL 2/3] ARM: tegra: move fuse code out of arch/arm Catalin Marinas
2014-07-22 10:27 ` Catalin Marinas
[not found] ` <20140722102749.GB2219-5wv7dgnIgG8@public.gmane.org>
2014-07-22 16:27 ` Stephen Warren
2014-07-22 16:27 ` Stephen Warren
[not found] ` <53CE90ED.8030900-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-07-22 16:54 ` Catalin Marinas
2014-07-22 16:54 ` Catalin Marinas
2014-07-22 11:26 ` Catalin Marinas [this message]
2014-07-22 11:26 ` Catalin Marinas
[not found] ` <20140722112651.GC2219-5wv7dgnIgG8@public.gmane.org>
2014-07-22 16:22 ` Stephen Warren
2014-07-22 16:22 ` Stephen Warren
[not found] ` <53CE8FB1.4060307-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-07-22 17:04 ` Catalin Marinas
2014-07-22 17:04 ` Catalin Marinas
2014-07-18 2:44 ` Stephen Warren
2014-07-18 2:44 ` Stephen Warren
[not found] ` <53C889FF.4070206-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-07-18 5:33 ` Olof Johansson
2014-07-18 5:33 ` Olof Johansson
2014-06-23 21:23 ` [GIT PULL 3/3] ARM: tegra: use us counter as delay timer Stephen Warren
2014-06-23 21:23 ` Stephen Warren
[not found] ` <1403558626-13422-3-git-send-email-swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-07-07 0:49 ` Olof Johansson
2014-07-07 0:49 ` Olof Johansson
2014-07-07 0:38 ` [GIT PULL 1/3] ARM: tegra: rework PCIe regulators Olof Johansson
2014-07-07 0:38 ` Olof Johansson
[not found] ` <20140707003854.GD8469-O5ziIzlqnXUVNXGz7ipsyg@public.gmane.org>
2014-07-07 5:52 ` Thierry Reding
2014-07-07 5:52 ` Thierry Reding
2014-07-08 4:45 ` Olof Johansson
2014-07-08 4:45 ` Olof Johansson
[not found] ` <CAOesGMjwE=xThuUwmBF02YaQ32_uFogryW5anNoGc8yfkuN_Pg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-10 10:15 ` Thierry Reding
2014-07-10 10:15 ` Thierry Reding
2014-07-17 14:20 ` Thierry Reding
2014-07-17 14:20 ` Thierry Reding
2014-07-17 17:52 ` Olof Johansson
2014-07-17 17:52 ` Olof Johansson
2014-07-18 2:47 ` Stephen Warren
2014-07-18 2:47 ` Stephen Warren
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=20140722112651.GC2219@arm.com \
--to=catalin.marinas-5wv7dgnigg8@public.gmane.org \
--cc=Pawel.Moll-5wv7dgnIgG8@public.gmane.org \
--cc=arm-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=arnd-r2nGTMty4D4@public.gmane.org \
--cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=olof-nZhT3qVonbNeoWH0uzbU5w@public.gmane.org \
--cc=paul-DWxLp4Yu+b8AvxtiuMwx3w@public.gmane.org \
--cc=pdeschrijver-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org \
--cc=swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.