Compare commits
3 Commits
edk2-stabl
...
intel-fsp-
Author | SHA1 | Date | |
---|---|---|---|
|
8674aecb6a | ||
|
563bd1f035 | ||
|
2415686bbc |
@@ -7,10 +7,8 @@
|
|||||||
##
|
##
|
||||||
trigger:
|
trigger:
|
||||||
- master
|
- master
|
||||||
- stable/*
|
|
||||||
pr:
|
pr:
|
||||||
- master
|
- master
|
||||||
- stable/*
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
- template: templates/pr-gate-build-job.yml
|
- template: templates/pr-gate-build-job.yml
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
# NOTE: This example monitors pull requests against the edk2-ci branch. Most
|
# NOTE: This example monitors pull requests against the edk2-ci branch. Most
|
||||||
# environments would replace 'edk2-ci' with 'master'.
|
# environments would replace 'edk2-ci' with 'master'.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2019 - 2020, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
#
|
#
|
||||||
# https://github.com/tianocore
|
# https://github.com/tianocore
|
||||||
@@ -16,7 +16,6 @@ trigger: none
|
|||||||
|
|
||||||
pr:
|
pr:
|
||||||
- master
|
- master
|
||||||
- stable/*
|
|
||||||
|
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'ubuntu-latest'
|
vmImage: 'ubuntu-latest'
|
||||||
|
@@ -6,11 +6,9 @@
|
|||||||
##
|
##
|
||||||
trigger:
|
trigger:
|
||||||
- master
|
- master
|
||||||
- stable/*
|
|
||||||
|
|
||||||
pr:
|
pr:
|
||||||
- master
|
- master
|
||||||
- stable/*
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
- template: templates/pr-gate-build-job.yml
|
- template: templates/pr-gate-build-job.yml
|
||||||
|
@@ -51,12 +51,6 @@ steps:
|
|||||||
# Set default
|
# Set default
|
||||||
- bash: echo "##vso[task.setvariable variable=pkg_count]${{ 1 }}"
|
- bash: echo "##vso[task.setvariable variable=pkg_count]${{ 1 }}"
|
||||||
|
|
||||||
# Fetch the target branch so that pr_eval can diff them.
|
|
||||||
# Seems like azure pipelines/github changed checkout process in nov 2020.
|
|
||||||
- script: git fetch origin $(System.PullRequest.targetBranch)
|
|
||||||
displayName: fetch target branch
|
|
||||||
condition: eq(variables['Build.Reason'], 'PullRequest')
|
|
||||||
|
|
||||||
# trim the package list if this is a PR
|
# trim the package list if this is a PR
|
||||||
- task: CmdLine@1
|
- task: CmdLine@1
|
||||||
displayName: Check if ${{ parameters.build_pkg }} need testing
|
displayName: Check if ${{ parameters.build_pkg }} need testing
|
||||||
|
@@ -4,7 +4,6 @@
|
|||||||
# template file used to build supported packages.
|
# template file used to build supported packages.
|
||||||
#
|
#
|
||||||
# Copyright (c) Microsoft Corporation.
|
# Copyright (c) Microsoft Corporation.
|
||||||
# Copyright (c) 2020 - 2021, ARM Limited. All rights reserved.<BR>
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
##
|
##
|
||||||
|
|
||||||
@@ -17,13 +16,10 @@ parameters:
|
|||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
- job: Build_${{ parameters.tool_chain_tag }}
|
- job: Build_${{ parameters.tool_chain_tag }}
|
||||||
timeoutInMinutes: 120
|
|
||||||
#Use matrix to speed up the build process
|
#Use matrix to speed up the build process
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
TARGET_ARM_ARMPLATFORM:
|
|
||||||
Build.Pkgs: 'ArmPkg,ArmPlatformPkg'
|
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
|
||||||
TARGET_MDE_CPU:
|
TARGET_MDE_CPU:
|
||||||
Build.Pkgs: 'MdePkg,UefiCpuPkg'
|
Build.Pkgs: 'MdePkg,UefiCpuPkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||||
@@ -34,23 +30,20 @@ jobs:
|
|||||||
Build.Pkgs: 'MdeModulePkg'
|
Build.Pkgs: 'MdeModulePkg'
|
||||||
Build.Targets: 'RELEASE,NO-TARGET'
|
Build.Targets: 'RELEASE,NO-TARGET'
|
||||||
TARGET_NETWORK:
|
TARGET_NETWORK:
|
||||||
Build.Pkgs: 'NetworkPkg,RedfishPkg'
|
Build.Pkgs: 'NetworkPkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
||||||
TARGET_OTHER:
|
TARGET_OTHER:
|
||||||
Build.Pkgs: 'PcAtChipsetPkg,ShellPkg,StandaloneMmPkg'
|
Build.Pkgs: 'PcAtChipsetPkg,ShellPkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
||||||
TARGET_FMP_FAT_TEST:
|
TARGET_FMP_FAT_TEST:
|
||||||
Build.Pkgs: 'FmpDevicePkg,FatPkg,UnitTestFrameworkPkg,DynamicTablesPkg'
|
Build.Pkgs: 'FmpDevicePkg,FatPkg,UnitTestFrameworkPkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||||
TARGET_CRYPTO:
|
TARGET_CRYPTO:
|
||||||
Build.Pkgs: 'CryptoPkg'
|
Build.Pkgs: 'CryptoPkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
||||||
TARGET_SECURITY:
|
TARGET_SECURITY:
|
||||||
Build.Pkgs: 'SecurityPkg'
|
Build.Pkgs: 'SecurityPkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
||||||
TARGET_UEFIPAYLOAD:
|
|
||||||
Build.Pkgs: 'UefiPayloadPkg'
|
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
|
||||||
TARGET_PLATFORMS:
|
TARGET_PLATFORMS:
|
||||||
# For Platforms only check code. Leave it to Platform CI
|
# For Platforms only check code. Leave it to Platform CI
|
||||||
# to build them.
|
# to build them.
|
||||||
@@ -70,3 +63,23 @@ jobs:
|
|||||||
build_pkgs: $(Build.Pkgs)
|
build_pkgs: $(Build.Pkgs)
|
||||||
build_targets: $(Build.Targets)
|
build_targets: $(Build.Targets)
|
||||||
build_archs: ${{ parameters.arch_list }}
|
build_archs: ${{ parameters.arch_list }}
|
||||||
|
|
||||||
|
- job: FINISHED
|
||||||
|
dependsOn: Build_${{ parameters.tool_chain_tag }}
|
||||||
|
condition: succeeded()
|
||||||
|
steps:
|
||||||
|
- checkout: none
|
||||||
|
- script: |
|
||||||
|
echo FINISHED
|
||||||
|
sleep 10
|
||||||
|
displayName: FINISHED
|
||||||
|
|
||||||
|
- job: FAILED
|
||||||
|
dependsOn: Build_${{ parameters.tool_chain_tag }}
|
||||||
|
condition: failed()
|
||||||
|
steps:
|
||||||
|
- checkout: none
|
||||||
|
- script: |
|
||||||
|
echo FAILED
|
||||||
|
sleep 10
|
||||||
|
displayName: FAILED
|
||||||
|
@@ -31,12 +31,6 @@ steps:
|
|||||||
echo "##vso[task.setvariable variable=pkgs_to_build]${{ parameters.build_pkgs }}"
|
echo "##vso[task.setvariable variable=pkgs_to_build]${{ parameters.build_pkgs }}"
|
||||||
echo "##vso[task.setvariable variable=pkg_count]${{ 1 }}"
|
echo "##vso[task.setvariable variable=pkg_count]${{ 1 }}"
|
||||||
|
|
||||||
# Fetch the target branch so that pr_eval can diff them.
|
|
||||||
# Seems like azure pipelines/github changed checkout process in nov 2020.
|
|
||||||
- script: git fetch origin $(System.PullRequest.targetBranch)
|
|
||||||
displayName: fetch target branch
|
|
||||||
condition: eq(variables['Build.Reason'], 'PullRequest')
|
|
||||||
|
|
||||||
# trim the package list if this is a PR
|
# trim the package list if this is a PR
|
||||||
- task: CmdLine@1
|
- task: CmdLine@1
|
||||||
displayName: Check if ${{ parameters.build_pkgs }} need testing
|
displayName: Check if ${{ parameters.build_pkgs }} need testing
|
||||||
|
@@ -13,7 +13,7 @@ parameters:
|
|||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: '14.x'
|
versionSpec: '10.x'
|
||||||
#checkLatest: false # Optional
|
#checkLatest: false # Optional
|
||||||
condition: and(gt(variables.pkg_count, 0), succeeded())
|
condition: and(gt(variables.pkg_count, 0), succeeded())
|
||||||
|
|
||||||
|
5
.gitmodules
vendored
5
.gitmodules
vendored
@@ -6,7 +6,7 @@
|
|||||||
url = https://github.com/ucb-bar/berkeley-softfloat-3.git
|
url = https://github.com/ucb-bar/berkeley-softfloat-3.git
|
||||||
[submodule "UnitTestFrameworkPkg/Library/CmockaLib/cmocka"]
|
[submodule "UnitTestFrameworkPkg/Library/CmockaLib/cmocka"]
|
||||||
path = UnitTestFrameworkPkg/Library/CmockaLib/cmocka
|
path = UnitTestFrameworkPkg/Library/CmockaLib/cmocka
|
||||||
url = https://github.com/tianocore/edk2-cmocka.git
|
url = https://git.cryptomilk.org/projects/cmocka.git
|
||||||
[submodule "MdeModulePkg/Universal/RegularExpressionDxe/oniguruma"]
|
[submodule "MdeModulePkg/Universal/RegularExpressionDxe/oniguruma"]
|
||||||
path = MdeModulePkg/Universal/RegularExpressionDxe/oniguruma
|
path = MdeModulePkg/Universal/RegularExpressionDxe/oniguruma
|
||||||
url = https://github.com/kkos/oniguruma
|
url = https://github.com/kkos/oniguruma
|
||||||
@@ -17,6 +17,3 @@
|
|||||||
path = BaseTools/Source/C/BrotliCompress/brotli
|
path = BaseTools/Source/C/BrotliCompress/brotli
|
||||||
url = https://github.com/google/brotli
|
url = https://github.com/google/brotli
|
||||||
ignore = untracked
|
ignore = untracked
|
||||||
[submodule "RedfishPkg/Library/JsonLib/jansson"]
|
|
||||||
path = RedfishPkg/Library/JsonLib/jansson
|
|
||||||
url = https://github.com/akheron/jansson
|
|
||||||
|
8
.mailmap
8
.mailmap
@@ -38,7 +38,6 @@ Jim Dailey <Jim.Dailey@Dell.com>
|
|||||||
Jim Dailey <Jim.Dailey@Dell.com> <Jim_Dailey@Dell.com>
|
Jim Dailey <Jim.Dailey@Dell.com> <Jim_Dailey@Dell.com>
|
||||||
Laszlo Ersek <lersek@redhat.com> <lersek@6f19259b-4bc3-4df7-8a09-765794883524>
|
Laszlo Ersek <lersek@redhat.com> <lersek@6f19259b-4bc3-4df7-8a09-765794883524>
|
||||||
Laszlo Ersek <lersek@redhat.com> <lersek@Edk2>
|
Laszlo Ersek <lersek@redhat.com> <lersek@Edk2>
|
||||||
Liming Gao <gaoliming@byosoft.com.cn>
|
|
||||||
Liming Gao <liming.gao@intel.com> <Gao, Liming liming.gao@intel.com>
|
Liming Gao <liming.gao@intel.com> <Gao, Liming liming.gao@intel.com>
|
||||||
Liming Gao <liming.gao@intel.com> <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
|
Liming Gao <liming.gao@intel.com> <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
|
||||||
Liming Gao <liming.gao@intel.com> <lgao4@Edk2>
|
Liming Gao <liming.gao@intel.com> <lgao4@Edk2>
|
||||||
@@ -48,7 +47,6 @@ Marc-André Lureau <marcandre.lureau@redhat.com> <marcandre.lureau@redhat.com>
|
|||||||
Marvin Häuser <Marvin.Haeuser@outlook.com>
|
Marvin Häuser <Marvin.Haeuser@outlook.com>
|
||||||
Marvin Häuser <Marvin.Haeuser@outlook.com> edk2-devel <edk2-devel-bounces@lists.01.org>
|
Marvin Häuser <Marvin.Haeuser@outlook.com> edk2-devel <edk2-devel-bounces@lists.01.org>
|
||||||
Marvin Häuser <mhaeuser@outlook.de>
|
Marvin Häuser <mhaeuser@outlook.de>
|
||||||
Matt DeVillier <matt.devillier@gmail.com>
|
|
||||||
Maurice Ma <maurice.ma@intel.com>
|
Maurice Ma <maurice.ma@intel.com>
|
||||||
Michael Kubacki <michael.a.kubacki@intel.com>
|
Michael Kubacki <michael.a.kubacki@intel.com>
|
||||||
Michael Kubacki <michael.a.kubacki@intel.com> </o=Intel/ou=External (FYDIBOHF25SPDLT)/cn=Recipients/cn=3c8b0226e75f4ab08d20c151cb7a8a72>
|
Michael Kubacki <michael.a.kubacki@intel.com> </o=Intel/ou=External (FYDIBOHF25SPDLT)/cn=Recipients/cn=3c8b0226e75f4ab08d20c151cb7a8a72>
|
||||||
@@ -62,20 +60,14 @@ Ray Ni <ray.ni@intel.com> <niruiyu@Edk2>
|
|||||||
Ray Ni <ray.ni@intel.com> <ruiyu.ni@intel.com>
|
Ray Ni <ray.ni@intel.com> <ruiyu.ni@intel.com>
|
||||||
Ray Ni <ray.ni@intel.com> <Ruiyu.ni@Intel.com>
|
Ray Ni <ray.ni@intel.com> <Ruiyu.ni@Intel.com>
|
||||||
Ray Ni <ray.ni@intel.com> <ruyu.ni@intel.com>
|
Ray Ni <ray.ni@intel.com> <ruyu.ni@intel.com>
|
||||||
Rebecca Cran <rebecca@bluestop.org>
|
|
||||||
Rebecca Cran <rebecca@bsdio.com>
|
|
||||||
Samer El-Haj-Mahmoud <samer@elhajmahmoud.com> <elhaj@hpe.com>
|
Samer El-Haj-Mahmoud <samer@elhajmahmoud.com> <elhaj@hpe.com>
|
||||||
Samer El-Haj-Mahmoud <samer@elhajmahmoud.com> <Samer El-Haj-Mahmoud elhaj@hp.com>
|
Samer El-Haj-Mahmoud <samer@elhajmahmoud.com> <Samer El-Haj-Mahmoud elhaj@hp.com>
|
||||||
Shenglei Zhang <shenglei.zhang@intel.com>
|
Shenglei Zhang <shenglei.zhang@intel.com>
|
||||||
Star Zeng <star.zeng@intel.com>
|
Star Zeng <star.zeng@intel.com>
|
||||||
Star Zeng <star.zeng@intel.com> <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
|
Star Zeng <star.zeng@intel.com> <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
|
||||||
Star Zeng <star.zeng@intel.com> <lzeng14@Edk2>
|
Star Zeng <star.zeng@intel.com> <lzeng14@Edk2>
|
||||||
Tom Lendacky <thomas.lendacky@amd.com>
|
|
||||||
Vitaly Cheptsov <vit9696@protonmail.com> Vitaly Cheptsov via Groups.Io <vit9696=protonmail.com@groups.io>
|
Vitaly Cheptsov <vit9696@protonmail.com> Vitaly Cheptsov via Groups.Io <vit9696=protonmail.com@groups.io>
|
||||||
Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com> Vladimir Olovyannikov via edk2-devel <edk2-devel@lists.01.org>
|
Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com> Vladimir Olovyannikov via edk2-devel <edk2-devel@lists.01.org>
|
||||||
Wei6 Xu <wei6.xu@intel.com>
|
|
||||||
Yonghong Zhu <yonghong.zhu@intel.com>
|
Yonghong Zhu <yonghong.zhu@intel.com>
|
||||||
Yonghong Zhu <yonghong.zhu@intel.com> <yzhu52@Edk2>
|
Yonghong Zhu <yonghong.zhu@intel.com> <yzhu52@Edk2>
|
||||||
Yu-Chen Lin <yuchenlin@synology.com>
|
Yu-Chen Lin <yuchenlin@synology.com>
|
||||||
Zhichao Gao <zhichao.gao@intel.com>
|
|
||||||
Zhiguang Liu <zhiguang.liu@intel.com>
|
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
# * This file must be checked into the 'default' branch of a repo. Copies
|
# * This file must be checked into the 'default' branch of a repo. Copies
|
||||||
# of this file on other branches of a repo are ignored by Mergify.
|
# of this file on other branches of a repo are ignored by Mergify.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
#
|
#
|
||||||
# https://github.com/apps/mergify
|
# https://github.com/apps/mergify
|
||||||
@@ -24,27 +24,74 @@
|
|||||||
#
|
#
|
||||||
##
|
##
|
||||||
|
|
||||||
queue_rules:
|
|
||||||
- name: default
|
|
||||||
conditions:
|
|
||||||
- base~=(^main|^master|^stable/)
|
|
||||||
- label=push
|
|
||||||
|
|
||||||
pull_request_rules:
|
pull_request_rules:
|
||||||
|
|
||||||
- name: Automatically merge a PR when all required checks pass and 'push' label is present
|
- name: Automatically merge a PR when all required checks pass and 'push' label is present
|
||||||
conditions:
|
conditions:
|
||||||
- base~=(^main|^master|^stable/)
|
- base=master
|
||||||
- label=push
|
- label=push
|
||||||
|
- author=@tianocore/edk-ii-maintainers
|
||||||
|
- status-success=tianocore.PatchCheck
|
||||||
|
- status-success=Ubuntu GCC5 PR
|
||||||
|
- status-success=Windows VS2019 PR
|
||||||
actions:
|
actions:
|
||||||
queue:
|
merge:
|
||||||
|
strict: true
|
||||||
method: rebase
|
method: rebase
|
||||||
rebase_fallback: none
|
|
||||||
name: default
|
- name: Automatically close a PR when all required checks pass and 'push' label is not present
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- -label=push
|
||||||
|
- -closed
|
||||||
|
- status-success=tianocore.PatchCheck
|
||||||
|
- status-success=Ubuntu GCC5 PR
|
||||||
|
- status-success=Windows VS2019 PR
|
||||||
|
- status-success=Ubuntu GCC5 PR (FINISHED)
|
||||||
|
- status-success=Windows VS2019 PR (FINISHED)
|
||||||
|
actions:
|
||||||
|
close:
|
||||||
|
message: All checks passed. Auto close personal build.
|
||||||
|
|
||||||
- name: Post a comment on a PR that can not be merged due to a merge conflict
|
- name: Post a comment on a PR that can not be merged due to a merge conflict
|
||||||
conditions:
|
conditions:
|
||||||
- base~=(^main|^master|^stable/)
|
- base=master
|
||||||
- conflict
|
- conflict
|
||||||
actions:
|
actions:
|
||||||
comment:
|
comment:
|
||||||
message: PR can not be merged due to conflict. Please rebase and resubmit
|
message: PR can not be merged due to conflict. Please rebase and resubmit
|
||||||
|
|
||||||
|
- name: Automatically close a PR that fails the EDK II Maintainers membership check and 'push' label is present
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- label=push
|
||||||
|
- -author=@tianocore/edk-ii-maintainers
|
||||||
|
actions:
|
||||||
|
close:
|
||||||
|
message: PR submitter is not a member of the Tianocore EDK II Maintainers team
|
||||||
|
|
||||||
|
- name: Post a comment on a PR if PatchCheck fails
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- status-failure=tianocore.PatchCheck
|
||||||
|
actions:
|
||||||
|
comment:
|
||||||
|
message: PR can not be merged due to a PatchCheck failure. Please resolve and resubmit
|
||||||
|
|
||||||
|
- name: Post a comment on a PR if Ubuntu GCC5 fails
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- status-failure=Ubuntu GCC5 PR
|
||||||
|
- status-success=Ubuntu GCC5 PR (FAILED)
|
||||||
|
actions:
|
||||||
|
comment:
|
||||||
|
message: PR can not be merged due to an Ubuntu GCC5 failure. Please resolve and resubmit
|
||||||
|
|
||||||
|
- name: Post a comment on a PR if Windows VS2019 fails
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- status-failure=Windows VS2019 PR
|
||||||
|
- status-success=Windows VS2019 PR (FAILED)
|
||||||
|
actions:
|
||||||
|
comment:
|
||||||
|
message: PR can not be merged due to a Windows VS2019 failure. Please resolve and resubmit
|
||||||
|
@@ -2,7 +2,6 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) Microsoft Corporation.
|
# Copyright (c) Microsoft Corporation.
|
||||||
# Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
|
# Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
|
||||||
# Copyright (c) 2020 - 2021, ARM Limited. All rights reserved.<BR>
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
##
|
##
|
||||||
import os
|
import os
|
||||||
@@ -22,24 +21,16 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
|
|||||||
self.ActualTargets = []
|
self.ActualTargets = []
|
||||||
self.ActualArchitectures = []
|
self.ActualArchitectures = []
|
||||||
self.ActualToolChainTag = ""
|
self.ActualToolChainTag = ""
|
||||||
self.UseBuiltInBaseTools = None
|
|
||||||
self.ActualScopes = None
|
|
||||||
|
|
||||||
# ####################################################################################### #
|
# ####################################################################################### #
|
||||||
# Extra CmdLine configuration #
|
# Extra CmdLine configuration #
|
||||||
# ####################################################################################### #
|
# ####################################################################################### #
|
||||||
|
|
||||||
def AddCommandLineOptions(self, parserObj):
|
def AddCommandLineOptions(self, parserObj):
|
||||||
group = parserObj.add_mutually_exclusive_group()
|
pass
|
||||||
group.add_argument("-force_piptools", "--fpt", dest="force_piptools", action="store_true", default=False, help="Force the system to use pip tools")
|
|
||||||
group.add_argument("-no_piptools", "--npt", dest="no_piptools", action="store_true", default=False, help="Force the system to not use pip tools")
|
|
||||||
|
|
||||||
def RetrieveCommandLineOptions(self, args):
|
def RetrieveCommandLineOptions(self, args):
|
||||||
super().RetrieveCommandLineOptions(args)
|
pass
|
||||||
if args.force_piptools:
|
|
||||||
self.UseBuiltInBaseTools = True
|
|
||||||
if args.no_piptools:
|
|
||||||
self.UseBuiltInBaseTools = False
|
|
||||||
|
|
||||||
# ####################################################################################### #
|
# ####################################################################################### #
|
||||||
# Default Support for this Ci Build #
|
# Default Support for this Ci Build #
|
||||||
@@ -49,10 +40,7 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
|
|||||||
''' return iterable of edk2 packages supported by this build.
|
''' return iterable of edk2 packages supported by this build.
|
||||||
These should be edk2 workspace relative paths '''
|
These should be edk2 workspace relative paths '''
|
||||||
|
|
||||||
return ("ArmPkg",
|
return ("ArmVirtPkg",
|
||||||
"ArmPlatformPkg",
|
|
||||||
"ArmVirtPkg",
|
|
||||||
"DynamicTablesPkg",
|
|
||||||
"EmulatorPkg",
|
"EmulatorPkg",
|
||||||
"MdePkg",
|
"MdePkg",
|
||||||
"MdeModulePkg",
|
"MdeModulePkg",
|
||||||
@@ -62,13 +50,10 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
|
|||||||
"UefiCpuPkg",
|
"UefiCpuPkg",
|
||||||
"FmpDevicePkg",
|
"FmpDevicePkg",
|
||||||
"ShellPkg",
|
"ShellPkg",
|
||||||
"StandaloneMmPkg",
|
|
||||||
"FatPkg",
|
"FatPkg",
|
||||||
"CryptoPkg",
|
"CryptoPkg",
|
||||||
"UnitTestFrameworkPkg",
|
"UnitTestFrameworkPkg",
|
||||||
"OvmfPkg",
|
"OvmfPkg"
|
||||||
"RedfishPkg",
|
|
||||||
"UefiPayloadPkg"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def GetArchitecturesSupported(self):
|
def GetArchitecturesSupported(self):
|
||||||
@@ -139,38 +124,19 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
|
|||||||
|
|
||||||
def GetActiveScopes(self):
|
def GetActiveScopes(self):
|
||||||
''' return tuple containing scopes that should be active for this process '''
|
''' return tuple containing scopes that should be active for this process '''
|
||||||
if self.ActualScopes is None:
|
|
||||||
scopes = ("cibuild", "edk2-build", "host-based-test")
|
scopes = ("cibuild", "edk2-build", "host-based-test")
|
||||||
|
|
||||||
self.ActualToolChainTag = shell_environment.GetBuildVars().GetValue("TOOL_CHAIN_TAG", "")
|
self.ActualToolChainTag = shell_environment.GetBuildVars().GetValue("TOOL_CHAIN_TAG", "")
|
||||||
|
|
||||||
is_linux = GetHostInfo().os.upper() == "LINUX"
|
if GetHostInfo().os.upper() == "LINUX" and self.ActualToolChainTag.upper().startswith("GCC"):
|
||||||
|
|
||||||
if self.UseBuiltInBaseTools is None:
|
|
||||||
is_linux = GetHostInfo().os.upper() == "LINUX"
|
|
||||||
# try and import the pip module for basetools
|
|
||||||
try:
|
|
||||||
import edk2basetools
|
|
||||||
self.UseBuiltInBaseTools = True
|
|
||||||
except ImportError:
|
|
||||||
self.UseBuiltInBaseTools = False
|
|
||||||
pass
|
|
||||||
|
|
||||||
if self.UseBuiltInBaseTools == True:
|
|
||||||
scopes += ('pipbuild-unix',) if is_linux else ('pipbuild-win',)
|
|
||||||
logging.warning("Using Pip Tools based BaseTools")
|
|
||||||
else:
|
|
||||||
logging.warning("Falling back to using in-tree BaseTools")
|
|
||||||
|
|
||||||
if is_linux and self.ActualToolChainTag.upper().startswith("GCC"):
|
|
||||||
if "AARCH64" in self.ActualArchitectures:
|
if "AARCH64" in self.ActualArchitectures:
|
||||||
scopes += ("gcc_aarch64_linux",)
|
scopes += ("gcc_aarch64_linux",)
|
||||||
if "ARM" in self.ActualArchitectures:
|
if "ARM" in self.ActualArchitectures:
|
||||||
scopes += ("gcc_arm_linux",)
|
scopes += ("gcc_arm_linux",)
|
||||||
if "RISCV64" in self.ActualArchitectures:
|
if "RISCV64" in self.ActualArchitectures:
|
||||||
scopes += ("gcc_riscv64_unknown",)
|
scopes += ("gcc_riscv64_unknown",)
|
||||||
self.ActualScopes = scopes
|
|
||||||
return self.ActualScopes
|
return scopes
|
||||||
|
|
||||||
def GetRequiredSubmodules(self):
|
def GetRequiredSubmodules(self):
|
||||||
''' return iterable containing RequiredSubmodule objects.
|
''' return iterable containing RequiredSubmodule objects.
|
||||||
@@ -189,8 +155,6 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
|
|||||||
"MdeModulePkg/Library/BrotliCustomDecompressLib/brotli", False))
|
"MdeModulePkg/Library/BrotliCustomDecompressLib/brotli", False))
|
||||||
rs.append(RequiredSubmodule(
|
rs.append(RequiredSubmodule(
|
||||||
"BaseTools/Source/C/BrotliCompress/brotli", False))
|
"BaseTools/Source/C/BrotliCompress/brotli", False))
|
||||||
rs.append(RequiredSubmodule(
|
|
||||||
"RedfishPkg/Library/JsonLib/jansson", False))
|
|
||||||
return rs
|
return rs
|
||||||
|
|
||||||
def GetName(self):
|
def GetName(self):
|
||||||
|
@@ -1,407 +0,0 @@
|
|||||||
# @file EccCheck.py
|
|
||||||
#
|
|
||||||
# Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
|
|
||||||
# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
##
|
|
||||||
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
import re
|
|
||||||
import csv
|
|
||||||
import xml.dom.minidom
|
|
||||||
from typing import List, Dict, Tuple
|
|
||||||
import logging
|
|
||||||
from io import StringIO
|
|
||||||
from edk2toolext.environment import shell_environment
|
|
||||||
from edk2toolext.environment.plugintypes.ci_build_plugin import ICiBuildPlugin
|
|
||||||
from edk2toolext.environment.var_dict import VarDict
|
|
||||||
from edk2toollib.utility_functions import RunCmd
|
|
||||||
|
|
||||||
|
|
||||||
class EccCheck(ICiBuildPlugin):
|
|
||||||
"""
|
|
||||||
A CiBuildPlugin that finds the Ecc issues of newly added code in pull request.
|
|
||||||
|
|
||||||
Configuration options:
|
|
||||||
"EccCheck": {
|
|
||||||
"ExceptionList": [],
|
|
||||||
"IgnoreFiles": []
|
|
||||||
},
|
|
||||||
"""
|
|
||||||
|
|
||||||
FindModifyFile = re.compile(r'\+\+\+ b\/(.*)')
|
|
||||||
LineScopePattern = (r'@@ -\d*\,*\d* \+\d*\,*\d* @@.*')
|
|
||||||
LineNumRange = re.compile(r'@@ -\d*\,*\d* \+(\d*)\,*(\d*) @@.*')
|
|
||||||
|
|
||||||
def GetTestName(self, packagename: str, environment: VarDict) -> tuple:
|
|
||||||
""" Provide the testcase name and classname for use in reporting
|
|
||||||
testclassname: a descriptive string for the testcase can include whitespace
|
|
||||||
classname: should be patterned <packagename>.<plugin>.<optionally any unique condition>
|
|
||||||
|
|
||||||
Args:
|
|
||||||
packagename: string containing name of package to build
|
|
||||||
environment: The VarDict for the test to run in
|
|
||||||
Returns:
|
|
||||||
a tuple containing the testcase name and the classname
|
|
||||||
(testcasename, classname)
|
|
||||||
"""
|
|
||||||
return ("Check for efi coding style for " + packagename, packagename + ".EccCheck")
|
|
||||||
|
|
||||||
##
|
|
||||||
# External function of plugin. This function is used to perform the task of the ci_build_plugin Plugin
|
|
||||||
#
|
|
||||||
# - package is the edk2 path to package. This means workspace/packagepath relative.
|
|
||||||
# - edk2path object configured with workspace and packages path
|
|
||||||
# - PkgConfig Object (dict) for the pkg
|
|
||||||
# - EnvConfig Object
|
|
||||||
# - Plugin Manager Instance
|
|
||||||
# - Plugin Helper Obj Instance
|
|
||||||
# - Junit Logger
|
|
||||||
# - output_stream the StringIO output stream from this plugin via logging
|
|
||||||
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
|
|
||||||
workspace_path = Edk2pathObj.WorkspacePath
|
|
||||||
basetools_path = environment.GetValue("EDK_TOOLS_PATH")
|
|
||||||
python_path = os.path.join(basetools_path, "Source", "Python")
|
|
||||||
env = shell_environment.GetEnvironment()
|
|
||||||
env.set_shell_var('PYTHONPATH', python_path)
|
|
||||||
env.set_shell_var('WORKSPACE', workspace_path)
|
|
||||||
env.set_shell_var('PACKAGES_PATH', os.pathsep.join(Edk2pathObj.PackagePathList))
|
|
||||||
self.ECC_PASS = True
|
|
||||||
|
|
||||||
# Create temp directory
|
|
||||||
temp_path = os.path.join(workspace_path, 'Build', '.pytool', 'Plugin', 'EccCheck')
|
|
||||||
try:
|
|
||||||
# Delete temp directory
|
|
||||||
if os.path.exists(temp_path):
|
|
||||||
shutil.rmtree(temp_path)
|
|
||||||
# Copy package being scanned to temp_path
|
|
||||||
shutil.copytree (
|
|
||||||
os.path.join(workspace_path, packagename),
|
|
||||||
os.path.join(temp_path, packagename),
|
|
||||||
symlinks=True
|
|
||||||
)
|
|
||||||
# Copy exception.xml to temp_path
|
|
||||||
shutil.copyfile (
|
|
||||||
os.path.join(basetools_path, "Source", "Python", "Ecc", "exception.xml"),
|
|
||||||
os.path.join(temp_path, "exception.xml")
|
|
||||||
)
|
|
||||||
# Output file to use for git diff operations
|
|
||||||
temp_diff_output = os.path.join (temp_path, 'diff.txt')
|
|
||||||
|
|
||||||
self.ApplyConfig(pkgconfig, temp_path, packagename)
|
|
||||||
modify_dir_list = self.GetModifyDir(packagename, temp_diff_output)
|
|
||||||
patch = self.GetDiff(packagename, temp_diff_output)
|
|
||||||
ecc_diff_range = self.GetDiffRange(patch, packagename, temp_path)
|
|
||||||
#
|
|
||||||
# Use temp_path as working directory when running ECC tool
|
|
||||||
#
|
|
||||||
self.GenerateEccReport(modify_dir_list, ecc_diff_range, temp_path, basetools_path)
|
|
||||||
ecc_log = os.path.join(temp_path, "Ecc.log")
|
|
||||||
if self.ECC_PASS:
|
|
||||||
# Delete temp directory
|
|
||||||
if os.path.exists(temp_path):
|
|
||||||
shutil.rmtree(temp_path)
|
|
||||||
tc.SetSuccess()
|
|
||||||
return 0
|
|
||||||
else:
|
|
||||||
with open(ecc_log, encoding='utf8') as output:
|
|
||||||
ecc_output = output.readlines()
|
|
||||||
for line in ecc_output:
|
|
||||||
logging.error(line.strip())
|
|
||||||
# Delete temp directory
|
|
||||||
if os.path.exists(temp_path):
|
|
||||||
shutil.rmtree(temp_path)
|
|
||||||
tc.SetFailed("EccCheck failed for {0}".format(packagename), "CHECK FAILED")
|
|
||||||
return 1
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
# If EccCheck is interrupted by keybard interrupt, then return failure
|
|
||||||
# Delete temp directory
|
|
||||||
if os.path.exists(temp_path):
|
|
||||||
shutil.rmtree(temp_path)
|
|
||||||
tc.SetFailed("EccCheck interrupted for {0}".format(packagename), "CHECK FAILED")
|
|
||||||
return 1
|
|
||||||
else:
|
|
||||||
# If EccCheck fails for any other exception type, raise the exception
|
|
||||||
# Delete temp directory
|
|
||||||
if os.path.exists(temp_path):
|
|
||||||
shutil.rmtree(temp_path)
|
|
||||||
tc.SetFailed("EccCheck exception for {0}".format(packagename), "CHECK FAILED")
|
|
||||||
raise
|
|
||||||
return 1
|
|
||||||
|
|
||||||
def GetDiff(self, pkg: str, temp_diff_output: str) -> List[str]:
|
|
||||||
patch = []
|
|
||||||
#
|
|
||||||
# Generate unified diff between origin/master and HEAD.
|
|
||||||
#
|
|
||||||
params = "diff --output={} --unified=0 origin/master HEAD".format(temp_diff_output)
|
|
||||||
RunCmd("git", params)
|
|
||||||
with open(temp_diff_output) as file:
|
|
||||||
patch = file.read().strip().split('\n')
|
|
||||||
return patch
|
|
||||||
|
|
||||||
def GetModifyDir(self, pkg: str, temp_diff_output: str) -> List[str]:
|
|
||||||
#
|
|
||||||
# Generate diff between origin/master and HEAD using --diff-filter to
|
|
||||||
# exclude deleted and renamed files that do not need to be scanned by
|
|
||||||
# ECC. Also use --name-status to only generate the names of the files
|
|
||||||
# with differences. The output format of this git diff command is a
|
|
||||||
# list of files with the change status and the filename. The filename
|
|
||||||
# is always at the end of the line. Examples:
|
|
||||||
#
|
|
||||||
# M MdeModulePkg/Application/CapsuleApp/CapsuleApp.h
|
|
||||||
# M MdeModulePkg/Application/UiApp/FrontPage.h
|
|
||||||
#
|
|
||||||
params = "diff --output={} --diff-filter=dr --name-status origin/master HEAD".format(temp_diff_output)
|
|
||||||
RunCmd("git", params)
|
|
||||||
dir_list = []
|
|
||||||
with open(temp_diff_output) as file:
|
|
||||||
dir_list = file.read().strip().split('\n')
|
|
||||||
|
|
||||||
modify_dir_list = []
|
|
||||||
for modify_dir in dir_list:
|
|
||||||
#
|
|
||||||
# Parse file name from the end of the line
|
|
||||||
#
|
|
||||||
file_path = modify_dir.strip().split()
|
|
||||||
#
|
|
||||||
# Skip lines that do not have at least 2 elements (status and file name)
|
|
||||||
#
|
|
||||||
if len(file_path) < 2:
|
|
||||||
continue
|
|
||||||
#
|
|
||||||
# Parse the directory name from the file name
|
|
||||||
#
|
|
||||||
file_dir = os.path.dirname(file_path[-1])
|
|
||||||
#
|
|
||||||
# Skip directory names that do not start with the package being scanned.
|
|
||||||
#
|
|
||||||
if file_dir.split('/')[0] != pkg:
|
|
||||||
continue
|
|
||||||
#
|
|
||||||
# Skip directory names that are identical to the package being scanned.
|
|
||||||
# The assumption here is that there are no source files at the package
|
|
||||||
# root. Instead, the only expected files in the package root are
|
|
||||||
# EDK II meta data files (DEC, DSC, FDF).
|
|
||||||
#
|
|
||||||
if file_dir == pkg:
|
|
||||||
continue
|
|
||||||
#
|
|
||||||
# Skip directory names that are already in the modified dir list
|
|
||||||
#
|
|
||||||
if file_dir in modify_dir_list:
|
|
||||||
continue
|
|
||||||
#
|
|
||||||
# Add the candidate directory to scan to the modified dir list
|
|
||||||
#
|
|
||||||
modify_dir_list.append(file_dir)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Remove duplicates from modify_dir_list
|
|
||||||
# Given a folder path, ECC performs a recursive scan of that folder.
|
|
||||||
# If a parent and child folder are both present in modify_dir_list,
|
|
||||||
# then ECC will perform redudanct scans of source files. In order
|
|
||||||
# to prevent redundant scans, if a parent and child folder are both
|
|
||||||
# present, then remove all the child folders.
|
|
||||||
#
|
|
||||||
# For example, if modified_dir_list contains the following elements:
|
|
||||||
# MdeModulePkg/Core/Dxe
|
|
||||||
# MdeModulePkg/Core/Dxe/Hand
|
|
||||||
# MdeModulePkg/Core/Dxe/Mem
|
|
||||||
#
|
|
||||||
# Then MdeModulePkg/Core/Dxe/Hand and MdeModulePkg/Core/Dxe/Mem should
|
|
||||||
# be removed because the files in those folders are covered by a scan
|
|
||||||
# of MdeModulePkg/Core/Dxe.
|
|
||||||
#
|
|
||||||
filtered_list = []
|
|
||||||
for dir1 in modify_dir_list:
|
|
||||||
Append = True
|
|
||||||
for dir2 in modify_dir_list:
|
|
||||||
if dir1 == dir2:
|
|
||||||
continue
|
|
||||||
common = os.path.commonpath([dir1, dir2])
|
|
||||||
if os.path.normpath(common) == os.path.normpath(dir2):
|
|
||||||
Append = False
|
|
||||||
break
|
|
||||||
if Append and dir1 not in filtered_list:
|
|
||||||
filtered_list.append(dir1)
|
|
||||||
return filtered_list
|
|
||||||
|
|
||||||
def GetDiffRange(self, patch_diff: List[str], pkg: str, temp_path: str) -> Dict[str, List[Tuple[int, int]]]:
|
|
||||||
IsDelete = True
|
|
||||||
StartCheck = False
|
|
||||||
range_directory: Dict[str, List[Tuple[int, int]]] = {}
|
|
||||||
for line in patch_diff:
|
|
||||||
modify_file = self.FindModifyFile.findall(line)
|
|
||||||
if modify_file and pkg in modify_file[0] and not StartCheck and os.path.isfile(modify_file[0]):
|
|
||||||
modify_file_comment_dic = self.GetCommentRange(modify_file[0], temp_path)
|
|
||||||
IsDelete = False
|
|
||||||
StartCheck = True
|
|
||||||
modify_file_dic = modify_file[0]
|
|
||||||
modify_file_dic = modify_file_dic.replace("/", os.sep)
|
|
||||||
range_directory[modify_file_dic] = []
|
|
||||||
elif line.startswith('--- '):
|
|
||||||
StartCheck = False
|
|
||||||
elif re.match(self.LineScopePattern, line, re.I) and not IsDelete and StartCheck:
|
|
||||||
start_line = self.LineNumRange.search(line).group(1)
|
|
||||||
line_range = self.LineNumRange.search(line).group(2)
|
|
||||||
if not line_range:
|
|
||||||
line_range = '1'
|
|
||||||
range_directory[modify_file_dic].append((int(start_line), int(start_line) + int(line_range) - 1))
|
|
||||||
for i in modify_file_comment_dic:
|
|
||||||
if int(i[0]) <= int(start_line) <= int(i[1]):
|
|
||||||
range_directory[modify_file_dic].append(i)
|
|
||||||
return range_directory
|
|
||||||
|
|
||||||
def GetCommentRange(self, modify_file: str, temp_path: str) -> List[Tuple[int, int]]:
|
|
||||||
comment_range: List[Tuple[int, int]] = []
|
|
||||||
modify_file_path = os.path.join(temp_path, modify_file)
|
|
||||||
if not os.path.exists (modify_file_path):
|
|
||||||
return comment_range
|
|
||||||
with open(modify_file_path) as f:
|
|
||||||
line_no = 1
|
|
||||||
Start = False
|
|
||||||
for line in f:
|
|
||||||
if line.startswith('/**'):
|
|
||||||
start_no = line_no
|
|
||||||
Start = True
|
|
||||||
if line.startswith('**/') and Start:
|
|
||||||
end_no = line_no
|
|
||||||
Start = False
|
|
||||||
comment_range.append((int(start_no), int(end_no)))
|
|
||||||
line_no += 1
|
|
||||||
|
|
||||||
if comment_range and comment_range[0][0] == 1:
|
|
||||||
del comment_range[0]
|
|
||||||
return comment_range
|
|
||||||
|
|
||||||
def GenerateEccReport(self, modify_dir_list: List[str], ecc_diff_range: Dict[str, List[Tuple[int, int]]],
|
|
||||||
temp_path: str, basetools_path: str) -> None:
|
|
||||||
ecc_need = False
|
|
||||||
ecc_run = True
|
|
||||||
config = os.path.normpath(os.path.join(basetools_path, "Source", "Python", "Ecc", "config.ini"))
|
|
||||||
exception = os.path.normpath(os.path.join(temp_path, "exception.xml"))
|
|
||||||
report = os.path.normpath(os.path.join(temp_path, "Ecc.csv"))
|
|
||||||
for modify_dir in modify_dir_list:
|
|
||||||
target = os.path.normpath(os.path.join(temp_path, modify_dir))
|
|
||||||
logging.info('Run ECC tool for the commit in %s' % modify_dir)
|
|
||||||
ecc_need = True
|
|
||||||
ecc_params = "-c {0} -e {1} -t {2} -r {3}".format(config, exception, target, report)
|
|
||||||
return_code = RunCmd("Ecc", ecc_params, workingdir=temp_path)
|
|
||||||
if return_code != 0:
|
|
||||||
ecc_run = False
|
|
||||||
break
|
|
||||||
if not ecc_run:
|
|
||||||
logging.error('Fail to run ECC tool')
|
|
||||||
self.ParseEccReport(ecc_diff_range, temp_path)
|
|
||||||
|
|
||||||
if not ecc_need:
|
|
||||||
logging.info("Doesn't need run ECC check")
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
def ParseEccReport(self, ecc_diff_range: Dict[str, List[Tuple[int, int]]], temp_path: str) -> None:
|
|
||||||
ecc_log = os.path.join(temp_path, "Ecc.log")
|
|
||||||
ecc_csv = os.path.join(temp_path, "Ecc.csv")
|
|
||||||
row_lines = []
|
|
||||||
ignore_error_code = self.GetIgnoreErrorCode()
|
|
||||||
if os.path.exists(ecc_csv):
|
|
||||||
with open(ecc_csv) as csv_file:
|
|
||||||
reader = csv.reader(csv_file)
|
|
||||||
for row in reader:
|
|
||||||
for modify_file in ecc_diff_range:
|
|
||||||
if modify_file in row[3]:
|
|
||||||
for i in ecc_diff_range[modify_file]:
|
|
||||||
line_no = int(row[4])
|
|
||||||
if i[0] <= line_no <= i[1] and row[1] not in ignore_error_code:
|
|
||||||
row[0] = '\nEFI coding style error'
|
|
||||||
row[1] = 'Error code: ' + row[1]
|
|
||||||
row[3] = 'file: ' + row[3]
|
|
||||||
row[4] = 'Line number: ' + row[4]
|
|
||||||
row_line = '\n *'.join(row)
|
|
||||||
row_lines.append(row_line)
|
|
||||||
break
|
|
||||||
break
|
|
||||||
if row_lines:
|
|
||||||
self.ECC_PASS = False
|
|
||||||
|
|
||||||
with open(ecc_log, 'a') as log:
|
|
||||||
all_line = '\n'.join(row_lines)
|
|
||||||
all_line = all_line + '\n'
|
|
||||||
log.writelines(all_line)
|
|
||||||
return
|
|
||||||
|
|
||||||
def ApplyConfig(self, pkgconfig: Dict[str, List[str]], temp_path: str, pkg: str) -> None:
|
|
||||||
if "IgnoreFiles" in pkgconfig:
|
|
||||||
for a in pkgconfig["IgnoreFiles"]:
|
|
||||||
a = os.path.join(temp_path, pkg, a)
|
|
||||||
a = a.replace(os.sep, "/")
|
|
||||||
|
|
||||||
logging.info("Ignoring Files {0}".format(a))
|
|
||||||
if os.path.exists(a):
|
|
||||||
if os.path.isfile(a):
|
|
||||||
os.remove(a)
|
|
||||||
elif os.path.isdir(a):
|
|
||||||
shutil.rmtree(a)
|
|
||||||
else:
|
|
||||||
logging.error("EccCheck.IgnoreInf -> {0} not found in filesystem. Invalid ignore files".format(a))
|
|
||||||
|
|
||||||
if "ExceptionList" in pkgconfig:
|
|
||||||
exception_list = pkgconfig["ExceptionList"]
|
|
||||||
exception_xml = os.path.join(temp_path, "exception.xml")
|
|
||||||
try:
|
|
||||||
logging.info("Appending exceptions")
|
|
||||||
self.AppendException(exception_list, exception_xml)
|
|
||||||
except Exception as e:
|
|
||||||
logging.error("Fail to apply exceptions")
|
|
||||||
raise e
|
|
||||||
return
|
|
||||||
|
|
||||||
def AppendException(self, exception_list: List[str], exception_xml: str) -> None:
|
|
||||||
error_code_list = exception_list[::2]
|
|
||||||
keyword_list = exception_list[1::2]
|
|
||||||
dom_tree = xml.dom.minidom.parse(exception_xml)
|
|
||||||
root_node = dom_tree.documentElement
|
|
||||||
for error_code, keyword in zip(error_code_list, keyword_list):
|
|
||||||
customer_node = dom_tree.createElement("Exception")
|
|
||||||
keyword_node = dom_tree.createElement("KeyWord")
|
|
||||||
keyword_node_text_value = dom_tree.createTextNode(keyword)
|
|
||||||
keyword_node.appendChild(keyword_node_text_value)
|
|
||||||
customer_node.appendChild(keyword_node)
|
|
||||||
error_code_node = dom_tree.createElement("ErrorID")
|
|
||||||
error_code_text_value = dom_tree.createTextNode(error_code)
|
|
||||||
error_code_node.appendChild(error_code_text_value)
|
|
||||||
customer_node.appendChild(error_code_node)
|
|
||||||
root_node.appendChild(customer_node)
|
|
||||||
with open(exception_xml, 'w') as f:
|
|
||||||
dom_tree.writexml(f, indent='', addindent='', newl='\n', encoding='UTF-8')
|
|
||||||
return
|
|
||||||
|
|
||||||
def GetIgnoreErrorCode(self) -> set:
|
|
||||||
"""
|
|
||||||
Below are kinds of error code that are accurate in ecc scanning of edk2 level.
|
|
||||||
But EccCheck plugin is partial scanning so they are always false positive issues.
|
|
||||||
The mapping relationship of error code and error message is listed BaseTools/Sourc/Python/Ecc/EccToolError.py
|
|
||||||
"""
|
|
||||||
ignore_error_code = {
|
|
||||||
"10000",
|
|
||||||
"10001",
|
|
||||||
"10002",
|
|
||||||
"10003",
|
|
||||||
"10004",
|
|
||||||
"10005",
|
|
||||||
"10006",
|
|
||||||
"10007",
|
|
||||||
"10008",
|
|
||||||
"10009",
|
|
||||||
"10010",
|
|
||||||
"10011",
|
|
||||||
"10012",
|
|
||||||
"10013",
|
|
||||||
"10015",
|
|
||||||
"10016",
|
|
||||||
"10017",
|
|
||||||
"10022",
|
|
||||||
}
|
|
||||||
return ignore_error_code
|
|
@@ -1,11 +0,0 @@
|
|||||||
## @file
|
|
||||||
# CiBuildPlugin used to check Ecc issues
|
|
||||||
#
|
|
||||||
# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
##
|
|
||||||
{
|
|
||||||
"scope": "cibuild",
|
|
||||||
"name": "EccCheck Test",
|
|
||||||
"module": "EccCheck"
|
|
||||||
}
|
|
@@ -1,15 +0,0 @@
|
|||||||
# EFI Coding style Check Plugin
|
|
||||||
|
|
||||||
This CiBuildPlugin finds the Ecc issues of newly added code in pull request.
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
The plugin can be configured to ignore certain files and issues.
|
|
||||||
|
|
||||||
"EccCheck": {
|
|
||||||
"ExceptionList": [],
|
|
||||||
"IgnoreFiles": []
|
|
||||||
},
|
|
||||||
"""
|
|
||||||
|
|
||||||
OPTIONAL List of file to ignore.
|
|
@@ -1,123 +0,0 @@
|
|||||||
# @file LicenseCheck.py
|
|
||||||
#
|
|
||||||
# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
##
|
|
||||||
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
import logging
|
|
||||||
import re
|
|
||||||
from io import StringIO
|
|
||||||
from typing import List, Tuple
|
|
||||||
from edk2toolext.environment.plugintypes.ci_build_plugin import ICiBuildPlugin
|
|
||||||
from edk2toolext.environment.var_dict import VarDict
|
|
||||||
from edk2toollib.utility_functions import RunCmd
|
|
||||||
|
|
||||||
|
|
||||||
class LicenseCheck(ICiBuildPlugin):
|
|
||||||
|
|
||||||
"""
|
|
||||||
A CiBuildPlugin to check the license for new added files.
|
|
||||||
|
|
||||||
Configuration options:
|
|
||||||
"LicenseCheck": {
|
|
||||||
"IgnoreFiles": []
|
|
||||||
},
|
|
||||||
"""
|
|
||||||
|
|
||||||
license_format_preflix = 'SPDX-License-Identifier'
|
|
||||||
|
|
||||||
bsd2_patent = 'BSD-2-Clause-Patent'
|
|
||||||
|
|
||||||
Readdedfileformat = re.compile(r'\+\+\+ b\/(.*)')
|
|
||||||
|
|
||||||
file_extension_list = [".c", ".h", ".inf", ".dsc", ".dec", ".py", ".bat", ".sh", ".uni", ".yaml",
|
|
||||||
".fdf", ".inc", "yml", ".asm", ".asm16", ".asl", ".vfr", ".s", ".S", ".aslc",
|
|
||||||
".nasm", ".nasmb", ".idf", ".Vfr", ".H"]
|
|
||||||
|
|
||||||
def GetTestName(self, packagename: str, environment: VarDict) -> tuple:
|
|
||||||
""" Provide the testcase name and classname for use in reporting
|
|
||||||
testclassname: a descriptive string for the testcase can include whitespace
|
|
||||||
classname: should be patterned <packagename>.<plugin>.<optionally any unique condition>
|
|
||||||
|
|
||||||
Args:
|
|
||||||
packagename: string containing name of package to build
|
|
||||||
environment: The VarDict for the test to run in
|
|
||||||
Returns:
|
|
||||||
a tuple containing the testcase name and the classname
|
|
||||||
(testcasename, classname)
|
|
||||||
"""
|
|
||||||
return ("Check for license for " + packagename, packagename + ".LicenseCheck")
|
|
||||||
|
|
||||||
##
|
|
||||||
# External function of plugin. This function is used to perform the task of the ci_build_plugin Plugin
|
|
||||||
#
|
|
||||||
# - package is the edk2 path to package. This means workspace/packagepath relative.
|
|
||||||
# - edk2path object configured with workspace and packages path
|
|
||||||
# - PkgConfig Object (dict) for the pkg
|
|
||||||
# - EnvConfig Object
|
|
||||||
# - Plugin Manager Instance
|
|
||||||
# - Plugin Helper Obj Instance
|
|
||||||
# - Junit Logger
|
|
||||||
# - output_stream the StringIO output stream from this plugin via logging
|
|
||||||
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
|
|
||||||
# Create temp directory
|
|
||||||
temp_path = os.path.join(Edk2pathObj.WorkspacePath, 'Build', '.pytool', 'Plugin', 'LicenseCheck')
|
|
||||||
if not os.path.exists(temp_path):
|
|
||||||
os.makedirs(temp_path)
|
|
||||||
# Output file to use for git diff operations
|
|
||||||
temp_diff_output = os.path.join (temp_path, 'diff.txt')
|
|
||||||
params = "diff --output={} --unified=0 origin/master HEAD".format(temp_diff_output)
|
|
||||||
RunCmd("git", params)
|
|
||||||
with open(temp_diff_output) as file:
|
|
||||||
patch = file.read().strip().split("\n")
|
|
||||||
# Delete temp directory
|
|
||||||
if os.path.exists(temp_path):
|
|
||||||
shutil.rmtree(temp_path)
|
|
||||||
|
|
||||||
ignore_files = []
|
|
||||||
if "IgnoreFiles" in pkgconfig:
|
|
||||||
ignore_files = pkgconfig["IgnoreFiles"]
|
|
||||||
|
|
||||||
self.ok = True
|
|
||||||
self.startcheck = False
|
|
||||||
self.license = True
|
|
||||||
self.all_file_pass = True
|
|
||||||
count = len(patch)
|
|
||||||
line_index = 0
|
|
||||||
for line in patch:
|
|
||||||
if line.startswith('--- /dev/null'):
|
|
||||||
nextline = patch[line_index + 1]
|
|
||||||
added_file = self.Readdedfileformat.search(nextline).group(1)
|
|
||||||
added_file_extension = os.path.splitext(added_file)[1]
|
|
||||||
if added_file_extension in self.file_extension_list and packagename in added_file:
|
|
||||||
if (self.IsIgnoreFile(added_file, ignore_files)):
|
|
||||||
line_index = line_index + 1
|
|
||||||
continue
|
|
||||||
self.startcheck = True
|
|
||||||
self.license = False
|
|
||||||
if self.startcheck and self.license_format_preflix in line:
|
|
||||||
if self.bsd2_patent in line:
|
|
||||||
self.license = True
|
|
||||||
if line_index + 1 == count or patch[line_index + 1].startswith('diff --') and self.startcheck:
|
|
||||||
if not self.license:
|
|
||||||
self.all_file_pass = False
|
|
||||||
error_message = "Invalid license in: " + added_file + " Hint: Only BSD-2-Clause-Patent is accepted."
|
|
||||||
logging.error(error_message)
|
|
||||||
self.startcheck = False
|
|
||||||
self.license = True
|
|
||||||
line_index = line_index + 1
|
|
||||||
|
|
||||||
if self.all_file_pass:
|
|
||||||
tc.SetSuccess()
|
|
||||||
return 0
|
|
||||||
else:
|
|
||||||
tc.SetFailed("License Check {0} Failed. ".format(packagename), "LICENSE_CHECK_FAILED")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
def IsIgnoreFile(self, file: str, ignore_files: List[str]) -> bool:
|
|
||||||
for f in ignore_files:
|
|
||||||
if f in file:
|
|
||||||
return True
|
|
||||||
return False
|
|
@@ -1,11 +0,0 @@
|
|||||||
## @file
|
|
||||||
# CiBuildPlugin used to check license issues for new added files
|
|
||||||
#
|
|
||||||
# Copyright (c) 2020, Intel Corporation. All rights reserved.
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
##
|
|
||||||
{
|
|
||||||
"scope": "cibuild",
|
|
||||||
"name": "License Check Test",
|
|
||||||
"module": "LicenseCheck"
|
|
||||||
}
|
|
@@ -1,17 +0,0 @@
|
|||||||
# License Check Plugin
|
|
||||||
|
|
||||||
This CiBuildPlugin scans all new added files in a package to make sure code
|
|
||||||
is contributed under BSD-2-Clause-Patent.
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
The plugin can be configured to ignore certain files.
|
|
||||||
|
|
||||||
``` yaml
|
|
||||||
"LicenseCheck": {
|
|
||||||
"IgnoreFiles": []
|
|
||||||
}
|
|
||||||
```
|
|
||||||
### IgnoreFiles
|
|
||||||
|
|
||||||
OPTIONAL List of file to ignore.
|
|
@@ -37,12 +37,12 @@ class SpellCheck(ICiBuildPlugin):
|
|||||||
#
|
#
|
||||||
# A package can remove any of these using IgnoreStandardPaths
|
# A package can remove any of these using IgnoreStandardPaths
|
||||||
#
|
#
|
||||||
STANDARD_PLUGIN_DEFINED_PATHS = ("*.c", "*.h",
|
STANDARD_PLUGIN_DEFINED_PATHS = ["*.c", "*.h",
|
||||||
"*.nasm", "*.asm", "*.masm", "*.s",
|
"*.nasm", "*.asm", "*.masm", "*.s",
|
||||||
"*.asl",
|
"*.asl",
|
||||||
"*.dsc", "*.dec", "*.fdf", "*.inf",
|
"*.dsc", "*.dec", "*.fdf", "*.inf",
|
||||||
"*.md", "*.txt"
|
"*.md", "*.txt"
|
||||||
)
|
]
|
||||||
|
|
||||||
def GetTestName(self, packagename: str, environment: VarDict) -> tuple:
|
def GetTestName(self, packagename: str, environment: VarDict) -> tuple:
|
||||||
""" Provide the testcase name and classname for use in reporting
|
""" Provide the testcase name and classname for use in reporting
|
||||||
@@ -107,8 +107,7 @@ class SpellCheck(ICiBuildPlugin):
|
|||||||
version_aggregator.GetVersionAggregator().ReportVersion(
|
version_aggregator.GetVersionAggregator().ReportVersion(
|
||||||
"CSpell", cspell_version, version_aggregator.VersionTypes.INFO)
|
"CSpell", cspell_version, version_aggregator.VersionTypes.INFO)
|
||||||
|
|
||||||
# copy the default as a list
|
package_relative_paths_to_spell_check = SpellCheck.STANDARD_PLUGIN_DEFINED_PATHS
|
||||||
package_relative_paths_to_spell_check = list(SpellCheck.STANDARD_PLUGIN_DEFINED_PATHS)
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Allow the ci.yaml to remove any of the above standard paths
|
# Allow the ci.yaml to remove any of the above standard paths
|
||||||
@@ -134,8 +133,7 @@ class SpellCheck(ICiBuildPlugin):
|
|||||||
#
|
#
|
||||||
relpath = os.path.relpath(abs_pkg_path)
|
relpath = os.path.relpath(abs_pkg_path)
|
||||||
cpsell_paths = " ".join(
|
cpsell_paths = " ".join(
|
||||||
# Double quote each path to defer expansion to cspell parameters
|
[f"{relpath}/**/{x}" for x in package_relative_paths_to_spell_check])
|
||||||
[f'"{relpath}/**/{x}"' for x in package_relative_paths_to_spell_check])
|
|
||||||
|
|
||||||
# Make the config file
|
# Make the config file
|
||||||
config_file_path = os.path.join(
|
config_file_path = os.path.join(
|
||||||
|
@@ -178,6 +178,5 @@
|
|||||||
"vcruntimed",
|
"vcruntimed",
|
||||||
"ucrtd",
|
"ucrtd",
|
||||||
"msvcrtd",
|
"msvcrtd",
|
||||||
"XIPFLAGS"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@@ -1,120 +0,0 @@
|
|||||||
# UncrustifyCheck Plugin
|
|
||||||
|
|
||||||
This CiBuildPlugin scans all the files in a given package and checks for coding standard compliance issues.
|
|
||||||
|
|
||||||
This plugin is enabled by default. If a package would like to prevent the plugin from reporting errors, it can do
|
|
||||||
so by enabling [`AuditOnly`](#auditonly) mode.
|
|
||||||
|
|
||||||
This plugin requires the directory containing the Uncrustify executable that should be used for this plugin to
|
|
||||||
be specified in an environment variable named `UNCRUSTIFY_CI_PATH`. This unique variable name is used to avoid confusion
|
|
||||||
with other paths to Uncrustify which might not be the expected build for use by this plugin.
|
|
||||||
|
|
||||||
By default, an Uncrustify configuration file named "uncrustify.cfg" located in the same directory as the plugin is
|
|
||||||
used. The value can be overridden to a package-specific path with the `ConfigFilePath` configuration file option.
|
|
||||||
|
|
||||||
* Uncrustify source code and documentation: https://github.com/uncrustify/uncrustify
|
|
||||||
* Project Mu Uncrustify fork source code and documentation: https://dev.azure.com/projectmu/Uncrustify
|
|
||||||
|
|
||||||
## Files Checked in a Package
|
|
||||||
|
|
||||||
By default, this plugin will discover all files in the package with the following default paths:
|
|
||||||
|
|
||||||
```python
|
|
||||||
[
|
|
||||||
# C source
|
|
||||||
"*.c",
|
|
||||||
"*.h"
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
From this list of files, any files ignored by Git or residing in a Git submodule will be removed. If Git is not
|
|
||||||
found, submodules are not found, or ignored files are not found no changes are made to the list of discovered files.
|
|
||||||
|
|
||||||
To control the paths checked in a given package, review the configuration options described in this file.
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
The plugin can be configured with a few optional configuration options.
|
|
||||||
|
|
||||||
``` yaml
|
|
||||||
"UncrustifyCheck": {
|
|
||||||
"AdditionalIncludePaths": [], # Additional paths to check formatting (wildcards supported).
|
|
||||||
"AuditOnly": False, # Don't fail the build if there are errors. Just log them.
|
|
||||||
"ConfigFilePath": "", # Custom path to an Uncrustify config file.
|
|
||||||
"IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignored.
|
|
||||||
"OutputFileDiffs": False, # Output chunks of formatting diffs in the test case log.
|
|
||||||
# This can significantly slow down the plugin on very large packages.
|
|
||||||
"SkipGitExclusions": False # Don't exclude git ignored files and files in git submodules.
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### `AdditionalIncludePaths`
|
|
||||||
|
|
||||||
A package configuration file can specify any additional paths to be included with this option.
|
|
||||||
|
|
||||||
At this time, it is recommended all files run against the plugin be written in the C or C++ language.
|
|
||||||
|
|
||||||
### `AuditOnly`
|
|
||||||
|
|
||||||
`Boolean` - Default is `False`.
|
|
||||||
|
|
||||||
If `True`, run the test in an "audit only mode" which will log all errors but instead of failing the build, it will set
|
|
||||||
the test as skipped. This allows visibility into the failures without breaking the build.
|
|
||||||
|
|
||||||
### `ConfigFilePath`
|
|
||||||
|
|
||||||
`String` - Default is `"uncrustify.cfg"`
|
|
||||||
|
|
||||||
When specified in the config file, this is a package relative path to the Uncrustify configuration file.
|
|
||||||
|
|
||||||
### `IgnoreStandardPaths`
|
|
||||||
|
|
||||||
This plugin by default will check the below standard paths. A package configuration file can specify any of these paths
|
|
||||||
to be ignored.
|
|
||||||
|
|
||||||
```python
|
|
||||||
[
|
|
||||||
# C source
|
|
||||||
"*.c",
|
|
||||||
"*.h"
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
### `OutputFileDiffs`
|
|
||||||
|
|
||||||
`Boolean` - Default is `False`.
|
|
||||||
|
|
||||||
If `True`, output diffs of formatting changes into the test case log. This is helpful to exactly understand what changes
|
|
||||||
need to be made to the source code in order to fix a coding standard compliance issue.
|
|
||||||
|
|
||||||
Note that calculating the file diffs on a very large set of of results (e.g. >100 files) can significantly slow down
|
|
||||||
plugin execution.
|
|
||||||
|
|
||||||
### `SkipGitExclusions`
|
|
||||||
|
|
||||||
`Boolean` - Default is `False`.
|
|
||||||
|
|
||||||
By default, files in paths matched in a .gitignore file or a recognized git submodule are excluded. If this option
|
|
||||||
is `True`, the plugin will not attempt to recognize these files and exclude them.
|
|
||||||
|
|
||||||
## High-Level Plugin Operation
|
|
||||||
|
|
||||||
This plugin generates two main sets of temporary files:
|
|
||||||
|
|
||||||
1. A working directory in the directory `Build/.pytool/Plugin/Uncrustify`
|
|
||||||
2. For each source file with formatting errors, a sibling file with the `.uncrustify_plugin` extension
|
|
||||||
|
|
||||||
The working directory contains temporary files unique to operation of the plugin. All of these files are removed on
|
|
||||||
exit of the plugin including successful or unsuccessful execution (such as a Python exception occurring). If for any
|
|
||||||
reason, any files in the package exist prior to running the plugin with the `.uncrustify_plugin` extension, the plugin
|
|
||||||
will inform the user to remove these files and exit before running Uncrustify. This is to ensure the accuracy of the
|
|
||||||
results reported from each execution instance of the plugin.
|
|
||||||
|
|
||||||
The plugin determines the list of relevant files to check with Uncrustify and then invokes Uncrustify with that file
|
|
||||||
list. For any files not compliant to the configuration file provided, Uncrustify will generate a corresponding file
|
|
||||||
with the `.uncrustify_plugin` extension. The plugin discovers all of these files. If any such files are present, this
|
|
||||||
indicates a formatting issue was found and the test is marked failed (unless `AuditOnly` mode is enabled).
|
|
||||||
|
|
||||||
The test case log will contain a report of which files failed to format properly, allowing the user to run Uncrustify
|
|
||||||
against the file locally to fix the issue. If the `OutputFileDiffs` configuration option is set to `True`, the plugin
|
|
||||||
will output diff chunks for all code formatting issues in the test case log.
|
|
@@ -1,618 +0,0 @@
|
|||||||
# @file UncrustifyCheck.py
|
|
||||||
#
|
|
||||||
# An edk2-pytool based plugin wrapper for Uncrustify
|
|
||||||
#
|
|
||||||
# Copyright (c) Microsoft Corporation.
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
##
|
|
||||||
import configparser
|
|
||||||
import difflib
|
|
||||||
import errno
|
|
||||||
import logging
|
|
||||||
import os
|
|
||||||
import pathlib
|
|
||||||
import shutil
|
|
||||||
import timeit
|
|
||||||
from edk2toolext.environment import version_aggregator
|
|
||||||
from edk2toolext.environment.plugin_manager import PluginManager
|
|
||||||
from edk2toolext.environment.plugintypes.ci_build_plugin import ICiBuildPlugin
|
|
||||||
from edk2toolext.environment.plugintypes.uefi_helper_plugin import HelperFunctions
|
|
||||||
from edk2toolext.environment.var_dict import VarDict
|
|
||||||
from edk2toollib.log.junit_report_format import JunitReportTestCase
|
|
||||||
from edk2toollib.uefi.edk2.path_utilities import Edk2Path
|
|
||||||
from edk2toollib.utility_functions import RunCmd
|
|
||||||
from io import StringIO
|
|
||||||
from typing import Any, Dict, List, Tuple
|
|
||||||
|
|
||||||
#
|
|
||||||
# Provide more user friendly messages for certain scenarios
|
|
||||||
#
|
|
||||||
class UncrustifyException(Exception):
|
|
||||||
def __init__(self, message, exit_code):
|
|
||||||
super().__init__(message)
|
|
||||||
self.exit_code = exit_code
|
|
||||||
|
|
||||||
|
|
||||||
class UncrustifyAppEnvVarNotFoundException(UncrustifyException):
|
|
||||||
def __init__(self, message):
|
|
||||||
super().__init__(message, -101)
|
|
||||||
|
|
||||||
|
|
||||||
class UncrustifyAppVersionErrorException(UncrustifyException):
|
|
||||||
def __init__(self, message):
|
|
||||||
super().__init__(message, -102)
|
|
||||||
|
|
||||||
|
|
||||||
class UncrustifyAppExecutionException(UncrustifyException):
|
|
||||||
def __init__(self, message):
|
|
||||||
super().__init__(message, -103)
|
|
||||||
|
|
||||||
|
|
||||||
class UncrustifyStalePluginFormattedFilesException(UncrustifyException):
|
|
||||||
def __init__(self, message):
|
|
||||||
super().__init__(message, -120)
|
|
||||||
|
|
||||||
|
|
||||||
class UncrustifyInputFileCreationErrorException(UncrustifyException):
|
|
||||||
def __init__(self, message):
|
|
||||||
super().__init__(message, -121)
|
|
||||||
|
|
||||||
class UncrustifyInvalidIgnoreStandardPathsException(UncrustifyException):
|
|
||||||
def __init__(self, message):
|
|
||||||
super().__init__(message, -122)
|
|
||||||
|
|
||||||
class UncrustifyGitIgnoreFileException(UncrustifyException):
|
|
||||||
def __init__(self, message):
|
|
||||||
super().__init__(message, -140)
|
|
||||||
|
|
||||||
|
|
||||||
class UncrustifyGitSubmoduleException(UncrustifyException):
|
|
||||||
def __init__(self, message):
|
|
||||||
super().__init__(message, -141)
|
|
||||||
|
|
||||||
|
|
||||||
class UncrustifyCheck(ICiBuildPlugin):
|
|
||||||
"""
|
|
||||||
A CiBuildPlugin that uses Uncrustify to check the source files in the
|
|
||||||
package being tested for coding standard issues.
|
|
||||||
|
|
||||||
By default, the plugin runs against standard C source file extensions but
|
|
||||||
its configuration can be modified through its configuration file.
|
|
||||||
|
|
||||||
Configuration options:
|
|
||||||
"UncrustifyCheck": {
|
|
||||||
"AdditionalIncludePaths": [], # Additional paths to check formatting (wildcards supported).
|
|
||||||
"AuditOnly": False, # Don't fail the build if there are errors. Just log them.
|
|
||||||
"ConfigFilePath": "", # Custom path to an Uncrustify config file.
|
|
||||||
"IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignored.
|
|
||||||
"OutputFileDiffs": False, # Output chunks of formatting diffs in the test case log.
|
|
||||||
# This can significantly slow down the plugin on very large packages.
|
|
||||||
"SkipGitExclusions": False # Don't exclude git ignored files and files in git submodules.
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
#
|
|
||||||
# By default, use an "uncrustify.cfg" config file in the plugin directory
|
|
||||||
# A package can override this path via "ConfigFilePath"
|
|
||||||
#
|
|
||||||
# Note: Values specified via "ConfigFilePath" are relative to the package
|
|
||||||
#
|
|
||||||
DEFAULT_CONFIG_FILE_PATH = os.path.join(
|
|
||||||
pathlib.Path(__file__).parent.resolve(), "uncrustify.cfg")
|
|
||||||
|
|
||||||
#
|
|
||||||
# The extension used for formatted files produced by this plugin
|
|
||||||
#
|
|
||||||
FORMATTED_FILE_EXTENSION = ".uncrustify_plugin"
|
|
||||||
|
|
||||||
#
|
|
||||||
# A package can add any additional paths with "AdditionalIncludePaths"
|
|
||||||
# A package can remove any of these paths with "IgnoreStandardPaths"
|
|
||||||
#
|
|
||||||
STANDARD_PLUGIN_DEFINED_PATHS = ("*.c", "*.h")
|
|
||||||
|
|
||||||
#
|
|
||||||
# The Uncrustify application path should set in this environment variable
|
|
||||||
#
|
|
||||||
UNCRUSTIFY_PATH_ENV_KEY = "UNCRUSTIFY_CI_PATH"
|
|
||||||
|
|
||||||
def GetTestName(self, packagename: str, environment: VarDict) -> Tuple:
|
|
||||||
""" Provide the testcase name and classname for use in reporting
|
|
||||||
|
|
||||||
Args:
|
|
||||||
packagename: string containing name of package to build
|
|
||||||
environment: The VarDict for the test to run in
|
|
||||||
Returns:
|
|
||||||
A tuple containing the testcase name and the classname
|
|
||||||
(testcasename, classname)
|
|
||||||
testclassname: a descriptive string for the testcase can include whitespace
|
|
||||||
classname: should be patterned <packagename>.<plugin>.<optionally any unique condition>
|
|
||||||
"""
|
|
||||||
return ("Check file coding standard compliance in " + packagename, packagename + ".UncrustifyCheck")
|
|
||||||
|
|
||||||
def RunBuildPlugin(self, package_rel_path: str, edk2_path: Edk2Path, package_config: Dict[str, List[str]], environment_config: Any, plugin_manager: PluginManager, plugin_manager_helper: HelperFunctions, tc: JunitReportTestCase, output_stream=None) -> int:
|
|
||||||
"""
|
|
||||||
External function of plugin. This function is used to perform the task of the CiBuild Plugin.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
- package_rel_path: edk2 workspace relative path to the package
|
|
||||||
- edk2_path: Edk2Path object with workspace and packages paths
|
|
||||||
- package_config: Dictionary with the package configuration
|
|
||||||
- environment_config: Environment configuration
|
|
||||||
- plugin_manager: Plugin Manager Instance
|
|
||||||
- plugin_manager_helper: Plugin Manager Helper Instance
|
|
||||||
- tc: JUnit test case
|
|
||||||
- output_stream: The StringIO output stream from this plugin (logging)
|
|
||||||
|
|
||||||
Returns
|
|
||||||
>0 : Number of errors found
|
|
||||||
0 : Passed successfully
|
|
||||||
-1 : Skipped for missing prereq
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
# Initialize plugin and check pre-requisites.
|
|
||||||
self._initialize_environment_info(
|
|
||||||
package_rel_path, edk2_path, package_config, tc)
|
|
||||||
self._initialize_configuration()
|
|
||||||
self._check_for_preexisting_formatted_files()
|
|
||||||
|
|
||||||
# Log important context information.
|
|
||||||
self._log_uncrustify_app_info()
|
|
||||||
|
|
||||||
# Get template file contents if specified
|
|
||||||
self._get_template_file_contents()
|
|
||||||
|
|
||||||
# Create meta input files & directories
|
|
||||||
self._create_temp_working_directory()
|
|
||||||
self._create_uncrustify_file_list_file()
|
|
||||||
|
|
||||||
self._run_uncrustify()
|
|
||||||
|
|
||||||
# Post-execution actions.
|
|
||||||
self._process_uncrustify_results()
|
|
||||||
|
|
||||||
except UncrustifyException as e:
|
|
||||||
self._tc.LogStdError(
|
|
||||||
f"Uncrustify error {e.exit_code}. Details:\n\n{str(e)}")
|
|
||||||
logging.warning(
|
|
||||||
f"Uncrustify error {e.exit_code}. Details:\n\n{str(e)}")
|
|
||||||
return -1
|
|
||||||
else:
|
|
||||||
if self._formatted_file_error_count > 0:
|
|
||||||
if self._audit_only_mode:
|
|
||||||
logging.info(
|
|
||||||
"Setting test as skipped since AuditOnly is enabled")
|
|
||||||
self._tc.SetSkipped()
|
|
||||||
return -1
|
|
||||||
else:
|
|
||||||
self._tc.SetFailed(
|
|
||||||
f"{self._plugin_name} failed due to {self._formatted_file_error_count} incorrectly formatted files.", "CHECK_FAILED")
|
|
||||||
else:
|
|
||||||
self._tc.SetSuccess()
|
|
||||||
return self._formatted_file_error_count
|
|
||||||
finally:
|
|
||||||
self._cleanup_temporary_formatted_files()
|
|
||||||
self._cleanup_temporary_directory()
|
|
||||||
|
|
||||||
def _initialize_configuration(self) -> None:
|
|
||||||
"""
|
|
||||||
Initializes plugin configuration.
|
|
||||||
"""
|
|
||||||
self._initialize_app_info()
|
|
||||||
self._initialize_config_file_info()
|
|
||||||
self._initialize_file_to_format_info()
|
|
||||||
self._initialize_test_case_output_options()
|
|
||||||
|
|
||||||
def _check_for_preexisting_formatted_files(self) -> None:
|
|
||||||
"""
|
|
||||||
Checks if any formatted files from prior execution are present.
|
|
||||||
|
|
||||||
Existence of such files is an unexpected condition. This might result
|
|
||||||
from an error that occurred during a previous run or a premature exit from a debug scenario. In any case, the package should be clean before starting a new run.
|
|
||||||
"""
|
|
||||||
pre_existing_formatted_file_count = len(
|
|
||||||
[str(path.resolve()) for path in pathlib.Path(self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')])
|
|
||||||
|
|
||||||
if pre_existing_formatted_file_count > 0:
|
|
||||||
raise UncrustifyStalePluginFormattedFilesException(
|
|
||||||
f"{pre_existing_formatted_file_count} formatted files already exist. To prevent overwriting these files, please remove them before running this plugin.")
|
|
||||||
|
|
||||||
def _cleanup_temporary_directory(self) -> None:
|
|
||||||
"""
|
|
||||||
Cleans up the temporary directory used for this execution instance.
|
|
||||||
|
|
||||||
This removes the directory and all files created during this instance.
|
|
||||||
"""
|
|
||||||
if hasattr(self, '_working_dir'):
|
|
||||||
self._remove_tree(self._working_dir)
|
|
||||||
|
|
||||||
def _cleanup_temporary_formatted_files(self) -> None:
|
|
||||||
"""
|
|
||||||
Cleans up the temporary formmatted files produced by Uncrustify.
|
|
||||||
|
|
||||||
This will recursively remove all formatted files generated by Uncrustify
|
|
||||||
during this execution instance.
|
|
||||||
"""
|
|
||||||
if hasattr(self, '_abs_package_path'):
|
|
||||||
formatted_files = [str(path.resolve()) for path in pathlib.Path(
|
|
||||||
self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')]
|
|
||||||
|
|
||||||
for formatted_file in formatted_files:
|
|
||||||
os.remove(formatted_file)
|
|
||||||
|
|
||||||
def _create_temp_working_directory(self) -> None:
|
|
||||||
"""
|
|
||||||
Creates the temporary directory used for this execution instance.
|
|
||||||
"""
|
|
||||||
self._working_dir = os.path.join(
|
|
||||||
self._abs_workspace_path, "Build", ".pytool", "Plugin", f"{self._plugin_name}")
|
|
||||||
|
|
||||||
try:
|
|
||||||
pathlib.Path(self._working_dir).mkdir(parents=True, exist_ok=True)
|
|
||||||
except OSError as e:
|
|
||||||
raise UncrustifyInputFileCreationErrorException(
|
|
||||||
f"Error creating plugin directory {self._working_dir}.\n\n{repr(e)}.")
|
|
||||||
|
|
||||||
def _create_uncrustify_file_list_file(self) -> None:
|
|
||||||
"""
|
|
||||||
Creates the file with the list of source files for Uncrustify to process.
|
|
||||||
"""
|
|
||||||
self._app_input_file_path = os.path.join(
|
|
||||||
self._working_dir, "uncrustify_file_list.txt")
|
|
||||||
|
|
||||||
with open(self._app_input_file_path, 'w', encoding='utf8') as f:
|
|
||||||
f.writelines(f"\n".join(self._abs_file_paths_to_format))
|
|
||||||
|
|
||||||
def _execute_uncrustify(self) -> None:
|
|
||||||
"""
|
|
||||||
Executes Uncrustify with the initialized configuration.
|
|
||||||
"""
|
|
||||||
output = StringIO()
|
|
||||||
self._app_exit_code = RunCmd(
|
|
||||||
self._app_path,
|
|
||||||
f"-c {self._app_config_file} -F {self._app_input_file_path} --if-changed --suffix {UncrustifyCheck.FORMATTED_FILE_EXTENSION}", outstream=output)
|
|
||||||
self._app_output = output.getvalue().strip().splitlines()
|
|
||||||
|
|
||||||
def _get_git_ignored_paths(self) -> List[str]:
|
|
||||||
""""
|
|
||||||
Returns a list of file absolute path strings to all files ignored in this git repository.
|
|
||||||
|
|
||||||
If git is not found, an empty list will be returned.
|
|
||||||
"""
|
|
||||||
if not shutil.which("git"):
|
|
||||||
logging.warn(
|
|
||||||
"Git is not found on this system. Git submodule paths will not be considered.")
|
|
||||||
return []
|
|
||||||
|
|
||||||
outstream_buffer = StringIO()
|
|
||||||
exit_code = RunCmd("git", "ls-files --other",
|
|
||||||
workingdir=self._abs_workspace_path, outstream=outstream_buffer, logging_level=logging.NOTSET)
|
|
||||||
if (exit_code != 0):
|
|
||||||
raise UncrustifyGitIgnoreFileException(
|
|
||||||
f"An error occurred reading git ignore settings. This will prevent Uncrustify from running against the expected set of files.")
|
|
||||||
|
|
||||||
# Note: This will potentially be a large list, but at least sorted
|
|
||||||
return outstream_buffer.getvalue().strip().splitlines()
|
|
||||||
|
|
||||||
def _get_git_submodule_paths(self) -> List[str]:
|
|
||||||
"""
|
|
||||||
Returns a list of directory absolute path strings to the root of each submodule in the workspace repository.
|
|
||||||
|
|
||||||
If git is not found, an empty list will be returned.
|
|
||||||
"""
|
|
||||||
if not shutil.which("git"):
|
|
||||||
logging.warn(
|
|
||||||
"Git is not found on this system. Git submodule paths will not be considered.")
|
|
||||||
return []
|
|
||||||
|
|
||||||
if os.path.isfile(os.path.join(self._abs_workspace_path, ".gitmodules")):
|
|
||||||
logging.info(
|
|
||||||
f".gitmodules file found. Excluding submodules in {self._package_name}.")
|
|
||||||
|
|
||||||
outstream_buffer = StringIO()
|
|
||||||
exit_code = RunCmd("git", "config --file .gitmodules --get-regexp path", workingdir=self._abs_workspace_path, outstream=outstream_buffer, logging_level=logging.NOTSET)
|
|
||||||
if (exit_code != 0):
|
|
||||||
raise UncrustifyGitSubmoduleException(
|
|
||||||
f".gitmodule file detected but an error occurred reading the file. Cannot proceed with unknown submodule paths.")
|
|
||||||
|
|
||||||
submodule_paths = []
|
|
||||||
for line in outstream_buffer.getvalue().strip().splitlines():
|
|
||||||
submodule_paths.append(
|
|
||||||
os.path.normpath(os.path.join(self._abs_workspace_path, line.split()[1])))
|
|
||||||
|
|
||||||
return submodule_paths
|
|
||||||
else:
|
|
||||||
return []
|
|
||||||
|
|
||||||
def _get_template_file_contents(self) -> None:
|
|
||||||
"""
|
|
||||||
Gets the contents of Uncrustify template files if they are specified
|
|
||||||
in the Uncrustify configuration file.
|
|
||||||
"""
|
|
||||||
|
|
||||||
self._file_template_contents = None
|
|
||||||
self._func_template_contents = None
|
|
||||||
|
|
||||||
# Allow no value to allow "set" statements in the config file which do
|
|
||||||
# not specify value assignment
|
|
||||||
parser = configparser.ConfigParser(allow_no_value=True)
|
|
||||||
with open(self._app_config_file, 'r') as cf:
|
|
||||||
parser.read_string("[dummy_section]\n" + cf.read())
|
|
||||||
|
|
||||||
try:
|
|
||||||
file_template_name = parser["dummy_section"]["cmt_insert_file_header"]
|
|
||||||
|
|
||||||
file_template_path = pathlib.Path(file_template_name)
|
|
||||||
|
|
||||||
if not file_template_path.is_file():
|
|
||||||
file_template_path = pathlib.Path(os.path.join(self._plugin_path, file_template_name))
|
|
||||||
self._file_template_contents = file_template_path.read_text()
|
|
||||||
except KeyError:
|
|
||||||
logging.warn("A file header template is not specified in the config file.")
|
|
||||||
except FileNotFoundError:
|
|
||||||
logging.warn("The specified file header template file was not found.")
|
|
||||||
try:
|
|
||||||
func_template_name = parser["dummy_section"]["cmt_insert_func_header"]
|
|
||||||
|
|
||||||
func_template_path = pathlib.Path(func_template_name)
|
|
||||||
|
|
||||||
if not func_template_path.is_file():
|
|
||||||
func_template_path = pathlib.Path(os.path.join(self._plugin_path, func_template_name))
|
|
||||||
self._func_template_contents = func_template_path.read_text()
|
|
||||||
except KeyError:
|
|
||||||
logging.warn("A function header template is not specified in the config file.")
|
|
||||||
except FileNotFoundError:
|
|
||||||
logging.warn("The specified function header template file was not found.")
|
|
||||||
|
|
||||||
def _initialize_app_info(self) -> None:
|
|
||||||
"""
|
|
||||||
Initialize Uncrustify application information.
|
|
||||||
|
|
||||||
This function will determine the application path and version.
|
|
||||||
"""
|
|
||||||
# Verify Uncrustify is specified in the environment.
|
|
||||||
if UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY not in os.environ:
|
|
||||||
raise UncrustifyAppEnvVarNotFoundException(
|
|
||||||
f"Uncrustify environment variable {UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY} is not present.")
|
|
||||||
|
|
||||||
self._app_path = shutil.which('uncrustify', path=os.environ[UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY])
|
|
||||||
|
|
||||||
if self._app_path is None:
|
|
||||||
raise FileNotFoundError(
|
|
||||||
errno.ENOENT, os.strerror(errno.ENOENT), self._app_path)
|
|
||||||
|
|
||||||
self._app_path = os.path.normcase(os.path.normpath(self._app_path))
|
|
||||||
|
|
||||||
if not os.path.isfile(self._app_path):
|
|
||||||
raise FileNotFoundError(
|
|
||||||
errno.ENOENT, os.strerror(errno.ENOENT), self._app_path)
|
|
||||||
|
|
||||||
# Verify Uncrustify is present at the expected path.
|
|
||||||
return_buffer = StringIO()
|
|
||||||
ret = RunCmd(self._app_path, "--version", outstream=return_buffer)
|
|
||||||
if (ret != 0):
|
|
||||||
raise UncrustifyAppVersionErrorException(
|
|
||||||
f"Error occurred executing --version: {ret}.")
|
|
||||||
|
|
||||||
# Log Uncrustify version information.
|
|
||||||
self._app_version = return_buffer.getvalue().strip()
|
|
||||||
self._tc.LogStdOut(f"Uncrustify version: {self._app_version}")
|
|
||||||
version_aggregator.GetVersionAggregator().ReportVersion(
|
|
||||||
"Uncrustify", self._app_version, version_aggregator.VersionTypes.INFO)
|
|
||||||
|
|
||||||
def _initialize_config_file_info(self) -> None:
|
|
||||||
"""
|
|
||||||
Initialize Uncrustify configuration file info.
|
|
||||||
|
|
||||||
The config file path is relative to the package root.
|
|
||||||
"""
|
|
||||||
self._app_config_file = UncrustifyCheck.DEFAULT_CONFIG_FILE_PATH
|
|
||||||
if "ConfigFilePath" in self._package_config:
|
|
||||||
self._app_config_file = self._package_config["ConfigFilePath"].strip()
|
|
||||||
|
|
||||||
self._app_config_file = os.path.normpath(
|
|
||||||
os.path.join(self._abs_package_path, self._app_config_file))
|
|
||||||
|
|
||||||
if not os.path.isfile(self._app_config_file):
|
|
||||||
raise FileNotFoundError(
|
|
||||||
errno.ENOENT, os.strerror(errno.ENOENT), self._app_config_file)
|
|
||||||
|
|
||||||
def _initialize_environment_info(self, package_rel_path: str, edk2_path: Edk2Path, package_config: Dict[str, List[str]], tc: JunitReportTestCase) -> None:
|
|
||||||
"""
|
|
||||||
Initializes plugin environment information.
|
|
||||||
"""
|
|
||||||
self._abs_package_path = edk2_path.GetAbsolutePathOnThisSytemFromEdk2RelativePath(
|
|
||||||
package_rel_path)
|
|
||||||
self._abs_workspace_path = edk2_path.WorkspacePath
|
|
||||||
self._package_config = package_config
|
|
||||||
self._package_name = os.path.basename(
|
|
||||||
os.path.normpath(package_rel_path))
|
|
||||||
self._plugin_name = self.__class__.__name__
|
|
||||||
self._plugin_path = os.path.dirname(os.path.realpath(__file__))
|
|
||||||
self._rel_package_path = package_rel_path
|
|
||||||
self._tc = tc
|
|
||||||
|
|
||||||
def _initialize_file_to_format_info(self) -> None:
|
|
||||||
"""
|
|
||||||
Forms the list of source files for Uncrustify to process.
|
|
||||||
"""
|
|
||||||
# Create a list of all the package relative file paths in the package to run against Uncrustify.
|
|
||||||
rel_file_paths_to_format = list(
|
|
||||||
UncrustifyCheck.STANDARD_PLUGIN_DEFINED_PATHS)
|
|
||||||
|
|
||||||
# Allow the ci.yaml to remove any of the pre-defined standard paths
|
|
||||||
if "IgnoreStandardPaths" in self._package_config:
|
|
||||||
for a in self._package_config["IgnoreStandardPaths"]:
|
|
||||||
if a.strip() in rel_file_paths_to_format:
|
|
||||||
self._tc.LogStdOut(
|
|
||||||
f"Ignoring standard path due to ci.yaml ignore: {a}")
|
|
||||||
rel_file_paths_to_format.remove(a.strip())
|
|
||||||
else:
|
|
||||||
raise UncrustifyInvalidIgnoreStandardPathsException(f"Invalid IgnoreStandardPaths value: {a}")
|
|
||||||
|
|
||||||
# Allow the ci.yaml to specify additional include paths for this package
|
|
||||||
if "AdditionalIncludePaths" in self._package_config:
|
|
||||||
rel_file_paths_to_format.extend(
|
|
||||||
self._package_config["AdditionalIncludePaths"])
|
|
||||||
|
|
||||||
self._abs_file_paths_to_format = []
|
|
||||||
for path in rel_file_paths_to_format:
|
|
||||||
self._abs_file_paths_to_format.extend(
|
|
||||||
[str(path.resolve()) for path in pathlib.Path(self._abs_package_path).rglob(path)])
|
|
||||||
|
|
||||||
if not "SkipGitExclusions" in self._package_config or not self._package_config["SkipGitExclusions"]:
|
|
||||||
# Remove files ignored by git
|
|
||||||
logging.info(
|
|
||||||
f"{self._package_name} file count before git ignore file exclusion: {len(self._abs_file_paths_to_format)}")
|
|
||||||
|
|
||||||
ignored_paths = self._get_git_ignored_paths()
|
|
||||||
self._abs_file_paths_to_format = list(
|
|
||||||
set(self._abs_file_paths_to_format).difference(ignored_paths))
|
|
||||||
|
|
||||||
logging.info(
|
|
||||||
f"{self._package_name} file count after git ignore file exclusion: {len(self._abs_file_paths_to_format)}")
|
|
||||||
|
|
||||||
# Remove files in submodules
|
|
||||||
logging.info(
|
|
||||||
f"{self._package_name} file count before submodule exclusion: {len(self._abs_file_paths_to_format)}")
|
|
||||||
|
|
||||||
submodule_paths = tuple(self._get_git_submodule_paths())
|
|
||||||
for path in submodule_paths:
|
|
||||||
logging.info(f" submodule path: {path}")
|
|
||||||
|
|
||||||
self._abs_file_paths_to_format = [
|
|
||||||
f for f in self._abs_file_paths_to_format if not f.startswith(submodule_paths)]
|
|
||||||
|
|
||||||
logging.info(
|
|
||||||
f"{self._package_name} file count after submodule exclusion: {len(self._abs_file_paths_to_format)}")
|
|
||||||
|
|
||||||
# Sort the files for more consistent results
|
|
||||||
self._abs_file_paths_to_format.sort()
|
|
||||||
|
|
||||||
def _initialize_test_case_output_options(self) -> None:
|
|
||||||
"""
|
|
||||||
Initializes options that influence test case output.
|
|
||||||
"""
|
|
||||||
self._audit_only_mode = False
|
|
||||||
self._output_file_diffs = False
|
|
||||||
|
|
||||||
if "AuditOnly" in self._package_config and self._package_config["AuditOnly"]:
|
|
||||||
self._audit_only_mode = True
|
|
||||||
|
|
||||||
if "OutputFileDiffs" in self._package_config and self._package_config["OutputFileDiffs"]:
|
|
||||||
self._output_file_diffs = True
|
|
||||||
|
|
||||||
def _log_uncrustify_app_info(self) -> None:
|
|
||||||
"""
|
|
||||||
Logs Uncrustify application information.
|
|
||||||
"""
|
|
||||||
self._tc.LogStdOut(f"Found Uncrustify at {self._app_path}")
|
|
||||||
self._tc.LogStdOut(f"Uncrustify version: {self._app_version}")
|
|
||||||
self._tc.LogStdOut('\n')
|
|
||||||
logging.info(f"Found Uncrustify at {self._app_path}")
|
|
||||||
logging.info(f"Uncrustify version: {self._app_version}")
|
|
||||||
logging.info('\n')
|
|
||||||
|
|
||||||
def _process_uncrustify_results(self) -> None:
|
|
||||||
"""
|
|
||||||
Process the results from Uncrustify.
|
|
||||||
|
|
||||||
Determines whether formatting errors are present and logs failures.
|
|
||||||
"""
|
|
||||||
formatted_files = [str(path.resolve()) for path in pathlib.Path(
|
|
||||||
self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')]
|
|
||||||
|
|
||||||
self._formatted_file_error_count = len(formatted_files)
|
|
||||||
|
|
||||||
if self._formatted_file_error_count > 0:
|
|
||||||
self._tc.LogStdError("Files with formatting errors:\n")
|
|
||||||
|
|
||||||
if self._output_file_diffs:
|
|
||||||
logging.info("Calculating file diffs. This might take a while...")
|
|
||||||
|
|
||||||
for formatted_file in formatted_files:
|
|
||||||
pre_formatted_file = formatted_file[:-
|
|
||||||
len(UncrustifyCheck.FORMATTED_FILE_EXTENSION)]
|
|
||||||
logging.error(pre_formatted_file)
|
|
||||||
|
|
||||||
if (self._output_file_diffs or
|
|
||||||
self._file_template_contents is not None or
|
|
||||||
self._func_template_contents is not None):
|
|
||||||
self._tc.LogStdError(
|
|
||||||
f"Formatting errors in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
|
|
||||||
|
|
||||||
with open(formatted_file) as ff:
|
|
||||||
formatted_file_text = ff.read()
|
|
||||||
|
|
||||||
if (self._file_template_contents is not None and
|
|
||||||
self._file_template_contents in formatted_file_text):
|
|
||||||
self._tc.LogStdError(f"File header is missing in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
|
|
||||||
|
|
||||||
if (self._func_template_contents is not None and
|
|
||||||
self._func_template_contents in formatted_file_text):
|
|
||||||
self._tc.LogStdError(f"A function header is missing in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
|
|
||||||
|
|
||||||
if self._output_file_diffs:
|
|
||||||
with open(pre_formatted_file) as pf:
|
|
||||||
pre_formatted_file_text = pf.read()
|
|
||||||
|
|
||||||
for line in difflib.unified_diff(pre_formatted_file_text.split('\n'), formatted_file_text.split('\n'), fromfile=pre_formatted_file, tofile=formatted_file, n=3):
|
|
||||||
self._tc.LogStdError(line)
|
|
||||||
|
|
||||||
self._tc.LogStdError('\n')
|
|
||||||
else:
|
|
||||||
self._tc.LogStdError(pre_formatted_file)
|
|
||||||
|
|
||||||
def _remove_tree(self, dir_path: str, ignore_errors: bool = False) -> None:
|
|
||||||
"""
|
|
||||||
Helper for removing a directory. Over time there have been
|
|
||||||
many private implementations of this due to reliability issues in the
|
|
||||||
shutil implementations. To consolidate on a single function this helper is added.
|
|
||||||
|
|
||||||
On error try to change file attributes. Also add retry logic.
|
|
||||||
|
|
||||||
This function is temporarily borrowed from edk2toollib.utility_functions
|
|
||||||
since the version used in edk2 is not recent enough to include the
|
|
||||||
function.
|
|
||||||
|
|
||||||
This function should be replaced by "RemoveTree" when it is available.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
- dir_path: Path to directory to remove.
|
|
||||||
- ignore_errors: Whether to ignore errors during removal
|
|
||||||
"""
|
|
||||||
|
|
||||||
def _remove_readonly(func, path, _):
|
|
||||||
"""
|
|
||||||
Private function to attempt to change permissions on file/folder being deleted.
|
|
||||||
"""
|
|
||||||
os.chmod(path, os.stat.S_IWRITE)
|
|
||||||
func(path)
|
|
||||||
|
|
||||||
for _ in range(3): # retry up to 3 times
|
|
||||||
try:
|
|
||||||
shutil.rmtree(dir_path, ignore_errors=ignore_errors, onerror=_remove_readonly)
|
|
||||||
except OSError as err:
|
|
||||||
logging.warning(f"Failed to fully remove {dir_path}: {err}")
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
raise RuntimeError(f"Failed to remove {dir_path}")
|
|
||||||
|
|
||||||
def _run_uncrustify(self) -> None:
|
|
||||||
"""
|
|
||||||
Runs Uncrustify for this instance of plugin execution.
|
|
||||||
"""
|
|
||||||
logging.info("Executing Uncrustify. This might take a while...")
|
|
||||||
start_time = timeit.default_timer()
|
|
||||||
self._execute_uncrustify()
|
|
||||||
end_time = timeit.default_timer() - start_time
|
|
||||||
|
|
||||||
execution_summary = f"Uncrustify executed against {len(self._abs_file_paths_to_format)} files in {self._package_name} in {end_time:.2f} seconds.\n"
|
|
||||||
|
|
||||||
self._tc.LogStdOut(execution_summary)
|
|
||||||
logging.info(execution_summary)
|
|
||||||
|
|
||||||
if self._app_exit_code != 0 and self._app_exit_code != 1:
|
|
||||||
raise UncrustifyAppExecutionException(
|
|
||||||
f"Error {str(self._app_exit_code)} returned from Uncrustify:\n\n{str(self._app_output)}")
|
|
@@ -1,9 +0,0 @@
|
|||||||
/** @file
|
|
||||||
Brief description of the file's purpose.
|
|
||||||
|
|
||||||
Detailed description of the file's contents and other useful
|
|
||||||
information for a person viewing the file for the first time.
|
|
||||||
|
|
||||||
<<Copyright>>
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
**/
|
|
@@ -1,15 +0,0 @@
|
|||||||
/**
|
|
||||||
Brief description of this function's purpose.
|
|
||||||
|
|
||||||
Follow it immediately with the detailed description.
|
|
||||||
|
|
||||||
@param[in] Arg1 Description of Arg1.
|
|
||||||
@param[in] Arg2 Description of Arg2 This is complicated and requires
|
|
||||||
multiple lines to describe.
|
|
||||||
@param[out] Arg3 Description of Arg3.
|
|
||||||
@param[in, out] Arg4 Description of Arg4.
|
|
||||||
|
|
||||||
@retval VAL_ONE Description of what VAL_ONE signifies.
|
|
||||||
@retval OTHER This is the only other return value. If there were other
|
|
||||||
return values, they would be listed.
|
|
||||||
**/
|
|
@@ -1,462 +0,0 @@
|
|||||||
## @file
|
|
||||||
# Uncrustify Configuration File for EDK II C Code
|
|
||||||
#
|
|
||||||
# Coding Standard: https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/
|
|
||||||
#
|
|
||||||
# This configuration file is meant to be a "best attempt" to align with the
|
|
||||||
# definitions in the EDK II C Coding Standards Specification.
|
|
||||||
#
|
|
||||||
# Copyright (c) Microsoft Corporation.
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
##
|
|
||||||
|
|
||||||
# Force UTF-8 encoding (no UTF-16)
|
|
||||||
enable_digraphs = false
|
|
||||||
utf8_byte = false
|
|
||||||
utf8_force = true
|
|
||||||
|
|
||||||
# Code width / line splitting
|
|
||||||
#code_width =120 # TODO: This causes non-deterministic behaviour in some cases when code wraps
|
|
||||||
ls_code_width =false
|
|
||||||
ls_for_split_full =true
|
|
||||||
ls_func_split_full =true
|
|
||||||
pos_comma =trail
|
|
||||||
|
|
||||||
# 5.1.7 All files must end with CRLF
|
|
||||||
newlines = crlf
|
|
||||||
|
|
||||||
# 5.1.2 Do not use tab characters
|
|
||||||
|
|
||||||
cmt_convert_tab_to_spaces = true # Whether to convert all tabs to spaces in comments. If false, tabs in
|
|
||||||
# comments are left alone, unless used for indenting.
|
|
||||||
indent_columns = 2 # Number of spaces for indentation
|
|
||||||
indent_with_tabs = 0 # Do not use TAB characters
|
|
||||||
string_replace_tab_chars = true # Replace TAB with SPACE
|
|
||||||
# Note: This will break .robot files but is needed for edk2 style
|
|
||||||
|
|
||||||
# 5.2.1.1 There shall be only one statement on a line (statement ends with ;)
|
|
||||||
nl_multi_line_cond = true # Add a newline between ')' and '{' if the ')' is on a different line than
|
|
||||||
# the if/for/etc.
|
|
||||||
nl_after_semicolon = true # Whether to add a newline after semicolons, except in 'for' statements.
|
|
||||||
|
|
||||||
# 5.2.1.3 An open brace '{' goes on the same line as the closing parenthesis ')' of simple predicate expressions
|
|
||||||
mod_full_brace_do = add # Add or remove braces on a single-line 'do' statement.
|
|
||||||
mod_full_brace_for = add
|
|
||||||
mod_full_brace_function = add # Add or remove braces on a single-line function definition.
|
|
||||||
mod_full_brace_if = add # Add or remove braces on a single-line 'if' statement. Braces will not be
|
|
||||||
# removed if the braced statement contains an 'else'.
|
|
||||||
mod_full_brace_if_chain = false
|
|
||||||
mod_full_brace_while = add
|
|
||||||
|
|
||||||
# 5.2.1.4 A close brace '}' always goes at the beginning of the last line of the body
|
|
||||||
eat_blanks_after_open_brace = true
|
|
||||||
eat_blanks_before_close_brace = true # Whether to remove blank lines before '}'.
|
|
||||||
|
|
||||||
# 5.2.2.2 Always put space before and after binary operators.
|
|
||||||
sp_assign = add # Add or remove space around assignment operator '=', '+=', etc.
|
|
||||||
sp_assign_default = add
|
|
||||||
sp_bool = add # Add or remove space around boolean operators '&&' and '||'.
|
|
||||||
sp_compare = add # Add or remove space around compare operator '<', '>', '==', etc.
|
|
||||||
|
|
||||||
# 5.2.2.3 Do not put space between unary operators and their object
|
|
||||||
sp_addr = remove # A or remove space after the '&' (address-of) unary operator.
|
|
||||||
sp_incdec = remove # Add or remove space between '++' and '--' the word to which it is being
|
|
||||||
# applied, as in '(--x)' or 'y++;'.
|
|
||||||
sp_inv = remove # Add or remove space after the '~' (invert) unary operator.
|
|
||||||
sp_not = remove # Add or remove space after the '!' (not) unary operator.
|
|
||||||
sp_sign = remove # Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'.
|
|
||||||
|
|
||||||
# 5.2.2.4 Subsequent lines of multi-line function calls should line up two spaces from the beginning of the function
|
|
||||||
# name
|
|
||||||
nl_func_call_args_multi_line = true # Whether to add a newline after each ',' in a function call if '(' and ')'
|
|
||||||
# are in different lines.
|
|
||||||
nl_func_call_args_multi_line_ignore_closures = false
|
|
||||||
|
|
||||||
# - Indent each argument 2 spaces from the start of the function name. If a
|
|
||||||
# function is called through a structure or union member, of type
|
|
||||||
# pointer-to-function, then indent each argument 2 spaces from the start of the
|
|
||||||
# member name.
|
|
||||||
indent_func_call_edk2_style = true # Use EDK2 indentation style for function calls (**CUSTOM SETTING**)
|
|
||||||
indent_paren_after_func_call = true # Whether to indent the open parenthesis of a function call, if the
|
|
||||||
# parenthesis is on its own line.
|
|
||||||
|
|
||||||
# - Align the close parenthesis with the start of the last argument
|
|
||||||
indent_paren_close = 0 # How to indent a close parenthesis after a newline.
|
|
||||||
# (0: Body, 1: Openparenthesis, 2: Brace level)
|
|
||||||
|
|
||||||
|
|
||||||
# 5.2.2.5 Always put space after commas or semicolons that separate items
|
|
||||||
sp_after_comma = force # Add or remove space after ',', i.e. 'a,b' vs. 'a, b'.
|
|
||||||
sp_before_comma = remove # Add or remove space before ','.
|
|
||||||
|
|
||||||
# 5.2.2.6 Always put space before an open parenthesis
|
|
||||||
sp_after_sparen = add # Add or remove space after ')' of control statements.
|
|
||||||
sp_attribute_paren = add # Add or remove space between '__attribute__' and '('.
|
|
||||||
sp_before_sparen = force # Add or remove space before '(' of control statements
|
|
||||||
# ('if', 'for', 'switch', 'while', etc.).
|
|
||||||
sp_defined_paren = force # Add or remove space between 'defined' and '(' in '#if defined (FOO)'.
|
|
||||||
sp_func_call_paren = force # Add or remove space between function name and '(' on function calls.
|
|
||||||
sp_func_call_paren_empty = force # Add or remove space between function name and '()' on function calls
|
|
||||||
# without parameters. If set to ignore (the default), sp_func_call_paren is
|
|
||||||
# used.
|
|
||||||
sp_func_def_paren = add # Add or remove space between alias name and '(' of a non-pointer function
|
|
||||||
# type typedef.
|
|
||||||
sp_func_proto_paren = add # Add or remove space between function name and '()' on function declaration
|
|
||||||
sp_sizeof_paren = force # Add or remove space between 'sizeof' and '('.
|
|
||||||
sp_type_func = add # Add or remove space between return type and function name. A minimum of 1
|
|
||||||
# is forced except for pointer return types.
|
|
||||||
|
|
||||||
# Not specified, but also good style to remove spaces inside parentheses (Optional)
|
|
||||||
sp_cparen_oparen = remove # Add or remove space between back-to-back parentheses, i.e. ')(' vs. ') ('.
|
|
||||||
sp_inside_fparen = remove # Add or remove space inside function '(' and ')'.
|
|
||||||
sp_inside_fparens = remove # Add or remove space inside empty function '()'.
|
|
||||||
sp_inside_paren = remove # Add or remove space inside '(' and ')'.
|
|
||||||
sp_inside_paren_cast = remove # Add or remove spaces inside cast parentheses. '(int)x'
|
|
||||||
sp_inside_square = remove # Add or remove space inside a non-empty '[' and ']'.
|
|
||||||
sp_paren_paren = remove # Add or remove space between nested parentheses, i.e. '((' vs. ') )'.
|
|
||||||
sp_square_fparen = remove # Add or remove space between ']' and '(' when part of a function call.
|
|
||||||
|
|
||||||
# 5.2.2.7 Put a space before an open brace if it is not on its own line
|
|
||||||
sp_do_brace_open = force # Add or remove space between 'do' and '{'.
|
|
||||||
sp_paren_brace = force # Add or remove space between ')' and '{'.
|
|
||||||
sp_sparen_brace = force # Add or remove space between ')' and '{' of of control statements.
|
|
||||||
|
|
||||||
# 5.2.2.8 Do not put spaces around structure member and pointer operators
|
|
||||||
sp_after_byref = remove # Add or remove space after reference sign '&', if followed by a word.
|
|
||||||
sp_before_byref = add # Add or remove space before a reference sign '&'.
|
|
||||||
sp_deref = remove # Add or remove space after the '*' (dereference) unary operator. This does
|
|
||||||
# not affect the spacing after a '*' that is part of a type.
|
|
||||||
sp_member = remove # Add or remove space around the '.' or '->' operators.
|
|
||||||
|
|
||||||
# 5.2.2.9 Do not put spaces before open brackets of array subscripts
|
|
||||||
sp_before_square = remove # Add or remove space before '[' (except '[]').
|
|
||||||
sp_before_squares = remove # Add or remove space before '[]'.
|
|
||||||
sp_before_vardef_square = remove # Add or remove space before '[' for a variable definition.
|
|
||||||
|
|
||||||
# 5.2.2.10 Use extra parentheses rather than depending on in-depth knowledge of the order of precedence of C
|
|
||||||
mod_full_paren_if_bool = true # Whether to fully parenthesize Boolean expressions in 'while' and 'if'
|
|
||||||
# statement, as in 'if (a && b > c)' => 'if (a && (b > c))'.
|
|
||||||
|
|
||||||
# 5.2.2.11 Align a continuation line with the part of the line that it continues.
|
|
||||||
use_indent_continue_only_once = true
|
|
||||||
|
|
||||||
# Additional '{}' bracing rules (Optional)
|
|
||||||
# NOTE - The style guide specifies two different styles for braces,
|
|
||||||
# so these are ignored for now to allow developers some flexibility.
|
|
||||||
nl_after_brace_close = true # Whether to add a newline after '}'. Does not apply if followed by a
|
|
||||||
# necessary ';'.
|
|
||||||
nl_brace_else = remove # Add or remove newline between '}' and 'else'.
|
|
||||||
nl_brace_while = remove # Add or remove newline between '}' and 'while' of 'do' statement.
|
|
||||||
nl_do_brace = remove # Add or remove newline between 'do' and '{'.
|
|
||||||
nl_else_brace = remove # Add or remove newline between 'else' and '{'.
|
|
||||||
nl_else_if = remove # Add or remove newline between 'else' and 'if'.
|
|
||||||
nl_elseif_brace = remove # Add or remove newline between 'else if' and '{'.
|
|
||||||
nl_enum_brace = remove # Add or remove newline between 'enum' and '{'.
|
|
||||||
nl_fcall_brace = remove # Add or remove newline between a function call's ')' and '{',
|
|
||||||
# as in 'list_for_each(item, &list) { }'.
|
|
||||||
nl_for_brace = remove # Add or remove newline between 'for' and '{'.
|
|
||||||
nl_if_brace = remove # Add or remove newline between 'if' and '{'.
|
|
||||||
nl_struct_brace = remove # Add or remove newline between 'struct and '{'.
|
|
||||||
nl_switch_brace = remove # Add or remove newline between 'switch' and '{'.
|
|
||||||
nl_union_brace = remove # Add or remove newline between 'union' and '{'.
|
|
||||||
nl_while_brace = remove # Add or remove newline between 'while' and '{'.
|
|
||||||
|
|
||||||
# Additional whitespace rules (Optional)
|
|
||||||
sp_after_ptr_star = remove # Add or remove space after pointer star '*', if followed by a word.
|
|
||||||
# Useful when paired with align_var_def_star_style==2
|
|
||||||
sp_after_ptr_star_func = remove # Add or remove space after a pointer star '*', if followed by a function
|
|
||||||
# prototype or function definition.
|
|
||||||
sp_after_semi = remove # Add or remove space after ';', except when followed by a comment.
|
|
||||||
sp_before_case_colon = remove # Add or remove space before case ':'.
|
|
||||||
sp_before_ptr_star = add # Add or remove space before pointer star '*'.
|
|
||||||
sp_before_ptr_star_func = add # Add or remove space before a pointer star '*', if followed by a function
|
|
||||||
# prototype or function definition.
|
|
||||||
sp_before_semi = remove # Add or remove space before ';'
|
|
||||||
sp_before_semi_for = remove # Add or remove space before ';' in non-empty 'for' statements.
|
|
||||||
sp_before_semi_for_empty = add # Add or remove space before a semicolon of an empty part of a for statement
|
|
||||||
sp_between_ptr_star = remove # Add or remove space between pointer stars '*'. (ie, 'VOID **')
|
|
||||||
sp_brace_close_while = force # Add or remove space between '}' and 'while'.
|
|
||||||
|
|
||||||
sp_after_cast = remove
|
|
||||||
sp_after_type = add
|
|
||||||
sp_balance_nested_parens = false
|
|
||||||
sp_before_nl_cont = add
|
|
||||||
sp_before_square_asm_block = ignore
|
|
||||||
sp_before_unnamed_byref = add
|
|
||||||
sp_brace_brace = ignore
|
|
||||||
sp_brace_else = force
|
|
||||||
sp_brace_typedef = add
|
|
||||||
sp_case_label = force
|
|
||||||
sp_cmt_cpp_doxygen = true
|
|
||||||
sp_cond_colon = add
|
|
||||||
sp_cond_question = add
|
|
||||||
sp_cpp_cast_paren = force
|
|
||||||
sp_else_brace = force
|
|
||||||
sp_endif_cmt = force
|
|
||||||
sp_enum_assign = add
|
|
||||||
sp_inside_braces = force
|
|
||||||
sp_inside_braces_empty = force
|
|
||||||
sp_inside_braces_enum = force
|
|
||||||
sp_inside_braces_struct = force
|
|
||||||
sp_pp_concat = add
|
|
||||||
sp_pp_stringify = add
|
|
||||||
sp_return_paren = add
|
|
||||||
sp_special_semi = force
|
|
||||||
sp_while_paren_open = force
|
|
||||||
|
|
||||||
# Additional Indentation Rules
|
|
||||||
indent_access_spec = 1
|
|
||||||
indent_access_spec_body = false
|
|
||||||
indent_align_assign = true
|
|
||||||
indent_align_string = true
|
|
||||||
indent_bool_paren = true
|
|
||||||
indent_brace_parent = false
|
|
||||||
indent_braces = false
|
|
||||||
indent_braces_no_class = false
|
|
||||||
indent_braces_no_func = true
|
|
||||||
indent_braces_no_struct = false
|
|
||||||
indent_class = false
|
|
||||||
indent_class_colon = false
|
|
||||||
indent_cmt_with_tabs = false # Whether to indent comments that are not at a brace level with tabs on
|
|
||||||
# a tabstop. Requires indent_with_tabs=2. If false, will use spaces.
|
|
||||||
indent_col1_comment = true
|
|
||||||
indent_col1_multi_string_literal= true
|
|
||||||
indent_comma_paren = true
|
|
||||||
indent_else_if = true
|
|
||||||
indent_extern = false
|
|
||||||
indent_first_bool_expr = true
|
|
||||||
|
|
||||||
indent_func_def_param_paren_pos_threshold = 0
|
|
||||||
indent_func_param_double = false
|
|
||||||
indent_func_proto_param = true
|
|
||||||
indent_ignore_asm_block = true
|
|
||||||
indent_label = 1
|
|
||||||
indent_member = 2
|
|
||||||
indent_namespace = false
|
|
||||||
indent_param = 2
|
|
||||||
indent_paren_nl = false
|
|
||||||
indent_paren_open_brace = false
|
|
||||||
indent_preserve_sql = false
|
|
||||||
indent_relative_single_line_comments = false
|
|
||||||
indent_sing_line_comments = 0
|
|
||||||
indent_single_newlines = false
|
|
||||||
indent_square_nl = false
|
|
||||||
indent_switch_case = 2
|
|
||||||
indent_template_param = true
|
|
||||||
indent_var_def_blk = 0
|
|
||||||
indent_var_def_cont = false
|
|
||||||
|
|
||||||
# Tidy-up rules (Optional)
|
|
||||||
mod_move_case_break = true # Whether to move a 'break' that appears after a fully braced 'case'
|
|
||||||
# before the close brace, as in 'case X: { ... } break;' =>
|
|
||||||
# 'case X: { ... break; }'.
|
|
||||||
mod_pawn_semicolon = false
|
|
||||||
mod_remove_empty_return = false # Whether to remove a void 'return;' that appears as the last statement
|
|
||||||
# in a function.
|
|
||||||
mod_remove_extra_semicolon = true
|
|
||||||
mod_sort_import = false
|
|
||||||
mod_sort_include = false
|
|
||||||
mod_sort_using = false
|
|
||||||
nl_after_case = false # Whether to add a newline after a 'case' statement.
|
|
||||||
nl_end_of_file = force # Add or remove newline at the end of the file.
|
|
||||||
nl_end_of_file_min = 1 # The minimum number of newlines at the end of the file
|
|
||||||
nl_max = 2 # The maximum number of consecutive newlines (3 = 2 blank lines).
|
|
||||||
nl_start_of_file = remove # Add or remove newlines at the start of the file.
|
|
||||||
|
|
||||||
# Code alignment rules (Optional)
|
|
||||||
align_asm_colon = false
|
|
||||||
align_assign_span = 1 # The span for aligning on '=' in assignments.
|
|
||||||
align_assign_thresh = 0
|
|
||||||
align_edk2_style = true # Whether to apply edk2-specific alignment formatting
|
|
||||||
align_enum_equ_span = 1 # The span for aligning on '=' in enums.
|
|
||||||
align_func_params = true # Whether to align variable definitions in prototypes and functions.
|
|
||||||
align_func_params_gap = 2
|
|
||||||
align_func_params_span = 2 # The span for aligning parameter definitions in function on parameter name.
|
|
||||||
align_func_params_thresh = 0
|
|
||||||
align_func_proto_span = 0
|
|
||||||
align_keep_tabs = false
|
|
||||||
align_left_shift = false
|
|
||||||
align_mix_var_proto = false
|
|
||||||
align_nl_cont = false
|
|
||||||
align_oc_decl_colon = false
|
|
||||||
align_on_operator = false
|
|
||||||
align_on_tabstop = false
|
|
||||||
align_pp_define_gap = 2
|
|
||||||
align_pp_define_span = 1
|
|
||||||
align_right_cmt_at_col = 0 # Align trailing comment at or beyond column N; 'pulls in' comments as
|
|
||||||
# a bonus side effect (0=ignore)
|
|
||||||
align_right_cmt_gap = 0 # If a trailing comment is more than this number of columns away from the
|
|
||||||
# text it follows,
|
|
||||||
# it will qualify for being aligned. This has to be > 0 to do anything.
|
|
||||||
align_right_cmt_mix = false # If aligning comments, mix with comments after '}' and #endif with less
|
|
||||||
# than 3 spaces before the comment
|
|
||||||
align_right_cmt_same_level = true # Whether to only align trailing comments that are at the same brace level.
|
|
||||||
align_right_cmt_span = 2 # The span for aligning comments that end lines.
|
|
||||||
align_same_func_call_params = false
|
|
||||||
align_single_line_brace = true
|
|
||||||
align_single_line_func = true
|
|
||||||
align_struct_init_span = 1 # The span for aligning struct initializer values.
|
|
||||||
align_typedef_amp_style = 1
|
|
||||||
align_typedef_func = 1 # How to align typedef'd functions with other typedefs.
|
|
||||||
# (0: No align, 1: Align open paranthesis, 2: Align function type name)
|
|
||||||
align_typedef_gap = 2
|
|
||||||
align_typedef_span = 1 # The span for aligning single-line typedefs.
|
|
||||||
align_typedef_star_style = 1
|
|
||||||
align_var_def_amp_style = 1
|
|
||||||
align_var_def_attribute = true
|
|
||||||
align_var_def_colon = true # Whether to align the colon in struct bit fields.
|
|
||||||
align_var_def_gap = 2 # The gap (minimum spacing for aligned items) for variable definitions.
|
|
||||||
align_var_def_inline = false
|
|
||||||
align_var_def_span = 1 # The span (lines needed to align) for aligning variable definitions.
|
|
||||||
align_var_def_star_style = 1 # How to consider (or treat) the '*' in the alignment of variable
|
|
||||||
# definitions.
|
|
||||||
# 0: Part of the type 'void * foo;' (default)
|
|
||||||
# 1: Part of the variable 'void *foo;'
|
|
||||||
# 2: Dangling 'void *foo;'
|
|
||||||
# (Note - should also set sp_after_ptr_star=remove)
|
|
||||||
align_var_struct_gap = 4
|
|
||||||
align_var_struct_span = 8 # The span for aligning struct/union member definitions.
|
|
||||||
align_var_struct_thresh = 0
|
|
||||||
align_with_tabs = false
|
|
||||||
|
|
||||||
# Comment formatting
|
|
||||||
cmt_align_doxygen_javadoc_tags = true # Whether to align doxygen javadoc-style tags ('@param', '@return', etc.)
|
|
||||||
# TODO: Eats '[' in '[in]'
|
|
||||||
cmt_c_group = false
|
|
||||||
cmt_c_nl_end = true # Whether to add a newline before the closing '*/' of the combined c-comment.
|
|
||||||
cmt_c_nl_start = true
|
|
||||||
cmt_cpp_group = false
|
|
||||||
cmt_cpp_nl_end = true
|
|
||||||
cmt_cpp_nl_start = true
|
|
||||||
cmt_cpp_to_c = false
|
|
||||||
cmt_indent_multi = false # Whether to apply changes to multi-line comments, including cmt_width,
|
|
||||||
# keyword substitution and leading chars.
|
|
||||||
cmt_insert_before_preproc = false
|
|
||||||
#cmt_insert_file_header = default_file_header.txt
|
|
||||||
#cmt_insert_func_header = default_function_header.txt
|
|
||||||
cmt_multi_check_last = false
|
|
||||||
cmt_multi_first_len_minimum = 2
|
|
||||||
cmt_reflow_mode = 1 # How to reflow comments.
|
|
||||||
# (0:No reflow, 1:No touching at all, 2: Full reflow)
|
|
||||||
cmt_sp_after_star_cont = 0 # The number of spaces to insert after the star on subsequent comment lines.
|
|
||||||
cmt_sp_before_star_cont = 0 # The number of spaces to insert at the start of subsequent comment lines.
|
|
||||||
cmt_star_cont = false # Whether to put a star on subsequent comment lines.
|
|
||||||
cmt_width = 120 # Try to wrap comments at N columns.
|
|
||||||
sp_cmt_cpp_start = add # Add or remove space after the opening of a C++ comment, as in
|
|
||||||
# '// <here> A'. NOTE: Breaks indentation within comments.
|
|
||||||
|
|
||||||
# Function definitions / declarations
|
|
||||||
indent_func_call_param = false # Whether to indent continued function call parameters one indent level,
|
|
||||||
# rather than aligning parameters under the open parenthesis.
|
|
||||||
indent_func_class_param = false # Whether to indent continued function call declaration one indent level,
|
|
||||||
# rather than aligning parameters under the open parenthesis.
|
|
||||||
indent_func_ctor_var_param = false # Whether to indent continued class variable constructors one indent level,
|
|
||||||
# rather than aligning parameters under the open parenthesis.
|
|
||||||
indent_func_def_param = true # Whether to indent continued function definition parameters one indent
|
|
||||||
# level, rather than aligning parameters under the open parenthesis.
|
|
||||||
nl_fdef_brace = add # Add or remove newline between function signature and '{'.
|
|
||||||
nl_func_call_end_multi_line = true # Whether to add a newline before ')' in a function call if '(' and ')' are
|
|
||||||
# in different lines.
|
|
||||||
nl_func_call_paren = remove # Add or remove newline between a function name and the opening '(' in the
|
|
||||||
# call.
|
|
||||||
nl_func_call_start_multi_line = true # Whether to add a newline after '(' in a function call if '(' and ')' are
|
|
||||||
# in different lines.
|
|
||||||
nl_func_decl_args = force # Add or remove newline after each ',' in a function declaration.
|
|
||||||
nl_func_decl_empty = add # Add or remove newline between '()' in a function declaration.
|
|
||||||
nl_func_def_args = force # Add or remove newline after each ',' in a function definition.
|
|
||||||
nl_func_def_empty = add # Add or remove newline between '()' in a function definition.
|
|
||||||
nl_func_def_paren = remove # Add or remove newline between a function name and the opening '('
|
|
||||||
# in the definition.
|
|
||||||
nl_func_paren = remove # Add or remove newline between a function name and the opening '(' in
|
|
||||||
# the declaration.
|
|
||||||
nl_func_type_name = add # Add or remove newline between return type and function name in a function
|
|
||||||
# definition.
|
|
||||||
sp_fparen_brace = force # Add or remove space between ')' and '{' of function.
|
|
||||||
use_indent_func_call_param = true # indent_func_call_param will be used
|
|
||||||
|
|
||||||
# Additional Newline Rules
|
|
||||||
nl_after_brace_open = true # Whether to add a newline after '{'. This also adds a newline
|
|
||||||
# before the matching '}'.
|
|
||||||
nl_after_brace_open_cmt = true # Whether to add a newline between the open brace and a
|
|
||||||
# trailing single-line comment.
|
|
||||||
# Requires nl_after_brace_open = true.
|
|
||||||
nl_after_do = add # Add or remove blank line after 'do/while' statement.
|
|
||||||
nl_after_for = add # Add or remove blank line after 'for' statement.
|
|
||||||
nl_after_func_body = 2 # The number of newlines after '}' of a multi-line function body
|
|
||||||
nl_after_func_body_one_liner = 2
|
|
||||||
nl_after_func_proto = 2
|
|
||||||
nl_after_func_proto_group = 2
|
|
||||||
nl_after_if = add
|
|
||||||
nl_after_multiline_comment = false
|
|
||||||
nl_after_return = false
|
|
||||||
nl_after_struct = 2
|
|
||||||
nl_after_switch = add
|
|
||||||
nl_after_vbrace_close = true
|
|
||||||
nl_after_vbrace_open = true
|
|
||||||
nl_after_vbrace_open_empty = true
|
|
||||||
nl_after_while = add
|
|
||||||
nl_assign_leave_one_liners = true
|
|
||||||
nl_before_block_comment = 2
|
|
||||||
nl_before_case = false
|
|
||||||
nl_before_do = ignore
|
|
||||||
nl_before_for = ignore
|
|
||||||
nl_before_if = ignore
|
|
||||||
nl_before_switch = ignore
|
|
||||||
nl_before_while = ignore
|
|
||||||
nl_before_whole_file_ifdef = 2
|
|
||||||
nl_brace_brace = force
|
|
||||||
nl_brace_struct_var = remove
|
|
||||||
nl_case_colon_brace = add
|
|
||||||
nl_class_leave_one_liners = false
|
|
||||||
nl_collapse_empty_body = false
|
|
||||||
nl_comment_func_def = 1
|
|
||||||
nl_create_for_one_liner = false
|
|
||||||
nl_create_if_one_liner = false
|
|
||||||
nl_create_while_one_liner = false
|
|
||||||
nl_define_macro = false
|
|
||||||
nl_ds_struct_enum_close_brace = true
|
|
||||||
nl_ds_struct_enum_cmt = false
|
|
||||||
nl_enum_leave_one_liners = false
|
|
||||||
nl_func_decl_end = add
|
|
||||||
nl_func_decl_start = add
|
|
||||||
nl_func_def_end = add
|
|
||||||
nl_func_def_start = add
|
|
||||||
nl_func_leave_one_liners = false
|
|
||||||
nl_func_proto_type_name = add
|
|
||||||
nl_func_var_def_blk = 1
|
|
||||||
nl_getset_leave_one_liners = false
|
|
||||||
nl_if_leave_one_liners = false
|
|
||||||
nl_multi_line_define = false
|
|
||||||
nl_squeeze_ifdef = false
|
|
||||||
nl_var_def_blk_end = 0
|
|
||||||
nl_var_def_blk_start = 0
|
|
||||||
|
|
||||||
# Preprocessor Rules
|
|
||||||
pp_define_at_level = true
|
|
||||||
pp_if_indent_code = false
|
|
||||||
pp_indent_func_def = false
|
|
||||||
pp_indent_extern = false
|
|
||||||
pp_ignore_define_body = true # Workaround: Turn off processing for #define body
|
|
||||||
# (current rules do not work for some defines)
|
|
||||||
pp_indent = add
|
|
||||||
pp_indent_at_level = true
|
|
||||||
pp_indent_count = 2
|
|
||||||
pp_indent_if = 2
|
|
||||||
pp_indent_region = 2
|
|
||||||
pp_region_indent_code = false
|
|
||||||
pp_space = remove
|
|
||||||
|
|
||||||
#
|
|
||||||
# The tokens below are assigned specific types so they are always recognized properly.
|
|
||||||
#
|
|
||||||
|
|
||||||
# Explicitly define EDK II qualifiers
|
|
||||||
set QUALIFIER CONST
|
|
||||||
set QUALIFIER EFIAPI
|
|
||||||
set QUALIFIER IN
|
|
||||||
set QUALIFIER OPTIONAL
|
|
||||||
set QUALIFIER OUT
|
|
||||||
|
|
||||||
# Explicitly define EDK II types
|
|
||||||
set TYPE EFI_STATUS
|
|
||||||
set TYPE VOID
|
|
@@ -1,16 +0,0 @@
|
|||||||
## @file
|
|
||||||
# Downloads the Uncrustify application from a Project Mu NuGet package.
|
|
||||||
#
|
|
||||||
# Copyright (c) Microsoft Corporation.
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
##
|
|
||||||
{
|
|
||||||
"id": "uncrustify-ci-1",
|
|
||||||
"scope": "cibuild",
|
|
||||||
"type": "nuget",
|
|
||||||
"name": "mu-uncrustify-release",
|
|
||||||
"source": "https://pkgs.dev.azure.com/projectmu/Uncrustify/_packaging/mu_uncrustify/nuget/v3/index.json",
|
|
||||||
"version": "73.0.3",
|
|
||||||
"flags": ["set_shell_var", "host_specific"],
|
|
||||||
"var_name": "UNCRUSTIFY_CI_PATH"
|
|
||||||
}
|
|
@@ -1,11 +0,0 @@
|
|||||||
## @file
|
|
||||||
# CiBuildPlugin used to check coding standard compliance of EDK II style C source code
|
|
||||||
#
|
|
||||||
# Copyright (c) Microsoft Corporation.
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
##
|
|
||||||
{
|
|
||||||
"scope": "cibuild",
|
|
||||||
"name": "Uncrustify Coding Standard Test",
|
|
||||||
"module": "UncrustifyCheck"
|
|
||||||
}
|
|
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
| Package | Windows VS2019 (IA32/X64)| Ubuntu GCC (IA32/X64/ARM/AARCH64) | Known Issues |
|
| Package | Windows VS2019 (IA32/X64)| Ubuntu GCC (IA32/X64/ARM/AARCH64) | Known Issues |
|
||||||
| :---- | :----- | :---- | :--- |
|
| :---- | :----- | :---- | :--- |
|
||||||
| ArmPkg | | :heavy_check_mark: |
|
| ArmPkg |
|
||||||
| ArmPlatformPkg | | :heavy_check_mark: |
|
| ArmPlatformPkg |
|
||||||
| ArmVirtPkg | SEE PACKAGE README | SEE PACKAGE README |
|
| ArmVirtPkg | SEE PACKAGE README | SEE PACKAGE README |
|
||||||
| CryptoPkg | :heavy_check_mark: | :heavy_check_mark: | Spell checking in audit mode
|
| CryptoPkg | :heavy_check_mark: | :heavy_check_mark: | Spell checking in audit mode
|
||||||
| DynamicTablesPkg | | :heavy_check_mark: |
|
| DynamicTablesPkg |
|
||||||
| EmbeddedPkg |
|
| EmbeddedPkg |
|
||||||
| EmulatorPkg | SEE PACKAGE README | SEE PACKAGE README | Spell checking in audit mode
|
| EmulatorPkg | SEE PACKAGE README | SEE PACKAGE README | Spell checking in audit mode
|
||||||
| FatPkg | :heavy_check_mark: | :heavy_check_mark: |
|
| FatPkg | :heavy_check_mark: | :heavy_check_mark: |
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
| ShellPkg | :heavy_check_mark: | :heavy_check_mark: | Spell checking in audit mode, 3 modules are not being built by DSC
|
| ShellPkg | :heavy_check_mark: | :heavy_check_mark: | Spell checking in audit mode, 3 modules are not being built by DSC
|
||||||
| SignedCapsulePkg |
|
| SignedCapsulePkg |
|
||||||
| SourceLevelDebugPkg |
|
| SourceLevelDebugPkg |
|
||||||
| StandaloneMmPkg | :heavy_check_mark: | :heavy_check_mark: |
|
| StandaloneMmPkg |
|
||||||
| UefiCpuPkg | :heavy_check_mark: | :heavy_check_mark: | Spell checking in audit mode, 2 binary modules not being built by DSC
|
| UefiCpuPkg | :heavy_check_mark: | :heavy_check_mark: | Spell checking in audit mode, 2 binary modules not being built by DSC
|
||||||
| UefiPayloadPkg |
|
| UefiPayloadPkg |
|
||||||
| UnitTestFrameworkPkg | :heavy_check_mark: | :heavy_check_mark: |
|
| UnitTestFrameworkPkg | :heavy_check_mark: | :heavy_check_mark: |
|
||||||
@@ -254,20 +254,6 @@ Install
|
|||||||
|
|
||||||
More cspell info: https://github.com/streetsidesoftware/cspell
|
More cspell info: https://github.com/streetsidesoftware/cspell
|
||||||
|
|
||||||
### License Checking - LicenseCheck
|
|
||||||
|
|
||||||
Scans all new added files in a package to make sure code is contributed under
|
|
||||||
BSD-2-Clause-Patent.
|
|
||||||
|
|
||||||
### Ecc tool - EccCheck
|
|
||||||
|
|
||||||
Run the Ecc tool on the package. The Ecc tool is available in the BaseTools
|
|
||||||
package. It checks that the code complies to the EDKII coding standard.
|
|
||||||
|
|
||||||
### Coding Standard Compliance - UncrustifyCheck
|
|
||||||
|
|
||||||
Runs the Uncrustify application to check for coding standard compliance issues.
|
|
||||||
|
|
||||||
## PyTool Scopes
|
## PyTool Scopes
|
||||||
|
|
||||||
Scopes are how the PyTool ext_dep, path_env, and plugins are activated. Meaning
|
Scopes are how the PyTool ext_dep, path_env, and plugins are activated. Meaning
|
||||||
|
@@ -1,243 +0,0 @@
|
|||||||
## @file
|
|
||||||
# CI configuration for ArmPkg
|
|
||||||
#
|
|
||||||
# Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
##
|
|
||||||
{
|
|
||||||
## options defined .pytool/Plugin/LicenseCheck
|
|
||||||
"LicenseCheck": {
|
|
||||||
"IgnoreFiles": []
|
|
||||||
},
|
|
||||||
|
|
||||||
"EccCheck": {
|
|
||||||
## Exception sample looks like below:
|
|
||||||
## "ExceptionList": [
|
|
||||||
## "<ErrorID>", "<KeyWord>"
|
|
||||||
## ]
|
|
||||||
"ExceptionList": [
|
|
||||||
],
|
|
||||||
## Both file path and directory path are accepted.
|
|
||||||
"IgnoreFiles": [
|
|
||||||
"Library/ArmSoftFloatLib/berkeley-softfloat-3",
|
|
||||||
"Library/ArmSoftFloatLib/ArmSoftFloatLib.c",
|
|
||||||
"Library/CompilerIntrinsicsLib",
|
|
||||||
"Universal/Smbios/SmbiosMiscDxe"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
|
|
||||||
## options defined .pytool/Plugin/CompilerPlugin
|
|
||||||
"CompilerPlugin": {
|
|
||||||
"DscPath": "ArmPkg.dsc"
|
|
||||||
},
|
|
||||||
|
|
||||||
## options defined .pytool/Plugin/HostUnitTestCompilerPlugin
|
|
||||||
"HostUnitTestCompilerPlugin": {
|
|
||||||
"DscPath": "" # Don't support this test
|
|
||||||
},
|
|
||||||
|
|
||||||
## options defined .pytool/Plugin/CharEncodingCheck
|
|
||||||
"CharEncodingCheck": {
|
|
||||||
"IgnoreFiles": []
|
|
||||||
},
|
|
||||||
|
|
||||||
## options defined .pytool/Plugin/DependencyCheck
|
|
||||||
"DependencyCheck": {
|
|
||||||
"AcceptableDependencies": [
|
|
||||||
"ArmPlatformPkg/ArmPlatformPkg.dec",
|
|
||||||
"ArmPkg/ArmPkg.dec",
|
|
||||||
"EmbeddedPkg/EmbeddedPkg.dec",
|
|
||||||
"MdeModulePkg/MdeModulePkg.dec",
|
|
||||||
"MdePkg/MdePkg.dec",
|
|
||||||
"ShellPkg/ShellPkg.dec"
|
|
||||||
],
|
|
||||||
# For host based unit tests
|
|
||||||
"AcceptableDependencies-HOST_APPLICATION":[
|
|
||||||
"UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec"
|
|
||||||
],
|
|
||||||
# For UEFI shell based apps
|
|
||||||
"AcceptableDependencies-UEFI_APPLICATION":[],
|
|
||||||
"IgnoreInf": []
|
|
||||||
},
|
|
||||||
|
|
||||||
## options defined .pytool/Plugin/DscCompleteCheck
|
|
||||||
"DscCompleteCheck": {
|
|
||||||
"IgnoreInf": [],
|
|
||||||
"DscPath": "ArmPkg.dsc"
|
|
||||||
},
|
|
||||||
|
|
||||||
## options defined .pytool/Plugin/HostUnitTestDscCompleteCheck
|
|
||||||
"HostUnitTestDscCompleteCheck": {
|
|
||||||
"IgnoreInf": [""],
|
|
||||||
"DscPath": "" # Don't support this test
|
|
||||||
},
|
|
||||||
|
|
||||||
## options defined .pytool/Plugin/GuidCheck
|
|
||||||
"GuidCheck": {
|
|
||||||
"IgnoreGuidName": [],
|
|
||||||
"IgnoreGuidValue": [],
|
|
||||||
"IgnoreFoldersAndFiles": [],
|
|
||||||
"IgnoreDuplicates": [],
|
|
||||||
},
|
|
||||||
|
|
||||||
## options defined .pytool/Plugin/LibraryClassCheck
|
|
||||||
"LibraryClassCheck": {
|
|
||||||
"IgnoreHeaderFile": []
|
|
||||||
},
|
|
||||||
|
|
||||||
## options defined .pytool/Plugin/SpellCheck
|
|
||||||
"SpellCheck": {
|
|
||||||
"AuditOnly": False,
|
|
||||||
"IgnoreFiles": [
|
|
||||||
"Library/ArmSoftFloatLib/berkeley-softfloat-3/**"
|
|
||||||
], # use gitignore syntax to ignore errors
|
|
||||||
# in matching files
|
|
||||||
"ExtendWords": [
|
|
||||||
"api's",
|
|
||||||
"ackintid",
|
|
||||||
"actlr",
|
|
||||||
"aeabi",
|
|
||||||
"asedis",
|
|
||||||
"ashldi",
|
|
||||||
"ashrdi",
|
|
||||||
"baddr",
|
|
||||||
"ccidx",
|
|
||||||
"ccsidr",
|
|
||||||
"clidr",
|
|
||||||
"clrex",
|
|
||||||
"clzsi",
|
|
||||||
"cnthctl",
|
|
||||||
"cortexa",
|
|
||||||
"cpacr",
|
|
||||||
"cpuactlr",
|
|
||||||
"csselr",
|
|
||||||
"ctzsi",
|
|
||||||
"cygdrive",
|
|
||||||
"cygpaths",
|
|
||||||
"datas",
|
|
||||||
"dcmpeq",
|
|
||||||
"dcmpge",
|
|
||||||
"dcmpgt",
|
|
||||||
"dcmple",
|
|
||||||
"dcmplt",
|
|
||||||
"ddisable",
|
|
||||||
"divdi",
|
|
||||||
"divsi",
|
|
||||||
"dmdepkg",
|
|
||||||
"dpref",
|
|
||||||
"drsub",
|
|
||||||
"fcmpeq",
|
|
||||||
"fcmpge",
|
|
||||||
"fcmpgt",
|
|
||||||
"fcmple",
|
|
||||||
"fcmplt",
|
|
||||||
"ffreestanding",
|
|
||||||
"frsub",
|
|
||||||
"hisilicon",
|
|
||||||
"iccabpr",
|
|
||||||
"iccbpr",
|
|
||||||
"icciar",
|
|
||||||
"iccicr",
|
|
||||||
"icciidr",
|
|
||||||
"iccpir",
|
|
||||||
"iccpmr",
|
|
||||||
"iccrpr",
|
|
||||||
"icdabr",
|
|
||||||
"icdicer",
|
|
||||||
"icdicfr",
|
|
||||||
"icdicpr",
|
|
||||||
"icdictr",
|
|
||||||
"icdiidr",
|
|
||||||
"icdiser",
|
|
||||||
"icdisr",
|
|
||||||
"icdppisr",
|
|
||||||
"icdsgir",
|
|
||||||
"icdspr",
|
|
||||||
"icenabler",
|
|
||||||
"intid",
|
|
||||||
"ipriority",
|
|
||||||
"irouter",
|
|
||||||
"isenabler",
|
|
||||||
"istatus",
|
|
||||||
"itargets",
|
|
||||||
"lable",
|
|
||||||
"ldivmod",
|
|
||||||
"ldmdb",
|
|
||||||
"ldmia",
|
|
||||||
"ldrbt",
|
|
||||||
"ldrex",
|
|
||||||
"ldrexb",
|
|
||||||
"ldrexd",
|
|
||||||
"ldrexh",
|
|
||||||
"ldrhbt",
|
|
||||||
"ldrht",
|
|
||||||
"ldrsb",
|
|
||||||
"ldrsbt",
|
|
||||||
"ldrsh",
|
|
||||||
"lshrdi",
|
|
||||||
"moddi",
|
|
||||||
"modsi",
|
|
||||||
"mpcore",
|
|
||||||
"mpidr",
|
|
||||||
"muldi",
|
|
||||||
"mullu",
|
|
||||||
"nonshareable",
|
|
||||||
"nsacr",
|
|
||||||
"nsasedis",
|
|
||||||
"nuvia",
|
|
||||||
"oldit",
|
|
||||||
"pcten",
|
|
||||||
"plpis",
|
|
||||||
"procno",
|
|
||||||
"readc",
|
|
||||||
"revsh",
|
|
||||||
"rfedb",
|
|
||||||
"sctlr",
|
|
||||||
"smccc",
|
|
||||||
"smlabb",
|
|
||||||
"smlabt",
|
|
||||||
"smlad",
|
|
||||||
"smladx",
|
|
||||||
"smlatb",
|
|
||||||
"smlatt",
|
|
||||||
"smlawb",
|
|
||||||
"smlawt",
|
|
||||||
"smlsd",
|
|
||||||
"smlsdx",
|
|
||||||
"smmla",
|
|
||||||
"smmlar",
|
|
||||||
"smmls",
|
|
||||||
"smmlsr",
|
|
||||||
"sourcery",
|
|
||||||
"srsdb",
|
|
||||||
"ssacr",
|
|
||||||
"stmdb",
|
|
||||||
"stmia",
|
|
||||||
"strbt",
|
|
||||||
"strexb",
|
|
||||||
"strexd",
|
|
||||||
"strexh",
|
|
||||||
"strht",
|
|
||||||
"switchu",
|
|
||||||
"tpidrurw",
|
|
||||||
"ttbcr",
|
|
||||||
"typer",
|
|
||||||
"ucmpdi",
|
|
||||||
"udivdi",
|
|
||||||
"udivmoddi",
|
|
||||||
"udivsi",
|
|
||||||
"uefi's",
|
|
||||||
"uldiv",
|
|
||||||
"umoddi",
|
|
||||||
"umodsi",
|
|
||||||
"usada",
|
|
||||||
"vlpis",
|
|
||||||
"writec"
|
|
||||||
], # words to extend to the dictionary for this package
|
|
||||||
"IgnoreStandardPaths": [ # Standard Plugin defined paths that
|
|
||||||
"*.asm", "*.s" # should be ignore
|
|
||||||
],
|
|
||||||
"AdditionalIncludePaths": [] # Additional paths to spell check
|
|
||||||
# (wildcards supported)
|
|
||||||
}
|
|
||||||
}
|
|
@@ -2,8 +2,7 @@
|
|||||||
# ARM processor package.
|
# ARM processor package.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
|
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
|
||||||
# Copyright (c) 2011 - 2021, ARM Limited. All rights reserved.
|
# Copyright (c) 2011 - 2018, ARM Limited. All rights reserved.
|
||||||
# Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
|
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
#
|
#
|
||||||
@@ -28,68 +27,15 @@
|
|||||||
Include # Root include for the package
|
Include # Root include for the package
|
||||||
|
|
||||||
[LibraryClasses.common]
|
[LibraryClasses.common]
|
||||||
## @libraryclass Convert Arm instructions to a human readable format.
|
|
||||||
#
|
|
||||||
ArmDisassemblerLib|Include/Library/ArmDisassemblerLib.h
|
|
||||||
|
|
||||||
## @libraryclass Provides an interface to Arm generic counters.
|
|
||||||
#
|
|
||||||
ArmGenericTimerCounterLib|Include/Library/ArmGenericTimerCounterLib.h
|
|
||||||
|
|
||||||
## @libraryclass Provides an interface to initialize a
|
|
||||||
# Generic Interrupt Controller (GIC).
|
|
||||||
#
|
|
||||||
ArmGicArchLib|Include/Library/ArmGicArchLib.h
|
|
||||||
|
|
||||||
## @libraryclass Provides a Generic Interrupt Controller (GIC)
|
|
||||||
# configuration interface.
|
|
||||||
#
|
|
||||||
ArmGicLib|Include/Library/ArmGicLib.h
|
|
||||||
|
|
||||||
## @libraryclass Provides a HyperVisor Call (HVC) interface.
|
|
||||||
#
|
|
||||||
ArmHvcLib|Include/Library/ArmHvcLib.h
|
|
||||||
|
|
||||||
## @libraryclass Provides an interface to Arm registers.
|
|
||||||
#
|
|
||||||
ArmLib|Include/Library/ArmLib.h
|
ArmLib|Include/Library/ArmLib.h
|
||||||
|
|
||||||
## @libraryclass Provides a Mmu interface.
|
|
||||||
#
|
|
||||||
ArmMmuLib|Include/Library/ArmMmuLib.h
|
ArmMmuLib|Include/Library/ArmMmuLib.h
|
||||||
|
SemihostLib|Include/Library/Semihosting.h
|
||||||
## @libraryclass Provides a Mailbox Transport Layer (MTL) interface
|
|
||||||
# for the System Control and Management Interface (SCMI).
|
|
||||||
#
|
|
||||||
ArmMtlLib|Include/Library/ArmMtlLib.h
|
|
||||||
|
|
||||||
## @libraryclass Provides a System Monitor Call (SMC) interface.
|
|
||||||
#
|
|
||||||
ArmSmcLib|Include/Library/ArmSmcLib.h
|
|
||||||
|
|
||||||
## @libraryclass Provides a SuperVisor Call (SVC) interface.
|
|
||||||
#
|
|
||||||
ArmSvcLib|Include/Library/ArmSvcLib.h
|
|
||||||
|
|
||||||
## @libraryclass Provides a default exception handler.
|
|
||||||
#
|
|
||||||
DefaultExceptionHandlerLib|Include/Library/DefaultExceptionHandlerLib.h
|
DefaultExceptionHandlerLib|Include/Library/DefaultExceptionHandlerLib.h
|
||||||
|
ArmDisassemblerLib|Include/Library/ArmDisassemblerLib.h
|
||||||
## @libraryclass Provides an interface to query miscellaneous OEM
|
ArmGicArchLib|Include/Library/ArmGicArchLib.h
|
||||||
# information.
|
ArmMtlLib|ArmPlatformPkg/Include/Library/ArmMtlLib.h
|
||||||
#
|
ArmSvcLib|Include/Library/ArmSvcLib.h
|
||||||
OemMiscLib|Include/Library/OemMiscLib.h
|
|
||||||
|
|
||||||
## @libraryclass Provides an OpTee interface.
|
|
||||||
#
|
|
||||||
OpteeLib|Include/Library/OpteeLib.h
|
OpteeLib|Include/Library/OpteeLib.h
|
||||||
|
|
||||||
## @libraryclass Provides a semihosting interface.
|
|
||||||
#
|
|
||||||
SemihostLib|Include/Library/SemihostLib.h
|
|
||||||
|
|
||||||
## @libraryclass Provides an interface for a StandaloneMm Mmu.
|
|
||||||
#
|
|
||||||
StandaloneMmMmuLib|Include/Library/StandaloneMmMmuLib.h
|
StandaloneMmMmuLib|Include/Library/StandaloneMmMmuLib.h
|
||||||
|
|
||||||
[Guids.common]
|
[Guids.common]
|
||||||
@@ -138,13 +84,6 @@
|
|||||||
# hardware coherency (i.e., no virtualization or cache coherent DMA)
|
# hardware coherency (i.e., no virtualization or cache coherent DMA)
|
||||||
gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride|FALSE|BOOLEAN|0x00000043
|
gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride|FALSE|BOOLEAN|0x00000043
|
||||||
|
|
||||||
[PcdsFeatureFlag.AARCH64, PcdsFeatureFlag.ARM]
|
|
||||||
## Used to select method for requesting services from S-EL1.<BR><BR>
|
|
||||||
# TRUE - Selects FF-A calls for communication between S-EL0 and SPMC.<BR>
|
|
||||||
# FALSE - Selects SVC calls for communication between S-EL0 and SPMC.<BR>
|
|
||||||
# @Prompt Enable FF-A support.
|
|
||||||
gArmTokenSpaceGuid.PcdFfaEnable|FALSE|BOOLEAN|0x0000005B
|
|
||||||
|
|
||||||
[PcdsFixedAtBuild.common]
|
[PcdsFixedAtBuild.common]
|
||||||
gArmTokenSpaceGuid.PcdTrustzoneSupport|FALSE|BOOLEAN|0x00000006
|
gArmTokenSpaceGuid.PcdTrustzoneSupport|FALSE|BOOLEAN|0x00000006
|
||||||
|
|
||||||
@@ -176,20 +115,6 @@
|
|||||||
# The Primary Core is ClusterId[0] & CoreId[0]
|
# The Primary Core is ClusterId[0] & CoreId[0]
|
||||||
gArmTokenSpaceGuid.PcdArmPrimaryCore|0|UINT32|0x00000037
|
gArmTokenSpaceGuid.PcdArmPrimaryCore|0|UINT32|0x00000037
|
||||||
|
|
||||||
#
|
|
||||||
# SMBIOS PCDs
|
|
||||||
#
|
|
||||||
gArmTokenSpaceGuid.PcdSystemProductName|L""|VOID*|0x30000053
|
|
||||||
gArmTokenSpaceGuid.PcdSystemVersion|L""|VOID*|0x30000054
|
|
||||||
gArmTokenSpaceGuid.PcdBaseBoardManufacturer|L""|VOID*|0x30000055
|
|
||||||
gArmTokenSpaceGuid.PcdBaseBoardProductName|L""|VOID*|0x30000056
|
|
||||||
gArmTokenSpaceGuid.PcdBaseBoardVersion|L""|VOID*|0x30000057
|
|
||||||
gArmTokenSpaceGuid.PcdProcessorManufacturer|L""|VOID*|0x30000071
|
|
||||||
gArmTokenSpaceGuid.PcdProcessorVersion|L""|VOID*|0x30000072
|
|
||||||
gArmTokenSpaceGuid.PcdProcessorSerialNumber|L""|VOID*|0x30000073
|
|
||||||
gArmTokenSpaceGuid.PcdProcessorAssetTag|L""|VOID*|0x30000074
|
|
||||||
gArmTokenSpaceGuid.PcdProcessorPartNumber|L""|VOID*|0x30000075
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# ARM L2x0 PCDs
|
# ARM L2x0 PCDs
|
||||||
#
|
#
|
||||||
@@ -290,9 +215,6 @@
|
|||||||
gArmTokenSpaceGuid.PcdMmBufferBase|0|UINT64|0x00000045
|
gArmTokenSpaceGuid.PcdMmBufferBase|0|UINT64|0x00000045
|
||||||
gArmTokenSpaceGuid.PcdMmBufferSize|0|UINT64|0x00000046
|
gArmTokenSpaceGuid.PcdMmBufferSize|0|UINT64|0x00000046
|
||||||
|
|
||||||
gArmTokenSpaceGuid.PcdSystemBiosRelease|0xFFFF|UINT16|0x30000058
|
|
||||||
gArmTokenSpaceGuid.PcdEmbeddedControllerFirmwareRelease|0xFFFF|UINT16|0x30000059
|
|
||||||
|
|
||||||
[PcdsFixedAtBuild.common, PcdsDynamic.common]
|
[PcdsFixedAtBuild.common, PcdsDynamic.common]
|
||||||
#
|
#
|
||||||
# ARM Architectural Timer
|
# ARM Architectural Timer
|
||||||
@@ -338,9 +260,9 @@
|
|||||||
# UINT64 Mmio32CpuBase; // mapping target in 64-bit cpu-physical space
|
# UINT64 Mmio32CpuBase; // mapping target in 64-bit cpu-physical space
|
||||||
# UINT64 Mmio64CpuBase; // mapping target in 64-bit cpu-physical space
|
# UINT64 Mmio64CpuBase; // mapping target in 64-bit cpu-physical space
|
||||||
#
|
#
|
||||||
# gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation = IoCpuBase - PcdPciIoBase;
|
# PcdPciIoTranslation = IoCpuBase - PcdPciIoBase;
|
||||||
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio32Translation = Mmio32CpuBase - (UINT64)PcdPciMmio32Base;
|
# PcdPciMmio32Translation = Mmio32CpuBase - (UINT64)PcdPciMmio32Base;
|
||||||
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio64Translation = Mmio64CpuBase - PcdPciMmio64Base;
|
# PcdPciMmio64Translation = Mmio64CpuBase - PcdPciMmio64Base;
|
||||||
#
|
#
|
||||||
# because (a) the target address space (ie. the cpu-physical space) is
|
# because (a) the target address space (ie. the cpu-physical space) is
|
||||||
# 64-bit, and (b) the translation values are meant as offsets for *modular*
|
# 64-bit, and (b) the translation values are meant as offsets for *modular*
|
||||||
@@ -357,11 +279,11 @@
|
|||||||
# UINT64 TranslatedMmio64Address; // output parameter
|
# UINT64 TranslatedMmio64Address; // output parameter
|
||||||
#
|
#
|
||||||
# TranslatedIoAddress = UntranslatedIoAddress +
|
# TranslatedIoAddress = UntranslatedIoAddress +
|
||||||
# gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation;
|
# PcdPciIoTranslation;
|
||||||
# TranslatedMmio32Address = (UINT64)UntranslatedMmio32Address +
|
# TranslatedMmio32Address = (UINT64)UntranslatedMmio32Address +
|
||||||
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio32Translation;
|
# PcdPciMmio32Translation;
|
||||||
# TranslatedMmio64Address = UntranslatedMmio64Address +
|
# TranslatedMmio64Address = UntranslatedMmio64Address +
|
||||||
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio64Translation;
|
# PcdPciMmio64Translation;
|
||||||
#
|
#
|
||||||
# The modular arithmetic performed in UINT64 ensures that the translation
|
# The modular arithmetic performed in UINT64 ensures that the translation
|
||||||
# works correctly regardless of the relation between IoCpuBase and
|
# works correctly regardless of the relation between IoCpuBase and
|
||||||
@@ -370,20 +292,16 @@
|
|||||||
#
|
#
|
||||||
gArmTokenSpaceGuid.PcdPciIoBase|0x0|UINT64|0x00000050
|
gArmTokenSpaceGuid.PcdPciIoBase|0x0|UINT64|0x00000050
|
||||||
gArmTokenSpaceGuid.PcdPciIoSize|0x0|UINT64|0x00000051
|
gArmTokenSpaceGuid.PcdPciIoSize|0x0|UINT64|0x00000051
|
||||||
|
gArmTokenSpaceGuid.PcdPciIoTranslation|0x0|UINT64|0x00000052
|
||||||
gArmTokenSpaceGuid.PcdPciMmio32Base|0x0|UINT32|0x00000053
|
gArmTokenSpaceGuid.PcdPciMmio32Base|0x0|UINT32|0x00000053
|
||||||
gArmTokenSpaceGuid.PcdPciMmio32Size|0x0|UINT32|0x00000054
|
gArmTokenSpaceGuid.PcdPciMmio32Size|0x0|UINT32|0x00000054
|
||||||
|
gArmTokenSpaceGuid.PcdPciMmio32Translation|0x0|UINT64|0x00000055
|
||||||
gArmTokenSpaceGuid.PcdPciMmio64Base|0x0|UINT64|0x00000056
|
gArmTokenSpaceGuid.PcdPciMmio64Base|0x0|UINT64|0x00000056
|
||||||
gArmTokenSpaceGuid.PcdPciMmio64Size|0x0|UINT64|0x00000057
|
gArmTokenSpaceGuid.PcdPciMmio64Size|0x0|UINT64|0x00000057
|
||||||
|
gArmTokenSpaceGuid.PcdPciMmio64Translation|0x0|UINT64|0x00000058
|
||||||
|
|
||||||
#
|
#
|
||||||
# Inclusive range of allowed PCI buses.
|
# Inclusive range of allowed PCI buses.
|
||||||
#
|
#
|
||||||
gArmTokenSpaceGuid.PcdPciBusMin|0x0|UINT32|0x00000059
|
gArmTokenSpaceGuid.PcdPciBusMin|0x0|UINT32|0x00000059
|
||||||
gArmTokenSpaceGuid.PcdPciBusMax|0x0|UINT32|0x0000005A
|
gArmTokenSpaceGuid.PcdPciBusMax|0x0|UINT32|0x0000005A
|
||||||
|
|
||||||
[PcdsDynamicEx]
|
|
||||||
#
|
|
||||||
# This dynamic PCD hold the GUID of a firmware FFS which contains
|
|
||||||
# the LinuxBoot payload.
|
|
||||||
#
|
|
||||||
gArmTokenSpaceGuid.PcdLinuxBootFileGuid|{0x0}|VOID*|0x0000005C
|
|
||||||
|
@@ -2,10 +2,9 @@
|
|||||||
# ARM processor package.
|
# ARM processor package.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
|
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
|
||||||
# Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>
|
# Copyright (c) 2011 - 2018, ARM Ltd. All rights reserved.<BR>
|
||||||
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
|
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
|
||||||
# Copyright (c) Microsoft Corporation.<BR>
|
# Copyright (c) Microsoft Corporation.<BR>
|
||||||
# Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
|
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
#
|
#
|
||||||
@@ -30,25 +29,17 @@
|
|||||||
RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG
|
RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG
|
||||||
*_*_*_CC_FLAGS = -DDISABLE_NEW_DEPRECATED_INTERFACES
|
*_*_*_CC_FLAGS = -DDISABLE_NEW_DEPRECATED_INTERFACES
|
||||||
|
|
||||||
[PcdsFixedAtBuild]
|
|
||||||
gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType|4
|
|
||||||
|
|
||||||
!include MdePkg/MdeLibs.dsc.inc
|
|
||||||
|
|
||||||
[LibraryClasses.common]
|
[LibraryClasses.common]
|
||||||
BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
|
BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
|
||||||
BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
|
BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
|
||||||
BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
|
|
||||||
CacheMaintenanceLib|ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf
|
CacheMaintenanceLib|ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf
|
||||||
CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
|
CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
|
||||||
DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
|
DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
|
||||||
DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
|
|
||||||
HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
|
HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
|
||||||
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
|
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
|
||||||
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
|
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
|
||||||
PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
|
PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
|
||||||
TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
|
TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
|
||||||
UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
|
|
||||||
UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
|
UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
|
||||||
UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
|
UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
|
||||||
UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
|
UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
|
||||||
@@ -56,7 +47,6 @@
|
|||||||
UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
|
UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
|
||||||
PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
|
PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
|
||||||
PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
|
PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
|
||||||
PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
|
|
||||||
|
|
||||||
UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
|
UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
|
||||||
HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
|
HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
|
||||||
@@ -91,8 +81,6 @@
|
|||||||
|
|
||||||
ArmMtlLib|ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.inf
|
ArmMtlLib|ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.inf
|
||||||
|
|
||||||
OemMiscLib|ArmPkg/Universal/Smbios/OemMiscLibNull/OemMiscLibNull.inf
|
|
||||||
|
|
||||||
[LibraryClasses.common.PEIM]
|
[LibraryClasses.common.PEIM]
|
||||||
HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
|
HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
|
||||||
PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
|
PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
|
||||||
@@ -151,18 +139,11 @@
|
|||||||
ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
|
ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
|
||||||
ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
|
ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
|
||||||
ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
|
ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
|
||||||
ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf
|
|
||||||
|
|
||||||
ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf
|
ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf
|
||||||
ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
|
ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
|
||||||
|
ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf
|
||||||
ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
|
|
||||||
ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf
|
|
||||||
ArmPkg/Universal/Smbios/OemMiscLibNull/OemMiscLibNull.inf
|
|
||||||
|
|
||||||
[Components.AARCH64]
|
[Components.AARCH64]
|
||||||
ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf
|
|
||||||
ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf
|
ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf
|
||||||
|
|
||||||
[Components.AARCH64, Components.ARM]
|
|
||||||
ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.inf
|
ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.inf
|
||||||
|
@@ -26,9 +26,7 @@ ArmCrashDumpDxeInitialize (
|
|||||||
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu);
|
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu);
|
||||||
ASSERT_EFI_ERROR(Status);
|
ASSERT_EFI_ERROR(Status);
|
||||||
|
|
||||||
return mCpu->RegisterInterruptHandler (
|
return mCpu->RegisterInterruptHandler (mCpu,
|
||||||
mCpu,
|
|
||||||
EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS,
|
EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS,
|
||||||
&DefaultExceptionHandler
|
&DefaultExceptionHandler);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
@@ -33,6 +33,7 @@ UINTN mGicNumInterrupts = 0;
|
|||||||
|
|
||||||
HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL;
|
HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Calculate GICD_ICFGRn base address and corresponding bit
|
Calculate GICD_ICFGRn base address and corresponding bit
|
||||||
field Int_config[1] of the GIC distributor register.
|
field Int_config[1] of the GIC distributor register.
|
||||||
@@ -70,6 +71,8 @@ GicGetDistributorIcfgBaseAndBit (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Register Handler for the specified interrupt source.
|
Register Handler for the specified interrupt source.
|
||||||
|
|
||||||
@@ -134,28 +137,17 @@ CpuArchEventProtocolNotify (
|
|||||||
// Unregister the default exception handler.
|
// Unregister the default exception handler.
|
||||||
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
|
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((
|
DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
|
||||||
DEBUG_ERROR,
|
__FUNCTION__, Status));
|
||||||
"%a: Cpu->RegisterInterruptHandler() - %r\n",
|
|
||||||
__FUNCTION__,
|
|
||||||
Status
|
|
||||||
));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register to receive interrupts
|
// Register to receive interrupts
|
||||||
Status = Cpu->RegisterInterruptHandler (
|
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ,
|
||||||
Cpu,
|
Context);
|
||||||
ARM_ARCH_EXCEPTION_IRQ,
|
|
||||||
Context
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((
|
DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
|
||||||
DEBUG_ERROR,
|
__FUNCTION__, Status));
|
||||||
"%a: Cpu->RegisterInterruptHandler() - %r\n",
|
|
||||||
__FUNCTION__,
|
|
||||||
Status
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gBS->CloseEvent (Event);
|
gBS->CloseEvent (Event);
|
||||||
@@ -199,8 +191,7 @@ InstallAndRegisterInterruptService (
|
|||||||
TPL_CALLBACK,
|
TPL_CALLBACK,
|
||||||
CpuArchEventProtocolNotify,
|
CpuArchEventProtocolNotify,
|
||||||
InterruptHandler,
|
InterruptHandler,
|
||||||
&mCpuArchProtocolNotifyEventRegistration
|
&mCpuArchProtocolNotifyEventRegistration);
|
||||||
);
|
|
||||||
|
|
||||||
// Register for an ExitBootServicesEvent
|
// Register for an ExitBootServicesEvent
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
|
@@ -6,8 +6,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
--*/
|
--*/
|
||||||
|
|
||||||
#ifndef ARM_GIC_DXE_H_
|
#ifndef __ARM_GIC_DXE_H__
|
||||||
#define ARM_GIC_DXE_H_
|
#define __ARM_GIC_DXE_H__
|
||||||
|
|
||||||
#include <Library/ArmGicLib.h>
|
#include <Library/ArmGicLib.h>
|
||||||
#include <Library/ArmLib.h>
|
#include <Library/ArmLib.h>
|
||||||
@@ -55,6 +55,7 @@ GicV3DxeInitialize (
|
|||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
// Shared code
|
// Shared code
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -75,4 +76,4 @@ GicGetDistributorIcfgBaseAndBit (
|
|||||||
OUT UINTN *Config1Bit
|
OUT UINTN *Config1Bit
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARM_GIC_DXE_H_
|
#endif
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2021, Arm Limited. All rights reserved.
|
* Copyright (c) 2011-2018, ARM Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
*
|
*
|
||||||
@@ -25,13 +25,10 @@
|
|||||||
+ ARM_GICR_SGI_RESERVED_FRAME_SIZE)
|
+ ARM_GICR_SGI_RESERVED_FRAME_SIZE)
|
||||||
|
|
||||||
#define ISENABLER_ADDRESS(base,offset) ((base) + \
|
#define ISENABLER_ADDRESS(base,offset) ((base) + \
|
||||||
ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ISENABLER + 4 * (offset))
|
ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ISENABLER + (4 * offset))
|
||||||
|
|
||||||
#define ICENABLER_ADDRESS(base,offset) ((base) + \
|
#define ICENABLER_ADDRESS(base,offset) ((base) + \
|
||||||
ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ICENABLER + 4 * (offset))
|
ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ICENABLER + (4 * offset))
|
||||||
|
|
||||||
#define IPRIORITY_ADDRESS(base, offset) ((base) +\
|
|
||||||
ARM_GICR_CTLR_FRAME_SIZE + ARM_GIC_ICDIPR + 4 * (offset))
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -120,14 +117,7 @@ ArmGicGetMaxNumInterrupts (
|
|||||||
IN INTN GicDistributorBase
|
IN INTN GicDistributorBase
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN ItLines;
|
return 32 * ((MmioRead32 (GicDistributorBase + ARM_GIC_ICDICTR) & 0x1F) + 1);
|
||||||
|
|
||||||
ItLines = MmioRead32 (GicDistributorBase + ARM_GIC_ICDICTR) & 0x1F;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Interrupt ID 1020-1023 are reserved.
|
|
||||||
//
|
|
||||||
return (ItLines == 0x1f) ? 1020 : 32 * (ItLines + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
@@ -209,51 +199,6 @@ ArmGicEndOfInterrupt (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
ArmGicSetInterruptPriority (
|
|
||||||
IN UINTN GicDistributorBase,
|
|
||||||
IN UINTN GicRedistributorBase,
|
|
||||||
IN UINTN Source,
|
|
||||||
IN UINTN Priority
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT32 RegOffset;
|
|
||||||
UINTN RegShift;
|
|
||||||
ARM_GIC_ARCH_REVISION Revision;
|
|
||||||
UINTN GicCpuRedistributorBase;
|
|
||||||
|
|
||||||
// Calculate register offset and bit position
|
|
||||||
RegOffset = Source / 4;
|
|
||||||
RegShift = (Source % 4) * 8;
|
|
||||||
|
|
||||||
Revision = ArmGicGetSupportedArchRevision ();
|
|
||||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
|
||||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
|
||||||
SourceIsSpi (Source))
|
|
||||||
{
|
|
||||||
MmioAndThenOr32 (
|
|
||||||
GicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset),
|
|
||||||
~(0xff << RegShift),
|
|
||||||
Priority << RegShift
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
GicCpuRedistributorBase = GicGetCpuRedistributorBase (
|
|
||||||
GicRedistributorBase,
|
|
||||||
Revision
|
|
||||||
);
|
|
||||||
if (GicCpuRedistributorBase == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MmioAndThenOr32 (
|
|
||||||
IPRIORITY_ADDRESS (GicCpuRedistributorBase, RegOffset),
|
|
||||||
~(0xff << RegShift),
|
|
||||||
Priority << RegShift
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmGicEnableInterrupt (
|
ArmGicEnableInterrupt (
|
||||||
@@ -274,8 +219,7 @@ ArmGicEnableInterrupt (
|
|||||||
Revision = ArmGicGetSupportedArchRevision ();
|
Revision = ArmGicGetSupportedArchRevision ();
|
||||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
||||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
||||||
SourceIsSpi (Source))
|
SourceIsSpi (Source)) {
|
||||||
{
|
|
||||||
// Write set-enable register
|
// Write set-enable register
|
||||||
MmioWrite32 (
|
MmioWrite32 (
|
||||||
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset),
|
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset),
|
||||||
@@ -319,8 +263,7 @@ ArmGicDisableInterrupt (
|
|||||||
Revision = ArmGicGetSupportedArchRevision ();
|
Revision = ArmGicGetSupportedArchRevision ();
|
||||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
||||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
||||||
SourceIsSpi (Source))
|
SourceIsSpi (Source)) {
|
||||||
{
|
|
||||||
// Write clear-enable register
|
// Write clear-enable register
|
||||||
MmioWrite32 (
|
MmioWrite32 (
|
||||||
GicDistributorBase + ARM_GIC_ICDICER + (4 * RegOffset),
|
GicDistributorBase + ARM_GIC_ICDICER + (4 * RegOffset),
|
||||||
@@ -364,8 +307,7 @@ ArmGicIsInterruptEnabled (
|
|||||||
Revision = ArmGicGetSupportedArchRevision ();
|
Revision = ArmGicGetSupportedArchRevision ();
|
||||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
||||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
||||||
SourceIsSpi (Source))
|
SourceIsSpi (Source)) {
|
||||||
{
|
|
||||||
Interrupts = ((MmioRead32 (
|
Interrupts = ((MmioRead32 (
|
||||||
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset)
|
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset)
|
||||||
)
|
)
|
||||||
|
58
ArmPkg/Drivers/ArmGic/ArmGicSecLib.c
Normal file
58
ArmPkg/Drivers/ArmGic/ArmGicSecLib.c
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011-2014, ARM Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
*
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include <Base.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/IoLib.h>
|
||||||
|
#include <Library/ArmGicLib.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function configures the interrupts set by the mask to be secure.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
ArmGicSetSecureInterrupts (
|
||||||
|
IN UINTN GicDistributorBase,
|
||||||
|
IN UINTN* GicSecureInterruptMask,
|
||||||
|
IN UINTN GicSecureInterruptMaskSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN Index;
|
||||||
|
UINT32 InterruptStatus;
|
||||||
|
|
||||||
|
// We must not have more interrupts defined by the mask than the number of available interrupts
|
||||||
|
ASSERT(GicSecureInterruptMaskSize <= (ArmGicGetMaxNumInterrupts (GicDistributorBase) / 32));
|
||||||
|
|
||||||
|
// Set all the interrupts defined by the mask as Secure
|
||||||
|
for (Index = 0; Index < GicSecureInterruptMaskSize; Index++) {
|
||||||
|
InterruptStatus = MmioRead32 (GicDistributorBase + ARM_GIC_ICDISR + (Index * 4));
|
||||||
|
MmioWrite32 (GicDistributorBase + ARM_GIC_ICDISR + (Index * 4), InterruptStatus & (~GicSecureInterruptMask[Index]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
ArmGicEnableDistributor (
|
||||||
|
IN INTN GicDistributorBase
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Turn on the GIC distributor
|
||||||
|
MmioWrite32 (GicDistributorBase + ARM_GIC_ICDDCR, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
ArmGicSetupNonSecure (
|
||||||
|
IN UINTN MpId,
|
||||||
|
IN INTN GicDistributorBase,
|
||||||
|
IN INTN GicInterruptInterfaceBase
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ArmGicV2SetupNonSecure (MpId, GicDistributorBase, GicInterruptInterfaceBase);
|
||||||
|
}
|
@@ -121,7 +121,7 @@ GicV2GetInterruptSourceState (
|
|||||||
@param This Instance pointer for this protocol
|
@param This Instance pointer for this protocol
|
||||||
@param Source Hardware source of the interrupt
|
@param Source Hardware source of the interrupt
|
||||||
|
|
||||||
@retval EFI_SUCCESS Source interrupt ended successfully.
|
@retval EFI_SUCCESS Source interrupt EOI'ed.
|
||||||
@retval EFI_UNSUPPORTED Source interrupt is not supported
|
@retval EFI_UNSUPPORTED Source interrupt is not supported
|
||||||
|
|
||||||
**/
|
**/
|
||||||
@@ -261,13 +261,9 @@ GicV2SetTriggerType (
|
|||||||
BOOLEAN SourceEnabled;
|
BOOLEAN SourceEnabled;
|
||||||
|
|
||||||
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
|
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
|
||||||
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH))
|
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) {
|
||||||
{
|
DEBUG ((DEBUG_ERROR, "Invalid interrupt trigger type: %d\n", \
|
||||||
DEBUG ((
|
TriggerType));
|
||||||
DEBUG_ERROR,
|
|
||||||
"Invalid interrupt trigger type: %d\n", \
|
|
||||||
TriggerType
|
|
||||||
));
|
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
#include <Library/IoLib.h>
|
#include <Library/IoLib.h>
|
||||||
#include <Library/ArmGicLib.h>
|
#include <Library/ArmGicLib.h>
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmGicV2EnableInterruptInterface (
|
ArmGicV2EnableInterruptInterface (
|
||||||
|
@@ -115,7 +115,7 @@ GicV3GetInterruptSourceState (
|
|||||||
@param This Instance pointer for this protocol
|
@param This Instance pointer for this protocol
|
||||||
@param Source Hardware source of the interrupt
|
@param Source Hardware source of the interrupt
|
||||||
|
|
||||||
@retval EFI_SUCCESS Source interrupt ended successfully.
|
@retval EFI_SUCCESS Source interrupt EOI'ed.
|
||||||
@retval EFI_DEVICE_ERROR Hardware could not be programmed.
|
@retval EFI_DEVICE_ERROR Hardware could not be programmed.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
@@ -255,13 +255,9 @@ GicV3SetTriggerType (
|
|||||||
BOOLEAN SourceEnabled;
|
BOOLEAN SourceEnabled;
|
||||||
|
|
||||||
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
|
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
|
||||||
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH))
|
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) {
|
||||||
{
|
DEBUG ((DEBUG_ERROR, "Invalid interrupt trigger type: %d\n", \
|
||||||
DEBUG ((
|
TriggerType));
|
||||||
DEBUG_ERROR,
|
|
||||||
"Invalid interrupt trigger type: %d\n", \
|
|
||||||
TriggerType
|
|
||||||
));
|
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@@ -348,6 +344,10 @@ GicV3ExitBootServicesEvent (
|
|||||||
GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
|
GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (Index = 0; Index < mGicNumInterrupts; Index++) {
|
||||||
|
GicV3EndOfInterrupt (&gHardwareInterruptV3Protocol, Index);
|
||||||
|
}
|
||||||
|
|
||||||
// Disable Gic Interface
|
// Disable Gic Interface
|
||||||
ArmGicV3DisableInterruptInterface ();
|
ArmGicV3DisableInterruptInterface ();
|
||||||
|
|
||||||
@@ -374,6 +374,8 @@ GicV3DxeInitialize (
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
UINT32 RegOffset;
|
||||||
|
UINTN RegShift;
|
||||||
UINT64 CpuTarget;
|
UINT64 CpuTarget;
|
||||||
UINT64 MpId;
|
UINT64 MpId;
|
||||||
|
|
||||||
@@ -395,11 +397,12 @@ GicV3DxeInitialize (
|
|||||||
GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
|
GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
|
||||||
|
|
||||||
// Set Priority
|
// Set Priority
|
||||||
ArmGicSetInterruptPriority (
|
RegOffset = Index / 4;
|
||||||
mGicDistributorBase,
|
RegShift = (Index % 4) * 8;
|
||||||
mGicRedistributorsBase,
|
MmioAndThenOr32 (
|
||||||
Index,
|
mGicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset),
|
||||||
ARM_GIC_DEFAULT_PRIORITY
|
~(0xff << RegShift),
|
||||||
|
ARM_GIC_DEFAULT_PRIORITY << RegShift
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -434,8 +437,8 @@ GicV3DxeInitialize (
|
|||||||
|
|
||||||
if ((MmioRead32 (
|
if ((MmioRead32 (
|
||||||
mGicDistributorBase + ARM_GIC_ICDDCR
|
mGicDistributorBase + ARM_GIC_ICDDCR
|
||||||
) & ARM_GIC_ICDDCR_DS) != 0)
|
) & ARM_GIC_ICDDCR_DS) != 0) {
|
||||||
{
|
|
||||||
// If the Disable Security (DS) control bit is set, we are dealing with a
|
// If the Disable Security (DS) control bit is set, we are dealing with a
|
||||||
// GIC that has only one security state. In this case, let's assume we are
|
// GIC that has only one security state. In this case, let's assume we are
|
||||||
// executing in non-secure state (which is appropriate for DXE modules)
|
// executing in non-secure state (which is appropriate for DXE modules)
|
||||||
|
@@ -117,7 +117,7 @@ CpuIoCheckParameter (
|
|||||||
// For FIFO type, the target address won't increase during the access,
|
// For FIFO type, the target address won't increase during the access,
|
||||||
// so treat Count as 1
|
// so treat Count as 1
|
||||||
//
|
//
|
||||||
if ((Width >= EfiCpuIoWidthFifoUint8) && (Width <= EfiCpuIoWidthFifoUint64)) {
|
if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) {
|
||||||
Count = 1;
|
Count = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +161,6 @@ CpuIoCheckParameter (
|
|||||||
if (MaxCount < (Count - 1)) {
|
if (MaxCount < (Count - 1)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Address > LShiftU64 (MaxCount - Count + 1, Width)) {
|
if (Address > LShiftU64 (MaxCount - Count + 1, Width)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@@ -255,7 +254,6 @@ CpuMemoryServiceRead (
|
|||||||
*((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address);
|
*((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,7 +335,6 @@ CpuMemoryServiceWrite (
|
|||||||
MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer));
|
MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -524,6 +521,7 @@ STATIC EFI_CPU_IO2_PROTOCOL mCpuIo2 = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The user Entry Point for module CpuIo2Dxe. The user code starts with this function.
|
The user Entry Point for module CpuIo2Dxe. The user code starts with this function.
|
||||||
|
|
||||||
@@ -546,8 +544,7 @@ ArmPciCpuIo2Initialize (
|
|||||||
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiCpuIo2ProtocolGuid);
|
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiCpuIo2ProtocolGuid);
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&mHandle,
|
&mHandle,
|
||||||
&gEfiCpuIo2ProtocolGuid,
|
&gEfiCpuIo2ProtocolGuid, &mCpuIo2,
|
||||||
&mCpuIo2,
|
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
@@ -38,7 +38,7 @@
|
|||||||
UefiBootServicesTableLib
|
UefiBootServicesTableLib
|
||||||
|
|
||||||
[Pcd]
|
[Pcd]
|
||||||
gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation
|
gArmTokenSpaceGuid.PcdPciIoTranslation
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiCpuIo2ProtocolGuid ## PRODUCES
|
gEfiCpuIo2ProtocolGuid ## PRODUCES
|
||||||
|
@@ -53,6 +53,7 @@ typedef struct {
|
|||||||
CLOCK_RATE_DWORD Rate;
|
CLOCK_RATE_DWORD Rate;
|
||||||
} CLOCK_RATE_SET_ATTRIBUTES;
|
} CLOCK_RATE_SET_ATTRIBUTES;
|
||||||
|
|
||||||
|
|
||||||
// Message parameters for CLOCK_CONFIG_SET command.
|
// Message parameters for CLOCK_CONFIG_SET command.
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 ClockId;
|
UINT32 ClockId;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
#/** @file
|
#/** @file
|
||||||
#
|
#
|
||||||
# Copyright (c) 2017-2021, Arm Limited. All rights reserved.<BR>
|
# Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
#
|
#
|
||||||
@@ -18,16 +18,11 @@
|
|||||||
ENTRY_POINT = ArmScmiDxeEntryPoint
|
ENTRY_POINT = ArmScmiDxeEntryPoint
|
||||||
|
|
||||||
[Sources.common]
|
[Sources.common]
|
||||||
ArmScmiBaseProtocolPrivate.h
|
|
||||||
ArmScmiClockProtocolPrivate.h
|
|
||||||
ArmScmiPerformanceProtocolPrivate.h
|
|
||||||
ScmiBaseProtocol.c
|
|
||||||
Scmi.c
|
Scmi.c
|
||||||
|
ScmiBaseProtocol.c
|
||||||
ScmiClockProtocol.c
|
ScmiClockProtocol.c
|
||||||
ScmiDxe.c
|
ScmiDxe.c
|
||||||
ScmiDxe.h
|
|
||||||
ScmiPerformanceProtocol.c
|
ScmiPerformanceProtocol.c
|
||||||
ScmiPrivate.h
|
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
ArmPkg/ArmPkg.dec
|
ArmPkg/ArmPkg.dec
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2017-2021, Arm Limited. All rights reserved.
|
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
#define NUM_REMAIN_PERF_LEVELS_SHIFT 16
|
#define NUM_REMAIN_PERF_LEVELS_SHIFT 16
|
||||||
#define NUM_REMAIN_PERF_LEVELS(Lvls) (Lvls >> NUM_REMAIN_PERF_LEVELS_SHIFT)
|
#define NUM_REMAIN_PERF_LEVELS(Lvls) (Lvls >> NUM_REMAIN_PERF_LEVELS_SHIFT)
|
||||||
|
|
||||||
/** Return values for ScmiMessageIdPerformanceDescribeLevels command.
|
/** Return values for SCMI_MESSAGE_ID_PERFORMANCE_DESCRIBE_LEVELS command.
|
||||||
SCMI Spec section 4.5.2.5
|
SCMI Spec section 4.5.2.5
|
||||||
**/
|
**/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2017-2021, Arm Limited. All rights reserved.
|
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ ScmiCommandExecute (
|
|||||||
// Fill in message header.
|
// Fill in message header.
|
||||||
MessageHeader = SCMI_MESSAGE_HEADER (
|
MessageHeader = SCMI_MESSAGE_HEADER (
|
||||||
Command->MessageId,
|
Command->MessageId,
|
||||||
ScmiMessageTypeCommand,
|
SCMI_MESSAGE_TYPE_COMMAND,
|
||||||
Command->ProtocolId
|
Command->ProtocolId
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -123,10 +123,8 @@ ScmiCommandExecute (
|
|||||||
|
|
||||||
Response = (SCMI_MESSAGE_RESPONSE*)MtlGetChannelPayload (Channel);
|
Response = (SCMI_MESSAGE_RESPONSE*)MtlGetChannelPayload (Channel);
|
||||||
|
|
||||||
if (Response->Status != ScmiSuccess) {
|
if (Response->Status != SCMI_SUCCESS) {
|
||||||
DEBUG ((
|
DEBUG ((DEBUG_ERROR, "SCMI error: ProtocolId = 0x%x, MessageId = 0x%x, error = %d\n",
|
||||||
DEBUG_ERROR,
|
|
||||||
"SCMI error: ProtocolId = 0x%x, MessageId = 0x%x, error = %d\n",
|
|
||||||
Command->ProtocolId,
|
Command->ProtocolId,
|
||||||
Command->MessageId,
|
Command->MessageId,
|
||||||
Response->Status
|
Response->Status
|
||||||
@@ -163,9 +161,8 @@ ScmiProtocolDiscoveryCommon (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
SCMI_COMMAND Command;
|
SCMI_COMMAND Command;
|
||||||
UINT32 PayloadLength;
|
UINT32 PayloadLength = 0;
|
||||||
|
|
||||||
PayloadLength = 0;
|
|
||||||
Command.ProtocolId = ProtocolId;
|
Command.ProtocolId = ProtocolId;
|
||||||
Command.MessageId = MessageId;
|
Command.MessageId = MessageId;
|
||||||
|
|
||||||
@@ -197,7 +194,7 @@ ScmiGetProtocolVersion (
|
|||||||
|
|
||||||
Status = ScmiProtocolDiscoveryCommon (
|
Status = ScmiProtocolDiscoveryCommon (
|
||||||
ProtocolId,
|
ProtocolId,
|
||||||
ScmiMessageIdProtocolVersion,
|
SCMI_MESSAGE_ID_PROTOCOL_VERSION,
|
||||||
(UINT32**)&ProtocolVersion
|
(UINT32**)&ProtocolVersion
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@@ -226,7 +223,7 @@ ScmiGetProtocolAttributes (
|
|||||||
{
|
{
|
||||||
return ScmiProtocolDiscoveryCommon (
|
return ScmiProtocolDiscoveryCommon (
|
||||||
ProtocolId,
|
ProtocolId,
|
||||||
ScmiMessageIdProtocolAttributes,
|
SCMI_MESSAGE_ID_PROTOCOL_ATTRIBUTES,
|
||||||
ReturnValues
|
ReturnValues
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -248,7 +245,7 @@ ScmiGetProtocolMessageAttributes (
|
|||||||
{
|
{
|
||||||
return ScmiProtocolDiscoveryCommon (
|
return ScmiProtocolDiscoveryCommon (
|
||||||
ProtocolId,
|
ProtocolId,
|
||||||
ScmiMessageIdProtocolMessageAttributes,
|
SCMI_MESSAGE_ID_PROTOCOL_MESSAGE_ATTRIBUTES,
|
||||||
ReturnValues
|
ReturnValues
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2017-2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ BaseGetVersion (
|
|||||||
OUT UINT32 *Version
|
OUT UINT32 *Version
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return ScmiGetProtocolVersion (ScmiProtocolIdBase, Version);
|
return ScmiGetProtocolVersion (SCMI_PROTOCOL_ID_BASE, Version);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return total number of SCMI protocols supported by the SCP firmware.
|
/** Return total number of SCMI protocols supported by the SCP firmware.
|
||||||
@@ -57,7 +57,7 @@ BaseGetTotalProtocols (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 *ReturnValues;
|
UINT32 *ReturnValues;
|
||||||
|
|
||||||
Status = ScmiGetProtocolAttributes (ScmiProtocolIdBase, &ReturnValues);
|
Status = ScmiGetProtocolAttributes (SCMI_PROTOCOL_ID_BASE, &ReturnValues);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@@ -69,9 +69,9 @@ BaseGetTotalProtocols (
|
|||||||
|
|
||||||
/** Common function which returns vendor details.
|
/** Common function which returns vendor details.
|
||||||
|
|
||||||
@param[in] MessageId ScmiMessageIdBaseDiscoverVendor
|
@param[in] MessageId SCMI_MESSAGE_ID_BASE_DISCOVER_VENDOR
|
||||||
OR
|
OR
|
||||||
ScmiMessageIdBaseDiscoverSubVendor
|
SCMI_MESSAGE_ID_BASE_DISCOVER_SUB_VENDOR
|
||||||
|
|
||||||
@param[out] VendorIdentifier ASCII name of the vendor/subvendor.
|
@param[out] VendorIdentifier ASCII name of the vendor/subvendor.
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ BaseDiscoverVendorDetails (
|
|||||||
SCMI_COMMAND Cmd;
|
SCMI_COMMAND Cmd;
|
||||||
UINT32 PayloadLength;
|
UINT32 PayloadLength;
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdBase;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_BASE;
|
||||||
Cmd.MessageId = MessageId;
|
Cmd.MessageId = MessageId;
|
||||||
|
|
||||||
PayloadLength = 0;
|
PayloadLength = 0;
|
||||||
@@ -133,7 +133,7 @@ BaseDiscoverVendor (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
return BaseDiscoverVendorDetails (
|
return BaseDiscoverVendorDetails (
|
||||||
ScmiMessageIdBaseDiscoverVendor,
|
SCMI_MESSAGE_ID_BASE_DISCOVER_VENDOR,
|
||||||
VendorIdentifier
|
VendorIdentifier
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -156,7 +156,7 @@ BaseDiscoverSubVendor (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
return BaseDiscoverVendorDetails (
|
return BaseDiscoverVendorDetails (
|
||||||
ScmiMessageIdBaseDiscoverSubVendor,
|
SCMI_MESSAGE_ID_BASE_DISCOVER_SUB_VENDOR,
|
||||||
VendorIdentifier
|
VendorIdentifier
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -183,8 +183,8 @@ BaseDiscoverImplVersion (
|
|||||||
SCMI_COMMAND Cmd;
|
SCMI_COMMAND Cmd;
|
||||||
UINT32 PayloadLength;
|
UINT32 PayloadLength;
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdBase;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_BASE;
|
||||||
Cmd.MessageId = ScmiMessageIdBaseDiscoverImplementationVersion;
|
Cmd.MessageId = SCMI_MESSAGE_ID_BASE_DISCOVER_IMPLEMENTATION_VERSION;
|
||||||
|
|
||||||
PayloadLength = 0;
|
PayloadLength = 0;
|
||||||
|
|
||||||
@@ -250,12 +250,13 @@ BaseDiscoverListProtocols (
|
|||||||
return EFI_BUFFER_TOO_SMALL;
|
return EFI_BUFFER_TOO_SMALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdBase;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_BASE;
|
||||||
Cmd.MessageId = ScmiMessageIdBaseDiscoverListProtocols;
|
Cmd.MessageId = SCMI_MESSAGE_ID_BASE_DISCOVER_LIST_PROTOCOLS;
|
||||||
|
|
||||||
Skip = 0;
|
Skip = 0;
|
||||||
|
|
||||||
while (Skip < TotalProtocols) {
|
while (Skip < TotalProtocols) {
|
||||||
|
|
||||||
*MessageParams = Skip;
|
*MessageParams = Skip;
|
||||||
|
|
||||||
// Note PayloadLength is a IN/OUT parameter.
|
// Note PayloadLength is a IN/OUT parameter.
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2017-2021, Arm Limited. All rights reserved.
|
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ ClockGetVersion (
|
|||||||
OUT UINT32 *Version
|
OUT UINT32 *Version
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return ScmiGetProtocolVersion (ScmiProtocolIdClock, Version);
|
return ScmiGetProtocolVersion (SCMI_PROTOCOL_ID_CLOCK, Version);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return total number of clock devices supported by the clock management
|
/** Return total number of clock devices supported by the clock management
|
||||||
@@ -76,7 +76,7 @@ ClockGetTotalClocks (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 *ReturnValues;
|
UINT32 *ReturnValues;
|
||||||
|
|
||||||
Status = ScmiGetProtocolAttributes (ScmiProtocolIdClock, &ReturnValues);
|
Status = ScmiGetProtocolAttributes (SCMI_PROTOCOL_ID_CLOCK, &ReturnValues);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@@ -122,8 +122,8 @@ ClockGetClockAttributes (
|
|||||||
|
|
||||||
*MessageParams = ClockId;
|
*MessageParams = ClockId;
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdClock;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_CLOCK;
|
||||||
Cmd.MessageId = ScmiMessageIdClockAttributes;
|
Cmd.MessageId = SCMI_MESSAGE_ID_CLOCK_ATTRIBUTES;
|
||||||
|
|
||||||
PayloadLength = sizeof (ClockId);
|
PayloadLength = sizeof (ClockId);
|
||||||
|
|
||||||
@@ -135,7 +135,6 @@ ClockGetClockAttributes (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TRUE if bit 0 of ClockAttributes->Attributes is set.
|
// TRUE if bit 0 of ClockAttributes->Attributes is set.
|
||||||
*Enabled = CLOCK_ENABLED (ClockAttributes->Attributes);
|
*Enabled = CLOCK_ENABLED (ClockAttributes->Attributes);
|
||||||
|
|
||||||
@@ -153,10 +152,10 @@ ClockGetClockAttributes (
|
|||||||
@param[in] This A pointer to SCMI_CLOCK_PROTOCOL Instance.
|
@param[in] This A pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||||
@param[in] ClockId Identifier for the clock device.
|
@param[in] ClockId Identifier for the clock device.
|
||||||
|
|
||||||
@param[out] Format ScmiClockRateFormatDiscrete: Clock device
|
@param[out] Format SCMI_CLOCK_RATE_FORMAT_DISCRETE: Clock device
|
||||||
supports range of clock rates which are non-linear.
|
supports range of clock rates which are non-linear.
|
||||||
|
|
||||||
ScmiClockRateFormatLinear: Clock device supports
|
SCMI_CLOCK_RATE_FORMAT_LINEAR: Clock device supports
|
||||||
range of linear clock rates from Min to Max in steps.
|
range of linear clock rates from Min to Max in steps.
|
||||||
|
|
||||||
@param[out] TotalRates Total number of rates.
|
@param[out] TotalRates Total number of rates.
|
||||||
@@ -190,26 +189,25 @@ ClockDescribeRates (
|
|||||||
CLOCK_DESCRIBE_RATES *DescribeRates;
|
CLOCK_DESCRIBE_RATES *DescribeRates;
|
||||||
CLOCK_RATE_DWORD *Rate;
|
CLOCK_RATE_DWORD *Rate;
|
||||||
|
|
||||||
UINT32 RequiredArraySize;
|
UINT32 RequiredArraySize = 0;
|
||||||
UINT32 RateIndex;
|
UINT32 RateIndex = 0;
|
||||||
UINT32 RateNo;
|
UINT32 RateNo;
|
||||||
UINT32 RateOffset;
|
UINT32 RateOffset;
|
||||||
|
|
||||||
*TotalRates = 0;
|
*TotalRates = 0;
|
||||||
RequiredArraySize = 0;
|
|
||||||
RateIndex = 0;
|
|
||||||
|
|
||||||
Status = ScmiCommandGetPayload (&MessageParams);
|
Status = ScmiCommandGetPayload (&MessageParams);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdClock;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_CLOCK;
|
||||||
Cmd.MessageId = ScmiMessageIdClockDescribeRates;
|
Cmd.MessageId = SCMI_MESSAGE_ID_CLOCK_DESCRIBE_RATES;
|
||||||
|
|
||||||
*MessageParams++ = ClockId;
|
*MessageParams++ = ClockId;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
*MessageParams = RateIndex;
|
*MessageParams = RateIndex;
|
||||||
|
|
||||||
// Set Payload length, note PayloadLength is a IN/OUT parameter.
|
// Set Payload length, note PayloadLength is a IN/OUT parameter.
|
||||||
@@ -236,7 +234,7 @@ ClockDescribeRates (
|
|||||||
*TotalRates = NUM_RATES (DescribeRates->NumRatesFlags)
|
*TotalRates = NUM_RATES (DescribeRates->NumRatesFlags)
|
||||||
+ NUM_REMAIN_RATES (DescribeRates->NumRatesFlags);
|
+ NUM_REMAIN_RATES (DescribeRates->NumRatesFlags);
|
||||||
|
|
||||||
if (*Format == ScmiClockRateFormatDiscrete) {
|
if (*Format == SCMI_CLOCK_RATE_FORMAT_DISCRETE) {
|
||||||
RequiredArraySize = (*TotalRates) * sizeof (UINT64);
|
RequiredArraySize = (*TotalRates) * sizeof (UINT64);
|
||||||
} else {
|
} else {
|
||||||
// We need to return triplet of 64 bit value for each rate
|
// We need to return triplet of 64 bit value for each rate
|
||||||
@@ -251,30 +249,26 @@ ClockDescribeRates (
|
|||||||
|
|
||||||
RateOffset = 0;
|
RateOffset = 0;
|
||||||
|
|
||||||
if (*Format == ScmiClockRateFormatDiscrete) {
|
if (*Format == SCMI_CLOCK_RATE_FORMAT_DISCRETE) {
|
||||||
for (RateNo = 0; RateNo < NUM_RATES (DescribeRates->NumRatesFlags); RateNo++) {
|
for (RateNo = 0; RateNo < NUM_RATES (DescribeRates->NumRatesFlags); RateNo++) {
|
||||||
Rate = &DescribeRates->Rates[RateOffset++];
|
Rate = &DescribeRates->Rates[RateOffset++];
|
||||||
// Non-linear discrete rates.
|
// Non-linear discrete rates.
|
||||||
RateArray[RateIndex++].DiscreteRate.Rate =
|
RateArray[RateIndex++].Rate = ConvertTo64Bit (Rate->Low, Rate->High);
|
||||||
ConvertTo64Bit (Rate->Low, Rate->High);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (RateNo = 0; RateNo < NUM_RATES (DescribeRates->NumRatesFlags); RateNo++) {
|
for (RateNo = 0; RateNo < NUM_RATES (DescribeRates->NumRatesFlags); RateNo++) {
|
||||||
// Linear clock rates from minimum to maximum in steps
|
// Linear clock rates from minimum to maximum in steps
|
||||||
// Minimum clock rate.
|
// Minimum clock rate.
|
||||||
Rate = &DescribeRates->Rates[RateOffset++];
|
Rate = &DescribeRates->Rates[RateOffset++];
|
||||||
RateArray[RateIndex].ContinuousRate.Min =
|
RateArray[RateIndex].Min = ConvertTo64Bit (Rate->Low, Rate->High);
|
||||||
ConvertTo64Bit (Rate->Low, Rate->High);
|
|
||||||
|
|
||||||
Rate = &DescribeRates->Rates[RateOffset++];
|
Rate = &DescribeRates->Rates[RateOffset++];
|
||||||
// Maximum clock rate.
|
// Maximum clock rate.
|
||||||
RateArray[RateIndex].ContinuousRate.Max =
|
RateArray[RateIndex].Max = ConvertTo64Bit (Rate->Low, Rate->High);
|
||||||
ConvertTo64Bit (Rate->Low, Rate->High);
|
|
||||||
|
|
||||||
Rate = &DescribeRates->Rates[RateOffset++];
|
Rate = &DescribeRates->Rates[RateOffset++];
|
||||||
// Step.
|
// Step.
|
||||||
RateArray[RateIndex++].ContinuousRate.Step =
|
RateArray[RateIndex++].Step = ConvertTo64Bit (Rate->Low, Rate->High);
|
||||||
ConvertTo64Bit (Rate->Low, Rate->High);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (NUM_REMAIN_RATES (DescribeRates->NumRatesFlags) != 0);
|
} while (NUM_REMAIN_RATES (DescribeRates->NumRatesFlags) != 0);
|
||||||
@@ -320,8 +314,8 @@ ClockRateGet (
|
|||||||
// Fill arguments for clock protocol command.
|
// Fill arguments for clock protocol command.
|
||||||
*MessageParams = ClockId;
|
*MessageParams = ClockId;
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdClock;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_CLOCK;
|
||||||
Cmd.MessageId = ScmiMessageIdClockRateGet;
|
Cmd.MessageId = SCMI_MESSAGE_ID_CLOCK_RATE_GET;
|
||||||
|
|
||||||
PayloadLength = sizeof (ClockId);
|
PayloadLength = sizeof (ClockId);
|
||||||
|
|
||||||
@@ -374,8 +368,8 @@ ClockRateSet (
|
|||||||
ClockRateSetAttributes->Rate.Low = (UINT32)Rate;
|
ClockRateSetAttributes->Rate.Low = (UINT32)Rate;
|
||||||
ClockRateSetAttributes->Rate.High = (UINT32)(Rate >> 32);
|
ClockRateSetAttributes->Rate.High = (UINT32)(Rate >> 32);
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdClock;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_CLOCK;
|
||||||
Cmd.MessageId = ScmiMessageIdClockRateSet;
|
Cmd.MessageId = SCMI_MESSAGE_ID_CLOCK_RATE_SET;
|
||||||
|
|
||||||
PayloadLength = sizeof (CLOCK_RATE_SET_ATTRIBUTES);
|
PayloadLength = sizeof (CLOCK_RATE_SET_ATTRIBUTES);
|
||||||
|
|
||||||
@@ -421,8 +415,8 @@ ClockEnable (
|
|||||||
ClockConfigSetAttributes->ClockId = ClockId;
|
ClockConfigSetAttributes->ClockId = ClockId;
|
||||||
ClockConfigSetAttributes->Attributes = Enable ? BIT0 : 0;
|
ClockConfigSetAttributes->Attributes = Enable ? BIT0 : 0;
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdClock;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_CLOCK;
|
||||||
Cmd.MessageId = ScmiMessageIdClockConfigSet;
|
Cmd.MessageId = SCMI_MESSAGE_ID_CLOCK_CONFIG_SET;
|
||||||
|
|
||||||
PayloadLength = sizeof (CLOCK_CONFIG_SET_ATTRIBUTES);
|
PayloadLength = sizeof (CLOCK_CONFIG_SET_ATTRIBUTES);
|
||||||
|
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2017-2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@par Specification Reference:
|
System Control and Management Interface V1.0
|
||||||
- Arm System Control and Management Interface - Platform Design Document
|
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||||
(https://developer.arm.com/documentation/den0056/)
|
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include <Base.h>
|
#include <Base.h>
|
||||||
@@ -24,9 +24,9 @@
|
|||||||
#include "ScmiPrivate.h"
|
#include "ScmiPrivate.h"
|
||||||
|
|
||||||
STATIC CONST SCMI_PROTOCOL_ENTRY Protocols[] = {
|
STATIC CONST SCMI_PROTOCOL_ENTRY Protocols[] = {
|
||||||
{ ScmiProtocolIdBase, ScmiBaseProtocolInit },
|
{ SCMI_PROTOCOL_ID_BASE, ScmiBaseProtocolInit },
|
||||||
{ ScmiProtocolIdPerformance, ScmiPerformanceProtocolInit },
|
{ SCMI_PROTOCOL_ID_PERFORMANCE, ScmiPerformanceProtocolInit },
|
||||||
{ ScmiProtocolIdClock, ScmiClockProtocolInit }
|
{ SCMI_PROTOCOL_ID_CLOCK, ScmiClockProtocolInit }
|
||||||
};
|
};
|
||||||
|
|
||||||
/** ARM SCMI driver entry point function.
|
/** ARM SCMI driver entry point function.
|
||||||
@@ -61,7 +61,7 @@ ArmScmiDxeEntryPoint (
|
|||||||
UINT32 SupportedListSize;
|
UINT32 SupportedListSize;
|
||||||
|
|
||||||
// Every SCMI implementation must implement the base protocol.
|
// Every SCMI implementation must implement the base protocol.
|
||||||
ASSERT (Protocols[0].Id == ScmiProtocolIdBase);
|
ASSERT (Protocols[0].Id == SCMI_PROTOCOL_ID_BASE);
|
||||||
|
|
||||||
Status = ScmiBaseProtocolInit (&ImageHandle);
|
Status = ScmiBaseProtocolInit (&ImageHandle);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@@ -86,10 +86,7 @@ ArmScmiDxeEntryPoint (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Accept any version between SCMI v1.0 and SCMI v2.0
|
if (Version != BASE_PROTOCOL_VERSION) {
|
||||||
if ((Version < BASE_PROTOCOL_VERSION_V1) ||
|
|
||||||
(Version > BASE_PROTOCOL_VERSION_V2))
|
|
||||||
{
|
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@@ -131,8 +128,7 @@ ArmScmiDxeEntryPoint (
|
|||||||
|
|
||||||
// Install supported protocol on ImageHandle.
|
// Install supported protocol on ImageHandle.
|
||||||
for (ProtocolIndex = 1; ProtocolIndex < ARRAY_SIZE (Protocols);
|
for (ProtocolIndex = 1; ProtocolIndex < ARRAY_SIZE (Protocols);
|
||||||
ProtocolIndex++)
|
ProtocolIndex++) {
|
||||||
{
|
|
||||||
for (Index = 0; Index < NumProtocols; Index++) {
|
for (Index = 0; Index < NumProtocols; Index++) {
|
||||||
if (Protocols[ProtocolIndex].Id == SupportedList[Index]) {
|
if (Protocols[ProtocolIndex].Id == SupportedList[Index]) {
|
||||||
Status = Protocols[ProtocolIndex].InitFn (&ImageHandle);
|
Status = Protocols[ProtocolIndex].InitFn (&ImageHandle);
|
||||||
@@ -140,7 +136,6 @@ ArmScmiDxeEntryPoint (
|
|||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef SCMI_DXE_H_
|
#ifndef SCMI_DXE_H_
|
||||||
#define SCMI_DXE_H_
|
#define SCMI_DXE_H_
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2017-2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ PerformanceGetVersion (
|
|||||||
OUT UINT32 *Version
|
OUT UINT32 *Version
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return ScmiGetProtocolVersion (ScmiProtocolIdPerformance, Version);
|
return ScmiGetProtocolVersion (SCMI_PROTOCOL_ID_PERFORMANCE, Version);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return protocol attributes of the performance management protocol.
|
/** Return protocol attributes of the performance management protocol.
|
||||||
@@ -59,7 +59,7 @@ PerformanceGetAttributes (
|
|||||||
UINT32* ReturnValues;
|
UINT32* ReturnValues;
|
||||||
|
|
||||||
Status = ScmiGetProtocolAttributes (
|
Status = ScmiGetProtocolAttributes (
|
||||||
ScmiProtocolIdPerformance,
|
SCMI_PROTOCOL_ID_PERFORMANCE,
|
||||||
&ReturnValues
|
&ReturnValues
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@@ -107,8 +107,8 @@ PerformanceDomainAttributes (
|
|||||||
|
|
||||||
*MessageParams = DomainId;
|
*MessageParams = DomainId;
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdPerformance;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||||
Cmd.MessageId = ScmiMessageIdPerformanceDomainAttributes;
|
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_DOMAIN_ATTRIBUTES;
|
||||||
|
|
||||||
PayloadLength = sizeof (DomainId);
|
PayloadLength = sizeof (DomainId);
|
||||||
|
|
||||||
@@ -179,10 +179,11 @@ PerformanceDescribeLevels (
|
|||||||
|
|
||||||
*MessageParams++ = DomainId;
|
*MessageParams++ = DomainId;
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdPerformance;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||||
Cmd.MessageId = ScmiMessageIdPerformanceDescribeLevels;
|
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_DESCRIBE_LEVELS;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
*MessageParams = LevelIndex;
|
*MessageParams = LevelIndex;
|
||||||
|
|
||||||
// Note, PayloadLength is an IN/OUT parameter.
|
// Note, PayloadLength is an IN/OUT parameter.
|
||||||
@@ -218,6 +219,7 @@ PerformanceDescribeLevels (
|
|||||||
sizeof (SCMI_PERFORMANCE_LEVEL)
|
sizeof (SCMI_PERFORMANCE_LEVEL)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (ReturnRemainNumLevels != 0);
|
} while (ReturnRemainNumLevels != 0);
|
||||||
|
|
||||||
*LevelArraySize = RequiredSize;
|
*LevelArraySize = RequiredSize;
|
||||||
@@ -256,8 +258,8 @@ PerformanceLimitsSet (
|
|||||||
*MessageParams++ = Limits->RangeMax;
|
*MessageParams++ = Limits->RangeMax;
|
||||||
*MessageParams = Limits->RangeMin;
|
*MessageParams = Limits->RangeMin;
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdPerformance;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||||
Cmd.MessageId = ScmiMessageIdPerformanceLimitsSet;
|
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_SET;
|
||||||
|
|
||||||
PayloadLength = sizeof (DomainId) + sizeof (SCMI_PERFORMANCE_LIMITS);
|
PayloadLength = sizeof (DomainId) + sizeof (SCMI_PERFORMANCE_LIMITS);
|
||||||
|
|
||||||
@@ -302,8 +304,8 @@ PerformanceLimitsGet (
|
|||||||
|
|
||||||
*MessageParams = DomainId;
|
*MessageParams = DomainId;
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdPerformance;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||||
Cmd.MessageId = ScmiMessageIdPerformanceLimitsGet;
|
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_GET;
|
||||||
|
|
||||||
PayloadLength = sizeof (DomainId);
|
PayloadLength = sizeof (DomainId);
|
||||||
|
|
||||||
@@ -352,8 +354,8 @@ PerformanceLevelSet (
|
|||||||
*MessageParams++ = DomainId;
|
*MessageParams++ = DomainId;
|
||||||
*MessageParams = Level;
|
*MessageParams = Level;
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdPerformance;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||||
Cmd.MessageId = ScmiMessageIdPerformanceLevelSet;
|
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_SET;
|
||||||
|
|
||||||
PayloadLength = sizeof (DomainId) + sizeof (Level);
|
PayloadLength = sizeof (DomainId) + sizeof (Level);
|
||||||
|
|
||||||
@@ -397,8 +399,8 @@ PerformanceLevelGet (
|
|||||||
|
|
||||||
*MessageParams = DomainId;
|
*MessageParams = DomainId;
|
||||||
|
|
||||||
Cmd.ProtocolId = ScmiProtocolIdPerformance;
|
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||||
Cmd.MessageId = ScmiMessageIdPerformanceLevelGet;
|
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_GET;
|
||||||
|
|
||||||
PayloadLength = sizeof (DomainId);
|
PayloadLength = sizeof (DomainId);
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2017-2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@@ -8,47 +8,46 @@
|
|||||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef SCMI_PRIVATE_H_
|
#ifndef SCMI_PRIVATE_H_
|
||||||
#define SCMI_PRIVATE_H_
|
#define SCMI_PRIVATE_H_
|
||||||
|
|
||||||
// SCMI protocol IDs.
|
// SCMI protocol IDs.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ScmiProtocolIdBase = 0x10,
|
SCMI_PROTOCOL_ID_BASE = 0x10,
|
||||||
ScmiProtocolIdPowerDomain = 0x11,
|
SCMI_PROTOCOL_ID_POWER_DOMAIN = 0x11,
|
||||||
ScmiProtocolIdSystemPower = 0x12,
|
SCMI_PROTOCOL_ID_SYSTEM_POWER = 0x12,
|
||||||
ScmiProtocolIdPerformance = 0x13,
|
SCMI_PROTOCOL_ID_PERFORMANCE = 0x13,
|
||||||
ScmiProtocolIdClock = 0x14,
|
SCMI_PROTOCOL_ID_CLOCK = 0x14,
|
||||||
ScmiProtocolIdSensor = 0x15
|
SCMI_PROTOCOL_ID_SENSOR = 0x15
|
||||||
} SCMI_PROTOCOL_ID;
|
} SCMI_PROTOCOL_ID;
|
||||||
|
|
||||||
// SCMI message types.
|
// SCMI message types.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ScmiMessageTypeCommand = 0,
|
SCMI_MESSAGE_TYPE_COMMAND = 0,
|
||||||
ScmiMessageTypeDelayedResponse = 2, // Skipping 1 is deliberate.
|
SCMI_MESSAGE_TYPE_DELAYED_RESPONSE = 2, // Skipping 1 is deliberate.
|
||||||
ScmiMessageTypeNotification = 3
|
SCMI_MESSAGE_TYPE_NOTIFICATION = 3
|
||||||
} SCMI_MESSAGE_TYPE;
|
} SCMI_MESSAGE_TYPE;
|
||||||
|
|
||||||
// SCMI response error codes.
|
// SCMI response error codes.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ScmiSuccess = 0,
|
SCMI_SUCCESS = 0,
|
||||||
ScmiNotSupported = -1,
|
SCMI_NOT_SUPPORTED = -1,
|
||||||
ScmiInvalidParameters = -2,
|
SCMI_INVALID_PARAMETERS = -2,
|
||||||
ScmiDenied = -3,
|
SCMI_DENIED = -3,
|
||||||
ScmiNotFound = -4,
|
SCMI_NOT_FOUND = -4,
|
||||||
ScmiOutOfRange = -5,
|
SCMI_OUT_OF_RANGE = -5,
|
||||||
ScmiBusy = -6,
|
SCMI_BUSY = -6,
|
||||||
ScmiCommsError = -7,
|
SCMI_COMMS_ERROR = -7,
|
||||||
ScmiGenericError = -8,
|
SCMI_GENERIC_ERROR = -8,
|
||||||
ScmiHardwareError = -9,
|
SCMI_HARDWARE_ERROR = -9,
|
||||||
ScmiProtocolError = -10
|
SCMI_PROTOCOL_ERROR = -10
|
||||||
} SCMI_STATUS;
|
} SCMI_STATUS;
|
||||||
|
|
||||||
// SCMI message IDs common to all protocols.
|
// SCMI message IDs common to all protocols.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ScmiMessageIdProtocolVersion = 0x0,
|
SCMI_MESSAGE_ID_PROTOCOL_VERSION = 0x0,
|
||||||
ScmiMessageIdProtocolAttributes = 0x1,
|
SCMI_MESSAGE_ID_PROTOCOL_ATTRIBUTES = 0x1,
|
||||||
ScmiMessageIdProtocolMessageAttributes = 0x2
|
SCMI_MESSAGE_ID_PROTOCOL_MESSAGE_ATTRIBUTES = 0x2
|
||||||
} SCMI_MESSAGE_ID;
|
} SCMI_MESSAGE_ID;
|
||||||
|
|
||||||
// Not defined in SCMI specification but will help to identify a message.
|
// Not defined in SCMI specification but will help to identify a message.
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 2009, Hewlett-Packard Company. All rights reserved.<BR>
|
Copyright (c) 2009, Hewlett-Packard Company. All rights reserved.<BR>
|
||||||
Portions copyright (c) 2010, Apple Inc. All rights reserved.<BR>
|
Portions copyright (c) 2010, Apple Inc. All rights reserved.<BR>
|
||||||
Portions copyright (c) 2011-2021, Arm Limited. All rights reserved.<BR>
|
Portions copyright (c) 2011-2013, ARM Ltd. All rights reserved.<BR>
|
||||||
Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
@@ -52,11 +52,9 @@ PageAttributeToGcdAttribute (
|
|||||||
GcdAttributes = EFI_MEMORY_WB;
|
GcdAttributes = EFI_MEMORY_WB;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DEBUG ((
|
DEBUG ((DEBUG_ERROR,
|
||||||
DEBUG_ERROR,
|
|
||||||
"PageAttributeToGcdAttribute: PageAttributes:0x%lX not supported.\n",
|
"PageAttributeToGcdAttribute: PageAttributes:0x%lX not supported.\n",
|
||||||
PageAttributes
|
PageAttributes));
|
||||||
));
|
|
||||||
ASSERT (0);
|
ASSERT (0);
|
||||||
// The Global Coherency Domain (GCD) value is defined as a bit set.
|
// The Global Coherency Domain (GCD) value is defined as a bit set.
|
||||||
// Returning 0 means no attribute has been set.
|
// Returning 0 means no attribute has been set.
|
||||||
@@ -65,8 +63,7 @@ PageAttributeToGcdAttribute (
|
|||||||
|
|
||||||
// Determine protection attributes
|
// Determine protection attributes
|
||||||
if (((PageAttributes & TT_AP_MASK) == TT_AP_NO_RO) ||
|
if (((PageAttributes & TT_AP_MASK) == TT_AP_NO_RO) ||
|
||||||
((PageAttributes & TT_AP_MASK) == TT_AP_RO_RO))
|
((PageAttributes & TT_AP_MASK) == TT_AP_RO_RO)) {
|
||||||
{
|
|
||||||
// Read only cases map to write-protect
|
// Read only cases map to write-protect
|
||||||
GcdAttributes |= EFI_MEMORY_RO;
|
GcdAttributes |= EFI_MEMORY_RO;
|
||||||
}
|
}
|
||||||
@@ -91,7 +88,7 @@ GetFirstPageAttribute (
|
|||||||
// Get the first entry of the table
|
// Get the first entry of the table
|
||||||
FirstEntry = *FirstLevelTableAddress;
|
FirstEntry = *FirstLevelTableAddress;
|
||||||
|
|
||||||
if ((TableLevel != 3) && ((FirstEntry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY)) {
|
if ((TableLevel != 3) && (FirstEntry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) {
|
||||||
// Only valid for Levels 0, 1 and 2
|
// Only valid for Levels 0, 1 and 2
|
||||||
|
|
||||||
// Get the attribute of the subsequent table
|
// Get the attribute of the subsequent table
|
||||||
@@ -141,18 +138,14 @@ GetNextEntryAttribute (
|
|||||||
|
|
||||||
// If Entry is a Table Descriptor type entry then go through the sub-level table
|
// If Entry is a Table Descriptor type entry then go through the sub-level table
|
||||||
if ((EntryType == TT_TYPE_BLOCK_ENTRY) ||
|
if ((EntryType == TT_TYPE_BLOCK_ENTRY) ||
|
||||||
((TableLevel == 3) && (EntryType == TT_TYPE_BLOCK_ENTRY_LEVEL3)))
|
((TableLevel == 3) && (EntryType == TT_TYPE_BLOCK_ENTRY_LEVEL3))) {
|
||||||
{
|
|
||||||
if ((*PrevEntryAttribute == INVALID_ENTRY) || (EntryAttribute != *PrevEntryAttribute)) {
|
if ((*PrevEntryAttribute == INVALID_ENTRY) || (EntryAttribute != *PrevEntryAttribute)) {
|
||||||
if (*PrevEntryAttribute != INVALID_ENTRY) {
|
if (*PrevEntryAttribute != INVALID_ENTRY) {
|
||||||
// Update GCD with the last region
|
// Update GCD with the last region
|
||||||
SetGcdMemorySpaceAttributes (
|
SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
|
||||||
MemorySpaceMap,
|
|
||||||
NumberOfDescriptors,
|
|
||||||
*StartGcdRegion,
|
*StartGcdRegion,
|
||||||
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
|
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
|
||||||
PageAttributeToGcdAttribute (*PrevEntryAttribute)
|
PageAttributeToGcdAttribute (*PrevEntryAttribute));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start of the new region
|
// Start of the new region
|
||||||
@@ -166,24 +159,17 @@ GetNextEntryAttribute (
|
|||||||
ASSERT (TableLevel < 3);
|
ASSERT (TableLevel < 3);
|
||||||
|
|
||||||
// Increase the level number and scan the sub-level table
|
// Increase the level number and scan the sub-level table
|
||||||
GetNextEntryAttribute (
|
GetNextEntryAttribute ((UINT64*)(Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE),
|
||||||
(UINT64 *)(Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE),
|
TT_ENTRY_COUNT, TableLevel + 1,
|
||||||
TT_ENTRY_COUNT,
|
|
||||||
TableLevel + 1,
|
|
||||||
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))),
|
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))),
|
||||||
PrevEntryAttribute,
|
PrevEntryAttribute, StartGcdRegion);
|
||||||
StartGcdRegion
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
if (*PrevEntryAttribute != INVALID_ENTRY) {
|
if (*PrevEntryAttribute != INVALID_ENTRY) {
|
||||||
// Update GCD with the last region
|
// Update GCD with the last region
|
||||||
SetGcdMemorySpaceAttributes (
|
SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
|
||||||
MemorySpaceMap,
|
|
||||||
NumberOfDescriptors,
|
|
||||||
*StartGcdRegion,
|
*StartGcdRegion,
|
||||||
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
|
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
|
||||||
PageAttributeToGcdAttribute (*PrevEntryAttribute)
|
PageAttributeToGcdAttribute (*PrevEntryAttribute));
|
||||||
);
|
|
||||||
|
|
||||||
// Start of the new region
|
// Start of the new region
|
||||||
*StartGcdRegion = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel));
|
*StartGcdRegion = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel));
|
||||||
@@ -203,7 +189,7 @@ SyncCacheConfig (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 PageAttribute;
|
UINT32 PageAttribute = 0;
|
||||||
UINT64 *FirstLevelTableAddress;
|
UINT64 *FirstLevelTableAddress;
|
||||||
UINTN TableLevel;
|
UINTN TableLevel;
|
||||||
UINTN TableCount;
|
UINTN TableCount;
|
||||||
@@ -246,24 +232,17 @@ SyncCacheConfig (
|
|||||||
|
|
||||||
// We scan from the start of the memory map (ie: at the address 0x0)
|
// We scan from the start of the memory map (ie: at the address 0x0)
|
||||||
BaseAddressGcdRegion = 0x0;
|
BaseAddressGcdRegion = 0x0;
|
||||||
EndAddressGcdRegion = GetNextEntryAttribute (
|
EndAddressGcdRegion = GetNextEntryAttribute (FirstLevelTableAddress,
|
||||||
FirstLevelTableAddress,
|
TableCount, TableLevel,
|
||||||
TableCount,
|
|
||||||
TableLevel,
|
|
||||||
BaseAddressGcdRegion,
|
BaseAddressGcdRegion,
|
||||||
&PageAttribute,
|
&PageAttribute, &BaseAddressGcdRegion);
|
||||||
&BaseAddressGcdRegion
|
|
||||||
);
|
|
||||||
|
|
||||||
// Update GCD with the last region if valid
|
// Update GCD with the last region if valid
|
||||||
if (PageAttribute != INVALID_ENTRY) {
|
if (PageAttribute != INVALID_ENTRY) {
|
||||||
SetGcdMemorySpaceAttributes (
|
SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
|
||||||
MemorySpaceMap,
|
|
||||||
NumberOfDescriptors,
|
|
||||||
BaseAddressGcdRegion,
|
BaseAddressGcdRegion,
|
||||||
EndAddressGcdRegion - BaseAddressGcdRegion,
|
EndAddressGcdRegion - BaseAddressGcdRegion,
|
||||||
PageAttributeToGcdAttribute (PageAttribute)
|
PageAttributeToGcdAttribute (PageAttribute));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (MemorySpaceMap);
|
FreePool (MemorySpaceMap);
|
||||||
@@ -285,7 +264,6 @@ EfiAttributeToArmAttribute (
|
|||||||
} else {
|
} else {
|
||||||
ArmAttributes = TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
|
ArmAttributes = TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case EFI_MEMORY_WC:
|
case EFI_MEMORY_WC:
|
||||||
ArmAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE;
|
ArmAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE;
|
||||||
@@ -304,12 +282,12 @@ EfiAttributeToArmAttribute (
|
|||||||
ArmAttributes |= TT_AF;
|
ArmAttributes |= TT_AF;
|
||||||
|
|
||||||
// Determine protection attributes
|
// Determine protection attributes
|
||||||
if ((EfiAttributes & EFI_MEMORY_RO) != 0) {
|
if (EfiAttributes & EFI_MEMORY_RO) {
|
||||||
ArmAttributes |= TT_AP_NO_RO;
|
ArmAttributes |= TT_AP_RO_RO;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process eXecute Never attribute
|
// Process eXecute Never attribute
|
||||||
if ((EfiAttributes & EFI_MEMORY_XP) != 0) {
|
if (EfiAttributes & EFI_MEMORY_XP) {
|
||||||
ArmAttributes |= TT_PXN_MASK;
|
ArmAttributes |= TT_PXN_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -352,10 +330,7 @@ GetMemoryRegionRec (
|
|||||||
NextTranslationTable, // Address of the next level page table
|
NextTranslationTable, // Address of the next level page table
|
||||||
TableLevel + 1, // Next Page Table level
|
TableLevel + 1, // Next Page Table level
|
||||||
(UINTN*)TT_LAST_BLOCK_ADDRESS(NextTranslationTable, TT_ENTRY_COUNT),
|
(UINTN*)TT_LAST_BLOCK_ADDRESS(NextTranslationTable, TT_ENTRY_COUNT),
|
||||||
BaseAddress,
|
BaseAddress, RegionLength, RegionAttributes);
|
||||||
RegionLength,
|
|
||||||
RegionAttributes
|
|
||||||
);
|
|
||||||
|
|
||||||
// In case of 'Success', it means the end of the block region has been found into the upper
|
// In case of 'Success', it means the end of the block region has been found into the upper
|
||||||
// level translation table
|
// level translation table
|
||||||
@@ -383,7 +358,6 @@ GetMemoryRegionRec (
|
|||||||
// In case we have found the end of the region we return success
|
// In case we have found the end of the region we return success
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockEntry++;
|
BlockEntry++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -414,14 +388,9 @@ GetMemoryRegion (
|
|||||||
// Get the Table info from T0SZ
|
// Get the Table info from T0SZ
|
||||||
GetRootTranslationTableInfo (T0SZ, &TableLevel, &EntryCount);
|
GetRootTranslationTableInfo (T0SZ, &TableLevel, &EntryCount);
|
||||||
|
|
||||||
Status = GetMemoryRegionRec (
|
Status = GetMemoryRegionRec (TranslationTable, TableLevel,
|
||||||
TranslationTable,
|
|
||||||
TableLevel,
|
|
||||||
(UINTN*)TT_LAST_BLOCK_ADDRESS(TranslationTable, EntryCount),
|
(UINTN*)TT_LAST_BLOCK_ADDRESS(TranslationTable, EntryCount),
|
||||||
BaseAddress,
|
BaseAddress, RegionLength, RegionAttributes);
|
||||||
RegionLength,
|
|
||||||
RegionAttributes
|
|
||||||
);
|
|
||||||
|
|
||||||
// If the region continues up to the end of the root table then GetMemoryRegionRec()
|
// If the region continues up to the end of the root table then GetMemoryRegionRec()
|
||||||
// will return EFI_NOT_FOUND
|
// will return EFI_NOT_FOUND
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 2009, Hewlett-Packard Company. All rights reserved.<BR>
|
Copyright (c) 2009, Hewlett-Packard Company. All rights reserved.<BR>
|
||||||
Portions copyright (c) 2010, Apple Inc. All rights reserved.<BR>
|
Portions copyright (c) 2010, Apple Inc. All rights reserved.<BR>
|
||||||
Portions copyright (c) 2013-2021, Arm Limited. All rights reserved.<BR>
|
Portions copyright (c) 2013, ARM Ltd. All rights reserved.<BR>
|
||||||
Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
@@ -155,8 +155,8 @@ SyncCacheConfigPage (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 i;
|
UINT32 i;
|
||||||
volatile ARM_PAGE_TABLE_ENTRY *SecondLevelTable;
|
volatile ARM_PAGE_TABLE_ENTRY *SecondLevelTable;
|
||||||
UINT32 NextPageAttributes;
|
UINT32 NextPageAttributes = 0;
|
||||||
UINT32 PageAttributes;
|
UINT32 PageAttributes = 0;
|
||||||
UINT32 BaseAddress;
|
UINT32 BaseAddress;
|
||||||
UINT64 GcdAttributes;
|
UINT64 GcdAttributes;
|
||||||
|
|
||||||
@@ -206,7 +206,6 @@ SyncCacheConfigPage (
|
|||||||
*NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
|
*NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
|
||||||
NextPageAttributes = 0;
|
NextPageAttributes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*NextRegionLength += TT_DESCRIPTOR_PAGE_SIZE;
|
*NextRegionLength += TT_DESCRIPTOR_PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,13 +226,14 @@ SyncCacheConfig (
|
|||||||
UINT32 i;
|
UINT32 i;
|
||||||
EFI_PHYSICAL_ADDRESS NextRegionBase;
|
EFI_PHYSICAL_ADDRESS NextRegionBase;
|
||||||
UINT64 NextRegionLength;
|
UINT64 NextRegionLength;
|
||||||
UINT32 NextSectionAttributes;
|
UINT32 NextSectionAttributes = 0;
|
||||||
UINT32 SectionAttributes;
|
UINT32 SectionAttributes = 0;
|
||||||
UINT64 GcdAttributes;
|
UINT64 GcdAttributes;
|
||||||
volatile ARM_FIRST_LEVEL_DESCRIPTOR *FirstLevelTable;
|
volatile ARM_FIRST_LEVEL_DESCRIPTOR *FirstLevelTable;
|
||||||
UINTN NumberOfDescriptors;
|
UINTN NumberOfDescriptors;
|
||||||
EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap;
|
EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap;
|
||||||
|
|
||||||
|
|
||||||
DEBUG ((DEBUG_PAGE, "SyncCacheConfig()\n"));
|
DEBUG ((DEBUG_PAGE, "SyncCacheConfig()\n"));
|
||||||
|
|
||||||
// This code assumes MMU is enabled and filed with section translations
|
// This code assumes MMU is enabled and filed with section translations
|
||||||
@@ -246,6 +246,7 @@ SyncCacheConfig (
|
|||||||
Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);
|
Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
|
||||||
// The GCD implementation maintains its own copy of the state of memory space attributes. GCD needs
|
// The GCD implementation maintains its own copy of the state of memory space attributes. GCD needs
|
||||||
// to know what the initial memory space attributes are. The CPU Arch. Protocol does not provide a
|
// to know what the initial memory space attributes are. The CPU Arch. Protocol does not provide a
|
||||||
// GetMemoryAttributes function for GCD to get this so we must resort to calling GCD (as if we were
|
// GetMemoryAttributes function for GCD to get this so we must resort to calling GCD (as if we were
|
||||||
@@ -283,7 +284,6 @@ SyncCacheConfig (
|
|||||||
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
||||||
NextSectionAttributes = SectionAttributes;
|
NextSectionAttributes = SectionAttributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
|
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
|
||||||
} else if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE(FirstLevelTable[i])) {
|
} else if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE(FirstLevelTable[i])) {
|
||||||
// In this case any bits set in the 'NextSectionAttributes' are garbage and were set from
|
// In this case any bits set in the 'NextSectionAttributes' are garbage and were set from
|
||||||
@@ -292,14 +292,9 @@ SyncCacheConfig (
|
|||||||
// section attributes into page attributes
|
// section attributes into page attributes
|
||||||
NextSectionAttributes = 0;
|
NextSectionAttributes = 0;
|
||||||
Status = SyncCacheConfigPage (
|
Status = SyncCacheConfigPage (
|
||||||
i,
|
i,FirstLevelTable[i],
|
||||||
FirstLevelTable[i],
|
NumberOfDescriptors, MemorySpaceMap,
|
||||||
NumberOfDescriptors,
|
&NextRegionBase,&NextRegionLength,&NextSectionAttributes);
|
||||||
MemorySpaceMap,
|
|
||||||
&NextRegionBase,
|
|
||||||
&NextRegionLength,
|
|
||||||
&NextSectionAttributes
|
|
||||||
);
|
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
} else {
|
} else {
|
||||||
// We do not support yet 16MB sections
|
// We do not support yet 16MB sections
|
||||||
@@ -318,7 +313,6 @@ SyncCacheConfig (
|
|||||||
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
||||||
NextSectionAttributes = 0;
|
NextSectionAttributes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
|
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
|
||||||
}
|
}
|
||||||
} // section entry loop
|
} // section entry loop
|
||||||
@@ -351,7 +345,7 @@ EfiAttributeToArmAttribute (
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_MEMORY_WC:
|
case EFI_MEMORY_WC:
|
||||||
// Map to normal non-cacheable
|
// Map to normal non-cachable
|
||||||
ArmAttributes = TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE; // TEX [2:0]= 001 = 0x2, B=0, C=0
|
ArmAttributes = TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE; // TEX [2:0]= 001 = 0x2, B=0, C=0
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -372,14 +366,14 @@ EfiAttributeToArmAttribute (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Determine protection attributes
|
// Determine protection attributes
|
||||||
if ((EfiAttributes & EFI_MEMORY_RO) != 0) {
|
if (EfiAttributes & EFI_MEMORY_RO) {
|
||||||
ArmAttributes |= TT_DESCRIPTOR_SECTION_AP_RO_RO;
|
ArmAttributes |= TT_DESCRIPTOR_SECTION_AP_RO_RO;
|
||||||
} else {
|
} else {
|
||||||
ArmAttributes |= TT_DESCRIPTOR_SECTION_AP_RW_RW;
|
ArmAttributes |= TT_DESCRIPTOR_SECTION_AP_RW_RW;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine eXecute Never attribute
|
// Determine eXecute Never attribute
|
||||||
if ((EfiAttributes & EFI_MEMORY_XP) != 0) {
|
if (EfiAttributes & EFI_MEMORY_XP) {
|
||||||
ArmAttributes |= TT_DESCRIPTOR_SECTION_XN_MASK;
|
ArmAttributes |= TT_DESCRIPTOR_SECTION_XN_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -500,8 +494,7 @@ GetMemoryRegion (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) ||
|
} else if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) ||
|
||||||
((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION))
|
((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION)) {
|
||||||
{
|
|
||||||
if ((SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK) != *RegionAttributes) {
|
if ((SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK) != *RegionAttributes) {
|
||||||
// If the attributes of the section differ from the one targeted then we exit the loop
|
// If the attributes of the section differ from the one targeted then we exit the loop
|
||||||
break;
|
break;
|
||||||
|
@@ -49,6 +49,7 @@ CpuFlushCpuDataCache (
|
|||||||
IN EFI_CPU_FLUSH_TYPE FlushType
|
IN EFI_CPU_FLUSH_TYPE FlushType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
switch (FlushType) {
|
switch (FlushType) {
|
||||||
case EfiCpuFlushTypeWriteBack:
|
case EfiCpuFlushTypeWriteBack:
|
||||||
WriteBackDataCacheRange ((VOID *)(UINTN)Start, (UINTN)Length);
|
WriteBackDataCacheRange ((VOID *)(UINTN)Start, (UINTN)Length);
|
||||||
@@ -66,6 +67,7 @@ CpuFlushCpuDataCache (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function enables interrupt processing by the processor.
|
This function enables interrupt processing by the processor.
|
||||||
|
|
||||||
@@ -86,6 +88,7 @@ CpuEnableInterrupt (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function disables interrupt processing by the processor.
|
This function disables interrupt processing by the processor.
|
||||||
|
|
||||||
@@ -106,6 +109,7 @@ CpuDisableInterrupt (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function retrieves the processor's current interrupt state a returns it in
|
This function retrieves the processor's current interrupt state a returns it in
|
||||||
State. If interrupts are currently enabled, then TRUE is returned. If interrupts
|
State. If interrupts are currently enabled, then TRUE is returned. If interrupts
|
||||||
@@ -134,6 +138,7 @@ CpuGetInterruptState (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function generates an INIT on the processor. If this function succeeds, then the
|
This function generates an INIT on the processor. If this function succeeds, then the
|
||||||
processor will be reset, and control will not be returned to the caller. If InitType is
|
processor will be reset, and control will not be returned to the caller. If InitType is
|
||||||
@@ -242,8 +247,7 @@ CpuDxeInitialize (
|
|||||||
|
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&mCpuHandle,
|
&mCpuHandle,
|
||||||
&gEfiCpuArchProtocolGuid,
|
&gEfiCpuArchProtocolGuid, &mCpu,
|
||||||
&mCpu,
|
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef CPU_DXE_H_
|
#ifndef __CPU_DXE_ARM_EXCEPTION_H__
|
||||||
#define CPU_DXE_H_
|
#define __CPU_DXE_ARM_EXCEPTION_H__
|
||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
|
|
||||||
@@ -59,6 +59,7 @@ RegisterInterruptHandler (
|
|||||||
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function registers and enables the handler specified by InterruptHandler for a processor
|
This function registers and enables the handler specified by InterruptHandler for a processor
|
||||||
interrupt or exception type specified by InterruptType. If InterruptHandler is NULL, then the
|
interrupt or exception type specified by InterruptType. If InterruptHandler is NULL, then the
|
||||||
@@ -85,6 +86,7 @@ RegisterDebuggerInterruptHandler (
|
|||||||
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuSetMemoryAttributes (
|
CpuSetMemoryAttributes (
|
||||||
@@ -141,4 +143,4 @@ SetGcdMemorySpaceAttributes (
|
|||||||
IN UINT64 Attributes
|
IN UINT64 Attributes
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // CPU_DXE_H_
|
#endif // __CPU_DXE_ARM_EXCEPTION_H__
|
||||||
|
@@ -43,22 +43,19 @@ SearchGcdMemorySpaces (
|
|||||||
*EndIndex = 0;
|
*EndIndex = 0;
|
||||||
for (Index = 0; Index < NumberOfDescriptors; Index++) {
|
for (Index = 0; Index < NumberOfDescriptors; Index++) {
|
||||||
if ((BaseAddress >= MemorySpaceMap[Index].BaseAddress) &&
|
if ((BaseAddress >= MemorySpaceMap[Index].BaseAddress) &&
|
||||||
(BaseAddress < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)))
|
(BaseAddress < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length))) {
|
||||||
{
|
|
||||||
*StartIndex = Index;
|
*StartIndex = Index;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((BaseAddress + Length - 1) >= MemorySpaceMap[Index].BaseAddress) &&
|
if (((BaseAddress + Length - 1) >= MemorySpaceMap[Index].BaseAddress) &&
|
||||||
((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)))
|
((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length))) {
|
||||||
{
|
|
||||||
*EndIndex = Index;
|
*EndIndex = Index;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sets the attributes for a specified range in Gcd Memory Space Map.
|
Sets the attributes for a specified range in Gcd Memory Space Map.
|
||||||
|
|
||||||
@@ -91,21 +88,14 @@ SetGcdMemorySpaceAttributes (
|
|||||||
EFI_PHYSICAL_ADDRESS RegionStart;
|
EFI_PHYSICAL_ADDRESS RegionStart;
|
||||||
UINT64 RegionLength;
|
UINT64 RegionLength;
|
||||||
|
|
||||||
DEBUG ((
|
DEBUG ((DEBUG_GCD, "SetGcdMemorySpaceAttributes[0x%lX; 0x%lX] = 0x%lX\n",
|
||||||
DEBUG_GCD,
|
BaseAddress, BaseAddress + Length, Attributes));
|
||||||
"SetGcdMemorySpaceAttributes[0x%lX; 0x%lX] = 0x%lX\n",
|
|
||||||
BaseAddress,
|
|
||||||
BaseAddress + Length,
|
|
||||||
Attributes
|
|
||||||
));
|
|
||||||
|
|
||||||
// We do not support a smaller granularity than 4KB on ARM Architecture
|
// We do not support a smaller granularity than 4KB on ARM Architecture
|
||||||
if ((Length & EFI_PAGE_MASK) != 0) {
|
if ((Length & EFI_PAGE_MASK) != 0) {
|
||||||
DEBUG ((
|
DEBUG ((DEBUG_WARN,
|
||||||
DEBUG_WARN,
|
|
||||||
"Warning: We do not support smaller granularity than 4KB on ARM Architecture (passed length: 0x%lX).\n",
|
"Warning: We do not support smaller granularity than 4KB on ARM Architecture (passed length: 0x%lX).\n",
|
||||||
Length
|
Length));
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -130,7 +120,6 @@ SetGcdMemorySpaceAttributes (
|
|||||||
if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeNonExistent) {
|
if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeNonExistent) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Calculate the start and end address of the overlapping range
|
// Calculate the start and end address of the overlapping range
|
||||||
//
|
//
|
||||||
@@ -139,13 +128,11 @@ SetGcdMemorySpaceAttributes (
|
|||||||
} else {
|
} else {
|
||||||
RegionStart = MemorySpaceMap[Index].BaseAddress;
|
RegionStart = MemorySpaceMap[Index].BaseAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)) {
|
if ((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)) {
|
||||||
RegionLength = BaseAddress + Length - RegionStart;
|
RegionLength = BaseAddress + Length - RegionStart;
|
||||||
} else {
|
} else {
|
||||||
RegionLength = MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - RegionStart;
|
RegionLength = MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - RegionStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Set memory attributes according to MTRR attribute and the original attribute of descriptor
|
// Set memory attributes according to MTRR attribute and the original attribute of descriptor
|
||||||
//
|
//
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2021, Arm Limited. All rights reserved.<BR>
|
* Copyright (c) 2011-2014, ARM Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
*
|
*
|
||||||
@@ -32,7 +32,7 @@ ARM_PROCESSOR_TABLE mArmProcessorTableTemplate = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/** Publish ARM Processor Data table in UEFI SYSTEM Table.
|
/** Publish ARM Processor Data table in UEFI SYSTEM Table.
|
||||||
* @param HobStart Pointer to the beginning of the HOB List from PEI.
|
* @param: HobStart Pointer to the beginning of the HOB List from PEI.
|
||||||
*
|
*
|
||||||
* Description : This function iterates through HOB list and finds ARM processor Table Entry HOB.
|
* Description : This function iterates through HOB list and finds ARM processor Table Entry HOB.
|
||||||
* If the ARM processor Table Entry HOB is found, the HOB data is copied to run-time memory
|
* If the ARM processor Table Entry HOB is found, the HOB data is copied to run-time memory
|
||||||
@@ -79,8 +79,7 @@ PublishArmProcessorTable (
|
|||||||
|
|
||||||
// Allocate runtime memory for ARM processor Table entries
|
// Allocate runtime memory for ARM processor Table entries
|
||||||
ArmProcessorTable->ArmCpus = (ARM_CORE_INFO*)AllocateRuntimePool (
|
ArmProcessorTable->ArmCpus = (ARM_CORE_INFO*)AllocateRuntimePool (
|
||||||
ArmProcessorTable->NumberOfEntries * sizeof (ARM_CORE_INFO)
|
ArmProcessorTable->NumberOfEntries * sizeof(ARM_CORE_INFO));
|
||||||
);
|
|
||||||
|
|
||||||
// Check if the memory allocation is successful or not
|
// Check if the memory allocation is successful or not
|
||||||
ASSERT(NULL != ArmProcessorTable->ArmCpus);
|
ASSERT(NULL != ArmProcessorTable->ArmCpus);
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||||
Portions Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>
|
Portions Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@@ -14,8 +14,7 @@
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
InitializeExceptions (
|
InitializeExceptions (
|
||||||
IN EFI_CPU_ARCH_PROTOCOL *Cpu
|
IN EFI_CPU_ARCH_PROTOCOL *Cpu
|
||||||
)
|
) {
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_VECTOR_HANDOFF_INFO *VectorInfoList;
|
EFI_VECTOR_HANDOFF_INFO *VectorInfoList;
|
||||||
EFI_VECTOR_HANDOFF_INFO *VectorInfo;
|
EFI_VECTOR_HANDOFF_INFO *VectorInfo;
|
||||||
@@ -24,7 +23,7 @@ InitializeExceptions (
|
|||||||
|
|
||||||
VectorInfo = (EFI_VECTOR_HANDOFF_INFO *)NULL;
|
VectorInfo = (EFI_VECTOR_HANDOFF_INFO *)NULL;
|
||||||
Status = EfiGetSystemConfigurationTable(&gEfiVectorHandoffTableGuid, (VOID **)&VectorInfoList);
|
Status = EfiGetSystemConfigurationTable(&gEfiVectorHandoffTableGuid, (VOID **)&VectorInfoList);
|
||||||
if ((Status == EFI_SUCCESS) && (VectorInfoList != NULL)) {
|
if (Status == EFI_SUCCESS && VectorInfoList != NULL) {
|
||||||
VectorInfo = VectorInfoList;
|
VectorInfo = VectorInfoList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,8 +92,7 @@ EFI_STATUS
|
|||||||
RegisterInterruptHandler(
|
RegisterInterruptHandler(
|
||||||
IN EFI_EXCEPTION_TYPE InterruptType,
|
IN EFI_EXCEPTION_TYPE InterruptType,
|
||||||
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
||||||
)
|
) {
|
||||||
{
|
|
||||||
// pass down to CpuExceptionHandlerLib
|
// pass down to CpuExceptionHandlerLib
|
||||||
return (EFI_STATUS)RegisterCpuInterruptHandler(InterruptType, InterruptHandler);
|
return (EFI_STATUS)RegisterCpuInterruptHandler(InterruptType, InterruptHandler);
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,8 @@ Abstract:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// The package level header files this module uses
|
// The package level header files this module uses
|
||||||
//
|
//
|
||||||
|
@@ -5,9 +5,8 @@
|
|||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
#ifndef __GENERIC_WATCHDOG_H__
|
||||||
#ifndef GENERIC_WATCHDOG_H_
|
#define __GENERIC_WATCHDOG_H__
|
||||||
#define GENERIC_WATCHDOG_H_
|
|
||||||
|
|
||||||
// Refresh Frame:
|
// Refresh Frame:
|
||||||
#define GENERIC_WDOG_REFRESH_REG ((UINTN)FixedPcdGet64 (PcdGenericWatchdogRefreshBase) + 0x000)
|
#define GENERIC_WDOG_REFRESH_REG ((UINTN)FixedPcdGet64 (PcdGenericWatchdogRefreshBase) + 0x000)
|
||||||
@@ -22,4 +21,4 @@
|
|||||||
#define GENERIC_WDOG_ENABLED 1
|
#define GENERIC_WDOG_ENABLED 1
|
||||||
#define GENERIC_WDOG_DISABLED 0
|
#define GENERIC_WDOG_DISABLED 0
|
||||||
|
|
||||||
#endif // GENERIC_WATCHDOG_H_
|
#endif // __GENERIC_WATCHDOG_H__
|
||||||
|
@@ -119,12 +119,8 @@ WatchdogInterruptHandler (
|
|||||||
mWatchdogNotify (TimerPeriod + 1);
|
mWatchdogNotify (TimerPeriod + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
gRT->ResetSystem (
|
gRT->ResetSystem (EfiResetCold, EFI_TIMEOUT, StrSize (ResetString),
|
||||||
EfiResetCold,
|
(CHAR16 *)ResetString);
|
||||||
EFI_TIMEOUT,
|
|
||||||
StrSize (ResetString),
|
|
||||||
(CHAR16 *)ResetString
|
|
||||||
);
|
|
||||||
|
|
||||||
// If we got here then the reset didn't work
|
// If we got here then the reset didn't work
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@@ -162,11 +158,11 @@ WatchdogRegisterHandler (
|
|||||||
IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
|
IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if ((mWatchdogNotify == NULL) && (NotifyFunction == NULL)) {
|
if (mWatchdogNotify == NULL && NotifyFunction == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mWatchdogNotify != NULL) && (NotifyFunction != NULL)) {
|
if (mWatchdogNotify != NULL && NotifyFunction != NULL) {
|
||||||
return EFI_ALREADY_STARTED;
|
return EFI_ALREADY_STARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,11 +307,8 @@ GenericWatchdogEntry (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
|
|
||||||
Status = gBS->LocateProtocol (
|
Status = gBS->LocateProtocol (&gHardwareInterrupt2ProtocolGuid, NULL,
|
||||||
&gHardwareInterrupt2ProtocolGuid,
|
(VOID **)&mInterruptProtocol);
|
||||||
NULL,
|
|
||||||
(VOID **)&mInterruptProtocol
|
|
||||||
);
|
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
/* Make sure the Watchdog Timer Architectural Protocol has not been installed
|
/* Make sure the Watchdog Timer Architectural Protocol has not been installed
|
||||||
@@ -327,44 +320,33 @@ GenericWatchdogEntry (
|
|||||||
ASSERT (mTimerFrequencyHz != 0);
|
ASSERT (mTimerFrequencyHz != 0);
|
||||||
|
|
||||||
// Install interrupt handler
|
// Install interrupt handler
|
||||||
Status = mInterruptProtocol->RegisterInterruptSource (
|
Status = mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
|
||||||
mInterruptProtocol,
|
|
||||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||||
WatchdogInterruptHandler
|
WatchdogInterruptHandler);
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = mInterruptProtocol->SetTriggerType (
|
Status = mInterruptProtocol->SetTriggerType (mInterruptProtocol,
|
||||||
mInterruptProtocol,
|
|
||||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||||
EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING
|
EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING);
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto UnregisterHandler;
|
goto UnregisterHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Install the Timer Architectural Protocol onto a new handle
|
// Install the Timer Architectural Protocol onto a new handle
|
||||||
Handle = NULL;
|
Handle = NULL;
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (&Handle,
|
||||||
&Handle,
|
&gEfiWatchdogTimerArchProtocolGuid, &mWatchdogTimer,
|
||||||
&gEfiWatchdogTimerArchProtocolGuid,
|
NULL);
|
||||||
&mWatchdogTimer,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto UnregisterHandler;
|
goto UnregisterHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register for an ExitBootServicesEvent
|
// Register for an ExitBootServicesEvent
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
|
||||||
EVT_SIGNAL_EXIT_BOOT_SERVICES,
|
WatchdogExitBootServicesEvent, NULL,
|
||||||
TPL_NOTIFY,
|
&mEfiExitBootServicesEvent);
|
||||||
WatchdogExitBootServicesEvent,
|
|
||||||
NULL,
|
|
||||||
&mEfiExitBootServicesEvent
|
|
||||||
);
|
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
mNumTimerTicks = 0;
|
mNumTimerTicks = 0;
|
||||||
@@ -374,10 +356,8 @@ GenericWatchdogEntry (
|
|||||||
|
|
||||||
UnregisterHandler:
|
UnregisterHandler:
|
||||||
// Unregister the handler
|
// Unregister the handler
|
||||||
mInterruptProtocol->RegisterInterruptSource (
|
mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
|
||||||
mInterruptProtocol,
|
|
||||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||||
NULL
|
NULL);
|
||||||
);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2013-2021, Arm Limited. All rights reserved.<BR>
|
# Copyright (c) 2013-2017, ARM Limited. All rights reserved.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
#
|
#
|
||||||
@@ -13,7 +13,6 @@
|
|||||||
ENTRY_POINT = GenericWatchdogEntry
|
ENTRY_POINT = GenericWatchdogEntry
|
||||||
|
|
||||||
[Sources.common]
|
[Sources.common]
|
||||||
GenericWatchdog.h
|
|
||||||
GenericWatchdogDxe.c
|
GenericWatchdogDxe.c
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2016-2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2016-2018, ARM Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef MM_COMMUNICATE_H_
|
#if !defined _MM_COMMUNICATE_H_
|
||||||
#define MM_COMMUNICATE_H_
|
#define _MM_COMMUNICATE_H_
|
||||||
|
|
||||||
#define MM_MAJOR_VER_MASK 0xEFFF0000
|
#define MM_MAJOR_VER_MASK 0xEFFF0000
|
||||||
#define MM_MINOR_VER_MASK 0x0000FFFF
|
#define MM_MINOR_VER_MASK 0x0000FFFF
|
||||||
@@ -19,4 +19,4 @@
|
|||||||
#define MM_CALLER_MAJOR_VER 0x1UL
|
#define MM_CALLER_MAJOR_VER 0x1UL
|
||||||
#define MM_CALLER_MINOR_VER 0x0
|
#define MM_CALLER_MINOR_VER 0x0
|
||||||
|
|
||||||
#endif /* MM_COMMUNICATE_H_ */
|
#endif /* _MM_COMMUNICATE_H_ */
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2016-2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2016-2019, ARM Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@@ -42,20 +42,14 @@ STATIC EFI_HANDLE mMmCommunicateHandle;
|
|||||||
This function provides a service to send and receive messages from a registered UEFI service.
|
This function provides a service to send and receive messages from a registered UEFI service.
|
||||||
|
|
||||||
@param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance.
|
@param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance.
|
||||||
@param[in, out] CommBufferPhysical Physical address of the MM communication buffer
|
@param[in] CommBufferPhysical Physical address of the MM communication buffer
|
||||||
@param[in, out] CommBufferVirtual Virtual address of the MM communication buffer
|
@param[in] CommBufferVirtual Virtual address of the MM communication buffer
|
||||||
@param[in, out] CommSize The size of the data buffer being passed in. On input,
|
@param[in] CommSize The size of the data buffer being passed in. On exit, the size of data
|
||||||
when not omitted, the buffer should cover EFI_MM_COMMUNICATE_HEADER
|
being returned. Zero if the handler does not wish to reply with any data.
|
||||||
and the value of MessageLength field. On exit, the size
|
This parameter is optional and may be NULL.
|
||||||
of data being returned. Zero if the handler does not
|
|
||||||
wish to reply with any data. This parameter is optional
|
|
||||||
and may be NULL.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The message was successfully posted.
|
@retval EFI_SUCCESS The message was successfully posted.
|
||||||
@retval EFI_INVALID_PARAMETER CommBufferPhysical or CommBufferVirtual was NULL, or
|
@retval EFI_INVALID_PARAMETER CommBufferPhysical was NULL or CommBufferVirtual was NULL.
|
||||||
integer value pointed by CommSize does not cover
|
|
||||||
EFI_MM_COMMUNICATE_HEADER and the value of MessageLength
|
|
||||||
field.
|
|
||||||
@retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM implementation.
|
@retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM implementation.
|
||||||
If this error is returned, the MessageLength field
|
If this error is returned, the MessageLength field
|
||||||
in the CommBuffer header or the integer pointed by
|
in the CommBuffer header or the integer pointed by
|
||||||
@@ -88,11 +82,10 @@ MmCommunication2Communicate (
|
|||||||
//
|
//
|
||||||
// Check parameters
|
// Check parameters
|
||||||
//
|
//
|
||||||
if ((CommBufferVirtual == NULL) || (CommBufferPhysical == NULL)) {
|
if (CommBufferVirtual == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
|
||||||
CommunicateHeader = CommBufferVirtual;
|
CommunicateHeader = CommBufferVirtual;
|
||||||
// CommBuffer is a mandatory parameter. Hence, Rely on
|
// CommBuffer is a mandatory parameter. Hence, Rely on
|
||||||
// MessageLength + Header to ascertain the
|
// MessageLength + Header to ascertain the
|
||||||
@@ -102,41 +95,33 @@ MmCommunication2Communicate (
|
|||||||
sizeof (CommunicateHeader->HeaderGuid) +
|
sizeof (CommunicateHeader->HeaderGuid) +
|
||||||
sizeof (CommunicateHeader->MessageLength);
|
sizeof (CommunicateHeader->MessageLength);
|
||||||
|
|
||||||
// If CommSize is not omitted, perform size inspection before proceeding.
|
// If the length of the CommBuffer is 0 then return the expected length.
|
||||||
if (CommSize != NULL) {
|
if (CommSize) {
|
||||||
// This case can be used by the consumer of this driver to find out the
|
// This case can be used by the consumer of this driver to find out the
|
||||||
// max size that can be used for allocating CommBuffer.
|
// max size that can be used for allocating CommBuffer.
|
||||||
if ((*CommSize == 0) ||
|
if ((*CommSize == 0) ||
|
||||||
(*CommSize > mNsCommBuffMemRegion.Length))
|
(*CommSize > mNsCommBuffMemRegion.Length)) {
|
||||||
{
|
|
||||||
*CommSize = mNsCommBuffMemRegion.Length;
|
*CommSize = mNsCommBuffMemRegion.Length;
|
||||||
Status = EFI_BAD_BUFFER_SIZE;
|
return EFI_BAD_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// CommSize should cover at least MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER);
|
// CommSize must match MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER);
|
||||||
//
|
//
|
||||||
if (*CommSize < BufferSize) {
|
if (*CommSize != BufferSize) {
|
||||||
Status = EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// If the message length is 0 or greater than what can be tolerated by the MM
|
// If the buffer size is 0 or greater than what can be tolerated by the MM
|
||||||
// environment then return the expected size.
|
// environment then return the expected size.
|
||||||
//
|
//
|
||||||
if ((CommunicateHeader->MessageLength == 0) ||
|
if ((BufferSize == 0) ||
|
||||||
(BufferSize > mNsCommBuffMemRegion.Length))
|
(BufferSize > mNsCommBuffMemRegion.Length)) {
|
||||||
{
|
|
||||||
CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length -
|
CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length -
|
||||||
sizeof (CommunicateHeader->HeaderGuid) -
|
sizeof (CommunicateHeader->HeaderGuid) -
|
||||||
sizeof (CommunicateHeader->MessageLength);
|
sizeof (CommunicateHeader->MessageLength);
|
||||||
Status = EFI_BAD_BUFFER_SIZE;
|
return EFI_BAD_BUFFER_SIZE;
|
||||||
}
|
|
||||||
|
|
||||||
// MessageLength or CommSize check has failed, return here.
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SMC Function ID
|
// SMC Function ID
|
||||||
@@ -234,19 +219,15 @@ NotifySetVirtualAddressMap (
|
|||||||
(VOID **)&mNsCommBuffMemRegion.VirtualBase
|
(VOID **)&mNsCommBuffMemRegion.VirtualBase
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((
|
DEBUG ((DEBUG_ERROR, "NotifySetVirtualAddressMap():"
|
||||||
DEBUG_ERROR,
|
" Unable to convert MM runtime pointer. Status:0x%r\n", Status));
|
||||||
"NotifySetVirtualAddressMap():"
|
|
||||||
" Unable to convert MM runtime pointer. Status:0x%r\n",
|
|
||||||
Status
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC
|
STATIC
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetMmCompatibility (
|
GetMmCompatibility ()
|
||||||
)
|
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 MmVersion;
|
UINT32 MmVersion;
|
||||||
@@ -260,24 +241,13 @@ GetMmCompatibility (
|
|||||||
MmVersion = MmVersionArgs.Arg0;
|
MmVersion = MmVersionArgs.Arg0;
|
||||||
|
|
||||||
if ((MM_MAJOR_VER(MmVersion) == MM_CALLER_MAJOR_VER) &&
|
if ((MM_MAJOR_VER(MmVersion) == MM_CALLER_MAJOR_VER) &&
|
||||||
(MM_MINOR_VER (MmVersion) >= MM_CALLER_MINOR_VER))
|
(MM_MINOR_VER(MmVersion) >= MM_CALLER_MINOR_VER)) {
|
||||||
{
|
DEBUG ((DEBUG_INFO, "MM Version: Major=0x%x, Minor=0x%x\n",
|
||||||
DEBUG ((
|
MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion)));
|
||||||
DEBUG_INFO,
|
|
||||||
"MM Version: Major=0x%x, Minor=0x%x\n",
|
|
||||||
MM_MAJOR_VER (MmVersion),
|
|
||||||
MM_MINOR_VER (MmVersion)
|
|
||||||
));
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((
|
DEBUG ((DEBUG_ERROR, "Incompatible MM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n",
|
||||||
DEBUG_ERROR,
|
MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion), MM_CALLER_MAJOR_VER, MM_CALLER_MINOR_VER));
|
||||||
"Incompatible MM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n",
|
|
||||||
MM_MAJOR_VER (MmVersion),
|
|
||||||
MM_MINOR_VER (MmVersion),
|
|
||||||
MM_CALLER_MAJOR_VER,
|
|
||||||
MM_CALLER_MINOR_VER
|
|
||||||
));
|
|
||||||
Status = EFI_UNSUPPORTED;
|
Status = EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -369,11 +339,8 @@ MmCommunication2Initialize (
|
|||||||
EFI_MEMORY_RUNTIME
|
EFI_MEMORY_RUNTIME
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((
|
DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
|
||||||
DEBUG_ERROR,
|
"Failed to add MM-NS Buffer Memory Space\n"));
|
||||||
"MmCommunicateInitialize: "
|
|
||||||
"Failed to add MM-NS Buffer Memory Space\n"
|
|
||||||
));
|
|
||||||
goto ReturnErrorStatus;
|
goto ReturnErrorStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -383,11 +350,8 @@ MmCommunication2Initialize (
|
|||||||
EFI_MEMORY_WB | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME
|
EFI_MEMORY_WB | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((
|
DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
|
||||||
DEBUG_ERROR,
|
"Failed to set MM-NS Buffer Memory attributes\n"));
|
||||||
"MmCommunicateInitialize: "
|
|
||||||
"Failed to set MM-NS Buffer Memory attributes\n"
|
|
||||||
));
|
|
||||||
goto CleanAddedMemorySpace;
|
goto CleanAddedMemorySpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -399,11 +363,8 @@ MmCommunication2Initialize (
|
|||||||
&mMmCommunication2
|
&mMmCommunication2
|
||||||
);
|
);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
DEBUG ((
|
DEBUG ((DEBUG_ERROR, "MmCommunicationInitialize: "
|
||||||
DEBUG_ERROR,
|
"Failed to install MM communication protocol\n"));
|
||||||
"MmCommunicationInitialize: "
|
|
||||||
"Failed to install MM communication protocol\n"
|
|
||||||
));
|
|
||||||
goto CleanAddedMemorySpace;
|
goto CleanAddedMemorySpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -420,24 +381,17 @@ MmCommunication2Initialize (
|
|||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
for (Index = 0; Index < ARRAY_SIZE (mGuidedEventGuid); Index++) {
|
for (Index = 0; Index < ARRAY_SIZE (mGuidedEventGuid); Index++) {
|
||||||
Status = gBS->CreateEventEx (
|
Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
|
||||||
EVT_NOTIFY_SIGNAL,
|
MmGuidedEventNotify, mGuidedEventGuid[Index],
|
||||||
TPL_CALLBACK,
|
mGuidedEventGuid[Index], &mGuidedEvent[Index]);
|
||||||
MmGuidedEventNotify,
|
|
||||||
mGuidedEventGuid[Index],
|
|
||||||
mGuidedEventGuid[Index],
|
|
||||||
&mGuidedEvent[Index]
|
|
||||||
);
|
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
while (Index-- > 0) {
|
while (Index-- > 0) {
|
||||||
gBS->CloseEvent (mGuidedEvent[Index]);
|
gBS->CloseEvent (mGuidedEvent[Index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
goto UninstallProtocol;
|
goto UninstallProtocol;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
UninstallProtocol:
|
UninstallProtocol:
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# DXE MM Communicate driver
|
# DXE MM Communicate driver
|
||||||
#
|
#
|
||||||
# Copyright (c) 2016 - 2021, Arm Limited. All rights reserved.<BR>
|
# Copyright (c) 2016 - 2019, ARM Limited. All rights reserved.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
#
|
#
|
||||||
@@ -24,7 +24,6 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
[Sources.AARCH64]
|
[Sources.AARCH64]
|
||||||
MmCommunicate.h
|
|
||||||
MmCommunication.c
|
MmCommunication.c
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
/** @file
|
/** @file
|
||||||
Timer Architecture Protocol driver of the ARM flavor
|
Timer Architecture Protocol driver of the ARM flavor
|
||||||
|
|
||||||
Copyright (c) 2011-2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2011-2013 ARM Ltd. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <PiDxe.h>
|
#include <PiDxe.h>
|
||||||
|
|
||||||
#include <Library/ArmLib.h>
|
#include <Library/ArmLib.h>
|
||||||
@@ -305,7 +306,8 @@ TimerInterruptHandler (
|
|||||||
|
|
||||||
// Check if the timer interrupt is active
|
// Check if the timer interrupt is active
|
||||||
if ((ArmGenericTimerGetTimerCtrlReg () ) & ARM_ARCH_TIMER_ISTATUS) {
|
if ((ArmGenericTimerGetTimerCtrlReg () ) & ARM_ARCH_TIMER_ISTATUS) {
|
||||||
if (mTimerNotifyFunction != 0) {
|
|
||||||
|
if (mTimerNotifyFunction) {
|
||||||
mTimerNotifyFunction (mTimerPeriod * mElapsedPeriod);
|
mTimerNotifyFunction (mTimerPeriod * mElapsedPeriod);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,6 +338,7 @@ TimerInterruptHandler (
|
|||||||
gBS->RestoreTPL (OriginalTPL);
|
gBS->RestoreTPL (OriginalTPL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the state information for the Timer Architectural Protocol and
|
Initialize the state information for the Timer Architectural Protocol and
|
||||||
the Timer Debug support protocol that allows the debugger to break into a
|
the Timer Debug support protocol that allows the debugger to break into a
|
||||||
@@ -356,7 +359,7 @@ TimerInitialize (
|
|||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle = NULL;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN TimerCtrlReg;
|
UINTN TimerCtrlReg;
|
||||||
UINT32 TimerHypIntrNum;
|
UINT32 TimerHypIntrNum;
|
||||||
@@ -405,12 +408,10 @@ TimerInitialize (
|
|||||||
Status = TimerDriverSetTimerPeriod (&gTimer, FixedPcdGet32(PcdTimerPeriod)); // TIMER_DEFAULT_PERIOD
|
Status = TimerDriverSetTimerPeriod (&gTimer, FixedPcdGet32(PcdTimerPeriod)); // TIMER_DEFAULT_PERIOD
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
Handle = NULL;
|
|
||||||
// Install the Timer Architectural Protocol onto a new handle
|
// Install the Timer Architectural Protocol onto a new handle
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces(
|
Status = gBS->InstallMultipleProtocolInterfaces(
|
||||||
&Handle,
|
&Handle,
|
||||||
&gEfiTimerArchProtocolGuid,
|
&gEfiTimerArchProtocolGuid, &gTimer,
|
||||||
&gTimer,
|
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR(Status);
|
ASSERT_EFI_ERROR(Status);
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
Support a Semi Host file system over a debuggers JTAG
|
Support a Semi Host file system over a debuggers JTAG
|
||||||
|
|
||||||
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||||
Portions copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>
|
Portions copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ EFI_FILE gSemihostFsFile = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Device path for semi-hosting. It contains our auto-generated Caller ID GUID.
|
// Device path for semi-hosting. It contains our autogened Caller ID GUID.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
VENDOR_DEVICE_PATH Guid;
|
VENDOR_DEVICE_PATH Guid;
|
||||||
@@ -60,12 +60,10 @@ typedef struct {
|
|||||||
|
|
||||||
SEMIHOST_DEVICE_PATH gDevicePath = {
|
SEMIHOST_DEVICE_PATH gDevicePath = {
|
||||||
{
|
{
|
||||||
{ HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 }
|
{ HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 } },
|
||||||
},
|
|
||||||
EFI_CALLER_ID_GUID
|
EFI_CALLER_ID_GUID
|
||||||
},
|
},
|
||||||
{ END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
|
{ END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 } }
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -92,9 +90,8 @@ AllocateFCB (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
SEMIHOST_FCB *Fcb;
|
SEMIHOST_FCB *Fcb = AllocateZeroPool (sizeof (SEMIHOST_FCB));
|
||||||
|
|
||||||
Fcb = AllocateZeroPool (sizeof (SEMIHOST_FCB));
|
|
||||||
if (Fcb != NULL) {
|
if (Fcb != NULL) {
|
||||||
CopyMem (&Fcb->File, &gSemihostFsFile, sizeof (gSemihostFsFile));
|
CopyMem (&Fcb->File, &gSemihostFsFile, sizeof (gSemihostFsFile));
|
||||||
Fcb->Signature = SEMIHOST_FCB_SIGNATURE;
|
Fcb->Signature = SEMIHOST_FCB_SIGNATURE;
|
||||||
@@ -117,13 +114,15 @@ FreeFCB (
|
|||||||
FreePool (Fcb);
|
FreePool (Fcb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
VolumeOpen (
|
VolumeOpen (
|
||||||
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
|
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
|
||||||
OUT EFI_FILE **Root
|
OUT EFI_FILE **Root
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
SEMIHOST_FCB *RootFcb;
|
SEMIHOST_FCB *RootFcb = NULL;
|
||||||
|
|
||||||
if (Root == NULL) {
|
if (Root == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@@ -193,14 +192,12 @@ FileOpen (
|
|||||||
|
|
||||||
if ( (OpenMode != EFI_FILE_MODE_READ) &&
|
if ( (OpenMode != EFI_FILE_MODE_READ) &&
|
||||||
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE)) &&
|
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE)) &&
|
||||||
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE)))
|
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE)) ) {
|
||||||
{
|
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((OpenMode & EFI_FILE_MODE_CREATE) != 0) &&
|
if ((OpenMode & EFI_FILE_MODE_CREATE) &&
|
||||||
((Attributes & EFI_FILE_DIRECTORY) != 0))
|
(Attributes & EFI_FILE_DIRECTORY) ) {
|
||||||
{
|
|
||||||
return EFI_WRITE_PROTECTED;
|
return EFI_WRITE_PROTECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,15 +206,13 @@ FileOpen (
|
|||||||
if (AsciiFileName == NULL) {
|
if (AsciiFileName == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnicodeStrToAsciiStrS (FileName, AsciiFileName, Length);
|
UnicodeStrToAsciiStrS (FileName, AsciiFileName, Length);
|
||||||
|
|
||||||
// Opening '/', '\', '.', or the NULL pathname is trying to open the root directory
|
// Opening '/', '\', '.', or the NULL pathname is trying to open the root directory
|
||||||
if ((AsciiStrCmp (AsciiFileName, "\\") == 0) ||
|
if ((AsciiStrCmp (AsciiFileName, "\\") == 0) ||
|
||||||
(AsciiStrCmp (AsciiFileName, "/") == 0) ||
|
(AsciiStrCmp (AsciiFileName, "/") == 0) ||
|
||||||
(AsciiStrCmp (AsciiFileName, "") == 0) ||
|
(AsciiStrCmp (AsciiFileName, "") == 0) ||
|
||||||
(AsciiStrCmp (AsciiFileName, ".") == 0))
|
(AsciiStrCmp (AsciiFileName, ".") == 0) ) {
|
||||||
{
|
|
||||||
FreePool (AsciiFileName);
|
FreePool (AsciiFileName);
|
||||||
return (VolumeOpen (&gSemihostFs, NewHandle));
|
return (VolumeOpen (&gSemihostFs, NewHandle));
|
||||||
}
|
}
|
||||||
@@ -236,11 +231,10 @@ FileOpen (
|
|||||||
} else {
|
} else {
|
||||||
SemihostMode = SEMIHOST_FILE_MODE_READ | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_UPDATE;
|
SemihostMode = SEMIHOST_FILE_MODE_READ | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_UPDATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Return = SemihostFileOpen (AsciiFileName, SemihostMode, &SemihostHandle);
|
Return = SemihostFileOpen (AsciiFileName, SemihostMode, &SemihostHandle);
|
||||||
|
|
||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
if ((OpenMode & EFI_FILE_MODE_CREATE) != 0) {
|
if (OpenMode & EFI_FILE_MODE_CREATE) {
|
||||||
//
|
//
|
||||||
// In the create if does not exist case, if the opening in update
|
// In the create if does not exist case, if the opening in update
|
||||||
// mode failed, create it and open it in update mode. The update
|
// mode failed, create it and open it in update mode. The update
|
||||||
@@ -283,8 +277,7 @@ FileOpen (
|
|||||||
|
|
||||||
FileFcb->Info.FileSize = Length;
|
FileFcb->Info.FileSize = Length;
|
||||||
FileFcb->Info.PhysicalSize = Length;
|
FileFcb->Info.PhysicalSize = Length;
|
||||||
FileFcb->Info.Attribute = ((OpenMode & EFI_FILE_MODE_CREATE) != 0) ?
|
FileFcb->Info.Attribute = (OpenMode & EFI_FILE_MODE_CREATE) ? Attributes : 0;
|
||||||
Attributes : 0;
|
|
||||||
|
|
||||||
InsertTailList (&gFileList, &FileFcb->Link);
|
InsertTailList (&gFileList, &FileFcb->Link);
|
||||||
|
|
||||||
@@ -351,7 +344,6 @@ TruncateFile (
|
|||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
Remaining -= ToRead;
|
Remaining -= ToRead;
|
||||||
Read += ToRead;
|
Read += ToRead;
|
||||||
}
|
}
|
||||||
@@ -385,12 +377,12 @@ Error:
|
|||||||
if (FileHandle != 0) {
|
if (FileHandle != 0) {
|
||||||
SemihostFileClose (FileHandle);
|
SemihostFileClose (FileHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Buffer != NULL) {
|
if (Buffer != NULL) {
|
||||||
FreePool (Buffer);
|
FreePool (Buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (Status);
|
return (Status);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -426,7 +418,6 @@ FileClose (
|
|||||||
if (Fcb->Info.FileSize < Fcb->Info.PhysicalSize) {
|
if (Fcb->Info.FileSize < Fcb->Info.PhysicalSize) {
|
||||||
TruncateFile (Fcb->FileName, Fcb->Info.FileSize);
|
TruncateFile (Fcb->FileName, Fcb->Info.FileSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Fcb->FileName);
|
FreePool (Fcb->FileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -478,7 +469,6 @@ FileDelete (
|
|||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
return EFI_WARN_DELETE_FAILURE;
|
return EFI_WARN_DELETE_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
return EFI_WARN_DELETE_FAILURE;
|
return EFI_WARN_DELETE_FAILURE;
|
||||||
@@ -582,7 +572,6 @@ ExtendFile (
|
|||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Remaining -= WriteNb;
|
Remaining -= WriteNb;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -627,8 +616,7 @@ FileWrite (
|
|||||||
|
|
||||||
// We cannot write a read-only file
|
// We cannot write a read-only file
|
||||||
if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|
if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|
||||||
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE))
|
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {
|
||||||
{
|
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -642,7 +630,6 @@ FileWrite (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Fcb->Info.FileSize = Fcb->Position;
|
Fcb->Info.FileSize = Fcb->Position;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -661,7 +648,6 @@ FileWrite (
|
|||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Fcb->Info.PhysicalSize = Length;
|
Fcb->Info.PhysicalSize = Length;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@@ -730,7 +716,8 @@ FileSetPosition (
|
|||||||
if (Position != 0) {
|
if (Position != 0) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
//
|
//
|
||||||
// UEFI Spec section 12.5:
|
// UEFI Spec section 12.5:
|
||||||
// "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to
|
// "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to
|
||||||
@@ -739,7 +726,6 @@ FileSetPosition (
|
|||||||
if (Position == 0xFFFFFFFFFFFFFFFF) {
|
if (Position == 0xFFFFFFFFFFFFFFFF) {
|
||||||
Position = Fcb->Info.FileSize;
|
Position = Fcb->Info.FileSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
Return = SemihostFileSeek (Fcb->SemihostHandle, MIN (Position, Fcb->Info.FileSize));
|
Return = SemihostFileSeek (Fcb->SemihostHandle, MIN (Position, Fcb->Info.FileSize));
|
||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
@@ -772,13 +758,12 @@ GetFileInfo (
|
|||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_FILE_INFO *Info;
|
EFI_FILE_INFO *Info = NULL;
|
||||||
UINTN NameSize;
|
UINTN NameSize = 0;
|
||||||
UINTN ResultSize;
|
UINTN ResultSize;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
if (Fcb->IsRoot) {
|
if (Fcb->IsRoot == TRUE) {
|
||||||
NameSize = 0;
|
|
||||||
ResultSize = SIZE_OF_EFI_FILE_INFO + sizeof(CHAR16);
|
ResultSize = SIZE_OF_EFI_FILE_INFO + sizeof(CHAR16);
|
||||||
} else {
|
} else {
|
||||||
NameSize = AsciiStrLen (Fcb->FileName) + 1;
|
NameSize = AsciiStrLen (Fcb->FileName) + 1;
|
||||||
@@ -798,7 +783,7 @@ GetFileInfo (
|
|||||||
// Fill in the structure
|
// Fill in the structure
|
||||||
Info->Size = ResultSize;
|
Info->Size = ResultSize;
|
||||||
|
|
||||||
if (Fcb->IsRoot) {
|
if (Fcb->IsRoot == TRUE) {
|
||||||
Info->FileName[0] = L'\0';
|
Info->FileName[0] = L'\0';
|
||||||
} else {
|
} else {
|
||||||
for (Index = 0; Index < NameSize; Index++) {
|
for (Index = 0; Index < NameSize; Index++) {
|
||||||
@@ -901,8 +886,7 @@ FileGetInfo (
|
|||||||
if ((This == NULL) ||
|
if ((This == NULL) ||
|
||||||
(InformationType == NULL) ||
|
(InformationType == NULL) ||
|
||||||
(BufferSize == NULL) ||
|
(BufferSize == NULL) ||
|
||||||
((Buffer == NULL) && (*BufferSize > 0)))
|
((Buffer == NULL) && (*BufferSize > 0)) ) {
|
||||||
{
|
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -981,7 +965,6 @@ SetFileInfo (
|
|||||||
if (AsciiFileName == NULL) {
|
if (AsciiFileName == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnicodeStrToAsciiStrS (Info->FileName, AsciiFileName, Length);
|
UnicodeStrToAsciiStrS (Info->FileName, AsciiFileName, Length);
|
||||||
|
|
||||||
FileSizeIsDifferent = (Info->FileSize != Fcb->Info.FileSize);
|
FileSizeIsDifferent = (Info->FileSize != Fcb->Info.FileSize);
|
||||||
@@ -999,8 +982,7 @@ SetFileInfo (
|
|||||||
// description.
|
// description.
|
||||||
//
|
//
|
||||||
if ((Fcb->OpenMode == EFI_FILE_MODE_READ) ||
|
if ((Fcb->OpenMode == EFI_FILE_MODE_READ) ||
|
||||||
(Fcb->Info.Attribute & EFI_FILE_READ_ONLY))
|
(Fcb->Info.Attribute & EFI_FILE_READ_ONLY) ) {
|
||||||
{
|
|
||||||
if (FileSizeIsDifferent || FileNameIsDifferent || ReadOnlyIsDifferent) {
|
if (FileSizeIsDifferent || FileNameIsDifferent || ReadOnlyIsDifferent) {
|
||||||
Status = EFI_ACCESS_DENIED;
|
Status = EFI_ACCESS_DENIED;
|
||||||
goto Error;
|
goto Error;
|
||||||
@@ -1021,7 +1003,6 @@ SetFileInfo (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// The read/write position from the host file system point of view
|
// The read/write position from the host file system point of view
|
||||||
// is at the end of the file. If the position from this module
|
// is at the end of the file. If the position from this module
|
||||||
@@ -1032,14 +1013,12 @@ SetFileInfo (
|
|||||||
FileSetPosition (&Fcb->File, Fcb->Position);
|
FileSetPosition (&Fcb->File, Fcb->Position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Fcb->Info.FileSize = FileSize;
|
Fcb->Info.FileSize = FileSize;
|
||||||
|
|
||||||
Return = SemihostFileLength (Fcb->SemihostHandle, &Length);
|
Return = SemihostFileLength (Fcb->SemihostHandle, &Length);
|
||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
Fcb->Info.PhysicalSize = Length;
|
Fcb->Info.PhysicalSize = Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1066,7 +1045,6 @@ SetFileInfo (
|
|||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Fcb->FileName);
|
FreePool (Fcb->FileName);
|
||||||
Fcb->FileName = AsciiFileName;
|
Fcb->FileName = AsciiFileName;
|
||||||
AsciiFileName = NULL;
|
AsciiFileName = NULL;
|
||||||
@@ -1138,24 +1116,19 @@ FileSetInfo (
|
|||||||
if (Info->Size < (SIZE_OF_EFI_FILE_INFO + StrSize (Info->FileName))) {
|
if (Info->Size < (SIZE_OF_EFI_FILE_INFO + StrSize (Info->FileName))) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BufferSize < Info->Size) {
|
if (BufferSize < Info->Size) {
|
||||||
return EFI_BAD_BUFFER_SIZE;
|
return EFI_BAD_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return SetFileInfo (Fcb, Info);
|
return SetFileInfo (Fcb, Info);
|
||||||
} else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
|
} else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
|
||||||
SystemInfo = Buffer;
|
SystemInfo = Buffer;
|
||||||
if (SystemInfo->Size <
|
if (SystemInfo->Size <
|
||||||
(SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SystemInfo->VolumeLabel)))
|
(SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SystemInfo->VolumeLabel))) {
|
||||||
{
|
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BufferSize < SystemInfo->Size) {
|
if (BufferSize < SystemInfo->Size) {
|
||||||
return EFI_BAD_BUFFER_SIZE;
|
return EFI_BAD_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer = SystemInfo->VolumeLabel;
|
Buffer = SystemInfo->VolumeLabel;
|
||||||
|
|
||||||
if (StrSize (Buffer) > 0) {
|
if (StrSize (Buffer) > 0) {
|
||||||
@@ -1190,8 +1163,7 @@ FileFlush (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|
if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|
||||||
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE))
|
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {
|
||||||
{
|
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
} else {
|
} else {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@@ -1217,10 +1189,8 @@ SemihostFsEntryPoint (
|
|||||||
|
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&gInstallHandle,
|
&gInstallHandle,
|
||||||
&gEfiSimpleFileSystemProtocolGuid,
|
&gEfiSimpleFileSystemProtocolGuid, &gSemihostFs,
|
||||||
&gSemihostFs,
|
&gEfiDevicePathProtocolGuid, &gDevicePath,
|
||||||
&gEfiDevicePathProtocolGuid,
|
|
||||||
&gDevicePath,
|
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef SEMIHOST_FS_H_
|
#ifndef __SEMIHOST_FS_H__
|
||||||
#define SEMIHOST_FS_H_
|
#define __SEMIHOST_FS_H__
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
VolumeOpen (
|
VolumeOpen (
|
||||||
@@ -242,4 +242,5 @@ FileFlush (
|
|||||||
IN EFI_FILE *File
|
IN EFI_FILE *File
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // SEMIHOST_FS_H_
|
#endif // __SEMIHOST_FS_H__
|
||||||
|
|
||||||
|
@@ -9,8 +9,9 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ASM_MACRO_IO_LIB_H_
|
|
||||||
#define ASM_MACRO_IO_LIB_H_
|
#ifndef __MACRO_IO_LIB_H__
|
||||||
|
#define __MACRO_IO_LIB_H__
|
||||||
|
|
||||||
#define _ASM_FUNC(Name, Section) \
|
#define _ASM_FUNC(Name, Section) \
|
||||||
.global Name ; \
|
.global Name ; \
|
||||||
@@ -35,4 +36,4 @@
|
|||||||
movt Reg, #:upper16:(Sym) - (. + 12) ; \
|
movt Reg, #:upper16:(Sym) - (. + 12) ; \
|
||||||
ldr Reg, [pc, Reg]
|
ldr Reg, [pc, Reg]
|
||||||
|
|
||||||
#endif // ASM_MACRO_IO_LIB_H_
|
#endif
|
||||||
|
@@ -9,8 +9,9 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ASM_MACRO_IO_LIBV8_H_
|
|
||||||
#define ASM_MACRO_IO_LIBV8_H_
|
#ifndef __MACRO_IO_LIBV8_H__
|
||||||
|
#define __MACRO_IO_LIBV8_H__
|
||||||
|
|
||||||
// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1
|
// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1
|
||||||
// This only selects between EL1 and EL2, else we die.
|
// This only selects between EL1 and EL2, else we die.
|
||||||
@@ -23,6 +24,7 @@
|
|||||||
cbnz SAFE_XREG, 1f ;\
|
cbnz SAFE_XREG, 1f ;\
|
||||||
b . ;// We should never get here
|
b . ;// We should never get here
|
||||||
|
|
||||||
|
|
||||||
// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1
|
// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1
|
||||||
// This only selects between EL1 and EL2 and EL3, else we die.
|
// This only selects between EL1 and EL2 and EL3, else we die.
|
||||||
// Provide the Macro with a safe temp xreg to use.
|
// Provide the Macro with a safe temp xreg to use.
|
||||||
@@ -52,4 +54,4 @@
|
|||||||
movk Reg, ((Val) >> 16) & 0xffff, lsl #16 ; \
|
movk Reg, ((Val) >> 16) & 0xffff, lsl #16 ; \
|
||||||
movk Reg, (Val) & 0xffff
|
movk Reg, (Val) & 0xffff
|
||||||
|
|
||||||
#endif // ASM_MACRO_IO_LIBV8_H_
|
#endif // __MACRO_IO_LIBV8_H__
|
||||||
|
@@ -1,14 +1,14 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||||
Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2011 - 2017, ARM Ltd. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef AARCH64_H_
|
#ifndef __AARCH64_H__
|
||||||
#define AARCH64_H_
|
#define __AARCH64_H__
|
||||||
|
|
||||||
#include <Chipset/AArch64Mmu.h>
|
#include <Chipset/AArch64Mmu.h>
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
// MIDR - Main ID Register definitions
|
// MIDR - Main ID Register definitions
|
||||||
#define ARM_CPU_TYPE_SHIFT 4
|
#define ARM_CPU_TYPE_SHIFT 4
|
||||||
#define ARM_CPU_TYPE_MASK 0xFFF
|
#define ARM_CPU_TYPE_MASK 0xFFF
|
||||||
#define ARM_CPU_TYPE_AEMV8 0xD0F
|
#define ARM_CPU_TYPE_AEMv8 0xD0F
|
||||||
#define ARM_CPU_TYPE_A53 0xD03
|
#define ARM_CPU_TYPE_A53 0xD03
|
||||||
#define ARM_CPU_TYPE_A57 0xD07
|
#define ARM_CPU_TYPE_A57 0xD07
|
||||||
#define ARM_CPU_TYPE_A72 0xD08
|
#define ARM_CPU_TYPE_A72 0xD08
|
||||||
@@ -97,10 +97,10 @@
|
|||||||
#define ARM_VECTOR_CUR_SP0_FIQ 0x100
|
#define ARM_VECTOR_CUR_SP0_FIQ 0x100
|
||||||
#define ARM_VECTOR_CUR_SP0_SERR 0x180
|
#define ARM_VECTOR_CUR_SP0_SERR 0x180
|
||||||
|
|
||||||
#define ARM_VECTOR_CUR_SPX_SYNC 0x200
|
#define ARM_VECTOR_CUR_SPx_SYNC 0x200
|
||||||
#define ARM_VECTOR_CUR_SPX_IRQ 0x280
|
#define ARM_VECTOR_CUR_SPx_IRQ 0x280
|
||||||
#define ARM_VECTOR_CUR_SPX_FIQ 0x300
|
#define ARM_VECTOR_CUR_SPx_FIQ 0x300
|
||||||
#define ARM_VECTOR_CUR_SPX_SERR 0x380
|
#define ARM_VECTOR_CUR_SPx_SERR 0x380
|
||||||
|
|
||||||
#define ARM_VECTOR_LOW_A64_SYNC 0x400
|
#define ARM_VECTOR_LOW_A64_SYNC 0x400
|
||||||
#define ARM_VECTOR_LOW_A64_IRQ 0x480
|
#define ARM_VECTOR_LOW_A64_IRQ 0x480
|
||||||
@@ -112,10 +112,6 @@
|
|||||||
#define ARM_VECTOR_LOW_A32_FIQ 0x700
|
#define ARM_VECTOR_LOW_A32_FIQ 0x700
|
||||||
#define ARM_VECTOR_LOW_A32_SERR 0x780
|
#define ARM_VECTOR_LOW_A32_SERR 0x780
|
||||||
|
|
||||||
// The ID_AA64MMFR2_EL1 register was added in ARMv8.2. Since we
|
|
||||||
// build for ARMv8.0, we need to define the register here.
|
|
||||||
#define ID_AA64MMFR2_EL1 S3_0_C0_C7_2
|
|
||||||
|
|
||||||
#define VECTOR_BASE(tbl) \
|
#define VECTOR_BASE(tbl) \
|
||||||
.section .text.##tbl##,"ax"; \
|
.section .text.##tbl##,"ax"; \
|
||||||
.align 11; \
|
.align 11; \
|
||||||
@@ -238,4 +234,4 @@ ArmWriteCntHctl (
|
|||||||
IN UINT32 CntHctl
|
IN UINT32 CntHctl
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // AARCH64_H_
|
#endif // __AARCH64_H__
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2021, Arm Limited. All rights reserved.<BR>
|
* Copyright (c) 2011-2013, ARM Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef AARCH64_MMU_H_
|
#ifndef __AARCH64_MMU_H_
|
||||||
#define AARCH64_MMU_H_
|
#define __AARCH64_MMU_H_
|
||||||
|
|
||||||
//
|
//
|
||||||
// Memory Attribute Indirection register Definitions
|
// Memory Attribute Indirection register Definitions
|
||||||
@@ -152,6 +152,7 @@
|
|||||||
#define TCR_EL1_TBI0_MASK (0x01UL << TCR_EL1_TBI0_FIELD)
|
#define TCR_EL1_TBI0_MASK (0x01UL << TCR_EL1_TBI0_FIELD)
|
||||||
#define TCR_EL1_TBI1_MASK (0x01UL << TCR_EL1_TBI1_FIELD)
|
#define TCR_EL1_TBI1_MASK (0x01UL << TCR_EL1_TBI1_FIELD)
|
||||||
|
|
||||||
|
|
||||||
#define TCR_EL23_T0SZ_FIELD (0)
|
#define TCR_EL23_T0SZ_FIELD (0)
|
||||||
#define TCR_EL23_IRGN0_FIELD (8)
|
#define TCR_EL23_IRGN0_FIELD (8)
|
||||||
#define TCR_EL23_ORGN0_FIELD (10)
|
#define TCR_EL23_ORGN0_FIELD (10)
|
||||||
@@ -165,6 +166,7 @@
|
|||||||
#define TCR_EL23_TG0_MASK (0x01UL << TCR_EL23_TG0_FIELD)
|
#define TCR_EL23_TG0_MASK (0x01UL << TCR_EL23_TG0_FIELD)
|
||||||
#define TCR_EL23_PS_MASK (0x07UL << TCR_EL23_PS_FIELD)
|
#define TCR_EL23_PS_MASK (0x07UL << TCR_EL23_PS_FIELD)
|
||||||
|
|
||||||
|
|
||||||
#define TCR_RGN_OUTER_NON_CACHEABLE (0x0UL << 10)
|
#define TCR_RGN_OUTER_NON_CACHEABLE (0x0UL << 10)
|
||||||
#define TCR_RGN_OUTER_WRITE_BACK_ALLOC (0x1UL << 10)
|
#define TCR_RGN_OUTER_WRITE_BACK_ALLOC (0x1UL << 10)
|
||||||
#define TCR_RGN_OUTER_WRITE_THROUGH (0x2UL << 10)
|
#define TCR_RGN_OUTER_WRITE_THROUGH (0x2UL << 10)
|
||||||
@@ -188,8 +190,9 @@
|
|||||||
|
|
||||||
// The value written to the T*SZ fields are defined as 2^(64-T*SZ). So a 39Bit
|
// The value written to the T*SZ fields are defined as 2^(64-T*SZ). So a 39Bit
|
||||||
// Virtual address range for 512GB of virtual space sets T*SZ to 25
|
// Virtual address range for 512GB of virtual space sets T*SZ to 25
|
||||||
#define INPUT_ADDRESS_SIZE_TO_TXSZ(a) (64 - a)
|
#define INPUT_ADDRESS_SIZE_TO_TxSZ(a) (64 - a)
|
||||||
|
|
||||||
// Uses LPAE Page Table format
|
// Uses LPAE Page Table format
|
||||||
|
|
||||||
#endif // AARCH64_MMU_H_
|
#endif // __AARCH64_MMU_H_
|
||||||
|
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2012 - 2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2012-2014, ARM Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_CORTEX_A5X_H_
|
#ifndef __ARM_CORTEX_A5x_H__
|
||||||
#define ARM_CORTEX_A5X_H_
|
#define __ARM_CORTEX_A5x_H__
|
||||||
|
|
||||||
//
|
//
|
||||||
// Cortex A5x feature bit definitions
|
// Cortex A5x feature bit definitions
|
||||||
@@ -41,4 +41,4 @@ ArmUnsetCpuExCrBit (
|
|||||||
IN UINT64 Bits
|
IN UINT64 Bits
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARM_CORTEX_A5X_H_
|
#endif
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_CORTEX_A9_H_
|
#ifndef __ARM_CORTEX_A9_H__
|
||||||
#define ARM_CORTEX_A9_H_
|
#define __ARM_CORTEX_A9_H__
|
||||||
|
|
||||||
#include <Chipset/ArmV7.h>
|
#include <Chipset/ArmV7.h>
|
||||||
|
|
||||||
@@ -48,10 +48,12 @@
|
|||||||
#define A9_SCU_SACR_OFFSET 0x50
|
#define A9_SCU_SACR_OFFSET 0x50
|
||||||
#define A9_SCU_SSACR_OFFSET 0x54
|
#define A9_SCU_SSACR_OFFSET 0x54
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmGetScuBaseAddress (
|
ArmGetScuBaseAddress (
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARM_CORTEX_A9_H_
|
#endif
|
||||||
|
|
||||||
|
@@ -1,14 +1,14 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||||
Copyright (c) 2011-2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2011-2015, ARM Ltd. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_V7_H_
|
#ifndef __ARM_V7_H__
|
||||||
#define ARM_V7_H_
|
#define __ARM_V7_H__
|
||||||
|
|
||||||
#include <Chipset/ArmV7Mmu.h>
|
#include <Chipset/ArmV7Mmu.h>
|
||||||
|
|
||||||
@@ -41,6 +41,7 @@
|
|||||||
#define CPSR_IRQ (1 << 7)
|
#define CPSR_IRQ (1 << 7)
|
||||||
#define CPSR_FIQ (1 << 6)
|
#define CPSR_FIQ (1 << 6)
|
||||||
|
|
||||||
|
|
||||||
// CPACR - Coprocessor Access Control Register definitions
|
// CPACR - Coprocessor Access Control Register definitions
|
||||||
#define CPACR_CP_DENIED(cp) 0x00
|
#define CPACR_CP_DENIED(cp) 0x00
|
||||||
#define CPACR_CP_PRIV(cp) ((0x1 << ((cp) << 1)) & 0x0FFFFFFF)
|
#define CPACR_CP_PRIV(cp) ((0x1 << ((cp) << 1)) & 0x0FFFFFFF)
|
||||||
@@ -69,7 +70,7 @@
|
|||||||
// MIDR - Main ID Register definitions
|
// MIDR - Main ID Register definitions
|
||||||
#define ARM_CPU_TYPE_SHIFT 4
|
#define ARM_CPU_TYPE_SHIFT 4
|
||||||
#define ARM_CPU_TYPE_MASK 0xFFF
|
#define ARM_CPU_TYPE_MASK 0xFFF
|
||||||
#define ARM_CPU_TYPE_AEMV8 0xD0F
|
#define ARM_CPU_TYPE_AEMv8 0xD0F
|
||||||
#define ARM_CPU_TYPE_A53 0xD03
|
#define ARM_CPU_TYPE_A53 0xD03
|
||||||
#define ARM_CPU_TYPE_A57 0xD07
|
#define ARM_CPU_TYPE_A57 0xD07
|
||||||
#define ARM_CPU_TYPE_A15 0xC0F
|
#define ARM_CPU_TYPE_A15 0xC0F
|
||||||
@@ -119,4 +120,4 @@ ArmWriteNsacr (
|
|||||||
IN UINT32 Nsacr
|
IN UINT32 Nsacr
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARM_V7_H_
|
#endif // __ARM_V7_H__
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARMV7_MMU_H_
|
#ifndef __ARMV7_MMU_H_
|
||||||
#define ARMV7_MMU_H_
|
#define __ARMV7_MMU_H_
|
||||||
|
|
||||||
#define TTBR_NOT_OUTER_SHAREABLE BIT5
|
#define TTBR_NOT_OUTER_SHAREABLE BIT5
|
||||||
#define TTBR_RGN_OUTER_NON_CACHEABLE 0
|
#define TTBR_RGN_OUTER_NON_CACHEABLE 0
|
||||||
@@ -33,6 +33,7 @@
|
|||||||
#define TTBR_MP_NON_CACHEABLE ( TTBR_RGN_OUTER_NON_CACHEABLE | TTBR_RGN_INNER_NON_CACHEABLE )
|
#define TTBR_MP_NON_CACHEABLE ( TTBR_RGN_OUTER_NON_CACHEABLE | TTBR_RGN_INNER_NON_CACHEABLE )
|
||||||
#define TTBR_MP_WRITE_BACK_ALLOC ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | TTBR_RGN_INNER_WRITE_BACK_ALLOC | TTBR_SHAREABLE)
|
#define TTBR_MP_WRITE_BACK_ALLOC ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | TTBR_RGN_INNER_WRITE_BACK_ALLOC | TTBR_SHAREABLE)
|
||||||
|
|
||||||
|
|
||||||
#define TRANSLATION_TABLE_SECTION_COUNT 4096
|
#define TRANSLATION_TABLE_SECTION_COUNT 4096
|
||||||
#define TRANSLATION_TABLE_SECTION_SIZE (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
|
#define TRANSLATION_TABLE_SECTION_SIZE (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
|
||||||
#define TRANSLATION_TABLE_SECTION_ALIGNMENT (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
|
#define TRANSLATION_TABLE_SECTION_ALIGNMENT (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
|
||||||
@@ -234,4 +235,4 @@ ConvertSectionAttributesToPageAttributes (
|
|||||||
IN BOOLEAN IsLargePage
|
IN BOOLEAN IsLargePage
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARMV7_MMU_H_
|
#endif
|
||||||
|
@@ -6,15 +6,16 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_MP_CORE_INFO_GUID_H_
|
#ifndef __ARM_MP_CORE_INFO_GUID_H_
|
||||||
#define ARM_MP_CORE_INFO_GUID_H_
|
#define __ARM_MP_CORE_INFO_GUID_H_
|
||||||
|
|
||||||
#define MAX_CPUS_PER_MPCORE_SYSTEM 0x04
|
#define MAX_CPUS_PER_MPCORE_SYSTEM 0x04
|
||||||
#define SCU_CONFIG_REG_OFFSET 0x04
|
#define SCU_CONFIG_REG_OFFSET 0x04
|
||||||
#define MPIDR_U_BIT_MASK 0x40000000
|
#define MPIDR_U_BIT_MASK 0x40000000
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT64 Mpidr;
|
UINT32 ClusterId;
|
||||||
|
UINT32 CoreId;
|
||||||
|
|
||||||
// MP Core Mailbox
|
// MP Core Mailbox
|
||||||
EFI_PHYSICAL_ADDRESS MailboxSetAddress;
|
EFI_PHYSICAL_ADDRESS MailboxSetAddress;
|
||||||
@@ -42,6 +43,7 @@ typedef struct {
|
|||||||
ARM_CORE_INFO *ArmCpus;
|
ARM_CORE_INFO *ArmCpus;
|
||||||
} ARM_PROCESSOR_TABLE;
|
} ARM_PROCESSOR_TABLE;
|
||||||
|
|
||||||
|
|
||||||
#define ARM_MP_CORE_INFO_GUID \
|
#define ARM_MP_CORE_INFO_GUID \
|
||||||
{ 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
|
{ 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
|
||||||
|
|
||||||
@@ -55,4 +57,4 @@ typedef struct {
|
|||||||
|
|
||||||
extern EFI_GUID gArmMpCoreInfoGuid;
|
extern EFI_GUID gArmMpCoreInfoGuid;
|
||||||
|
|
||||||
#endif /* ARM_MP_CORE_INFO_GUID_H_ */
|
#endif /* MPCOREINFO_H_ */
|
||||||
|
@@ -1,111 +0,0 @@
|
|||||||
/** @file
|
|
||||||
|
|
||||||
Copyright (c) 2020 - 2021, NUVIA Inc. All rights reserved.<BR>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
|
|
||||||
**/
|
|
||||||
|
|
||||||
#ifndef ARM_CACHE_H_
|
|
||||||
#define ARM_CACHE_H_
|
|
||||||
|
|
||||||
#include <Uefi/UefiBaseType.h>
|
|
||||||
|
|
||||||
// The ARM Architecture Reference Manual for ARMv8-A defines up
|
|
||||||
// to 7 levels of cache, L1 through L7.
|
|
||||||
#define MAX_ARM_CACHE_LEVEL 7
|
|
||||||
|
|
||||||
/// Defines the structure of the CSSELR (Cache Size Selection) register
|
|
||||||
typedef union {
|
|
||||||
struct {
|
|
||||||
UINT32 InD : 1; ///< Instruction not Data bit
|
|
||||||
UINT32 Level : 3; ///< Cache level (zero based)
|
|
||||||
UINT32 TnD : 1; ///< Allocation not Data bit
|
|
||||||
UINT32 Reserved : 27; ///< Reserved, RES0
|
|
||||||
} Bits; ///< Bitfield definition of the register
|
|
||||||
UINT32 Data; ///< The entire 32-bit value
|
|
||||||
} CSSELR_DATA;
|
|
||||||
|
|
||||||
/// The cache type values for the InD field of the CSSELR register
|
|
||||||
typedef enum {
|
|
||||||
/// Select the data or unified cache
|
|
||||||
CsselrCacheTypeDataOrUnified = 0,
|
|
||||||
/// Select the instruction cache
|
|
||||||
CsselrCacheTypeInstruction,
|
|
||||||
CsselrCacheTypeMax
|
|
||||||
} CSSELR_CACHE_TYPE;
|
|
||||||
|
|
||||||
/// Defines the structure of the CCSIDR (Current Cache Size ID) register
|
|
||||||
typedef union {
|
|
||||||
struct {
|
|
||||||
UINT64 LineSize : 3; ///< Line size (Log2(Num bytes in cache) - 4)
|
|
||||||
UINT64 Associativity : 10; ///< Associativity - 1
|
|
||||||
UINT64 NumSets : 15; ///< Number of sets in the cache -1
|
|
||||||
UINT64 Unknown : 4; ///< Reserved, UNKNOWN
|
|
||||||
UINT64 Reserved : 32; ///< Reserved, RES0
|
|
||||||
} BitsNonCcidx; ///< Bitfield definition of the register when FEAT_CCIDX is not supported.
|
|
||||||
struct {
|
|
||||||
UINT64 LineSize : 3; ///< Line size (Log2(Num bytes in cache) - 4)
|
|
||||||
UINT64 Associativity : 21; ///< Associativity - 1
|
|
||||||
UINT64 Reserved1 : 8; ///< Reserved, RES0
|
|
||||||
UINT64 NumSets : 24; ///< Number of sets in the cache -1
|
|
||||||
UINT64 Reserved2 : 8; ///< Reserved, RES0
|
|
||||||
} BitsCcidxAA64; ///< Bitfield definition of the register when FEAT_IDX is supported.
|
|
||||||
struct {
|
|
||||||
UINT64 LineSize : 3;
|
|
||||||
UINT64 Associativity : 21;
|
|
||||||
UINT64 Reserved : 8;
|
|
||||||
UINT64 Unallocated : 32;
|
|
||||||
} BitsCcidxAA32;
|
|
||||||
UINT64 Data; ///< The entire 64-bit value
|
|
||||||
} CCSIDR_DATA;
|
|
||||||
|
|
||||||
/// Defines the structure of the AARCH32 CCSIDR2 register.
|
|
||||||
typedef union {
|
|
||||||
struct {
|
|
||||||
UINT32 NumSets : 24; ///< Number of sets in the cache - 1
|
|
||||||
UINT32 Reserved : 8; ///< Reserved, RES0
|
|
||||||
} Bits; ///< Bitfield definition of the register
|
|
||||||
UINT32 Data; ///< The entire 32-bit value
|
|
||||||
} CCSIDR2_DATA;
|
|
||||||
|
|
||||||
/** Defines the structure of the CLIDR (Cache Level ID) register.
|
|
||||||
*
|
|
||||||
* The lower 32 bits are the same for both AARCH32 and AARCH64
|
|
||||||
* so we can use the same structure for both.
|
|
||||||
**/
|
|
||||||
typedef union {
|
|
||||||
struct {
|
|
||||||
UINT32 Ctype1 : 3; ///< Level 1 cache type
|
|
||||||
UINT32 Ctype2 : 3; ///< Level 2 cache type
|
|
||||||
UINT32 Ctype3 : 3; ///< Level 3 cache type
|
|
||||||
UINT32 Ctype4 : 3; ///< Level 4 cache type
|
|
||||||
UINT32 Ctype5 : 3; ///< Level 5 cache type
|
|
||||||
UINT32 Ctype6 : 3; ///< Level 6 cache type
|
|
||||||
UINT32 Ctype7 : 3; ///< Level 7 cache type
|
|
||||||
UINT32 LoUIS : 3; ///< Level of Unification Inner Shareable
|
|
||||||
UINT32 LoC : 3; ///< Level of Coherency
|
|
||||||
UINT32 LoUU : 3; ///< Level of Unification Uniprocessor
|
|
||||||
UINT32 Icb : 3; ///< Inner Cache Boundary
|
|
||||||
} Bits; ///< Bitfield definition of the register
|
|
||||||
UINT32 Data; ///< The entire 32-bit value
|
|
||||||
} CLIDR_DATA;
|
|
||||||
|
|
||||||
/// The cache types reported in the CLIDR register.
|
|
||||||
typedef enum {
|
|
||||||
/// No cache is present
|
|
||||||
ClidrCacheTypeNone = 0,
|
|
||||||
/// There is only an instruction cache
|
|
||||||
ClidrCacheTypeInstructionOnly,
|
|
||||||
/// There is only a data cache
|
|
||||||
ClidrCacheTypeDataOnly,
|
|
||||||
/// There are separate data and instruction caches
|
|
||||||
ClidrCacheTypeSeparate,
|
|
||||||
/// There is a unified cache
|
|
||||||
ClidrCacheTypeUnified,
|
|
||||||
ClidrCacheTypeMax
|
|
||||||
} CLIDR_CACHE_TYPE;
|
|
||||||
|
|
||||||
#define CLIDR_GET_CACHE_TYPE(x, level) ((x >> (3 * (level))) & 0b111)
|
|
||||||
|
|
||||||
#endif /* ARM_CACHE_H_ */
|
|
@@ -1,56 +0,0 @@
|
|||||||
/** @file
|
|
||||||
Header file for FF-A ABI's that will be used for
|
|
||||||
communication between S-EL0 and the Secure Partition
|
|
||||||
Manager(SPM)
|
|
||||||
|
|
||||||
Copyright (c) 2020, ARM Limited. All rights reserved.
|
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
|
|
||||||
@par Revision Reference:
|
|
||||||
- FF-A Version 1.0
|
|
||||||
|
|
||||||
|
|
||||||
**/
|
|
||||||
|
|
||||||
#ifndef ARM_FFA_SVC_H_
|
|
||||||
#define ARM_FFA_SVC_H_
|
|
||||||
|
|
||||||
#define ARM_SVC_ID_FFA_VERSION_AARCH32 0x84000063
|
|
||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH32 0x8400006F
|
|
||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH32 0x84000070
|
|
||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH64 0xC400006F
|
|
||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64 0xC4000070
|
|
||||||
|
|
||||||
/* Generic IDs when using AArch32 or AArch64 execution state */
|
|
||||||
#ifdef MDE_CPU_AARCH64
|
|
||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH64
|
|
||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64
|
|
||||||
#endif
|
|
||||||
#ifdef MDE_CPU_ARM
|
|
||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH32
|
|
||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SPM_MAJOR_VERSION_FFA 1
|
|
||||||
#define SPM_MINOR_VERSION_FFA 0
|
|
||||||
|
|
||||||
#define ARM_FFA_SPM_RET_SUCCESS 0
|
|
||||||
#define ARM_FFA_SPM_RET_NOT_SUPPORTED -1
|
|
||||||
#define ARM_FFA_SPM_RET_INVALID_PARAMETERS -2
|
|
||||||
#define ARM_FFA_SPM_RET_NO_MEMORY -3
|
|
||||||
#define ARM_FFA_SPM_RET_BUSY -4
|
|
||||||
#define ARM_FFA_SPM_RET_INTERRUPTED -5
|
|
||||||
#define ARM_FFA_SPM_RET_DENIED -6
|
|
||||||
#define ARM_FFA_SPM_RET_RETRY -7
|
|
||||||
#define ARM_FFA_SPM_RET_ABORTED -8
|
|
||||||
|
|
||||||
// For now, the destination id to be used in the FF-A calls
|
|
||||||
// is being hard-coded. Subsequently, support will be added
|
|
||||||
// to get the endpoint id's dynamically
|
|
||||||
// This is the endpoint id used by the optee os's implementation
|
|
||||||
// of the spmc.
|
|
||||||
// https://github.com/OP-TEE/optee_os/blob/master/core/arch/arm/kernel/stmm_sp.c#L66
|
|
||||||
#define ARM_FFA_DESTINATION_ENDPOINT_ID 3
|
|
||||||
|
|
||||||
#endif // ARM_FFA_SVC_H_
|
|
@@ -6,8 +6,8 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_MM_SVC_H_
|
#ifndef __ARM_MM_SVC_H__
|
||||||
#define ARM_MM_SVC_H_
|
#define __ARM_MM_SVC_H__
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SVC IDs to allow the MM secure partition to initialise itself, handle
|
* SVC IDs to allow the MM secure partition to initialise itself, handle
|
||||||
@@ -15,25 +15,10 @@
|
|||||||
* privileged operations on its behalf.
|
* privileged operations on its behalf.
|
||||||
*/
|
*/
|
||||||
#define ARM_SVC_ID_SPM_VERSION_AARCH32 0x84000060
|
#define ARM_SVC_ID_SPM_VERSION_AARCH32 0x84000060
|
||||||
#define ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH32 0x84000061
|
|
||||||
#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH32 0x84000064
|
|
||||||
#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH32 0x84000065
|
|
||||||
#define ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64 0xC4000061
|
#define ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64 0xC4000061
|
||||||
#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH64 0xC4000064
|
#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH64 0xC4000064
|
||||||
#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64 0xC4000065
|
#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64 0xC4000065
|
||||||
|
|
||||||
/* Generic IDs when using AArch32 or AArch64 execution state */
|
|
||||||
#ifdef MDE_CPU_AARCH64
|
|
||||||
#define ARM_SVC_ID_SP_EVENT_COMPLETE ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64
|
|
||||||
#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH64
|
|
||||||
#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64
|
|
||||||
#endif
|
|
||||||
#ifdef MDE_CPU_ARM
|
|
||||||
#define ARM_SVC_ID_SP_EVENT_COMPLETE ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH32
|
|
||||||
#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH32
|
|
||||||
#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SET_MEM_ATTR_DATA_PERM_MASK 0x3
|
#define SET_MEM_ATTR_DATA_PERM_MASK 0x3
|
||||||
#define SET_MEM_ATTR_DATA_PERM_SHIFT 0
|
#define SET_MEM_ATTR_DATA_PERM_SHIFT 0
|
||||||
#define SET_MEM_ATTR_DATA_PERM_NO_ACCESS 0
|
#define SET_MEM_ATTR_DATA_PERM_NO_ACCESS 0
|
||||||
@@ -56,7 +41,4 @@
|
|||||||
#define ARM_SVC_SPM_RET_DENIED -3
|
#define ARM_SVC_SPM_RET_DENIED -3
|
||||||
#define ARM_SVC_SPM_RET_NO_MEMORY -5
|
#define ARM_SVC_SPM_RET_NO_MEMORY -5
|
||||||
|
|
||||||
#define SPM_MAJOR_VERSION 0
|
#endif
|
||||||
#define SPM_MINOR_VERSION 1
|
|
||||||
|
|
||||||
#endif // ARM_MM_SVC_H_
|
|
||||||
|
@@ -1,17 +1,13 @@
|
|||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
* Copyright (c) 2020, NUVIA Inc. All rights reserved.<BR>
|
|
||||||
* Copyright (c) 2012-2017, ARM Limited. All rights reserved.
|
* Copyright (c) 2012-2017, ARM Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
*
|
*
|
||||||
* @par Revision Reference:
|
|
||||||
* - SMC Calling Convention version 1.2
|
|
||||||
* (https://developer.arm.com/documentation/den0028/c/?lang=en)
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_STD_SMC_H_
|
#ifndef __ARM_STD_SMC_H__
|
||||||
#define ARM_STD_SMC_H_
|
#define __ARM_STD_SMC_H__
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SMC function IDs for Standard Service queries
|
* SMC function IDs for Standard Service queries
|
||||||
@@ -49,14 +45,6 @@
|
|||||||
#define ARM_SMC_ID_MM_COMMUNICATE_AARCH32 0x84000041
|
#define ARM_SMC_ID_MM_COMMUNICATE_AARCH32 0x84000041
|
||||||
#define ARM_SMC_ID_MM_COMMUNICATE_AARCH64 0xC4000041
|
#define ARM_SMC_ID_MM_COMMUNICATE_AARCH64 0xC4000041
|
||||||
|
|
||||||
/* Generic ID when using AArch32 or AArch64 execution state */
|
|
||||||
#ifdef MDE_CPU_AARCH64
|
|
||||||
#define ARM_SMC_ID_MM_COMMUNICATE ARM_SMC_ID_MM_COMMUNICATE_AARCH64
|
|
||||||
#endif
|
|
||||||
#ifdef MDE_CPU_ARM
|
|
||||||
#define ARM_SMC_ID_MM_COMMUNICATE ARM_SMC_ID_MM_COMMUNICATE_AARCH32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* MM return error codes */
|
/* MM return error codes */
|
||||||
#define ARM_SMC_MM_RET_SUCCESS 0
|
#define ARM_SMC_MM_RET_SUCCESS 0
|
||||||
#define ARM_SMC_MM_RET_NOT_SUPPORTED -1
|
#define ARM_SMC_MM_RET_NOT_SUPPORTED -1
|
||||||
@@ -64,18 +52,6 @@
|
|||||||
#define ARM_SMC_MM_RET_DENIED -3
|
#define ARM_SMC_MM_RET_DENIED -3
|
||||||
#define ARM_SMC_MM_RET_NO_MEMORY -4
|
#define ARM_SMC_MM_RET_NO_MEMORY -4
|
||||||
|
|
||||||
// ARM Architecture Calls
|
|
||||||
#define SMCCC_VERSION 0x80000000
|
|
||||||
#define SMCCC_ARCH_FEATURES 0x80000001
|
|
||||||
#define SMCCC_ARCH_SOC_ID 0x80000002
|
|
||||||
#define SMCCC_ARCH_WORKAROUND_1 0x80008000
|
|
||||||
#define SMCCC_ARCH_WORKAROUND_2 0x80007FFF
|
|
||||||
|
|
||||||
#define SMC_ARCH_CALL_SUCCESS 0
|
|
||||||
#define SMC_ARCH_CALL_NOT_SUPPORTED -1
|
|
||||||
#define SMC_ARCH_CALL_NOT_REQUIRED -2
|
|
||||||
#define SMC_ARCH_CALL_INVALID_PARAMETER -3
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Power State Coordination Interface (PSCI) calls cover a subset of the
|
* Power State Coordination Interface (PSCI) calls cover a subset of the
|
||||||
* Standard Service Call range.
|
* Standard Service Call range.
|
||||||
@@ -137,4 +113,4 @@
|
|||||||
/* 0xbf00ff02 is reserved */
|
/* 0xbf00ff02 is reserved */
|
||||||
#define ARM_SMC_ID_TOS_REVISION 0xbf00ff03
|
#define ARM_SMC_ID_TOS_REVISION 0xbf00ff03
|
||||||
|
|
||||||
#endif // ARM_STD_SMC_H_
|
#endif
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_DISASSEMBLER_LIB_H_
|
#ifndef __ARM_DISASSEBLER_LIB_H__
|
||||||
#define ARM_DISASSEMBLER_LIB_H_
|
#define __ARM_DISASSEBLER_LIB_H__
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
|
Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
|
||||||
@@ -34,4 +34,4 @@ DisassembleInstruction (
|
|||||||
OUT UINTN Size
|
OUT UINTN Size
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARM_DISASSEMBLER_LIB_H_
|
#endif
|
||||||
|
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_GENERIC_TIMER_COUNTER_LIB_H_
|
#ifndef __ARM_GENERIC_TIMER_COUNTER_LIB_H__
|
||||||
#define ARM_GENERIC_TIMER_COUNTER_LIB_H_
|
#define __ARM_GENERIC_TIMER_COUNTER_LIB_H__
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
@@ -82,4 +82,4 @@ ArmGenericTimerSetCompareVal (
|
|||||||
IN UINT64 Value
|
IN UINT64 Value
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARM_GENERIC_TIMER_COUNTER_LIB_H_
|
#endif
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_GIC_ARCH_LIB_H_
|
#ifndef __ARM_GIC_ARCH_LIB_H__
|
||||||
#define ARM_GIC_ARCH_LIB_H_
|
#define __ARM_GIC_ARCH_LIB_H__
|
||||||
|
|
||||||
//
|
//
|
||||||
// GIC definitions
|
// GIC definitions
|
||||||
@@ -17,10 +17,11 @@ typedef enum {
|
|||||||
ARM_GIC_ARCH_REVISION_3
|
ARM_GIC_ARCH_REVISION_3
|
||||||
} ARM_GIC_ARCH_REVISION;
|
} ARM_GIC_ARCH_REVISION;
|
||||||
|
|
||||||
|
|
||||||
ARM_GIC_ARCH_REVISION
|
ARM_GIC_ARCH_REVISION
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmGicGetSupportedArchRevision (
|
ArmGicGetSupportedArchRevision (
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARM_GIC_ARCH_LIB_H_
|
#endif
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2021, Arm Limited. All rights reserved.<BR>
|
* Copyright (c) 2011-2018, ARM Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARMGIC_H_
|
#ifndef __ARMGIC_H
|
||||||
#define ARMGIC_H_
|
#define __ARMGIC_H
|
||||||
|
|
||||||
#include <Library/ArmGicArchLib.h>
|
#include <Library/ArmGicArchLib.h>
|
||||||
|
|
||||||
@@ -52,6 +52,7 @@
|
|||||||
#define ARM_GIC_ICDICFR_LEVEL_TRIGGERED 0x0 // Level triggered interrupt
|
#define ARM_GIC_ICDICFR_LEVEL_TRIGGERED 0x0 // Level triggered interrupt
|
||||||
#define ARM_GIC_ICDICFR_EDGE_TRIGGERED 0x1 // Edge triggered interrupt
|
#define ARM_GIC_ICDICFR_EDGE_TRIGGERED 0x1 // Edge triggered interrupt
|
||||||
|
|
||||||
|
|
||||||
// GIC Redistributor
|
// GIC Redistributor
|
||||||
#define ARM_GICR_CTLR_FRAME_SIZE SIZE_64KB
|
#define ARM_GICR_CTLR_FRAME_SIZE SIZE_64KB
|
||||||
#define ARM_GICR_SGI_PPI_FRAME_SIZE SIZE_64KB
|
#define ARM_GICR_SGI_PPI_FRAME_SIZE SIZE_64KB
|
||||||
@@ -207,15 +208,6 @@ ArmGicSetPriorityMask (
|
|||||||
IN INTN PriorityMask
|
IN INTN PriorityMask
|
||||||
);
|
);
|
||||||
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
ArmGicSetInterruptPriority (
|
|
||||||
IN UINTN GicDistributorBase,
|
|
||||||
IN UINTN GicRedistributorBase,
|
|
||||||
IN UINTN Source,
|
|
||||||
IN UINTN Priority
|
|
||||||
);
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmGicEnableInterrupt (
|
ArmGicEnableInterrupt (
|
||||||
@@ -332,4 +324,4 @@ ArmGicV3SetPriorityMask (
|
|||||||
IN UINTN Priority
|
IN UINTN Priority
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARMGIC_H_
|
#endif
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_HVC_LIB_H_
|
#ifndef __ARM_HVC_LIB__
|
||||||
#define ARM_HVC_LIB_H_
|
#define __ARM_HVC_LIB__
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The size of the HVC arguments are different between AArch64 and AArch32.
|
* The size of the HVC arguments are different between AArch64 and AArch32.
|
||||||
@@ -37,4 +37,4 @@ ArmCallHvc (
|
|||||||
IN OUT ARM_HVC_ARGS *Args
|
IN OUT ARM_HVC_ARGS *Args
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARM_HVC_LIB_H_
|
#endif
|
||||||
|
@@ -2,14 +2,13 @@
|
|||||||
|
|
||||||
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||||
Copyright (c) 2011 - 2016, ARM Ltd. All rights reserved.<BR>
|
Copyright (c) 2011 - 2016, ARM Ltd. All rights reserved.<BR>
|
||||||
Copyright (c) 2020 - 2021, NUVIA Inc. All rights reserved.<BR>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_LIB_H_
|
#ifndef __ARM_LIB__
|
||||||
#define ARM_LIB_H_
|
#define __ARM_LIB__
|
||||||
|
|
||||||
#include <Uefi/UefiBaseType.h>
|
#include <Uefi/UefiBaseType.h>
|
||||||
|
|
||||||
@@ -59,12 +58,8 @@ typedef struct {
|
|||||||
ARM_MEMORY_REGION_ATTRIBUTES Attributes;
|
ARM_MEMORY_REGION_ATTRIBUTES Attributes;
|
||||||
} ARM_MEMORY_REGION_DESCRIPTOR;
|
} ARM_MEMORY_REGION_DESCRIPTOR;
|
||||||
|
|
||||||
typedef VOID (*CACHE_OPERATION)(
|
typedef VOID (*CACHE_OPERATION)(VOID);
|
||||||
VOID
|
typedef VOID (*LINE_OPERATION)(UINTN);
|
||||||
);
|
|
||||||
typedef VOID (*LINE_OPERATION)(
|
|
||||||
UINTN
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// ARM Processor Mode
|
// ARM Processor Mode
|
||||||
@@ -111,44 +106,8 @@ typedef enum {
|
|||||||
#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK)
|
#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK)
|
||||||
#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8)
|
#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8)
|
||||||
#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId))
|
#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId))
|
||||||
#define GET_MPIDR_AFF0(MpId) ((MpId) & ARM_CORE_AFF0)
|
|
||||||
#define GET_MPIDR_AFF1(MpId) (((MpId) & ARM_CORE_AFF1) >> 8)
|
|
||||||
#define GET_MPIDR_AFF2(MpId) (((MpId) & ARM_CORE_AFF2) >> 16)
|
|
||||||
#define GET_MPIDR_AFF3(MpId) (((MpId) & ARM_CORE_AFF3) >> 32)
|
|
||||||
#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)
|
#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)
|
||||||
|
|
||||||
/** Reads the CCSIDR register for the specified cache.
|
|
||||||
|
|
||||||
@param CSSELR The CSSELR cache selection register value.
|
|
||||||
|
|
||||||
@return The contents of the CCSIDR_EL1 register for the specified cache, when in AARCH64 mode.
|
|
||||||
Returns the contents of the CCSIDR register in AARCH32 mode.
|
|
||||||
**/
|
|
||||||
UINTN
|
|
||||||
ReadCCSIDR (
|
|
||||||
IN UINT32 CSSELR
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Reads the CCSIDR2 for the specified cache.
|
|
||||||
|
|
||||||
@param CSSELR The CSSELR cache selection register value
|
|
||||||
|
|
||||||
@return The contents of the CCSIDR2 register for the specified cache.
|
|
||||||
**/
|
|
||||||
UINT32
|
|
||||||
ReadCCSIDR2 (
|
|
||||||
IN UINT32 CSSELR
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Reads the Cache Level ID (CLIDR) register.
|
|
||||||
|
|
||||||
@return The contents of the CLIDR_EL1 register.
|
|
||||||
**/
|
|
||||||
UINT32
|
|
||||||
ReadCLIDR (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmDataCacheLineLength (
|
ArmDataCacheLineLength (
|
||||||
@@ -173,6 +132,18 @@ ArmIsArchTimerImplemented (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
UINTN
|
||||||
|
EFIAPI
|
||||||
|
ArmReadIdPfr0 (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
UINTN
|
||||||
|
EFIAPI
|
||||||
|
ArmReadIdPfr1 (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmCacheInfo (
|
ArmCacheInfo (
|
||||||
@@ -191,6 +162,7 @@ ArmInvalidateDataCache (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmCleanInvalidateDataCache (
|
ArmCleanInvalidateDataCache (
|
||||||
@@ -580,6 +552,7 @@ ArmWriteHVBar (
|
|||||||
IN UINTN HypModeVectorBase
|
IN UINTN HypModeVectorBase
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Helper functions for accessing CPU ACTLR
|
// Helper functions for accessing CPU ACTLR
|
||||||
//
|
//
|
||||||
@@ -742,50 +715,4 @@ ArmGetPhysicalAddressBits (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
///
|
#endif // __ARM_LIB__
|
||||||
/// ID Register Helper functions
|
|
||||||
///
|
|
||||||
|
|
||||||
/**
|
|
||||||
Check whether the CPU supports the GIC system register interface (any version)
|
|
||||||
|
|
||||||
@return Whether GIC System Register Interface is supported
|
|
||||||
|
|
||||||
**/
|
|
||||||
BOOLEAN
|
|
||||||
EFIAPI
|
|
||||||
ArmHasGicSystemRegisters (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Checks if CCIDX is implemented.
|
|
||||||
|
|
||||||
@retval TRUE CCIDX is implemented.
|
|
||||||
@retval FALSE CCIDX is not implemented.
|
|
||||||
**/
|
|
||||||
BOOLEAN
|
|
||||||
EFIAPI
|
|
||||||
ArmHasCcidx (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
#ifdef MDE_CPU_ARM
|
|
||||||
///
|
|
||||||
/// AArch32-only ID Register Helper functions
|
|
||||||
///
|
|
||||||
|
|
||||||
/**
|
|
||||||
Check whether the CPU supports the Security extensions
|
|
||||||
|
|
||||||
@return Whether the Security extensions are implemented
|
|
||||||
|
|
||||||
**/
|
|
||||||
BOOLEAN
|
|
||||||
EFIAPI
|
|
||||||
ArmHasSecurityExtensions (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif // MDE_CPU_ARM
|
|
||||||
|
|
||||||
#endif // ARM_LIB_H_
|
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_MMU_LIB_H_
|
#ifndef __ARM_MMU_LIB__
|
||||||
#define ARM_MMU_LIB_H_
|
#define __ARM_MMU_LIB__
|
||||||
|
|
||||||
#include <Uefi/UefiBaseType.h>
|
#include <Uefi/UefiBaseType.h>
|
||||||
|
|
||||||
@@ -64,4 +64,4 @@ ArmSetMemoryAttributes (
|
|||||||
IN UINT64 Attributes
|
IN UINT64 Attributes
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARM_MMU_LIB_H_
|
#endif
|
||||||
|
@@ -128,3 +128,4 @@ MtlReceiveMessage (
|
|||||||
);
|
);
|
||||||
|
|
||||||
#endif /* ARM_MTL_LIB_H_ */
|
#endif /* ARM_MTL_LIB_H_ */
|
||||||
|
|
||||||
|
@@ -1,14 +1,13 @@
|
|||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
* Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
|
|
||||||
* Copyright (c) 2012-2014, ARM Limited. All rights reserved.
|
* Copyright (c) 2012-2014, ARM Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_SMC_LIB_H_
|
#ifndef __ARM_SMC_LIB__
|
||||||
#define ARM_SMC_LIB_H_
|
#define __ARM_SMC_LIB__
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The size of the SMC arguments are different between AArch64 and AArch32.
|
* The size of the SMC arguments are different between AArch64 and AArch32.
|
||||||
@@ -38,76 +37,4 @@ ArmCallSmc (
|
|||||||
IN OUT ARM_SMC_ARGS *Args
|
IN OUT ARM_SMC_ARGS *Args
|
||||||
);
|
);
|
||||||
|
|
||||||
/** Trigger an SMC call with 3 arguments.
|
#endif
|
||||||
|
|
||||||
@param Function The SMC function.
|
|
||||||
@param Arg1 Argument/result.
|
|
||||||
@param Arg2 Argument/result.
|
|
||||||
@param Arg3 Argument/result.
|
|
||||||
|
|
||||||
@return The SMC error code.
|
|
||||||
|
|
||||||
**/
|
|
||||||
UINTN
|
|
||||||
ArmCallSmc3 (
|
|
||||||
IN UINTN Function,
|
|
||||||
IN OUT UINTN *Arg1 OPTIONAL,
|
|
||||||
IN OUT UINTN *Arg2 OPTIONAL,
|
|
||||||
IN OUT UINTN *Arg3 OPTIONAL
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Trigger an SMC call with 2 arguments.
|
|
||||||
|
|
||||||
@param Function The SMC function.
|
|
||||||
@param Arg1 Argument/result.
|
|
||||||
@param Arg2 Argument/result.
|
|
||||||
@param Arg3 Result.
|
|
||||||
|
|
||||||
@return The SMC error code.
|
|
||||||
|
|
||||||
**/
|
|
||||||
UINTN
|
|
||||||
ArmCallSmc2 (
|
|
||||||
IN UINTN Function,
|
|
||||||
IN OUT UINTN *Arg1 OPTIONAL,
|
|
||||||
IN OUT UINTN *Arg2 OPTIONAL,
|
|
||||||
OUT UINTN *Arg3 OPTIONAL
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Trigger an SMC call with 1 argument.
|
|
||||||
|
|
||||||
@param Function The SMC function.
|
|
||||||
@param Arg1 Argument/result.
|
|
||||||
@param Arg2 Result.
|
|
||||||
@param Arg3 Result.
|
|
||||||
|
|
||||||
@return The SMC error code.
|
|
||||||
|
|
||||||
**/
|
|
||||||
UINTN
|
|
||||||
ArmCallSmc1 (
|
|
||||||
IN UINTN Function,
|
|
||||||
IN OUT UINTN *Arg1 OPTIONAL,
|
|
||||||
OUT UINTN *Arg2 OPTIONAL,
|
|
||||||
OUT UINTN *Arg3 OPTIONAL
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Trigger an SMC call with 0 arguments.
|
|
||||||
|
|
||||||
@param Function The SMC function.
|
|
||||||
@param Arg1 Result.
|
|
||||||
@param Arg2 Result.
|
|
||||||
@param Arg3 Result.
|
|
||||||
|
|
||||||
@return The SMC error code.
|
|
||||||
|
|
||||||
**/
|
|
||||||
UINTN
|
|
||||||
ArmCallSmc0 (
|
|
||||||
IN UINTN Function,
|
|
||||||
OUT UINTN *Arg1 OPTIONAL,
|
|
||||||
OUT UINTN *Arg2 OPTIONAL,
|
|
||||||
OUT UINTN *Arg3 OPTIONAL
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif // ARM_SMC_LIB_H_
|
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_SVC_LIB_H_
|
#ifndef __ARM_SVC_LIB__
|
||||||
#define ARM_SVC_LIB_H_
|
#define __ARM_SVC_LIB__
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The size of the SVC arguments are different between AArch64 and AArch32.
|
* The size of the SVC arguments are different between AArch64 and AArch32.
|
||||||
@@ -27,20 +27,14 @@ typedef struct {
|
|||||||
/**
|
/**
|
||||||
Trigger an SVC call
|
Trigger an SVC call
|
||||||
|
|
||||||
SVC calls can take up to 8 arguments and return up to 8 return values.
|
SVC calls can take up to 7 arguments and return up to 4 return values.
|
||||||
Therefore, the 8 first fields in the ARM_SVC_ARGS structure are used
|
Therefore, the 4 first fields in the ARM_SVC_ARGS structure are used
|
||||||
for both input and output values.
|
for both input and output values.
|
||||||
|
|
||||||
@param[in, out] Args Arguments to be passed as part of the SVC call
|
|
||||||
The return values of the SVC call are also placed
|
|
||||||
in the same structure
|
|
||||||
|
|
||||||
@retval None
|
|
||||||
|
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
ArmCallSvc (
|
ArmCallSvc (
|
||||||
IN OUT ARM_SVC_ARGS *Args
|
IN OUT ARM_SVC_ARGS *Args
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARM_SVC_LIB_H_
|
#endif
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef DEFAULT_EXCEPTION_HANDLER_LIB_H_
|
#ifndef __DEFAULT_EXCEPTION_HANDLER_LIB_H__
|
||||||
#define DEFAULT_EXCEPTION_HANDLER_LIB_H_
|
#define __DEFAULT_EXCEPTION_HANDLER_LIB_H__
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This is the default action to take on an unexpected exception
|
This is the default action to take on an unexpected exception
|
||||||
@@ -22,4 +22,4 @@ DefaultExceptionHandler (
|
|||||||
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // DEFAULT_EXCEPTION_HANDLER_LIB_H_
|
#endif
|
||||||
|
@@ -1,236 +0,0 @@
|
|||||||
/** @file
|
|
||||||
*
|
|
||||||
* Copyright (c) 2021, NUVIA Inc. All rights reserved.
|
|
||||||
* Copyright (c) 2015, Hisilicon Limited. All rights reserved.
|
|
||||||
* Copyright (c) 2015, Linaro Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
*
|
|
||||||
**/
|
|
||||||
|
|
||||||
#ifndef OEM_MISC_LIB_H_
|
|
||||||
#define OEM_MISC_LIB_H_
|
|
||||||
|
|
||||||
#include <Uefi.h>
|
|
||||||
#include <IndustryStandard/SmBios.h>
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
CpuCacheL1 = 1,
|
|
||||||
CpuCacheL2,
|
|
||||||
CpuCacheL3,
|
|
||||||
CpuCacheL4,
|
|
||||||
CpuCacheL5,
|
|
||||||
CpuCacheL6,
|
|
||||||
CpuCacheL7,
|
|
||||||
CpuCacheLevelMax
|
|
||||||
} OEM_MISC_CPU_CACHE_LEVEL;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
UINT8 Voltage; ///< Processor voltage
|
|
||||||
UINT16 CurrentSpeed; ///< Current clock speed in MHz
|
|
||||||
UINT16 MaxSpeed; ///< Maximum clock speed in MHz
|
|
||||||
UINT16 ExternalClock; ///< External clock speed in MHz
|
|
||||||
UINT16 CoreCount; ///< Number of cores available
|
|
||||||
UINT16 CoresEnabled; ///< Number of cores enabled
|
|
||||||
UINT16 ThreadCount; ///< Number of threads per processor
|
|
||||||
} OEM_MISC_PROCESSOR_DATA;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
ProductNameType01,
|
|
||||||
SerialNumType01,
|
|
||||||
UuidType01,
|
|
||||||
SystemManufacturerType01,
|
|
||||||
VersionType01,
|
|
||||||
SkuNumberType01,
|
|
||||||
FamilyType01,
|
|
||||||
AssertTagType02,
|
|
||||||
SerialNumberType02,
|
|
||||||
BoardManufacturerType02,
|
|
||||||
ProductNameType02,
|
|
||||||
VersionType02,
|
|
||||||
SkuNumberType02,
|
|
||||||
ChassisLocationType02,
|
|
||||||
AssetTagType03,
|
|
||||||
SerialNumberType03,
|
|
||||||
VersionType03,
|
|
||||||
ChassisTypeType03,
|
|
||||||
ManufacturerType03,
|
|
||||||
SkuNumberType03,
|
|
||||||
ProcessorPartNumType04,
|
|
||||||
ProcessorSerialNumType04,
|
|
||||||
SmbiosHiiStringFieldMax
|
|
||||||
} OEM_MISC_SMBIOS_HII_STRING_FIELD;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following are functions that the each platform needs to
|
|
||||||
* implement in its OemMiscLib library.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** Gets the CPU frequency of the specified processor.
|
|
||||||
|
|
||||||
@param ProcessorIndex Index of the processor to get the frequency for.
|
|
||||||
|
|
||||||
@return CPU frequency in Hz
|
|
||||||
**/
|
|
||||||
UINTN
|
|
||||||
EFIAPI
|
|
||||||
OemGetCpuFreq (
|
|
||||||
IN UINT8 ProcessorIndex
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Gets information about the specified processor and stores it in
|
|
||||||
the structures provided.
|
|
||||||
|
|
||||||
@param ProcessorIndex Index of the processor to get the information for.
|
|
||||||
@param ProcessorStatus Processor status.
|
|
||||||
@param ProcessorCharacteristics Processor characteritics.
|
|
||||||
@param MiscProcessorData Miscellaneous processor information.
|
|
||||||
|
|
||||||
@return TRUE on success, FALSE on failure.
|
|
||||||
**/
|
|
||||||
BOOLEAN
|
|
||||||
EFIAPI
|
|
||||||
OemGetProcessorInformation (
|
|
||||||
IN UINTN ProcessorIndex,
|
|
||||||
IN OUT PROCESSOR_STATUS_DATA *ProcessorStatus,
|
|
||||||
IN OUT PROCESSOR_CHARACTERISTIC_FLAGS *ProcessorCharacteristics,
|
|
||||||
IN OUT OEM_MISC_PROCESSOR_DATA *MiscProcessorData
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Gets information about the cache at the specified cache level.
|
|
||||||
|
|
||||||
@param ProcessorIndex The processor to get information for.
|
|
||||||
@param CacheLevel The cache level to get information for.
|
|
||||||
@param DataCache Whether the cache is a data cache.
|
|
||||||
@param UnifiedCache Whether the cache is a unified cache.
|
|
||||||
@param SmbiosCacheTable The SMBIOS Type7 cache information structure.
|
|
||||||
|
|
||||||
@return TRUE on success, FALSE on failure.
|
|
||||||
**/
|
|
||||||
BOOLEAN
|
|
||||||
EFIAPI
|
|
||||||
OemGetCacheInformation (
|
|
||||||
IN UINT8 ProcessorIndex,
|
|
||||||
IN UINT8 CacheLevel,
|
|
||||||
IN BOOLEAN DataCache,
|
|
||||||
IN BOOLEAN UnifiedCache,
|
|
||||||
IN OUT SMBIOS_TABLE_TYPE7 *SmbiosCacheTable
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Gets the maximum number of processors supported by the platform.
|
|
||||||
|
|
||||||
@return The maximum number of processors.
|
|
||||||
**/
|
|
||||||
UINT8
|
|
||||||
EFIAPI
|
|
||||||
OemGetMaxProcessors (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Gets the type of chassis for the system.
|
|
||||||
|
|
||||||
@retval The type of the chassis.
|
|
||||||
**/
|
|
||||||
MISC_CHASSIS_TYPE
|
|
||||||
EFIAPI
|
|
||||||
OemGetChassisType (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Returns whether the specified processor is present or not.
|
|
||||||
|
|
||||||
@param ProcessIndex The processor index to check.
|
|
||||||
|
|
||||||
@return TRUE is the processor is present, FALSE otherwise.
|
|
||||||
**/
|
|
||||||
BOOLEAN
|
|
||||||
EFIAPI
|
|
||||||
OemIsProcessorPresent (
|
|
||||||
IN UINTN ProcessorIndex
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Updates the HII string for the specified field.
|
|
||||||
|
|
||||||
@param HiiHandle The HII handle.
|
|
||||||
@param TokenToUpdate The string to update.
|
|
||||||
@param Field The field to get information about.
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
OemUpdateSmbiosInfo (
|
|
||||||
IN EFI_HII_HANDLE HiiHandle,
|
|
||||||
IN EFI_STRING_ID TokenToUpdate,
|
|
||||||
IN OEM_MISC_SMBIOS_HII_STRING_FIELD Field
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Fetches the Type 32 boot information status.
|
|
||||||
|
|
||||||
@return Boot status.
|
|
||||||
**/
|
|
||||||
MISC_BOOT_INFORMATION_STATUS_DATA_TYPE
|
|
||||||
EFIAPI
|
|
||||||
OemGetBootStatus (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Fetches the chassis status when it was last booted.
|
|
||||||
|
|
||||||
@return Chassis status.
|
|
||||||
**/
|
|
||||||
MISC_CHASSIS_STATE
|
|
||||||
EFIAPI
|
|
||||||
OemGetChassisBootupState (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Fetches the chassis power supply/supplies status when last booted.
|
|
||||||
|
|
||||||
@return Chassis power supply/supplies status.
|
|
||||||
**/
|
|
||||||
MISC_CHASSIS_STATE
|
|
||||||
EFIAPI
|
|
||||||
OemGetChassisPowerSupplyState (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Fetches the chassis thermal status when last booted.
|
|
||||||
|
|
||||||
@return Chassis thermal status.
|
|
||||||
**/
|
|
||||||
MISC_CHASSIS_STATE
|
|
||||||
EFIAPI
|
|
||||||
OemGetChassisThermalState (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Fetches the chassis security status when last booted.
|
|
||||||
|
|
||||||
@return Chassis security status.
|
|
||||||
**/
|
|
||||||
MISC_CHASSIS_SECURITY_STATE
|
|
||||||
EFIAPI
|
|
||||||
OemGetChassisSecurityStatus (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Fetches the chassis height in RMUs (Rack Mount Units).
|
|
||||||
|
|
||||||
@return The height of the chassis.
|
|
||||||
**/
|
|
||||||
UINT8
|
|
||||||
EFIAPI
|
|
||||||
OemGetChassisHeight (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
/** Fetches the number of power cords.
|
|
||||||
|
|
||||||
@return The number of power cords.
|
|
||||||
**/
|
|
||||||
UINT8
|
|
||||||
EFIAPI
|
|
||||||
OemGetChassisNumPowerCords (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif // OEM_MISC_LIB_H_
|
|
@@ -2,14 +2,13 @@
|
|||||||
OP-TEE specific header file.
|
OP-TEE specific header file.
|
||||||
|
|
||||||
Copyright (c) 2018, Linaro Ltd. All rights reserved.<BR>
|
Copyright (c) 2018, Linaro Ltd. All rights reserved.<BR>
|
||||||
Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef OPTEE_LIB_H_
|
#ifndef _OPTEE_H_
|
||||||
#define OPTEE_LIB_H_
|
#define _OPTEE_H_
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The 'Trusted OS Call UID' is supposed to return the following UUID for
|
* The 'Trusted OS Call UID' is supposed to return the following UUID for
|
||||||
@@ -46,14 +45,12 @@ typedef struct {
|
|||||||
UINT64 C;
|
UINT64 C;
|
||||||
} OPTEE_MESSAGE_PARAM_VALUE;
|
} OPTEE_MESSAGE_PARAM_VALUE;
|
||||||
|
|
||||||
typedef union {
|
|
||||||
OPTEE_MESSAGE_PARAM_MEMORY Memory;
|
|
||||||
OPTEE_MESSAGE_PARAM_VALUE Value;
|
|
||||||
} OPTEE_MESSAGE_PARAM_UNION;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT64 Attribute;
|
UINT64 Attribute;
|
||||||
OPTEE_MESSAGE_PARAM_UNION Union;
|
union {
|
||||||
|
OPTEE_MESSAGE_PARAM_MEMORY Memory;
|
||||||
|
OPTEE_MESSAGE_PARAM_VALUE Value;
|
||||||
|
} Union;
|
||||||
} OPTEE_MESSAGE_PARAM;
|
} OPTEE_MESSAGE_PARAM;
|
||||||
|
|
||||||
#define OPTEE_MAX_CALL_PARAMS 4
|
#define OPTEE_MAX_CALL_PARAMS 4
|
||||||
@@ -117,4 +114,4 @@ OpteeInvokeFunction (
|
|||||||
IN OUT OPTEE_INVOKE_FUNCTION_ARG *InvokeFunctionArg
|
IN OUT OPTEE_INVOKE_FUNCTION_ARG *InvokeFunctionArg
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // OPTEE_LIB_H_
|
#endif
|
||||||
|
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef SEMIHOSTING_LIB_H_
|
#ifndef __SEMIHOSTING_H__
|
||||||
#define SEMIHOSTING_LIB_H_
|
#define __SEMIHOSTING_H__
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
@@ -129,4 +129,4 @@ SemihostSystem (
|
|||||||
IN CHAR8 *CommandLine
|
IN CHAR8 *CommandLine
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // SEMIHOSTING_LIB_H_
|
#endif // __SEMIHOSTING_H__
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef STANDALONE_MM_MMU_LIB_
|
#ifndef __STANDALONEMM_MMU_LIB__
|
||||||
#define STANDALONE_MM_MMU_LIB_
|
#define __STANDALONEMM_MMU_LIB__
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
ArmSetMemoryRegionNoExec (
|
ArmSetMemoryRegionNoExec (
|
||||||
@@ -33,4 +33,4 @@ ArmClearMemoryRegionReadOnly (
|
|||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif /* STANDALONE_MM_MMU_LIB_ */
|
#endif /* __STANDALONEMM_MMU_LIB__ */
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_MP_CORE_INFO_PPI_H_
|
#ifndef __ARM_MP_CORE_INFO_PPI_H__
|
||||||
#define ARM_MP_CORE_INFO_PPI_H_
|
#define __ARM_MP_CORE_INFO_PPI_H__
|
||||||
|
|
||||||
#include <Guid/ArmMpCoreInfo.h>
|
#include <Guid/ArmMpCoreInfo.h>
|
||||||
|
|
||||||
@@ -49,4 +49,4 @@ typedef struct {
|
|||||||
extern EFI_GUID gArmMpCoreInfoPpiGuid;
|
extern EFI_GUID gArmMpCoreInfoPpiGuid;
|
||||||
extern EFI_GUID gArmMpCoreInfoGuid;
|
extern EFI_GUID gArmMpCoreInfoGuid;
|
||||||
|
|
||||||
#endif // ARM_MP_CORE_INFO_PPI_H_
|
#endif
|
||||||
|
@@ -18,3 +18,4 @@
|
|||||||
#define SCMI_MAX_STR_LEN 16
|
#define SCMI_MAX_STR_LEN 16
|
||||||
|
|
||||||
#endif /* ARM_SCMI_H_ */
|
#endif /* ARM_SCMI_H_ */
|
||||||
|
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2017-2021, Arm Limited. All rights reserved.<BR>
|
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@par Specification Reference:
|
System Control and Management Interface V1.0
|
||||||
- Arm System Control and Management Interface - Platform Design Document
|
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||||
(https://developer.arm.com/documentation/den0056/)
|
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_SCMI_BASE_PROTOCOL_H_
|
#ifndef ARM_SCMI_BASE_PROTOCOL_H_
|
||||||
@@ -14,8 +14,7 @@
|
|||||||
|
|
||||||
#include <Protocol/ArmScmi.h>
|
#include <Protocol/ArmScmi.h>
|
||||||
|
|
||||||
#define BASE_PROTOCOL_VERSION_V1 0x10000
|
#define BASE_PROTOCOL_VERSION 0x10000
|
||||||
#define BASE_PROTOCOL_VERSION_V2 0x20000
|
|
||||||
|
|
||||||
#define NUM_PROTOCOL_MASK 0xFFU
|
#define NUM_PROTOCOL_MASK 0xFFU
|
||||||
#define NUM_AGENT_MASK 0xFFU
|
#define NUM_AGENT_MASK 0xFFU
|
||||||
@@ -159,10 +158,11 @@ typedef struct _SCMI_BASE_PROTOCOL {
|
|||||||
|
|
||||||
// SCMI Message IDs for Base protocol.
|
// SCMI Message IDs for Base protocol.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ScmiMessageIdBaseDiscoverVendor = 0x3,
|
SCMI_MESSAGE_ID_BASE_DISCOVER_VENDOR = 0x3,
|
||||||
ScmiMessageIdBaseDiscoverSubVendor = 0x4,
|
SCMI_MESSAGE_ID_BASE_DISCOVER_SUB_VENDOR = 0x4,
|
||||||
ScmiMessageIdBaseDiscoverImplementationVersion = 0x5,
|
SCMI_MESSAGE_ID_BASE_DISCOVER_IMPLEMENTATION_VERSION = 0x5,
|
||||||
ScmiMessageIdBaseDiscoverListProtocols = 0x6
|
SCMI_MESSAGE_ID_BASE_DISCOVER_LIST_PROTOCOLS = 0x6
|
||||||
} SCMI_MESSAGE_ID_BASE;
|
} SCMI_MESSAGE_ID_BASE;
|
||||||
|
|
||||||
#endif /* ARM_SCMI_BASE_PROTOCOL_H_ */
|
#endif /* ARM_SCMI_BASE_PROTOCOL_H_ */
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2017-2021, Arm Limited. All rights reserved.
|
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@@ -89,10 +89,10 @@ EFI_STATUS
|
|||||||
@param[in] This A pointer to SCMI_CLOCK2_PROTOCOL Instance.
|
@param[in] This A pointer to SCMI_CLOCK2_PROTOCOL Instance.
|
||||||
@param[in] ClockId Identifier for the clock device.
|
@param[in] ClockId Identifier for the clock device.
|
||||||
|
|
||||||
@param[out] Format ScmiClockRateFormatDiscrete: Clock device
|
@param[out] Format SCMI_CLOCK_RATE_FORMAT_DISCRETE: Clock device
|
||||||
supports range of clock rates which are non-linear.
|
supports range of clock rates which are non-linear.
|
||||||
|
|
||||||
ScmiClockRateFormatLinear: Clock device supports
|
SCMI_CLOCK_RATE_FORMAT_LINEAR: Clock device supports
|
||||||
range of linear clock rates from Min to Max in steps.
|
range of linear clock rates from Min to Max in steps.
|
||||||
|
|
||||||
@param[out] TotalRates Total number of rates.
|
@param[out] TotalRates Total number of rates.
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2017-2021, Arm Limited. All rights reserved.
|
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@@ -22,16 +22,16 @@ extern EFI_GUID gArmScmiClockProtocolGuid;
|
|||||||
|
|
||||||
// Message Type for clock management protocol.
|
// Message Type for clock management protocol.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ScmiMessageIdClockAttributes = 0x3,
|
SCMI_MESSAGE_ID_CLOCK_ATTRIBUTES = 0x3,
|
||||||
ScmiMessageIdClockDescribeRates = 0x4,
|
SCMI_MESSAGE_ID_CLOCK_DESCRIBE_RATES = 0x4,
|
||||||
ScmiMessageIdClockRateSet = 0x5,
|
SCMI_MESSAGE_ID_CLOCK_RATE_SET = 0x5,
|
||||||
ScmiMessageIdClockRateGet = 0x6,
|
SCMI_MESSAGE_ID_CLOCK_RATE_GET = 0x6,
|
||||||
ScmiMessageIdClockConfigSet = 0x7
|
SCMI_MESSAGE_ID_CLOCK_CONFIG_SET = 0x7
|
||||||
} SCMI_MESSAGE_ID_CLOCK;
|
} SCMI_MESSAGE_ID_CLOCK;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ScmiClockRateFormatDiscrete, // Non-linear range.
|
SCMI_CLOCK_RATE_FORMAT_DISCRETE, // Non-linear range.
|
||||||
ScmiClockRateFormatLinear // Linear range.
|
SCMI_CLOCK_RATE_FORMAT_LINEAR // Linear range.
|
||||||
} SCMI_CLOCK_RATE_FORMAT;
|
} SCMI_CLOCK_RATE_FORMAT;
|
||||||
|
|
||||||
// Clock management protocol version.
|
// Clock management protocol version.
|
||||||
@@ -57,18 +57,12 @@ typedef enum {
|
|||||||
either Rate or Min/Max/Step triplet is valid.
|
either Rate or Min/Max/Step triplet is valid.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
union {
|
||||||
UINT64 Min;
|
UINT64 Min;
|
||||||
|
UINT64 Rate;
|
||||||
|
};
|
||||||
UINT64 Max;
|
UINT64 Max;
|
||||||
UINT64 Step;
|
UINT64 Step;
|
||||||
} SCMI_CLOCK_RATE_CONTINUOUS;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
UINT64 Rate;
|
|
||||||
} SCMI_CLOCK_RATE_DISCRETE;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
SCMI_CLOCK_RATE_CONTINUOUS ContinuousRate;
|
|
||||||
SCMI_CLOCK_RATE_DISCRETE DiscreteRate;
|
|
||||||
} SCMI_CLOCK_RATE;
|
} SCMI_CLOCK_RATE;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
@@ -139,10 +133,10 @@ EFI_STATUS
|
|||||||
@param[in] This A pointer to SCMI_CLOCK_PROTOCOL Instance.
|
@param[in] This A pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||||
@param[in] ClockId Identifier for the clock device.
|
@param[in] ClockId Identifier for the clock device.
|
||||||
|
|
||||||
@param[out] Format ScmiClockRateFormatDiscrete: Clock device
|
@param[out] Format SCMI_CLOCK_RATE_FORMAT_DISCRETE: Clock device
|
||||||
supports range of clock rates which are non-linear.
|
supports range of clock rates which are non-linear.
|
||||||
|
|
||||||
ScmiClockRateFormatLinear: Clock device supports
|
SCMI_CLOCK_RATE_FORMAT_LINEAR: Clock device supports
|
||||||
range of linear clock rates from Min to Max in steps.
|
range of linear clock rates from Min to Max in steps.
|
||||||
|
|
||||||
@param[out] TotalRates Total number of rates.
|
@param[out] TotalRates Total number of rates.
|
||||||
@@ -215,3 +209,4 @@ typedef struct _SCMI_CLOCK_PROTOCOL {
|
|||||||
} SCMI_CLOCK_PROTOCOL;
|
} SCMI_CLOCK_PROTOCOL;
|
||||||
|
|
||||||
#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */
|
#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user