Contributing to Trusted Firmware-A
==================================

Getting Started
---------------

-  Make sure you have a `GitHub account`_.
-  Create an `issue`_ for your work if one does not already exist. This gives
   everyone visibility of whether others are working on something similar. Arm
   licensees may contact Arm directly via their partner managers instead if
   they prefer.

   -  Note that the `issue`_ tracker for this project is in a separate
      `issue tracking repository`_. Please follow the guidelines in that
      repository.
   -  If you intend to include Third Party IP in your contribution, please
      raise a separate `issue`_ for this and ensure that the changes that
      include Third Party IP are made on a separate topic branch.

-  `Fork`_ `arm-trusted-firmware`_ on GitHub.
-  Clone the fork to your own machine.
-  Create a local topic branch based on the `arm-trusted-firmware`_ ``master``
   branch.

Making Changes
--------------

-  Make commits of logical units. See these general `Git guidelines`_ for
   contributing to a project.
-  Follow the `Linux coding style`_; this style is enforced for the TF-A
   project (style errors only, not warnings).

   -  Use the checkpatch.pl script provided with the Linux source tree. A
      Makefile target is provided for convenience (see section 2 in the
      `User Guide`_).

-  Keep the commits on topic. If you need to fix another bug or make another
   enhancement, please create a separate `issue`_ and address it on a separate
   topic branch.
-  Avoid long commit series. If you do have a long series, consider whether
   some commits should be squashed together or addressed in a separate topic.
-  Make sure your commit messages are in the proper format. If a commit fixes
   a GitHub `issue`_, include a reference (e.g.
   "fixes arm-software/tf-issues#45"); this ensures the `issue`_ is
   `automatically closed`_ when merged into the `arm-trusted-firmware`_ ``master``
   branch.
-  Where appropriate, please update the documentation.

   -  Consider whether the `User Guide`_, `Porting Guide`_, `Firmware Design`_ or
      other in-source documentation needs updating.
   -  Ensure that each changed file has the correct copyright and license
      information. Files that entirely consist of contributions to this
      project should have a copyright notice and BSD-3-Clause SPDX license
      identifier of the form as shown in `license.rst`_. Files that contain
      changes to imported Third Party IP files should retain their original
      copyright and license notices. For significant contributions you may
      add your own copyright notice in following format:

      ::

          Portions copyright (c) [XXXX-]YYYY, <OWNER>. All rights reserved.

      where XXXX is the year of first contribution (if different to YYYY) and
      YYYY is the year of most recent contribution. <OWNER> is your name or
      your company name.
   -  If you are submitting new files that you intend to be the technical
      sub-maintainer for (for example, a new platform port), then also update
      the `Maintainers`_ file.
   -  For topics with multiple commits, you should make all documentation
      changes (and nothing else) in the last commit of the series. Otherwise,
      include the documentation changes within the single commit.

-  Please test your changes. As a minimum, ensure UEFI boots to the shell on
   the Foundation FVP. See `Running the software on FVP`_ for more information.

Submitting Changes
------------------

-  Ensure that each commit in the series has at least one ``Signed-off-by:``
   line, using your real name and email address. The names in the
   ``Signed-off-by:`` and ``Author:`` lines must match. If anyone else contributes
   to the commit, they must also add their own ``Signed-off-by:`` line.
   By adding this line the contributor certifies the contribution is made under
   the terms of the `Developer Certificate of Origin (DCO)`_.
-  Push your local changes to your fork of the repository.
-  Submit a `pull request`_ to the `arm-trusted-firmware`_ ``integration`` branch.

   -  The changes in the `pull request`_ will then undergo further review and
      testing by the `Maintainers`_. Any review comments will be made as
      comments on the `pull request`_. This may require you to do some rework.

-  When the changes are accepted, the `Maintainers`_ will integrate them.

   -  Typically, the `Maintainers`_ will merge the `pull request`_ into the
      ``integration`` branch within the GitHub UI, creating a merge commit.
   -  Please avoid creating merge commits in the `pull request`_ itself.
   -  If the `pull request`_ is not based on a recent commit, the `Maintainers`_
      may rebase it onto the ``master`` branch first, or ask you to do this.
   -  If the `pull request`_ cannot be automatically merged, the `Maintainers`_
      will ask you to rebase it onto the ``master`` branch.
   -  After final integration testing, the `Maintainers`_ will push your merge
      commit to the ``master`` branch. If a problem is found during integration,
      the merge commit will be removed from the ``integration`` branch and the
      `Maintainers`_ will ask you to create a new pull request to resolve the
      problem.
   -  Please do not delete your topic branch until it is safely merged into
      the ``master`` branch.

--------------

*Copyright (c) 2013-2018, Arm Limited and Contributors. All rights reserved.*

.. _GitHub account: https://github.com/signup/free
.. _issue: https://github.com/ARM-software/tf-issues/issues
.. _issue tracking repository: https://github.com/ARM-software/tf-issues
.. _Fork: https://help.github.com/articles/fork-a-repo
.. _arm-trusted-firmware: https://github.com/ARM-software/arm-trusted-firmware
.. _Git guidelines: http://git-scm.com/book/ch5-2.html
.. _Linux coding style: https://github.com/torvalds/linux/blob/master/Documentation/process/coding-style.rst
.. _User Guide: ./docs/user-guide.rst
.. _automatically closed: https://help.github.com/articles/closing-issues-via-commit-messages
.. _Porting Guide: ./docs/porting-guide.rst
.. _Firmware Design: ./docs/firmware-design.rst
.. _license.rst: ./license.rst
.. _Acknowledgements: ./acknowledgements.rst
.. _Maintainers: ./maintainers.rst
.. _Running the software on FVP: ./docs/user-guide.rst#user-content-running-the-software-on-fvp
.. _Developer Certificate of Origin (DCO): ./dco.txt
.. _pull request: https://help.github.com/articles/using-pull-requests
