All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v3 00/15] env: Multiple env support and env transition for sunxi
@ 2018-01-23 20:16 Maxime Ripard
  2018-01-23 20:16 ` [U-Boot] [PATCH v3 01/15] cmd: nvedit: Get rid of the env lookup Maxime Ripard
                   ` (14 more replies)
  0 siblings, 15 replies; 58+ messages in thread
From: Maxime Ripard @ 2018-01-23 20:16 UTC (permalink / raw)
  To: u-boot

Hi,

Here is a second attempt at transitioning away from the MMC raw environment
to a FAT-based one for Allwinner SoCs. Since the RFC was quite well
received, I actually tested it and fixed a few rough edges.

You'll find the first RFC here for reference:
https://lists.denx.de/pipermail/u-boot/2017-October/310111.html

And the second that originated in this series:
https://lists.denx.de/pipermail/u-boot/2017-November/311608.html

I gave it a travis run, and it passes all tests:
https://travis-ci.org/mripard/u-boot

Thanks!
Maxime

Original description of the patches:

The fundamental issue I'm trying to adress is that we've had for a
very long time the assumption that the main U-Boot binary wouldn't
exceed around 500 bytes.

However, we're starting to get real close to that limit, and are
running out of silver bullets to deal with the consequences of having
a bigger U-Boot binary, the main consequence being that we would
have some overlap between the environment and U-Boot.

One way to address this that has been suggested by Tom is to move away
from the raw MMC environment to a FAT-based one. This would allow us
to slowly migrate away, and eventually remove the MMC-raw option
entirely to reclaim that space for the binary.

That cannot be done in a single release however, since we might have
environments in the wild already that people rely on. And since we
always encouraged people to use the raw MMC environment, noone would
expect that.

This is even worse since some platforms are using the U-Boot
environment to deal with implement their upgrade mechanism, such as
mender.io, and force moving the environment would break any further
upgrade.

The suggested implementation is to allow U-Boot to compile multiple
environments backend at once, based on the work done by Simon. The
default behaviour shouldn't change obviously. We can then piggy-back
on this to tweak on a per-board basis the environment lookup algorithm
to always favour the FAT-based environment and then fallback to the
MMC. It will allow us to migrate a raw-MMC user to a FAT based
solution as soon as they update their environment (assuming that there
is a bootable FAT partition in the system).

This has just been compile tested on sunxi so far, and I'd like
general comments on the approach taken. Obviously, this will need to
work properly before being merged.

Changes from v2:
  - Fix a bug showing up on travis that resulted in the vexpress_ca_15 DHCP
    unit test failing. This was due to an improper return of ENVL_UNKNOWN.
  - Added Simon reviewed-by tag

Changes from v1:
  - Collect tags
  - Rebased on v2018.01
  - Fixed build failures on a couple of boards
  - Added back the message and the error code when an environment is
    failing
  - Added some comments about the printf in environments
  - Added a build time check about the number of our locations array to see
    if we're overflowing the location variable
  - Fixed the drv->init return code being ignored
  - Added helpers to manage the init status
  - Changed the ENVO prefix for the operations to ENVOP
  - Added some comments and documentation

Changes from the RFC:
  - Added more useful messages to see where we're loading / saving
  - Init all the environments no matter what, and the deal with whatever
    env we want to pick at load time
  - Added the various tags collected

Maxime Ripard (15):
  cmd: nvedit: Get rid of the env lookup
  env: Rename env_driver_lookup_default and env_get_default_location
  env: Pass additional parameters to the env lookup function
  env: Make the env save message a bit more explicit
  env: Make it explicit where we're loading our environment from
  env: fat: Make the debug messages play a little nicer
  env: mmc: Make the debug messages play a little nicer
  env: common: Make the debug messages play a little nicer
  env: Support multiple environments
  env: Initialise all the environments
  env: mmc: depends on the MMC framework
  env: Allow to build multiple environments in Kconfig
  env: Mark env_get_location as weak
  sunxi: Transition from the MMC to a FAT-based environment
  env: sunxi: Enable FAT-based environment support by default

 board/sunxi/board.c                   |  16 ++-
 cmd/nvedit.c                          |   4 +-
 configs/MPC8313ERDB_NAND_33_defconfig |   1 +-
 configs/MPC8313ERDB_NAND_66_defconfig |   1 +-
 configs/cl-som-imx7_defconfig         |   1 +-
 configs/microblaze-generic_defconfig  |   1 +-
 env/Kconfig                           |  70 ++++----
 env/common.c                          |   2 +-
 env/env.c                             | 251 +++++++++++++++++++--------
 env/fat.c                             |  25 ++-
 env/mmc.c                             |   1 +-
 include/asm-generic/global_data.h     |   1 +-
 include/environment.h                 |  15 +-
 13 files changed, 266 insertions(+), 123 deletions(-)

