linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: thomas.petazzoni@free-electrons.com (Thomas Petazzoni)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 0/9] Switch internal registers address to 0xF1 on Armada 370/XP
Date: Wed, 22 May 2013 18:08:42 +0200	[thread overview]
Message-ID: <20130522180842.7edcc3ee@skate> (raw)
In-Reply-To: <201305221735.11815.arnd@arndb.de>

Dear Arnd Bergmann,

On Wed, 22 May 2013 17:35:11 +0200, Arnd Bergmann wrote:

> Ok, but going back to the discussion about remapping physical memory
> addresses, would you actually be able to map more of the available
> RAM when the registers are moved out of the way?

Yes, we can.

> IIRC the translation is rather coarse-grained, and the new location
> is still in the same 1GB window from 0xc0000000-0xffffffff.

We have four different CS for RAM, and therefore when we have 8 GB of
RAM installed, if the internal registers are at 0xD0000000, we loose
768 MB of RAM. When they are mapped at 0xF1000000, we loose only 256 MB
of RAM. A win of 512 MB of RAM, which is not negligible.

And the new bootloaders that are remapping to 0xf1000000 on Armada
370/XP are already being shipped by Marvell, so it's not like we have
much choice here.

> > > > So, the new generation of bootloaders that are shipped on new Marvell
> > > > Armada 370/XP platforms are doing the remapping at 0xF1000000 prior to
> > > > starting Linux. The current kernel cannot boot on such platforms.
> > > 
> > > Does it boot if you disable the DEBUG_LL code and apply your
> > > patches 1-8?
> > 
> > Patches 1-8 do not change anything in terms of the internal register
> > window base address. So just like the kernel was working with and
> > without DEBUG_LL before patches 1-8, it continues to work after those
> > cleanups/improvements.
> 
> I mean with the new boot loader which breaks unmodified kernels.

If you boot the kernel with, or without 1-8, it will not boot with a
new bootloader. Only if you apply the 9th patch will it work. And the
kernel will continue to work with both an old and a new bootloader.

> > I'm sorry, but I don't follow you here. When you have patches 1-8 (or
> > no patch applied at all), the UART for mach-mvebu is *always* at
> > 0xd0012000.
> 
> No. UART0 is always at 0xd0012000 but there are also UARTs at 0xd0012100,
> 0xd0012200 and 0xd0012300. You don't currently support using them for
> early output, but you might need to add that, similar to how other
> SoC platforms handle this.

Right.

> More importantly, you can build a kernel with any number of other SoCs
> already, and if you have a combined ArmadaXP+OMAP+Highbank kernel,
> there is no way to get a working early debug output.

So you're proposing to add two Kconfig options, one to have the UART at
0xd0012000 and the other one to have the UART at 0xf1012000. The user
would have to know whether he is going to boot with an old bootloader
or new bootloader, and select the appropriate option. This means that
the mvebu_defconfig would no longer be able to have earlyprintk enabled
by default, otherwise the resulting kernel may not boot for some
people, but maybe it's a reasonable tradeoff.

> > > As you already admit, using the CP15 register is a hack. It sounds
> > > to me that a cleaner approach would be to put the correct address
> > > into the device tree and use that value everywhere, rather than
> > > hardcoding one or more addresses.
> > 
> > I don't see how this can fix the problem. Which internal register base
> > address do we put in our Device Tree source in arch/arm/boot/dts? The
> > old one? The new one?
> 
> The one matching the boot loader for that board, i.e. the new address
> for all boards but Mirabox and OpenBlocks.

And what happens when Globalscale (Mirabox manufacturer) or Plathome
(manufacturer of OpenBlocks) release a new bootloader version, based on
the new bootloader from Marvell, which remaps things at 0xf1000000 ? Or
when those people boot from Barebox, which remaps at 0xf1000000 ?

Conclusion: you can't classify on one side boards that are at 0xd0 and
boards that are at 0xf1. It depends on *which* bootloader each
particular instance of those boards will be using. Will it be a
bootloader that complies with the "old" protocol (CP15 bit cleared and
registers at 0xd0) or the "new" protocol (CP15 bit set and registers at
0xf1).

