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