Home | History | Annotate | Download | only in doc
      1 # SPDX-License-Identifier: GPL-2.0+
      2 #
      3 # (C) Copyright 2014 Google, Inc
      4 # Simon Glass <sjg (a] chromium.org>
      5 
      6 Background
      7 ----------
      8 
      9 U-Boot traditionally had a board.c file for each architecture. This introduced
     10 quite a lot of duplication, with each architecture tending to do
     11 initialisation slightly differently. To address this, a new 'generic board
     12 init' feature was introduced in March 2013 (further motivation is
     13 provided in the cover letter below).
     14 
     15 All boards and architectures have moved to this as of mid 2016.
     16 
     17 
     18 What has changed?
     19 -----------------
     20 
     21 The main change is that the arch/<arch>/lib/board.c file is removed in
     22 favour of common/board_f.c (for pre-relocation init) and common/board_r.c
     23 (for post-relocation init).
     24 
     25 Related to this, the global_data and bd_t structures now have a core set of
     26 fields which are common to all architectures. Architecture-specific fields
     27 have been moved to separate structures.
     28 
     29 
     30 Further Background
     31 ------------------
     32 
     33 The full text of the original generic board series is reproduced below.
     34 
     35 --8<-------------
     36 
     37 This series creates a generic board.c implementation which contains
     38 the essential functions of the major arch/xxx/lib/board.c files.
     39 
     40 What is the motivation for this change?
     41 
     42 1. There is a lot of repeated code in the board.c files. Any change to
     43 things like setting up the baud rate requires a change in 10 separate
     44 places.
     45 
     46 2. Since there are 10 separate files, adding a new feature which requires
     47 initialisation is painful since it must be independently added in 10
     48 places.
     49 
     50 3. As time goes by the architectures naturally diverge since there is limited
     51 pressure to compare features or even CONFIG options against similar things
     52 in other board.c files.
     53 
     54 4. New architectures must implement all the features all over again, and
     55 sometimes in subtle different ways. This places an unfair burden on getting
     56 a new architecture fully functional and running with U-Boot.
     57 
     58 5. While it is a bit of a tricky change, I believe it is worthwhile and
     59 achievable. There is no requirement that all code be common, only that
     60 the code that is common should be located in common/board.c rather than
     61 arch/xxx/lib/board.c.
     62 
     63 All the functions of board_init_f() and board_init_r() are broken into
     64 separate function calls so that they can easily be included or excluded
     65 for a particular architecture. It also makes it easier to adopt Graeme's
     66 initcall proposal when it is ready.
     67 
     68 http://lists.denx.de/pipermail/u-boot/2012-January/114499.html
     69 
     70 This series removes the dependency on generic relocation. So relocation
     71 happens as one big chunk and is still completely arch-specific. See the
     72 relocation series for a proposed solution to this for ARM:
     73 
     74 http://lists.denx.de/pipermail/u-boot/2011-December/112928.html
     75 
     76 or Graeme's recent x86 series v2:
     77 
     78 http://lists.denx.de/pipermail/u-boot/2012-January/114467.html
     79 
     80 Instead of moving over a whole architecture, this series takes the approach
     81 of simply enabling generic board support for an architecture. It is then up
     82 to each board to opt in by defining CONFIG_SYS_GENERIC_BOARD in the board
     83 config file. If this is not done, then the code will be generated as
     84 before. This allows both sets of code to co-exist until we are comfortable
     85 with the generic approach, and enough boards run.
     86 
     87 ARM is a relatively large board.c file and one which I can test, therefore
     88 I think it is a good target for this series. On the other hand, x86 is
     89 relatively small and simple, but different enough that it introduces a
     90 few issues to be solved. So I have chosen both ARM and x86 for this series.
     91 After a suggestion from Wolfgang I have added PPC also. This is the
     92 largest and most feature-full board, so hopefully we have all bases
     93 covered in this RFC.
     94 
     95 A generic global_data structure is also required. This might upset a few
     96 people. Here is my basic reasoning: most fields are the same, all
     97 architectures include and need it, most global_data.h files already have
     98 #ifdefs to select fields for a particular SOC, so it is hard to
     99 see why architecures are different in this area. We can perhaps add a
    100 way to put architecture-specific fields into a separate header file, but
    101 for now I have judged that to be counter-productive.
    102 
    103 Similarly we need a generic bd_info structure, since generic code will
    104 be accessing it. I have done this in the same way as global_data and the
    105 same comments apply.
    106 
    107 There was dicussion on the list about passing gd_t around as a parameter
    108 to pre-relocation init functions. I think this makes sense, but it can
    109 be done as a separate change, and this series does not require it.
    110 
    111 While this series needs to stand on its own (as with the link script
    112 cleanup series and the generic relocation series) the goal is the
    113 unification of the board init code. So I hope we can address issues with
    114 this in mind, rather than focusing too narrowly on particular ARM, x86 or
    115 PPC issues.
    116 
    117 I have run-tested ARM on Tegra Seaboard only. To try it out, define
    118 CONFIG_SYS_GENERIC_BOARD in your board file and rebuild. Most likely on
    119 x86 and PPC at least it will hang, but if you are lucky it will print
    120 something first :-)
    121 
    122 I have run this though MAKEALL with CONFIG_SYS_GENERIC_BOARD on for all
    123 ARM, PPC and x86 boards. There are a few failures due to errors in
    124 the board config, which I have sent patches for. The main issue is
    125 just the difference between __bss_end and __bss_end__.
    126 
    127 Note: the first group of commits are required for this series to build,
    128 but could be separated out if required. I have included them here for
    129 convenience.
    130 
    131 ------------->8--
    132 
    133 Simon Glass, sjg (a] chromium.org
    134 March 2014
    135 Updated after final removal, May 2016
    136