So we can't encode into the boards Device Tree whether the registers
are at 0xd0 or 0xf1, because it's not a board-related information, but
a bootloader-related information.

> > > > Unfortunately, tweaking ->map_io() is not sufficient: we also want
> > > > earlyprintk to work. And earlyprintk is used *before* ->map_io() is
> > > > called, and *after* ->map_io() is called.
> > > 
> > > Note that by the time map_io is called, we no longer care about
> > > the physical address, since the uart is only accessed through the
> > > virtual mapping after __enable_mmu.
> > 
> > That's not correct. ->map_io() calls debug_ll_io_init(), which calls
> > the addruart code of earlyprintk, from which it gets the virtual
> > address *AND* physical address of the UART, and sets up a mapping with
> > create_mapping(). See the implementation of debug_ll_io_init().
> 
> Ah right, but that is also something that could easily be changed.

I must admit I'm not sure why we have this debug_ll_io_init() function.
When DEBUG_LL is enabled, there is already a call to addruart from
arch/arm/kernel/head.S, which does create a virtual -> physical mapping
that covers the UART area. Since debug_ll_io_init() is also only
enabled under DEBUG_LL, I am not sure to understand what it does that
the assembly code in arch/arm/kernel/head.S hasn't done already. Adding
Rob in Cc, as he's the one who added debug_ll_io_init() in the first
place.

Thomas
-- 
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

  parent reply	other threads:[~2013-05-22 16:08 UTC|newest]

