[PATCH v3 00/17] Restructure, improve target support for qcom_scm driver
From: Elliot Berman
Date: Thu Dec 12 2019 - 13:37:02 EST
This series improves support for 32-bit Qualcomm targets on qcom_scm driver and cleans
up the driver for 64-bit implementations.
Currently, the qcom_scm driver supports only 64-bit Qualcomm targets and very
old 32-bit Qualcomm targets. Newer 32-bit targets use ARM's SMC Calling
Convention to communicate with secure world. Older 32-bit targets use a
"buffer-based" legacy approach for communicating with secure world (as
implemented in qcom_scm-32.c). All arm64 Qualcomm targets use ARM SMCCC.
Currently, SMCCC-based communication is enabled only on ARM64 config and
buffer-based communication only on ARM config. This patch-series combines SMCCC
and legacy conventions and selects the correct convention by querying the secure
We decided to take the opportunity as well to clean up the driver rather than
try to patch together qcom_scm-32 and qcom_scm-64.
Patches 1-3 and 15 improve macro names, reorder macros/functions, and prune unused
macros/functions. No functional changes were introduced.
Patches 4-8 clears up the SCM abstraction in qcom_scm-64.
Patches 9-14 clears up the SCM abstraction in qcom_scm-32.
Patches 16-17 enable dynamically using the different calling conventions.
Changes since v2:
- Addressed Stephen's comments throughout v2.
- Rebased onto latest for-next branch
- Removed v2 08/18 (firmware: qcom_scm-64: Remove qcom_scm_call_do_smccc)
- Cleaned up the convention query from v2 to align with .
Changes since v1:
- Renamed functions/variables per Vinod's suggestions
- Split v1 01/17 into v2 [01,02,03]/18 per Vinod's suggestion
- Fix suggestions by Bjorn in v1 09/18 (now v2 10/18)
- Refactor last 3 commits per Bjorn suggestions in v1 17/18 and v1 10/18
Changes since RFC:
- Fixed missing return values in qcom_scm_call_smccc
- Fixed order of arguments in qcom_scm_set_warm_boot_addr
- Adjusted logic of SMC convention to properly support older QCOM secure worlds
- Boot tested on IFC6410 based on linaro kernel tag:
debian-qcom-dragonboard410c-18.01 (which does basic verification of legacy
SCM calls: at least warm_boot_addr, cold_boot_addr, and power_down)
Elliot Berman (17):
firmware: qcom_scm: Rename macros and structures
firmware: qcom_scm: Apply consistent naming scheme to command IDs
firmware: qcom_scm: Remove unused qcom_scm_get_version
firmware: qcom_scm-64: Make SMC macros less magical
firmware: qcom_scm-64: Move svc/cmd/owner into qcom_scm_desc
firmware: qcom_scm-64: Add SCM results struct
firmware: qcom_scm-64: Move SMC register filling to
firmware: qcom_scm-64: Improve SMC convention detection
firmware: qcom_scm-32: Use SMC arch wrappers
firmware: qcom_scm-32: Add funcnum IDs
firmware: qcom_scm-32: Use qcom_scm_desc in non-atomic calls
firmware: qcom_scm-32: Move SMCCC register filling to qcom_scm_call
firmware: qcom_scm-32: Create common legacy atomic call
firmware: qcom_scm-32: Add device argument to atomic calls
firmware: qcom_scm: Order functions, definitions by service/command
firmware: qcom_scm: Remove thin wrappers
firmware: qcom_scm: Dynamically support SMCCC and legacy conventions
drivers/firmware/Kconfig | 8 -
drivers/firmware/Makefile | 5 +-
drivers/firmware/qcom_scm-32.c | 671 -----------------------------
drivers/firmware/qcom_scm-64.c | 579 -------------------------
drivers/firmware/qcom_scm-legacy.c | 242 +++++++++++
drivers/firmware/qcom_scm-smc.c | 151 +++++++
drivers/firmware/qcom_scm.c | 852 +++++++++++++++++++++++++++++--------
drivers/firmware/qcom_scm.h | 178 ++++----
include/linux/qcom_scm.h | 113 ++---
9 files changed, 1224 insertions(+), 1575 deletions(-)
delete mode 100644 drivers/firmware/qcom_scm-32.c
delete mode 100644 drivers/firmware/qcom_scm-64.c
create mode 100644 drivers/firmware/qcom_scm-legacy.c
create mode 100644 drivers/firmware/qcom_scm-smc.c
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project