linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
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

  parent reply	other threads:[~2014-07-22 11:26 UTC|newest]

Thread overview: 48+ 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 ` [GIT PULL 2/3] ARM: tegra: move fuse code out of arch/arm Stephen Warren
2014-07-07  0:44   ` Olof Johansson
2014-07-08 13:43     ` Peter De Schrijver
2014-07-08 17:47       ` Olof Johansson
2014-07-09 11:16         ` Peter De Schrijver
2014-07-09 12:50           ` Arnd Bergmann
2014-07-11 12:56         ` Thierry Reding
2014-07-18  2:45         ` Stephen Warren
2014-07-18  5:33           ` Olof Johansson
2014-07-21 15:06             ` Stephen Warren
2014-07-21 15:54               ` Catalin Marinas
2014-07-21 16:14                 ` Pawel Moll
2014-07-21 16:38                 ` Stephen Warren
2014-07-21 16:46                   ` Olof Johansson
2014-07-21 17:00                     ` [PATCH] platform: Make platform_bus device a platform device Pawel Moll
2014-07-21 18:40                       ` Greg Kroah-Hartman
2014-07-22 10:02                         ` [PATCH v2] " Pawel Moll
2014-07-22 17:10                           ` Greg Kroah-Hartman
2014-07-22 17:30                             ` Pawel Moll
2014-07-22 17:37                               ` Greg Kroah-Hartman
2014-07-22 17:55                                 ` [PATCH v3] " Pawel Moll
2014-07-22 18:01                                   ` Pawel Moll
2014-07-22 18:15                                     ` Greg Kroah-Hartman
2014-07-23 17:16                                       ` Pawel Moll
2014-07-23 19:34                                         ` Greg Kroah-Hartman
2014-07-24 17:12                                           ` Pawel Moll
2014-07-22 19:46                                   ` Olof Johansson
2014-07-23 14:26                                     ` Pawel Moll
2014-07-22 22:16                                   ` Greg Kroah-Hartman
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 16:27                       ` Stephen Warren
2014-07-22 16:54                         ` Catalin Marinas
2014-07-22 11:26                   ` Catalin Marinas [this message]
2014-07-22 16:22                     ` Stephen Warren
2014-07-22 17:04                       ` Catalin Marinas
2014-07-18  2:44       ` Stephen Warren
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-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  5:52   ` Thierry Reding
2014-07-08  4:45     ` Olof Johansson
2014-07-10 10:15       ` Thierry Reding
2014-07-17 14:20         ` Thierry Reding
2014-07-17 17:52           ` Olof Johansson
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@arm.com \
    --cc=linux-arm-kernel@lists.infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).