"Das U-Boot" Source Tree
at master 254 lines 8.4 kB view raw
1.. SPDX-License-Identifier: GPL-2.0+: 2 3U-Boot Coding Style 4=================== 5 6The following Coding Style requirements shall be mandatory for all code contributed to 7the U-Boot project. 8 9Exceptions are only allowed if code from other projects is integrated with no 10or only minimal changes. 11 12The following rules apply: 13 14* All contributions to U-Boot should conform to the `Linux kernel 15 coding style <https://www.kernel.org/doc/html/latest/process/coding-style.html>`_ 16 and the `Lindent script <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/Lindent>`_. 17 * The exception for net files to the `multi-line comment 18 <https://www.kernel.org/doc/html/latest/process/coding-style.html#commenting>`_ 19 applies only to Linux, not to U-Boot. Only large hunks which are copied 20 unchanged from Linux may retain that comment format. 21 22* Python code shall conform to `PEP8 (Style Guide for Python Code) 23 <https://peps.python.org/pep-0008/>`_. Use `pylint 24 <https://github.com/pylint-dev/pylint>`_ for checking the code. 25 26* Use patman to send your patches (``tools/patman/patman -H`` for full 27 instructions). With a few tags in your commits this will check your patches 28 and take care of emailing them. 29 30* If you don't use patman, make sure to run ``scripts/checkpatch.pl``. For 31 more information, read :doc:`checkpatch`. Note that this should be done 32 *before* posting on the mailing list! 33 34* Source files originating from different projects (for example the MTD 35 subsystem or the hush shell code from the BusyBox project) may, after 36 careful consideration, be exempted from these rules. For such files, the 37 original coding style may be kept to ease subsequent migration to newer 38 versions of those sources. 39 40* Please also stick to the following formatting rules: 41 42 * Remove any trailing white space 43 44 * Use TAB characters for indentation and vertical alignment, not spaces 45 46 * The exception here is Python which requires 4 spaces instead. 47 48 * All source files need to be in "Unix" and not "DOS" or "Windows" format, 49 with respect to line ends. 50 51 * Do not add more than 2 consecutive empty lines to source files 52 53 * Do not add trailing empty lines to source files 54 55 * Using the option ``git config --global color.diff auto`` will help to 56 visually see whitespace problems in ``diff`` output from ``git``. 57 58 * In Emacs one can use ``=M-x whitespace-global-mode=`` to get visual 59 feedback on the nasty details. ``=M-x whitespace-cleanup=`` does The Right 60 Thing (tm) 61 62Submissions of new code or patches that do not conform to these requirements 63shall be rejected with a request to reformat the changes. 64 65U-Boot Code Documentation 66------------------------- 67 68U-Boot adopted the kernel-doc annotation style, this is the only exception from 69multi-line comment rule of Coding Style. While not mandatory, adding 70documentation is strongly advised. The Linux kernel `kernel-doc 71<https://www.kernel.org/doc/html/latest/doc-guide/kernel-doc.html>`_ 72documentation applies with no changes. 73 74Our Python code documentation follows `PEP257 (Docstring Conventions) 75<https://peps.python.org/pep-0257/>`_. 76 77Use structures for I/O access 78----------------------------- 79 80U-Boot typically uses a C structure to map out the registers in an I/O region, 81rather than offsets. The reasons for this are: 82 83* It dissociates the register location (offset) from the register type, which 84 means the developer has to make sure the type is right for each access, 85 whereas with the struct method, this is checked by the compiler; 86 87* It avoids actually writing all offsets, which is (more) error-prone; 88 89* It allows for better compile time sanity-checking of values we write to registers. 90 91Some reasons why you might not use C structures: 92 93* Where the registers appear at different offsets in different hardware 94 revisions supported by the same driver 95 96* Where the driver only uses a small subset of registers and it is not worth 97 defining a struct to cover them all, with large empty regions 98 99* Where the offset of a register might be hard to figure out when buried a long 100 way down a structure, possibly with embedded sub-structures 101 102* This may need to change to the kernel model if we allow for more run-time 103 detection of what drivers are appropriate for what we're running on. 104 105Please use the check_member() macro to verify that your structure is the 106expected size, or that particular members appear at the right offset. 107 108Include files 109------------- 110 111You should follow this ordering in U-Boot. In all cases, they should be listed 112in alphabetical order. First comes headers which are located directly in our 113top-level include diretory. Second are headers within subdirectories, Finally 114directory-local includes should be listed. See this example: 115 116.. code-block:: C 117 118 #include <bootstage.h> 119 #include <dm.h> 120 #include <others.h> 121 #include <asm/...> 122 #include <asm/arch/...> 123 #include <dm/device_compat.h> 124 #include <linux/...> 125 #include "local.h" 126 127For files that need to be compiled for the host (e.g. tools), you need to use 128``#ifndef USE_HOSTCC`` to avoid including U-Boot specific include files. See 129common/image.c for an example. 130 131If your file uses driver model, include <dm.h> in the C file. Do not include 132dm.h in a header file. Try to use forward declarations (e.g. ``struct 133udevice``) instead. 134 135Filenames 136--------- 137 138For .c and .h files try to use underscore rather than hyphen unless you want 139the file to stand out (e.g. driver-model uclasses should be named xxx-uclass.h. 140Avoid upper case and keep the names fairly short. 141 142Function and struct comments 143---------------------------- 144 145Non-trivial functions should have a comment which describes what they do. If it 146is an exported function, put the comment in the header file so the API is in 147one place. If it is a static function, put it in the C file. 148 149If the function returns errors, mention that and list the different errors that 150are returned. If it is merely passing errors back from a function it calls, 151then you can skip that. 152 153See `here 154<https://www.kernel.org/doc/html/latest/doc-guide/kernel-doc.html#function-documentation>`_ 155for style. 156 157Driver model 158------------ 159 160When declaring a device, try to use ``struct udevice *dev``, i.e. ``dev`` as the name: 161 162.. code-block:: C 163 164 struct udevice *dev; 165 166Use ``ret`` as the return value: 167 168.. code-block:: C 169 170 struct udevice *dev; 171 int ret; 172 173 ret = uclass_first_device_err(UCLASS_ACPI_PMC, &dev); 174 if (ret) 175 return log_msg_ret("pmc", dev); 176 177Consider using log_ret() or log_msg_ret() to return a value (see above). 178 179Add a ``p`` suffix on return arguments: 180 181.. code-block:: C 182 183 int dm_pci_find_class(uint find_class, int index, struct udevice **devp) 184 { 185 ... 186 *devp = dev; 187 188 return 0; 189 } 190 191There are standard variable names that you should use in drivers: 192 193* ``struct xxx_priv`` and ``priv`` for dev_get_priv() 194 195* ``struct xxx_plat`` and ``plat`` for dev_get_platdata() 196 197For example: 198 199.. code-block:: C 200 201 struct simple_bus_plat { 202 u32 base; 203 u32 size; 204 u32 target; 205 }; 206 207 /* Davinci MMC board definitions */ 208 struct davinci_mmc_priv { 209 struct davinci_mmc_regs *reg_base; /* Register base address */ 210 uint input_clk; /* Input clock to MMC controller */ 211 struct gpio_desc cd_gpio; /* Card Detect GPIO */ 212 struct gpio_desc wp_gpio; /* Write Protect GPIO */ 213 }; 214 215 struct rcar_gpio_priv *priv = dev_get_priv(dev); 216 217 struct pl01x_serial_platdata *plat = dev_get_platdata(dev); 218 219Other 220----- 221 222Some minor things: 223 224* Put a blank line before the last ``return`` in a function unless it is the only line: 225 226.. code-block:: C 227 228 struct udevice *pci_get_controller(struct udevice *dev) 229 { 230 while (device_is_on_pci_bus(dev)) 231 dev = dev->parent; 232 233 return dev; 234 } 235 236Tests 237----- 238 239Please add tests when you add code. Please change or expand tests when you change code. 240 241Run the tests with:: 242 243 make check 244 make qcheck (skips some tests) 245 246Python tests are in test/py/tests - see the docs in test/py for info. 247 248Try to write your tests in C if you can. For example, tests to check a command 249will be much faster (10-100x or more) if they can directly call run_command() 250and ut_check_console_line() instead of using Python to send commands over a 251pipe to U-Boot. 252 253Tests run all supported CI systems (GitLab, Azure) using scripts in the root of 254the U-Boot tree.