base-commit: f3dd87e0b98999a78e500e8c6d2b063ebadf535a
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 58+ messages in thread
* [U-Boot] [PATCH v3 09/15] env: Support multiple environments
@ 2018-02-07 20:45 Goldschmidt Simon
  2018-02-07 21:18 ` York Sun
  0 siblings, 1 reply; 58+ messages in thread
From: Goldschmidt Simon @ 2018-02-07 20:45 UTC (permalink / raw)
  To: u-boot

On 02/07/2018 21:18, York Sun wrote:
> On 02/07/2018 12:43 AM, Maxime Ripard wrote:
>> Hi,
>>
>> On Tue, Jan 30, 2018 at 11:02:49PM +0000, York Sun wrote:
>>> On 01/30/2018 12:16 PM, York Sun wrote:
>>>> On 01/30/2018 11:40 AM, York Sun wrote:
>>>>> On 01/30/2018 12:19 AM, Simon Goldschmidt wrote:
>>>>>> On 23.01.2018 21:16, Maxime Ripard wrote:
>>>>>>> Now that we have everything in place to support multiple environment, let's
>>>>>>> make sure the current code can use it.
>>>>>>>
>>>>>>> The priority used between the various environment is the same one that was
>>>>>>> used in the code previously.
>>>>>>>
>>>>>>> At read / init times, the highest priority environment is going to be
>>>>>>> detected,
>>>>>>
>>>>>> Does priority handling really work here? Most env drivers seem to ignore
>>>>>> the return value of env_import and may thus return success although
>>>>>> importing the environment failed (only reading the data from the device
>>>>>> succeeded).
>>>>>>
>>>>>> This is from reading the code, I haven't had a chance to test this, yet.
>>>>>
>>>>> It is broken on my LS1043ARDB with simply NOR flash. I am trying to
>>>>> determine what went wrong.
>>>>>
>>>>
>>>> I found the problem. The variable "env_load_location" is static. It is
>>>> probably not write-able during booting from flash. It is expected to be
>>>> set during ENVOP_INIT. But if I print this variable, it has
>>>> ENVL_UNKNOWN. I can make it work by moving env_load_location to global
>>>> data structure.
>>
>> That would work for me.
>>
>>>> That being said, this addition of multiple environments really slows
>>>> down the booting process for me. I see every time env_get_char() is
>>>> called, env_driver_lookup() runs. A simple call of env_get_f() gets
>>>> slowed down dramatically. I didn't find out where the most time is spent
>>>> yet.
>>>>
>>>> Does anyone else experience this unbearable slowness?
>>>>
>>>
>>> I found the problem. In patch #3 in this series, the default get_char()
>>> was dropped so there is no driver for a plain NOR flash. A quick (and
>>> maybe dirty) fix is this
>>>
>>>
>>> diff --git a/env/env.c b/env/env.c
>>> index edfb575..210bae2 100644
>>> --- a/env/env.c
>>> +++ b/env/env.c
>>> @@ -159,7 +159,7 @@ int env_get_char(int index)
>>>                 int ret;
>>>
>>>                 if (!drv->get_char)
>>> -                       continue;
>>> +                       return *(uchar *)(gd->env_addr + index);
>>>
>>>                 if (!env_has_inited(drv->location))
>>>                         continue;
>>
>> And this too.
> 
> If you agree with this fix (actually revert your change earlier), I can
> send out a patch.

I still think we should get rid of the 'get_char' callback for
the env drivers. While that could have made sense for some boards
before the conversion to multiple environments (although I
doubt that, as the environment is *not* checked for
validity in this call), its meaning is totally lost when having
multiple env drivers active.

The whole purpose of multiple env drivers is that we select a
valid driver in the 'load' callback. How could we possibly know
that the 'get_char' callback of the highest prio env driver is
what we want?

I'd rather make 'env_get_char' weak and let boards decide if they
really want this behaviour.

A quick search through the current code base shows me *no* usage
of 'get_char' in nvram.c (CONFIG_SYS_NVRAM_ACCESS_ROUTINE is never
defined) and only 7 defconfigs that use ENV_IS_IN_EEPROM:

    imx31_phycore_defconfig
    imx31_phycore_eet_defconfig
    km_kirkwood_128m16_defconfig
    km_kirkwood_defconfig
    km_kirkwood_pci_defconfig
    mgcoge3un_defconfig
    portl2_defconfig

Are these seven boards worth keeping this feature?

Simon

>>
>>> With this temporary fix, my flash chip works again and I can boot all
>>> the way up in a timely manner. I still don't like to call
>>> env_driver_lookup() thousands of times to get a simple env variable.
>>>
>>> Can Maxime post a quick post soon?
>>
>> Given that you already made all the debugging, and the patches, and I
>> have no way to test, I guess it would make more sense if you did it :)
> 
> Yes, I have tested on my boards. I will send out this patch.
> 
> York

^ permalink raw reply	[flat|nested] 58+ messages in thread

end of thread, other threads:[~2018-04-05 10:48 UTC | newest]

Thread overview: 58+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-23 20:16 [U-Boot] [PATCH v3 00/15] env: Multiple env support and env transition for sunxi Maxime Ripard
2018-01-23 20:16 ` [U-Boot] [PATCH v3 01/15] cmd: nvedit: Get rid of the env lookup Maxime Ripard
2018-01-27 19:20   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-01-23 20:16 ` [U-Boot] [PATCH v3 02/15] env: Rename env_driver_lookup_default and env_get_default_location Maxime Ripard
2018-01-27 19:20   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-01-23 20:16 ` [U-Boot] [PATCH v3 03/15] env: Pass additional parameters to the env lookup function Maxime Ripard
2018-01-27 19:20   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-04-05 10:48   ` [U-Boot] [PATCH v3 " Simon Goldschmidt
2018-01-23 20:16 ` [U-Boot] [PATCH v3 04/15] env: Make the env save message a bit more explicit Maxime Ripard
2018-01-27 19:20   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-01-23 20:16 ` [U-Boot] [PATCH v3 05/15] env: Make it explicit where we're loading our environment from Maxime Ripard
2018-01-27 19:20   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-01-23 20:16 ` [U-Boot] [PATCH v3 06/15] env: fat: Make the debug messages play a little nicer Maxime Ripard
2018-01-27 19:20   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-01-23 20:16 ` [U-Boot] [PATCH v3 07/15] env: mmc: " Maxime Ripard
2018-01-24 13:52   ` Jaehoon Chung
2018-01-27 19:21   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-01-23 20:16 ` [U-Boot] [PATCH v3 08/15] env: common: " Maxime Ripard
2018-01-27 19:21   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-01-23 20:16 ` [U-Boot] [PATCH v3 09/15] env: Support multiple environments Maxime Ripard
2018-01-27 19:21   ` [U-Boot] [U-Boot,v3,09/15] " Tom Rini
2018-01-30  8:19   ` [U-Boot] [PATCH v3 09/15] " Simon Goldschmidt
2018-01-30 19:39     ` York Sun
2018-01-30 20:16       ` York Sun
2018-01-30 23:02         ` York Sun
2018-01-31  6:41           ` Simon Goldschmidt
2018-02-07  8:43           ` Maxime Ripard
2018-02-07 20:18             ` York Sun
2018-02-06  8:09   ` Simon Goldschmidt
2018-02-06  8:20     ` Joakim Tjernlund
2018-02-07  8:18       ` Maxime Ripard
2018-02-07  8:34         ` Joakim Tjernlund
2018-02-07  8:32       ` Simon Goldschmidt
2018-02-07  8:45         ` Joakim Tjernlund
2018-02-07 18:23           ` Maxime Ripard
2018-02-07  8:19     ` Maxime Ripard
2018-02-07  8:25       ` Simon Goldschmidt
2018-02-07 18:48         ` Maxime Ripard
2018-01-23 20:16 ` [U-Boot] [PATCH v3 10/15] env: Initialise all the environments Maxime Ripard
2018-01-27 19:21   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-01-23 20:17 ` [U-Boot] [PATCH v3 11/15] env: mmc: depends on the MMC framework Maxime Ripard
2018-01-24 13:51   ` Jaehoon Chung
2018-01-27 19:21   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-01-23 20:17 ` [U-Boot] [PATCH v3 12/15] env: Allow to build multiple environments in Kconfig Maxime Ripard
2018-01-27 19:21   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-02-01 10:06   ` [U-Boot] [PATCH v3 " Simon Goldschmidt
2018-02-02 19:47     ` Maxime Ripard
2018-01-23 20:17 ` [U-Boot] [PATCH v3 13/15] env: Mark env_get_location as weak Maxime Ripard
2018-01-27 19:21   ` [U-Boot] [U-Boot,v3,13/15] " Tom Rini
2018-01-30  8:12   ` [U-Boot] [PATCH v3 13/15] " Simon Goldschmidt
2018-01-30  8:18     ` Maxime Ripard
2018-01-23 20:17 ` [U-Boot] [PATCH v3 14/15] sunxi: Transition from the MMC to a FAT-based environment Maxime Ripard
2018-01-27 19:21   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-01-23 20:17 ` [U-Boot] [PATCH v3 15/15] env: sunxi: Enable FAT-based environment support by default Maxime Ripard
2018-01-27 19:21   ` [U-Boot] [U-Boot, v3, " Tom Rini
2018-02-07 20:45 [U-Boot] [PATCH v3 09/15] env: Support multiple environments Goldschmidt Simon
2018-02-07 21:18 ` York Sun
2018-02-08  5:30   ` Simon Goldschmidt

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.