xref: /arm-trusted-firmware/docs/process/contributing.rst (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700SchasingluluContributor's Guide
2*91f16700Schasinglulu*******************
3*91f16700Schasinglulu
4*91f16700SchasingluluGetting Started
5*91f16700Schasinglulu===============
6*91f16700Schasinglulu
7*91f16700Schasinglulu-  Make sure you have a Github account and you are logged on both
8*91f16700Schasinglulu   `developer.trustedfirmware.org`_ and `review.trustedfirmware.org`_.
9*91f16700Schasinglulu
10*91f16700Schasinglulu-  If you plan to contribute a major piece of work, it is usually a good idea to
11*91f16700Schasinglulu   start a discussion around it on the mailing list. This gives everyone
12*91f16700Schasinglulu   visibility of what is coming up, you might learn that somebody else is
13*91f16700Schasinglulu   already working on something similar or the community might be able to
14*91f16700Schasinglulu   provide some early input to help shaping the design of the feature.
15*91f16700Schasinglulu
16*91f16700Schasinglulu   If you intend to include Third Party IP in your contribution, please mention
17*91f16700Schasinglulu   it explicitly in the email thread and ensure that the changes that include
18*91f16700Schasinglulu   Third Party IP are made in a separate patch (or patch series).
19*91f16700Schasinglulu
20*91f16700Schasinglulu-  Clone `Trusted Firmware-A`_ on your own machine as described in
21*91f16700Schasinglulu   :ref:`prerequisites_get_source`.
22*91f16700Schasinglulu
23*91f16700Schasinglulu-  Create a local topic branch based on the `Trusted Firmware-A`_ ``master``
24*91f16700Schasinglulu   branch.
25*91f16700Schasinglulu
26*91f16700SchasingluluMaking Changes
27*91f16700Schasinglulu==============
28*91f16700Schasinglulu
29*91f16700Schasinglulu-  Ensure commits adhere to the the project's :ref:`Commit Style`.
30*91f16700Schasinglulu
31*91f16700Schasinglulu-  Make commits of logical units. See these general `Git guidelines`_ for
32*91f16700Schasinglulu   contributing to a project.
33*91f16700Schasinglulu
34*91f16700Schasinglulu-  Keep the commits on topic. If you need to fix another bug or make another
35*91f16700Schasinglulu   enhancement, please address it on a separate topic branch.
36*91f16700Schasinglulu
37*91f16700Schasinglulu-  Split the patch in manageable units. Small patches are usually easier to
38*91f16700Schasinglulu   review so this will speed up the review process.
39*91f16700Schasinglulu
40*91f16700Schasinglulu-  Avoid long commit series. If you do have a long series, consider whether
41*91f16700Schasinglulu   some commits should be squashed together or addressed in a separate topic.
42*91f16700Schasinglulu
43*91f16700Schasinglulu-  Follow the :ref:`Coding Style` and :ref:`Coding Guidelines`.
44*91f16700Schasinglulu
45*91f16700Schasinglulu   -  Use the checkpatch.pl script provided with the Linux source tree. A
46*91f16700Schasinglulu      Makefile target is provided for convenience, see :ref:`this
47*91f16700Schasinglulu      section<automatic-compliance-checking>` for more details.
48*91f16700Schasinglulu
49*91f16700Schasinglulu-  Where appropriate, please update the documentation.
50*91f16700Schasinglulu
51*91f16700Schasinglulu   -  Consider whether the :ref:`Porting Guide`, :ref:`Firmware Design` document
52*91f16700Schasinglulu      or other in-source documentation needs updating.
53*91f16700Schasinglulu
54*91f16700Schasinglulu   -  If you are submitting new files that you intend to be the code owner for
55*91f16700Schasinglulu      (for example, a new platform port), then also update the
56*91f16700Schasinglulu      :ref:`code owners` file.
57*91f16700Schasinglulu
58*91f16700Schasinglulu   -  For topics with multiple commits, you should make all documentation changes
59*91f16700Schasinglulu      (and nothing else) in the last commit of the series. Otherwise, include
60*91f16700Schasinglulu      the documentation changes within the single commit.
61*91f16700Schasinglulu
62*91f16700Schasinglulu.. _copyright-license-guidance:
63*91f16700Schasinglulu
64*91f16700Schasinglulu-  Ensure that each changed file has the correct copyright and license
65*91f16700Schasinglulu   information. Files that entirely consist of contributions to this project
66*91f16700Schasinglulu   should have a copyright notice and BSD-3-Clause SPDX license identifier of
67*91f16700Schasinglulu   the form as shown in :ref:`license`. Files that contain changes to imported
68*91f16700Schasinglulu   Third Party IP files should retain their original copyright and license
69*91f16700Schasinglulu   notices.
70*91f16700Schasinglulu
71*91f16700Schasinglulu   For significant contributions you may add your own copyright notice in the
72*91f16700Schasinglulu   following format:
73*91f16700Schasinglulu
74*91f16700Schasinglulu   ::
75*91f16700Schasinglulu
76*91f16700Schasinglulu       Portions copyright (c) [XXXX-]YYYY, <OWNER>. All rights reserved.
77*91f16700Schasinglulu
78*91f16700Schasinglulu   where XXXX is the year of first contribution (if different to YYYY) and YYYY
79*91f16700Schasinglulu   is the year of most recent contribution. <OWNER> is your name or your company
80*91f16700Schasinglulu   name.
81*91f16700Schasinglulu
82*91f16700Schasinglulu-  Ensure that each patch in the patch series compiles in all supported
83*91f16700Schasinglulu   configurations. Patches which do not compile will not be merged.
84*91f16700Schasinglulu
85*91f16700Schasinglulu-  Please test your changes. As a minimum, ensure that Linux boots on the
86*91f16700Schasinglulu   Foundation FVP. See :ref:`Arm Fixed Virtual Platforms (FVP)` for more
87*91f16700Schasinglulu   information. For more extensive testing, consider running the `TF-A Tests`_
88*91f16700Schasinglulu   against your patches.
89*91f16700Schasinglulu
90*91f16700Schasinglulu-  Ensure that all CI automated tests pass. Failures should be fixed. They might
91*91f16700Schasinglulu   block a patch, depending on how critical they are.
92*91f16700Schasinglulu
93*91f16700SchasingluluSubmitting Changes
94*91f16700Schasinglulu==================
95*91f16700Schasinglulu
96*91f16700Schasinglulu-  Submit your changes for review at https://review.trustedfirmware.org
97*91f16700Schasinglulu   targeting the ``integration`` branch.
98*91f16700Schasinglulu
99*91f16700Schasinglulu-  Add reviewers for your patch:
100*91f16700Schasinglulu
101*91f16700Schasinglulu   -  At least one code owner for each module modified by the patch. See the list
102*91f16700Schasinglulu      of modules and their :ref:`code owners`.
103*91f16700Schasinglulu
104*91f16700Schasinglulu   -  At least one maintainer. See the list of :ref:`maintainers`.
105*91f16700Schasinglulu
106*91f16700Schasinglulu   -  If some module has no code owner, try to identify a suitable (non-code
107*91f16700Schasinglulu      owner) reviewer. Running ``git blame`` on the module's source code can
108*91f16700Schasinglulu      help, as it shows who has been working the most recently on this area of
109*91f16700Schasinglulu      the code.
110*91f16700Schasinglulu
111*91f16700Schasinglulu      Alternatively, if it is impractical to identify such a reviewer, you might
112*91f16700Schasinglulu      send an email to the `TF-A mailing list`_ to broadcast your review request
113*91f16700Schasinglulu      to the community.
114*91f16700Schasinglulu
115*91f16700Schasinglulu   Note that self-reviewing a patch is prohibited, even if the patch author is
116*91f16700Schasinglulu   the only code owner of a module modified by the patch. Getting a second pair
117*91f16700Schasinglulu   of eyes on the code is essential to keep up with the quality standards the
118*91f16700Schasinglulu   project aspires to.
119*91f16700Schasinglulu
120*91f16700Schasinglulu-  The changes will then undergo further review by the designated people. Any
121*91f16700Schasinglulu   review comments will be made directly on your patch. This may require you to
122*91f16700Schasinglulu   do some rework. For controversial changes, the discussion might be moved to
123*91f16700Schasinglulu   the `TF-A mailing list`_ to involve more of the community.
124*91f16700Schasinglulu
125*91f16700Schasinglulu   Refer to the `Gerrit Uploading Changes documentation`_ for more details.
126*91f16700Schasinglulu
127*91f16700Schasinglulu-  The patch submission rules are the following. For a patch to be approved
128*91f16700Schasinglulu   and merged in the tree, it must get:
129*91f16700Schasinglulu
130*91f16700Schasinglulu   -  One ``Code-Owner-Review+1`` for each of the modules modified by the patch.
131*91f16700Schasinglulu   -  A ``Maintainer-Review+1``.
132*91f16700Schasinglulu
133*91f16700Schasinglulu   In the case where a code owner could not be found for a given module,
134*91f16700Schasinglulu   ``Code-Owner-Review+1`` is substituted by ``Code-Review+1``.
135*91f16700Schasinglulu
136*91f16700Schasinglulu   In addition to these various code review labels, the patch must also get a
137*91f16700Schasinglulu   ``Verified+1``. This is usually set by the Continuous Integration (CI) bot
138*91f16700Schasinglulu   when all automated tests passed on the patch. Sometimes, some of these
139*91f16700Schasinglulu   automated tests may fail for reasons unrelated to the patch. In this case,
140*91f16700Schasinglulu   the maintainers might (after analysis of the failures) override the CI bot
141*91f16700Schasinglulu   score to certify that the patch has been correctly tested.
142*91f16700Schasinglulu
143*91f16700Schasinglulu   In the event where the CI system lacks proper tests for a patch, the patch
144*91f16700Schasinglulu   author or a reviewer might agree to perform additional manual tests
145*91f16700Schasinglulu   in their review and the reviewer incorporates the review of the additional
146*91f16700Schasinglulu   testing in the ``Code-Review+1`` or ``Code-Owner-Review+1`` as applicable to
147*91f16700Schasinglulu   attest that the patch works as expected. Where possible additional tests should
148*91f16700Schasinglulu   be added to the CI system as a follow up task. For example, for a
149*91f16700Schasinglulu   platform-dependent patch where the said platform is not available in the CI
150*91f16700Schasinglulu   system's board farm.
151*91f16700Schasinglulu
152*91f16700Schasinglulu-  When the changes are accepted, the :ref:`maintainers` will integrate them.
153*91f16700Schasinglulu
154*91f16700Schasinglulu   -  Typically, the :ref:`maintainers` will merge the changes into the
155*91f16700Schasinglulu      ``integration`` branch.
156*91f16700Schasinglulu
157*91f16700Schasinglulu   -  If the changes are not based on a sufficiently-recent commit, or if they
158*91f16700Schasinglulu      cannot be automatically rebased, then the :ref:`maintainers` may rebase it
159*91f16700Schasinglulu      on the ``integration`` branch or ask you to do so.
160*91f16700Schasinglulu
161*91f16700Schasinglulu   -  After final integration testing, the changes will make their way into the
162*91f16700Schasinglulu      ``master`` branch. If a problem is found during integration, the
163*91f16700Schasinglulu      :ref:`maintainers` will request your help to solve the issue. They may
164*91f16700Schasinglulu      revert your patches and ask you to resubmit a reworked version of them or
165*91f16700Schasinglulu      they may ask you to provide a fix-up patch.
166*91f16700Schasinglulu
167*91f16700SchasingluluAdd CI Configurations
168*91f16700Schasinglulu=====================
169*91f16700Schasinglulu
170*91f16700Schasinglulu-  TF-A uses Jenkins tool for Continuous Integration and testing activities.
171*91f16700Schasinglulu   Various CI Jobs are deployed which run tests on every patch before being
172*91f16700Schasinglulu   merged. So each of your patches go through a series of checks before they
173*91f16700Schasinglulu   get merged on to the master branch. Kindly ensure, that everytime you add
174*91f16700Schasinglulu   new files under your platform, they are covered under the following two sections:
175*91f16700Schasinglulu
176*91f16700SchasingluluCoverity Scan
177*91f16700Schasinglulu-------------
178*91f16700Schasinglulu
179*91f16700Schasinglulu-  ``Coverity Scan analysis`` is one of the tests we perform on our source code
180*91f16700Schasinglulu   at regular intervals. We maintain a build script ``tf-cov-make`` which contains the
181*91f16700Schasinglulu   build configurations of various platforms in order to cover the entire source
182*91f16700Schasinglulu   code being analysed by Coverity.
183*91f16700Schasinglulu
184*91f16700Schasinglulu-  When you submit your patches for review containing new source files, please
185*91f16700Schasinglulu   ensure to include them for the ``Coverity Scan analysis`` by adding the
186*91f16700Schasinglulu   respective build configurations in the ``tf-cov-make`` build script.
187*91f16700Schasinglulu
188*91f16700Schasinglulu-  In this section you find the details on how to append your new build
189*91f16700Schasinglulu   configurations for Coverity scan analysis illustrated with examples:
190*91f16700Schasinglulu
191*91f16700Schasinglulu#. We maintain a separate repository named `tf-a-ci-scripts repository`_
192*91f16700Schasinglulu   for placing all the test scripts which will be executed by the CI Jobs.
193*91f16700Schasinglulu
194*91f16700Schasinglulu#. In this repository, ``tf-cov-make`` script is located at
195*91f16700Schasinglulu   ``tf-a-ci-scripts/script/tf-coverity/tf-cov-make``
196*91f16700Schasinglulu
197*91f16700Schasinglulu#. Edit `tf-cov-make`_ script by appending all the possible build configurations with
198*91f16700Schasinglulu   the specific ``build-flags`` relevant to your platform, so that newly added
199*91f16700Schasinglulu   source files get built and analysed by Coverity.
200*91f16700Schasinglulu
201*91f16700Schasinglulu#. For better understanding follow the below specified examples listed in the
202*91f16700Schasinglulu   ``tf-cov-make`` script.
203*91f16700Schasinglulu
204*91f16700Schasinglulu.. code:: shell
205*91f16700Schasinglulu
206*91f16700Schasinglulu    Example 1:
207*91f16700Schasinglulu    #Intel
208*91f16700Schasinglulu    make PLAT=stratix10 $(common_flags) all
209*91f16700Schasinglulu    make PLAT=agilex $(common_flags) all
210*91f16700Schasinglulu
211*91f16700Schasinglulu-  In the above example there are two different SoCs ``stratix`` and ``agilex``
212*91f16700Schasinglulu   under the Intel platform and the build configurations has been added suitably
213*91f16700Schasinglulu   to include most of their source files.
214*91f16700Schasinglulu
215*91f16700Schasinglulu.. code:: shell
216*91f16700Schasinglulu
217*91f16700Schasinglulu    Example 2:
218*91f16700Schasinglulu    #Hikey
219*91f16700Schasinglulu    make PLAT=hikey $(common_flags) ${TBB_OPTIONS} ENABLE_PMF=1 all
220*91f16700Schasinglulu    make PLAT=hikey960 $(common_flags) ${TBB_OPTIONS} all
221*91f16700Schasinglulu    make PLAT=poplar $(common_flags) all
222*91f16700Schasinglulu
223*91f16700Schasinglulu-  In this case for ``Hikey`` boards additional ``build-flags`` has been included
224*91f16700Schasinglulu   along with the ``commom_flags`` to cover most of the files relevant to it.
225*91f16700Schasinglulu
226*91f16700Schasinglulu-  Similar to this you can still find many other different build configurations
227*91f16700Schasinglulu   of various other platforms listed in the ``tf-cov-make`` script. Kindly refer
228*91f16700Schasinglulu   them and append your build configurations respectively.
229*91f16700Schasinglulu
230*91f16700SchasingluluTest Build Configuration (``tf-l1-build-plat``)
231*91f16700Schasinglulu-----------------------------------------------
232*91f16700Schasinglulu
233*91f16700Schasinglulu-  Coverity Scan analysis, runs on a daily basis and will not be triggered for
234*91f16700Schasinglulu   every individual trusted-firmware patch.
235*91f16700Schasinglulu
236*91f16700Schasinglulu-  Considering this, we have other distinguished CI jobs which run a set of test
237*91f16700Schasinglulu   configurations on every patch, before they are being passed to ``Coverity scan analysis``.
238*91f16700Schasinglulu
239*91f16700Schasinglulu-  ``tf-l1-build-plat`` is the test group, which holds the test configurations
240*91f16700Schasinglulu   to build all the platforms. So be kind enough to verify that your newly added
241*91f16700Schasinglulu   files are built as part of one of the existing platform configurations present
242*91f16700Schasinglulu   in ``tf-l1-build-plat`` test group.
243*91f16700Schasinglulu
244*91f16700Schasinglulu-  In this section you find the details on how to add the appropriate files,
245*91f16700Schasinglulu   needed to build your newly introduced platform as part of ``tf-l1-build-plat``
246*91f16700Schasinglulu   test group, illustrated with an example:
247*91f16700Schasinglulu
248*91f16700Schasinglulu-  Lets consider ``Hikey`` platform:
249*91f16700Schasinglulu   In the `tf-a-ci-scripts repository`_ we need to add a build configuration file ``hikey-default``
250*91f16700Schasinglulu   under tf_config folder, ``tf_config/hikey-default`` listing all the build parameters
251*91f16700Schasinglulu   relevant to it.
252*91f16700Schasinglulu
253*91f16700Schasinglulu.. code:: shell
254*91f16700Schasinglulu
255*91f16700Schasinglulu   #Hikey Build Parameters
256*91f16700Schasinglulu   CROSS_COMPILE=aarch64-none-elf-
257*91f16700Schasinglulu   PLAT=hikey
258*91f16700Schasinglulu
259*91f16700Schasinglulu-  Further a test-configuration file ``hikey-default:nil`` need to be added under the
260*91f16700Schasinglulu   test group, ``tf-l1-build-plat`` located at ``tf-a-ci-scripts/group/tf-l1-build-plat``,
261*91f16700Schasinglulu   to allow the platform to be built as part of this group.
262*91f16700Schasinglulu
263*91f16700Schasinglulu.. code:: shell
264*91f16700Schasinglulu
265*91f16700Schasinglulu   #
266*91f16700Schasinglulu   # Copyright (c) 2019-2022 Arm Limited. All rights reserved.
267*91f16700Schasinglulu   #
268*91f16700Schasinglulu   # SPDX-License-Identifier: BSD-3-Clause
269*91f16700Schasinglulu   #
270*91f16700Schasinglulu
271*91f16700Schasinglulu-  As illustrated above, you need to add the similar files supporting your platform.
272*91f16700Schasinglulu
273*91f16700SchasingluluBinary Components
274*91f16700Schasinglulu=================
275*91f16700Schasinglulu
276*91f16700Schasinglulu-  Platforms may depend on binary components submitted to the `Trusted Firmware
277*91f16700Schasinglulu   binary repository`_ if they require code that the contributor is unable or
278*91f16700Schasinglulu   unwilling to open-source. This should be used as a rare exception.
279*91f16700Schasinglulu-  All binary components must follow the contribution guidelines (in particular
280*91f16700Schasinglulu   licensing rules) outlined in the `readme.rst <tf-binaries-readme_>`_ file of
281*91f16700Schasinglulu   the binary repository.
282*91f16700Schasinglulu-  Binary components must be restricted to only the specific functionality that
283*91f16700Schasinglulu   cannot be open-sourced and must be linked into a larger open-source platform
284*91f16700Schasinglulu   port. The majority of the platform port must still be implemented in open
285*91f16700Schasinglulu   source. Platform ports that are merely a thin wrapper around a binary
286*91f16700Schasinglulu   component that contains all the actual code will not be accepted.
287*91f16700Schasinglulu-  Only platform port code (i.e. in the ``plat/<vendor>`` directory) may rely on
288*91f16700Schasinglulu   binary components. Generic code must always be fully open-source.
289*91f16700Schasinglulu
290*91f16700Schasinglulu--------------
291*91f16700Schasinglulu
292*91f16700Schasinglulu*Copyright (c) 2013-2022, Arm Limited and Contributors. All rights reserved.*
293*91f16700Schasinglulu
294*91f16700Schasinglulu.. _developer.trustedfirmware.org: https://developer.trustedfirmware.org
295*91f16700Schasinglulu.. _review.trustedfirmware.org: https://review.trustedfirmware.org
296*91f16700Schasinglulu.. _Trusted Firmware-A: https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
297*91f16700Schasinglulu.. _Git guidelines: http://git-scm.com/book/ch5-2.html
298*91f16700Schasinglulu.. _Gerrit Uploading Changes documentation: https://review.trustedfirmware.org/Documentation/user-upload.html
299*91f16700Schasinglulu.. _TF-A Tests: https://trustedfirmware-a-tests.readthedocs.io
300*91f16700Schasinglulu.. _Trusted Firmware binary repository: https://review.trustedfirmware.org/admin/repos/tf-binaries
301*91f16700Schasinglulu.. _tf-binaries-readme: https://git.trustedfirmware.org/tf-binaries.git/tree/readme.rst
302*91f16700Schasinglulu.. _TF-A mailing list: https://lists.trustedfirmware.org/mailman3/lists/tf-a.lists.trustedfirmware.org/
303*91f16700Schasinglulu.. _tf-a-ci-scripts repository: https://git.trustedfirmware.org/ci/tf-a-ci-scripts.git/
304*91f16700Schasinglulu.. _tf-cov-make: https://git.trustedfirmware.org/ci/tf-a-ci-scripts.git/tree/script/tf-coverity/tf-cov-make
305