Thread overview: 91+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-21 10:33 [PATCH 0/9] Switch internal registers address to 0xF1 on Armada 370/XP Thomas Petazzoni
2013-05-21 10:33 ` [PATCH 1/9] arm: mvebu: fix length of SATA registers area in .dtsi Thomas Petazzoni
2013-05-21 13:42   ` Jason Cooper
2013-05-21 10:33 ` [PATCH 2/9] arm: mvebu: fix length of Ethernet " Thomas Petazzoni
2013-05-21 13:43   ` Jason Cooper
2013-05-21 10:33 ` [PATCH 3/9] arm: mvebu: mark functions of armada-370-xp.c as static Thomas Petazzoni
2013-05-21 13:45   ` Jason Cooper
2013-05-21 10:33 ` [PATCH 4/9] arm: mvebu: remove dependency of SMP init on static I/O mapping Thomas Petazzoni
2013-05-21 10:33 ` [PATCH 5/9] arm: mvebu: avoid hardcoded virtual address in coherency code Thomas Petazzoni
2013-05-21 10:33 ` [PATCH 6/9] arm: mvebu: move cache and mvebu-mbus initialization later Thomas Petazzoni
2013-05-21 14:16   ` Jason Cooper
2013-05-21 15:37     ` Thomas Petazzoni
2013-05-21 15:43       ` Jason Cooper
2013-05-21 16:10         ` Thomas Petazzoni
2013-05-21 16:37           ` Jason Cooper
2013-05-21 16:44             ` Thomas Petazzoni
2013-05-21 10:33 ` [PATCH 7/9] arm: mvebu: remove hardcoded static I/O mapping Thomas Petazzoni
2013-05-21 10:33 ` [PATCH 8/9] arm: mvebu: don't hardcode a physical address in headsmp.S Thomas Petazzoni
2013-05-21 10:33 ` [PATCH 9/9] arm: mvebu: switch internal register address at runtime if needed Thomas Petazzoni
2013-05-22 13:27   ` Thomas Petazzoni
2013-05-22 14:04     ` Andrew Lunn
2013-05-22 14:16       ` Thomas Petazzoni
2013-05-22 14:17       ` Sebastian Hesselbarth
2013-05-22 17:42   ` Andrew Lunn
2013-05-22 17:59     ` Thomas Petazzoni
2013-05-22 18:31       ` Andrew Lunn
2013-05-21 19:38 ` [PATCH 0/9] Switch internal registers address to 0xF1 on Armada 370/XP Willy Tarreau
2013-05-21 20:12   ` Thomas Petazzoni
2013-05-21 20:26     ` Willy Tarreau
2013-05-22 10:01   ` Sebastian Hesselbarth
2013-05-22 11:46     ` Greg
2013-05-22 13:43     ` Russell King - ARM Linux
2013-05-22 13:52       ` Thomas Petazzoni
2013-05-22 14:11         ` Arnd Bergmann
2013-05-22 14:17         ` Russell King - ARM Linux
2013-05-22 14:23           ` Sebastian Hesselbarth
2013-05-22 14:33 ` Arnd Bergmann
2013-05-22 14:41   ` Gregory CLEMENT
2013-05-22 15:18     ` Arnd Bergmann
2013-05-22 15:37       ` Gregory CLEMENT
2013-05-22 15:43         ` Arnd Bergmann
2013-05-22 15:56           ` Gregory CLEMENT
2013-05-22 20:30             ` Arnd Bergmann
2013-05-22 15:06   ` Thomas Petazzoni
2013-05-22 15:35     ` Arnd Bergmann
2013-05-22 15:51       ` Andrew Lunn
2013-05-22 16:22         ` Thomas Petazzoni
2013-05-22 20:36           ` Arnd Bergmann
2013-05-23 10:02             ` Thomas Petazzoni
2013-05-23 14:12               ` Arnd Bergmann
2013-05-23 14:47                 ` Thomas Petazzoni
2013-05-23 17:39                   ` Arnd Bergmann
2013-05-22 16:08       ` Thomas Petazzoni [this message]
2013-05-22 16:35         ` Willy Tarreau
2013-05-22 16:42           ` Thomas Petazzoni
2013-05-22 16:49             ` Willy Tarreau
2013-05-22 17:00               ` Thomas Petazzoni
2013-05-22 17:08                 ` Willy Tarreau
2013-05-22 17:14                   ` Thomas Petazzoni
2013-05-22 20:47                     ` Sebastian Hesselbarth
2013-05-22 16:49             ` Jason Cooper
2013-05-22 16:57               ` Thomas Petazzoni
2013-05-22 17:13                 ` Jason Cooper
2013-05-22 18:05                   ` Thomas Petazzoni
2013-05-22 18:09                     ` Jason Cooper
2013-05-22 18:13                       ` Thomas Petazzoni
2013-05-22 18:19                 ` Jason Gunthorpe
2013-05-22 18:55                   ` Andrew Lunn
2013-05-22 19:36                     ` Jason Gunthorpe
2013-05-22 20:31                       ` Andrew Lunn
2013-05-23  9:53                   ` Thomas Petazzoni
2013-05-23 17:27                     ` Jason Gunthorpe
2013-05-22 20:40         ` Arnd Bergmann
2013-05-22 21:31           ` Thomas Petazzoni
2013-05-23  5:53             ` Andrew Lunn
2013-05-23  7:53             ` Russell King - ARM Linux
2013-05-23 12:23           ` Thomas Petazzoni
2013-05-23 14:14             ` Arnd Bergmann
2013-05-23 14:50               ` Thomas Petazzoni
2013-05-23 20:26             ` Russell King - ARM Linux
2013-05-23 20:40               ` Arnd Bergmann
2013-05-23 23:09                 ` Russell King - ARM Linux
2013-05-23 23:17                   ` Thomas Petazzoni
2013-05-23 23:40                     ` Russell King - ARM Linux
2013-05-24 10:25                       ` Greg
2013-05-24  7:15                   ` Arnd Bergmann
2013-05-24  7:43                     ` Thomas Petazzoni
2013-05-24  9:16                       ` Arnd Bergmann
2013-05-24  7:46                     ` Russell King - ARM Linux
2013-05-24  8:07                       ` Thomas Petazzoni
2013-05-24 10:57                         ` Arnd Bergmann

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=20130522180842.7edcc3ee@skate \
    --to=thomas.petazzoni@free-electrons.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).