mirror of
https://git.yoctoproject.org/meta-arm
synced 2026-07-19 16:57:09 +00:00
Compare commits
40 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8b82d1230d | |||
| a5d8dfa52e | |||
| dca725e0f1 | |||
| e46e5e1852 | |||
| 1a25d20717 | |||
| 401647d16c | |||
| f3ba65844a | |||
| 6b01d4ebb4 | |||
| 33b394c523 | |||
| 08a0fd35bf | |||
| 2afa936eea | |||
| f4c7e11d78 | |||
| a933940df2 | |||
| 1597b866f8 | |||
| bcdbd6438f | |||
| f791c49103 | |||
| 648571b113 | |||
| 1bef98b9ad | |||
| fbe056ca0c | |||
| a3192e564b | |||
| 536386d97d | |||
| 0078730c5e | |||
| 4dc32d9047 | |||
| 2e0c479b00 | |||
| 9a485a96d3 | |||
| 99e57b7788 | |||
| 36e43a3a21 | |||
| 98ee2bf6e1 | |||
| 1c7e0a922a | |||
| 6a3bdad1b4 | |||
| 945fb594eb | |||
| ee8d20ab2b | |||
| 0b2b50b54a | |||
| ba00c6d905 | |||
| bf99c56b9c | |||
| b35745be23 | |||
| e951b861b1 | |||
| 2ecdf7e21d | |||
| a12a605281 | |||
| fa3c9af4fc |
@@ -0,0 +1 @@
|
||||
__pycache__
|
||||
+7
-1
@@ -27,6 +27,7 @@ stages:
|
||||
- mkdir --verbose --parents $KAS_WORK_DIR $KAS_REPO_REF_DIR $SSTATE_DIR $DL_DIR $TOOLCHAIN_DIR $TOOLCHAIN_LINK_DIR
|
||||
# Must do this here, as it's the only way to make sure the toolchain is installed on the same builder
|
||||
- ./ci/get-binary-toolchains $DL_DIR $TOOLCHAIN_DIR $TOOLCHAIN_LINK_DIR
|
||||
- sudo apt update && sudo apt install telnet -y
|
||||
|
||||
# Generalised fragment to do a Kas build
|
||||
.build:
|
||||
@@ -108,9 +109,14 @@ corstone700-fvp:
|
||||
corstone700-mps3:
|
||||
extends: .build
|
||||
|
||||
fvp-base:
|
||||
corstone1000-fvp:
|
||||
extends: .build
|
||||
|
||||
fvp-base/testimage:
|
||||
extends: .build
|
||||
tags:
|
||||
- x86_64
|
||||
|
||||
fvp-base-arm32:
|
||||
extends: .build
|
||||
|
||||
|
||||
+1
-1
@@ -41,7 +41,7 @@ local_conf_header:
|
||||
BB_HASHSERVE_UPSTREAM = "typhoon.yocto.io:8687"
|
||||
BB_HASHSERVE = "auto"
|
||||
BB_SIGNATURE_HANDLER = "OEEquivHash"
|
||||
SSTATE_MIRRORS = "file://.* https://sstate.yoctoproject.org/dev/PATH;downloadfilename=PATH"
|
||||
SSTATE_MIRRORS = "file://.* http://sstate.yoctoproject.org/dev/PATH;downloadfilename=PATH"
|
||||
|
||||
machine: unset
|
||||
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ header:
|
||||
repos:
|
||||
meta-clang:
|
||||
url: https://github.com/kraj/meta-clang
|
||||
refspec: master
|
||||
refspec: honister
|
||||
|
||||
local_conf_header:
|
||||
clang: |
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
header:
|
||||
version: 9
|
||||
includes:
|
||||
- base.yml
|
||||
- meta-openembedded.yml
|
||||
|
||||
local_conf_header:
|
||||
custom-local-conf: |
|
||||
INITRAMFS_IMAGE_BUNDLE = "0"
|
||||
INITRAMFS_IMAGE:remove = "corstone1000-initramfs-image"
|
||||
|
||||
machine: corstone1000-fvp
|
||||
@@ -5,3 +5,12 @@ header:
|
||||
|
||||
machine: fvp-base
|
||||
|
||||
local_conf_header:
|
||||
testimagefvp: |
|
||||
INHERIT = "fvpboot"
|
||||
# This fails but we can't add to the ignorelist from meta-arm yet
|
||||
# https://bugzilla.yoctoproject.org/show_bug.cgi?id=14604
|
||||
TEST_SUITES:remove = "parselogs"
|
||||
# Tell testimage to connect to localhost:8022, and forward that to SSH in the FVP.
|
||||
TEST_TARGET_IP = "localhost:8022"
|
||||
FVP_CONFIG[bp.virtio_net.hostbridge.userNetPorts] ?= "8022=22"
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
header:
|
||||
version: 9
|
||||
|
||||
distro: poky-tiny
|
||||
|
||||
defaults:
|
||||
repos:
|
||||
refspec: master
|
||||
|
||||
repos:
|
||||
meta-arm:
|
||||
layers:
|
||||
meta-arm:
|
||||
meta-arm-bsp:
|
||||
meta-arm-toolchain:
|
||||
|
||||
poky:
|
||||
url: https://git.yoctoproject.org/git/poky
|
||||
refspec: honister
|
||||
layers:
|
||||
meta:
|
||||
meta-poky:
|
||||
meta-yocto-bsp:
|
||||
|
||||
meta-openembedded:
|
||||
url: https://git.openembedded.org/meta-openembedded
|
||||
refspec: f16efc00b7fcdbfa8c53e35c1fcebed5c06d975e
|
||||
layers:
|
||||
meta-oe:
|
||||
meta-python:
|
||||
|
||||
meta-arm-image:
|
||||
url: https://git.gitlab.arm.com/arm-reference-solutions/meta-arm-image.git
|
||||
refspec: main
|
||||
|
||||
local_conf_header:
|
||||
base: |
|
||||
CONF_VERSION = "2"
|
||||
PACKAGE_CLASSES = "package_ipk"
|
||||
LICENSE_FLAGS_WHITELIST += "armcompiler"
|
||||
BB_NUMBER_THREADS ?= "16"
|
||||
PARALLEL_MAKE ?= "-j16"
|
||||
INHERIT += "rm_work"
|
||||
PACKAGECONFIG:append:pn-perf = " coresight"
|
||||
|
||||
machine: unset
|
||||
|
||||
target:
|
||||
- corstone1000-image
|
||||
@@ -0,0 +1,16 @@
|
||||
header:
|
||||
version: 9
|
||||
includes:
|
||||
- corstone1000-base.yml
|
||||
|
||||
repos:
|
||||
run-scripts:
|
||||
url: https://git.gitlab.arm.com/arm-reference-solutions/model-scripts.git
|
||||
refspec: corstone1000-fvp
|
||||
layers:
|
||||
.: 'excluded'
|
||||
|
||||
machine: corstone1000-fvp
|
||||
|
||||
target:
|
||||
- corstone1000-image
|
||||
@@ -13,6 +13,7 @@ LAYERSERIES_COMPAT_meta-arm-bsp = "honister"
|
||||
|
||||
LAYERDEPENDS_meta-arm-bsp = "core meta-arm"
|
||||
# This won't be used by layerindex-fetch, but works everywhere else
|
||||
LAYERDEPENDS_meta-arm-bsp:append:corstone1000 = " meta-python"
|
||||
LAYERDEPENDS_meta-arm-bsp:append:musca-b1 = " meta-python"
|
||||
LAYERDEPENDS_meta-arm-bsp:append:musca-s1 = " meta-python"
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#@TYPE: Machine
|
||||
#@NAME: corstone1000-fvp machine
|
||||
#@DESCRIPTION: Machine configuration for Corstone1000 64-bit FVP
|
||||
|
||||
require conf/machine/include/corstone1000.inc
|
||||
|
||||
TFA_TARGET_PLATFORM = "fvp"
|
||||
|
||||
TFM_PLATFORM_IS_FVP = "TRUE"
|
||||
@@ -25,3 +25,5 @@ EXTRA_IMAGEDEPENDS += "virtual/trusted-firmware-a u-boot"
|
||||
# initialise) and install the pre-generated keys.
|
||||
PACKAGECONFIG:remove:pn-openssh = "rng-tools"
|
||||
MACHINE_EXTRA_RRECOMMENDS += "ssh-pregen-hostkeys"
|
||||
|
||||
TEST_TARGET = "OEFVPTarget"
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
require conf/machine/include/arm/armv8a/tune-cortexa35.inc
|
||||
|
||||
MACHINEOVERRIDES =. "corstone1000:"
|
||||
|
||||
# TF-A
|
||||
TFA_PLATFORM = "corstone1000"
|
||||
PREFERRED_VERSION_trusted-firmware-a ?= "2.5%"
|
||||
EXTRA_IMAGEDEPENDS += "virtual/trusted-firmware-a"
|
||||
|
||||
TFA_BL2_BINARY = "bl2-corstone1000.bin"
|
||||
TFA_FIP_BINARY = "fip-corstone1000.bin"
|
||||
|
||||
# TF-M
|
||||
PREFERRED_VERSION_trusted-firmware-m ?= "1.4%"
|
||||
TFM_PLATFORM = "arm/corstone1000"
|
||||
EXTRA_IMAGEDEPENDS += "virtual/trusted-firmware-m"
|
||||
|
||||
# TF-M settings for signing host images
|
||||
TFA_BL2_RE_IMAGE_LOAD_ADDRESS = "0x62353000"
|
||||
TFA_BL2_RE_SIGN_BIN_SIZE = "0x2d000"
|
||||
TFA_FIP_RE_IMAGE_LOAD_ADDRESS = "0x68130000"
|
||||
TFA_FIP_RE_SIGN_BIN_SIZE = "0x00200000"
|
||||
RE_LAYOUT_WRAPPER_VERSION = "0.0.7"
|
||||
TFM_SIGN_PRIVATE_KEY = "${S}/bl2/ext/mcuboot/root-RSA-3072_1.pem"
|
||||
RE_IMAGE_OFFSET = "0x1000"
|
||||
|
||||
# u-boot
|
||||
PREFERRED_VERSION_u-boot ?= "2021.07"
|
||||
EXTRA_IMAGEDEPENDS += "u-boot"
|
||||
|
||||
UBOOT_CONFIG ??= "EFI"
|
||||
UBOOT_CONFIG[EFI] = "corstone1000_defconfig"
|
||||
UBOOT_ENTRYPOINT = "0x80000000"
|
||||
UBOOT_LOADADDRESS = "0x80000000"
|
||||
UBOOT_BOOTARGS = "earlycon=pl011,0x1a510000 console=ttyAMA0 loglevel=9"
|
||||
UBOOT_ARCH = "arm"
|
||||
UBOOT_EXTLINUX = "0"
|
||||
|
||||
# optee
|
||||
EXTRA_IMAGEDEPENDS += "optee-os"
|
||||
OPTEE_ARCH = "arm64"
|
||||
OPTEE_BINARY = "tee-pager_v2.bin"
|
||||
|
||||
# Linux kernel
|
||||
PREFERRED_PROVIDER_virtual/kernel:forcevariable = "linux-yocto"
|
||||
PREFERRED_VERSION_linux-yocto = "5.10%"
|
||||
KERNEL_IMAGETYPE = "Image"
|
||||
|
||||
INITRAMFS_IMAGE_BUNDLE ?= "1"
|
||||
|
||||
#telling the build system which image is responsible of the generation of the initramfs rootfs
|
||||
INITRAMFS_IMAGE = "corstone1000-initramfs-image"
|
||||
|
||||
# enable this feature for kernel debugging
|
||||
# MACHINE_FEATURES += "corstone1000_kernel_debug"
|
||||
|
||||
# login terminal serial port settings
|
||||
SERIAL_CONSOLES ?= "115200;ttyAMA0"
|
||||
|
||||
# making sure EXTRA_IMAGEDEPENDS will be used while creating the image
|
||||
WKS_FILE_DEPENDS:append = " ${EXTRA_IMAGEDEPENDS}"
|
||||
|
||||
WKS_FILE ?= "corstone1000-image.corstone1000.wks"
|
||||
@@ -25,4 +25,4 @@ ZEPHYR_BOARD = "v2m_musca_b1"
|
||||
ZEPHYR_INHERIT_CLASSES += "zephyr-qemuboot"
|
||||
ARCH:musca-b1 = "arm"
|
||||
|
||||
TFM_PLATFORM = "musca_b1/sse_200"
|
||||
TFM_PLATFORM = "arm/musca_b1/sse_200"
|
||||
|
||||
@@ -9,4 +9,4 @@ require conf/machine/include/arm/armv8-m/tune-cortexm33.inc
|
||||
# GLIBC will not work with Cortex-M.
|
||||
TCLIBC = "newlib"
|
||||
|
||||
TFM_PLATFORM = "musca_s1"
|
||||
TFM_PLATFORM = "arm/musca_s1"
|
||||
|
||||
@@ -32,7 +32,6 @@ EXTRA_IMAGEDEPENDS += "virtual/control-processor-firmware"
|
||||
|
||||
#UEFI EDK2 firmware
|
||||
EXTRA_IMAGEDEPENDS += "virtual/uefi-firmware"
|
||||
PREFERRED_VERSION_edk2-firmware ?= "202102%"
|
||||
|
||||
#grub-efi
|
||||
EFI_PROVIDER ?= "grub-efi"
|
||||
|
||||
+587
@@ -0,0 +1,587 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From b4d59c85d1045998275cd219efe5849803c2c616 Mon Sep 17 00:00:00 2001
|
||||
From: "Arpita S.K" <Arpita.S.K@arm.com>
|
||||
Date: Wed, 13 Oct 2021 18:05:11 +0530
|
||||
Subject: [PATCH] Rename Diphda to corstone1000
|
||||
|
||||
Replace all the instances of Diphda as functions,
|
||||
macros etc. with corstone1000
|
||||
|
||||
Signed-off-by: Arpita S.K <Arpita.S.K@arm.com>
|
||||
---
|
||||
docs/about/maintainers.rst | 2 +-
|
||||
.../arm/{diphda => corstone1000}/index.rst | 6 +-
|
||||
docs/plat/arm/index.rst | 2 +-
|
||||
plat/arm/board/common/rotpk/arm_dev_rotpk.S | 2 +-
|
||||
.../corstone1000_bl2_mem_params_desc.c} | 8 +-
|
||||
.../common/corstone1000_err.c} | 2 +-
|
||||
.../common/corstone1000_helpers.S} | 4 +-
|
||||
.../common/corstone1000_plat.c} | 6 +-
|
||||
.../common/corstone1000_pm.c} | 0
|
||||
.../common/corstone1000_security.c} | 0
|
||||
.../common/corstone1000_stack_protector.c} | 0
|
||||
.../common/corstone1000_topology.c} | 12 +--
|
||||
.../common/corstone1000_trusted_boot.c} | 2 +-
|
||||
.../fdts/corstone1000_spmc_manifest.dts} | 0
|
||||
.../common/include/platform_def.h | 52 ++++++------
|
||||
.../include/plat_macros.S | 0
|
||||
plat/arm/board/corstone1000/platform.mk | 83 +++++++++++++++++++
|
||||
plat/arm/board/diphda/platform.mk | 83 -------------------
|
||||
18 files changed, 132 insertions(+), 132 deletions(-)
|
||||
rename docs/plat/arm/{diphda => corstone1000}/index.rst (93%)
|
||||
rename plat/arm/board/{diphda/common/diphda_bl2_mem_params_desc.c => corstone1000/common/corstone1000_bl2_mem_params_desc.c} (92%)
|
||||
rename plat/arm/board/{diphda/common/diphda_err.c => corstone1000/common/corstone1000_err.c} (89%)
|
||||
rename plat/arm/board/{diphda/common/diphda_helpers.S => corstone1000/common/corstone1000_helpers.S} (94%)
|
||||
rename plat/arm/board/{diphda/common/diphda_plat.c => corstone1000/common/corstone1000_plat.c} (92%)
|
||||
rename plat/arm/board/{diphda/common/diphda_pm.c => corstone1000/common/corstone1000_pm.c} (100%)
|
||||
rename plat/arm/board/{diphda/common/diphda_security.c => corstone1000/common/corstone1000_security.c} (100%)
|
||||
rename plat/arm/board/{diphda/common/diphda_stack_protector.c => corstone1000/common/corstone1000_stack_protector.c} (100%)
|
||||
rename plat/arm/board/{diphda/common/diphda_topology.c => corstone1000/common/corstone1000_topology.c} (77%)
|
||||
rename plat/arm/board/{diphda/common/diphda_trusted_boot.c => corstone1000/common/corstone1000_trusted_boot.c} (97%)
|
||||
rename plat/arm/board/{diphda/common/fdts/diphda_spmc_manifest.dts => corstone1000/common/fdts/corstone1000_spmc_manifest.dts} (100%)
|
||||
rename plat/arm/board/{diphda => corstone1000}/common/include/platform_def.h (89%)
|
||||
rename plat/arm/board/{diphda => corstone1000}/include/plat_macros.S (100%)
|
||||
create mode 100644 plat/arm/board/corstone1000/platform.mk
|
||||
delete mode 100644 plat/arm/board/diphda/platform.mk
|
||||
|
||||
diff --git a/docs/about/maintainers.rst b/docs/about/maintainers.rst
|
||||
index 07f258c774..2d9eb1440d 100644
|
||||
--- a/docs/about/maintainers.rst
|
||||
+++ b/docs/about/maintainers.rst
|
||||
@@ -399,7 +399,7 @@ Arm Rich IoT Platform ports
|
||||
:|G|: `vishnu-banavath`_
|
||||
:|F|: plat/arm/board/corstone700
|
||||
:|F|: plat/arm/board/a5ds
|
||||
-:|F|: plat/arm/board/diphda
|
||||
+:|F|: plat/arm/board/corstone1000
|
||||
|
||||
Arm Reference Design platform ports
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
diff --git a/docs/plat/arm/diphda/index.rst b/docs/plat/arm/corstone1000/index.rst
|
||||
similarity index 93%
|
||||
rename from docs/plat/arm/diphda/index.rst
|
||||
rename to docs/plat/arm/corstone1000/index.rst
|
||||
index 27afda43f5..b889b7f2e9 100644
|
||||
--- a/docs/plat/arm/diphda/index.rst
|
||||
+++ b/docs/plat/arm/corstone1000/index.rst
|
||||
@@ -1,7 +1,7 @@
|
||||
-Diphda Platform
|
||||
+Corstone1000 Platform
|
||||
==========================
|
||||
|
||||
-Some of the features of the Diphda platform referenced in TF-A include:
|
||||
+Some of the features of the Corstone1000 platform referenced in TF-A include:
|
||||
|
||||
- Cortex-A35 application processor (64-bit mode)
|
||||
- Secure Enclave
|
||||
@@ -37,7 +37,7 @@ Build Procedure (TF-A only)
|
||||
CC=aarch64-none-elf-gcc \
|
||||
V=1 \
|
||||
BUILD_BASE=<path to the build folder> \
|
||||
- PLAT=diphda \
|
||||
+ PLAT=corstone1000 \
|
||||
SPD=spmd \
|
||||
SPMD_SPM_AT_SEL2=0 \
|
||||
DEBUG=1 \
|
||||
diff --git a/docs/plat/arm/index.rst b/docs/plat/arm/index.rst
|
||||
index c834f6ae70..23c561ff57 100644
|
||||
--- a/docs/plat/arm/index.rst
|
||||
+++ b/docs/plat/arm/index.rst
|
||||
@@ -12,7 +12,7 @@ Arm Development Platforms
|
||||
arm_fpga/index
|
||||
arm-build-options
|
||||
morello/index
|
||||
- diphda/index
|
||||
+ corstone1000/index
|
||||
|
||||
This chapter holds documentation related to Arm's development platforms,
|
||||
including both software models (FVPs) and hardware development boards
|
||||
diff --git a/plat/arm/board/common/rotpk/arm_dev_rotpk.S b/plat/arm/board/common/rotpk/arm_dev_rotpk.S
|
||||
index 38f91fe5f8..125ddf67c7 100644
|
||||
--- a/plat/arm/board/common/rotpk/arm_dev_rotpk.S
|
||||
+++ b/plat/arm/board/common/rotpk/arm_dev_rotpk.S
|
||||
@@ -4,7 +4,7 @@
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
-/* diphda platform provides custom values for the macros defined in
|
||||
+/* corstone1000 platform provides custom values for the macros defined in
|
||||
* arm_def.h , so only platform_def.h needs to be included
|
||||
*/
|
||||
#if !defined(TARGET_PLATFORM_FVP) && !defined(TARGET_PLATFORM_FPGA)
|
||||
diff --git a/plat/arm/board/diphda/common/diphda_bl2_mem_params_desc.c b/plat/arm/board/corstone1000/common/corstone1000_bl2_mem_params_desc.c
|
||||
similarity index 92%
|
||||
rename from plat/arm/board/diphda/common/diphda_bl2_mem_params_desc.c
|
||||
rename to plat/arm/board/corstone1000/common/corstone1000_bl2_mem_params_desc.c
|
||||
index 916c868d21..7baa82d31b 100644
|
||||
--- a/plat/arm/board/diphda/common/diphda_bl2_mem_params_desc.c
|
||||
+++ b/plat/arm/board/corstone1000/common/corstone1000_bl2_mem_params_desc.c
|
||||
@@ -44,7 +44,7 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = {
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
|
||||
VERSION_2, entry_point_info_t, SECURE | EXECUTABLE),
|
||||
.ep_info.pc = BL32_BASE,
|
||||
- .ep_info.args.arg0 = DIPHDA_TOS_FW_CONFIG_BASE,
|
||||
+ .ep_info.args.arg0 = CORSTONE1000_TOS_FW_CONFIG_BASE,
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
|
||||
VERSION_2, image_info_t, 0),
|
||||
.image_info.image_base = BL32_BASE,
|
||||
@@ -56,9 +56,9 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = {
|
||||
/* Fill TOS_FW_CONFIG related information */
|
||||
{
|
||||
.image_id = TOS_FW_CONFIG_ID,
|
||||
- .image_info.image_base = DIPHDA_TOS_FW_CONFIG_BASE,
|
||||
- .image_info.image_max_size = DIPHDA_TOS_FW_CONFIG_LIMIT - \
|
||||
- DIPHDA_TOS_FW_CONFIG_BASE,
|
||||
+ .image_info.image_base = CORSTONE1000_TOS_FW_CONFIG_BASE,
|
||||
+ .image_info.image_max_size = CORSTONE1000_TOS_FW_CONFIG_LIMIT - \
|
||||
+ CORSTONE1000_TOS_FW_CONFIG_BASE,
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_IMAGE_BINARY,
|
||||
VERSION_2, entry_point_info_t, SECURE | NON_EXECUTABLE),
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY,
|
||||
diff --git a/plat/arm/board/diphda/common/diphda_err.c b/plat/arm/board/corstone1000/common/corstone1000_err.c
|
||||
similarity index 89%
|
||||
rename from plat/arm/board/diphda/common/diphda_err.c
|
||||
rename to plat/arm/board/corstone1000/common/corstone1000_err.c
|
||||
index 89a3b8249c..5f8e7da437 100644
|
||||
--- a/plat/arm/board/diphda/common/diphda_err.c
|
||||
+++ b/plat/arm/board/corstone1000/common/corstone1000_err.c
|
||||
@@ -7,7 +7,7 @@
|
||||
#include <plat/arm/common/plat_arm.h>
|
||||
|
||||
/*
|
||||
- * diphda error handler
|
||||
+ * corstone1000 error handler
|
||||
*/
|
||||
void __dead2 plat_arm_error_handler(int err)
|
||||
{
|
||||
diff --git a/plat/arm/board/diphda/common/diphda_helpers.S b/plat/arm/board/corstone1000/common/corstone1000_helpers.S
|
||||
similarity index 94%
|
||||
rename from plat/arm/board/diphda/common/diphda_helpers.S
|
||||
rename to plat/arm/board/corstone1000/common/corstone1000_helpers.S
|
||||
index c9d2a88de9..87122270b0 100644
|
||||
--- a/plat/arm/board/diphda/common/diphda_helpers.S
|
||||
+++ b/plat/arm/board/corstone1000/common/corstone1000_helpers.S
|
||||
@@ -29,7 +29,7 @@ endfunc plat_secondary_cold_boot_setup
|
||||
* unsigned long plat_get_my_entrypoint (void);
|
||||
*
|
||||
* Main job of this routine is to distinguish between a cold and warm
|
||||
- * boot. On diphda, this information can be queried from the power
|
||||
+ * boot. On corstone1000, this information can be queried from the power
|
||||
* controller. The Power Control SYS Status Register (PSYSR) indicates
|
||||
* the wake-up reason for the CPU.
|
||||
*
|
||||
@@ -61,7 +61,7 @@ func plat_is_my_cpu_primary
|
||||
mrs x0, mpidr_el1
|
||||
mov_imm x1, MPIDR_AFFINITY_MASK
|
||||
and x0, x0, x1
|
||||
- cmp x0, #DIPHDA_PRIMARY_CPU
|
||||
+ cmp x0, #CORSTONE1000_PRIMARY_CPU
|
||||
cset w0, eq
|
||||
ret
|
||||
endfunc plat_is_my_cpu_primary
|
||||
diff --git a/plat/arm/board/diphda/common/diphda_plat.c b/plat/arm/board/corstone1000/common/corstone1000_plat.c
|
||||
similarity index 92%
|
||||
rename from plat/arm/board/diphda/common/diphda_plat.c
|
||||
rename to plat/arm/board/corstone1000/common/corstone1000_plat.c
|
||||
index 28d15a59e6..7a38b0b2ee 100644
|
||||
--- a/plat/arm/board/diphda/common/diphda_plat.c
|
||||
+++ b/plat/arm/board/corstone1000/common/corstone1000_plat.c
|
||||
@@ -21,12 +21,12 @@ const mmap_region_t plat_arm_mmap[] = {
|
||||
ARM_MAP_SHARED_RAM,
|
||||
ARM_MAP_NS_SHARED_RAM,
|
||||
ARM_MAP_NS_DRAM1,
|
||||
- DIPHDA_MAP_DEVICE,
|
||||
- DIPHDA_EXTERNAL_FLASH,
|
||||
+ CORSTONE1000_MAP_DEVICE,
|
||||
+ CORSTONE1000_EXTERNAL_FLASH,
|
||||
{0}
|
||||
};
|
||||
|
||||
-/* diphda only has one always-on power domain and there
|
||||
+/* corstone1000 only has one always-on power domain and there
|
||||
* is no power control present
|
||||
*/
|
||||
void __init plat_arm_pwrc_setup(void)
|
||||
diff --git a/plat/arm/board/diphda/common/diphda_pm.c b/plat/arm/board/corstone1000/common/corstone1000_pm.c
|
||||
similarity index 100%
|
||||
rename from plat/arm/board/diphda/common/diphda_pm.c
|
||||
rename to plat/arm/board/corstone1000/common/corstone1000_pm.c
|
||||
diff --git a/plat/arm/board/diphda/common/diphda_security.c b/plat/arm/board/corstone1000/common/corstone1000_security.c
|
||||
similarity index 100%
|
||||
rename from plat/arm/board/diphda/common/diphda_security.c
|
||||
rename to plat/arm/board/corstone1000/common/corstone1000_security.c
|
||||
diff --git a/plat/arm/board/diphda/common/diphda_stack_protector.c b/plat/arm/board/corstone1000/common/corstone1000_stack_protector.c
|
||||
similarity index 100%
|
||||
rename from plat/arm/board/diphda/common/diphda_stack_protector.c
|
||||
rename to plat/arm/board/corstone1000/common/corstone1000_stack_protector.c
|
||||
diff --git a/plat/arm/board/diphda/common/diphda_topology.c b/plat/arm/board/corstone1000/common/corstone1000_topology.c
|
||||
similarity index 77%
|
||||
rename from plat/arm/board/diphda/common/diphda_topology.c
|
||||
rename to plat/arm/board/corstone1000/common/corstone1000_topology.c
|
||||
index 9dfd05d091..2a3b6913a1 100644
|
||||
--- a/plat/arm/board/diphda/common/diphda_topology.c
|
||||
+++ b/plat/arm/board/corstone1000/common/corstone1000_topology.c
|
||||
@@ -7,8 +7,8 @@
|
||||
#include <plat/arm/common/plat_arm.h>
|
||||
#include <plat/common/platform.h>
|
||||
|
||||
-/* The diphda power domain tree descriptor */
|
||||
-static unsigned char diphda_power_domain_tree_desc[PLAT_ARM_CLUSTER_COUNT
|
||||
+/* The corstone1000 power domain tree descriptor */
|
||||
+static unsigned char corstone1000_power_domain_tree_desc[PLAT_ARM_CLUSTER_COUNT
|
||||
+ 2];
|
||||
/*******************************************************************************
|
||||
* This function dynamically constructs the topology according to
|
||||
@@ -22,13 +22,13 @@ const unsigned char *plat_get_power_domain_tree_desc(void)
|
||||
* The highest level is the system level. The next level is constituted
|
||||
* by clusters and then cores in clusters.
|
||||
*/
|
||||
- diphda_power_domain_tree_desc[0] = 1;
|
||||
- diphda_power_domain_tree_desc[1] = PLAT_ARM_CLUSTER_COUNT;
|
||||
+ corstone1000_power_domain_tree_desc[0] = 1;
|
||||
+ corstone1000_power_domain_tree_desc[1] = PLAT_ARM_CLUSTER_COUNT;
|
||||
|
||||
for (i = 0; i < PLAT_ARM_CLUSTER_COUNT; i++)
|
||||
- diphda_power_domain_tree_desc[i + 2] = PLATFORM_CORE_COUNT;
|
||||
+ corstone1000_power_domain_tree_desc[i + 2] = PLATFORM_CORE_COUNT;
|
||||
|
||||
- return diphda_power_domain_tree_desc;
|
||||
+ return corstone1000_power_domain_tree_desc;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
diff --git a/plat/arm/board/diphda/common/diphda_trusted_boot.c b/plat/arm/board/corstone1000/common/corstone1000_trusted_boot.c
|
||||
similarity index 97%
|
||||
rename from plat/arm/board/diphda/common/diphda_trusted_boot.c
|
||||
rename to plat/arm/board/corstone1000/common/corstone1000_trusted_boot.c
|
||||
index ddb41faa6b..2e2e9475a5 100644
|
||||
--- a/plat/arm/board/diphda/common/diphda_trusted_boot.c
|
||||
+++ b/plat/arm/board/corstone1000/common/corstone1000_trusted_boot.c
|
||||
@@ -38,7 +38,7 @@ int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len,
|
||||
*/
|
||||
int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr)
|
||||
{
|
||||
- *nv_ctr = DIPHDA_FW_NVCTR_VAL;
|
||||
+ *nv_ctr = CORSTONE1000_FW_NVCTR_VAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/plat/arm/board/diphda/common/fdts/diphda_spmc_manifest.dts b/plat/arm/board/corstone1000/common/fdts/corstone1000_spmc_manifest.dts
|
||||
similarity index 100%
|
||||
rename from plat/arm/board/diphda/common/fdts/diphda_spmc_manifest.dts
|
||||
rename to plat/arm/board/corstone1000/common/fdts/corstone1000_spmc_manifest.dts
|
||||
diff --git a/plat/arm/board/diphda/common/include/platform_def.h b/plat/arm/board/corstone1000/common/include/platform_def.h
|
||||
similarity index 89%
|
||||
rename from plat/arm/board/diphda/common/include/platform_def.h
|
||||
rename to plat/arm/board/corstone1000/common/include/platform_def.h
|
||||
index 37fd71b6aa..e36bb626ee 100644
|
||||
--- a/plat/arm/board/diphda/common/include/platform_def.h
|
||||
+++ b/plat/arm/board/corstone1000/common/include/platform_def.h
|
||||
@@ -34,17 +34,17 @@
|
||||
#define V2M_IOFPGA_UART0_CLK_IN_HZ 50000000
|
||||
#define V2M_IOFPGA_UART1_CLK_IN_HZ 50000000
|
||||
|
||||
-/* Core/Cluster/Thread counts for diphda */
|
||||
-#define DIPHDA_CLUSTER_COUNT U(1)
|
||||
-#define DIPHDA_MAX_CPUS_PER_CLUSTER U(4)
|
||||
-#define DIPHDA_MAX_PE_PER_CPU U(1)
|
||||
-#define DIPHDA_PRIMARY_CPU U(0)
|
||||
+/* Core/Cluster/Thread counts for corstone1000 */
|
||||
+#define CORSTONE1000_CLUSTER_COUNT U(1)
|
||||
+#define CORSTONE1000_MAX_CPUS_PER_CLUSTER U(4)
|
||||
+#define CORSTONE1000_MAX_PE_PER_CPU U(1)
|
||||
+#define CORSTONE1000_PRIMARY_CPU U(0)
|
||||
|
||||
-#define PLAT_ARM_CLUSTER_COUNT DIPHDA_CLUSTER_COUNT
|
||||
+#define PLAT_ARM_CLUSTER_COUNT CORSTONE1000_CLUSTER_COUNT
|
||||
|
||||
#define PLATFORM_CORE_COUNT (PLAT_ARM_CLUSTER_COUNT * \
|
||||
- DIPHDA_MAX_CPUS_PER_CLUSTER * \
|
||||
- DIPHDA_MAX_PE_PER_CPU)
|
||||
+ CORSTONE1000_MAX_CPUS_PER_CLUSTER * \
|
||||
+ CORSTONE1000_MAX_PE_PER_CPU)
|
||||
|
||||
/* UART related constants */
|
||||
#define PLAT_ARM_BOOT_UART_BASE 0x1a510000
|
||||
@@ -85,7 +85,7 @@
|
||||
*
|
||||
* BL32 (optee-os)
|
||||
*
|
||||
- * <DIPHDA_TOS_FW_CONFIG_BASE> = 0x20ae000
|
||||
+ * <CORSTONE1000_TOS_FW_CONFIG_BASE> = 0x20ae000
|
||||
*
|
||||
* partition size: 8 KB
|
||||
*
|
||||
@@ -132,7 +132,7 @@
|
||||
#define ARM_DRAM1_END (ARM_DRAM1_BASE + \
|
||||
ARM_DRAM1_SIZE - 1)
|
||||
|
||||
-/* DRAM1 and DRAM2 are the same for diphda */
|
||||
+/* DRAM1 and DRAM2 are the same for corstone1000 */
|
||||
#define ARM_DRAM2_BASE ARM_DRAM1_BASE
|
||||
#define ARM_DRAM2_SIZE ARM_DRAM1_SIZE
|
||||
#define ARM_DRAM2_END ARM_DRAM1_END
|
||||
@@ -173,13 +173,13 @@
|
||||
PLAT_ARM_MAX_BL31_SIZE)
|
||||
#define BL31_LIMIT BL2_SIGNATURE_BASE
|
||||
|
||||
-#define DIPHDA_TOS_FW_CONFIG_BASE (BL31_BASE - \
|
||||
- DIPHDA_TOS_FW_CONFIG_SIZE)
|
||||
-#define DIPHDA_TOS_FW_CONFIG_SIZE UL(0x00002000) /* 8 KB */
|
||||
-#define DIPHDA_TOS_FW_CONFIG_LIMIT BL31_BASE
|
||||
+#define CORSTONE1000_TOS_FW_CONFIG_BASE (BL31_BASE - \
|
||||
+ CORSTONE1000_TOS_FW_CONFIG_SIZE)
|
||||
+#define CORSTONE1000_TOS_FW_CONFIG_SIZE UL(0x00002000) /* 8 KB */
|
||||
+#define CORSTONE1000_TOS_FW_CONFIG_LIMIT BL31_BASE
|
||||
|
||||
#define BL32_BASE ARM_BL_RAM_BASE
|
||||
-#define PLAT_ARM_MAX_BL32_SIZE (DIPHDA_TOS_FW_CONFIG_BASE - \
|
||||
+#define PLAT_ARM_MAX_BL32_SIZE (CORSTONE1000_TOS_FW_CONFIG_BASE - \
|
||||
BL32_BASE) /* 688 KB */
|
||||
#define BL32_LIMIT (BL32_BASE + \
|
||||
PLAT_ARM_MAX_BL32_SIZE)
|
||||
@@ -220,7 +220,7 @@
|
||||
/*
|
||||
* Define FW_CONFIG area base and limit. Leave enough space for BL2 meminfo.
|
||||
* FW_CONFIG is intended to host the device tree. Currently, This area is not
|
||||
- * used because diphda platform doesn't use a device tree at TF-A level.
|
||||
+ * used because corstone1000 platform doesn't use a device tree at TF-A level.
|
||||
*/
|
||||
#define ARM_FW_CONFIG_BASE (ARM_SHARED_RAM_BASE \
|
||||
+ sizeof(meminfo_t))
|
||||
@@ -261,8 +261,8 @@
|
||||
|
||||
#define SYS_COUNTER_FREQ_IN_TICKS UL(50000000) /* 50MHz */
|
||||
|
||||
-#define DIPHDA_IRQ_TZ_WDOG 32
|
||||
-#define DIPHDA_IRQ_SEC_SYS_TIMER 34
|
||||
+#define CORSTONE1000_IRQ_TZ_WDOG 32
|
||||
+#define CORSTONE1000_IRQ_SEC_SYS_TIMER 34
|
||||
|
||||
#define PLAT_MAX_PWR_LVL 2
|
||||
/*
|
||||
@@ -308,7 +308,7 @@
|
||||
|
||||
#define PLATFORM_STACK_SIZE UL(0x440)
|
||||
|
||||
-#define DIPHDA_EXTERNAL_FLASH MAP_REGION_FLAT( \
|
||||
+#define CORSTONE1000_EXTERNAL_FLASH MAP_REGION_FLAT( \
|
||||
PLAT_ARM_NVM_BASE, \
|
||||
PLAT_ARM_NVM_SIZE, \
|
||||
MT_DEVICE | MT_RO | MT_SECURE)
|
||||
@@ -356,11 +356,11 @@
|
||||
ARM_FW_CONFIG_BASE), \
|
||||
MT_MEMORY | MT_RW | MT_SECURE)
|
||||
|
||||
-#define DIPHDA_DEVICE_BASE (0x1A000000)
|
||||
-#define DIPHDA_DEVICE_SIZE (0x26000000)
|
||||
-#define DIPHDA_MAP_DEVICE MAP_REGION_FLAT( \
|
||||
- DIPHDA_DEVICE_BASE, \
|
||||
- DIPHDA_DEVICE_SIZE, \
|
||||
+#define CORSTONE1000_DEVICE_BASE (0x1A000000)
|
||||
+#define CORSTONE1000_DEVICE_SIZE (0x26000000)
|
||||
+#define CORSTONE1000_MAP_DEVICE MAP_REGION_FLAT( \
|
||||
+ CORSTONE1000_DEVICE_BASE, \
|
||||
+ CORSTONE1000_DEVICE_SIZE, \
|
||||
MT_DEVICE | MT_RW | MT_SECURE)
|
||||
|
||||
#define ARM_IRQ_SEC_PHY_TIMER 29
|
||||
@@ -406,9 +406,9 @@
|
||||
*/
|
||||
#define PLAT_ARM_G1S_IRQ_PROPS(grp) \
|
||||
ARM_G1S_IRQ_PROPS(grp), \
|
||||
- INTR_PROP_DESC(DIPHDA_IRQ_TZ_WDOG, GIC_HIGHEST_SEC_PRIORITY, \
|
||||
+ INTR_PROP_DESC(CORSTONE1000_IRQ_TZ_WDOG, GIC_HIGHEST_SEC_PRIORITY, \
|
||||
(grp), GIC_INTR_CFG_LEVEL), \
|
||||
- INTR_PROP_DESC(DIPHDA_IRQ_SEC_SYS_TIMER, \
|
||||
+ INTR_PROP_DESC(CORSTONE1000_IRQ_SEC_SYS_TIMER, \
|
||||
GIC_HIGHEST_SEC_PRIORITY, (grp), GIC_INTR_CFG_LEVEL)
|
||||
|
||||
#define PLAT_ARM_G0_IRQ_PROPS(grp) ARM_G0_IRQ_PROPS(grp)
|
||||
diff --git a/plat/arm/board/diphda/include/plat_macros.S b/plat/arm/board/corstone1000/include/plat_macros.S
|
||||
similarity index 100%
|
||||
rename from plat/arm/board/diphda/include/plat_macros.S
|
||||
rename to plat/arm/board/corstone1000/include/plat_macros.S
|
||||
diff --git a/plat/arm/board/corstone1000/platform.mk b/plat/arm/board/corstone1000/platform.mk
|
||||
new file mode 100644
|
||||
index 0000000000..93e2ea0826
|
||||
--- /dev/null
|
||||
+++ b/plat/arm/board/corstone1000/platform.mk
|
||||
@@ -0,0 +1,83 @@
|
||||
+#
|
||||
+# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
|
||||
+#
|
||||
+# SPDX-License-Identifier: BSD-3-Clause
|
||||
+#
|
||||
+
|
||||
+# Making sure the corstone1000 platform type is specified
|
||||
+ifeq ($(filter ${TARGET_PLATFORM}, fpga fvp),)
|
||||
+ $(error TARGET_PLATFORM must be fpga or fvp)
|
||||
+endif
|
||||
+
|
||||
+CORSTONE1000_CPU_LIBS +=lib/cpus/aarch64/cortex_a35.S
|
||||
+
|
||||
+PLAT_INCLUDES := -Iplat/arm/board/corstone1000/common/include \
|
||||
+ -Iplat/arm/board/corstone1000/include \
|
||||
+ -Iinclude/plat/arm/common \
|
||||
+ -Iinclude/plat/arm/css/common/aarch64
|
||||
+
|
||||
+
|
||||
+CORSTONE1000_FW_NVCTR_VAL := 255
|
||||
+TFW_NVCTR_VAL := ${CORSTONE1000_FW_NVCTR_VAL}
|
||||
+NTFW_NVCTR_VAL := ${CORSTONE1000_FW_NVCTR_VAL}
|
||||
+
|
||||
+override NEED_BL1 := no
|
||||
+
|
||||
+override NEED_BL2 := yes
|
||||
+FIP_BL2_ARGS := tb-fw
|
||||
+
|
||||
+override NEED_BL2U := no
|
||||
+override NEED_BL31 := yes
|
||||
+NEED_BL32 := yes
|
||||
+override NEED_BL33 := yes
|
||||
+
|
||||
+# Include GICv2 driver files
|
||||
+include drivers/arm/gic/v2/gicv2.mk
|
||||
+
|
||||
+CORSTONE1000_GIC_SOURCES := ${GICV2_SOURCES} \
|
||||
+ plat/common/plat_gicv2.c \
|
||||
+ plat/arm/common/arm_gicv2.c
|
||||
+
|
||||
+
|
||||
+BL2_SOURCES += plat/arm/board/corstone1000/common/corstone1000_security.c \
|
||||
+ plat/arm/board/corstone1000/common/corstone1000_err.c \
|
||||
+ plat/arm/board/corstone1000/common/corstone1000_trusted_boot.c \
|
||||
+ lib/utils/mem_region.c \
|
||||
+ plat/arm/board/corstone1000/common/corstone1000_helpers.S \
|
||||
+ plat/arm/board/corstone1000/common/corstone1000_plat.c \
|
||||
+ plat/arm/board/corstone1000/common/corstone1000_bl2_mem_params_desc.c \
|
||||
+ ${CORSTONE1000_CPU_LIBS} \
|
||||
+
|
||||
+
|
||||
+BL31_SOURCES += drivers/cfi/v2m/v2m_flash.c \
|
||||
+ lib/utils/mem_region.c \
|
||||
+ plat/arm/board/corstone1000/common/corstone1000_helpers.S \
|
||||
+ plat/arm/board/corstone1000/common/corstone1000_topology.c \
|
||||
+ plat/arm/board/corstone1000/common/corstone1000_security.c \
|
||||
+ plat/arm/board/corstone1000/common/corstone1000_plat.c \
|
||||
+ plat/arm/board/corstone1000/common/corstone1000_pm.c \
|
||||
+ ${CORSTONE1000_CPU_LIBS} \
|
||||
+ ${CORSTONE1000_GIC_SOURCES}
|
||||
+
|
||||
+ifneq (${ENABLE_STACK_PROTECTOR},0)
|
||||
+ ifneq (${ENABLE_STACK_PROTECTOR},none)
|
||||
+ CORSTONE1000_SECURITY_SOURCES := plat/arm/board/corstone1000/common/corstone1000_stack_protector.c
|
||||
+ BL2_SOURCES += ${CORSTONE1000_SECURITY_SOURCES}
|
||||
+ BL31_SOURCES += ${CORSTONE1000_SECURITY_SOURCES}
|
||||
+ endif
|
||||
+endif
|
||||
+
|
||||
+FDT_SOURCES += plat/arm/board/corstone1000/common/fdts/corstone1000_spmc_manifest.dts
|
||||
+CORSTONE1000_TOS_FW_CONFIG := ${BUILD_PLAT}/fdts/corstone1000_spmc_manifest.dtb
|
||||
+
|
||||
+# Add the SPMC manifest to FIP and specify the same to certtool
|
||||
+$(eval $(call TOOL_ADD_PAYLOAD,${CORSTONE1000_TOS_FW_CONFIG},--tos-fw-config,${CORSTONE1000_TOS_FW_CONFIG}))
|
||||
+
|
||||
+# Adding TARGET_PLATFORM as a GCC define (-D option)
|
||||
+$(eval $(call add_define,TARGET_PLATFORM_$(call uppercase,${TARGET_PLATFORM})))
|
||||
+
|
||||
+# Adding CORSTONE1000_FW_NVCTR_VAL as a GCC define (-D option)
|
||||
+$(eval $(call add_define,CORSTONE1000_FW_NVCTR_VAL))
|
||||
+
|
||||
+include plat/arm/common/arm_common.mk
|
||||
+include plat/arm/board/common/board_common.mk
|
||||
diff --git a/plat/arm/board/diphda/platform.mk b/plat/arm/board/diphda/platform.mk
|
||||
deleted file mode 100644
|
||||
index 8b89cee7ed..0000000000
|
||||
--- a/plat/arm/board/diphda/platform.mk
|
||||
+++ /dev/null
|
||||
@@ -1,83 +0,0 @@
|
||||
-#
|
||||
-# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
|
||||
-#
|
||||
-# SPDX-License-Identifier: BSD-3-Clause
|
||||
-#
|
||||
-
|
||||
-# Making sure the diphda platform type is specified
|
||||
-ifeq ($(filter ${TARGET_PLATFORM}, fpga fvp),)
|
||||
- $(error TARGET_PLATFORM must be fpga or fvp)
|
||||
-endif
|
||||
-
|
||||
-DIPHDA_CPU_LIBS +=lib/cpus/aarch64/cortex_a35.S
|
||||
-
|
||||
-PLAT_INCLUDES := -Iplat/arm/board/diphda/common/include \
|
||||
- -Iplat/arm/board/diphda/include \
|
||||
- -Iinclude/plat/arm/common \
|
||||
- -Iinclude/plat/arm/css/common/aarch64
|
||||
-
|
||||
-
|
||||
-DIPHDA_FW_NVCTR_VAL := 255
|
||||
-TFW_NVCTR_VAL := ${DIPHDA_FW_NVCTR_VAL}
|
||||
-NTFW_NVCTR_VAL := ${DIPHDA_FW_NVCTR_VAL}
|
||||
-
|
||||
-override NEED_BL1 := no
|
||||
-
|
||||
-override NEED_BL2 := yes
|
||||
-FIP_BL2_ARGS := tb-fw
|
||||
-
|
||||
-override NEED_BL2U := no
|
||||
-override NEED_BL31 := yes
|
||||
-NEED_BL32 := yes
|
||||
-override NEED_BL33 := yes
|
||||
-
|
||||
-# Include GICv2 driver files
|
||||
-include drivers/arm/gic/v2/gicv2.mk
|
||||
-
|
||||
-DIPHDA_GIC_SOURCES := ${GICV2_SOURCES} \
|
||||
- plat/common/plat_gicv2.c \
|
||||
- plat/arm/common/arm_gicv2.c
|
||||
-
|
||||
-
|
||||
-BL2_SOURCES += plat/arm/board/diphda/common/diphda_security.c \
|
||||
- plat/arm/board/diphda/common/diphda_err.c \
|
||||
- plat/arm/board/diphda/common/diphda_trusted_boot.c \
|
||||
- lib/utils/mem_region.c \
|
||||
- plat/arm/board/diphda/common/diphda_helpers.S \
|
||||
- plat/arm/board/diphda/common/diphda_plat.c \
|
||||
- plat/arm/board/diphda/common/diphda_bl2_mem_params_desc.c \
|
||||
- ${DIPHDA_CPU_LIBS} \
|
||||
-
|
||||
-
|
||||
-BL31_SOURCES += drivers/cfi/v2m/v2m_flash.c \
|
||||
- lib/utils/mem_region.c \
|
||||
- plat/arm/board/diphda/common/diphda_helpers.S \
|
||||
- plat/arm/board/diphda/common/diphda_topology.c \
|
||||
- plat/arm/board/diphda/common/diphda_security.c \
|
||||
- plat/arm/board/diphda/common/diphda_plat.c \
|
||||
- plat/arm/board/diphda/common/diphda_pm.c \
|
||||
- ${DIPHDA_CPU_LIBS} \
|
||||
- ${DIPHDA_GIC_SOURCES}
|
||||
-
|
||||
-ifneq (${ENABLE_STACK_PROTECTOR},0)
|
||||
- ifneq (${ENABLE_STACK_PROTECTOR},none)
|
||||
- DIPHDA_SECURITY_SOURCES := plat/arm/board/diphda/common/diphda_stack_protector.c
|
||||
- BL2_SOURCES += ${DIPHDA_SECURITY_SOURCES}
|
||||
- BL31_SOURCES += ${DIPHDA_SECURITY_SOURCES}
|
||||
- endif
|
||||
-endif
|
||||
-
|
||||
-FDT_SOURCES += plat/arm/board/diphda/common/fdts/diphda_spmc_manifest.dts
|
||||
-DIPHDA_TOS_FW_CONFIG := ${BUILD_PLAT}/fdts/diphda_spmc_manifest.dtb
|
||||
-
|
||||
-# Add the SPMC manifest to FIP and specify the same to certtool
|
||||
-$(eval $(call TOOL_ADD_PAYLOAD,${DIPHDA_TOS_FW_CONFIG},--tos-fw-config,${DIPHDA_TOS_FW_CONFIG}))
|
||||
-
|
||||
-# Adding TARGET_PLATFORM as a GCC define (-D option)
|
||||
-$(eval $(call add_define,TARGET_PLATFORM_$(call uppercase,${TARGET_PLATFORM})))
|
||||
-
|
||||
-# Adding DIPHDA_FW_NVCTR_VAL as a GCC define (-D option)
|
||||
-$(eval $(call add_define,DIPHDA_FW_NVCTR_VAL))
|
||||
-
|
||||
-include plat/arm/common/arm_common.mk
|
||||
-include plat/arm/board/common/board_common.mk
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+201
@@ -0,0 +1,201 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From bf95f27e300e962140a5dec45c2b1727c0829511 Mon Sep 17 00:00:00 2001
|
||||
From: "Arpita S.K" <Arpita.S.K@arm.com>
|
||||
Date: Wed, 13 Oct 2021 14:49:26 +0530
|
||||
Subject: [PATCH] plat/arm: corstone1000: made changes to accommodate 3MB for
|
||||
optee
|
||||
|
||||
* These changes are required to accommodate 3MB for OP-TEE and this
|
||||
is required for SP's part of optee
|
||||
* Added size macro's for better readability of the code
|
||||
* Moved uboot execution memory from CVM to DDR
|
||||
|
||||
Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
|
||||
---
|
||||
include/plat/common/common_def.h | 25 ++++++++
|
||||
.../common/corstone1000_bl2_mem_params_desc.c | 7 +--
|
||||
.../common/include/platform_def.h | 59 +++++++++++--------
|
||||
3 files changed, 64 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/include/plat/common/common_def.h b/include/plat/common/common_def.h
|
||||
index 14ae603b9b..5bb58692ef 100644
|
||||
--- a/include/plat/common/common_def.h
|
||||
+++ b/include/plat/common/common_def.h
|
||||
@@ -12,6 +12,31 @@
|
||||
#include <lib/utils_def.h>
|
||||
#include <lib/xlat_tables/xlat_tables_defs.h>
|
||||
|
||||
+#define SZ_1K 0x00000400
|
||||
+#define SZ_2K 0x00000800
|
||||
+#define SZ_4K 0x00001000
|
||||
+#define SZ_8K 0x00002000
|
||||
+#define SZ_16K 0x00004000
|
||||
+#define SZ_32K 0x00008000
|
||||
+#define SZ_64K 0x00010000
|
||||
+#define SZ_128K 0x00020000
|
||||
+#define SZ_256K 0x00040000
|
||||
+#define SZ_512K 0x00080000
|
||||
+
|
||||
+#define SZ_1M 0x00100000
|
||||
+#define SZ_2M 0x00200000
|
||||
+#define SZ_4M 0x00400000
|
||||
+#define SZ_8M 0x00800000
|
||||
+#define SZ_16M 0x01000000
|
||||
+#define SZ_32M 0x02000000
|
||||
+#define SZ_64M 0x04000000
|
||||
+#define SZ_128M 0x08000000
|
||||
+#define SZ_256M 0x10000000
|
||||
+#define SZ_512M 0x20000000
|
||||
+
|
||||
+#define SZ_1G 0x40000000
|
||||
+#define SZ_2G 0x80000000
|
||||
+
|
||||
/******************************************************************************
|
||||
* Required platform porting definitions that are expected to be common to
|
||||
* all platforms
|
||||
diff --git a/plat/arm/board/corstone1000/common/corstone1000_bl2_mem_params_desc.c b/plat/arm/board/corstone1000/common/corstone1000_bl2_mem_params_desc.c
|
||||
index 7baa82d31b..6e90936a14 100644
|
||||
--- a/plat/arm/board/corstone1000/common/corstone1000_bl2_mem_params_desc.c
|
||||
+++ b/plat/arm/board/corstone1000/common/corstone1000_bl2_mem_params_desc.c
|
||||
@@ -71,13 +71,12 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = {
|
||||
.image_id = BL33_IMAGE_ID,
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
|
||||
VERSION_2, entry_point_info_t, NON_SECURE | EXECUTABLE),
|
||||
- .ep_info.pc = PLAT_ARM_NS_IMAGE_BASE,
|
||||
+ .ep_info.pc = BL33_BASE,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
|
||||
VERSION_2, image_info_t, 0),
|
||||
- .image_info.image_base = PLAT_ARM_NS_IMAGE_BASE,
|
||||
- .image_info.image_max_size = ARM_DRAM1_BASE + ARM_DRAM1_SIZE
|
||||
- - PLAT_ARM_NS_IMAGE_BASE,
|
||||
+ .image_info.image_base = BL33_BASE,
|
||||
+ .image_info.image_max_size = BL33_LIMIT - BL33_BASE,
|
||||
|
||||
.next_handoff_image_id = INVALID_IMAGE_ID,
|
||||
},
|
||||
diff --git a/plat/arm/board/corstone1000/common/include/platform_def.h b/plat/arm/board/corstone1000/common/include/platform_def.h
|
||||
index e36bb626ee..a0ac0fe758 100644
|
||||
--- a/plat/arm/board/corstone1000/common/include/platform_def.h
|
||||
+++ b/plat/arm/board/corstone1000/common/include/platform_def.h
|
||||
@@ -119,7 +119,7 @@
|
||||
*
|
||||
* <ARM_NS_SHARED_RAM_BASE> = <ARM_TRUSTED_SRAM_BASE> + 1 MB
|
||||
*
|
||||
- * partition size: 3 MB
|
||||
+ * partition size: 512 KB
|
||||
*
|
||||
* content:
|
||||
*
|
||||
@@ -128,13 +128,13 @@
|
||||
|
||||
/* DDR memory */
|
||||
#define ARM_DRAM1_BASE UL(0x80000000)
|
||||
-#define ARM_DRAM1_SIZE UL(0x80000000)
|
||||
+#define ARM_DRAM1_SIZE (SZ_2G) /* 2GB*/
|
||||
#define ARM_DRAM1_END (ARM_DRAM1_BASE + \
|
||||
ARM_DRAM1_SIZE - 1)
|
||||
|
||||
/* DRAM1 and DRAM2 are the same for corstone1000 */
|
||||
-#define ARM_DRAM2_BASE ARM_DRAM1_BASE
|
||||
-#define ARM_DRAM2_SIZE ARM_DRAM1_SIZE
|
||||
+#define ARM_DRAM2_BASE ARM_DRAM1_BASE
|
||||
+#define ARM_DRAM2_SIZE ARM_DRAM1_SIZE
|
||||
#define ARM_DRAM2_END ARM_DRAM1_END
|
||||
|
||||
#define ARM_NS_DRAM1_BASE ARM_DRAM1_BASE
|
||||
@@ -144,23 +144,31 @@
|
||||
|
||||
/* The first 8 KB of Trusted SRAM are used as shared memory */
|
||||
#define ARM_TRUSTED_SRAM_BASE UL(0x02000000)
|
||||
-#define ARM_SHARED_RAM_SIZE UL(0x00002000) /* 8 KB */
|
||||
+#define ARM_SHARED_RAM_SIZE (SZ_8K) /* 8 KB */
|
||||
#define ARM_SHARED_RAM_BASE ARM_TRUSTED_SRAM_BASE
|
||||
|
||||
/* The remaining Trusted SRAM is used to load the BL images */
|
||||
+#define TOTAL_SRAM_SIZE (SZ_4M) /* 4 MB */
|
||||
|
||||
-#define PLAT_ARM_TRUSTED_SRAM_SIZE UL(0x00100000) /* 1 MB */
|
||||
+/* Last 512KB of CVM is allocated for shared RAM
|
||||
+ * as an example openAMP */
|
||||
+#define ARM_NS_SHARED_RAM_SIZE (512 * SZ_1K)
|
||||
|
||||
-#define PLAT_ARM_MAX_BL2_SIZE UL(0x0002d000) /* 180 KB */
|
||||
+#define PLAT_ARM_TRUSTED_SRAM_SIZE (TOTAL_SRAM_SIZE - \
|
||||
+ ARM_NS_SHARED_RAM_SIZE - \
|
||||
+ ARM_SHARED_RAM_SIZE)
|
||||
|
||||
-#define PLAT_ARM_MAX_BL31_SIZE UL(0x00023000) /* 140 KB */
|
||||
+#define PLAT_ARM_MAX_BL2_SIZE (180 * SZ_1K) /* 180 KB */
|
||||
|
||||
-#define ARM_BL_RAM_BASE (ARM_SHARED_RAM_BASE + \
|
||||
- ARM_SHARED_RAM_SIZE)
|
||||
-#define ARM_BL_RAM_SIZE (PLAT_ARM_TRUSTED_SRAM_SIZE - \
|
||||
- ARM_SHARED_RAM_SIZE)
|
||||
+#define PLAT_ARM_MAX_BL31_SIZE (140 * SZ_1K) /* 140 KB */
|
||||
+
|
||||
+#define ARM_BL_RAM_BASE (ARM_SHARED_RAM_BASE + \
|
||||
+ ARM_SHARED_RAM_SIZE)
|
||||
+#define ARM_BL_RAM_SIZE (PLAT_ARM_TRUSTED_SRAM_SIZE - \
|
||||
+ ARM_SHARED_RAM_SIZE)
|
||||
+
|
||||
+#define BL2_SIGNATURE_SIZE (SZ_4K) /* 4 KB */
|
||||
|
||||
-#define BL2_SIGNATURE_SIZE UL(0x00001000) /* 4 KB */
|
||||
#define BL2_SIGNATURE_BASE (BL2_LIMIT - \
|
||||
PLAT_ARM_MAX_BL2_SIZE)
|
||||
#define BL2_BASE (BL2_LIMIT - \
|
||||
@@ -175,14 +183,15 @@
|
||||
|
||||
#define CORSTONE1000_TOS_FW_CONFIG_BASE (BL31_BASE - \
|
||||
CORSTONE1000_TOS_FW_CONFIG_SIZE)
|
||||
-#define CORSTONE1000_TOS_FW_CONFIG_SIZE UL(0x00002000) /* 8 KB */
|
||||
+#define CORSTONE1000_TOS_FW_CONFIG_SIZE (SZ_8K) /* 8 KB */
|
||||
#define CORSTONE1000_TOS_FW_CONFIG_LIMIT BL31_BASE
|
||||
|
||||
#define BL32_BASE ARM_BL_RAM_BASE
|
||||
-#define PLAT_ARM_MAX_BL32_SIZE (CORSTONE1000_TOS_FW_CONFIG_BASE - \
|
||||
- BL32_BASE) /* 688 KB */
|
||||
-#define BL32_LIMIT (BL32_BASE + \
|
||||
- PLAT_ARM_MAX_BL32_SIZE)
|
||||
+#define PLAT_ARM_MAX_BL32_SIZE (CORSTONE1000_TOS_FW_CONFIG_BASE - \
|
||||
+ BL32_BASE)
|
||||
+
|
||||
+#define BL32_LIMIT (BL32_BASE + \
|
||||
+ PLAT_ARM_MAX_BL32_SIZE)
|
||||
|
||||
/* SPD_spmd settings */
|
||||
|
||||
@@ -191,10 +200,14 @@
|
||||
|
||||
/* NS memory */
|
||||
|
||||
-/* The last 3 MB of the SRAM is allocated to the non secure area */
|
||||
-#define ARM_NS_SHARED_RAM_BASE (ARM_TRUSTED_SRAM_BASE + \
|
||||
- PLAT_ARM_TRUSTED_SRAM_SIZE)
|
||||
-#define ARM_NS_SHARED_RAM_SIZE UL(0x00300000) /* 3 MB */
|
||||
+/* The last 512KB of the SRAM is allocated as shared memory */
|
||||
+#define ARM_NS_SHARED_RAM_BASE (ARM_TRUSTED_SRAM_BASE + TOTAL_SRAM_SIZE - \
|
||||
+ (PLAT_ARM_MAX_BL31_SIZE + \
|
||||
+ PLAT_ARM_MAX_BL32_SIZE))
|
||||
+
|
||||
+#define BL33_BASE ARM_DRAM1_BASE
|
||||
+#define PLAT_ARM_MAX_BL33_SIZE (12 * SZ_1M) /* 12 MB*/
|
||||
+#define BL33_LIMIT (ARM_DRAM1_BASE + PLAT_ARM_MAX_BL33_SIZE)
|
||||
|
||||
/* end of the definition of SRAM memory layout */
|
||||
|
||||
@@ -204,7 +217,7 @@
|
||||
#define PLAT_ARM_FIP_MAX_SIZE UL(0x1ff000) /* 1.996 MB */
|
||||
|
||||
#define PLAT_ARM_NVM_BASE V2M_FLASH0_BASE
|
||||
-#define PLAT_ARM_NVM_SIZE UL(0x02000000) /* 32 MB */
|
||||
+#define PLAT_ARM_NVM_SIZE (SZ_32M) /* 32 MB */
|
||||
|
||||
#define PLAT_ARM_FLASH_IMAGE_BASE PLAT_ARM_FIP_BASE
|
||||
#define PLAT_ARM_FLASH_IMAGE_MAX_SIZE PLAT_ARM_FIP_MAX_SIZE
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# Corstone1000 64-bit machines specific TFA support
|
||||
|
||||
COMPATIBLE_MACHINE = "(corstone1000)"
|
||||
|
||||
SRC_URI = "git://git.trustedfirmware.org/TF-A/trusted-firmware-a.git;protocol=https;name=tfa"
|
||||
|
||||
# TF-A master branch with all Corstone1000 patches merged
|
||||
SRCREV_tfa = "459b24451a0829460783ce8dfa15561e36d901d8"
|
||||
PV .= "+git${SRCREV_tfa}"
|
||||
|
||||
LIC_FILES_CHKSUM="file://docs/license.rst;md5=b2c740efedc159745b9b31f88ff03dde file://mbedtls/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
|
||||
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/files/corstone1000:"
|
||||
SRC_URI:append = " \
|
||||
file://0001-Rename-Diphda-to-corstone1000.patch \
|
||||
file://0002-plat-arm-corstone1000-made-changes-to-accommodate-3M.patch \
|
||||
"
|
||||
|
||||
TFA_DEBUG = "1"
|
||||
TFA_UBOOT = "1"
|
||||
TFA_MBEDTLS = "1"
|
||||
TFA_BUILD_TARGET = "bl2 bl31 fip"
|
||||
|
||||
# Enabling Secure-EL1 Payload Dispatcher (SPD)
|
||||
TFA_SPD = "spmd"
|
||||
# Cortex-A35 supports Armv8.0-A (no S-EL2 execution state).
|
||||
# So, the SPD SPMC component should run at the S-EL1 execution state
|
||||
TFA_SPMD_SPM_AT_SEL2 = "0"
|
||||
|
||||
# BL2 loads BL32 (optee). So, optee needs to be built first:
|
||||
DEPENDS += "optee-os"
|
||||
|
||||
EXTRA_OEMAKE:append = " \
|
||||
ARCH=aarch64 \
|
||||
TARGET_PLATFORM=${TFA_TARGET_PLATFORM} \
|
||||
ENABLE_STACK_PROTECTOR=strong \
|
||||
ENABLE_PIE=1 \
|
||||
BL2_AT_EL3=1 \
|
||||
CREATE_KEYS=1 \
|
||||
GENERATE_COT=1 \
|
||||
TRUSTED_BOARD_BOOT=1 \
|
||||
COT=tbbr \
|
||||
ARM_ROTPK_LOCATION=devel_rsa \
|
||||
ROT_KEY=plat/arm/board/common/rotpk/arm_rotprivk_rsa.pem \
|
||||
BL32=${RECIPE_SYSROOT}/lib/firmware/tee-pager_v2.bin \
|
||||
LOG_LEVEL=50 \
|
||||
"
|
||||
|
||||
# trigger TF-M build so TF-A binaries get signed
|
||||
do_deploy[depends]+= "virtual/trusted-firmware-m:do_prepare_recipe_sysroot"
|
||||
@@ -3,6 +3,7 @@
|
||||
MACHINE_TFA_REQUIRE ?= ""
|
||||
MACHINE_TFA_REQUIRE:corstone500 = "trusted-firmware-a-corstone500.inc"
|
||||
MACHINE_TFA_REQUIRE:corstone700 = "trusted-firmware-a-corstone700.inc"
|
||||
MACHINE_TFA_REQUIRE:corstone1000 = "trusted-firmware-a-corstone1000.inc"
|
||||
MACHINE_TFA_REQUIRE:fvp-base = "trusted-firmware-a-fvp.inc"
|
||||
MACHINE_TFA_REQUIRE:fvp-base-arm32 = "trusted-firmware-a-fvp-arm32.inc"
|
||||
MACHINE_TFA_REQUIRE:juno = "trusted-firmware-a-juno.inc"
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
# Corstone1000 machines specific TFM support
|
||||
|
||||
COMPATIBLE_MACHINE = "(corstone1000)"
|
||||
|
||||
TFM_DEBUG = "1"
|
||||
|
||||
PACKAGECONFIG[test-secure] = "-DTEST_S=OFF,-DTEST_S=OFF"
|
||||
PACKAGECONFIG[test-nonsecure] = "-DTEST_NS=OFF,-DTEST_NS=OFF"
|
||||
|
||||
INSANE_SKIP:${PN} = "arch"
|
||||
|
||||
## Default is the FVP ##
|
||||
TFM_PLATFORM_IS_FVP ?= "TRUE"
|
||||
EXTRA_OECMAKE += "-DPLATFORM_IS_FVP=${TFM_PLATFORM_IS_FVP}"
|
||||
|
||||
SRCREV_tfm = "ccd82e35f539c0d7261b2935d6d30c550cfc6736"
|
||||
|
||||
SRCREV_FORMAT = "tfm_mcuboot_tfm-tests_mbedtls"
|
||||
|
||||
# The install task signs the TF-A BL2 and FIP binaries.
|
||||
# So they need to be copied to the sysroot. Hence the dependencies below:
|
||||
do_prepare_recipe_sysroot[depends]+= "virtual/trusted-firmware-a:do_populate_sysroot"
|
||||
|
||||
# adding host images signing support
|
||||
require trusted-firmware-m-sign-host-images.inc
|
||||
|
||||
do_install() {
|
||||
if [ ! -d "${B}/install/outputs/ARM/CORSTONE1000" ]
|
||||
then
|
||||
bbfatal "'${B}/install/outputs/ARM/CORSTONE1000' output folder not found!"
|
||||
fi
|
||||
|
||||
install -D -p -m 0644 ${B}/install/outputs/ARM/CORSTONE1000/tfm_s_signed.bin ${D}/firmware/tfm_s_signed.bin
|
||||
install -D -p -m 0644 ${B}/install/outputs/ARM/CORSTONE1000/bl2_signed.bin ${D}/firmware/bl2_signed.bin
|
||||
install -D -p -m 0644 ${B}/install/outputs/ARM/CORSTONE1000/bl1.bin ${D}/firmware/bl1.bin
|
||||
|
||||
#
|
||||
# Signing TF-A BL2 and the FIP image
|
||||
#
|
||||
|
||||
sign_host_image ${TFA_BL2_BINARY} ${RECIPE_SYSROOT}/firmware ${TFA_BL2_RE_IMAGE_LOAD_ADDRESS} ${TFA_BL2_RE_SIGN_BIN_SIZE}
|
||||
|
||||
fiptool update \
|
||||
--tb-fw ${D}/firmware/signed_${TFA_BL2_BINARY} \
|
||||
${RECIPE_SYSROOT}/firmware/${TFA_FIP_BINARY}
|
||||
|
||||
sign_host_image ${TFA_FIP_BINARY} ${RECIPE_SYSROOT}/firmware ${TFA_FIP_RE_IMAGE_LOAD_ADDRESS} ${TFA_FIP_RE_SIGN_BIN_SIZE}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
# Signing host images using TF-M tools
|
||||
|
||||
DEPENDS += "python3-imgtool-native fiptool-native"
|
||||
|
||||
#
|
||||
# sign_host_image
|
||||
#
|
||||
# Description:
|
||||
#
|
||||
# A generic function that signs a host image
|
||||
# using MCUBOOT format
|
||||
#
|
||||
# Arguments:
|
||||
#
|
||||
# $1 ... host binary to sign
|
||||
# $2 ... host binary path
|
||||
# $3 ... load address of the given binary
|
||||
# $4 ... signed binary size
|
||||
#
|
||||
# Note: The signed binary is copied to ${D}/firmware
|
||||
#
|
||||
sign_host_image() {
|
||||
|
||||
host_binary_filename="`basename -s .bin ${1}`"
|
||||
host_binary_layout="${host_binary_filename}_ns"
|
||||
|
||||
cat << EOF > ${B}/${host_binary_layout}
|
||||
enum image_attributes {
|
||||
RE_IMAGE_LOAD_ADDRESS = ${3},
|
||||
RE_SIGN_BIN_SIZE = ${4},
|
||||
};
|
||||
EOF
|
||||
|
||||
host_binary="${2}/`basename ${1}`"
|
||||
host_binary_signed="${D}/firmware/signed_`basename ${1}`"
|
||||
|
||||
${PYTHON} ${S}/bl2/ext/mcuboot/scripts/wrapper/wrapper.py \
|
||||
-v ${RE_LAYOUT_WRAPPER_VERSION} \
|
||||
--layout ${B}/${host_binary_layout} \
|
||||
-k ${TFM_SIGN_PRIVATE_KEY} \
|
||||
--public-key-format full \
|
||||
--align 1 \
|
||||
--pad \
|
||||
--pad-header \
|
||||
-H ${RE_IMAGE_OFFSET} \
|
||||
-s auto \
|
||||
${host_binary} \
|
||||
${host_binary_signed}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
# Machine specific configurations
|
||||
|
||||
MACHINE_TFM_REQUIRE ?= ""
|
||||
MACHINE_TFM_REQUIRE:corstone1000 = "trusted-firmware-m-corstone1000.inc"
|
||||
|
||||
require ${MACHINE_TFM_REQUIRE}
|
||||
+330
@@ -0,0 +1,330 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 3feb071c77bb6297165c7b671b5c92d6ba306238 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Fri, 4 Jun 2021 10:58:24 +0100
|
||||
Subject: [PATCH 01/16] arm: add corstone1000 platform
|
||||
|
||||
Add support for new corstone1000 platform.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@arm.com>
|
||||
---
|
||||
arch/arm/Kconfig | 9 ++++
|
||||
board/armltd/corstone1000/Kconfig | 12 +++++
|
||||
board/armltd/corstone1000/MAINTAINERS | 6 +++
|
||||
board/armltd/corstone1000/Makefile | 7 +++
|
||||
board/armltd/corstone1000/corstone1000.c | 92 +++++++++++++++++++++++++++++++++
|
||||
configs/corstone1000_defconfig | 39 ++++++++++++++
|
||||
include/configs/corstone1000.h | 80 ++++++++++++++++++++++++++++
|
||||
7 files changed, 245 insertions(+)
|
||||
create mode 100644 board/armltd/corstone1000/Kconfig
|
||||
create mode 100644 board/armltd/corstone1000/MAINTAINERS
|
||||
create mode 100644 board/armltd/corstone1000/Makefile
|
||||
create mode 100644 board/armltd/corstone1000/corstone1000.c
|
||||
create mode 100644 configs/corstone1000_defconfig
|
||||
create mode 100644 include/configs/corstone1000.h
|
||||
|
||||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
|
||||
index 0448787b8b..25d2a707be 100644
|
||||
--- a/arch/arm/Kconfig
|
||||
+++ b/arch/arm/Kconfig
|
||||
@@ -1173,6 +1173,13 @@ config TARGET_VEXPRESS64_JUNO
|
||||
select USB
|
||||
select DM_USB
|
||||
|
||||
+config TARGET_CORSTONE1000
|
||||
+ bool "Support Corstone1000 Platform"
|
||||
+ select ARM64
|
||||
+ select PL01X_SERIAL
|
||||
+ select DM
|
||||
+ select OF_BOARD
|
||||
+
|
||||
config TARGET_TOTAL_COMPUTE
|
||||
bool "Support Total Compute Platform"
|
||||
select ARM64
|
||||
@@ -1985,6 +1992,8 @@ source "arch/arm/mach-nexell/Kconfig"
|
||||
|
||||
source "board/armltd/total_compute/Kconfig"
|
||||
|
||||
+source "board/armltd/corstone1000/Kconfig"
|
||||
+
|
||||
source "board/bosch/shc/Kconfig"
|
||||
source "board/bosch/guardian/Kconfig"
|
||||
source "board/CarMediaLab/flea3/Kconfig"
|
||||
diff --git a/board/armltd/corstone1000/Kconfig b/board/armltd/corstone1000/Kconfig
|
||||
new file mode 100644
|
||||
index 000000000000..90e6b7af59cb
|
||||
--- /dev/null
|
||||
+++ b/board/armltd/corstone1000/Kconfig
|
||||
@@ -0,0 +1,12 @@
|
||||
+if TARGET_CORSTONE1000
|
||||
+
|
||||
+config SYS_BOARD
|
||||
+ default "corstone1000"
|
||||
+
|
||||
+config SYS_VENDOR
|
||||
+ default "armltd"
|
||||
+
|
||||
+config SYS_CONFIG_NAME
|
||||
+ default "corstone1000"
|
||||
+
|
||||
+endif
|
||||
diff --git a/board/armltd/corstone1000/MAINTAINERS b/board/armltd/corstone1000/MAINTAINERS
|
||||
new file mode 100644
|
||||
index 000000000000..601cff17b666
|
||||
--- /dev/null
|
||||
+++ b/board/armltd/corstone1000/MAINTAINERS
|
||||
@@ -0,0 +1,6 @@
|
||||
+CORSTONE1000 BOARD
|
||||
+M: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
+S: Maintained
|
||||
+F: board/armltd/corstone1000/
|
||||
+F: include/configs/corstone1000.h
|
||||
+F: configs/corstone1000_defconfig
|
||||
diff --git a/board/armltd/corstone1000/Makefile b/board/armltd/corstone1000/Makefile
|
||||
new file mode 100644
|
||||
index 000000000000..7bad6f57f1ce
|
||||
--- /dev/null
|
||||
+++ b/board/armltd/corstone1000/Makefile
|
||||
@@ -0,0 +1,7 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0+
|
||||
+#
|
||||
+# (C) Copyright 2021 Arm Limited
|
||||
+# (C) Copyright 2021 Linaro
|
||||
+# Rui Miguel Silva <rui.silva@linaro.org>
|
||||
+
|
||||
+obj-y := corstone1000.o
|
||||
diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c
|
||||
new file mode 100644
|
||||
index 000000000000..fe986ceba1c5
|
||||
--- /dev/null
|
||||
+++ b/board/armltd/corstone1000/corstone1000.c
|
||||
@@ -0,0 +1,92 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0+
|
||||
+/*
|
||||
+ * (C) Copyright 2021 ARM Limited
|
||||
+ * (C) Copyright 2021 Linaro
|
||||
+ * Rui Miguel Silva <rui.silva@linaro.org>
|
||||
+ */
|
||||
+
|
||||
+#include <common.h>
|
||||
+#include <dm.h>
|
||||
+#include <dm/platform_data/serial_pl01x.h>
|
||||
+#include <asm/armv8/mmu.h>
|
||||
+#include <asm/global_data.h>
|
||||
+
|
||||
+
|
||||
+static const struct pl01x_serial_plat serial_plat = {
|
||||
+ .base = V2M_UART0,
|
||||
+ .type = TYPE_PL011,
|
||||
+ .clock = CONFIG_PL011_CLOCK,
|
||||
+};
|
||||
+
|
||||
+U_BOOT_DRVINFO(corstone1000_serials) = {
|
||||
+ .name = "serial_pl01x",
|
||||
+ .plat = &serial_plat,
|
||||
+};
|
||||
+
|
||||
+static struct mm_region corstone1000_mem_map[] = {
|
||||
+ {
|
||||
+ /* CVM */
|
||||
+ .virt = 0x02000000UL,
|
||||
+ .phys = 0x02000000UL,
|
||||
+ .size = 0x02000000UL,
|
||||
+ .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
|
||||
+ PTE_BLOCK_INNER_SHARE
|
||||
+ }, {
|
||||
+ /* QSPI */
|
||||
+ .virt = 0x08000000UL,
|
||||
+ .phys = 0x08000000UL,
|
||||
+ .size = 0x08000000UL,
|
||||
+ .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
|
||||
+ PTE_BLOCK_INNER_SHARE
|
||||
+ }, {
|
||||
+ /* Host Peripherals */
|
||||
+ .virt = 0x1A000000UL,
|
||||
+ .phys = 0x1A000000UL,
|
||||
+ .size = 0x26000000UL,
|
||||
+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
|
||||
+ PTE_BLOCK_NON_SHARE |
|
||||
+ PTE_BLOCK_PXN | PTE_BLOCK_UXN
|
||||
+ }, {
|
||||
+ /* OCVM */
|
||||
+ .virt = 0x80000000UL,
|
||||
+ .phys = 0x80000000UL,
|
||||
+ .size = 0x80000000UL,
|
||||
+ .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
|
||||
+ PTE_BLOCK_INNER_SHARE
|
||||
+ }, {
|
||||
+ /* List terminator */
|
||||
+ 0,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+struct mm_region *mem_map = corstone1000_mem_map;
|
||||
+
|
||||
+int board_init(void)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int dram_init(void)
|
||||
+{
|
||||
+ gd->ram_size = PHYS_SDRAM_1_SIZE;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int dram_init_banksize(void)
|
||||
+{
|
||||
+ gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
|
||||
+ gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
|
||||
+
|
||||
+#ifdef PHYS_SDRAM_2
|
||||
+ gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
|
||||
+ gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void reset_cpu(ulong addr)
|
||||
+{
|
||||
+}
|
||||
diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
|
||||
new file mode 100644
|
||||
index 000000000000..47d4bf3771e0
|
||||
--- /dev/null
|
||||
+++ b/configs/corstone1000_defconfig
|
||||
@@ -0,0 +1,39 @@
|
||||
+CONFIG_ARM=y
|
||||
+CONFIG_ARM64=y
|
||||
+CONFIG_TARGET_CORSTONE1000=y
|
||||
+CONFIG_SYS_TEXT_BASE=0x02100000
|
||||
+CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
+CONFIG_NR_DRAM_BANKS=1
|
||||
+CONFIG_IDENT_STRING=" corstone1000 aarch64 "
|
||||
+CONFIG_BOOTDELAY=3
|
||||
+CONFIG_OF_BOARD=y
|
||||
+CONFIG_USE_BOOTARGS=y
|
||||
+CONFIG_BOOTARGS="console=ttyAMA0 loglevel=9"
|
||||
+# CONFIG_DISPLAY_CPUINFO is not set
|
||||
+# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
+CONFIG_HUSH_PARSER=y
|
||||
+CONFIG_SYS_PROMPT="corstone1000# "
|
||||
+# CONFIG_CMD_CONSOLE is not set
|
||||
+CONFIG_CMD_BOOTZ=y
|
||||
+CONFIG_CMD_BOOTM=y
|
||||
+# CONFIG_CMD_XIMG is not set
|
||||
+# CONFIG_CMD_EDITENV is not set
|
||||
+# CONFIG_CMD_ENV_EXISTS is not set
|
||||
+# CONFIG_CMD_ARMFLASH=y
|
||||
+# CONFIG_CMD_LOADS is not set
|
||||
+# CONFIG_CMD_ITEST is not set
|
||||
+# CONFIG_CMD_SETEXPR is not set
|
||||
+CONFIG_CMD_DHCP=y
|
||||
+# CONFIG_CMD_NFS is not set
|
||||
+CONFIG_CMD_MII=y
|
||||
+CONFIG_CMD_PING=y
|
||||
+CONFIG_CMD_CACHE=y
|
||||
+CONFIG_FIT=y
|
||||
+# CONFIG_CMD_MISC is not set
|
||||
+CONFIG_CMD_FAT=y
|
||||
+CONFIG_DM=y
|
||||
+# CONFIG_MMC is not set
|
||||
+# CONFIG_MTD_NOR_FLASH=y
|
||||
+CONFIG_DM_ETH=y
|
||||
+CONFIG_DM_SERIAL=y
|
||||
+CONFIG_OF_LIBFDT=y
|
||||
diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
|
||||
new file mode 100644
|
||||
index 000000000000..c8e630c5d857
|
||||
--- /dev/null
|
||||
+++ b/include/configs/corstone1000.h
|
||||
@@ -0,0 +1,80 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
+/*
|
||||
+ * (C) Copyright 2020 ARM Limited
|
||||
+ * (C) Copyright 2020 Linaro
|
||||
+ * Rui Miguel Silva <rui.silva@linaro.org>
|
||||
+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
|
||||
+ *
|
||||
+ * Configuration for Corstone1000. Parts were derived from other ARM
|
||||
+ * configurations.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __CORSTONE1000_H
|
||||
+#define __CORSTONE1000_H
|
||||
+
|
||||
+#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x03f00000)
|
||||
+#define CONFIG_SKIP_LOWLEVEL_INIT
|
||||
+
|
||||
+#define CONFIG_SYS_HZ 1000
|
||||
+
|
||||
+#define V2M_SRAM0 0x02000000
|
||||
+#define V2M_QSPI 0x08000000
|
||||
+
|
||||
+#define V2M_DEBUG 0x10000000
|
||||
+#define V2M_BASE_PERIPH 0x1A000000
|
||||
+
|
||||
+#define V2M_BASE 0x80000000
|
||||
+
|
||||
+#define V2M_PERIPH_OFFSET(x) (x << 16)
|
||||
+
|
||||
+#define V2M_SYSID (V2M_BASE_PERIPH)
|
||||
+#define V2M_SYSCTL (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(1))
|
||||
+
|
||||
+#define V2M_COUNTER_CTL (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(32))
|
||||
+#define V2M_COUNTER_READ (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(33))
|
||||
+
|
||||
+#define V2M_TIMER_CTL (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(34))
|
||||
+#define V2M_TIMER_BASE0 (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(35))
|
||||
+
|
||||
+#define V2M_UART0 (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(81))
|
||||
+#define V2M_UART1 (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(82))
|
||||
+
|
||||
+#define CONFIG_PL011_CLOCK 50000000
|
||||
+
|
||||
+/* Physical Memory Map */
|
||||
+#define PHYS_SDRAM_1 (V2M_BASE)
|
||||
+#define PHYS_SDRAM_2 (V2M_QSPI)
|
||||
+
|
||||
+/* Top 16MB reserved for secure world use (maybe not needed) */
|
||||
+#define DRAM_SEC_SIZE 0x01000000
|
||||
+#define PHYS_SDRAM_1_SIZE 0x80000000 - DRAM_SEC_SIZE
|
||||
+
|
||||
+#define PHYS_SDRAM_2_SIZE 0x02000000
|
||||
+
|
||||
+/* Size of malloc() pool */
|
||||
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + (8 << 20))
|
||||
+
|
||||
+/* Miscellaneous configurable options */
|
||||
+#define CONFIG_SYS_LOAD_ADDR (V2M_BASE + 0x10000000)
|
||||
+
|
||||
+#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1
|
||||
+
|
||||
+/* Monitor Command Prompt */
|
||||
+#define CONFIG_SYS_CBSIZE 512 /* Console I/O Buffer Size */
|
||||
+#define CONFIG_SYS_MAXARGS 64 /* max command args */
|
||||
+
|
||||
+#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
+ "fdt_addr=0x08330000\0" \
|
||||
+ "fdt_addr_r=0x82000000\0" \
|
||||
+ "kernel_addr=0x08430000\0" \
|
||||
+ "kernel_addr_r=0x82100000\0" \
|
||||
+ "fdt_high=0xffffffff\0"
|
||||
+
|
||||
+#define CONFIG_BOOTCOMMAND \
|
||||
+ "echo Copying devicetree to memory ... ;" \
|
||||
+ "cp.b $fdt_addr $fdt_addr_r 0x100000;" \
|
||||
+ "echo Copying Kernel to memory ... ;" \
|
||||
+ "cp.b $kernel_addr $kernel_addr_r 0xa00000;" \
|
||||
+ "bootm $kernel_addr_r - $fdt_addr_r; "
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 1a034bd9397f96939d58a86e9cf8cd9c206db647 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Tue, 22 Jun 2021 17:00:24 +0100
|
||||
Subject: [PATCH 02/16] arm: corstone1000: enable devicetree in defconfig
|
||||
|
||||
Add support and setup the default device tree for corstone1000.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@arm.com>
|
||||
---
|
||||
configs/corstone1000_defconfig | 3 ++-
|
||||
include/configs/corstone1000.h | 10 +++-------
|
||||
2 files changed, 5 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
|
||||
index bc983e6555..54c746d829 100644
|
||||
--- a/configs/corstone1000_defconfig
|
||||
+++ b/configs/corstone1000_defconfig
|
||||
@@ -6,7 +6,8 @@ CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
CONFIG_NR_DRAM_BANKS=1
|
||||
CONFIG_IDENT_STRING=" corstone1000 aarch64 "
|
||||
CONFIG_BOOTDELAY=3
|
||||
-CONFIG_OF_BOARD=y
|
||||
+CONFIG_OF_CONTROL=y
|
||||
+CONFIG_DEFAULT_DEVICE_TREE="corstone1000-mps3"
|
||||
CONFIG_USE_BOOTARGS=y
|
||||
CONFIG_BOOTARGS="console=ttyAMA0 loglevel=9"
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
|
||||
index 1fe909463f..389ac45a58 100644
|
||||
--- a/include/configs/corstone1000.h
|
||||
+++ b/include/configs/corstone1000.h
|
||||
@@ -64,17 +64,13 @@
|
||||
#define CONFIG_SYS_MAXARGS 64 /* max command args */
|
||||
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
- "fdt_addr=0x08330000\0" \
|
||||
"fdt_addr_r=0x82000000\0" \
|
||||
- "kernel_addr=0x08430000\0" \
|
||||
+ "kernel_addr=0x08330000\0" \
|
||||
"kernel_addr_r=0x82100000\0" \
|
||||
"fdt_high=0xffffffff\0"
|
||||
|
||||
#define CONFIG_BOOTCOMMAND \
|
||||
- "echo Copying devicetree to memory ... ;" \
|
||||
- "cp.b $fdt_addr $fdt_addr_r 0x100000;" \
|
||||
"echo Copying Kernel to memory ... ;" \
|
||||
- "cp.b $kernel_addr $kernel_addr_r 0xa00000;" \
|
||||
- "bootm $kernel_addr_r - $fdt_addr_r; "
|
||||
-
|
||||
+ "cp.b $kernel_addr $kernel_addr_r 0xc00000;" \
|
||||
+ "booti $kernel_addr_r - $fdtcontroladdr; "
|
||||
#endif
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+508
@@ -0,0 +1,508 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 84b3b8f2443d0b4f6ac8ef95c941b27d734afbde Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Mon, 28 Jun 2021 23:20:55 +0100
|
||||
Subject: [PATCH 03/16] usb: common: move urb code to common
|
||||
|
||||
Move urb code from musb only use to a more common scope, so other
|
||||
drivers in the future can use the handling of urb in usb.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
drivers/usb/common/Makefile | 2 +
|
||||
drivers/usb/common/usb_urb.c | 160 ++++++++++++++++++
|
||||
drivers/usb/host/r8a66597-hcd.c | 30 +---
|
||||
drivers/usb/musb-new/musb_core.c | 2 +-
|
||||
drivers/usb/musb-new/musb_host.c | 2 +-
|
||||
drivers/usb/musb-new/musb_host.h | 2 +-
|
||||
drivers/usb/musb-new/musb_uboot.c | 38 +----
|
||||
drivers/usb/musb-new/musb_uboot.h | 2 +-
|
||||
.../linux/usb/usb_urb_compat.h | 52 ++++--
|
||||
include/usb_defs.h | 32 ++++
|
||||
10 files changed, 240 insertions(+), 82 deletions(-)
|
||||
create mode 100644 drivers/usb/common/usb_urb.c
|
||||
rename drivers/usb/musb-new/usb-compat.h => include/linux/usb/usb_urb_compat.h (57%)
|
||||
|
||||
diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
|
||||
index 3bedbf213f..dc05cb0a50 100644
|
||||
--- a/drivers/usb/common/Makefile
|
||||
+++ b/drivers/usb/common/Makefile
|
||||
@@ -4,5 +4,7 @@
|
||||
#
|
||||
|
||||
obj-$(CONFIG_$(SPL_)DM_USB) += common.o
|
||||
+obj-$(CONFIG_USB_MUSB_HCD) += usb_urb.o
|
||||
+obj-$(CONFIG_USB_MUSB_UDC) += usb_urb.o
|
||||
obj-$(CONFIG_USB_EHCI_FSL) += fsl-dt-fixup.o fsl-errata.o
|
||||
obj-$(CONFIG_USB_XHCI_FSL) += fsl-dt-fixup.o fsl-errata.o
|
||||
diff --git a/drivers/usb/common/usb_urb.c b/drivers/usb/common/usb_urb.c
|
||||
new file mode 100644
|
||||
index 0000000000..be3b6b9f32
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/common/usb_urb.c
|
||||
@@ -0,0 +1,160 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Common code for usb urb handling, based on the musb-new code
|
||||
+ *
|
||||
+ * Copyright 2021 Linaro, Rui Miguel Silva <rui.silva@linaro.org>
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <dm/device.h>
|
||||
+#include <dm/device_compat.h>
|
||||
+#include <linux/usb/usb_urb_compat.h>
|
||||
+
|
||||
+#include <time.h>
|
||||
+#include <usb.h>
|
||||
+
|
||||
+#if CONFIG_IS_ENABLED(DM_USB)
|
||||
+struct usb_device *usb_dev_get_parent(struct usb_device *udev)
|
||||
+{
|
||||
+ struct udevice *parent = udev->dev->parent;
|
||||
+
|
||||
+ /*
|
||||
+ * When called from usb-uclass.c: usb_scan_device() udev->dev points
|
||||
+ * to the parent udevice, not the actual udevice belonging to the
|
||||
+ * udev as the device is not instantiated yet.
|
||||
+ *
|
||||
+ * If dev is an usb-bus, then we are called from usb_scan_device() for
|
||||
+ * an usb-device plugged directly into the root port, return NULL.
|
||||
+ */
|
||||
+ if (device_get_uclass_id(udev->dev) == UCLASS_USB)
|
||||
+ return NULL;
|
||||
+
|
||||
+ /*
|
||||
+ * If these 2 are not the same we are being called from
|
||||
+ * usb_scan_device() and udev itself is the parent.
|
||||
+ */
|
||||
+ if (dev_get_parent_priv(udev->dev) != udev)
|
||||
+ return udev;
|
||||
+
|
||||
+ /* We are being called normally, use the parent pointer */
|
||||
+ if (device_get_uclass_id(parent) == UCLASS_USB_HUB)
|
||||
+ return dev_get_parent_priv(parent);
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+#else
|
||||
+struct usb_device *usb_dev_get_parent(struct usb_device *udev)
|
||||
+{
|
||||
+ return udev->parent;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+static void usb_urb_complete(struct urb *urb)
|
||||
+{
|
||||
+ urb->dev->status &= ~USB_ST_NOT_PROC;
|
||||
+ urb->dev->act_len = urb->actual_length;
|
||||
+
|
||||
+ if (urb->status == -EINPROGRESS)
|
||||
+ urb->status = 0;
|
||||
+}
|
||||
+
|
||||
+void usb_urb_fill(struct urb *urb, struct usb_host_endpoint *hep,
|
||||
+ struct usb_device *dev, int endpoint_type,
|
||||
+ unsigned long pipe, void *buffer, int len,
|
||||
+ struct devrequest *setup, int interval)
|
||||
+{
|
||||
+ int epnum = usb_pipeendpoint(pipe);
|
||||
+ int is_in = usb_pipein(pipe);
|
||||
+ u16 maxpacketsize = is_in ? dev->epmaxpacketin[epnum] :
|
||||
+ dev->epmaxpacketout[epnum];
|
||||
+
|
||||
+ memset(urb, 0, sizeof(struct urb));
|
||||
+ memset(hep, 0, sizeof(struct usb_host_endpoint));
|
||||
+ INIT_LIST_HEAD(&hep->urb_list);
|
||||
+ INIT_LIST_HEAD(&urb->urb_list);
|
||||
+ urb->ep = hep;
|
||||
+ urb->complete = usb_urb_complete;
|
||||
+ urb->status = -EINPROGRESS;
|
||||
+ urb->dev = dev;
|
||||
+ urb->pipe = pipe;
|
||||
+ urb->transfer_buffer = buffer;
|
||||
+ urb->transfer_dma = (unsigned long)buffer;
|
||||
+ urb->transfer_buffer_length = len;
|
||||
+ urb->setup_packet = (unsigned char *)setup;
|
||||
+
|
||||
+ urb->ep->desc.wMaxPacketSize = __cpu_to_le16(maxpacketsize);
|
||||
+ urb->ep->desc.bmAttributes = endpoint_type;
|
||||
+ urb->ep->desc.bEndpointAddress = ((is_in ? USB_DIR_IN : USB_DIR_OUT) |
|
||||
+ epnum);
|
||||
+ urb->ep->desc.bInterval = interval;
|
||||
+}
|
||||
+
|
||||
+int usb_urb_submit(struct usb_hcd *hcd, struct urb *urb)
|
||||
+{
|
||||
+ const struct usb_urb_ops *ops = hcd->urb_ops;
|
||||
+ unsigned long timeout;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (!ops)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ ret = ops->urb_enqueue(hcd, urb, 0);
|
||||
+ if (ret < 0) {
|
||||
+ printf("Failed to enqueue URB to controller\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ timeout = get_timer(0) + USB_TIMEOUT_MS(urb->pipe);
|
||||
+ do {
|
||||
+ if (ctrlc())
|
||||
+ return -EIO;
|
||||
+ ops->isr(0, hcd);
|
||||
+ } while (urb->status == -EINPROGRESS && get_timer(0) < timeout);
|
||||
+
|
||||
+ if (urb->status == -EINPROGRESS)
|
||||
+ ops->urb_dequeue(hcd, urb, -ETIME);
|
||||
+
|
||||
+ return urb->status;
|
||||
+}
|
||||
+
|
||||
+int usb_urb_submit_control(struct usb_hcd *hcd, struct urb *urb,
|
||||
+ struct usb_host_endpoint *hep,
|
||||
+ struct usb_device *dev, unsigned long pipe,
|
||||
+ void *buffer, int len, struct devrequest *setup,
|
||||
+ int interval, enum usb_device_speed speed)
|
||||
+{
|
||||
+ const struct usb_urb_ops *ops = hcd->urb_ops;
|
||||
+
|
||||
+ usb_urb_fill(urb, hep, dev, USB_ENDPOINT_XFER_CONTROL, pipe, buffer,
|
||||
+ len, setup, 0);
|
||||
+
|
||||
+ /* Fix speed for non hub-attached devices */
|
||||
+ if (!usb_dev_get_parent(dev)) {
|
||||
+ dev->speed = speed;
|
||||
+ if (ops->hub_control)
|
||||
+ return ops->hub_control(hcd, dev, pipe, buffer, len,
|
||||
+ setup);
|
||||
+ }
|
||||
+
|
||||
+ return usb_urb_submit(hcd, urb);
|
||||
+}
|
||||
+
|
||||
+int usb_urb_submit_bulk(struct usb_hcd *hcd, struct urb *urb,
|
||||
+ struct usb_host_endpoint *hep, struct usb_device *dev,
|
||||
+ unsigned long pipe, void *buffer, int len)
|
||||
+{
|
||||
+ usb_urb_fill(urb, hep, dev, USB_ENDPOINT_XFER_BULK, pipe, buffer, len,
|
||||
+ NULL, 0);
|
||||
+
|
||||
+ return usb_urb_submit(hcd, urb);
|
||||
+}
|
||||
+
|
||||
+int usb_urb_submit_irq(struct usb_hcd *hcd, struct urb *urb,
|
||||
+ struct usb_host_endpoint *hep, struct usb_device *dev,
|
||||
+ unsigned long pipe, void *buffer, int len, int interval)
|
||||
+{
|
||||
+ usb_urb_fill(urb, hep, dev, USB_ENDPOINT_XFER_INT, pipe, buffer, len,
|
||||
+ NULL, interval);
|
||||
+
|
||||
+ return usb_urb_submit(hcd, urb);
|
||||
+}
|
||||
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c
|
||||
index f1fc93f3d4..3ccbc16da3 100644
|
||||
--- a/drivers/usb/host/r8a66597-hcd.c
|
||||
+++ b/drivers/usb/host/r8a66597-hcd.c
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <dm/device_compat.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/iopoll.h>
|
||||
+#include <linux/usb/usb_urb_compat.h>
|
||||
#include <power/regulator.h>
|
||||
|
||||
#include "r8a66597.h"
|
||||
@@ -24,35 +25,6 @@
|
||||
#define R8A66597_DPRINT(...)
|
||||
#endif
|
||||
|
||||
-static inline struct usb_device *usb_dev_get_parent(struct usb_device *udev)
|
||||
-{
|
||||
- struct udevice *parent = udev->dev->parent;
|
||||
-
|
||||
- /*
|
||||
- * When called from usb-uclass.c: usb_scan_device() udev->dev points
|
||||
- * to the parent udevice, not the actual udevice belonging to the
|
||||
- * udev as the device is not instantiated yet.
|
||||
- *
|
||||
- * If dev is an usb-bus, then we are called from usb_scan_device() for
|
||||
- * an usb-device plugged directly into the root port, return NULL.
|
||||
- */
|
||||
- if (device_get_uclass_id(udev->dev) == UCLASS_USB)
|
||||
- return NULL;
|
||||
-
|
||||
- /*
|
||||
- * If these 2 are not the same we are being called from
|
||||
- * usb_scan_device() and udev itself is the parent.
|
||||
- */
|
||||
- if (dev_get_parent_priv(udev->dev) != udev)
|
||||
- return udev;
|
||||
-
|
||||
- /* We are being called normally, use the parent pointer */
|
||||
- if (device_get_uclass_id(parent) == UCLASS_USB_HUB)
|
||||
- return dev_get_parent_priv(parent);
|
||||
-
|
||||
- return NULL;
|
||||
-}
|
||||
-
|
||||
static void get_hub_data(struct usb_device *dev, u16 *hub_devnum, u16 *hubport)
|
||||
{
|
||||
struct usb_device *parent = usb_dev_get_parent(dev);
|
||||
diff --git a/drivers/usb/musb-new/musb_core.c b/drivers/usb/musb-new/musb_core.c
|
||||
index 22811a5efb..d1d4ee2da3 100644
|
||||
--- a/drivers/usb/musb-new/musb_core.c
|
||||
+++ b/drivers/usb/musb-new/musb_core.c
|
||||
@@ -89,9 +89,9 @@
|
||||
#include <linux/usb/ch9.h>
|
||||
#include <linux/usb/gadget.h>
|
||||
#include <linux/usb/musb.h>
|
||||
+#include <linux/usb/usb_urb_compat.h>
|
||||
#include <asm/io.h>
|
||||
#include "linux-compat.h"
|
||||
-#include "usb-compat.h"
|
||||
#endif
|
||||
|
||||
#include "musb_core.h"
|
||||
diff --git a/drivers/usb/musb-new/musb_host.c b/drivers/usb/musb-new/musb_host.c
|
||||
index acb2d40f3b..e5905d90d6 100644
|
||||
--- a/drivers/usb/musb-new/musb_host.c
|
||||
+++ b/drivers/usb/musb-new/musb_host.c
|
||||
@@ -26,8 +26,8 @@
|
||||
#include <dm/device_compat.h>
|
||||
#include <usb.h>
|
||||
#include <linux/bug.h>
|
||||
+#include <linux/usb/usb_urb_compat.h>
|
||||
#include "linux-compat.h"
|
||||
-#include "usb-compat.h"
|
||||
#endif
|
||||
|
||||
#include "musb_core.h"
|
||||
diff --git a/drivers/usb/musb-new/musb_host.h b/drivers/usb/musb-new/musb_host.h
|
||||
index afc8fa35a7..5a604bdb0c 100644
|
||||
--- a/drivers/usb/musb-new/musb_host.h
|
||||
+++ b/drivers/usb/musb-new/musb_host.h
|
||||
@@ -10,7 +10,7 @@
|
||||
#ifndef _MUSB_HOST_H
|
||||
#define _MUSB_HOST_H
|
||||
#ifdef __UBOOT__
|
||||
-#include "usb-compat.h"
|
||||
+#include <linux/usb/usb_urb_compat.h>
|
||||
#endif
|
||||
|
||||
static inline struct usb_hcd *musb_to_hcd(struct musb *musb)
|
||||
diff --git a/drivers/usb/musb-new/musb_uboot.c b/drivers/usb/musb-new/musb_uboot.c
|
||||
index 8ac2f0a78a..85794356b0 100644
|
||||
--- a/drivers/usb/musb-new/musb_uboot.c
|
||||
+++ b/drivers/usb/musb-new/musb_uboot.c
|
||||
@@ -8,10 +8,10 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/usb/ch9.h>
|
||||
#include <linux/usb/gadget.h>
|
||||
+#include <linux/usb/usb_urb_compat.h>
|
||||
|
||||
#include <usb.h>
|
||||
#include "linux-compat.h"
|
||||
-#include "usb-compat.h"
|
||||
#include "musb_core.h"
|
||||
#include "musb_host.h"
|
||||
#include "musb_gadget.h"
|
||||
@@ -453,39 +453,3 @@ struct musb *musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
|
||||
|
||||
return *musbp;
|
||||
}
|
||||
-
|
||||
-#if CONFIG_IS_ENABLED(DM_USB)
|
||||
-struct usb_device *usb_dev_get_parent(struct usb_device *udev)
|
||||
-{
|
||||
- struct udevice *parent = udev->dev->parent;
|
||||
-
|
||||
- /*
|
||||
- * When called from usb-uclass.c: usb_scan_device() udev->dev points
|
||||
- * to the parent udevice, not the actual udevice belonging to the
|
||||
- * udev as the device is not instantiated yet.
|
||||
- *
|
||||
- * If dev is an usb-bus, then we are called from usb_scan_device() for
|
||||
- * an usb-device plugged directly into the root port, return NULL.
|
||||
- */
|
||||
- if (device_get_uclass_id(udev->dev) == UCLASS_USB)
|
||||
- return NULL;
|
||||
-
|
||||
- /*
|
||||
- * If these 2 are not the same we are being called from
|
||||
- * usb_scan_device() and udev itself is the parent.
|
||||
- */
|
||||
- if (dev_get_parent_priv(udev->dev) != udev)
|
||||
- return udev;
|
||||
-
|
||||
- /* We are being called normally, use the parent pointer */
|
||||
- if (device_get_uclass_id(parent) == UCLASS_USB_HUB)
|
||||
- return dev_get_parent_priv(parent);
|
||||
-
|
||||
- return NULL;
|
||||
-}
|
||||
-#else
|
||||
-struct usb_device *usb_dev_get_parent(struct usb_device *udev)
|
||||
-{
|
||||
- return udev->parent;
|
||||
-}
|
||||
-#endif
|
||||
diff --git a/drivers/usb/musb-new/musb_uboot.h b/drivers/usb/musb-new/musb_uboot.h
|
||||
index 18282efccc..6b162f03b1 100644
|
||||
--- a/drivers/usb/musb-new/musb_uboot.h
|
||||
+++ b/drivers/usb/musb-new/musb_uboot.h
|
||||
@@ -8,8 +8,8 @@
|
||||
#define __MUSB_UBOOT_H__
|
||||
|
||||
#include <usb.h>
|
||||
+#include <linux/usb/usb_urb_compat.h>
|
||||
#include "linux-compat.h"
|
||||
-#include "usb-compat.h"
|
||||
#include "musb_core.h"
|
||||
|
||||
struct musb_host_data {
|
||||
diff --git a/drivers/usb/musb-new/usb-compat.h b/include/linux/usb/usb_urb_compat.h
|
||||
similarity index 57%
|
||||
rename from drivers/usb/musb-new/usb-compat.h
|
||||
rename to include/linux/usb/usb_urb_compat.h
|
||||
index 1c66c4fe36..438e70b56a 100644
|
||||
--- a/drivers/usb/musb-new/usb-compat.h
|
||||
+++ b/include/linux/usb/usb_urb_compat.h
|
||||
@@ -1,16 +1,31 @@
|
||||
-#ifndef __USB_COMPAT_H__
|
||||
-#define __USB_COMPAT_H__
|
||||
+#ifndef __USB_URB_COMPAT_H__
|
||||
+#define __USB_URB_COMPAT_H__
|
||||
|
||||
-#include "usb.h"
|
||||
+#include <linux/compat.h>
|
||||
+#include <usb.h>
|
||||
|
||||
struct udevice;
|
||||
+struct urb;
|
||||
+struct usb_hcd;
|
||||
+
|
||||
+
|
||||
+struct usb_urb_ops {
|
||||
+ int (*urb_enqueue)(struct usb_hcd *hcd, struct urb *urb,
|
||||
+ gfp_t mem_flags);
|
||||
+ int (*urb_dequeue)(struct usb_hcd *hcd, struct urb *urb, int status);
|
||||
+ int (*hub_control)(struct usb_hcd *hcd, struct usb_device *dev,
|
||||
+ unsigned long pipe, void *buffer, int len,
|
||||
+ struct devrequest *setup);
|
||||
+ irqreturn_t (*isr)(int irq, void *priv);
|
||||
+};
|
||||
|
||||
struct usb_hcd {
|
||||
void *hcd_priv;
|
||||
+ const struct usb_urb_ops *urb_ops;
|
||||
};
|
||||
|
||||
struct usb_host_endpoint {
|
||||
- struct usb_endpoint_descriptor desc;
|
||||
+ struct usb_endpoint_descriptor desc;
|
||||
struct list_head urb_list;
|
||||
void *hcpriv;
|
||||
};
|
||||
@@ -23,8 +38,6 @@ struct usb_host_endpoint {
|
||||
#define URB_SHORT_NOT_OK 0x0001 /* report short reads as errors */
|
||||
#define URB_ZERO_PACKET 0x0040 /* Finish bulk OUT with short packet */
|
||||
|
||||
-struct urb;
|
||||
-
|
||||
typedef void (*usb_complete_t)(struct urb *);
|
||||
|
||||
struct urb {
|
||||
@@ -68,12 +81,27 @@ static inline int usb_hcd_unmap_urb_for_dma(struct usb_hcd *hcd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-/**
|
||||
- * usb_dev_get_parent() - Get the parent of a USB device
|
||||
- *
|
||||
- * @udev: USB struct containing information about the device
|
||||
- * @return associated device for which udev == dev_get_parent_priv(dev)
|
||||
- */
|
||||
struct usb_device *usb_dev_get_parent(struct usb_device *udev);
|
||||
|
||||
+int usb_urb_submit_control(struct usb_hcd *hcd, struct urb *urb,
|
||||
+ struct usb_host_endpoint *hep,
|
||||
+ struct usb_device *dev, unsigned long pipe,
|
||||
+ void *buffer, int len, struct devrequest *setup,
|
||||
+ int interval, enum usb_device_speed speed);
|
||||
+
|
||||
+int usb_urb_submit_bulk(struct usb_hcd *hcd, struct urb *urb,
|
||||
+ struct usb_host_endpoint *hep, struct usb_device *dev,
|
||||
+ unsigned long pipe, void *buffer, int len);
|
||||
+
|
||||
+int usb_urb_submit_irq(struct usb_hcd *hcd, struct urb *urb,
|
||||
+ struct usb_host_endpoint *hep, struct usb_device *dev,
|
||||
+ unsigned long pipe, void *buffer, int len, int interval);
|
||||
+
|
||||
+void usb_urb_fill(struct urb *urb, struct usb_host_endpoint *hep,
|
||||
+ struct usb_device *dev, int endpoint_type,
|
||||
+ unsigned long pipe, void *buffer, int len,
|
||||
+ struct devrequest *setup, int interval);
|
||||
+
|
||||
+int usb_urb_submit(struct usb_hcd *hcd, struct urb *urb);
|
||||
+
|
||||
#endif /* __USB_COMPAT_H__ */
|
||||
diff --git a/include/usb_defs.h b/include/usb_defs.h
|
||||
index 6dd2c997f9..ec00161710 100644
|
||||
--- a/include/usb_defs.h
|
||||
+++ b/include/usb_defs.h
|
||||
@@ -81,6 +81,32 @@
|
||||
#define EndpointOutRequest \
|
||||
((USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8)
|
||||
|
||||
+/* class requests from the USB 2.0 hub spec, table 11-15 */
|
||||
+#define HUB_CLASS_REQ(dir, type, request) ((((dir) | (type)) << 8) | (request))
|
||||
+/* GetBusState and SetHubDescriptor are optional, omitted */
|
||||
+#define ClearHubFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_HUB, \
|
||||
+ USB_REQ_CLEAR_FEATURE)
|
||||
+#define ClearPortFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \
|
||||
+ USB_REQ_CLEAR_FEATURE)
|
||||
+#define GetHubDescriptor HUB_CLASS_REQ(USB_DIR_IN, USB_RT_HUB, \
|
||||
+ USB_REQ_GET_DESCRIPTOR)
|
||||
+#define GetHubStatus HUB_CLASS_REQ(USB_DIR_IN, USB_RT_HUB, \
|
||||
+ USB_REQ_GET_STATUS)
|
||||
+#define GetPortStatus HUB_CLASS_REQ(USB_DIR_IN, USB_RT_PORT, \
|
||||
+ USB_REQ_GET_STATUS)
|
||||
+#define SetHubFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_HUB, \
|
||||
+ USB_REQ_SET_FEATURE)
|
||||
+#define SetPortFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \
|
||||
+ USB_REQ_SET_FEATURE)
|
||||
+#define ClearTTBuffer HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \
|
||||
+ HUB_CLEAR_TT_BUFFER)
|
||||
+#define ResetTT HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \
|
||||
+ HUB_RESET_TT)
|
||||
+#define GetTTState HUB_CLASS_REQ(USB_DIR_IN, USB_RT_PORT, \
|
||||
+ HUB_GET_TT_STATE)
|
||||
+#define StopTT HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \
|
||||
+ HUB_STOP_TT)
|
||||
+
|
||||
/* Descriptor types */
|
||||
#define USB_DT_DEVICE 0x01
|
||||
#define USB_DT_CONFIG 0x02
|
||||
@@ -289,10 +315,16 @@
|
||||
#define USB_SS_PORT_STAT_C_CONFIG_ERROR 0x0080
|
||||
|
||||
/* wHubCharacteristics (masks) */
|
||||
+#define HUB_CHAR_COMMON_OCPM 0x0000 /* All ports Over-Current reporting */
|
||||
+#define HUB_CHAR_INDV_PORT_LPSM 0x0001 /* per-port power control */
|
||||
+#define HUB_CHAR_NO_LPSM 0x0002 /* no power switching */
|
||||
#define HUB_CHAR_LPSM 0x0003
|
||||
#define HUB_CHAR_COMPOUND 0x0004
|
||||
+#define HUB_CHAR_INDV_PORT_OCPM 0x0008 /* per-port Over-current reporting */
|
||||
+#define HUB_CHAR_NO_OCPM 0x0010 /* No Over-current Protection support */
|
||||
#define HUB_CHAR_OCPM 0x0018
|
||||
#define HUB_CHAR_TTTT 0x0060 /* TT Think Time mask */
|
||||
+#define HUB_CHAR_PORTIND 0x0080 /* per-port indicators (LEDs) */
|
||||
|
||||
/*
|
||||
* Hub Status & Hub Change bit masks
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+3797
File diff suppressed because it is too large
Load Diff
+92
@@ -0,0 +1,92 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 663bfde59a56d65c031526f75f0e08126f02d845 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Tue, 27 Jul 2021 23:34:57 +0100
|
||||
Subject: [PATCH 05/16] corstone1000: enable isp1763 and usb stack
|
||||
|
||||
MPS3 board have a ISP1763 usb controller, add the correspondent mmio
|
||||
area and enable it to be used for mass storage access for example.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
board/armltd/corstone1000/corstone1000.c | 8 ++++++++
|
||||
configs/corstone1000_defconfig | 19 +++++++++----------
|
||||
2 files changed, 17 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c
|
||||
index ab98fa87fb..a51f5ddfa0 100644
|
||||
--- a/board/armltd/corstone1000/corstone1000.c
|
||||
+++ b/board/armltd/corstone1000/corstone1000.c
|
||||
@@ -46,6 +46,14 @@ static struct mm_region corstone1000_mem_map[] = {
|
||||
.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
|
||||
PTE_BLOCK_NON_SHARE |
|
||||
PTE_BLOCK_PXN | PTE_BLOCK_UXN
|
||||
+ }, {
|
||||
+ /* USB */
|
||||
+ .virt = 0x40200000UL,
|
||||
+ .phys = 0x40200000UL,
|
||||
+ .size = 0x00100000UL,
|
||||
+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
|
||||
+ PTE_BLOCK_NON_SHARE |
|
||||
+ PTE_BLOCK_PXN | PTE_BLOCK_UXN
|
||||
}, {
|
||||
/* OCVM */
|
||||
.virt = 0x80000000UL,
|
||||
diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
|
||||
index 54c746d829..fed2b16c93 100644
|
||||
--- a/configs/corstone1000_defconfig
|
||||
+++ b/configs/corstone1000_defconfig
|
||||
@@ -1,13 +1,12 @@
|
||||
CONFIG_ARM=y
|
||||
-CONFIG_ARM64=y
|
||||
CONFIG_TARGET_CORSTONE1000=y
|
||||
CONFIG_SYS_TEXT_BASE=0x02100000
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
CONFIG_NR_DRAM_BANKS=1
|
||||
CONFIG_IDENT_STRING=" corstone1000 aarch64 "
|
||||
-CONFIG_BOOTDELAY=3
|
||||
-CONFIG_OF_CONTROL=y
|
||||
CONFIG_DEFAULT_DEVICE_TREE="corstone1000-mps3"
|
||||
+CONFIG_FIT=y
|
||||
+CONFIG_BOOTDELAY=3
|
||||
CONFIG_USE_BOOTARGS=y
|
||||
CONFIG_BOOTARGS="console=ttyAMA0 loglevel=9"
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
@@ -16,12 +15,11 @@ CONFIG_HUSH_PARSER=y
|
||||
CONFIG_SYS_PROMPT="corstone1000# "
|
||||
# CONFIG_CMD_CONSOLE is not set
|
||||
CONFIG_CMD_BOOTZ=y
|
||||
-CONFIG_CMD_BOOTM=y
|
||||
# CONFIG_CMD_XIMG is not set
|
||||
# CONFIG_CMD_EDITENV is not set
|
||||
# CONFIG_CMD_ENV_EXISTS is not set
|
||||
-# CONFIG_CMD_ARMFLASH=y
|
||||
# CONFIG_CMD_LOADS is not set
|
||||
+CONFIG_CMD_USB=y
|
||||
# CONFIG_CMD_ITEST is not set
|
||||
# CONFIG_CMD_SETEXPR is not set
|
||||
CONFIG_CMD_DHCP=y
|
||||
@@ -29,12 +27,13 @@ CONFIG_CMD_DHCP=y
|
||||
CONFIG_CMD_MII=y
|
||||
CONFIG_CMD_PING=y
|
||||
CONFIG_CMD_CACHE=y
|
||||
-CONFIG_FIT=y
|
||||
-# CONFIG_CMD_MISC is not set
|
||||
CONFIG_CMD_FAT=y
|
||||
-CONFIG_DM=y
|
||||
+CONFIG_OF_CONTROL=y
|
||||
+CONFIG_REGMAP=y
|
||||
# CONFIG_MMC is not set
|
||||
-# CONFIG_MTD_NOR_FLASH=y
|
||||
CONFIG_DM_ETH=y
|
||||
CONFIG_DM_SERIAL=y
|
||||
-CONFIG_OF_LIBFDT=y
|
||||
+CONFIG_USB=y
|
||||
+CONFIG_DM_USB=y
|
||||
+CONFIG_USB_ISP1760=y
|
||||
+CONFIG_USB_STORAGE=y
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+240
@@ -0,0 +1,240 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 8244c266643d7fe77e360d2927adcd123a691dd1 Mon Sep 17 00:00:00 2001
|
||||
From: "Arpita S.K" <Arpita.S.K@arm.com>
|
||||
Date: Mon, 11 Oct 2021 11:41:25 +0530
|
||||
Subject: [PATCH 06/16] corstone1000: enable support for FVP
|
||||
|
||||
Introduces a new device tree for the FVP.
|
||||
|
||||
Signed-off-by: Arpita S.K <Arpita.S.K@arm.com>
|
||||
---
|
||||
arch/arm/dts/Makefile | 2 +
|
||||
arch/arm/dts/corstone1000-fvp.dts | 28 ++++++
|
||||
arch/arm/dts/corstone1000.dtsi | 152 ++++++++++++++++++++++++++++++
|
||||
configs/corstone1000_defconfig | 1 -
|
||||
4 files changed, 182 insertions(+), 1 deletion(-)
|
||||
create mode 100644 arch/arm/dts/corstone1000-fvp.dts
|
||||
create mode 100644 arch/arm/dts/corstone1000.dtsi
|
||||
|
||||
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
|
||||
index 9fb38682e6..c70c20b9a5 100644
|
||||
--- a/arch/arm/dts/Makefile
|
||||
+++ b/arch/arm/dts/Makefile
|
||||
@@ -1112,6 +1112,8 @@ dtb-$(CONFIG_TARGET_PRESIDIO_ASIC) += ca-presidio-engboard.dtb
|
||||
|
||||
dtb-$(CONFIG_TARGET_IMX8MM_CL_IOT_GATE) += imx8mm-cl-iot-gate.dtb
|
||||
|
||||
+dtb-$(CONFIG_TARGET_CORSTONE1000) += $(DEVICE_TREE).dtb
|
||||
+
|
||||
targets += $(dtb-y)
|
||||
|
||||
# Add any required device tree compiler flags here
|
||||
diff --git a/arch/arm/dts/corstone1000-fvp.dts b/arch/arm/dts/corstone1000-fvp.dts
|
||||
new file mode 100644
|
||||
index 0000000000..2188ca5e0e
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/dts/corstone1000-fvp.dts
|
||||
@@ -0,0 +1,28 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2021, Arm Limited. All rights reserved.
|
||||
+ *
|
||||
+ * SPDX-License-Identifier: BSD-3-Clause
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "corstone1000.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "corstone1000-fvp";
|
||||
+
|
||||
+ ethernet: eth@4010000 {
|
||||
+ compatible = "smsc,lan91c111";
|
||||
+ reg = <0x40100000 0x10000>;
|
||||
+ phy-mode = "mii";
|
||||
+ interrupt-parent = <&gic>;
|
||||
+ interrupts = <GIC_SPI 116 0xf04>;
|
||||
+ reg-io-width = <2>;
|
||||
+ smsc,irq-push-pull;
|
||||
+ };
|
||||
+
|
||||
+};
|
||||
+
|
||||
+&refclk {
|
||||
+ clock-frequency = <50000000>;
|
||||
+};
|
||||
diff --git a/arch/arm/dts/corstone1000.dtsi b/arch/arm/dts/corstone1000.dtsi
|
||||
new file mode 100644
|
||||
index 0000000000..b863193fb6
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/dts/corstone1000.dtsi
|
||||
@@ -0,0 +1,152 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2021, Arm Limited. All rights reserved.
|
||||
+ *
|
||||
+ * SPDX-License-Identifier: BSD-3-Clause
|
||||
+ */
|
||||
+
|
||||
+#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "arm,corstone1000";
|
||||
+ interrupt-parent = <&gic>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ chosen { };
|
||||
+
|
||||
+ cpus {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ cpu@0 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,armv8";
|
||||
+ reg = <0>;
|
||||
+ next-level-cache = <&L2_0>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ memory@80000000 {
|
||||
+ device_type = "memory";
|
||||
+ reg = <0x80000000 0x80000000>;
|
||||
+ };
|
||||
+
|
||||
+ gic: interrupt-controller@1c000000 {
|
||||
+ compatible = "arm,gic-400";
|
||||
+ #interrupt-cells = <3>;
|
||||
+ #address-cells = <0>;
|
||||
+ interrupt-controller;
|
||||
+ reg = <0x1c010000 0x1000>,
|
||||
+ <0x1c02f000 0x2000>,
|
||||
+ <0x1c04f000 0x1000>,
|
||||
+ <0x1c06f000 0x2000>;
|
||||
+ interrupts = <1 9 0xf08>;
|
||||
+ };
|
||||
+
|
||||
+ L2_0: l2-cache0 {
|
||||
+ compatible = "cache";
|
||||
+ };
|
||||
+
|
||||
+ refclk100mhz: refclk100mhz {
|
||||
+ compatible = "fixed-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-frequency = <100000000>;
|
||||
+ clock-output-names = "apb_pclk";
|
||||
+ };
|
||||
+
|
||||
+ smbclk: refclk24mhzx2 {
|
||||
+ /* Reference 24MHz clock x 2 */
|
||||
+ compatible = "fixed-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-frequency = <48000000>;
|
||||
+ clock-output-names = "smclk";
|
||||
+ };
|
||||
+
|
||||
+ uartclk: uartclk {
|
||||
+ /* UART clock - 50MHz */
|
||||
+ compatible = "fixed-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-frequency = <50000000>;
|
||||
+ clock-output-names = "uartclk";
|
||||
+ };
|
||||
+
|
||||
+ serial0: uart@1a510000 {
|
||||
+ compatible = "arm,pl011", "arm,primecell";
|
||||
+ reg = <0x1a510000 0x1000>;
|
||||
+ interrupt-parent = <&gic>;
|
||||
+ interrupts = <0 19 4>;
|
||||
+ clocks = <&uartclk>, <&refclk100mhz>;
|
||||
+ clock-names = "uartclk", "apb_pclk";
|
||||
+ };
|
||||
+
|
||||
+ timer {
|
||||
+ compatible = "arm,armv8-timer";
|
||||
+ interrupts = <1 13 0xf08>,
|
||||
+ <1 14 0xf08>,
|
||||
+ <1 11 0xf08>,
|
||||
+ <1 10 0xf08>;
|
||||
+ };
|
||||
+
|
||||
+ refclk: refclk@1a220000 {
|
||||
+ compatible = "arm,armv7-timer-mem";
|
||||
+ reg = <0x1a220000 0x1000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges;
|
||||
+
|
||||
+ frame@1a230000 {
|
||||
+ frame-number = <0>;
|
||||
+ interrupts = <0 2 0xf04>;
|
||||
+ reg = <0x1a230000 0x1000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ mbox_es0mhu0: mhu@1b000000 {
|
||||
+ compatible = "arm,mhuv2","arm,primecell";
|
||||
+ reg = <0x1b000000 0x1000>,
|
||||
+ <0x1b010000 0x1000>;
|
||||
+ clocks = <&refclk100mhz>;
|
||||
+ clock-names = "apb_pclk";
|
||||
+ interrupts = <0 12 4>;
|
||||
+ interrupt-names = "mhu_rx";
|
||||
+ #mbox-cells = <1>;
|
||||
+ mbox-name = "arm-es0-mhu0";
|
||||
+ };
|
||||
+
|
||||
+ mbox_es0mhu1: mhu@1b020000 {
|
||||
+ compatible = "arm,mhuv2","arm,primecell";
|
||||
+ reg = <0x1b020000 0x1000>,
|
||||
+ <0x1b030000 0x1000>;
|
||||
+ clocks = <&refclk100mhz>;
|
||||
+ clock-names = "apb_pclk";
|
||||
+ interrupts = <0 47 4>;
|
||||
+ interrupt-names = "mhu_rx";
|
||||
+ #mbox-cells = <1>;
|
||||
+ mbox-name = "arm-es0-mhu1";
|
||||
+ };
|
||||
+
|
||||
+ mbox_semhu1: mhu@1b820000 {
|
||||
+ compatible = "arm,mhuv2","arm,primecell";
|
||||
+ reg = <0x1b820000 0x1000>,
|
||||
+ <0x1b830000 0x1000>;
|
||||
+ clocks = <&refclk100mhz>;
|
||||
+ clock-names = "apb_pclk";
|
||||
+ interrupts = <0 45 4>;
|
||||
+ interrupt-names = "mhu_rx";
|
||||
+ #mbox-cells = <1>;
|
||||
+ mbox-name = "arm-se-mhu1";
|
||||
+ };
|
||||
+
|
||||
+ client {
|
||||
+ compatible = "arm,client";
|
||||
+ mboxes = <&mbox_es0mhu0 0>, <&mbox_es0mhu1 0>, <&mbox_semhu1 0>;
|
||||
+ mbox-names = "es0mhu0", "es0mhu1", "semhu1";
|
||||
+ };
|
||||
+
|
||||
+ extsys0: extsys@1A010310 {
|
||||
+ compatible = "arm,extsys_ctrl";
|
||||
+ reg = <0x1A010310 0x4>,
|
||||
+ <0x1A010314 0x4>;
|
||||
+ reg-names = "rstreg", "streg";
|
||||
+ };
|
||||
+};
|
||||
diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
|
||||
index fed2b16c93..c7f291efb6 100644
|
||||
--- a/configs/corstone1000_defconfig
|
||||
+++ b/configs/corstone1000_defconfig
|
||||
@@ -4,7 +4,6 @@ CONFIG_SYS_TEXT_BASE=0x02100000
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
CONFIG_NR_DRAM_BANKS=1
|
||||
CONFIG_IDENT_STRING=" corstone1000 aarch64 "
|
||||
-CONFIG_DEFAULT_DEVICE_TREE="corstone1000-mps3"
|
||||
CONFIG_FIT=y
|
||||
CONFIG_BOOTDELAY=3
|
||||
CONFIG_USE_BOOTARGS=y
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From b50c1457fcd05cddf633bff074fc5edecff22e7e Mon Sep 17 00:00:00 2001
|
||||
From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
|
||||
Date: Wed, 25 Aug 2021 16:50:40 +0100
|
||||
Subject: [PATCH 07/16] arm: corstone1000: sharing PSCI DTS node between FVP
|
||||
and MPS3
|
||||
|
||||
At this level of development PSCI is needed to initialize the SMCCC.
|
||||
|
||||
SMCCC is needed by FF-A and it is relevant to the MPS3 and FVP.
|
||||
|
||||
Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
|
||||
---
|
||||
arch/arm/dts/corstone1000.dtsi | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/dts/corstone1000.dtsi b/arch/arm/dts/corstone1000.dtsi
|
||||
index b863193fb6..da1725e01f 100644
|
||||
--- a/arch/arm/dts/corstone1000.dtsi
|
||||
+++ b/arch/arm/dts/corstone1000.dtsi
|
||||
@@ -149,4 +149,8 @@
|
||||
<0x1A010314 0x4>;
|
||||
reg-names = "rstreg", "streg";
|
||||
};
|
||||
+ psci {
|
||||
+ compatible = "arm,psci-1.0", "arm,psci-0.2";
|
||||
+ method = "smc";
|
||||
+ };
|
||||
};
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 9a045bf04210bf9a00803fc47016e1af59d31e8f Mon Sep 17 00:00:00 2001
|
||||
From: "Arpita S.K" <Arpita.S.K@arm.com>
|
||||
Date: Mon, 11 Oct 2021 11:45:41 +0530
|
||||
Subject: [PATCH 08/16] arm: corstone1000: Emulated RTC Support
|
||||
|
||||
This patch adds the options that should be
|
||||
enabled to turn on emulated RTC support.
|
||||
|
||||
Signed-off-by: Arpita S.K <Arpita.S.K@arm.com>
|
||||
---
|
||||
configs/corstone1000_defconfig | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
|
||||
index c7f291efb6..dbe3c9e3f3 100644
|
||||
--- a/configs/corstone1000_defconfig
|
||||
+++ b/configs/corstone1000_defconfig
|
||||
@@ -36,3 +36,8 @@ CONFIG_USB=y
|
||||
CONFIG_DM_USB=y
|
||||
CONFIG_USB_ISP1760=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
+CONFIG_DM_RTC=y
|
||||
+CONFIG_CMD_RTC=y
|
||||
+CONFIG_EFI_GET_TIME=y
|
||||
+CONFIG_EFI_SET_TIME=y
|
||||
+CONFIG_RTC_EMULATION=y
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From b720b166364407ceb05385f5e72cb238195622ad Mon Sep 17 00:00:00 2001
|
||||
From: Vishnu Banavath <vishnu.banavath@arm.com>
|
||||
Date: Wed, 1 Sep 2021 18:33:32 +0100
|
||||
Subject: [PATCH 09/16] arm: corstone1000: execute uboot from DDR
|
||||
|
||||
Previously uboot was executing from CVM. With the addition of
|
||||
secure partitions in optee, uboot has been moved to DDR.
|
||||
|
||||
Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
|
||||
---
|
||||
configs/corstone1000_defconfig | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
|
||||
index dbe3c9e3f3..af1c5ecd89 100644
|
||||
--- a/configs/corstone1000_defconfig
|
||||
+++ b/configs/corstone1000_defconfig
|
||||
@@ -1,6 +1,6 @@
|
||||
CONFIG_ARM=y
|
||||
CONFIG_TARGET_CORSTONE1000=y
|
||||
-CONFIG_SYS_TEXT_BASE=0x02100000
|
||||
+CONFIG_SYS_TEXT_BASE=0x80000000
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
CONFIG_NR_DRAM_BANKS=1
|
||||
CONFIG_IDENT_STRING=" corstone1000 aarch64 "
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+177
@@ -0,0 +1,177 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 5278fb64beabeddd6c80229e5165f91ed1e95376 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 24 Jun 2021 09:25:00 +0100
|
||||
Subject: [PATCH 10/16] cmd: load: add load command for memory mapped
|
||||
|
||||
cp.b is used a lot as a way to load binaries to memory and execute
|
||||
them, however we may need to integrate this with the efi subsystem to
|
||||
set it up as a bootdev.
|
||||
|
||||
So, introduce a loadm command that will be consistent with the other
|
||||
loadX commands and will call the efi API's.
|
||||
|
||||
ex: loadm $kernel_addr $kernel_addr_r $kernel_size
|
||||
|
||||
with this a kernel with CONFIG_EFI_STUB enabled will be loaded and
|
||||
then subsequently booted with bootefi command.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
cmd/Kconfig | 6 ++++
|
||||
cmd/bootefi.c | 12 ++++++++
|
||||
cmd/load.c | 49 ++++++++++++++++++++++++++++++++
|
||||
include/efi_loader.h | 2 ++
|
||||
lib/efi_loader/efi_device_path.c | 10 +++++++
|
||||
5 files changed, 79 insertions(+)
|
||||
|
||||
diff --git a/cmd/Kconfig b/cmd/Kconfig
|
||||
index a9fb4eead2..56fa0ceade 100644
|
||||
--- a/cmd/Kconfig
|
||||
+++ b/cmd/Kconfig
|
||||
@@ -1048,6 +1048,12 @@ config CMD_LOADB
|
||||
help
|
||||
Load a binary file over serial line.
|
||||
|
||||
+config CMD_LOADM
|
||||
+ bool "loadm"
|
||||
+ default y
|
||||
+ help
|
||||
+ Load a binary over memory mapped.
|
||||
+
|
||||
config CMD_LOADS
|
||||
bool "loads"
|
||||
default y
|
||||
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
|
||||
index cba81ffe75..9e1b91c89e 100644
|
||||
--- a/cmd/bootefi.c
|
||||
+++ b/cmd/bootefi.c
|
||||
@@ -34,6 +34,18 @@ static struct efi_device_path *bootefi_device_path;
|
||||
static void *image_addr;
|
||||
static size_t image_size;
|
||||
|
||||
+/**
|
||||
+ * efi_get_image_parameters() - return image parameters
|
||||
+ *
|
||||
+ * @img_addr: address of loaded image in memory
|
||||
+ * @img_size: size of loaded image
|
||||
+ */
|
||||
+void efi_get_image_parameters(void **img_addr, size_t *img_size)
|
||||
+{
|
||||
+ *img_addr = image_addr;
|
||||
+ *img_size = image_size;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* efi_clear_bootdev() - clear boot device
|
||||
*/
|
||||
diff --git a/cmd/load.c b/cmd/load.c
|
||||
index b7894d7db0..4de197681c 100644
|
||||
--- a/cmd/load.c
|
||||
+++ b/cmd/load.c
|
||||
@@ -1020,6 +1020,45 @@ static ulong load_serial_ymodem(ulong offset, int mode)
|
||||
|
||||
#endif
|
||||
|
||||
+#if defined(CONFIG_CMD_LOADM)
|
||||
+static int do_load_memory_bin(struct cmd_tbl *cmdtp, int flag, int argc,
|
||||
+ char *const argv[])
|
||||
+{
|
||||
+ ulong addr, dest, size;
|
||||
+ void *src, *dst;
|
||||
+
|
||||
+ if (argc != 4)
|
||||
+ return CMD_RET_USAGE;
|
||||
+
|
||||
+ addr = simple_strtoul(argv[1], NULL, 16);
|
||||
+
|
||||
+ dest = simple_strtoul(argv[2], NULL, 16);
|
||||
+
|
||||
+ size = simple_strtoul(argv[3], NULL, 16);
|
||||
+
|
||||
+
|
||||
+ if (!size) {
|
||||
+ puts ("can not load zero bytes\n");
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ src = map_sysmem(addr, size);
|
||||
+ dst = map_sysmem(dest, size);
|
||||
+
|
||||
+ memcpy(dst, src, size);
|
||||
+
|
||||
+ unmap_sysmem(src);
|
||||
+ unmap_sysmem(dst);
|
||||
+
|
||||
+ if (IS_ENABLED(CONFIG_CMD_BOOTEFI))
|
||||
+ efi_set_bootdev("Mem", "", "", map_sysmem(dest, 0), size);
|
||||
+
|
||||
+ printf("loaded bin to memory: size: %lu\n", size);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_CMD_LOADS)
|
||||
@@ -1094,3 +1133,13 @@ U_BOOT_CMD(
|
||||
);
|
||||
|
||||
#endif /* CONFIG_CMD_LOADB */
|
||||
+
|
||||
+#if defined(CONFIG_CMD_LOADM)
|
||||
+U_BOOT_CMD(
|
||||
+ loadm, 4, 0, do_load_memory_bin,
|
||||
+ "load binary blob from two addresses",
|
||||
+ "[src_addr] [dst_addr] [size]\n"
|
||||
+ " - load a binary blob from one memory location to other"
|
||||
+ " from src_addr to dst_addr by size bytes"
|
||||
+);
|
||||
+#endif /* CONFIG_CMD_LOADM */
|
||||
diff --git a/include/efi_loader.h b/include/efi_loader.h
|
||||
index b81180cfda..fc4f1ec67a 100644
|
||||
--- a/include/efi_loader.h
|
||||
+++ b/include/efi_loader.h
|
||||
@@ -485,6 +485,8 @@ void efi_save_gd(void);
|
||||
void efi_restore_gd(void);
|
||||
/* Call this to relocate the runtime section to an address space */
|
||||
void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map);
|
||||
+/* Call this to get image parameters */
|
||||
+void efi_get_image_parameters(void **img_addr, size_t *img_size);
|
||||
/* Call this to set the current device name */
|
||||
void efi_set_bootdev(const char *dev, const char *devnr, const char *path,
|
||||
void *buffer, size_t buffer_size);
|
||||
diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c
|
||||
index 76c2f82fe6..a610b6ff0e 100644
|
||||
--- a/lib/efi_loader/efi_device_path.c
|
||||
+++ b/lib/efi_loader/efi_device_path.c
|
||||
@@ -1170,6 +1170,8 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
|
||||
{
|
||||
struct blk_desc *desc = NULL;
|
||||
struct disk_partition fs_partition;
|
||||
+ size_t image_size;
|
||||
+ void *image_addr;
|
||||
int part = 0;
|
||||
char *filename;
|
||||
char *s;
|
||||
@@ -1185,6 +1187,14 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
|
||||
} else if (!strcmp(dev, "Uart")) {
|
||||
if (device)
|
||||
*device = efi_dp_from_uart();
|
||||
+ } else if (!strcmp(dev, "Mem")) {
|
||||
+
|
||||
+ efi_get_image_parameters(&image_addr, &image_size);
|
||||
+
|
||||
+ if (device)
|
||||
+ *device = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
|
||||
+ (uintptr_t)image_addr,
|
||||
+ image_size);
|
||||
} else {
|
||||
part = blk_get_device_part_str(dev, devnr, &desc, &fs_partition,
|
||||
1);
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 283cae5b37eced831080a50d76006359662fb6bf Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Wed, 23 Jun 2021 00:45:38 +0100
|
||||
Subject: [PATCH 11/16] arm: corstone1000: enable boot using uefi
|
||||
|
||||
In a way to prepare future use of uefi features, enable booting using
|
||||
the bootefi binary loading.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@arm.com>
|
||||
---
|
||||
configs/corstone1000_defconfig | 7 +++++++
|
||||
include/configs/corstone1000.h | 6 +++---
|
||||
2 files changed, 10 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
|
||||
index af1c5ecd89..aa664029fc 100644
|
||||
--- a/configs/corstone1000_defconfig
|
||||
+++ b/configs/corstone1000_defconfig
|
||||
@@ -2,6 +2,7 @@ CONFIG_ARM=y
|
||||
CONFIG_TARGET_CORSTONE1000=y
|
||||
CONFIG_SYS_TEXT_BASE=0x80000000
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
+CONFIG_SYS_LOAD_ADDR=0x82100000
|
||||
CONFIG_NR_DRAM_BANKS=1
|
||||
CONFIG_IDENT_STRING=" corstone1000 aarch64 "
|
||||
CONFIG_FIT=y
|
||||
@@ -14,6 +15,12 @@ CONFIG_HUSH_PARSER=y
|
||||
CONFIG_SYS_PROMPT="corstone1000# "
|
||||
# CONFIG_CMD_CONSOLE is not set
|
||||
CONFIG_CMD_BOOTZ=y
|
||||
+CONFIG_CMD_BOOTM=y
|
||||
+CONFIG_CMD_LOADM=y
|
||||
+CONFIG_CMD_BOOTEFI=y
|
||||
+CONFIG_EFI_LOADER=y
|
||||
+CONFIG_CMD_BOOTEFI_HELLO_COMPILE=y
|
||||
+CONFIG_CMD_BOOTEFI_HELLO=y
|
||||
# CONFIG_CMD_XIMG is not set
|
||||
# CONFIG_CMD_EDITENV is not set
|
||||
# CONFIG_CMD_ENV_EXISTS is not set
|
||||
diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
|
||||
index 389ac45a58..5e22e075ad 100644
|
||||
--- a/include/configs/corstone1000.h
|
||||
+++ b/include/configs/corstone1000.h
|
||||
@@ -70,7 +70,7 @@
|
||||
"fdt_high=0xffffffff\0"
|
||||
|
||||
#define CONFIG_BOOTCOMMAND \
|
||||
- "echo Copying Kernel to memory ... ;" \
|
||||
- "cp.b $kernel_addr $kernel_addr_r 0xc00000;" \
|
||||
- "booti $kernel_addr_r - $fdtcontroladdr; "
|
||||
+ "echo Loading Kernel to memory ... ;" \
|
||||
+ "loadm $kernel_addr $kernel_addr_r 0xc00000;" \
|
||||
+ "bootefi $kernel_addr_r $fdtcontroladdr;"
|
||||
#endif
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From e49597b8d9058d8c5b925339b0041fd7096c622d Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Tue, 14 Sep 2021 10:46:49 +0100
|
||||
Subject: [PATCH 12/16] arm: corstone1000: enable uefi secure boot
|
||||
|
||||
To make it possible to have a secure way to execute UEFI images
|
||||
enable UEFI secure boot support and by inherit the
|
||||
cryptographic functionalities.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
configs/corstone1000_defconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
|
||||
index aa664029fc..a8651287ed 100644
|
||||
--- a/configs/corstone1000_defconfig
|
||||
+++ b/configs/corstone1000_defconfig
|
||||
@@ -43,6 +43,7 @@ CONFIG_USB=y
|
||||
CONFIG_DM_USB=y
|
||||
CONFIG_USB_ISP1760=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
+CONFIG_EFI_SECURE_BOOT=y
|
||||
CONFIG_DM_RTC=y
|
||||
CONFIG_CMD_RTC=y
|
||||
CONFIG_EFI_GET_TIME=y
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From de37d61d1414cb6408390412cf77d7a88f8964e1 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Tue, 14 Sep 2021 22:00:47 +0100
|
||||
Subject: [PATCH 13/16] arm: corstone1000: enable handlers for uefi variables
|
||||
|
||||
Enable the setenv/printenv -e option to handle uefi
|
||||
variables and the efidebug command.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
configs/corstone1000_defconfig | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
|
||||
index a8651287ed..b17e2df47b 100644
|
||||
--- a/configs/corstone1000_defconfig
|
||||
+++ b/configs/corstone1000_defconfig
|
||||
@@ -24,6 +24,7 @@ CONFIG_CMD_BOOTEFI_HELLO=y
|
||||
# CONFIG_CMD_XIMG is not set
|
||||
# CONFIG_CMD_EDITENV is not set
|
||||
# CONFIG_CMD_ENV_EXISTS is not set
|
||||
+CONFIG_CMD_NVEDIT_EFI=y
|
||||
# CONFIG_CMD_LOADS is not set
|
||||
CONFIG_CMD_USB=y
|
||||
# CONFIG_CMD_ITEST is not set
|
||||
@@ -33,6 +34,7 @@ CONFIG_CMD_DHCP=y
|
||||
CONFIG_CMD_MII=y
|
||||
CONFIG_CMD_PING=y
|
||||
CONFIG_CMD_CACHE=y
|
||||
+CONFIG_CMD_EFIDEBUG=y
|
||||
CONFIG_CMD_FAT=y
|
||||
CONFIG_OF_CONTROL=y
|
||||
CONFIG_REGMAP=y
|
||||
@@ -43,6 +45,7 @@ CONFIG_USB=y
|
||||
CONFIG_DM_USB=y
|
||||
CONFIG_USB_ISP1760=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
+# CONFIG_HEXDUMP is not set
|
||||
CONFIG_EFI_SECURE_BOOT=y
|
||||
CONFIG_DM_RTC=y
|
||||
CONFIG_CMD_RTC=y
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From fe0acf22a0c30f7d3eb1a8c66fb423b4146d35ab Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Tue, 14 Sep 2021 22:07:15 +0100
|
||||
Subject: [PATCH 14/16] arm: dipha: enable efi capsule options
|
||||
|
||||
Enable the set of efi capsule config options to enable the
|
||||
variables.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
configs/corstone1000_defconfig | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
|
||||
index b17e2df47b..cfe80cf5f4 100644
|
||||
--- a/configs/corstone1000_defconfig
|
||||
+++ b/configs/corstone1000_defconfig
|
||||
@@ -46,6 +46,12 @@ CONFIG_DM_USB=y
|
||||
CONFIG_USB_ISP1760=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
# CONFIG_HEXDUMP is not set
|
||||
+CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y
|
||||
+CONFIG_EFI_CAPSULE_ON_DISK=y
|
||||
+CONFIG_EFI_CAPSULE_ON_DISK_EARLY=y
|
||||
+CONFIG_EFI_CAPSULE_AUTHENTICATE=y
|
||||
+CONFIG_EFI_CAPSULE_FIRMWARE_FIT=y
|
||||
+CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y
|
||||
CONFIG_EFI_SECURE_BOOT=y
|
||||
CONFIG_DM_RTC=y
|
||||
CONFIG_CMD_RTC=y
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@@ -2,6 +2,32 @@
|
||||
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
#
|
||||
# Corstone1000 64-bit machines
|
||||
#
|
||||
|
||||
CORSTONE1000_DEVICE_TREE:corstone1000-fvp = "corstone1000-fvp"
|
||||
EXTRA_OEMAKE:append:corstone1000 = ' DEVICE_TREE=${CORSTONE1000_DEVICE_TREE}'
|
||||
|
||||
SYSROOT_DIRS:append:corstone1000 = " /boot"
|
||||
|
||||
SRC_URI:append:corstone1000 = " \
|
||||
file://0001-arm-add-corstone1000-platform.patch \
|
||||
file://0002-arm-corstone1000-enable-devicetree-in-defconfig.patch \
|
||||
file://0003-usb-common-move-urb-code-to-common.patch \
|
||||
file://0004-usb-add-isp1760-family-driver.patch \
|
||||
file://0005-corstone1000-enable-isp1763-and-usb-stack.patch \
|
||||
file://0006-corstone1000-enable-support-for-FVP.patch \
|
||||
file://0007-arm-corstone1000-sharing-PSCI-DTS-node-between-FVP-a.patch \
|
||||
file://0008-arm-corstone1000-Emulated-RTC-Support.patch \
|
||||
file://0009-arm-corstone1000-execute-uboot-from-DDR.patch \
|
||||
file://0010-cmd-load-add-load-command-for-memory-mapped.patch \
|
||||
file://0011-arm-corstone1000-enable-boot-using-uefi.patch \
|
||||
file://0012-arm-corstone1000-enable-uefi-secure-boot.patch \
|
||||
file://0013-arm-corstone1000-enable-handlers-for-uefi-variables.patch \
|
||||
file://0014-arm-corstone1000-enable-efi-capsule-options.patch \
|
||||
"
|
||||
|
||||
#
|
||||
# FVP BASE
|
||||
#
|
||||
|
||||
@@ -4043,16 +4043,16 @@ diff --git a/Platform/ARM/N1Sdp/N1SdpPlatform.dsc b/Platform/ARM/N1Sdp/N1SdpPlat
|
||||
index 1b46eb2734..b59a563806 100644
|
||||
--- a/Platform/ARM/N1Sdp/N1SdpPlatform.dsc
|
||||
+++ b/Platform/ARM/N1Sdp/N1SdpPlatform.dsc
|
||||
@@ -22,6 +22,8 @@
|
||||
BUILD_NUMBER = 1
|
||||
@@ -23,6 +23,8 @@
|
||||
|
||||
!include Platform/ARM/VExpressPkg/ArmVExpress.dsc.inc
|
||||
!include MdePkg/MdeLibs.dsc.inc
|
||||
+!include DynamicTablesPkg/DynamicTables.dsc.inc
|
||||
+!include Platform/ARM/N1Sdp/ConfigurationManager/ConfigurationManager.dsc.inc
|
||||
|
||||
[LibraryClasses.common]
|
||||
ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
|
||||
@@ -152,6 +154,9 @@
|
||||
@@ -153,6 +155,9 @@
|
||||
gArmPlatformTokenSpaceGuid.PcdCoreCount|2
|
||||
gArmPlatformTokenSpaceGuid.PcdClusterCount|2
|
||||
|
||||
@@ -4062,7 +4062,7 @@ index 1b46eb2734..b59a563806 100644
|
||||
# Runtime Variable storage
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvModeEnable|TRUE
|
||||
@@ -211,6 +216,10 @@
|
||||
@@ -212,6 +217,10 @@
|
||||
BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
SUMMARY = "MCUboot's image signing and key management"
|
||||
LICENSE = "Apache-2.0"
|
||||
AUTHOR = "The MCUboot committers <mcuboot@groups.io>, \
|
||||
Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>"
|
||||
|
||||
LIC_FILES_CHKSUM = "file://PKG-INFO;md5=e32b214fd9c204b77a99a97aa903757b"
|
||||
|
||||
SRC_URI[md5sum] = "de0005dc13ce9e5e6aecdedfd0956286"
|
||||
|
||||
DEPENDS:corstone1000 = "python3-cryptography python3-intelhex python3-click python3-cbor"
|
||||
|
||||
inherit pypi setuptools3
|
||||
|
||||
BBCLASSEXTEND = "native nativesdk"
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
define KMACHINE corstone1000
|
||||
define KTYPE standard
|
||||
define KARCH arm64
|
||||
|
||||
kconf hardware corstone1000/base.cfg
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
CONFIG_LOCALVERSION="-yocto-standard"
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_LOG_BUF_SHIFT=12
|
||||
# CONFIG_UTS_NS is not set
|
||||
# CONFIG_PID_NS is not set
|
||||
# CONFIG_NET_NS is not set
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
CONFIG_ARM64=y
|
||||
CONFIG_THUMB2_KERNEL=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_VFP=y
|
||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_WLAN is not set
|
||||
# CONFIG_SERIO_SERPORT is not set
|
||||
CONFIG_SERIAL_AMBA_PL011=y
|
||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_PL031=y
|
||||
CONFIG_MAILBOX=y
|
||||
# CONFIG_CRYPTO_HW is not set
|
||||
+1
-2
@@ -1,14 +1,13 @@
|
||||
include features/input/input.scc
|
||||
include cfg/timer/no_hz.scc
|
||||
include cfg/virtio.scc
|
||||
|
||||
kconf hardware fvp-arm32/fvp-board.cfg
|
||||
kconf hardware fvp-arm32/fvp-features.cfg
|
||||
kconf hardware fvp/fvp-net.cfg
|
||||
kconf hardware fvp/fvp-rtc.cfg
|
||||
kconf hardware fvp/fvp-serial.cfg
|
||||
kconf hardware fvp/fvp-virtio.cfg
|
||||
kconf hardware fvp/fvp-cfi.cfg
|
||||
kconf hardware fvp/fvp-drm.cfg
|
||||
kconf hardware fvp/fvp-timer.cfg
|
||||
kconf hardware fvp/fvp-virtio.cfg
|
||||
kconf hardware fvp/fvp-watchdog.cfg
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
include features/input/input.scc
|
||||
include features/net/net.scc
|
||||
include cfg/timer/no_hz.scc
|
||||
include cfg/virtio.scc
|
||||
|
||||
kconf hardware fvp/fvp-board.cfg
|
||||
kconf hardware fvp/fvp-net.cfg
|
||||
kconf hardware fvp/fvp-rtc.cfg
|
||||
kconf hardware fvp/fvp-serial.cfg
|
||||
kconf hardware fvp/fvp-virtio.cfg
|
||||
kconf hardware fvp/fvp-cfi.cfg
|
||||
kconf hardware fvp/fvp-drm.cfg
|
||||
kconf hardware fvp/fvp-timer.cfg
|
||||
kconf hardware fvp/fvp-virtio.cfg
|
||||
kconf hardware fvp/fvp-watchdog.cfg
|
||||
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
CONFIG_VIRTIO=y
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
CONFIG_BLOCK=y
|
||||
CONFIG_VIRTIO_BLK=y
|
||||
+191
@@ -0,0 +1,191 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From abfabc8ae3bd625f57fa35d25f2435bb6465a3b1 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 13 May 2021 09:47:09 +0100
|
||||
Subject: [PATCH 01/23] usb: isp1760: fix strict typechecking
|
||||
|
||||
There are a lot of pre-existing typechecking warnings around the
|
||||
access and assign of elements of ptd structure of __dw type.
|
||||
|
||||
sparse: warning: invalid assignment: |=
|
||||
sparse: left side has type restricted __dw
|
||||
sparse: right side has type unsigned int
|
||||
|
||||
or
|
||||
|
||||
warning: restricted __dw degrades to integer
|
||||
|
||||
or
|
||||
|
||||
sparse: warning: incorrect type in assignment (different base types)
|
||||
sparse: expected restricted __dw [usertype] dw4
|
||||
sparse: got unsigned int [assigned] [usertype] usof
|
||||
|
||||
To handle this, annotate conversions along the {TO,FROM}_DW* macros
|
||||
and some assignments and function arguments.
|
||||
|
||||
This clean up completely all sparse warnings for this driver.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210513084717.2487366-2-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 92 ++++++++++++++++---------------
|
||||
1 file changed, 47 insertions(+), 45 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index 33ae656c4b68..0e0a4b01c710 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -66,44 +66,46 @@ struct ptd {
|
||||
#define ATL_PTD_OFFSET 0x0c00
|
||||
#define PAYLOAD_OFFSET 0x1000
|
||||
|
||||
-
|
||||
-/* ATL */
|
||||
-/* DW0 */
|
||||
-#define DW0_VALID_BIT 1
|
||||
-#define FROM_DW0_VALID(x) ((x) & 0x01)
|
||||
-#define TO_DW0_LENGTH(x) (((u32) x) << 3)
|
||||
-#define TO_DW0_MAXPACKET(x) (((u32) x) << 18)
|
||||
-#define TO_DW0_MULTI(x) (((u32) x) << 29)
|
||||
-#define TO_DW0_ENDPOINT(x) (((u32) x) << 31)
|
||||
+#define TO_DW(x) ((__force __dw)x)
|
||||
+#define TO_U32(x) ((__force u32)x)
|
||||
+
|
||||
+ /* ATL */
|
||||
+ /* DW0 */
|
||||
+#define DW0_VALID_BIT TO_DW(1)
|
||||
+#define FROM_DW0_VALID(x) (TO_U32(x) & 0x01)
|
||||
+#define TO_DW0_LENGTH(x) TO_DW((((u32)x) << 3))
|
||||
+#define TO_DW0_MAXPACKET(x) TO_DW((((u32)x) << 18))
|
||||
+#define TO_DW0_MULTI(x) TO_DW((((u32)x) << 29))
|
||||
+#define TO_DW0_ENDPOINT(x) TO_DW((((u32)x) << 31))
|
||||
/* DW1 */
|
||||
-#define TO_DW1_DEVICE_ADDR(x) (((u32) x) << 3)
|
||||
-#define TO_DW1_PID_TOKEN(x) (((u32) x) << 10)
|
||||
-#define DW1_TRANS_BULK ((u32) 2 << 12)
|
||||
-#define DW1_TRANS_INT ((u32) 3 << 12)
|
||||
-#define DW1_TRANS_SPLIT ((u32) 1 << 14)
|
||||
-#define DW1_SE_USB_LOSPEED ((u32) 2 << 16)
|
||||
-#define TO_DW1_PORT_NUM(x) (((u32) x) << 18)
|
||||
-#define TO_DW1_HUB_NUM(x) (((u32) x) << 25)
|
||||
+#define TO_DW1_DEVICE_ADDR(x) TO_DW((((u32)x) << 3))
|
||||
+#define TO_DW1_PID_TOKEN(x) TO_DW((((u32)x) << 10))
|
||||
+#define DW1_TRANS_BULK TO_DW(((u32)2 << 12))
|
||||
+#define DW1_TRANS_INT TO_DW(((u32)3 << 12))
|
||||
+#define DW1_TRANS_SPLIT TO_DW(((u32)1 << 14))
|
||||
+#define DW1_SE_USB_LOSPEED TO_DW(((u32)2 << 16))
|
||||
+#define TO_DW1_PORT_NUM(x) TO_DW((((u32)x) << 18))
|
||||
+#define TO_DW1_HUB_NUM(x) TO_DW((((u32)x) << 25))
|
||||
/* DW2 */
|
||||
-#define TO_DW2_DATA_START_ADDR(x) (((u32) x) << 8)
|
||||
-#define TO_DW2_RL(x) ((x) << 25)
|
||||
-#define FROM_DW2_RL(x) (((x) >> 25) & 0xf)
|
||||
+#define TO_DW2_DATA_START_ADDR(x) TO_DW((((u32)x) << 8))
|
||||
+#define TO_DW2_RL(x) TO_DW(((x) << 25))
|
||||
+#define FROM_DW2_RL(x) ((TO_U32(x) >> 25) & 0xf)
|
||||
/* DW3 */
|
||||
-#define FROM_DW3_NRBYTESTRANSFERRED(x) ((x) & 0x7fff)
|
||||
-#define FROM_DW3_SCS_NRBYTESTRANSFERRED(x) ((x) & 0x07ff)
|
||||
-#define TO_DW3_NAKCOUNT(x) ((x) << 19)
|
||||
-#define FROM_DW3_NAKCOUNT(x) (((x) >> 19) & 0xf)
|
||||
-#define TO_DW3_CERR(x) ((x) << 23)
|
||||
-#define FROM_DW3_CERR(x) (((x) >> 23) & 0x3)
|
||||
-#define TO_DW3_DATA_TOGGLE(x) ((x) << 25)
|
||||
-#define FROM_DW3_DATA_TOGGLE(x) (((x) >> 25) & 0x1)
|
||||
-#define TO_DW3_PING(x) ((x) << 26)
|
||||
-#define FROM_DW3_PING(x) (((x) >> 26) & 0x1)
|
||||
-#define DW3_ERROR_BIT (1 << 28)
|
||||
-#define DW3_BABBLE_BIT (1 << 29)
|
||||
-#define DW3_HALT_BIT (1 << 30)
|
||||
-#define DW3_ACTIVE_BIT (1 << 31)
|
||||
-#define FROM_DW3_ACTIVE(x) (((x) >> 31) & 0x01)
|
||||
+#define FROM_DW3_NRBYTESTRANSFERRED(x) TO_U32((x) & 0x7fff)
|
||||
+#define FROM_DW3_SCS_NRBYTESTRANSFERRED(x) TO_U32((x) & 0x07ff)
|
||||
+#define TO_DW3_NAKCOUNT(x) TO_DW(((x) << 19))
|
||||
+#define FROM_DW3_NAKCOUNT(x) ((TO_U32(x) >> 19) & 0xf)
|
||||
+#define TO_DW3_CERR(x) TO_DW(((x) << 23))
|
||||
+#define FROM_DW3_CERR(x) ((TO_U32(x) >> 23) & 0x3)
|
||||
+#define TO_DW3_DATA_TOGGLE(x) TO_DW(((x) << 25))
|
||||
+#define FROM_DW3_DATA_TOGGLE(x) ((TO_U32(x) >> 25) & 0x1)
|
||||
+#define TO_DW3_PING(x) TO_DW(((x) << 26))
|
||||
+#define FROM_DW3_PING(x) ((TO_U32(x) >> 26) & 0x1)
|
||||
+#define DW3_ERROR_BIT TO_DW((1 << 28))
|
||||
+#define DW3_BABBLE_BIT TO_DW((1 << 29))
|
||||
+#define DW3_HALT_BIT TO_DW((1 << 30))
|
||||
+#define DW3_ACTIVE_BIT TO_DW((1 << 31))
|
||||
+#define FROM_DW3_ACTIVE(x) ((TO_U32(x) >> 31) & 0x01)
|
||||
|
||||
#define INT_UNDERRUN (1 << 2)
|
||||
#define INT_BABBLE (1 << 1)
|
||||
@@ -292,12 +294,12 @@ static void ptd_write(void __iomem *base, u32 ptd_offset, u32 slot,
|
||||
struct ptd *ptd)
|
||||
{
|
||||
mem_writes8(base, ptd_offset + slot*sizeof(*ptd) + sizeof(ptd->dw0),
|
||||
- &ptd->dw1, 7*sizeof(ptd->dw1));
|
||||
+ (__force u32 *)&ptd->dw1, 7 * sizeof(ptd->dw1));
|
||||
/* Make sure dw0 gets written last (after other dw's and after payload)
|
||||
since it contains the enable bit */
|
||||
wmb();
|
||||
- mem_writes8(base, ptd_offset + slot*sizeof(*ptd), &ptd->dw0,
|
||||
- sizeof(ptd->dw0));
|
||||
+ mem_writes8(base, ptd_offset + slot * sizeof(*ptd),
|
||||
+ (__force u32 *)&ptd->dw0, sizeof(ptd->dw0));
|
||||
}
|
||||
|
||||
|
||||
@@ -553,7 +555,7 @@ static void create_ptd_atl(struct isp1760_qh *qh,
|
||||
ptd->dw0 |= TO_DW0_ENDPOINT(usb_pipeendpoint(qtd->urb->pipe));
|
||||
|
||||
/* DW1 */
|
||||
- ptd->dw1 = usb_pipeendpoint(qtd->urb->pipe) >> 1;
|
||||
+ ptd->dw1 = TO_DW((usb_pipeendpoint(qtd->urb->pipe) >> 1));
|
||||
ptd->dw1 |= TO_DW1_DEVICE_ADDR(usb_pipedevice(qtd->urb->pipe));
|
||||
ptd->dw1 |= TO_DW1_PID_TOKEN(qtd->packet_type);
|
||||
|
||||
@@ -575,7 +577,7 @@ static void create_ptd_atl(struct isp1760_qh *qh,
|
||||
/* SE bit for Split INT transfers */
|
||||
if (usb_pipeint(qtd->urb->pipe) &&
|
||||
(qtd->urb->dev->speed == USB_SPEED_LOW))
|
||||
- ptd->dw1 |= 2 << 16;
|
||||
+ ptd->dw1 |= DW1_SE_USB_LOSPEED;
|
||||
|
||||
rl = 0;
|
||||
nak = 0;
|
||||
@@ -647,14 +649,14 @@ static void transform_add_int(struct isp1760_qh *qh,
|
||||
* that number come from? 0xff seems to work fine...
|
||||
*/
|
||||
/* ptd->dw5 = 0x1c; */
|
||||
- ptd->dw5 = 0xff; /* Execute Complete Split on any uFrame */
|
||||
+ ptd->dw5 = TO_DW(0xff); /* Execute Complete Split on any uFrame */
|
||||
}
|
||||
|
||||
period = period >> 1;/* Ensure equal or shorter period than requested */
|
||||
period &= 0xf8; /* Mask off too large values and lowest unused 3 bits */
|
||||
|
||||
- ptd->dw2 |= period;
|
||||
- ptd->dw4 = usof;
|
||||
+ ptd->dw2 |= TO_DW(period);
|
||||
+ ptd->dw4 = TO_DW(usof);
|
||||
}
|
||||
|
||||
static void create_ptd_int(struct isp1760_qh *qh,
|
||||
@@ -977,10 +979,10 @@ static void schedule_ptds(struct usb_hcd *hcd)
|
||||
static int check_int_transfer(struct usb_hcd *hcd, struct ptd *ptd,
|
||||
struct urb *urb)
|
||||
{
|
||||
- __dw dw4;
|
||||
+ u32 dw4;
|
||||
int i;
|
||||
|
||||
- dw4 = ptd->dw4;
|
||||
+ dw4 = TO_U32(ptd->dw4);
|
||||
dw4 >>= 8;
|
||||
|
||||
/* FIXME: ISP1761 datasheet does not say what to do with these. Do we
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+2333
File diff suppressed because it is too large
Load Diff
+64
@@ -0,0 +1,64 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 03e28d5233d50fb2a27fa02d032e77974d03eb2b Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 13 May 2021 09:47:11 +0100
|
||||
Subject: [PATCH 03/23] usb: isp1760: use relaxed primitives
|
||||
|
||||
Use io relaxed access memory primitives to satisfy strict type
|
||||
checking (__force).
|
||||
|
||||
This will fix some existing sparse warnings:
|
||||
sparse: warning: cast to restricted __le32
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210513084717.2487366-4-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index 20d142140574..2cc0555e029d 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -246,7 +246,7 @@ static void bank_reads8(void __iomem *src_base, u32 src_offset, u32 bank_addr,
|
||||
|
||||
if (src_offset < PAYLOAD_OFFSET) {
|
||||
while (bytes >= 4) {
|
||||
- *dst = le32_to_cpu(__raw_readl(src));
|
||||
+ *dst = readl_relaxed(src);
|
||||
bytes -= 4;
|
||||
src++;
|
||||
dst++;
|
||||
@@ -267,7 +267,7 @@ static void bank_reads8(void __iomem *src_base, u32 src_offset, u32 bank_addr,
|
||||
* allocated.
|
||||
*/
|
||||
if (src_offset < PAYLOAD_OFFSET)
|
||||
- val = le32_to_cpu(__raw_readl(src));
|
||||
+ val = readl_relaxed(src);
|
||||
else
|
||||
val = __raw_readl(src);
|
||||
|
||||
@@ -301,7 +301,7 @@ static void mem_writes8(void __iomem *dst_base, u32 dst_offset,
|
||||
|
||||
if (dst_offset < PAYLOAD_OFFSET) {
|
||||
while (bytes >= 4) {
|
||||
- __raw_writel(cpu_to_le32(*src), dst);
|
||||
+ writel_relaxed(*src, dst);
|
||||
bytes -= 4;
|
||||
src++;
|
||||
dst++;
|
||||
@@ -322,7 +322,7 @@ static void mem_writes8(void __iomem *dst_base, u32 dst_offset,
|
||||
*/
|
||||
|
||||
if (dst_offset < PAYLOAD_OFFSET)
|
||||
- __raw_writel(cpu_to_le32(*src), dst);
|
||||
+ writel_relaxed(*src, dst);
|
||||
else
|
||||
__raw_writel(*src, dst);
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From f9a88370e6751c68a8f0d1c3f23100ca20596249 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 13 May 2021 09:47:12 +0100
|
||||
Subject: [PATCH 04/23] usb: isp1760: remove platform data struct and code
|
||||
|
||||
Since the removal of the Blackfin port with:
|
||||
commit 4ba66a976072 ("arch: remove blackfin port")
|
||||
|
||||
No one is using or referencing this header and platform data struct.
|
||||
Remove them.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210513084717.2487366-5-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-if.c | 20 +++-----------------
|
||||
1 file changed, 3 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-if.c b/drivers/usb/isp1760/isp1760-if.c
|
||||
index abfba9f5ec23..fb6701608cd8 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-if.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-if.c
|
||||
@@ -16,7 +16,6 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
-#include <linux/usb/isp1760.h>
|
||||
#include <linux/usb/hcd.h>
|
||||
|
||||
#include "isp1760-core.h"
|
||||
@@ -225,22 +224,9 @@ static int isp1760_plat_probe(struct platform_device *pdev)
|
||||
|
||||
if (of_property_read_bool(dp, "dreq-polarity"))
|
||||
devflags |= ISP1760_FLAG_DREQ_POL_HIGH;
|
||||
- } else if (dev_get_platdata(&pdev->dev)) {
|
||||
- struct isp1760_platform_data *pdata =
|
||||
- dev_get_platdata(&pdev->dev);
|
||||
-
|
||||
- if (pdata->is_isp1761)
|
||||
- devflags |= ISP1760_FLAG_ISP1761;
|
||||
- if (pdata->bus_width_16)
|
||||
- devflags |= ISP1760_FLAG_BUS_WIDTH_16;
|
||||
- if (pdata->port1_otg)
|
||||
- devflags |= ISP1760_FLAG_OTG_EN;
|
||||
- if (pdata->analog_oc)
|
||||
- devflags |= ISP1760_FLAG_ANALOG_OC;
|
||||
- if (pdata->dack_polarity_high)
|
||||
- devflags |= ISP1760_FLAG_DACK_POL_HIGH;
|
||||
- if (pdata->dreq_polarity_high)
|
||||
- devflags |= ISP1760_FLAG_DREQ_POL_HIGH;
|
||||
+ } else {
|
||||
+ pr_err("isp1760: no platform data\n");
|
||||
+ return -ENXIO;
|
||||
}
|
||||
|
||||
ret = isp1760_register(mem_res, irq_res->start, irqflags, &pdev->dev,
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+304
@@ -0,0 +1,304 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From a74f639c5b5618e2c9f311c93bc3e7405de8ca85 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 13 May 2021 09:47:13 +0100
|
||||
Subject: [PATCH 05/23] usb: isp1760: hcd: refactor mempool config and setup
|
||||
|
||||
In preparation to support other family member IP, which may have
|
||||
different memory layout. Drop macros and setup a configuration
|
||||
struct.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210513084717.2487366-6-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-core.c | 21 ++++++++
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 83 ++++++++++++++++++++----------
|
||||
drivers/usb/isp1760/isp1760-hcd.h | 37 ++++++-------
|
||||
3 files changed, 92 insertions(+), 49 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c
|
||||
index c79ba98df9f9..35a7667e411c 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-core.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-core.c
|
||||
@@ -101,6 +101,25 @@ void isp1760_set_pullup(struct isp1760_device *isp, bool enable)
|
||||
isp1760_field_set(udc->fields, HW_DP_PULLUP_CLEAR);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * 60kb divided in:
|
||||
+ * - 32 blocks @ 256 bytes
|
||||
+ * - 20 blocks @ 1024 bytes
|
||||
+ * - 4 blocks @ 8192 bytes
|
||||
+ */
|
||||
+static const struct isp1760_memory_layout isp176x_memory_conf = {
|
||||
+ .blocks[0] = 32,
|
||||
+ .blocks_size[0] = 256,
|
||||
+ .blocks[1] = 20,
|
||||
+ .blocks_size[1] = 1024,
|
||||
+ .blocks[2] = 4,
|
||||
+ .blocks_size[2] = 8192,
|
||||
+
|
||||
+ .ptd_num = 32,
|
||||
+ .payload_blocks = 32 + 20 + 4,
|
||||
+ .payload_area_size = 0xf000,
|
||||
+};
|
||||
+
|
||||
static const struct regmap_range isp176x_hc_volatile_ranges[] = {
|
||||
regmap_reg_range(ISP176x_HC_USBCMD, ISP176x_HC_ATL_PTD_LASTPTD),
|
||||
regmap_reg_range(ISP176x_HC_BUFFER_STATUS, ISP176x_HC_MEMORY),
|
||||
@@ -302,6 +321,8 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
|
||||
udc->fields[i] = f;
|
||||
}
|
||||
|
||||
+ hcd->memory_layout = &isp176x_memory_conf;
|
||||
+
|
||||
isp1760_init_core(isp);
|
||||
|
||||
if (IS_ENABLED(CONFIG_USB_ISP1760_HCD) && !usb_disabled()) {
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index 2cc0555e029d..a65f5f917ebe 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -358,39 +358,29 @@ static void ptd_write(void __iomem *base, u32 ptd_offset, u32 slot,
|
||||
/* memory management of the 60kb on the chip from 0x1000 to 0xffff */
|
||||
static void init_memory(struct isp1760_hcd *priv)
|
||||
{
|
||||
- int i, curr;
|
||||
+ const struct isp1760_memory_layout *mem = priv->memory_layout;
|
||||
+ int i, j, curr;
|
||||
u32 payload_addr;
|
||||
|
||||
payload_addr = PAYLOAD_OFFSET;
|
||||
- for (i = 0; i < BLOCK_1_NUM; i++) {
|
||||
- priv->memory_pool[i].start = payload_addr;
|
||||
- priv->memory_pool[i].size = BLOCK_1_SIZE;
|
||||
- priv->memory_pool[i].free = 1;
|
||||
- payload_addr += priv->memory_pool[i].size;
|
||||
- }
|
||||
-
|
||||
- curr = i;
|
||||
- for (i = 0; i < BLOCK_2_NUM; i++) {
|
||||
- priv->memory_pool[curr + i].start = payload_addr;
|
||||
- priv->memory_pool[curr + i].size = BLOCK_2_SIZE;
|
||||
- priv->memory_pool[curr + i].free = 1;
|
||||
- payload_addr += priv->memory_pool[curr + i].size;
|
||||
- }
|
||||
|
||||
- curr = i;
|
||||
- for (i = 0; i < BLOCK_3_NUM; i++) {
|
||||
- priv->memory_pool[curr + i].start = payload_addr;
|
||||
- priv->memory_pool[curr + i].size = BLOCK_3_SIZE;
|
||||
- priv->memory_pool[curr + i].free = 1;
|
||||
- payload_addr += priv->memory_pool[curr + i].size;
|
||||
+ for (i = 0, curr = 0; i < ARRAY_SIZE(mem->blocks); i++) {
|
||||
+ for (j = 0; j < mem->blocks[i]; j++, curr++) {
|
||||
+ priv->memory_pool[curr + j].start = payload_addr;
|
||||
+ priv->memory_pool[curr + j].size = mem->blocks_size[i];
|
||||
+ priv->memory_pool[curr + j].free = 1;
|
||||
+ payload_addr += priv->memory_pool[curr + j].size;
|
||||
+ }
|
||||
}
|
||||
|
||||
- WARN_ON(payload_addr - priv->memory_pool[0].start > PAYLOAD_AREA_SIZE);
|
||||
+ WARN_ON(payload_addr - priv->memory_pool[0].start >
|
||||
+ mem->payload_area_size);
|
||||
}
|
||||
|
||||
static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd)
|
||||
{
|
||||
struct isp1760_hcd *priv = hcd_to_priv(hcd);
|
||||
+ const struct isp1760_memory_layout *mem = priv->memory_layout;
|
||||
int i;
|
||||
|
||||
WARN_ON(qtd->payload_addr);
|
||||
@@ -398,7 +388,7 @@ static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd)
|
||||
if (!qtd->length)
|
||||
return;
|
||||
|
||||
- for (i = 0; i < BLOCKS; i++) {
|
||||
+ for (i = 0; i < mem->payload_blocks; i++) {
|
||||
if (priv->memory_pool[i].size >= qtd->length &&
|
||||
priv->memory_pool[i].free) {
|
||||
priv->memory_pool[i].free = 0;
|
||||
@@ -411,12 +401,13 @@ static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd)
|
||||
static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd)
|
||||
{
|
||||
struct isp1760_hcd *priv = hcd_to_priv(hcd);
|
||||
+ const struct isp1760_memory_layout *mem = priv->memory_layout;
|
||||
int i;
|
||||
|
||||
if (!qtd->payload_addr)
|
||||
return;
|
||||
|
||||
- for (i = 0; i < BLOCKS; i++) {
|
||||
+ for (i = 0; i < mem->payload_blocks; i++) {
|
||||
if (priv->memory_pool[i].start == qtd->payload_addr) {
|
||||
WARN_ON(priv->memory_pool[i].free);
|
||||
priv->memory_pool[i].free = 1;
|
||||
@@ -1407,8 +1398,6 @@ static int qtd_fill(struct isp1760_qtd *qtd, void *databuffer, size_t len)
|
||||
{
|
||||
qtd->data_buffer = databuffer;
|
||||
|
||||
- if (len > MAX_PAYLOAD_SIZE)
|
||||
- len = MAX_PAYLOAD_SIZE;
|
||||
qtd->length = len;
|
||||
|
||||
return qtd->length;
|
||||
@@ -1432,6 +1421,8 @@ static void qtd_list_free(struct list_head *qtd_list)
|
||||
static void packetize_urb(struct usb_hcd *hcd,
|
||||
struct urb *urb, struct list_head *head, gfp_t flags)
|
||||
{
|
||||
+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
|
||||
+ const struct isp1760_memory_layout *mem = priv->memory_layout;
|
||||
struct isp1760_qtd *qtd;
|
||||
void *buf;
|
||||
int len, maxpacketsize;
|
||||
@@ -1484,6 +1475,10 @@ static void packetize_urb(struct usb_hcd *hcd,
|
||||
qtd = qtd_alloc(flags, urb, packet_type);
|
||||
if (!qtd)
|
||||
goto cleanup;
|
||||
+
|
||||
+ if (len > mem->blocks_size[ISP176x_BLOCK_NUM - 1])
|
||||
+ len = mem->blocks_size[ISP176x_BLOCK_NUM - 1];
|
||||
+
|
||||
this_qtd_len = qtd_fill(qtd, buf, len);
|
||||
list_add_tail(&qtd->qtd_list, head);
|
||||
|
||||
@@ -2212,6 +2207,7 @@ int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem,
|
||||
int irq, unsigned long irqflags,
|
||||
struct device *dev)
|
||||
{
|
||||
+ const struct isp1760_memory_layout *mem_layout = priv->memory_layout;
|
||||
struct usb_hcd *hcd;
|
||||
int ret;
|
||||
|
||||
@@ -2223,6 +2219,28 @@ int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem,
|
||||
|
||||
priv->hcd = hcd;
|
||||
|
||||
+ priv->memory_pool = kcalloc(mem_layout->payload_blocks,
|
||||
+ sizeof(struct isp1760_memory_chunk),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!priv->memory_pool) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto put_hcd;
|
||||
+ }
|
||||
+
|
||||
+ priv->atl_slots = kcalloc(mem_layout->ptd_num,
|
||||
+ sizeof(struct isp1760_slotinfo), GFP_KERNEL);
|
||||
+ if (!priv->atl_slots) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto free_mem_pool;
|
||||
+ }
|
||||
+
|
||||
+ priv->int_slots = kcalloc(mem_layout->ptd_num,
|
||||
+ sizeof(struct isp1760_slotinfo), GFP_KERNEL);
|
||||
+ if (!priv->int_slots) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto free_atl_slots;
|
||||
+ }
|
||||
+
|
||||
init_memory(priv);
|
||||
|
||||
hcd->irq = irq;
|
||||
@@ -2234,13 +2252,19 @@ int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem,
|
||||
|
||||
ret = usb_add_hcd(hcd, irq, irqflags);
|
||||
if (ret)
|
||||
- goto error;
|
||||
+ goto free_int_slots;
|
||||
|
||||
device_wakeup_enable(hcd->self.controller);
|
||||
|
||||
return 0;
|
||||
|
||||
-error:
|
||||
+free_int_slots:
|
||||
+ kfree(priv->int_slots);
|
||||
+free_atl_slots:
|
||||
+ kfree(priv->atl_slots);
|
||||
+free_mem_pool:
|
||||
+ kfree(priv->memory_pool);
|
||||
+put_hcd:
|
||||
usb_put_hcd(hcd);
|
||||
return ret;
|
||||
}
|
||||
@@ -2252,4 +2276,7 @@ void isp1760_hcd_unregister(struct isp1760_hcd *priv)
|
||||
|
||||
usb_remove_hcd(priv->hcd);
|
||||
usb_put_hcd(priv->hcd);
|
||||
+ kfree(priv->atl_slots);
|
||||
+ kfree(priv->int_slots);
|
||||
+ kfree(priv->memory_pool);
|
||||
}
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.h b/drivers/usb/isp1760/isp1760-hcd.h
|
||||
index 34e1899e52c4..9d2427ce3f1a 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.h
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.h
|
||||
@@ -12,24 +12,6 @@ struct isp1760_qtd;
|
||||
struct resource;
|
||||
struct usb_hcd;
|
||||
|
||||
-/*
|
||||
- * 60kb divided in:
|
||||
- * - 32 blocks @ 256 bytes
|
||||
- * - 20 blocks @ 1024 bytes
|
||||
- * - 4 blocks @ 8192 bytes
|
||||
- */
|
||||
-
|
||||
-#define BLOCK_1_NUM 32
|
||||
-#define BLOCK_2_NUM 20
|
||||
-#define BLOCK_3_NUM 4
|
||||
-
|
||||
-#define BLOCK_1_SIZE 256
|
||||
-#define BLOCK_2_SIZE 1024
|
||||
-#define BLOCK_3_SIZE 8192
|
||||
-#define BLOCKS (BLOCK_1_NUM + BLOCK_2_NUM + BLOCK_3_NUM)
|
||||
-#define MAX_PAYLOAD_SIZE BLOCK_3_SIZE
|
||||
-#define PAYLOAD_AREA_SIZE 0xf000
|
||||
-
|
||||
struct isp1760_slotinfo {
|
||||
struct isp1760_qh *qh;
|
||||
struct isp1760_qtd *qtd;
|
||||
@@ -37,6 +19,17 @@ struct isp1760_slotinfo {
|
||||
};
|
||||
|
||||
/* chip memory management */
|
||||
+#define ISP176x_BLOCK_NUM 3
|
||||
+
|
||||
+struct isp1760_memory_layout {
|
||||
+ unsigned int blocks[ISP176x_BLOCK_NUM];
|
||||
+ unsigned int blocks_size[ISP176x_BLOCK_NUM];
|
||||
+
|
||||
+ unsigned int ptd_num;
|
||||
+ unsigned int payload_blocks;
|
||||
+ unsigned int payload_area_size;
|
||||
+};
|
||||
+
|
||||
struct isp1760_memory_chunk {
|
||||
unsigned int start;
|
||||
unsigned int size;
|
||||
@@ -58,12 +51,14 @@ struct isp1760_hcd {
|
||||
struct regmap *regs;
|
||||
struct regmap_field *fields[HC_FIELD_MAX];
|
||||
|
||||
+ const struct isp1760_memory_layout *memory_layout;
|
||||
+
|
||||
spinlock_t lock;
|
||||
- struct isp1760_slotinfo atl_slots[32];
|
||||
+ struct isp1760_slotinfo *atl_slots;
|
||||
int atl_done_map;
|
||||
- struct isp1760_slotinfo int_slots[32];
|
||||
+ struct isp1760_slotinfo *int_slots;
|
||||
int int_done_map;
|
||||
- struct isp1760_memory_chunk memory_pool[BLOCKS];
|
||||
+ struct isp1760_memory_chunk *memory_pool;
|
||||
struct list_head qh_list[QH_END];
|
||||
|
||||
/* periodic schedule support */
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 3eb96e04be9918afa54b64fac943de86a9798bda Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 13 May 2021 09:47:14 +0100
|
||||
Subject: [PATCH 06/23] usb: isp1760: use dr_mode binding
|
||||
|
||||
There is already a binding to describe the dual role mode (dr_mode),
|
||||
use that instead of defining a new one (port1-otg).
|
||||
|
||||
Update driver code and devicetree files that use that port1-otg
|
||||
binding.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210513084717.2487366-7-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-core.c | 3 +--
|
||||
drivers/usb/isp1760/isp1760-core.h | 2 +-
|
||||
drivers/usb/isp1760/isp1760-if.c | 5 +++--
|
||||
3 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c
|
||||
index 35a7667e411c..0aeeb12d3bfe 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-core.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-core.c
|
||||
@@ -73,10 +73,9 @@ static void isp1760_init_core(struct isp1760_device *isp)
|
||||
* on ISP1761.
|
||||
*
|
||||
* TODO: Really support OTG. For now we configure port 1 in device mode
|
||||
- * when OTG is requested.
|
||||
*/
|
||||
if ((isp->devflags & ISP1760_FLAG_ISP1761) &&
|
||||
- (isp->devflags & ISP1760_FLAG_OTG_EN)) {
|
||||
+ (isp->devflags & ISP1760_FLAG_PERIPHERAL_EN)) {
|
||||
isp1760_field_set(hcd->fields, HW_DM_PULLDOWN);
|
||||
isp1760_field_set(hcd->fields, HW_DP_PULLDOWN);
|
||||
isp1760_field_set(hcd->fields, HW_OTG_DISABLE);
|
||||
diff --git a/drivers/usb/isp1760/isp1760-core.h b/drivers/usb/isp1760/isp1760-core.h
|
||||
index 8fec6395f19f..7a6755d68d41 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-core.h
|
||||
+++ b/drivers/usb/isp1760/isp1760-core.h
|
||||
@@ -28,7 +28,7 @@ struct gpio_desc;
|
||||
* a sane default configuration.
|
||||
*/
|
||||
#define ISP1760_FLAG_BUS_WIDTH_16 0x00000002 /* 16-bit data bus width */
|
||||
-#define ISP1760_FLAG_OTG_EN 0x00000004 /* Port 1 supports OTG */
|
||||
+#define ISP1760_FLAG_PERIPHERAL_EN 0x00000004 /* Port 1 supports Peripheral mode*/
|
||||
#define ISP1760_FLAG_ANALOG_OC 0x00000008 /* Analog overcurrent */
|
||||
#define ISP1760_FLAG_DACK_POL_HIGH 0x00000010 /* DACK active high */
|
||||
#define ISP1760_FLAG_DREQ_POL_HIGH 0x00000020 /* DREQ active high */
|
||||
diff --git a/drivers/usb/isp1760/isp1760-if.c b/drivers/usb/isp1760/isp1760-if.c
|
||||
index fb6701608cd8..cb3e4d782315 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-if.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-if.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/usb/hcd.h>
|
||||
+#include <linux/usb/otg.h>
|
||||
|
||||
#include "isp1760-core.h"
|
||||
#include "isp1760-regs.h"
|
||||
@@ -213,8 +214,8 @@ static int isp1760_plat_probe(struct platform_device *pdev)
|
||||
if (bus_width == 16)
|
||||
devflags |= ISP1760_FLAG_BUS_WIDTH_16;
|
||||
|
||||
- if (of_property_read_bool(dp, "port1-otg"))
|
||||
- devflags |= ISP1760_FLAG_OTG_EN;
|
||||
+ if (usb_get_dr_mode(&pdev->dev) == USB_DR_MODE_PERIPHERAL)
|
||||
+ devflags |= ISP1760_FLAG_PERIPHERAL_EN;
|
||||
|
||||
if (of_property_read_bool(dp, "analog-oc"))
|
||||
devflags |= ISP1760_FLAG_ANALOG_OC;
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+1894
File diff suppressed because it is too large
Load Diff
+99
@@ -0,0 +1,99 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From e7a990e00cb13ce66d4008e3b77e8507be0c2e27 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 13 May 2021 09:47:16 +0100
|
||||
Subject: [PATCH 8/9] dt-bindings: usb: nxp,isp1760: add bindings
|
||||
|
||||
The nxp,isp1760 driver is old in the tree, but did not had a bindings
|
||||
entry, since I am extend it to support isp1763 in the same family, use
|
||||
this to add a proper yaml bindings file.
|
||||
|
||||
Reviewed-by: Rob Herring <robh@kernel.org>
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210513084717.2487366-9-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
.../devicetree/bindings/usb/nxp,isp1760.yaml | 69 +++++++++++++++++++
|
||||
1 file changed, 69 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/usb/nxp,isp1760.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/usb/nxp,isp1760.yaml b/Documentation/devicetree/bindings/usb/nxp,isp1760.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..a88f99adfe8e
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/usb/nxp,isp1760.yaml
|
||||
@@ -0,0 +1,69 @@
|
||||
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/usb/nxp,isp1760.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: NXP ISP1760 family controller bindings
|
||||
+
|
||||
+maintainers:
|
||||
+ - Sebastian Siewior <bigeasy@linutronix.de>
|
||||
+ - Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
+
|
||||
+description: |
|
||||
+ NXP ISP1760 family, which includes ISP1760/1761/1763 devicetree controller
|
||||
+ bindings
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ enum:
|
||||
+ - nxp,usb-isp1760
|
||||
+ - nxp,usb-isp1761
|
||||
+ - nxp,usb-isp1763
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ interrupts:
|
||||
+ minItems: 1
|
||||
+ maxItems: 2
|
||||
+ items:
|
||||
+ - description: Host controller interrupt
|
||||
+ - description: Device controller interrupt in isp1761
|
||||
+
|
||||
+ interrupt-names:
|
||||
+ minItems: 1
|
||||
+ maxItems: 2
|
||||
+ items:
|
||||
+ - const: host
|
||||
+ - const: peripheral
|
||||
+
|
||||
+ bus-width:
|
||||
+ description:
|
||||
+ Number of data lines.
|
||||
+ enum: [8, 16, 32]
|
||||
+ default: 32
|
||||
+
|
||||
+ dr_mode:
|
||||
+ enum:
|
||||
+ - host
|
||||
+ - peripheral
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - interrupts
|
||||
+
|
||||
+additionalProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+ usb@40200000 {
|
||||
+ compatible = "nxp,usb-isp1763";
|
||||
+ reg = <0x40200000 0x100000>;
|
||||
+ interrupts = <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ bus-width = <16>;
|
||||
+ dr_mode = "host";
|
||||
+ };
|
||||
+
|
||||
+...
|
||||
--
|
||||
2.32.0
|
||||
|
||||
+303
@@ -0,0 +1,303 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From d369c9187c1897ce5339716354ce47b2c2f67352 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 13 May 2021 09:47:17 +0100
|
||||
Subject: [PATCH 08/23] usb: isp1763: add peripheral mode
|
||||
|
||||
Besides the already host mode support add peripheral mode support for
|
||||
the isp1763 IP from the isp1760 family.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210513084717.2487366-10-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-core.c | 25 +++++++++++------
|
||||
drivers/usb/isp1760/isp1760-regs.h | 42 ++++++++++++++++++++++++++++
|
||||
drivers/usb/isp1760/isp1760-udc.c | 45 ++++++++++++++++++++++--------
|
||||
drivers/usb/isp1760/isp1760-udc.h | 1 +
|
||||
4 files changed, 94 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c
|
||||
index 1d847f13abab..ff07e2890692 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-core.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-core.c
|
||||
@@ -83,7 +83,8 @@ static int isp1760_init_core(struct isp1760_device *isp)
|
||||
*
|
||||
* TODO: Really support OTG. For now we configure port 1 in device mode
|
||||
*/
|
||||
- if ((isp->devflags & ISP1760_FLAG_ISP1761) &&
|
||||
+ if (((isp->devflags & ISP1760_FLAG_ISP1761) ||
|
||||
+ (isp->devflags & ISP1760_FLAG_ISP1763)) &&
|
||||
(isp->devflags & ISP1760_FLAG_PERIPHERAL_EN)) {
|
||||
isp1760_field_set(hcd->fields, HW_DM_PULLDOWN);
|
||||
isp1760_field_set(hcd->fields, HW_DP_PULLDOWN);
|
||||
@@ -470,13 +471,15 @@ static const struct regmap_config isp1763_dc_regmap_conf = {
|
||||
int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
|
||||
struct device *dev, unsigned int devflags)
|
||||
{
|
||||
- bool udc_disabled = !(devflags & ISP1760_FLAG_ISP1761);
|
||||
const struct regmap_config *hc_regmap;
|
||||
const struct reg_field *hc_reg_fields;
|
||||
+ const struct regmap_config *dc_regmap;
|
||||
+ const struct reg_field *dc_reg_fields;
|
||||
struct isp1760_device *isp;
|
||||
struct isp1760_hcd *hcd;
|
||||
struct isp1760_udc *udc;
|
||||
struct regmap_field *f;
|
||||
+ bool udc_enabled;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
@@ -484,8 +487,11 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
|
||||
* If neither the HCD not the UDC is enabled return an error, as no
|
||||
* device would be registered.
|
||||
*/
|
||||
+ udc_enabled = ((devflags & ISP1760_FLAG_ISP1763) ||
|
||||
+ (devflags & ISP1760_FLAG_ISP1761));
|
||||
+
|
||||
if ((!IS_ENABLED(CONFIG_USB_ISP1760_HCD) || usb_disabled()) &&
|
||||
- (!IS_ENABLED(CONFIG_USB_ISP1761_UDC) || udc_disabled))
|
||||
+ (!IS_ENABLED(CONFIG_USB_ISP1761_UDC) || !udc_enabled))
|
||||
return -ENODEV;
|
||||
|
||||
isp = devm_kzalloc(dev, sizeof(*isp), GFP_KERNEL);
|
||||
@@ -498,6 +504,7 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
|
||||
udc = &isp->udc;
|
||||
|
||||
hcd->is_isp1763 = !!(devflags & ISP1760_FLAG_ISP1763);
|
||||
+ udc->is_isp1763 = !!(devflags & ISP1760_FLAG_ISP1763);
|
||||
|
||||
if (!hcd->is_isp1763 && (devflags & ISP1760_FLAG_BUS_WIDTH_8)) {
|
||||
dev_err(dev, "isp1760/61 do not support data width 8\n");
|
||||
@@ -507,9 +514,13 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
|
||||
if (hcd->is_isp1763) {
|
||||
hc_regmap = &isp1763_hc_regmap_conf;
|
||||
hc_reg_fields = &isp1763_hc_reg_fields[0];
|
||||
+ dc_regmap = &isp1763_dc_regmap_conf;
|
||||
+ dc_reg_fields = &isp1763_dc_reg_fields[0];
|
||||
} else {
|
||||
hc_regmap = &isp1760_hc_regmap_conf;
|
||||
hc_reg_fields = &isp1760_hc_reg_fields[0];
|
||||
+ dc_regmap = &isp1761_dc_regmap_conf;
|
||||
+ dc_reg_fields = &isp1761_dc_reg_fields[0];
|
||||
}
|
||||
|
||||
isp->rst_gpio = devm_gpiod_get_optional(dev, NULL, GPIOD_OUT_HIGH);
|
||||
@@ -532,14 +543,12 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
|
||||
hcd->fields[i] = f;
|
||||
}
|
||||
|
||||
- udc->regs = devm_regmap_init_mmio(dev, hcd->base,
|
||||
- &isp1761_dc_regmap_conf);
|
||||
+ udc->regs = devm_regmap_init_mmio(dev, hcd->base, dc_regmap);
|
||||
if (IS_ERR(udc->regs))
|
||||
return PTR_ERR(udc->regs);
|
||||
|
||||
for (i = 0; i < DC_FIELD_MAX; i++) {
|
||||
- f = devm_regmap_field_alloc(dev, udc->regs,
|
||||
- isp1761_dc_reg_fields[i]);
|
||||
+ f = devm_regmap_field_alloc(dev, udc->regs, dc_reg_fields[i]);
|
||||
if (IS_ERR(f))
|
||||
return PTR_ERR(f);
|
||||
|
||||
@@ -562,7 +571,7 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (IS_ENABLED(CONFIG_USB_ISP1761_UDC) && !udc_disabled) {
|
||||
+ if (IS_ENABLED(CONFIG_USB_ISP1761_UDC) && udc_enabled) {
|
||||
ret = isp1760_udc_register(isp, irq, irqflags);
|
||||
if (ret < 0) {
|
||||
isp1760_hcd_unregister(hcd);
|
||||
diff --git a/drivers/usb/isp1760/isp1760-regs.h b/drivers/usb/isp1760/isp1760-regs.h
|
||||
index 4f632cbbbd1f..94ea60c20b2a 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-regs.h
|
||||
+++ b/drivers/usb/isp1760/isp1760-regs.h
|
||||
@@ -243,8 +243,50 @@ enum isp176x_device_controller_fields {
|
||||
DC_EPENABLE, DC_ENDPTYP,
|
||||
/* DC_FRAMENUM */
|
||||
DC_FRAMENUM, DC_UFRAMENUM,
|
||||
+ /* DC_CHIP_ID */
|
||||
+ DC_CHIP_ID_HIGH, DC_CHIP_ID_LOW,
|
||||
+ /* DC_SCRATCH */
|
||||
+ DC_SCRATCH,
|
||||
/* Last element */
|
||||
DC_FIELD_MAX,
|
||||
};
|
||||
|
||||
+/* ISP1763 */
|
||||
+/* Initialization Registers */
|
||||
+#define ISP1763_DC_ADDRESS 0x00
|
||||
+#define ISP1763_DC_MODE 0x0c
|
||||
+#define ISP1763_DC_INTCONF 0x10
|
||||
+#define ISP1763_DC_INTENABLE 0x14
|
||||
+
|
||||
+/* Data Flow Registers */
|
||||
+#define ISP1763_DC_EPMAXPKTSZ 0x04
|
||||
+#define ISP1763_DC_EPTYPE 0x08
|
||||
+
|
||||
+#define ISP1763_DC_BUFLEN 0x1c
|
||||
+#define ISP1763_DC_BUFSTAT 0x1e
|
||||
+#define ISP1763_DC_DATAPORT 0x20
|
||||
+
|
||||
+#define ISP1763_DC_CTRLFUNC 0x28
|
||||
+#define ISP1763_DC_EPINDEX 0x2c
|
||||
+
|
||||
+/* DMA Registers */
|
||||
+#define ISP1763_DC_DMACMD 0x30
|
||||
+#define ISP1763_DC_DMATXCOUNT 0x34
|
||||
+#define ISP1763_DC_DMACONF 0x38
|
||||
+#define ISP1763_DC_DMAHW 0x3c
|
||||
+#define ISP1763_DC_DMAINTREASON 0x50
|
||||
+#define ISP1763_DC_DMAINTEN 0x54
|
||||
+#define ISP1763_DC_DMAEP 0x58
|
||||
+#define ISP1763_DC_DMABURSTCOUNT 0x64
|
||||
+
|
||||
+/* General Registers */
|
||||
+#define ISP1763_DC_INTERRUPT 0x18
|
||||
+#define ISP1763_DC_CHIPID_LOW 0x70
|
||||
+#define ISP1763_DC_CHIPID_HIGH 0x72
|
||||
+#define ISP1763_DC_FRAMENUM 0x74
|
||||
+#define ISP1763_DC_SCRATCH 0x78
|
||||
+#define ISP1763_DC_UNLOCKDEV 0x7c
|
||||
+#define ISP1763_DC_INTPULSEWIDTH 0x80
|
||||
+#define ISP1763_DC_TESTMODE 0x84
|
||||
+
|
||||
#endif
|
||||
diff --git a/drivers/usb/isp1760/isp1760-udc.c b/drivers/usb/isp1760/isp1760-udc.c
|
||||
index 30efc9d32506..3e05e3605435 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-udc.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-udc.c
|
||||
@@ -1151,6 +1151,10 @@ static void isp1760_udc_disconnect(struct isp1760_udc *udc)
|
||||
|
||||
static void isp1760_udc_init_hw(struct isp1760_udc *udc)
|
||||
{
|
||||
+ u32 intconf = udc->is_isp1763 ? ISP1763_DC_INTCONF : ISP176x_DC_INTCONF;
|
||||
+ u32 intena = udc->is_isp1763 ? ISP1763_DC_INTENABLE :
|
||||
+ ISP176x_DC_INTENABLE;
|
||||
+
|
||||
/*
|
||||
* The device controller currently shares its interrupt with the host
|
||||
* controller, the DC_IRQ polarity and signaling mode are ignored. Set
|
||||
@@ -1160,11 +1164,11 @@ static void isp1760_udc_init_hw(struct isp1760_udc *udc)
|
||||
* ACK tokens only (and NYET for the out pipe). The default
|
||||
* configuration also generates an interrupt on the first NACK token.
|
||||
*/
|
||||
- isp1760_reg_write(udc->regs, ISP176x_DC_INTCONF,
|
||||
+ isp1760_reg_write(udc->regs, intconf,
|
||||
ISP176x_DC_CDBGMOD_ACK | ISP176x_DC_DDBGMODIN_ACK |
|
||||
ISP176x_DC_DDBGMODOUT_ACK);
|
||||
|
||||
- isp1760_reg_write(udc->regs, ISP176x_DC_INTENABLE, DC_IEPRXTX(7) |
|
||||
+ isp1760_reg_write(udc->regs, intena, DC_IEPRXTX(7) |
|
||||
DC_IEPRXTX(6) | DC_IEPRXTX(5) | DC_IEPRXTX(4) |
|
||||
DC_IEPRXTX(3) | DC_IEPRXTX(2) | DC_IEPRXTX(1) |
|
||||
DC_IEPRXTX(0) | ISP176x_DC_IEP0SETUP |
|
||||
@@ -1304,13 +1308,14 @@ static int isp1760_udc_start(struct usb_gadget *gadget,
|
||||
static int isp1760_udc_stop(struct usb_gadget *gadget)
|
||||
{
|
||||
struct isp1760_udc *udc = gadget_to_udc(gadget);
|
||||
+ u32 mode_reg = udc->is_isp1763 ? ISP1763_DC_MODE : ISP176x_DC_MODE;
|
||||
unsigned long flags;
|
||||
|
||||
dev_dbg(udc->isp->dev, "%s\n", __func__);
|
||||
|
||||
del_timer_sync(&udc->vbus_timer);
|
||||
|
||||
- isp1760_reg_write(udc->regs, ISP176x_DC_MODE, 0);
|
||||
+ isp1760_reg_write(udc->regs, mode_reg, 0);
|
||||
|
||||
spin_lock_irqsave(&udc->lock, flags);
|
||||
udc->driver = NULL;
|
||||
@@ -1332,15 +1337,30 @@ static const struct usb_gadget_ops isp1760_udc_ops = {
|
||||
* Interrupt Handling
|
||||
*/
|
||||
|
||||
+static u32 isp1760_udc_irq_get_status(struct isp1760_udc *udc)
|
||||
+{
|
||||
+ u32 status;
|
||||
+
|
||||
+ if (udc->is_isp1763) {
|
||||
+ status = isp1760_reg_read(udc->regs, ISP1763_DC_INTERRUPT)
|
||||
+ & isp1760_reg_read(udc->regs, ISP1763_DC_INTENABLE);
|
||||
+ isp1760_reg_write(udc->regs, ISP1763_DC_INTERRUPT, status);
|
||||
+ } else {
|
||||
+ status = isp1760_reg_read(udc->regs, ISP176x_DC_INTERRUPT)
|
||||
+ & isp1760_reg_read(udc->regs, ISP176x_DC_INTENABLE);
|
||||
+ isp1760_reg_write(udc->regs, ISP176x_DC_INTERRUPT, status);
|
||||
+ }
|
||||
+
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
static irqreturn_t isp1760_udc_irq(int irq, void *dev)
|
||||
{
|
||||
struct isp1760_udc *udc = dev;
|
||||
unsigned int i;
|
||||
u32 status;
|
||||
|
||||
- status = isp1760_reg_read(udc->regs, ISP176x_DC_INTERRUPT)
|
||||
- & isp1760_reg_read(udc->regs, ISP176x_DC_INTENABLE);
|
||||
- isp1760_reg_write(udc->regs, ISP176x_DC_INTERRUPT, status);
|
||||
+ status = isp1760_udc_irq_get_status(udc);
|
||||
|
||||
if (status & DC_IEVBUS) {
|
||||
dev_dbg(udc->isp->dev, "%s(VBUS)\n", __func__);
|
||||
@@ -1475,6 +1495,7 @@ static void isp1760_udc_init_eps(struct isp1760_udc *udc)
|
||||
|
||||
static int isp1760_udc_init(struct isp1760_udc *udc)
|
||||
{
|
||||
+ u32 mode_reg = udc->is_isp1763 ? ISP1763_DC_MODE : ISP176x_DC_MODE;
|
||||
u16 scratch;
|
||||
u32 chipid;
|
||||
|
||||
@@ -1484,9 +1505,10 @@ static int isp1760_udc_init(struct isp1760_udc *udc)
|
||||
* register, and reading the scratch register value back. The chip ID
|
||||
* and scratch register contents must match the expected values.
|
||||
*/
|
||||
- isp1760_reg_write(udc->regs, ISP176x_DC_SCRATCH, 0xbabe);
|
||||
- chipid = isp1760_reg_read(udc->regs, ISP176x_DC_CHIPID);
|
||||
- scratch = isp1760_reg_read(udc->regs, ISP176x_DC_SCRATCH);
|
||||
+ isp1760_udc_write(udc, DC_SCRATCH, 0xbabe);
|
||||
+ chipid = isp1760_udc_read(udc, DC_CHIP_ID_HIGH) << 16;
|
||||
+ chipid |= isp1760_udc_read(udc, DC_CHIP_ID_LOW);
|
||||
+ scratch = isp1760_udc_read(udc, DC_SCRATCH);
|
||||
|
||||
if (scratch != 0xbabe) {
|
||||
dev_err(udc->isp->dev,
|
||||
@@ -1495,7 +1517,8 @@ static int isp1760_udc_init(struct isp1760_udc *udc)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
- if (chipid != 0x00011582 && chipid != 0x00158210) {
|
||||
+ if (chipid != 0x00011582 && chipid != 0x00158210 &&
|
||||
+ chipid != 0x00176320) {
|
||||
dev_err(udc->isp->dev, "udc: invalid chip ID 0x%08x\n", chipid);
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -1503,7 +1526,7 @@ static int isp1760_udc_init(struct isp1760_udc *udc)
|
||||
/* Reset the device controller. */
|
||||
isp1760_udc_set(udc, DC_SFRESET);
|
||||
usleep_range(10000, 11000);
|
||||
- isp1760_reg_write(udc->regs, ISP176x_DC_MODE, 0);
|
||||
+ isp1760_reg_write(udc->regs, mode_reg, 0);
|
||||
usleep_range(10000, 11000);
|
||||
|
||||
return 0;
|
||||
diff --git a/drivers/usb/isp1760/isp1760-udc.h b/drivers/usb/isp1760/isp1760-udc.h
|
||||
index f2ab5929cc9f..22044e86bc0e 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-udc.h
|
||||
+++ b/drivers/usb/isp1760/isp1760-udc.h
|
||||
@@ -84,6 +84,7 @@ struct isp1760_udc {
|
||||
u16 ep0_length;
|
||||
|
||||
bool connected;
|
||||
+ bool is_isp1763;
|
||||
|
||||
unsigned int devstatus;
|
||||
};
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 67c6bb56b649590a3f59c2a92331aa4e83d4534c Mon Sep 17 00:00:00 2001
|
||||
From: Ard Biesheuvel <ardb@kernel.org>
|
||||
Date: Wed, 6 Jan 2021 10:34:49 +0000
|
||||
Subject: [PATCH] firmware: smccc: Add SMCCC TRNG function call IDs
|
||||
|
||||
The ARM architected TRNG firmware interface, described in ARM spec
|
||||
DEN0098, define an ARM SMCCC based interface to a true random number
|
||||
generator, provided by firmware.
|
||||
|
||||
Add the definitions of the SMCCC functions as defined by the spec.
|
||||
|
||||
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
Link: https://lore.kernel.org/r/20210106103453.152275-2-andre.przywara@arm.com
|
||||
Signed-off-by: Will Deacon <will@kernel.org>
|
||||
---
|
||||
include/linux/arm-smccc.h | 31 +++++++++++++++++++++++++++++++
|
||||
1 file changed, 31 insertions(+)
|
||||
|
||||
diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h
|
||||
index f860645f6512..62c54234576c 100644
|
||||
--- a/include/linux/arm-smccc.h
|
||||
+++ b/include/linux/arm-smccc.h
|
||||
@@ -102,6 +102,37 @@
|
||||
ARM_SMCCC_OWNER_STANDARD_HYP, \
|
||||
0x21)
|
||||
|
||||
+/* TRNG entropy source calls (defined by ARM DEN0098) */
|
||||
+#define ARM_SMCCC_TRNG_VERSION \
|
||||
+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
+ ARM_SMCCC_SMC_32, \
|
||||
+ ARM_SMCCC_OWNER_STANDARD, \
|
||||
+ 0x50)
|
||||
+
|
||||
+#define ARM_SMCCC_TRNG_FEATURES \
|
||||
+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
+ ARM_SMCCC_SMC_32, \
|
||||
+ ARM_SMCCC_OWNER_STANDARD, \
|
||||
+ 0x51)
|
||||
+
|
||||
+#define ARM_SMCCC_TRNG_GET_UUID \
|
||||
+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
+ ARM_SMCCC_SMC_32, \
|
||||
+ ARM_SMCCC_OWNER_STANDARD, \
|
||||
+ 0x52)
|
||||
+
|
||||
+#define ARM_SMCCC_TRNG_RND32 \
|
||||
+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
+ ARM_SMCCC_SMC_32, \
|
||||
+ ARM_SMCCC_OWNER_STANDARD, \
|
||||
+ 0x53)
|
||||
+
|
||||
+#define ARM_SMCCC_TRNG_RND64 \
|
||||
+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
+ ARM_SMCCC_SMC_64, \
|
||||
+ ARM_SMCCC_OWNER_STANDARD, \
|
||||
+ 0x53)
|
||||
+
|
||||
/*
|
||||
* Return codes defined in ARM DEN 0070A
|
||||
* ARM DEN 0070A is now merged/consolidated into ARM DEN 0028 C
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From a37e31fc97efe7f7c68cb381cf4390e472c09061 Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Wed, 6 Jan 2021 10:34:50 +0000
|
||||
Subject: [PATCH] firmware: smccc: Introduce SMCCC TRNG framework
|
||||
|
||||
The ARM DEN0098 document describe an SMCCC based firmware service to
|
||||
deliver hardware generated random numbers. Its existence is advertised
|
||||
according to the SMCCC v1.1 specification.
|
||||
|
||||
Add a (dummy) call to probe functions implemented in each architecture
|
||||
(ARM and arm64), to determine the existence of this interface.
|
||||
For now this return false, but this will be overwritten by each
|
||||
architecture's support patch.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
Signed-off-by: Will Deacon <will@kernel.org>
|
||||
---
|
||||
arch/arm/include/asm/archrandom.h | 10 ++++++++++
|
||||
arch/arm64/include/asm/archrandom.h | 12 ++++++++++++
|
||||
drivers/firmware/smccc/smccc.c | 6 ++++++
|
||||
3 files changed, 28 insertions(+)
|
||||
create mode 100644 arch/arm/include/asm/archrandom.h
|
||||
|
||||
diff --git a/arch/arm/include/asm/archrandom.h b/arch/arm/include/asm/archrandom.h
|
||||
new file mode 100644
|
||||
index 000000000000..a8e84ca5c2ee
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/include/asm/archrandom.h
|
||||
@@ -0,0 +1,10 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 */
|
||||
+#ifndef _ASM_ARCHRANDOM_H
|
||||
+#define _ASM_ARCHRANDOM_H
|
||||
+
|
||||
+static inline bool __init smccc_probe_trng(void)
|
||||
+{
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+#endif /* _ASM_ARCHRANDOM_H */
|
||||
diff --git a/arch/arm64/include/asm/archrandom.h b/arch/arm64/include/asm/archrandom.h
|
||||
index ffb1a40d5475..abe07c21da8e 100644
|
||||
--- a/arch/arm64/include/asm/archrandom.h
|
||||
+++ b/arch/arm64/include/asm/archrandom.h
|
||||
@@ -8,6 +8,11 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/cpufeature.h>
|
||||
|
||||
+static inline bool __init smccc_probe_trng(void)
|
||||
+{
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
static inline bool __arm64_rndr(unsigned long *v)
|
||||
{
|
||||
bool ok;
|
||||
@@ -79,5 +84,12 @@ arch_get_random_seed_long_early(unsigned long *v)
|
||||
}
|
||||
#define arch_get_random_seed_long_early arch_get_random_seed_long_early
|
||||
|
||||
+#else /* !CONFIG_ARCH_RANDOM */
|
||||
+
|
||||
+static inline bool __init smccc_probe_trng(void)
|
||||
+{
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
#endif /* CONFIG_ARCH_RANDOM */
|
||||
#endif /* _ASM_ARCHRANDOM_H */
|
||||
diff --git a/drivers/firmware/smccc/smccc.c b/drivers/firmware/smccc/smccc.c
|
||||
index 00c88b809c0c..d52bfc5ed5e4 100644
|
||||
--- a/drivers/firmware/smccc/smccc.c
|
||||
+++ b/drivers/firmware/smccc/smccc.c
|
||||
@@ -5,16 +5,22 @@
|
||||
|
||||
#define pr_fmt(fmt) "smccc: " fmt
|
||||
|
||||
+#include <linux/cache.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/arm-smccc.h>
|
||||
+#include <asm/archrandom.h>
|
||||
|
||||
static u32 smccc_version = ARM_SMCCC_VERSION_1_0;
|
||||
static enum arm_smccc_conduit smccc_conduit = SMCCC_CONDUIT_NONE;
|
||||
|
||||
+bool __ro_after_init smccc_trng_available = false;
|
||||
+
|
||||
void __init arm_smccc_version_init(u32 version, enum arm_smccc_conduit conduit)
|
||||
{
|
||||
smccc_version = version;
|
||||
smccc_conduit = conduit;
|
||||
+
|
||||
+ smccc_trng_available = smccc_probe_trng();
|
||||
}
|
||||
|
||||
enum arm_smccc_conduit arm_smccc_1_1_get_conduit(void)
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+192
@@ -0,0 +1,192 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 3fdc0cb59d97f87e2cc708d424f1538e31744286 Mon Sep 17 00:00:00 2001
|
||||
From: Sudeep Holla <sudeep.holla@arm.com>
|
||||
Date: Tue, 18 May 2021 17:36:18 +0100
|
||||
Subject: [PATCH] arm64: smccc: Add support for SMCCCv1.2 extended input/output
|
||||
registers
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
SMCCC v1.2 allows x8-x17 to be used as parameter registers and x4—x17
|
||||
to be used as result registers in SMC64/HVC64. Arm Firmware Framework
|
||||
for Armv8-A specification makes use of x0-x7 as parameter and result
|
||||
registers. There are other users like Hyper-V who intend to use beyond
|
||||
x0-x7 as well.
|
||||
|
||||
Current SMCCC interface in the kernel just use x0-x7 as parameter and
|
||||
x0-x3 as result registers as required by SMCCCv1.0. Let us add new
|
||||
interface to support this extended set of input/output registers namely
|
||||
x0-x17 as both parameter and result registers.
|
||||
|
||||
Acked-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Tested-by: Michael Kelley <mikelley@microsoft.com>
|
||||
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
|
||||
Cc: Will Deacon <will@kernel.org>
|
||||
Cc: Catalin Marinas <catalin.marinas@arm.com>
|
||||
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
Reviewed-by: Mark Brown <broonie@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20210518163618.43950-1-sudeep.holla@arm.com
|
||||
Signed-off-by: Will Deacon <will@kernel.org>
|
||||
---
|
||||
arch/arm64/kernel/asm-offsets.c | 9 ++++++
|
||||
arch/arm64/kernel/smccc-call.S | 57 +++++++++++++++++++++++++++++++++
|
||||
include/linux/arm-smccc.h | 55 +++++++++++++++++++++++++++++++
|
||||
3 files changed, 121 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c
|
||||
index 0cb34ccb6e73..74321bc9a459 100644
|
||||
--- a/arch/arm64/kernel/asm-offsets.c
|
||||
+++ b/arch/arm64/kernel/asm-offsets.c
|
||||
@@ -138,6 +138,15 @@ int main(void)
|
||||
DEFINE(ARM_SMCCC_RES_X2_OFFS, offsetof(struct arm_smccc_res, a2));
|
||||
DEFINE(ARM_SMCCC_QUIRK_ID_OFFS, offsetof(struct arm_smccc_quirk, id));
|
||||
DEFINE(ARM_SMCCC_QUIRK_STATE_OFFS, offsetof(struct arm_smccc_quirk, state));
|
||||
+ DEFINE(ARM_SMCCC_1_2_REGS_X0_OFFS, offsetof(struct arm_smccc_1_2_regs, a0));
|
||||
+ DEFINE(ARM_SMCCC_1_2_REGS_X2_OFFS, offsetof(struct arm_smccc_1_2_regs, a2));
|
||||
+ DEFINE(ARM_SMCCC_1_2_REGS_X4_OFFS, offsetof(struct arm_smccc_1_2_regs, a4));
|
||||
+ DEFINE(ARM_SMCCC_1_2_REGS_X6_OFFS, offsetof(struct arm_smccc_1_2_regs, a6));
|
||||
+ DEFINE(ARM_SMCCC_1_2_REGS_X8_OFFS, offsetof(struct arm_smccc_1_2_regs, a8));
|
||||
+ DEFINE(ARM_SMCCC_1_2_REGS_X10_OFFS, offsetof(struct arm_smccc_1_2_regs, a10));
|
||||
+ DEFINE(ARM_SMCCC_1_2_REGS_X12_OFFS, offsetof(struct arm_smccc_1_2_regs, a12));
|
||||
+ DEFINE(ARM_SMCCC_1_2_REGS_X14_OFFS, offsetof(struct arm_smccc_1_2_regs, a14));
|
||||
+ DEFINE(ARM_SMCCC_1_2_REGS_X16_OFFS, offsetof(struct arm_smccc_1_2_regs, a16));
|
||||
BLANK();
|
||||
DEFINE(HIBERN_PBE_ORIG, offsetof(struct pbe, orig_address));
|
||||
DEFINE(HIBERN_PBE_ADDR, offsetof(struct pbe, address));
|
||||
diff --git a/arch/arm64/kernel/smccc-call.S b/arch/arm64/kernel/smccc-call.S
|
||||
index d62447964ed9..2def9d0dd3dd 100644
|
||||
--- a/arch/arm64/kernel/smccc-call.S
|
||||
+++ b/arch/arm64/kernel/smccc-call.S
|
||||
@@ -43,3 +43,60 @@ SYM_FUNC_START(__arm_smccc_hvc)
|
||||
SMCCC hvc
|
||||
SYM_FUNC_END(__arm_smccc_hvc)
|
||||
EXPORT_SYMBOL(__arm_smccc_hvc)
|
||||
+
|
||||
+ .macro SMCCC_1_2 instr
|
||||
+ /* Save `res` and free a GPR that won't be clobbered */
|
||||
+ stp x1, x19, [sp, #-16]!
|
||||
+
|
||||
+ /* Ensure `args` won't be clobbered while loading regs in next step */
|
||||
+ mov x19, x0
|
||||
+
|
||||
+ /* Load the registers x0 - x17 from the struct arm_smccc_1_2_regs */
|
||||
+ ldp x0, x1, [x19, #ARM_SMCCC_1_2_REGS_X0_OFFS]
|
||||
+ ldp x2, x3, [x19, #ARM_SMCCC_1_2_REGS_X2_OFFS]
|
||||
+ ldp x4, x5, [x19, #ARM_SMCCC_1_2_REGS_X4_OFFS]
|
||||
+ ldp x6, x7, [x19, #ARM_SMCCC_1_2_REGS_X6_OFFS]
|
||||
+ ldp x8, x9, [x19, #ARM_SMCCC_1_2_REGS_X8_OFFS]
|
||||
+ ldp x10, x11, [x19, #ARM_SMCCC_1_2_REGS_X10_OFFS]
|
||||
+ ldp x12, x13, [x19, #ARM_SMCCC_1_2_REGS_X12_OFFS]
|
||||
+ ldp x14, x15, [x19, #ARM_SMCCC_1_2_REGS_X14_OFFS]
|
||||
+ ldp x16, x17, [x19, #ARM_SMCCC_1_2_REGS_X16_OFFS]
|
||||
+
|
||||
+ \instr #0
|
||||
+
|
||||
+ /* Load the `res` from the stack */
|
||||
+ ldr x19, [sp]
|
||||
+
|
||||
+ /* Store the registers x0 - x17 into the result structure */
|
||||
+ stp x0, x1, [x19, #ARM_SMCCC_1_2_REGS_X0_OFFS]
|
||||
+ stp x2, x3, [x19, #ARM_SMCCC_1_2_REGS_X2_OFFS]
|
||||
+ stp x4, x5, [x19, #ARM_SMCCC_1_2_REGS_X4_OFFS]
|
||||
+ stp x6, x7, [x19, #ARM_SMCCC_1_2_REGS_X6_OFFS]
|
||||
+ stp x8, x9, [x19, #ARM_SMCCC_1_2_REGS_X8_OFFS]
|
||||
+ stp x10, x11, [x19, #ARM_SMCCC_1_2_REGS_X10_OFFS]
|
||||
+ stp x12, x13, [x19, #ARM_SMCCC_1_2_REGS_X12_OFFS]
|
||||
+ stp x14, x15, [x19, #ARM_SMCCC_1_2_REGS_X14_OFFS]
|
||||
+ stp x16, x17, [x19, #ARM_SMCCC_1_2_REGS_X16_OFFS]
|
||||
+
|
||||
+ /* Restore original x19 */
|
||||
+ ldp xzr, x19, [sp], #16
|
||||
+ ret
|
||||
+.endm
|
||||
+
|
||||
+/*
|
||||
+ * void arm_smccc_1_2_hvc(const struct arm_smccc_1_2_regs *args,
|
||||
+ * struct arm_smccc_1_2_regs *res);
|
||||
+ */
|
||||
+SYM_FUNC_START(arm_smccc_1_2_hvc)
|
||||
+ SMCCC_1_2 hvc
|
||||
+SYM_FUNC_END(arm_smccc_1_2_hvc)
|
||||
+EXPORT_SYMBOL(arm_smccc_1_2_hvc)
|
||||
+
|
||||
+/*
|
||||
+ * void arm_smccc_1_2_smc(const struct arm_smccc_1_2_regs *args,
|
||||
+ * struct arm_smccc_1_2_regs *res);
|
||||
+ */
|
||||
+SYM_FUNC_START(arm_smccc_1_2_smc)
|
||||
+ SMCCC_1_2 smc
|
||||
+SYM_FUNC_END(arm_smccc_1_2_smc)
|
||||
+EXPORT_SYMBOL(arm_smccc_1_2_smc)
|
||||
diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h
|
||||
index 6861489a1890..5cef2b8b0479 100644
|
||||
--- a/include/linux/arm-smccc.h
|
||||
+++ b/include/linux/arm-smccc.h
|
||||
@@ -227,6 +227,61 @@ struct arm_smccc_res {
|
||||
unsigned long a3;
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_ARM64
|
||||
+/**
|
||||
+ * struct arm_smccc_1_2_regs - Arguments for or Results from SMC/HVC call
|
||||
+ * @a0-a17 argument values from registers 0 to 17
|
||||
+ */
|
||||
+struct arm_smccc_1_2_regs {
|
||||
+ unsigned long a0;
|
||||
+ unsigned long a1;
|
||||
+ unsigned long a2;
|
||||
+ unsigned long a3;
|
||||
+ unsigned long a4;
|
||||
+ unsigned long a5;
|
||||
+ unsigned long a6;
|
||||
+ unsigned long a7;
|
||||
+ unsigned long a8;
|
||||
+ unsigned long a9;
|
||||
+ unsigned long a10;
|
||||
+ unsigned long a11;
|
||||
+ unsigned long a12;
|
||||
+ unsigned long a13;
|
||||
+ unsigned long a14;
|
||||
+ unsigned long a15;
|
||||
+ unsigned long a16;
|
||||
+ unsigned long a17;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * arm_smccc_1_2_hvc() - make HVC calls
|
||||
+ * @args: arguments passed via struct arm_smccc_1_2_regs
|
||||
+ * @res: result values via struct arm_smccc_1_2_regs
|
||||
+ *
|
||||
+ * This function is used to make HVC calls following SMC Calling Convention
|
||||
+ * v1.2 or above. The content of the supplied param are copied from the
|
||||
+ * structure to registers prior to the HVC instruction. The return values
|
||||
+ * are updated with the content from registers on return from the HVC
|
||||
+ * instruction.
|
||||
+ */
|
||||
+asmlinkage void arm_smccc_1_2_hvc(const struct arm_smccc_1_2_regs *args,
|
||||
+ struct arm_smccc_1_2_regs *res);
|
||||
+
|
||||
+/**
|
||||
+ * arm_smccc_1_2_smc() - make SMC calls
|
||||
+ * @args: arguments passed via struct arm_smccc_1_2_regs
|
||||
+ * @res: result values via struct arm_smccc_1_2_regs
|
||||
+ *
|
||||
+ * This function is used to make SMC calls following SMC Calling Convention
|
||||
+ * v1.2 or above. The content of the supplied param are copied from the
|
||||
+ * structure to registers prior to the SMC instruction. The return values
|
||||
+ * are updated with the content from registers on return from the SMC
|
||||
+ * instruction.
|
||||
+ */
|
||||
+asmlinkage void arm_smccc_1_2_smc(const struct arm_smccc_1_2_regs *args,
|
||||
+ struct arm_smccc_1_2_regs *res);
|
||||
+#endif
|
||||
+
|
||||
/**
|
||||
* struct arm_smccc_quirk - Contains quirk information
|
||||
* @id: quirk identification
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+423
@@ -0,0 +1,423 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From e781858488b918e30a6ff28e9eab6058b787e3b3 Mon Sep 17 00:00:00 2001
|
||||
From: Sudeep Holla <sudeep.holla@arm.com>
|
||||
Date: Fri, 21 May 2021 16:10:29 +0100
|
||||
Subject: [PATCH] firmware: arm_ffa: Add initial FFA bus support for device
|
||||
enumeration
|
||||
|
||||
The Arm FF for Armv8-A specification has concept of endpoints or
|
||||
partitions. In the Normal world, a partition could be a VM when
|
||||
the Virtualization extension is enabled or the kernel itself.
|
||||
|
||||
In order to handle multiple partitions, we can create a FFA device for
|
||||
each such partition on a dedicated FFA bus. Similarly, different drivers
|
||||
requiring FFA transport can be registered on the same bus. We can match
|
||||
the device and drivers using UUID. This is mostly for the in-kernel
|
||||
users with FFA drivers.
|
||||
|
||||
Link: https://lore.kernel.org/r/20210521151033.181846-2-sudeep.holla@arm.com
|
||||
Tested-by: Jens Wiklander <jens.wiklander@linaro.org>
|
||||
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
---
|
||||
MAINTAINERS | 7 +
|
||||
drivers/firmware/Kconfig | 1 +
|
||||
drivers/firmware/Makefile | 1 +
|
||||
drivers/firmware/arm_ffa/Kconfig | 16 +++
|
||||
drivers/firmware/arm_ffa/Makefile | 4 +
|
||||
drivers/firmware/arm_ffa/bus.c | 207 ++++++++++++++++++++++++++++++
|
||||
include/linux/arm_ffa.h | 91 +++++++++++++
|
||||
7 files changed, 327 insertions(+)
|
||||
create mode 100644 drivers/firmware/arm_ffa/Kconfig
|
||||
create mode 100644 drivers/firmware/arm_ffa/Makefile
|
||||
create mode 100644 drivers/firmware/arm_ffa/bus.c
|
||||
create mode 100644 include/linux/arm_ffa.h
|
||||
|
||||
diff --git a/MAINTAINERS b/MAINTAINERS
|
||||
index bd7aff0c120f..3b8ab94cf697 100644
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -7069,6 +7069,13 @@ F: include/linux/firewire.h
|
||||
F: include/uapi/linux/firewire*.h
|
||||
F: tools/firewire/
|
||||
|
||||
+FIRMWARE FRAMEWORK FOR ARMV8-A
|
||||
+M: Sudeep Holla <sudeep.holla@arm.com>
|
||||
+L: linux-arm-kernel@lists.infradead.org
|
||||
+S: Maintained
|
||||
+F: drivers/firmware/arm_ffa/
|
||||
+F: include/linux/arm_ffa.h
|
||||
+
|
||||
FIRMWARE LOADER (request_firmware)
|
||||
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig
|
||||
index db0ea2d2d75a..b53ac9fc7704 100644
|
||||
--- a/drivers/firmware/Kconfig
|
||||
+++ b/drivers/firmware/Kconfig
|
||||
@@ -296,6 +296,7 @@ config TURRIS_MOX_RWTM
|
||||
other manufacturing data and also utilize the Entropy Bit Generator
|
||||
for hardware random number generation.
|
||||
|
||||
+source "drivers/firmware/arm_ffa/Kconfig"
|
||||
source "drivers/firmware/broadcom/Kconfig"
|
||||
source "drivers/firmware/google/Kconfig"
|
||||
source "drivers/firmware/efi/Kconfig"
|
||||
diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile
|
||||
index 5e013b6a3692..546ac8e7f6d0 100644
|
||||
--- a/drivers/firmware/Makefile
|
||||
+++ b/drivers/firmware/Makefile
|
||||
@@ -22,6 +22,7 @@ obj-$(CONFIG_TI_SCI_PROTOCOL) += ti_sci.o
|
||||
obj-$(CONFIG_TRUSTED_FOUNDATIONS) += trusted_foundations.o
|
||||
obj-$(CONFIG_TURRIS_MOX_RWTM) += turris-mox-rwtm.o
|
||||
|
||||
+obj-y += arm_ffa/
|
||||
obj-y += arm_scmi/
|
||||
obj-y += broadcom/
|
||||
obj-y += meson/
|
||||
diff --git a/drivers/firmware/arm_ffa/Kconfig b/drivers/firmware/arm_ffa/Kconfig
|
||||
new file mode 100644
|
||||
index 000000000000..261a3660650a
|
||||
--- /dev/null
|
||||
+++ b/drivers/firmware/arm_ffa/Kconfig
|
||||
@@ -0,0 +1,16 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0-only
|
||||
+config ARM_FFA_TRANSPORT
|
||||
+ tristate "Arm Firmware Framework for Armv8-A"
|
||||
+ depends on OF
|
||||
+ depends on ARM64
|
||||
+ default n
|
||||
+ help
|
||||
+ This Firmware Framework(FF) for Arm A-profile processors describes
|
||||
+ interfaces that standardize communication between the various
|
||||
+ software images which includes communication between images in
|
||||
+ the Secure world and Normal world. It also leverages the
|
||||
+ virtualization extension to isolate software images provided
|
||||
+ by an ecosystem of vendors from each other.
|
||||
+
|
||||
+ This driver provides interface for all the client drivers making
|
||||
+ use of the features offered by ARM FF-A.
|
||||
diff --git a/drivers/firmware/arm_ffa/Makefile b/drivers/firmware/arm_ffa/Makefile
|
||||
new file mode 100644
|
||||
index 000000000000..bfe4323a8784
|
||||
--- /dev/null
|
||||
+++ b/drivers/firmware/arm_ffa/Makefile
|
||||
@@ -0,0 +1,4 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0-only
|
||||
+ffa-bus-y = bus.o
|
||||
+ffa-module-objs := $(ffa-bus-y)
|
||||
+obj-$(CONFIG_ARM_FFA_TRANSPORT) = ffa-module.o
|
||||
diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c
|
||||
new file mode 100644
|
||||
index 000000000000..a17874bed946
|
||||
--- /dev/null
|
||||
+++ b/drivers/firmware/arm_ffa/bus.c
|
||||
@@ -0,0 +1,207 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Copyright (C) 2021 ARM Ltd.
|
||||
+ */
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <linux/arm_ffa.h>
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/fs.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/types.h>
|
||||
+
|
||||
+static int ffa_device_match(struct device *dev, struct device_driver *drv)
|
||||
+{
|
||||
+ const struct ffa_device_id *id_table;
|
||||
+ struct ffa_device *ffa_dev;
|
||||
+
|
||||
+ id_table = to_ffa_driver(drv)->id_table;
|
||||
+ ffa_dev = to_ffa_dev(dev);
|
||||
+
|
||||
+ while (!uuid_is_null(&id_table->uuid)) {
|
||||
+ if (uuid_equal(&ffa_dev->uuid, &id_table->uuid))
|
||||
+ return 1;
|
||||
+ id_table++;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ffa_device_probe(struct device *dev)
|
||||
+{
|
||||
+ struct ffa_driver *ffa_drv = to_ffa_driver(dev->driver);
|
||||
+ struct ffa_device *ffa_dev = to_ffa_dev(dev);
|
||||
+
|
||||
+ if (!ffa_device_match(dev, dev->driver))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ return ffa_drv->probe(ffa_dev);
|
||||
+}
|
||||
+
|
||||
+static int ffa_device_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||
+{
|
||||
+ struct ffa_device *ffa_dev = to_ffa_dev(dev);
|
||||
+
|
||||
+ return add_uevent_var(env, "MODALIAS=arm_ffa:%04x:%pUb",
|
||||
+ ffa_dev->vm_id, &ffa_dev->uuid);
|
||||
+}
|
||||
+
|
||||
+static ssize_t partition_id_show(struct device *dev,
|
||||
+ struct device_attribute *attr, char *buf)
|
||||
+{
|
||||
+ struct ffa_device *ffa_dev = to_ffa_dev(dev);
|
||||
+
|
||||
+ return sprintf(buf, "0x%04x\n", ffa_dev->vm_id);
|
||||
+}
|
||||
+static DEVICE_ATTR_RO(partition_id);
|
||||
+
|
||||
+static ssize_t uuid_show(struct device *dev, struct device_attribute *attr,
|
||||
+ char *buf)
|
||||
+{
|
||||
+ struct ffa_device *ffa_dev = to_ffa_dev(dev);
|
||||
+
|
||||
+ return sprintf(buf, "%pUb\n", &ffa_dev->uuid);
|
||||
+}
|
||||
+static DEVICE_ATTR_RO(uuid);
|
||||
+
|
||||
+static struct attribute *ffa_device_attributes_attrs[] = {
|
||||
+ &dev_attr_partition_id.attr,
|
||||
+ &dev_attr_uuid.attr,
|
||||
+ NULL,
|
||||
+};
|
||||
+ATTRIBUTE_GROUPS(ffa_device_attributes);
|
||||
+
|
||||
+struct bus_type ffa_bus_type = {
|
||||
+ .name = "arm_ffa",
|
||||
+ .match = ffa_device_match,
|
||||
+ .probe = ffa_device_probe,
|
||||
+ .uevent = ffa_device_uevent,
|
||||
+ .dev_groups = ffa_device_attributes_groups,
|
||||
+};
|
||||
+EXPORT_SYMBOL_GPL(ffa_bus_type);
|
||||
+
|
||||
+int ffa_driver_register(struct ffa_driver *driver, struct module *owner,
|
||||
+ const char *mod_name)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ driver->driver.bus = &ffa_bus_type;
|
||||
+ driver->driver.name = driver->name;
|
||||
+ driver->driver.owner = owner;
|
||||
+ driver->driver.mod_name = mod_name;
|
||||
+
|
||||
+ ret = driver_register(&driver->driver);
|
||||
+ if (!ret)
|
||||
+ pr_debug("registered new ffa driver %s\n", driver->name);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(ffa_driver_register);
|
||||
+
|
||||
+void ffa_driver_unregister(struct ffa_driver *driver)
|
||||
+{
|
||||
+ driver_unregister(&driver->driver);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(ffa_driver_unregister);
|
||||
+
|
||||
+static void ffa_release_device(struct device *dev)
|
||||
+{
|
||||
+ struct ffa_device *ffa_dev = to_ffa_dev(dev);
|
||||
+
|
||||
+ kfree(ffa_dev);
|
||||
+}
|
||||
+
|
||||
+static int __ffa_devices_unregister(struct device *dev, void *data)
|
||||
+{
|
||||
+ ffa_release_device(dev);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void ffa_devices_unregister(void)
|
||||
+{
|
||||
+ bus_for_each_dev(&ffa_bus_type, NULL, NULL,
|
||||
+ __ffa_devices_unregister);
|
||||
+}
|
||||
+
|
||||
+bool ffa_device_is_valid(struct ffa_device *ffa_dev)
|
||||
+{
|
||||
+ bool valid = false;
|
||||
+ struct device *dev = NULL;
|
||||
+ struct ffa_device *tmp_dev;
|
||||
+
|
||||
+ do {
|
||||
+ dev = bus_find_next_device(&ffa_bus_type, dev);
|
||||
+ tmp_dev = to_ffa_dev(dev);
|
||||
+ if (tmp_dev == ffa_dev) {
|
||||
+ valid = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ put_device(dev);
|
||||
+ } while (dev);
|
||||
+
|
||||
+ put_device(dev);
|
||||
+
|
||||
+ return valid;
|
||||
+}
|
||||
+
|
||||
+struct ffa_device *ffa_device_register(const uuid_t *uuid, int vm_id)
|
||||
+{
|
||||
+ int ret;
|
||||
+ struct device *dev;
|
||||
+ struct ffa_device *ffa_dev;
|
||||
+
|
||||
+ ffa_dev = kzalloc(sizeof(*ffa_dev), GFP_KERNEL);
|
||||
+ if (!ffa_dev)
|
||||
+ return NULL;
|
||||
+
|
||||
+ dev = &ffa_dev->dev;
|
||||
+ dev->bus = &ffa_bus_type;
|
||||
+ dev->release = ffa_release_device;
|
||||
+ dev_set_name(&ffa_dev->dev, "arm-ffa-%04x", vm_id);
|
||||
+
|
||||
+ ffa_dev->vm_id = vm_id;
|
||||
+ uuid_copy(&ffa_dev->uuid, uuid);
|
||||
+
|
||||
+ ret = device_register(&ffa_dev->dev);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "unable to register device %s err=%d\n",
|
||||
+ dev_name(dev), ret);
|
||||
+ put_device(dev);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ return ffa_dev;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(ffa_device_register);
|
||||
+
|
||||
+void ffa_device_unregister(struct ffa_device *ffa_dev)
|
||||
+{
|
||||
+ if (!ffa_dev)
|
||||
+ return;
|
||||
+
|
||||
+ device_unregister(&ffa_dev->dev);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(ffa_device_unregister);
|
||||
+
|
||||
+static int __init arm_ffa_bus_init(void)
|
||||
+{
|
||||
+ return bus_register(&ffa_bus_type);
|
||||
+}
|
||||
+module_init(arm_ffa_bus_init);
|
||||
+
|
||||
+static void __exit arm_ffa_bus_exit(void)
|
||||
+{
|
||||
+ ffa_devices_unregister();
|
||||
+ bus_unregister(&ffa_bus_type);
|
||||
+}
|
||||
+
|
||||
+module_exit(arm_ffa_bus_exit);
|
||||
+
|
||||
+MODULE_ALIAS("arm-ffa-bus");
|
||||
+MODULE_AUTHOR("Sudeep Holla <sudeep.holla@arm.com>");
|
||||
+MODULE_DESCRIPTION("Arm FF-A bus driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h
|
||||
new file mode 100644
|
||||
index 000000000000..331ff62c9873
|
||||
--- /dev/null
|
||||
+++ b/include/linux/arm_ffa.h
|
||||
@@ -0,0 +1,91 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
+/*
|
||||
+ * Copyright (C) 2021 ARM Ltd.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _LINUX_ARM_FFA_H
|
||||
+#define _LINUX_ARM_FFA_H
|
||||
+
|
||||
+#include <linux/cdev.h>
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/uuid.h>
|
||||
+
|
||||
+/* FFA Bus/Device/Driver related */
|
||||
+struct ffa_device {
|
||||
+ int vm_id;
|
||||
+ uuid_t uuid;
|
||||
+ struct device dev;
|
||||
+};
|
||||
+
|
||||
+#define to_ffa_dev(d) container_of(d, struct ffa_device, dev)
|
||||
+
|
||||
+struct ffa_device_id {
|
||||
+ uuid_t uuid;
|
||||
+};
|
||||
+
|
||||
+struct ffa_driver {
|
||||
+ const char *name;
|
||||
+ int (*probe)(struct ffa_device *sdev);
|
||||
+ void (*remove)(struct ffa_device *sdev);
|
||||
+ const struct ffa_device_id *id_table;
|
||||
+
|
||||
+ struct device_driver driver;
|
||||
+};
|
||||
+
|
||||
+#define to_ffa_driver(d) container_of(d, struct ffa_driver, driver)
|
||||
+
|
||||
+static inline void ffa_dev_set_drvdata(struct ffa_device *fdev, void *data)
|
||||
+{
|
||||
+ fdev->dev.driver_data = data;
|
||||
+}
|
||||
+
|
||||
+#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)
|
||||
+struct ffa_device *ffa_device_register(const uuid_t *uuid, int vm_id);
|
||||
+void ffa_device_unregister(struct ffa_device *ffa_dev);
|
||||
+int ffa_driver_register(struct ffa_driver *driver, struct module *owner,
|
||||
+ const char *mod_name);
|
||||
+void ffa_driver_unregister(struct ffa_driver *driver);
|
||||
+bool ffa_device_is_valid(struct ffa_device *ffa_dev);
|
||||
+
|
||||
+#else
|
||||
+static inline
|
||||
+struct ffa_device *ffa_device_register(const uuid_t *uuid, int vm_id)
|
||||
+{
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static inline void ffa_device_unregister(struct ffa_device *dev) {}
|
||||
+
|
||||
+static inline int
|
||||
+ffa_driver_register(struct ffa_driver *driver, struct module *owner,
|
||||
+ const char *mod_name)
|
||||
+{
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static inline void ffa_driver_unregister(struct ffa_driver *driver) {}
|
||||
+
|
||||
+static inline
|
||||
+bool ffa_device_is_valid(struct ffa_device *ffa_dev) { return false; }
|
||||
+
|
||||
+#endif /* CONFIG_ARM_FFA_TRANSPORT */
|
||||
+
|
||||
+#define ffa_register(driver) \
|
||||
+ ffa_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)
|
||||
+#define ffa_unregister(driver) \
|
||||
+ ffa_driver_unregister(driver)
|
||||
+
|
||||
+/**
|
||||
+ * module_ffa_driver() - Helper macro for registering a psa_ffa driver
|
||||
+ * @__ffa_driver: ffa_driver structure
|
||||
+ *
|
||||
+ * Helper macro for psa_ffa drivers to set up proper module init / exit
|
||||
+ * functions. Replaces module_init() and module_exit() and keeps people from
|
||||
+ * printing pointless things to the kernel log when their driver is loaded.
|
||||
+ */
|
||||
+#define module_ffa_driver(__ffa_driver) \
|
||||
+ module_driver(__ffa_driver, ffa_register, ffa_unregister)
|
||||
+
|
||||
+#endif /* _LINUX_ARM_FFA_H */
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+422
@@ -0,0 +1,422 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 3bbfe9871005f38df2955b2e125933edf1d2feef Mon Sep 17 00:00:00 2001
|
||||
From: Sudeep Holla <sudeep.holla@arm.com>
|
||||
Date: Fri, 21 May 2021 16:10:30 +0100
|
||||
Subject: [PATCH] firmware: arm_ffa: Add initial Arm FFA driver support
|
||||
|
||||
This just add a basic driver that sets up the transport(e.g. SMCCC),
|
||||
checks the FFA version implemented, get the partition ID for self and
|
||||
sets up the Tx/Rx buffers for communication.
|
||||
|
||||
Link: https://lore.kernel.org/r/20210521151033.181846-3-sudeep.holla@arm.com
|
||||
Tested-by: Jens Wiklander <jens.wiklander@linaro.org>
|
||||
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
---
|
||||
drivers/firmware/arm_ffa/Makefile | 3 +-
|
||||
drivers/firmware/arm_ffa/bus.c | 14 +-
|
||||
drivers/firmware/arm_ffa/common.h | 24 +++
|
||||
drivers/firmware/arm_ffa/driver.c | 311 ++++++++++++++++++++++++++++++
|
||||
4 files changed, 341 insertions(+), 11 deletions(-)
|
||||
create mode 100644 drivers/firmware/arm_ffa/common.h
|
||||
create mode 100644 drivers/firmware/arm_ffa/driver.c
|
||||
|
||||
diff --git a/drivers/firmware/arm_ffa/Makefile b/drivers/firmware/arm_ffa/Makefile
|
||||
index bfe4323a8784..82d0d35c5324 100644
|
||||
--- a/drivers/firmware/arm_ffa/Makefile
|
||||
+++ b/drivers/firmware/arm_ffa/Makefile
|
||||
@@ -1,4 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
ffa-bus-y = bus.o
|
||||
-ffa-module-objs := $(ffa-bus-y)
|
||||
+ffa-driver-y = driver.o
|
||||
+ffa-module-objs := $(ffa-bus-y) $(ffa-driver-y)
|
||||
obj-$(CONFIG_ARM_FFA_TRANSPORT) = ffa-module.o
|
||||
diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c
|
||||
index a17874bed946..ae1eada5dc0c 100644
|
||||
--- a/drivers/firmware/arm_ffa/bus.c
|
||||
+++ b/drivers/firmware/arm_ffa/bus.c
|
||||
@@ -13,6 +13,8 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
+#include "common.h"
|
||||
+
|
||||
static int ffa_device_match(struct device *dev, struct device_driver *drv)
|
||||
{
|
||||
const struct ffa_device_id *id_table;
|
||||
@@ -187,21 +189,13 @@ void ffa_device_unregister(struct ffa_device *ffa_dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ffa_device_unregister);
|
||||
|
||||
-static int __init arm_ffa_bus_init(void)
|
||||
+int arm_ffa_bus_init(void)
|
||||
{
|
||||
return bus_register(&ffa_bus_type);
|
||||
}
|
||||
-module_init(arm_ffa_bus_init);
|
||||
|
||||
-static void __exit arm_ffa_bus_exit(void)
|
||||
+void arm_ffa_bus_exit(void)
|
||||
{
|
||||
ffa_devices_unregister();
|
||||
bus_unregister(&ffa_bus_type);
|
||||
}
|
||||
-
|
||||
-module_exit(arm_ffa_bus_exit);
|
||||
-
|
||||
-MODULE_ALIAS("arm-ffa-bus");
|
||||
-MODULE_AUTHOR("Sudeep Holla <sudeep.holla@arm.com>");
|
||||
-MODULE_DESCRIPTION("Arm FF-A bus driver");
|
||||
-MODULE_LICENSE("GPL v2");
|
||||
diff --git a/drivers/firmware/arm_ffa/common.h b/drivers/firmware/arm_ffa/common.h
|
||||
new file mode 100644
|
||||
index 000000000000..2d3a32f67d5d
|
||||
--- /dev/null
|
||||
+++ b/drivers/firmware/arm_ffa/common.h
|
||||
@@ -0,0 +1,24 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 */
|
||||
+/*
|
||||
+ * Copyright (C) 2021 ARM Ltd.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _FFA_COMMON_H
|
||||
+#define _FFA_COMMON_H
|
||||
+
|
||||
+#include <linux/arm-smccc.h>
|
||||
+#include <linux/err.h>
|
||||
+
|
||||
+typedef struct arm_smccc_1_2_regs ffa_value_t;
|
||||
+
|
||||
+typedef void (ffa_fn)(ffa_value_t, ffa_value_t *);
|
||||
+
|
||||
+int arm_ffa_bus_init(void);
|
||||
+void arm_ffa_bus_exit(void);
|
||||
+
|
||||
+static inline int __init ffa_transport_init(ffa_fn **invoke_ffa_fn)
|
||||
+{
|
||||
+ return -EOPNOTSUPP;
|
||||
+}
|
||||
+
|
||||
+#endif /* _FFA_COMMON_H */
|
||||
diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c
|
||||
new file mode 100644
|
||||
index 000000000000..4846f079dca0
|
||||
--- /dev/null
|
||||
+++ b/drivers/firmware/arm_ffa/driver.c
|
||||
@@ -0,0 +1,311 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+/*
|
||||
+ * Arm Firmware Framework for ARMv8-A(FFA) interface driver
|
||||
+ *
|
||||
+ * The Arm FFA specification[1] describes a software architecture to
|
||||
+ * leverages the virtualization extension to isolate software images
|
||||
+ * provided by an ecosystem of vendors from each other and describes
|
||||
+ * interfaces that standardize communication between the various software
|
||||
+ * images including communication between images in the Secure world and
|
||||
+ * Normal world. Any Hypervisor could use the FFA interfaces to enable
|
||||
+ * communication between VMs it manages.
|
||||
+ *
|
||||
+ * The Hypervisor a.k.a Partition managers in FFA terminology can assign
|
||||
+ * system resources(Memory regions, Devices, CPU cycles) to the partitions
|
||||
+ * and manage isolation amongst them.
|
||||
+ *
|
||||
+ * [1] https://developer.arm.com/docs/den0077/latest
|
||||
+ *
|
||||
+ * Copyright (C) 2021 ARM Ltd.
|
||||
+ */
|
||||
+
|
||||
+#define DRIVER_NAME "ARM FF-A"
|
||||
+#define pr_fmt(fmt) DRIVER_NAME ": " fmt
|
||||
+
|
||||
+#include <linux/arm_ffa.h>
|
||||
+#include <linux/bitfield.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/slab.h>
|
||||
+
|
||||
+#include "common.h"
|
||||
+
|
||||
+#define FFA_DRIVER_VERSION FFA_VERSION_1_0
|
||||
+
|
||||
+#define FFA_SMC(calling_convention, func_num) \
|
||||
+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, (calling_convention), \
|
||||
+ ARM_SMCCC_OWNER_STANDARD, (func_num))
|
||||
+
|
||||
+#define FFA_SMC_32(func_num) FFA_SMC(ARM_SMCCC_SMC_32, (func_num))
|
||||
+#define FFA_SMC_64(func_num) FFA_SMC(ARM_SMCCC_SMC_64, (func_num))
|
||||
+
|
||||
+#define FFA_ERROR FFA_SMC_32(0x60)
|
||||
+#define FFA_SUCCESS FFA_SMC_32(0x61)
|
||||
+#define FFA_INTERRUPT FFA_SMC_32(0x62)
|
||||
+#define FFA_VERSION FFA_SMC_32(0x63)
|
||||
+#define FFA_FEATURES FFA_SMC_32(0x64)
|
||||
+#define FFA_RX_RELEASE FFA_SMC_32(0x65)
|
||||
+#define FFA_RXTX_MAP FFA_SMC_32(0x66)
|
||||
+#define FFA_FN64_RXTX_MAP FFA_SMC_64(0x66)
|
||||
+#define FFA_RXTX_UNMAP FFA_SMC_32(0x67)
|
||||
+#define FFA_PARTITION_INFO_GET FFA_SMC_32(0x68)
|
||||
+#define FFA_ID_GET FFA_SMC_32(0x69)
|
||||
+#define FFA_MSG_POLL FFA_SMC_32(0x6A)
|
||||
+#define FFA_MSG_WAIT FFA_SMC_32(0x6B)
|
||||
+#define FFA_YIELD FFA_SMC_32(0x6C)
|
||||
+#define FFA_RUN FFA_SMC_32(0x6D)
|
||||
+#define FFA_MSG_SEND FFA_SMC_32(0x6E)
|
||||
+#define FFA_MSG_SEND_DIRECT_REQ FFA_SMC_32(0x6F)
|
||||
+#define FFA_FN64_MSG_SEND_DIRECT_REQ FFA_SMC_64(0x6F)
|
||||
+#define FFA_MSG_SEND_DIRECT_RESP FFA_SMC_32(0x70)
|
||||
+#define FFA_FN64_MSG_SEND_DIRECT_RESP FFA_SMC_64(0x70)
|
||||
+#define FFA_MEM_DONATE FFA_SMC_32(0x71)
|
||||
+#define FFA_FN64_MEM_DONATE FFA_SMC_64(0x71)
|
||||
+#define FFA_MEM_LEND FFA_SMC_32(0x72)
|
||||
+#define FFA_FN64_MEM_LEND FFA_SMC_64(0x72)
|
||||
+#define FFA_MEM_SHARE FFA_SMC_32(0x73)
|
||||
+#define FFA_FN64_MEM_SHARE FFA_SMC_64(0x73)
|
||||
+#define FFA_MEM_RETRIEVE_REQ FFA_SMC_32(0x74)
|
||||
+#define FFA_FN64_MEM_RETRIEVE_REQ FFA_SMC_64(0x74)
|
||||
+#define FFA_MEM_RETRIEVE_RESP FFA_SMC_32(0x75)
|
||||
+#define FFA_MEM_RELINQUISH FFA_SMC_32(0x76)
|
||||
+#define FFA_MEM_RECLAIM FFA_SMC_32(0x77)
|
||||
+#define FFA_MEM_OP_PAUSE FFA_SMC_32(0x78)
|
||||
+#define FFA_MEM_OP_RESUME FFA_SMC_32(0x79)
|
||||
+#define FFA_MEM_FRAG_RX FFA_SMC_32(0x7A)
|
||||
+#define FFA_MEM_FRAG_TX FFA_SMC_32(0x7B)
|
||||
+#define FFA_NORMAL_WORLD_RESUME FFA_SMC_32(0x7C)
|
||||
+
|
||||
+/*
|
||||
+ * For some calls it is necessary to use SMC64 to pass or return 64-bit values.
|
||||
+ * For such calls FFA_FN_NATIVE(name) will choose the appropriate
|
||||
+ * (native-width) function ID.
|
||||
+ */
|
||||
+#ifdef CONFIG_64BIT
|
||||
+#define FFA_FN_NATIVE(name) FFA_FN64_##name
|
||||
+#else
|
||||
+#define FFA_FN_NATIVE(name) FFA_##name
|
||||
+#endif
|
||||
+
|
||||
+/* FFA error codes. */
|
||||
+#define FFA_RET_SUCCESS (0)
|
||||
+#define FFA_RET_NOT_SUPPORTED (-1)
|
||||
+#define FFA_RET_INVALID_PARAMETERS (-2)
|
||||
+#define FFA_RET_NO_MEMORY (-3)
|
||||
+#define FFA_RET_BUSY (-4)
|
||||
+#define FFA_RET_INTERRUPTED (-5)
|
||||
+#define FFA_RET_DENIED (-6)
|
||||
+#define FFA_RET_RETRY (-7)
|
||||
+#define FFA_RET_ABORTED (-8)
|
||||
+
|
||||
+#define MAJOR_VERSION_MASK GENMASK(30, 16)
|
||||
+#define MINOR_VERSION_MASK GENMASK(15, 0)
|
||||
+#define MAJOR_VERSION(x) ((u16)(FIELD_GET(MAJOR_VERSION_MASK, (x))))
|
||||
+#define MINOR_VERSION(x) ((u16)(FIELD_GET(MINOR_VERSION_MASK, (x))))
|
||||
+#define PACK_VERSION_INFO(major, minor) \
|
||||
+ (FIELD_PREP(MAJOR_VERSION_MASK, (major)) | \
|
||||
+ FIELD_PREP(MINOR_VERSION_MASK, (minor)))
|
||||
+#define FFA_VERSION_1_0 PACK_VERSION_INFO(1, 0)
|
||||
+#define FFA_MIN_VERSION FFA_VERSION_1_0
|
||||
+
|
||||
+#define SENDER_ID_MASK GENMASK(31, 16)
|
||||
+#define RECEIVER_ID_MASK GENMASK(15, 0)
|
||||
+#define SENDER_ID(x) ((u16)(FIELD_GET(SENDER_ID_MASK, (x))))
|
||||
+#define RECEIVER_ID(x) ((u16)(FIELD_GET(RECEIVER_ID_MASK, (x))))
|
||||
+#define PACK_TARGET_INFO(s, r) \
|
||||
+ (FIELD_PREP(SENDER_ID_MASK, (s)) | FIELD_PREP(RECEIVER_ID_MASK, (r)))
|
||||
+
|
||||
+/**
|
||||
+ * FF-A specification mentions explicitly about '4K pages'. This should
|
||||
+ * not be confused with the kernel PAGE_SIZE, which is the translation
|
||||
+ * granule kernel is configured and may be one among 4K, 16K and 64K.
|
||||
+ */
|
||||
+#define FFA_PAGE_SIZE SZ_4K
|
||||
+/*
|
||||
+ * Keeping RX TX buffer size as 4K for now
|
||||
+ * 64K may be preferred to keep it min a page in 64K PAGE_SIZE config
|
||||
+ */
|
||||
+#define RXTX_BUFFER_SIZE SZ_4K
|
||||
+
|
||||
+static ffa_fn *invoke_ffa_fn;
|
||||
+
|
||||
+static const int ffa_linux_errmap[] = {
|
||||
+ /* better than switch case as long as return value is continuous */
|
||||
+ 0, /* FFA_RET_SUCCESS */
|
||||
+ -EOPNOTSUPP, /* FFA_RET_NOT_SUPPORTED */
|
||||
+ -EINVAL, /* FFA_RET_INVALID_PARAMETERS */
|
||||
+ -ENOMEM, /* FFA_RET_NO_MEMORY */
|
||||
+ -EBUSY, /* FFA_RET_BUSY */
|
||||
+ -EINTR, /* FFA_RET_INTERRUPTED */
|
||||
+ -EACCES, /* FFA_RET_DENIED */
|
||||
+ -EAGAIN, /* FFA_RET_RETRY */
|
||||
+ -ECANCELED, /* FFA_RET_ABORTED */
|
||||
+};
|
||||
+
|
||||
+static inline int ffa_to_linux_errno(int errno)
|
||||
+{
|
||||
+ if (errno < FFA_RET_SUCCESS && errno >= -ARRAY_SIZE(ffa_linux_errmap))
|
||||
+ return ffa_linux_errmap[-errno];
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+struct ffa_drv_info {
|
||||
+ u32 version;
|
||||
+ u16 vm_id;
|
||||
+ struct mutex rx_lock; /* lock to protect Rx buffer */
|
||||
+ struct mutex tx_lock; /* lock to protect Tx buffer */
|
||||
+ void *rx_buffer;
|
||||
+ void *tx_buffer;
|
||||
+};
|
||||
+
|
||||
+static struct ffa_drv_info *drv_info;
|
||||
+
|
||||
+static int ffa_version_check(u32 *version)
|
||||
+{
|
||||
+ ffa_value_t ver;
|
||||
+
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = FFA_VERSION, .a1 = FFA_DRIVER_VERSION,
|
||||
+ }, &ver);
|
||||
+
|
||||
+ if (ver.a0 == FFA_RET_NOT_SUPPORTED) {
|
||||
+ pr_info("FFA_VERSION returned not supported\n");
|
||||
+ return -EOPNOTSUPP;
|
||||
+ }
|
||||
+
|
||||
+ if (ver.a0 < FFA_MIN_VERSION || ver.a0 > FFA_DRIVER_VERSION) {
|
||||
+ pr_err("Incompatible version %d.%d found\n",
|
||||
+ MAJOR_VERSION(ver.a0), MINOR_VERSION(ver.a0));
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ *version = ver.a0;
|
||||
+ pr_info("Version %d.%d found\n", MAJOR_VERSION(ver.a0),
|
||||
+ MINOR_VERSION(ver.a0));
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ffa_rxtx_map(phys_addr_t tx_buf, phys_addr_t rx_buf, u32 pg_cnt)
|
||||
+{
|
||||
+ ffa_value_t ret;
|
||||
+
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = FFA_FN_NATIVE(RXTX_MAP),
|
||||
+ .a1 = tx_buf, .a2 = rx_buf, .a3 = pg_cnt,
|
||||
+ }, &ret);
|
||||
+
|
||||
+ if (ret.a0 == FFA_ERROR)
|
||||
+ return ffa_to_linux_errno((int)ret.a2);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ffa_rxtx_unmap(u16 vm_id)
|
||||
+{
|
||||
+ ffa_value_t ret;
|
||||
+
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = FFA_RXTX_UNMAP, .a1 = PACK_TARGET_INFO(vm_id, 0),
|
||||
+ }, &ret);
|
||||
+
|
||||
+ if (ret.a0 == FFA_ERROR)
|
||||
+ return ffa_to_linux_errno((int)ret.a2);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#define VM_ID_MASK GENMASK(15, 0)
|
||||
+static int ffa_id_get(u16 *vm_id)
|
||||
+{
|
||||
+ ffa_value_t id;
|
||||
+
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = FFA_ID_GET,
|
||||
+ }, &id);
|
||||
+
|
||||
+ if (id.a0 == FFA_ERROR)
|
||||
+ return ffa_to_linux_errno((int)id.a2);
|
||||
+
|
||||
+ *vm_id = FIELD_GET(VM_ID_MASK, (id.a2));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int __init ffa_init(void)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = ffa_transport_init(&invoke_ffa_fn);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = arm_ffa_bus_init();
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ drv_info = kzalloc(sizeof(*drv_info), GFP_KERNEL);
|
||||
+ if (!drv_info) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto ffa_bus_exit;
|
||||
+ }
|
||||
+
|
||||
+ ret = ffa_version_check(&drv_info->version);
|
||||
+ if (ret)
|
||||
+ goto free_drv_info;
|
||||
+
|
||||
+ if (ffa_id_get(&drv_info->vm_id)) {
|
||||
+ pr_err("failed to obtain VM id for self\n");
|
||||
+ ret = -ENODEV;
|
||||
+ goto free_drv_info;
|
||||
+ }
|
||||
+
|
||||
+ drv_info->rx_buffer = alloc_pages_exact(RXTX_BUFFER_SIZE, GFP_KERNEL);
|
||||
+ if (!drv_info->rx_buffer) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto free_pages;
|
||||
+ }
|
||||
+
|
||||
+ drv_info->tx_buffer = alloc_pages_exact(RXTX_BUFFER_SIZE, GFP_KERNEL);
|
||||
+ if (!drv_info->tx_buffer) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto free_pages;
|
||||
+ }
|
||||
+
|
||||
+ ret = ffa_rxtx_map(virt_to_phys(drv_info->tx_buffer),
|
||||
+ virt_to_phys(drv_info->rx_buffer),
|
||||
+ RXTX_BUFFER_SIZE / FFA_PAGE_SIZE);
|
||||
+ if (ret) {
|
||||
+ pr_err("failed to register FFA RxTx buffers\n");
|
||||
+ goto free_pages;
|
||||
+ }
|
||||
+
|
||||
+ mutex_init(&drv_info->rx_lock);
|
||||
+ mutex_init(&drv_info->tx_lock);
|
||||
+
|
||||
+ return 0;
|
||||
+free_pages:
|
||||
+ if (drv_info->tx_buffer)
|
||||
+ free_pages_exact(drv_info->tx_buffer, RXTX_BUFFER_SIZE);
|
||||
+ free_pages_exact(drv_info->rx_buffer, RXTX_BUFFER_SIZE);
|
||||
+free_drv_info:
|
||||
+ kfree(drv_info);
|
||||
+ffa_bus_exit:
|
||||
+ arm_ffa_bus_exit();
|
||||
+ return ret;
|
||||
+}
|
||||
+subsys_initcall(ffa_init);
|
||||
+
|
||||
+static void __exit ffa_exit(void)
|
||||
+{
|
||||
+ ffa_rxtx_unmap(drv_info->vm_id);
|
||||
+ free_pages_exact(drv_info->tx_buffer, RXTX_BUFFER_SIZE);
|
||||
+ free_pages_exact(drv_info->rx_buffer, RXTX_BUFFER_SIZE);
|
||||
+ kfree(drv_info);
|
||||
+ arm_ffa_bus_exit();
|
||||
+}
|
||||
+module_exit(ffa_exit);
|
||||
+
|
||||
+MODULE_ALIAS("arm-ffa");
|
||||
+MODULE_AUTHOR("Sudeep Holla <sudeep.holla@arm.com>");
|
||||
+MODULE_DESCRIPTION("Arm FF-A interface driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+119
@@ -0,0 +1,119 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 714be77e976a4b013b935b3223b2ef68856084d0 Mon Sep 17 00:00:00 2001
|
||||
From: Sudeep Holla <sudeep.holla@arm.com>
|
||||
Date: Fri, 21 May 2021 16:10:31 +0100
|
||||
Subject: [PATCH] firmware: arm_ffa: Add support for SMCCC as transport to FFA
|
||||
driver
|
||||
|
||||
There are requests to keep the transport separate in order to allow
|
||||
other possible transports like virtio. So let us keep the SMCCC transport
|
||||
specific routines abstracted.
|
||||
|
||||
It is kept simple for now. Once we add another transport, we can develop
|
||||
better abstraction.
|
||||
|
||||
Link: https://lore.kernel.org/r/20210521151033.181846-4-sudeep.holla@arm.com
|
||||
Tested-by: Jens Wiklander <jens.wiklander@linaro.org>
|
||||
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
|
||||
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
---
|
||||
drivers/firmware/arm_ffa/Kconfig | 5 ++++
|
||||
drivers/firmware/arm_ffa/Makefile | 3 ++-
|
||||
drivers/firmware/arm_ffa/common.h | 4 ++++
|
||||
drivers/firmware/arm_ffa/smccc.c | 39 +++++++++++++++++++++++++++++++
|
||||
4 files changed, 50 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/firmware/arm_ffa/smccc.c
|
||||
|
||||
diff --git a/drivers/firmware/arm_ffa/Kconfig b/drivers/firmware/arm_ffa/Kconfig
|
||||
index 261a3660650a..5e3ae5cf82e8 100644
|
||||
--- a/drivers/firmware/arm_ffa/Kconfig
|
||||
+++ b/drivers/firmware/arm_ffa/Kconfig
|
||||
@@ -14,3 +14,8 @@ config ARM_FFA_TRANSPORT
|
||||
|
||||
This driver provides interface for all the client drivers making
|
||||
use of the features offered by ARM FF-A.
|
||||
+
|
||||
+config ARM_FFA_SMCCC
|
||||
+ bool
|
||||
+ default ARM_FFA_TRANSPORT
|
||||
+ depends on ARM64 && HAVE_ARM_SMCCC_DISCOVERY
|
||||
diff --git a/drivers/firmware/arm_ffa/Makefile b/drivers/firmware/arm_ffa/Makefile
|
||||
index 82d0d35c5324..9d9f37523200 100644
|
||||
--- a/drivers/firmware/arm_ffa/Makefile
|
||||
+++ b/drivers/firmware/arm_ffa/Makefile
|
||||
@@ -1,5 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
ffa-bus-y = bus.o
|
||||
ffa-driver-y = driver.o
|
||||
-ffa-module-objs := $(ffa-bus-y) $(ffa-driver-y)
|
||||
+ffa-transport-$(CONFIG_ARM_FFA_SMCCC) += smccc.o
|
||||
+ffa-module-objs := $(ffa-bus-y) $(ffa-driver-y) $(ffa-transport-y)
|
||||
obj-$(CONFIG_ARM_FFA_TRANSPORT) = ffa-module.o
|
||||
diff --git a/drivers/firmware/arm_ffa/common.h b/drivers/firmware/arm_ffa/common.h
|
||||
index 2d3a32f67d5d..f24754a59f47 100644
|
||||
--- a/drivers/firmware/arm_ffa/common.h
|
||||
+++ b/drivers/firmware/arm_ffa/common.h
|
||||
@@ -16,9 +16,13 @@ typedef void (ffa_fn)(ffa_value_t, ffa_value_t *);
|
||||
int arm_ffa_bus_init(void);
|
||||
void arm_ffa_bus_exit(void);
|
||||
|
||||
+#ifdef CONFIG_ARM_FFA_SMCCC
|
||||
+int __init ffa_transport_init(ffa_fn **invoke_ffa_fn);
|
||||
+#else
|
||||
static inline int __init ffa_transport_init(ffa_fn **invoke_ffa_fn)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
+#endif
|
||||
|
||||
#endif /* _FFA_COMMON_H */
|
||||
diff --git a/drivers/firmware/arm_ffa/smccc.c b/drivers/firmware/arm_ffa/smccc.c
|
||||
new file mode 100644
|
||||
index 000000000000..4d85bfff0a4e
|
||||
--- /dev/null
|
||||
+++ b/drivers/firmware/arm_ffa/smccc.c
|
||||
@@ -0,0 +1,39 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+/*
|
||||
+ * Copyright (C) 2021 ARM Ltd.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/printk.h>
|
||||
+
|
||||
+#include "common.h"
|
||||
+
|
||||
+static void __arm_ffa_fn_smc(ffa_value_t args, ffa_value_t *res)
|
||||
+{
|
||||
+ arm_smccc_1_2_smc(&args, res);
|
||||
+}
|
||||
+
|
||||
+static void __arm_ffa_fn_hvc(ffa_value_t args, ffa_value_t *res)
|
||||
+{
|
||||
+ arm_smccc_1_2_hvc(&args, res);
|
||||
+}
|
||||
+
|
||||
+int __init ffa_transport_init(ffa_fn **invoke_ffa_fn)
|
||||
+{
|
||||
+ enum arm_smccc_conduit conduit;
|
||||
+
|
||||
+ if (arm_smccc_get_version() < ARM_SMCCC_VERSION_1_2)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ conduit = arm_smccc_1_1_get_conduit();
|
||||
+ if (conduit == SMCCC_CONDUIT_NONE) {
|
||||
+ pr_err("%s: invalid SMCCC conduit\n", __func__);
|
||||
+ return -EOPNOTSUPP;
|
||||
+ }
|
||||
+
|
||||
+ if (conduit == SMCCC_CONDUIT_SMC)
|
||||
+ *invoke_ffa_fn = __arm_ffa_fn_smc;
|
||||
+ else
|
||||
+ *invoke_ffa_fn = __arm_ffa_fn_hvc;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+410
@@ -0,0 +1,410 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From d0c0bce831223b08e5bade2cefc93c3ddb790796 Mon Sep 17 00:00:00 2001
|
||||
From: Sudeep Holla <sudeep.holla@arm.com>
|
||||
Date: Fri, 21 May 2021 16:10:32 +0100
|
||||
Subject: [PATCH] firmware: arm_ffa: Setup in-kernel users of FFA partitions
|
||||
|
||||
Parse the FFA nodes from the device-tree and register all the partitions
|
||||
whose services will be used in the kernel.
|
||||
|
||||
In order to also enable in-kernel users of FFA interface, let us add
|
||||
simple set of operations for such devices.
|
||||
|
||||
The in-kernel users are registered without the character device interface.
|
||||
|
||||
Link: https://lore.kernel.org/r/20210521151033.181846-5-sudeep.holla@arm.com
|
||||
Tested-by: Jens Wiklander <jens.wiklander@linaro.org>
|
||||
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
|
||||
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
---
|
||||
drivers/firmware/arm_ffa/bus.c | 9 ++
|
||||
drivers/firmware/arm_ffa/common.h | 3 +
|
||||
drivers/firmware/arm_ffa/driver.c | 221 ++++++++++++++++++++++++++++++
|
||||
include/linux/arm_ffa.h | 39 +++++-
|
||||
4 files changed, 271 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c
|
||||
index ae1eada5dc0c..83166e02b191 100644
|
||||
--- a/drivers/firmware/arm_ffa/bus.c
|
||||
+++ b/drivers/firmware/arm_ffa/bus.c
|
||||
@@ -24,6 +24,15 @@ static int ffa_device_match(struct device *dev, struct device_driver *drv)
|
||||
ffa_dev = to_ffa_dev(dev);
|
||||
|
||||
while (!uuid_is_null(&id_table->uuid)) {
|
||||
+ /*
|
||||
+ * FF-A v1.0 doesn't provide discovery of UUIDs, just the
|
||||
+ * partition IDs, so fetch the partitions IDs for this
|
||||
+ * id_table UUID and assign the UUID to the device if the
|
||||
+ * partition ID matches
|
||||
+ */
|
||||
+ if (uuid_is_null(&ffa_dev->uuid))
|
||||
+ ffa_device_match_uuid(ffa_dev, &id_table->uuid);
|
||||
+
|
||||
if (uuid_equal(&ffa_dev->uuid, &id_table->uuid))
|
||||
return 1;
|
||||
id_table++;
|
||||
diff --git a/drivers/firmware/arm_ffa/common.h b/drivers/firmware/arm_ffa/common.h
|
||||
index f24754a59f47..d6eccf1fd3f6 100644
|
||||
--- a/drivers/firmware/arm_ffa/common.h
|
||||
+++ b/drivers/firmware/arm_ffa/common.h
|
||||
@@ -6,6 +6,7 @@
|
||||
#ifndef _FFA_COMMON_H
|
||||
#define _FFA_COMMON_H
|
||||
|
||||
+#include <linux/arm_ffa.h>
|
||||
#include <linux/arm-smccc.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
@@ -15,6 +16,8 @@ typedef void (ffa_fn)(ffa_value_t, ffa_value_t *);
|
||||
|
||||
int arm_ffa_bus_init(void);
|
||||
void arm_ffa_bus_exit(void);
|
||||
+bool ffa_device_is_valid(struct ffa_device *ffa_dev);
|
||||
+void ffa_device_match_uuid(struct ffa_device *ffa_dev, const uuid_t *uuid);
|
||||
|
||||
#ifdef CONFIG_ARM_FFA_SMCCC
|
||||
int __init ffa_transport_init(ffa_fn **invoke_ffa_fn);
|
||||
diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c
|
||||
index 4846f079dca0..85b9bbdbeabe 100644
|
||||
--- a/drivers/firmware/arm_ffa/driver.c
|
||||
+++ b/drivers/firmware/arm_ffa/driver.c
|
||||
@@ -24,9 +24,12 @@
|
||||
|
||||
#include <linux/arm_ffa.h>
|
||||
#include <linux/bitfield.h>
|
||||
+#include <linux/device.h>
|
||||
#include <linux/io.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/uuid.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
@@ -185,6 +188,22 @@ static int ffa_version_check(u32 *version)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int ffa_rx_release(void)
|
||||
+{
|
||||
+ ffa_value_t ret;
|
||||
+
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = FFA_RX_RELEASE,
|
||||
+ }, &ret);
|
||||
+
|
||||
+ if (ret.a0 == FFA_ERROR)
|
||||
+ return ffa_to_linux_errno((int)ret.a2);
|
||||
+
|
||||
+ /* check for ret.a0 == FFA_RX_RELEASE ? */
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int ffa_rxtx_map(phys_addr_t tx_buf, phys_addr_t rx_buf, u32 pg_cnt)
|
||||
{
|
||||
ffa_value_t ret;
|
||||
@@ -214,6 +233,65 @@ static int ffa_rxtx_unmap(u16 vm_id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* buffer must be sizeof(struct ffa_partition_info) * num_partitions */
|
||||
+static int
|
||||
+__ffa_partition_info_get(u32 uuid0, u32 uuid1, u32 uuid2, u32 uuid3,
|
||||
+ struct ffa_partition_info *buffer, int num_partitions)
|
||||
+{
|
||||
+ int count;
|
||||
+ ffa_value_t partition_info;
|
||||
+
|
||||
+ mutex_lock(&drv_info->rx_lock);
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = FFA_PARTITION_INFO_GET,
|
||||
+ .a1 = uuid0, .a2 = uuid1, .a3 = uuid2, .a4 = uuid3,
|
||||
+ }, &partition_info);
|
||||
+
|
||||
+ if (partition_info.a0 == FFA_ERROR) {
|
||||
+ mutex_unlock(&drv_info->rx_lock);
|
||||
+ return ffa_to_linux_errno((int)partition_info.a2);
|
||||
+ }
|
||||
+
|
||||
+ count = partition_info.a2;
|
||||
+
|
||||
+ if (buffer && count <= num_partitions)
|
||||
+ memcpy(buffer, drv_info->rx_buffer, sizeof(*buffer) * count);
|
||||
+
|
||||
+ ffa_rx_release();
|
||||
+
|
||||
+ mutex_unlock(&drv_info->rx_lock);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+/* buffer is allocated and caller must free the same if returned count > 0 */
|
||||
+static int
|
||||
+ffa_partition_probe(const uuid_t *uuid, struct ffa_partition_info **buffer)
|
||||
+{
|
||||
+ int count;
|
||||
+ u32 uuid0_4[4];
|
||||
+ struct ffa_partition_info *pbuf;
|
||||
+
|
||||
+ export_uuid((u8 *)uuid0_4, uuid);
|
||||
+ count = __ffa_partition_info_get(uuid0_4[0], uuid0_4[1], uuid0_4[2],
|
||||
+ uuid0_4[3], NULL, 0);
|
||||
+ if (count <= 0)
|
||||
+ return count;
|
||||
+
|
||||
+ pbuf = kcalloc(count, sizeof(*pbuf), GFP_KERNEL);
|
||||
+ if (!pbuf)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ count = __ffa_partition_info_get(uuid0_4[0], uuid0_4[1], uuid0_4[2],
|
||||
+ uuid0_4[3], pbuf, count);
|
||||
+ if (count <= 0)
|
||||
+ kfree(pbuf);
|
||||
+ else
|
||||
+ *buffer = pbuf;
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
#define VM_ID_MASK GENMASK(15, 0)
|
||||
static int ffa_id_get(u16 *vm_id)
|
||||
{
|
||||
@@ -231,6 +309,147 @@ static int ffa_id_get(u16 *vm_id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int ffa_msg_send_direct_req(u16 src_id, u16 dst_id, bool mode_32bit,
|
||||
+ struct ffa_send_direct_data *data)
|
||||
+{
|
||||
+ u32 req_id, resp_id, src_dst_ids = PACK_TARGET_INFO(src_id, dst_id);
|
||||
+ ffa_value_t ret;
|
||||
+
|
||||
+ if (mode_32bit) {
|
||||
+ req_id = FFA_MSG_SEND_DIRECT_REQ;
|
||||
+ resp_id = FFA_MSG_SEND_DIRECT_RESP;
|
||||
+ } else {
|
||||
+ req_id = FFA_FN_NATIVE(MSG_SEND_DIRECT_REQ);
|
||||
+ resp_id = FFA_FN_NATIVE(MSG_SEND_DIRECT_RESP);
|
||||
+ }
|
||||
+
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = req_id, .a1 = src_dst_ids, .a2 = 0,
|
||||
+ .a3 = data->data0, .a4 = data->data1, .a5 = data->data2,
|
||||
+ .a6 = data->data3, .a7 = data->data4,
|
||||
+ }, &ret);
|
||||
+
|
||||
+ while (ret.a0 == FFA_INTERRUPT)
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = FFA_RUN, .a1 = ret.a1,
|
||||
+ }, &ret);
|
||||
+
|
||||
+ if (ret.a0 == FFA_ERROR)
|
||||
+ return ffa_to_linux_errno((int)ret.a2);
|
||||
+
|
||||
+ if (ret.a0 == resp_id) {
|
||||
+ data->data0 = ret.a3;
|
||||
+ data->data1 = ret.a4;
|
||||
+ data->data2 = ret.a5;
|
||||
+ data->data3 = ret.a6;
|
||||
+ data->data4 = ret.a7;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static u32 ffa_api_version_get(void)
|
||||
+{
|
||||
+ return drv_info->version;
|
||||
+}
|
||||
+
|
||||
+static int ffa_partition_info_get(const char *uuid_str,
|
||||
+ struct ffa_partition_info *buffer)
|
||||
+{
|
||||
+ int count;
|
||||
+ uuid_t uuid;
|
||||
+ struct ffa_partition_info *pbuf;
|
||||
+
|
||||
+ if (uuid_parse(uuid_str, &uuid)) {
|
||||
+ pr_err("invalid uuid (%s)\n", uuid_str);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ count = ffa_partition_probe(&uuid_null, &pbuf);
|
||||
+ if (count <= 0)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
+ memcpy(buffer, pbuf, sizeof(*pbuf) * count);
|
||||
+ kfree(pbuf);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void ffa_mode_32bit_set(struct ffa_device *dev)
|
||||
+{
|
||||
+ dev->mode_32bit = true;
|
||||
+}
|
||||
+
|
||||
+static int ffa_sync_send_receive(struct ffa_device *dev,
|
||||
+ struct ffa_send_direct_data *data)
|
||||
+{
|
||||
+ return ffa_msg_send_direct_req(drv_info->vm_id, dev->vm_id,
|
||||
+ dev->mode_32bit, data);
|
||||
+}
|
||||
+
|
||||
+static const struct ffa_dev_ops ffa_ops = {
|
||||
+ .api_version_get = ffa_api_version_get,
|
||||
+ .partition_info_get = ffa_partition_info_get,
|
||||
+ .mode_32bit_set = ffa_mode_32bit_set,
|
||||
+ .sync_send_receive = ffa_sync_send_receive,
|
||||
+};
|
||||
+
|
||||
+const struct ffa_dev_ops *ffa_dev_ops_get(struct ffa_device *dev)
|
||||
+{
|
||||
+ if (ffa_device_is_valid(dev))
|
||||
+ return &ffa_ops;
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(ffa_dev_ops_get);
|
||||
+
|
||||
+void ffa_device_match_uuid(struct ffa_device *ffa_dev, const uuid_t *uuid)
|
||||
+{
|
||||
+ int count, idx;
|
||||
+ struct ffa_partition_info *pbuf, *tpbuf;
|
||||
+
|
||||
+ count = ffa_partition_probe(uuid, &pbuf);
|
||||
+ if (count <= 0)
|
||||
+ return;
|
||||
+
|
||||
+ for (idx = 0, tpbuf = pbuf; idx < count; idx++, tpbuf++)
|
||||
+ if (tpbuf->id == ffa_dev->vm_id)
|
||||
+ uuid_copy(&ffa_dev->uuid, uuid);
|
||||
+ kfree(pbuf);
|
||||
+}
|
||||
+
|
||||
+static void ffa_setup_partitions(void)
|
||||
+{
|
||||
+ int count, idx;
|
||||
+ struct ffa_device *ffa_dev;
|
||||
+ struct ffa_partition_info *pbuf, *tpbuf;
|
||||
+
|
||||
+ count = ffa_partition_probe(&uuid_null, &pbuf);
|
||||
+ if (count <= 0) {
|
||||
+ pr_info("%s: No partitions found, error %d\n", __func__, count);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ for (idx = 0, tpbuf = pbuf; idx < count; idx++, tpbuf++) {
|
||||
+ /* Note that the &uuid_null parameter will require
|
||||
+ * ffa_device_match() to find the UUID of this partition id
|
||||
+ * with help of ffa_device_match_uuid(). Once the FF-A spec
|
||||
+ * is updated to provide correct UUID here for each partition
|
||||
+ * as part of the discovery API, we need to pass the
|
||||
+ * discovered UUID here instead.
|
||||
+ */
|
||||
+ ffa_dev = ffa_device_register(&uuid_null, tpbuf->id);
|
||||
+ if (!ffa_dev) {
|
||||
+ pr_err("%s: failed to register partition ID 0x%x\n",
|
||||
+ __func__, tpbuf->id);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ ffa_dev_set_drvdata(ffa_dev, drv_info);
|
||||
+ }
|
||||
+ kfree(pbuf);
|
||||
+}
|
||||
+
|
||||
static int __init ffa_init(void)
|
||||
{
|
||||
int ret;
|
||||
@@ -282,6 +501,8 @@ static int __init ffa_init(void)
|
||||
mutex_init(&drv_info->rx_lock);
|
||||
mutex_init(&drv_info->tx_lock);
|
||||
|
||||
+ ffa_setup_partitions();
|
||||
+
|
||||
return 0;
|
||||
free_pages:
|
||||
if (drv_info->tx_buffer)
|
||||
diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h
|
||||
index 331ff62c9873..d672673fc621 100644
|
||||
--- a/include/linux/arm_ffa.h
|
||||
+++ b/include/linux/arm_ffa.h
|
||||
@@ -6,7 +6,6 @@
|
||||
#ifndef _LINUX_ARM_FFA_H
|
||||
#define _LINUX_ARM_FFA_H
|
||||
|
||||
-#include <linux/cdev.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
@@ -15,6 +14,7 @@
|
||||
/* FFA Bus/Device/Driver related */
|
||||
struct ffa_device {
|
||||
int vm_id;
|
||||
+ bool mode_32bit;
|
||||
uuid_t uuid;
|
||||
struct device dev;
|
||||
};
|
||||
@@ -48,6 +48,7 @@ int ffa_driver_register(struct ffa_driver *driver, struct module *owner,
|
||||
const char *mod_name);
|
||||
void ffa_driver_unregister(struct ffa_driver *driver);
|
||||
bool ffa_device_is_valid(struct ffa_device *ffa_dev);
|
||||
+const struct ffa_dev_ops *ffa_dev_ops_get(struct ffa_device *dev);
|
||||
|
||||
#else
|
||||
static inline
|
||||
@@ -70,6 +71,11 @@ static inline void ffa_driver_unregister(struct ffa_driver *driver) {}
|
||||
static inline
|
||||
bool ffa_device_is_valid(struct ffa_device *ffa_dev) { return false; }
|
||||
|
||||
+static inline
|
||||
+const struct ffa_dev_ops *ffa_dev_ops_get(struct ffa_device *dev)
|
||||
+{
|
||||
+ return NULL;
|
||||
+}
|
||||
#endif /* CONFIG_ARM_FFA_TRANSPORT */
|
||||
|
||||
#define ffa_register(driver) \
|
||||
@@ -88,4 +94,35 @@ bool ffa_device_is_valid(struct ffa_device *ffa_dev) { return false; }
|
||||
#define module_ffa_driver(__ffa_driver) \
|
||||
module_driver(__ffa_driver, ffa_register, ffa_unregister)
|
||||
|
||||
+/* FFA transport related */
|
||||
+struct ffa_partition_info {
|
||||
+ u16 id;
|
||||
+ u16 exec_ctxt;
|
||||
+/* partition supports receipt of direct requests */
|
||||
+#define FFA_PARTITION_DIRECT_RECV BIT(0)
|
||||
+/* partition can send direct requests. */
|
||||
+#define FFA_PARTITION_DIRECT_SEND BIT(1)
|
||||
+/* partition can send and receive indirect messages. */
|
||||
+#define FFA_PARTITION_INDIRECT_MSG BIT(2)
|
||||
+ u32 properties;
|
||||
+};
|
||||
+
|
||||
+/* For use with FFA_MSG_SEND_DIRECT_{REQ,RESP} which pass data via registers */
|
||||
+struct ffa_send_direct_data {
|
||||
+ unsigned long data0; /* w3/x3 */
|
||||
+ unsigned long data1; /* w4/x4 */
|
||||
+ unsigned long data2; /* w5/x5 */
|
||||
+ unsigned long data3; /* w6/x6 */
|
||||
+ unsigned long data4; /* w7/x7 */
|
||||
+};
|
||||
+
|
||||
+struct ffa_dev_ops {
|
||||
+ u32 (*api_version_get)(void);
|
||||
+ int (*partition_info_get)(const char *uuid_str,
|
||||
+ struct ffa_partition_info *buffer);
|
||||
+ void (*mode_32bit_set)(struct ffa_device *dev);
|
||||
+ int (*sync_send_receive)(struct ffa_device *dev,
|
||||
+ struct ffa_send_direct_data *data);
|
||||
+};
|
||||
+
|
||||
#endif /* _LINUX_ARM_FFA_H */
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+409
@@ -0,0 +1,409 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From cc2195fe536c28e192df5d07e6dd277af36814b4 Mon Sep 17 00:00:00 2001
|
||||
From: Sudeep Holla <sudeep.holla@arm.com>
|
||||
Date: Fri, 21 May 2021 16:10:33 +0100
|
||||
Subject: [PATCH] firmware: arm_ffa: Add support for MEM_* interfaces
|
||||
|
||||
Most of the MEM_* APIs share the same parameters, so they can be
|
||||
generalised. Currently only MEM_SHARE is implemented and the user space
|
||||
interface for that is not added yet.
|
||||
|
||||
Link: https://lore.kernel.org/r/20210521151033.181846-6-sudeep.holla@arm.com
|
||||
Tested-by: Jens Wiklander <jens.wiklander@linaro.org>
|
||||
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
---
|
||||
drivers/firmware/arm_ffa/driver.c | 199 ++++++++++++++++++++++++++++++
|
||||
include/linux/arm_ffa.h | 139 +++++++++++++++++++++
|
||||
2 files changed, 338 insertions(+)
|
||||
|
||||
diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c
|
||||
index 85b9bbdbeabe..b1edb4b2e94a 100644
|
||||
--- a/drivers/firmware/arm_ffa/driver.c
|
||||
+++ b/drivers/firmware/arm_ffa/driver.c
|
||||
@@ -28,6 +28,8 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/mm.h>
|
||||
+#include <linux/scatterlist.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/uuid.h>
|
||||
|
||||
@@ -349,6 +351,192 @@ static int ffa_msg_send_direct_req(u16 src_id, u16 dst_id, bool mode_32bit,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+static int ffa_mem_first_frag(u32 func_id, phys_addr_t buf, u32 buf_sz,
|
||||
+ u32 frag_len, u32 len, u64 *handle)
|
||||
+{
|
||||
+ ffa_value_t ret;
|
||||
+
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = func_id, .a1 = len, .a2 = frag_len,
|
||||
+ .a3 = buf, .a4 = buf_sz,
|
||||
+ }, &ret);
|
||||
+
|
||||
+ while (ret.a0 == FFA_MEM_OP_PAUSE)
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = FFA_MEM_OP_RESUME,
|
||||
+ .a1 = ret.a1, .a2 = ret.a2,
|
||||
+ }, &ret);
|
||||
+
|
||||
+ if (ret.a0 == FFA_ERROR)
|
||||
+ return ffa_to_linux_errno((int)ret.a2);
|
||||
+
|
||||
+ if (ret.a0 != FFA_SUCCESS)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ if (handle)
|
||||
+ *handle = PACK_HANDLE(ret.a2, ret.a3);
|
||||
+
|
||||
+ return frag_len;
|
||||
+}
|
||||
+
|
||||
+static int ffa_mem_next_frag(u64 handle, u32 frag_len)
|
||||
+{
|
||||
+ ffa_value_t ret;
|
||||
+
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = FFA_MEM_FRAG_TX,
|
||||
+ .a1 = HANDLE_LOW(handle), .a2 = HANDLE_HIGH(handle),
|
||||
+ .a3 = frag_len,
|
||||
+ }, &ret);
|
||||
+
|
||||
+ while (ret.a0 == FFA_MEM_OP_PAUSE)
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = FFA_MEM_OP_RESUME,
|
||||
+ .a1 = ret.a1, .a2 = ret.a2,
|
||||
+ }, &ret);
|
||||
+
|
||||
+ if (ret.a0 == FFA_ERROR)
|
||||
+ return ffa_to_linux_errno((int)ret.a2);
|
||||
+
|
||||
+ if (ret.a0 != FFA_MEM_FRAG_RX)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ return ret.a3;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+ffa_transmit_fragment(u32 func_id, phys_addr_t buf, u32 buf_sz, u32 frag_len,
|
||||
+ u32 len, u64 *handle, bool first)
|
||||
+{
|
||||
+ if (!first)
|
||||
+ return ffa_mem_next_frag(*handle, frag_len);
|
||||
+
|
||||
+ return ffa_mem_first_frag(func_id, buf, buf_sz, frag_len, len, handle);
|
||||
+}
|
||||
+
|
||||
+static u32 ffa_get_num_pages_sg(struct scatterlist *sg)
|
||||
+{
|
||||
+ u32 num_pages = 0;
|
||||
+
|
||||
+ do {
|
||||
+ num_pages += sg->length / FFA_PAGE_SIZE;
|
||||
+ } while ((sg = sg_next(sg)));
|
||||
+
|
||||
+ return num_pages;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+ffa_setup_and_transmit(u32 func_id, void *buffer, u32 max_fragsize,
|
||||
+ struct ffa_mem_ops_args *args)
|
||||
+{
|
||||
+ int rc = 0;
|
||||
+ bool first = true;
|
||||
+ phys_addr_t addr = 0;
|
||||
+ struct ffa_composite_mem_region *composite;
|
||||
+ struct ffa_mem_region_addr_range *constituents;
|
||||
+ struct ffa_mem_region_attributes *ep_mem_access;
|
||||
+ struct ffa_mem_region *mem_region = buffer;
|
||||
+ u32 idx, frag_len, length, buf_sz = 0, num_entries = sg_nents(args->sg);
|
||||
+
|
||||
+ mem_region->tag = args->tag;
|
||||
+ mem_region->flags = args->flags;
|
||||
+ mem_region->sender_id = drv_info->vm_id;
|
||||
+ mem_region->attributes = FFA_MEM_NORMAL | FFA_MEM_WRITE_BACK |
|
||||
+ FFA_MEM_INNER_SHAREABLE;
|
||||
+ ep_mem_access = &mem_region->ep_mem_access[0];
|
||||
+
|
||||
+ for (idx = 0; idx < args->nattrs; idx++, ep_mem_access++) {
|
||||
+ ep_mem_access->receiver = args->attrs[idx].receiver;
|
||||
+ ep_mem_access->attrs = args->attrs[idx].attrs;
|
||||
+ ep_mem_access->composite_off = COMPOSITE_OFFSET(args->nattrs);
|
||||
+ }
|
||||
+ mem_region->ep_count = args->nattrs;
|
||||
+
|
||||
+ composite = buffer + COMPOSITE_OFFSET(args->nattrs);
|
||||
+ composite->total_pg_cnt = ffa_get_num_pages_sg(args->sg);
|
||||
+ composite->addr_range_cnt = num_entries;
|
||||
+
|
||||
+ length = COMPOSITE_CONSTITUENTS_OFFSET(args->nattrs, num_entries);
|
||||
+ frag_len = COMPOSITE_CONSTITUENTS_OFFSET(args->nattrs, 0);
|
||||
+ if (frag_len > max_fragsize)
|
||||
+ return -ENXIO;
|
||||
+
|
||||
+ if (!args->use_txbuf) {
|
||||
+ addr = virt_to_phys(buffer);
|
||||
+ buf_sz = max_fragsize / FFA_PAGE_SIZE;
|
||||
+ }
|
||||
+
|
||||
+ constituents = buffer + frag_len;
|
||||
+ idx = 0;
|
||||
+ do {
|
||||
+ if (frag_len == max_fragsize) {
|
||||
+ rc = ffa_transmit_fragment(func_id, addr, buf_sz,
|
||||
+ frag_len, length,
|
||||
+ &args->g_handle, first);
|
||||
+ if (rc < 0)
|
||||
+ return -ENXIO;
|
||||
+
|
||||
+ first = false;
|
||||
+ idx = 0;
|
||||
+ frag_len = 0;
|
||||
+ constituents = buffer;
|
||||
+ }
|
||||
+
|
||||
+ if ((void *)constituents - buffer > max_fragsize) {
|
||||
+ pr_err("Memory Region Fragment > Tx Buffer size\n");
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
+
|
||||
+ constituents->address = sg_phys(args->sg);
|
||||
+ constituents->pg_cnt = args->sg->length / FFA_PAGE_SIZE;
|
||||
+ constituents++;
|
||||
+ frag_len += sizeof(struct ffa_mem_region_addr_range);
|
||||
+ } while ((args->sg = sg_next(args->sg)));
|
||||
+
|
||||
+ return ffa_transmit_fragment(func_id, addr, buf_sz, frag_len,
|
||||
+ length, &args->g_handle, first);
|
||||
+}
|
||||
+
|
||||
+static int ffa_memory_ops(u32 func_id, struct ffa_mem_ops_args *args)
|
||||
+{
|
||||
+ int ret;
|
||||
+ void *buffer;
|
||||
+
|
||||
+ if (!args->use_txbuf) {
|
||||
+ buffer = alloc_pages_exact(RXTX_BUFFER_SIZE, GFP_KERNEL);
|
||||
+ if (!buffer)
|
||||
+ return -ENOMEM;
|
||||
+ } else {
|
||||
+ buffer = drv_info->tx_buffer;
|
||||
+ mutex_lock(&drv_info->tx_lock);
|
||||
+ }
|
||||
+
|
||||
+ ret = ffa_setup_and_transmit(func_id, buffer, RXTX_BUFFER_SIZE, args);
|
||||
+
|
||||
+ if (args->use_txbuf)
|
||||
+ mutex_unlock(&drv_info->tx_lock);
|
||||
+ else
|
||||
+ free_pages_exact(buffer, RXTX_BUFFER_SIZE);
|
||||
+
|
||||
+ return ret < 0 ? ret : 0;
|
||||
+}
|
||||
+
|
||||
+static int ffa_memory_reclaim(u64 g_handle, u32 flags)
|
||||
+{
|
||||
+ ffa_value_t ret;
|
||||
+
|
||||
+ invoke_ffa_fn((ffa_value_t){
|
||||
+ .a0 = FFA_MEM_RECLAIM,
|
||||
+ .a1 = HANDLE_LOW(g_handle), .a2 = HANDLE_HIGH(g_handle),
|
||||
+ .a3 = flags,
|
||||
+ }, &ret);
|
||||
+
|
||||
+ if (ret.a0 == FFA_ERROR)
|
||||
+ return ffa_to_linux_errno((int)ret.a2);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static u32 ffa_api_version_get(void)
|
||||
{
|
||||
return drv_info->version;
|
||||
@@ -387,11 +575,22 @@ static int ffa_sync_send_receive(struct ffa_device *dev,
|
||||
dev->mode_32bit, data);
|
||||
}
|
||||
|
||||
+static int
|
||||
+ffa_memory_share(struct ffa_device *dev, struct ffa_mem_ops_args *args)
|
||||
+{
|
||||
+ if (dev->mode_32bit)
|
||||
+ return ffa_memory_ops(FFA_MEM_SHARE, args);
|
||||
+
|
||||
+ return ffa_memory_ops(FFA_FN_NATIVE(MEM_SHARE), args);
|
||||
+}
|
||||
+
|
||||
static const struct ffa_dev_ops ffa_ops = {
|
||||
.api_version_get = ffa_api_version_get,
|
||||
.partition_info_get = ffa_partition_info_get,
|
||||
.mode_32bit_set = ffa_mode_32bit_set,
|
||||
.sync_send_receive = ffa_sync_send_receive,
|
||||
+ .memory_reclaim = ffa_memory_reclaim,
|
||||
+ .memory_share = ffa_memory_share,
|
||||
};
|
||||
|
||||
const struct ffa_dev_ops *ffa_dev_ops_get(struct ffa_device *dev)
|
||||
diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h
|
||||
index d672673fc621..505c679b6a9b 100644
|
||||
--- a/include/linux/arm_ffa.h
|
||||
+++ b/include/linux/arm_ffa.h
|
||||
@@ -116,6 +116,142 @@ struct ffa_send_direct_data {
|
||||
unsigned long data4; /* w7/x7 */
|
||||
};
|
||||
|
||||
+struct ffa_mem_region_addr_range {
|
||||
+ /* The base IPA of the constituent memory region, aligned to 4 kiB */
|
||||
+ u64 address;
|
||||
+ /* The number of 4 kiB pages in the constituent memory region. */
|
||||
+ u32 pg_cnt;
|
||||
+ u32 reserved;
|
||||
+};
|
||||
+
|
||||
+struct ffa_composite_mem_region {
|
||||
+ /*
|
||||
+ * The total number of 4 kiB pages included in this memory region. This
|
||||
+ * must be equal to the sum of page counts specified in each
|
||||
+ * `struct ffa_mem_region_addr_range`.
|
||||
+ */
|
||||
+ u32 total_pg_cnt;
|
||||
+ /* The number of constituents included in this memory region range */
|
||||
+ u32 addr_range_cnt;
|
||||
+ u64 reserved;
|
||||
+ /** An array of `addr_range_cnt` memory region constituents. */
|
||||
+ struct ffa_mem_region_addr_range constituents[];
|
||||
+};
|
||||
+
|
||||
+struct ffa_mem_region_attributes {
|
||||
+ /* The ID of the VM to which the memory is being given or shared. */
|
||||
+ u16 receiver;
|
||||
+ /*
|
||||
+ * The permissions with which the memory region should be mapped in the
|
||||
+ * receiver's page table.
|
||||
+ */
|
||||
+#define FFA_MEM_EXEC BIT(3)
|
||||
+#define FFA_MEM_NO_EXEC BIT(2)
|
||||
+#define FFA_MEM_RW BIT(1)
|
||||
+#define FFA_MEM_RO BIT(0)
|
||||
+ u8 attrs;
|
||||
+ /*
|
||||
+ * Flags used during FFA_MEM_RETRIEVE_REQ and FFA_MEM_RETRIEVE_RESP
|
||||
+ * for memory regions with multiple borrowers.
|
||||
+ */
|
||||
+#define FFA_MEM_RETRIEVE_SELF_BORROWER BIT(0)
|
||||
+ u8 flag;
|
||||
+ u32 composite_off;
|
||||
+ /*
|
||||
+ * Offset in bytes from the start of the outer `ffa_memory_region` to
|
||||
+ * an `struct ffa_mem_region_addr_range`.
|
||||
+ */
|
||||
+ u64 reserved;
|
||||
+};
|
||||
+
|
||||
+struct ffa_mem_region {
|
||||
+ /* The ID of the VM/owner which originally sent the memory region */
|
||||
+ u16 sender_id;
|
||||
+#define FFA_MEM_NORMAL BIT(5)
|
||||
+#define FFA_MEM_DEVICE BIT(4)
|
||||
+
|
||||
+#define FFA_MEM_WRITE_BACK (3 << 2)
|
||||
+#define FFA_MEM_NON_CACHEABLE (1 << 2)
|
||||
+
|
||||
+#define FFA_DEV_nGnRnE (0 << 2)
|
||||
+#define FFA_DEV_nGnRE (1 << 2)
|
||||
+#define FFA_DEV_nGRE (2 << 2)
|
||||
+#define FFA_DEV_GRE (3 << 2)
|
||||
+
|
||||
+#define FFA_MEM_NON_SHAREABLE (0)
|
||||
+#define FFA_MEM_OUTER_SHAREABLE (2)
|
||||
+#define FFA_MEM_INNER_SHAREABLE (3)
|
||||
+ u8 attributes;
|
||||
+ u8 reserved_0;
|
||||
+/*
|
||||
+ * Clear memory region contents after unmapping it from the sender and
|
||||
+ * before mapping it for any receiver.
|
||||
+ */
|
||||
+#define FFA_MEM_CLEAR BIT(0)
|
||||
+/*
|
||||
+ * Whether the hypervisor may time slice the memory sharing or retrieval
|
||||
+ * operation.
|
||||
+ */
|
||||
+#define FFA_TIME_SLICE_ENABLE BIT(1)
|
||||
+
|
||||
+#define FFA_MEM_RETRIEVE_TYPE_IN_RESP (0 << 3)
|
||||
+#define FFA_MEM_RETRIEVE_TYPE_SHARE (1 << 3)
|
||||
+#define FFA_MEM_RETRIEVE_TYPE_LEND (2 << 3)
|
||||
+#define FFA_MEM_RETRIEVE_TYPE_DONATE (3 << 3)
|
||||
+
|
||||
+#define FFA_MEM_RETRIEVE_ADDR_ALIGN_HINT BIT(9)
|
||||
+#define FFA_MEM_RETRIEVE_ADDR_ALIGN(x) ((x) << 5)
|
||||
+ /* Flags to control behaviour of the transaction. */
|
||||
+ u32 flags;
|
||||
+#define HANDLE_LOW_MASK GENMASK_ULL(31, 0)
|
||||
+#define HANDLE_HIGH_MASK GENMASK_ULL(63, 32)
|
||||
+#define HANDLE_LOW(x) ((u32)(FIELD_GET(HANDLE_LOW_MASK, (x))))
|
||||
+#define HANDLE_HIGH(x) ((u32)(FIELD_GET(HANDLE_HIGH_MASK, (x))))
|
||||
+
|
||||
+#define PACK_HANDLE(l, h) \
|
||||
+ (FIELD_PREP(HANDLE_LOW_MASK, (l)) | FIELD_PREP(HANDLE_HIGH_MASK, (h)))
|
||||
+ /*
|
||||
+ * A globally-unique ID assigned by the hypervisor for a region
|
||||
+ * of memory being sent between VMs.
|
||||
+ */
|
||||
+ u64 handle;
|
||||
+ /*
|
||||
+ * An implementation defined value associated with the receiver and the
|
||||
+ * memory region.
|
||||
+ */
|
||||
+ u64 tag;
|
||||
+ u32 reserved_1;
|
||||
+ /*
|
||||
+ * The number of `ffa_mem_region_attributes` entries included in this
|
||||
+ * transaction.
|
||||
+ */
|
||||
+ u32 ep_count;
|
||||
+ /*
|
||||
+ * An array of endpoint memory access descriptors.
|
||||
+ * Each one specifies a memory region offset, an endpoint and the
|
||||
+ * attributes with which this memory region should be mapped in that
|
||||
+ * endpoint's page table.
|
||||
+ */
|
||||
+ struct ffa_mem_region_attributes ep_mem_access[];
|
||||
+};
|
||||
+
|
||||
+#define COMPOSITE_OFFSET(x) \
|
||||
+ (offsetof(struct ffa_mem_region, ep_mem_access[x]))
|
||||
+#define CONSTITUENTS_OFFSET(x) \
|
||||
+ (offsetof(struct ffa_composite_mem_region, constituents[x]))
|
||||
+#define COMPOSITE_CONSTITUENTS_OFFSET(x, y) \
|
||||
+ (COMPOSITE_OFFSET(x) + CONSTITUENTS_OFFSET(y))
|
||||
+
|
||||
+struct ffa_mem_ops_args {
|
||||
+ bool use_txbuf;
|
||||
+ u32 nattrs;
|
||||
+ u32 flags;
|
||||
+ u64 tag;
|
||||
+ u64 g_handle;
|
||||
+ struct scatterlist *sg;
|
||||
+ struct ffa_mem_region_attributes *attrs;
|
||||
+};
|
||||
+
|
||||
struct ffa_dev_ops {
|
||||
u32 (*api_version_get)(void);
|
||||
int (*partition_info_get)(const char *uuid_str,
|
||||
@@ -123,6 +259,9 @@ struct ffa_dev_ops {
|
||||
void (*mode_32bit_set)(struct ffa_device *dev);
|
||||
int (*sync_send_receive)(struct ffa_device *dev,
|
||||
struct ffa_send_direct_data *data);
|
||||
+ int (*memory_reclaim)(u64 g_handle, u32 flags);
|
||||
+ int (*memory_share)(struct ffa_device *dev,
|
||||
+ struct ffa_mem_ops_args *args);
|
||||
};
|
||||
|
||||
#endif /* _LINUX_ARM_FFA_H */
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 92743071464fca5acbbe812d9a0d88de3eaaad36 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= <u.kleine-koenig@pengutronix.de>
|
||||
Date: Mon, 21 Jun 2021 22:16:51 +0200
|
||||
Subject: [PATCH] firmware: arm_ffa: Ensure drivers provide a probe function
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The bus probe callback calls the driver callback without further
|
||||
checking. Better be safe than sorry and refuse registration of a driver
|
||||
without a probe function to prevent a NULL pointer exception.
|
||||
|
||||
Link: https://lore.kernel.org/r/20210621201652.127611-1-u.kleine-koenig@pengutronix.de
|
||||
Fixes: e781858488b9 ("firmware: arm_ffa: Add initial FFA bus support for device enumeration")
|
||||
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
|
||||
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
---
|
||||
drivers/firmware/arm_ffa/bus.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c
|
||||
index 83166e02b191..d2cc24319626 100644
|
||||
--- a/drivers/firmware/arm_ffa/bus.c
|
||||
+++ b/drivers/firmware/arm_ffa/bus.c
|
||||
@@ -99,6 +99,9 @@ int ffa_driver_register(struct ffa_driver *driver, struct module *owner,
|
||||
{
|
||||
int ret;
|
||||
|
||||
+ if (!driver->probe)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
driver->driver.bus = &ffa_bus_type;
|
||||
driver->driver.name = driver->name;
|
||||
driver->driver.owner = owner;
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From e362547addc39e4bb18ad5bdfd59ce4d512d0c08 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= <u.kleine-koenig@pengutronix.de>
|
||||
Date: Mon, 21 Jun 2021 22:16:52 +0200
|
||||
Subject: [PATCH] firmware: arm_ffa: Simplify probe function
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When the driver core calls the probe callback it already checked that
|
||||
the devices match, so there is no need to call the match callback again.
|
||||
|
||||
Link: https://lore.kernel.org/r/20210621201652.127611-2-u.kleine-koenig@pengutronix.de
|
||||
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
|
||||
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
---
|
||||
drivers/firmware/arm_ffa/bus.c | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c
|
||||
index d2cc24319626..00fe595a5bc8 100644
|
||||
--- a/drivers/firmware/arm_ffa/bus.c
|
||||
+++ b/drivers/firmware/arm_ffa/bus.c
|
||||
@@ -46,9 +46,6 @@ static int ffa_device_probe(struct device *dev)
|
||||
struct ffa_driver *ffa_drv = to_ffa_driver(dev->driver);
|
||||
struct ffa_device *ffa_dev = to_ffa_dev(dev);
|
||||
|
||||
- if (!ffa_device_match(dev, dev->driver))
|
||||
- return -ENODEV;
|
||||
-
|
||||
return ffa_drv->probe(ffa_dev);
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From ba684a31d3626c86cd9097e12d6ed57d224d077d Mon Sep 17 00:00:00 2001
|
||||
From: Sudeep Holla <sudeep.holla@arm.com>
|
||||
Date: Tue, 22 Jun 2021 17:22:02 +0100
|
||||
Subject: [PATCH] firmware: arm_ffa: Fix the comment style
|
||||
|
||||
clang produces the following warning:
|
||||
|
||||
drivers/firmware/arm_ffa/driver.c:123: warning: expecting
|
||||
prototype for FF(). Prototype was for FFA_PAGE_SIZE() instead
|
||||
|
||||
This comment starts with '/**', but isn't a kernel-doc comment.
|
||||
Refer Documentation/doc-guide/kernel-doc.rst
|
||||
|
||||
Fix the same by removing the kernel-doc style comment here.
|
||||
|
||||
Link: https://lore.kernel.org/r/20210622162202.3485866-1-sudeep.holla@arm.com
|
||||
Reported-by: kernel test robot <lkp@intel.com>
|
||||
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
---
|
||||
drivers/firmware/arm_ffa/driver.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c
|
||||
index b1edb4b2e94a..88b822575ac4 100644
|
||||
--- a/drivers/firmware/arm_ffa/driver.c
|
||||
+++ b/drivers/firmware/arm_ffa/driver.c
|
||||
@@ -120,7 +120,7 @@
|
||||
#define PACK_TARGET_INFO(s, r) \
|
||||
(FIELD_PREP(SENDER_ID_MASK, (s)) | FIELD_PREP(RECEIVER_ID_MASK, (r)))
|
||||
|
||||
-/**
|
||||
+/*
|
||||
* FF-A specification mentions explicitly about '4K pages'. This should
|
||||
* not be confused with the kernel PAGE_SIZE, which is the translation
|
||||
* granule kernel is configured and may be one among 4K, 16K and 64K.
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From dd925db6f07556061c11ab1fbfa4a0145ae6b438 Mon Sep 17 00:00:00 2001
|
||||
From: Sudeep Holla <sudeep.holla@arm.com>
|
||||
Date: Wed, 7 Jul 2021 14:47:39 +0100
|
||||
Subject: [PATCH] firmware: arm_ffa: Fix a possible ffa_linux_errmap buffer
|
||||
overflow
|
||||
|
||||
The ffa_linux_errmap buffer access index is supposed to range from 0-8
|
||||
but it ranges from 1-9 instead. It reads one element out of bounds. It
|
||||
also changes the success into -EINVAL though ffa_to_linux_errno is never
|
||||
used in case of success, it is expected to work for success case too.
|
||||
|
||||
It is slightly confusing code as the negative of the error code
|
||||
is used as index to the buffer. Fix it by negating it at the start and
|
||||
make it more readable.
|
||||
|
||||
Link: https://lore.kernel.org/r/20210707134739.1869481-1-sudeep.holla@arm.com
|
||||
Reported-by: kernel test robot <lkp@intel.com>
|
||||
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
|
||||
---
|
||||
drivers/firmware/arm_ffa/driver.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c
|
||||
index 88b822575ac4..c9fb56afbcb4 100644
|
||||
--- a/drivers/firmware/arm_ffa/driver.c
|
||||
+++ b/drivers/firmware/arm_ffa/driver.c
|
||||
@@ -149,8 +149,10 @@ static const int ffa_linux_errmap[] = {
|
||||
|
||||
static inline int ffa_to_linux_errno(int errno)
|
||||
{
|
||||
- if (errno < FFA_RET_SUCCESS && errno >= -ARRAY_SIZE(ffa_linux_errmap))
|
||||
- return ffa_linux_errmap[-errno];
|
||||
+ int err_idx = -errno;
|
||||
+
|
||||
+ if (err_idx >= 0 && err_idx < ARRAY_SIZE(ffa_linux_errmap))
|
||||
+ return ffa_linux_errmap[err_idx];
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.15]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 8268acfe1cc967dbe9fbb05b5f07a19675a81cff Mon Sep 17 00:00:00 2001
|
||||
From: Lee Jones <lee.jones@linaro.org>
|
||||
Date: Wed, 26 May 2021 14:00:19 +0100
|
||||
Subject: [PATCH 09/23] usb: isp1760: isp1760-udc: Provide missing description
|
||||
for 'udc' param
|
||||
|
||||
Fixes the following W=1 kernel build warning(s):
|
||||
|
||||
drivers/usb/isp1760/isp1760-udc.c:150: warning: Function parameter or member 'udc' not described in 'isp1760_udc_select_ep'
|
||||
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
Cc: linux-usb@vger.kernel.org
|
||||
Reviewed-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Signed-off-by: Lee Jones <lee.jones@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210526130037.856068-7-lee.jones@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-udc.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-udc.c b/drivers/usb/isp1760/isp1760-udc.c
|
||||
index 3e05e3605435..a78da59d6417 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-udc.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-udc.c
|
||||
@@ -137,6 +137,7 @@ static void __isp1760_udc_select_ep(struct isp1760_udc *udc,
|
||||
/**
|
||||
* isp1760_udc_select_ep - Select an endpoint for register access
|
||||
* @ep: The endpoint
|
||||
+ * @udc: Reference to the device controller
|
||||
*
|
||||
* The ISP1761 endpoint registers are banked. This function selects the target
|
||||
* endpoint for banked register access. The selection remains valid until the
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.15]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 5f4dee73a4bc25a7781a5406b49439bc640981c2 Mon Sep 17 00:00:00 2001
|
||||
From: Tong Tiangen <tongtiangen@huawei.com>
|
||||
Date: Fri, 11 Jun 2021 09:40:55 +0800
|
||||
Subject: [PATCH 10/23] usb: isp1760: Fix meaningless check in isp1763_run()
|
||||
|
||||
Remove attribution to retval before check, which make it completely
|
||||
meaningless, and does't check what it was supposed: the return
|
||||
value of the timed function to set up configuration flag.
|
||||
|
||||
Fixes: 60d789f3bfbb ("usb: isp1760: add support for isp1763")
|
||||
Tested-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Reviewed-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Signed-off-by: Tong Tiangen <tongtiangen@huawei.com>
|
||||
Link: https://lore.kernel.org/r/20210611014055.68551-1-tongtiangen@huawei.com
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index 016a54ea76f4..27168b4a4ef2 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -1648,7 +1648,6 @@ static int isp1763_run(struct usb_hcd *hcd)
|
||||
down_write(&ehci_cf_port_reset_rwsem);
|
||||
retval = isp1760_hcd_set_and_wait(hcd, FLAG_CF, 250 * 1000);
|
||||
up_write(&ehci_cf_port_reset_rwsem);
|
||||
- retval = 0;
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.15]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 7de14c88272c05d86fce83a5cead36832ce3a424 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Tue, 27 Jul 2021 11:05:14 +0100
|
||||
Subject: [PATCH 11/23] usb: isp1760: remove debug message as error
|
||||
|
||||
Remove debug message leftover from the boot error buffer.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210727100516.4190681-2-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index 27168b4a4ef2..a745c4c2b773 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -733,7 +733,6 @@ static int isp1760_hc_setup(struct usb_hcd *hcd)
|
||||
|
||||
/* Change bus pattern */
|
||||
scratch = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH);
|
||||
- dev_err(hcd->self.controller, "Scratch test 0x%08x\n", scratch);
|
||||
scratch = isp1760_hcd_read(hcd, HC_SCRATCH);
|
||||
if (scratch != pattern) {
|
||||
dev_err(hcd->self.controller, "Scratch test failed. 0x%08x\n", scratch);
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 41f673183862a183d4ea0522c045fabfbd1b28c8 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Tue, 27 Jul 2021 11:05:15 +0100
|
||||
Subject: [PATCH 12/23] usb: isp1760: do not sleep in field register poll
|
||||
|
||||
When polling for a setup or clear of a register field we were sleeping
|
||||
in atomic context but using a very tight sleep interval.
|
||||
|
||||
Since the use cases for this poll mechanism are only in setup and
|
||||
stop paths, and in practice this poll is not used most of the times
|
||||
but needs to be there to comply to hardware setup times, remove the
|
||||
sleep time and make the poll loop tighter.
|
||||
|
||||
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210727100516.4190681-3-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index a745c4c2b773..a018394d54f8 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -250,7 +250,7 @@ static int isp1760_hcd_set_and_wait(struct usb_hcd *hcd, u32 field,
|
||||
isp1760_hcd_set(hcd, field);
|
||||
|
||||
return regmap_field_read_poll_timeout(priv->fields[field], val,
|
||||
- val, 10, timeout_us);
|
||||
+ val, 0, timeout_us);
|
||||
}
|
||||
|
||||
static int isp1760_hcd_set_and_wait_swap(struct usb_hcd *hcd, u32 field,
|
||||
@@ -262,7 +262,7 @@ static int isp1760_hcd_set_and_wait_swap(struct usb_hcd *hcd, u32 field,
|
||||
isp1760_hcd_set(hcd, field);
|
||||
|
||||
return regmap_field_read_poll_timeout(priv->fields[field], val,
|
||||
- !val, 10, timeout_us);
|
||||
+ !val, 0, timeout_us);
|
||||
}
|
||||
|
||||
static int isp1760_hcd_clear_and_wait(struct usb_hcd *hcd, u32 field,
|
||||
@@ -274,7 +274,7 @@ static int isp1760_hcd_clear_and_wait(struct usb_hcd *hcd, u32 field,
|
||||
isp1760_hcd_clear(hcd, field);
|
||||
|
||||
return regmap_field_read_poll_timeout(priv->fields[field], val,
|
||||
- !val, 10, timeout_us);
|
||||
+ !val, 0, timeout_us);
|
||||
}
|
||||
|
||||
static bool isp1760_hcd_is_set(struct usb_hcd *hcd, u32 field)
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.15]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From cbbdb3fe0d974d655c87c3e6ba2990d5496b9f82 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Tue, 27 Jul 2021 11:05:16 +0100
|
||||
Subject: [PATCH 13/23] usb: isp1760: rework cache initialization error
|
||||
handling
|
||||
|
||||
If we fail to create qtd cache we were not destroying the
|
||||
urb_listitem, rework the error handling logic to cope with that.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210727100516.4190681-4-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 16 +++++++++++-----
|
||||
1 file changed, 11 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index a018394d54f8..825be736be33 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -2527,17 +2527,23 @@ int __init isp1760_init_kmem_once(void)
|
||||
SLAB_MEM_SPREAD, NULL);
|
||||
|
||||
if (!qtd_cachep)
|
||||
- return -ENOMEM;
|
||||
+ goto destroy_urb_listitem;
|
||||
|
||||
qh_cachep = kmem_cache_create("isp1760_qh", sizeof(struct isp1760_qh),
|
||||
0, SLAB_TEMPORARY | SLAB_MEM_SPREAD, NULL);
|
||||
|
||||
- if (!qh_cachep) {
|
||||
- kmem_cache_destroy(qtd_cachep);
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
+ if (!qh_cachep)
|
||||
+ goto destroy_qtd;
|
||||
|
||||
return 0;
|
||||
+
|
||||
+destroy_qtd:
|
||||
+ kmem_cache_destroy(qtd_cachep);
|
||||
+
|
||||
+destroy_urb_listitem:
|
||||
+ kmem_cache_destroy(urb_listitem_cachep);
|
||||
+
|
||||
+ return -ENOMEM;
|
||||
}
|
||||
|
||||
void isp1760_deinit_kmem_cache(void)
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.15]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 8472896f39cfab2d8fec9ca746070aaf02609169 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 19 Aug 2021 19:09:25 +0100
|
||||
Subject: [PATCH 14/23] usb: isp1760: ignore return value for bus change
|
||||
pattern
|
||||
|
||||
We do not care about the return value of that read between the
|
||||
scratch register write and read, we really just want to make sure that
|
||||
the pattern in the bus get changed to make sure we are testing
|
||||
correctly the scratch pattern.
|
||||
|
||||
Clang-analyzer complains about the never read scratch variable:
|
||||
>> drivers/usb/isp1760/isp1760-hcd.c:735:2: warning: Value stored to 'scratch' is never read [clang-analyzer-deadcode.DeadStores]
|
||||
scratch = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH);
|
||||
|
||||
Just ignore the return value of that CHIP_ID_HIGH read, add more
|
||||
information to the comment above why we are doing this. And as at it,
|
||||
just do a small format change in the error message bellow.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210819180929.1327349-2-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index 825be736be33..2a21fe5aa7a8 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -731,11 +731,15 @@ static int isp1760_hc_setup(struct usb_hcd *hcd)
|
||||
|
||||
isp1760_hcd_write(hcd, HC_SCRATCH, pattern);
|
||||
|
||||
- /* Change bus pattern */
|
||||
- scratch = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH);
|
||||
+ /*
|
||||
+ * we do not care about the read value here we just want to
|
||||
+ * change bus pattern.
|
||||
+ */
|
||||
+ isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH);
|
||||
scratch = isp1760_hcd_read(hcd, HC_SCRATCH);
|
||||
if (scratch != pattern) {
|
||||
- dev_err(hcd->self.controller, "Scratch test failed. 0x%08x\n", scratch);
|
||||
+ dev_err(hcd->self.controller, "Scratch test failed. 0x%08x\n",
|
||||
+ scratch);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.15]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 8e58b7710d6634ed46ae26fedb8459f84f08fd51 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 19 Aug 2021 19:09:26 +0100
|
||||
Subject: [PATCH 15/23] usb: isp1760: check maxpacketsize before using it
|
||||
|
||||
When checking if we need one more packet on a bulk pipe we may, even
|
||||
though not probable at all, get there with a zero maxpacketsize.
|
||||
In that case for sure no packet, no even a one more, will be
|
||||
allocated.
|
||||
|
||||
This will clean the clang-analyzer warning:
|
||||
drivers/usb/isp1760/isp1760-hcd.c:1856:38: warning: Division by zero [clang-analyzer-core.DivideZero]
|
||||
&& !(urb->transfer_buffer_length %
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210819180929.1327349-3-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index 2a21fe5aa7a8..5c947a1eae49 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -1854,7 +1854,7 @@ static void packetize_urb(struct usb_hcd *hcd,
|
||||
packet_type = OUT_PID;
|
||||
else
|
||||
packet_type = IN_PID;
|
||||
- } else if (usb_pipebulk(urb->pipe)
|
||||
+ } else if (usb_pipebulk(urb->pipe) && maxpacketsize
|
||||
&& (urb->transfer_flags & URB_ZERO_PACKET)
|
||||
&& !(urb->transfer_buffer_length %
|
||||
maxpacketsize)) {
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.15]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 5e4cd1b6556302fe6a457e525c256cbef3563543 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 19 Aug 2021 19:09:27 +0100
|
||||
Subject: [PATCH 16/23] usb: isp1760: do not reset retval
|
||||
|
||||
We do not really need to reset retval before get used bellow.
|
||||
This will avoid the clang-analyzer warning:
|
||||
|
||||
drivers/usb/isp1760/isp1760-hcd.c:1919:2: warning: Value stored to 'retval' is never read [clang-analyzer-deadcode.DeadStores]
|
||||
retval = 0;
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210819180929.1327349-4-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index 5c947a1eae49..aed2714ce0cf 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -1919,7 +1919,6 @@ static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
|
||||
if (list_empty(&new_qtds))
|
||||
return -ENOMEM;
|
||||
|
||||
- retval = 0;
|
||||
spin_lock_irqsave(&priv->lock, spinflags);
|
||||
|
||||
if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.15]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 7d1d3882fd9da1ee42fe3ad3a5ffd41fb8204380 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 19 Aug 2021 19:09:28 +0100
|
||||
Subject: [PATCH 17/23] usb: isp1760: do not shift in uninitialized slot
|
||||
|
||||
Even though it is not expected, and would trigger a WARN_ON, killing a
|
||||
transfer in a uninitialized slot this sequence is warned by clang
|
||||
analyzer, twice:
|
||||
|
||||
drivers/usb/isp1760/isp1760-hcd.c:1976:18: warning: The result of the left shift is undefined because the right operand is negative [clang-analyzer-core.UndefinedBinaryOperatorResult]
|
||||
skip_map |= (1 << qh->slot);
|
||||
drivers/usb/isp1760/isp1760-hcd.c:1983:18: warning: The result of the left shift is undefined because the right operand is negative [clang-analyzer-core.UndefinedBinaryOperatorResult]
|
||||
skip_map |= (1 << qh->slot);
|
||||
|
||||
Only set skip map if slot is active.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210819180929.1327349-5-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 18 +++++++++++-------
|
||||
1 file changed, 11 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index aed2714ce0cf..bf8ab3fe2e5a 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -1974,16 +1974,20 @@ static void kill_transfer(struct usb_hcd *hcd, struct urb *urb,
|
||||
/* We need to forcefully reclaim the slot since some transfers never
|
||||
return, e.g. interrupt transfers and NAKed bulk transfers. */
|
||||
if (usb_pipecontrol(urb->pipe) || usb_pipebulk(urb->pipe)) {
|
||||
- skip_map = isp1760_hcd_read(hcd, HC_ATL_PTD_SKIPMAP);
|
||||
- skip_map |= (1 << qh->slot);
|
||||
- isp1760_hcd_write(hcd, HC_ATL_PTD_SKIPMAP, skip_map);
|
||||
- ndelay(100);
|
||||
+ if (qh->slot != -1) {
|
||||
+ skip_map = isp1760_hcd_read(hcd, HC_ATL_PTD_SKIPMAP);
|
||||
+ skip_map |= (1 << qh->slot);
|
||||
+ isp1760_hcd_write(hcd, HC_ATL_PTD_SKIPMAP, skip_map);
|
||||
+ ndelay(100);
|
||||
+ }
|
||||
priv->atl_slots[qh->slot].qh = NULL;
|
||||
priv->atl_slots[qh->slot].qtd = NULL;
|
||||
} else {
|
||||
- skip_map = isp1760_hcd_read(hcd, HC_INT_PTD_SKIPMAP);
|
||||
- skip_map |= (1 << qh->slot);
|
||||
- isp1760_hcd_write(hcd, HC_INT_PTD_SKIPMAP, skip_map);
|
||||
+ if (qh->slot != -1) {
|
||||
+ skip_map = isp1760_hcd_read(hcd, HC_INT_PTD_SKIPMAP);
|
||||
+ skip_map |= (1 << qh->slot);
|
||||
+ isp1760_hcd_write(hcd, HC_INT_PTD_SKIPMAP, skip_map);
|
||||
+ }
|
||||
priv->int_slots[qh->slot].qh = NULL;
|
||||
priv->int_slots[qh->slot].qtd = NULL;
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.15]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From de940244e8987a76d73fb2b0057ecd494cbfeefd Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Thu, 19 Aug 2021 19:09:29 +0100
|
||||
Subject: [PATCH 18/23] usb: isp1760: clean never read udc_enabled warning
|
||||
|
||||
When CONFIG_USB_ISP1761_UDC is not enabled the udc_enabled variable is
|
||||
never used since it is short circuited before in the logic operations.
|
||||
|
||||
This would trigger the following warning by clang analyzer:
|
||||
|
||||
drivers/usb/isp1760/isp1760-core.c:490:2: warning: Value stored to 'udc_enabled' is never read [clang-analyzer-deadcode.DeadStores]
|
||||
udc_enabled = ((devflags & ISP1760_FLAG_ISP1763) ||
|
||||
^
|
||||
drivers/usb/isp1760/isp1760-core.c:490:2: note: Value stored to 'udc_enabled' is never read
|
||||
|
||||
Just swap the other of the operands in the logic operations.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210819180929.1327349-6-rui.silva@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c
|
||||
index ff07e2890692..cb70f9d63cdd 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-core.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-core.c
|
||||
@@ -491,7 +491,7 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
|
||||
(devflags & ISP1760_FLAG_ISP1761));
|
||||
|
||||
if ((!IS_ENABLED(CONFIG_USB_ISP1760_HCD) || usb_disabled()) &&
|
||||
- (!IS_ENABLED(CONFIG_USB_ISP1761_UDC) || !udc_enabled))
|
||||
+ (!udc_enabled || !IS_ENABLED(CONFIG_USB_ISP1761_UDC)))
|
||||
return -ENODEV;
|
||||
|
||||
isp = devm_kzalloc(dev, sizeof(*isp), GFP_KERNEL);
|
||||
@@ -571,7 +571,7 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (IS_ENABLED(CONFIG_USB_ISP1761_UDC) && udc_enabled) {
|
||||
+ if (udc_enabled && IS_ENABLED(CONFIG_USB_ISP1761_UDC)) {
|
||||
ret = isp1760_udc_register(isp, irq, irqflags);
|
||||
if (ret < 0) {
|
||||
isp1760_hcd_unregister(hcd);
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From d36713c344e0c963178e417911d2cd867597d2f0 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Fri, 27 Aug 2021 01:27:40 +0100
|
||||
Subject: [PATCH 19/23] usb: isp1760: fix memory pool initialization
|
||||
|
||||
The loops to setup the memory pool were skipping some
|
||||
blocks, that was not visible on the ISP1763 because it has
|
||||
fewer blocks than the ISP1761. But won testing on that IP
|
||||
from the family that would be an issue.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index bf8ab3fe2e5a..b3a55c5d2155 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -588,8 +588,8 @@ static void init_memory(struct isp1760_hcd *priv)
|
||||
|
||||
payload_addr = PAYLOAD_OFFSET;
|
||||
|
||||
- for (i = 0, curr = 0; i < ARRAY_SIZE(mem->blocks); i++) {
|
||||
- for (j = 0; j < mem->blocks[i]; j++, curr++) {
|
||||
+ for (i = 0, curr = 0; i < ARRAY_SIZE(mem->blocks); i++, curr += j) {
|
||||
+ for (j = 0; j < mem->blocks[i]; j++) {
|
||||
priv->memory_pool[curr + j].start = payload_addr;
|
||||
priv->memory_pool[curr + j].size = mem->blocks_size[i];
|
||||
priv->memory_pool[curr + j].free = 1;
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From fc22c0fb49d7858b3c7b8bd2a8e041263280e230 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Wed, 25 Aug 2021 00:10:02 +0100
|
||||
Subject: [PATCH 20/23] usb: isp1760: fix qtd fill length
|
||||
|
||||
When trying to send bulks bigger than the biggest block size
|
||||
we need to split them over several qtd. Fix this limiting the
|
||||
maximum qtd size to largest block size.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index b3a55c5d2155..fba21122bb00 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -1829,9 +1829,11 @@ static void packetize_urb(struct usb_hcd *hcd,
|
||||
goto cleanup;
|
||||
|
||||
if (len > mem->blocks_size[ISP176x_BLOCK_NUM - 1])
|
||||
- len = mem->blocks_size[ISP176x_BLOCK_NUM - 1];
|
||||
+ this_qtd_len = mem->blocks_size[ISP176x_BLOCK_NUM - 1];
|
||||
+ else
|
||||
+ this_qtd_len = len;
|
||||
|
||||
- this_qtd_len = qtd_fill(qtd, buf, len);
|
||||
+ this_qtd_len = qtd_fill(qtd, buf, this_qtd_len);
|
||||
list_add_tail(&qtd->qtd_list, head);
|
||||
|
||||
len -= this_qtd_len;
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From a5dca0d8c66fb40ef372b596cbcfad45112fa050 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Tue, 24 Aug 2021 09:37:27 +0100
|
||||
Subject: [PATCH 21/23] usb: isp1760: write to status and address register
|
||||
|
||||
We were already writing directly the port status register to
|
||||
trigger changes in isp1763. The same is needed in other IP
|
||||
from the family, including also to setup the read address
|
||||
before reading from device.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-hcd.c | 23 +++++++++++------------
|
||||
1 file changed, 11 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
index fba21122bb00..79d571f1429b 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-hcd.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-hcd.c
|
||||
@@ -182,7 +182,7 @@ struct urb_listitem {
|
||||
struct urb *urb;
|
||||
};
|
||||
|
||||
-static const u32 isp1763_hc_portsc1_fields[] = {
|
||||
+static const u32 isp176x_hc_portsc1_fields[] = {
|
||||
[PORT_OWNER] = BIT(13),
|
||||
[PORT_POWER] = BIT(12),
|
||||
[PORT_LSTATUS] = BIT(10),
|
||||
@@ -205,27 +205,28 @@ static u32 isp1760_hcd_read(struct usb_hcd *hcd, u32 field)
|
||||
}
|
||||
|
||||
/*
|
||||
- * We need, in isp1763, to write directly the values to the portsc1
|
||||
+ * We need, in isp176x, to write directly the values to the portsc1
|
||||
* register so it will make the other values to trigger.
|
||||
*/
|
||||
static void isp1760_hcd_portsc1_set_clear(struct isp1760_hcd *priv, u32 field,
|
||||
u32 val)
|
||||
{
|
||||
- u32 bit = isp1763_hc_portsc1_fields[field];
|
||||
- u32 port_status = readl(priv->base + ISP1763_HC_PORTSC1);
|
||||
+ u32 bit = isp176x_hc_portsc1_fields[field];
|
||||
+ u16 portsc1_reg = priv->is_isp1763 ? ISP1763_HC_PORTSC1 :
|
||||
+ ISP176x_HC_PORTSC1;
|
||||
+ u32 port_status = readl(priv->base + portsc1_reg);
|
||||
|
||||
if (val)
|
||||
- writel(port_status | bit, priv->base + ISP1763_HC_PORTSC1);
|
||||
+ writel(port_status | bit, priv->base + portsc1_reg);
|
||||
else
|
||||
- writel(port_status & ~bit, priv->base + ISP1763_HC_PORTSC1);
|
||||
+ writel(port_status & ~bit, priv->base + portsc1_reg);
|
||||
}
|
||||
|
||||
static void isp1760_hcd_write(struct usb_hcd *hcd, u32 field, u32 val)
|
||||
{
|
||||
struct isp1760_hcd *priv = hcd_to_priv(hcd);
|
||||
|
||||
- if (unlikely(priv->is_isp1763 &&
|
||||
- (field >= PORT_OWNER && field <= PORT_CONNECT)))
|
||||
+ if (unlikely((field >= PORT_OWNER && field <= PORT_CONNECT)))
|
||||
return isp1760_hcd_portsc1_set_clear(priv, field, val);
|
||||
|
||||
isp1760_field_write(priv->fields, field, val);
|
||||
@@ -367,8 +368,7 @@ static void isp1760_mem_read(struct usb_hcd *hcd, u32 src_offset, void *dst,
|
||||
{
|
||||
struct isp1760_hcd *priv = hcd_to_priv(hcd);
|
||||
|
||||
- isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0);
|
||||
- isp1760_hcd_write(hcd, MEM_START_ADDR, src_offset);
|
||||
+ isp1760_reg_write(priv->regs, ISP176x_HC_MEMORY, src_offset);
|
||||
ndelay(100);
|
||||
|
||||
bank_reads8(priv->base, src_offset, ISP_BANK_0, dst, bytes);
|
||||
@@ -496,8 +496,7 @@ static void isp1760_ptd_read(struct usb_hcd *hcd, u32 ptd_offset, u32 slot,
|
||||
u16 src_offset = ptd_offset + slot * sizeof(*ptd);
|
||||
struct isp1760_hcd *priv = hcd_to_priv(hcd);
|
||||
|
||||
- isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0);
|
||||
- isp1760_hcd_write(hcd, MEM_START_ADDR, src_offset);
|
||||
+ isp1760_reg_write(priv->regs, ISP176x_HC_MEMORY, src_offset);
|
||||
ndelay(90);
|
||||
|
||||
bank_reads8(priv->base, src_offset, ISP_BANK_0, (void *)ptd,
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 8f238acb1dada56dc6898a6ce2551feed0e6e8c2 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Wed, 25 Aug 2021 00:36:55 +0100
|
||||
Subject: [PATCH 22/23] usb: isp1760: use the right irq status bit
|
||||
|
||||
Instead of using the fields enum values to check interrupts
|
||||
trigged, use the correct bit values.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-udc.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-udc.c b/drivers/usb/isp1760/isp1760-udc.c
|
||||
index a78da59d6417..5cafd23345ca 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-udc.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-udc.c
|
||||
@@ -1363,7 +1363,7 @@ static irqreturn_t isp1760_udc_irq(int irq, void *dev)
|
||||
|
||||
status = isp1760_udc_irq_get_status(udc);
|
||||
|
||||
- if (status & DC_IEVBUS) {
|
||||
+ if (status & ISP176x_DC_IEVBUS) {
|
||||
dev_dbg(udc->isp->dev, "%s(VBUS)\n", __func__);
|
||||
/* The VBUS interrupt is only triggered when VBUS appears. */
|
||||
spin_lock(&udc->lock);
|
||||
@@ -1371,7 +1371,7 @@ static irqreturn_t isp1760_udc_irq(int irq, void *dev)
|
||||
spin_unlock(&udc->lock);
|
||||
}
|
||||
|
||||
- if (status & DC_IEBRST) {
|
||||
+ if (status & ISP176x_DC_IEBRST) {
|
||||
dev_dbg(udc->isp->dev, "%s(BRST)\n", __func__);
|
||||
|
||||
isp1760_udc_reset(udc);
|
||||
@@ -1391,18 +1391,18 @@ static irqreturn_t isp1760_udc_irq(int irq, void *dev)
|
||||
}
|
||||
}
|
||||
|
||||
- if (status & DC_IEP0SETUP) {
|
||||
+ if (status & ISP176x_DC_IEP0SETUP) {
|
||||
dev_dbg(udc->isp->dev, "%s(EP0SETUP)\n", __func__);
|
||||
|
||||
isp1760_ep0_setup(udc);
|
||||
}
|
||||
|
||||
- if (status & DC_IERESM) {
|
||||
+ if (status & ISP176x_DC_IERESM) {
|
||||
dev_dbg(udc->isp->dev, "%s(RESM)\n", __func__);
|
||||
isp1760_udc_resume(udc);
|
||||
}
|
||||
|
||||
- if (status & DC_IESUSP) {
|
||||
+ if (status & ISP176x_DC_IESUSP) {
|
||||
dev_dbg(udc->isp->dev, "%s(SUSP)\n", __func__);
|
||||
|
||||
spin_lock(&udc->lock);
|
||||
@@ -1413,7 +1413,7 @@ static irqreturn_t isp1760_udc_irq(int irq, void *dev)
|
||||
spin_unlock(&udc->lock);
|
||||
}
|
||||
|
||||
- if (status & DC_IEHS_STA) {
|
||||
+ if (status & ISP176x_DC_IEHS_STA) {
|
||||
dev_dbg(udc->isp->dev, "%s(HS_STA)\n", __func__);
|
||||
udc->gadget.speed = USB_SPEED_HIGH;
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
Upstream-Status: Accepted [merged with kernel 5.14.9]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 6ccc598ff04d7f7babcbf194b5a0913119abb702 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
Date: Fri, 27 Aug 2021 08:22:26 +0100
|
||||
Subject: [PATCH 23/23] usb: isp1760: otg control register access
|
||||
|
||||
The set/clear of the otg control values is done writing to
|
||||
two different 16bit registers, however we setup the regmap
|
||||
width for isp1760/61 to 32bit value bits.
|
||||
|
||||
So, just access the clear register address (0x376)as the high
|
||||
part of the otg control register set (0x374), and write the
|
||||
values in one go to make sure they get clear/set.
|
||||
|
||||
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
---
|
||||
drivers/usb/isp1760/isp1760-core.c | 50 ++++++++++++++++--------------
|
||||
drivers/usb/isp1760/isp1760-regs.h | 16 ++++++++++
|
||||
2 files changed, 42 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c
|
||||
index cb70f9d63cdd..d1d9a7d5da17 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-core.c
|
||||
+++ b/drivers/usb/isp1760/isp1760-core.c
|
||||
@@ -30,6 +30,7 @@ static int isp1760_init_core(struct isp1760_device *isp)
|
||||
{
|
||||
struct isp1760_hcd *hcd = &isp->hcd;
|
||||
struct isp1760_udc *udc = &isp->udc;
|
||||
+ u32 otg_ctrl;
|
||||
|
||||
/* Low-level chip reset */
|
||||
if (isp->rst_gpio) {
|
||||
@@ -83,16 +84,17 @@ static int isp1760_init_core(struct isp1760_device *isp)
|
||||
*
|
||||
* TODO: Really support OTG. For now we configure port 1 in device mode
|
||||
*/
|
||||
- if (((isp->devflags & ISP1760_FLAG_ISP1761) ||
|
||||
- (isp->devflags & ISP1760_FLAG_ISP1763)) &&
|
||||
- (isp->devflags & ISP1760_FLAG_PERIPHERAL_EN)) {
|
||||
- isp1760_field_set(hcd->fields, HW_DM_PULLDOWN);
|
||||
- isp1760_field_set(hcd->fields, HW_DP_PULLDOWN);
|
||||
- isp1760_field_set(hcd->fields, HW_OTG_DISABLE);
|
||||
- } else {
|
||||
- isp1760_field_set(hcd->fields, HW_SW_SEL_HC_DC);
|
||||
- isp1760_field_set(hcd->fields, HW_VBUS_DRV);
|
||||
- isp1760_field_set(hcd->fields, HW_SEL_CP_EXT);
|
||||
+ if (isp->devflags & ISP1760_FLAG_ISP1761) {
|
||||
+ if (isp->devflags & ISP1760_FLAG_PERIPHERAL_EN) {
|
||||
+ otg_ctrl = (ISP176x_HW_DM_PULLDOWN_CLEAR |
|
||||
+ ISP176x_HW_DP_PULLDOWN_CLEAR |
|
||||
+ ISP176x_HW_OTG_DISABLE);
|
||||
+ } else {
|
||||
+ otg_ctrl = (ISP176x_HW_SW_SEL_HC_DC_CLEAR |
|
||||
+ ISP176x_HW_VBUS_DRV |
|
||||
+ ISP176x_HW_SEL_CP_EXT);
|
||||
+ }
|
||||
+ isp1760_reg_write(hcd->regs, ISP176x_HC_OTG_CTRL, otg_ctrl);
|
||||
}
|
||||
|
||||
dev_info(isp->dev, "%s bus width: %u, oc: %s\n",
|
||||
@@ -235,20 +237,20 @@ static const struct reg_field isp1760_hc_reg_fields[] = {
|
||||
[HC_ISO_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_ISO_IRQ_MASK_AND, 0, 31),
|
||||
[HC_INT_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_INT_IRQ_MASK_AND, 0, 31),
|
||||
[HC_ATL_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_ATL_IRQ_MASK_AND, 0, 31),
|
||||
- [HW_OTG_DISABLE] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 10, 10),
|
||||
- [HW_SW_SEL_HC_DC] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 7, 7),
|
||||
- [HW_VBUS_DRV] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 4, 4),
|
||||
- [HW_SEL_CP_EXT] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 3, 3),
|
||||
- [HW_DM_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 2, 2),
|
||||
- [HW_DP_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 1, 1),
|
||||
- [HW_DP_PULLUP] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 0, 0),
|
||||
- [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 10, 10),
|
||||
- [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 7, 7),
|
||||
- [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 4, 4),
|
||||
- [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 3, 3),
|
||||
- [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 2, 2),
|
||||
- [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 1, 1),
|
||||
- [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 0, 0),
|
||||
+ [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 26, 26),
|
||||
+ [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 23, 23),
|
||||
+ [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 20, 20),
|
||||
+ [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 19, 19),
|
||||
+ [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 18, 18),
|
||||
+ [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 17, 17),
|
||||
+ [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 16, 16),
|
||||
+ [HW_OTG_DISABLE] = REG_FIELD(ISP176x_HC_OTG_CTRL, 10, 10),
|
||||
+ [HW_SW_SEL_HC_DC] = REG_FIELD(ISP176x_HC_OTG_CTRL, 7, 7),
|
||||
+ [HW_VBUS_DRV] = REG_FIELD(ISP176x_HC_OTG_CTRL, 4, 4),
|
||||
+ [HW_SEL_CP_EXT] = REG_FIELD(ISP176x_HC_OTG_CTRL, 3, 3),
|
||||
+ [HW_DM_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL, 2, 2),
|
||||
+ [HW_DP_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL, 1, 1),
|
||||
+ [HW_DP_PULLUP] = REG_FIELD(ISP176x_HC_OTG_CTRL, 0, 0),
|
||||
};
|
||||
|
||||
static const struct reg_field isp1763_hc_reg_fields[] = {
|
||||
diff --git a/drivers/usb/isp1760/isp1760-regs.h b/drivers/usb/isp1760/isp1760-regs.h
|
||||
index 94ea60c20b2a..3a6751197e97 100644
|
||||
--- a/drivers/usb/isp1760/isp1760-regs.h
|
||||
+++ b/drivers/usb/isp1760/isp1760-regs.h
|
||||
@@ -61,6 +61,7 @@
|
||||
#define ISP176x_HC_INT_IRQ_MASK_AND 0x328
|
||||
#define ISP176x_HC_ATL_IRQ_MASK_AND 0x32c
|
||||
|
||||
+#define ISP176x_HC_OTG_CTRL 0x374
|
||||
#define ISP176x_HC_OTG_CTRL_SET 0x374
|
||||
#define ISP176x_HC_OTG_CTRL_CLEAR 0x376
|
||||
|
||||
@@ -179,6 +180,21 @@ enum isp176x_host_controller_fields {
|
||||
#define ISP176x_DC_IESUSP BIT(3)
|
||||
#define ISP176x_DC_IEBRST BIT(0)
|
||||
|
||||
+#define ISP176x_HW_OTG_DISABLE_CLEAR BIT(26)
|
||||
+#define ISP176x_HW_SW_SEL_HC_DC_CLEAR BIT(23)
|
||||
+#define ISP176x_HW_VBUS_DRV_CLEAR BIT(20)
|
||||
+#define ISP176x_HW_SEL_CP_EXT_CLEAR BIT(19)
|
||||
+#define ISP176x_HW_DM_PULLDOWN_CLEAR BIT(18)
|
||||
+#define ISP176x_HW_DP_PULLDOWN_CLEAR BIT(17)
|
||||
+#define ISP176x_HW_DP_PULLUP_CLEAR BIT(16)
|
||||
+#define ISP176x_HW_OTG_DISABLE BIT(10)
|
||||
+#define ISP176x_HW_SW_SEL_HC_DC BIT(7)
|
||||
+#define ISP176x_HW_VBUS_DRV BIT(4)
|
||||
+#define ISP176x_HW_SEL_CP_EXT BIT(3)
|
||||
+#define ISP176x_HW_DM_PULLDOWN BIT(2)
|
||||
+#define ISP176x_HW_DP_PULLDOWN BIT(1)
|
||||
+#define ISP176x_HW_DP_PULLUP BIT(0)
|
||||
+
|
||||
#define ISP176x_DC_ENDPTYP_ISOC 0x01
|
||||
#define ISP176x_DC_ENDPTYP_BULK 0x02
|
||||
#define ISP176x_DC_ENDPTYP_INTERRUPT 0x03
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_DEBUG_INFO_DWARF4=y
|
||||
@@ -0,0 +1,95 @@
|
||||
CONFIG_LOCALVERSION="-yocto-standard"
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_LOG_BUF_SHIFT=13
|
||||
CONFIG_LOG_CPU_MAX_BUF_SHIFT=13
|
||||
CONFIG_RELAY=y
|
||||
CONFIG_BOOT_CONFIG=y
|
||||
CONFIG_ARCH_VEXPRESS=y
|
||||
CONFIG_CMDLINE="console=ttyAMA0 loglevel=9"
|
||||
CONFIG_EFI=y
|
||||
# CONFIG_SUSPEND is not set
|
||||
CONFIG_ARM_FFA_TRANSPORT=y
|
||||
CONFIG_EFI_BOOTLOADER_CONTROL=y
|
||||
CONFIG_EFI_CAPSULE_LOADER=y
|
||||
CONFIG_EFI_TEST=y
|
||||
CONFIG_RESET_ATTACK_MITIGATION=y
|
||||
# CONFIG_STACKPROTECTOR is not set
|
||||
CONFIG_MODULES=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
CONFIG_SYN_COOKIES=y
|
||||
CONFIG_NET_SCHED=y
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_VENDOR_ALACRITECH is not set
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
# CONFIG_NET_VENDOR_AMD is not set
|
||||
# CONFIG_NET_VENDOR_AQUANTIA is not set
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_VENDOR_AURORA is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_NET_VENDOR_CADENCE is not set
|
||||
# CONFIG_NET_VENDOR_CAVIUM is not set
|
||||
# CONFIG_NET_VENDOR_CORTINA is not set
|
||||
# CONFIG_NET_VENDOR_EZCHIP is not set
|
||||
# CONFIG_NET_VENDOR_GOOGLE is not set
|
||||
# CONFIG_NET_VENDOR_HISILICON is not set
|
||||
# CONFIG_NET_VENDOR_HUAWEI is not set
|
||||
# CONFIG_NET_VENDOR_INTEL is not set
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_MICROCHIP is not set
|
||||
# CONFIG_NET_VENDOR_MICROSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
# CONFIG_NET_VENDOR_NI is not set
|
||||
# CONFIG_NET_VENDOR_PENSANDO is not set
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
# CONFIG_NET_VENDOR_ROCKER is not set
|
||||
# CONFIG_NET_VENDOR_SAMSUNG is not set
|
||||
# CONFIG_NET_VENDOR_SEEQ is not set
|
||||
# CONFIG_NET_VENDOR_SOLARFLARE is not set
|
||||
CONFIG_SMC91X=y
|
||||
CONFIG_SMSC911X=y
|
||||
# CONFIG_NET_VENDOR_SOCIONEXT is not set
|
||||
# CONFIG_NET_VENDOR_STMICRO is not set
|
||||
# CONFIG_NET_VENDOR_SYNOPSYS is not set
|
||||
# CONFIG_NET_VENDOR_VIA is not set
|
||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||
# CONFIG_NET_VENDOR_XILINX is not set
|
||||
# CONFIG_SERIO_SERPORT is not set
|
||||
CONFIG_SERIAL_AMBA_PL011=y
|
||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_UAS=y
|
||||
CONFIG_USB_ISP1760=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_PL031=y
|
||||
CONFIG_TEE=y
|
||||
CONFIG_OPTEE=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_CONFIGFS_FS=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_860=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_NLS_ISO8859_15=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
CONFIG_LIBCRC32C=y
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_STACKTRACE=y
|
||||
@@ -81,6 +81,86 @@ KERNEL_FEATURES:append:corstone700-mps3 = " \
|
||||
'', \
|
||||
d)}"
|
||||
|
||||
#
|
||||
# Corstone1000 KMACHINE
|
||||
#
|
||||
FILESEXTRAPATHS:prepend:corstone1000 := "${ARMBSPFILESPATHS}"
|
||||
COMPATIBLE_MACHINE:corstone1000 = "${MACHINE}"
|
||||
KCONFIG_MODE:corstone1000 = "--alldefconfig"
|
||||
KMACHINE:corstone1000 = "corstone1000"
|
||||
LINUX_KERNEL_TYPE:corstone1000 = "standard"
|
||||
#disabling the rootfs cpio file compression so it is not compressed twice when bundled with the kernel
|
||||
KERNEL_EXTRA_ARGS:corstone1000 += "CONFIG_INITRAMFS_COMPRESSION_NONE=y"
|
||||
SRC_URI:append:corstone1000 = " \
|
||||
file://0001-usb-isp1760-fix-strict-typechecking.patch \
|
||||
file://0002-usb-isp1760-move-to-regmap-for-register-access.patch \
|
||||
file://0003-usb-isp1760-use-relaxed-primitives.patch \
|
||||
file://0004-usb-isp1760-remove-platform-data-struct-and-code.patch \
|
||||
file://0005-usb-isp1760-hcd-refactor-mempool-config-and-setup.patch \
|
||||
file://0006-usb-isp1760-use-dr_mode-binding.patch \
|
||||
file://0007-usb-isp1760-add-support-for-isp1763.patch \
|
||||
file://0008-dt-bindings-usb-nxp-isp1760-add-bindings.patch \
|
||||
file://0009-usb-isp1763-add-peripheral-mode.patch \
|
||||
file://0010-firmware-smccc-Add-SMCCC-TRNG-function-call-IDs.patch \
|
||||
file://0011-firmware-smccc-Introduce-SMCCC-TRNG-framework.patch \
|
||||
file://0012-arm64-smccc-Add-support-for-SMCCCv1.2-extended-input-output-registers.patch \
|
||||
file://0013-firmware-arm_ffa-Add-initial-FFA-bus-support-for-device-enumeration.patch \
|
||||
file://0014-firmware-arm_ffa-Add-initial-Arm-FFA-driver-support.patch \
|
||||
file://0015-firmware-arm_ffa-Add-support-for-SMCCC-as-transport-to-ffa-driver.patch \
|
||||
file://0016-firmware-arm_ffa-Setup-in-kernel-users-of-FFA-partitions.patch \
|
||||
file://0017-firmware-arm_ffa-Add-support-for-MEM_-interfaces.patch \
|
||||
file://0018-firmware-arm_ffa-Ensure-drivers-provide-a-probe-function.patch \
|
||||
file://0019-firmware-arm_ffa-Simplify-probe-function.patch \
|
||||
file://0020-firmware-arm_ffa-Fix-the-comment-style.patch \
|
||||
file://0021-firmware-arm_ffa-Fix-a-possible-ffa_linux_errmap-buffer-overflow.patch \
|
||||
file://0022-usb-isp1760-isp1760-udc-Provide-missing-description-.patch \
|
||||
file://0023-usb-isp1760-Fix-meaningless-check-in-isp1763_run.patch \
|
||||
file://0024-usb-isp1760-remove-debug-message-as-error.patch \
|
||||
file://0025-usb-isp1760-do-not-sleep-in-field-register-poll.patch \
|
||||
file://0026-usb-isp1760-rework-cache-initialization-error-handli.patch \
|
||||
file://0027-usb-isp1760-ignore-return-value-for-bus-change-patte.patch \
|
||||
file://0028-usb-isp1760-check-maxpacketsize-before-using-it.patch \
|
||||
file://0029-usb-isp1760-do-not-reset-retval.patch \
|
||||
file://0030-usb-isp1760-do-not-shift-in-uninitialized-slot.patch \
|
||||
file://0031-usb-isp1760-clean-never-read-udc_enabled-warning.patch \
|
||||
file://0032-usb-isp1760-fix-memory-pool-initialization.patch \
|
||||
file://0033-usb-isp1760-fix-qtd-fill-length.patch \
|
||||
file://0034-usb-isp1760-write-to-status-and-address-register.patch \
|
||||
file://0035-usb-isp1760-use-the-right-irq-status-bit.patch \
|
||||
file://0036-usb-isp1760-otg-control-register-access.patch \
|
||||
file://defconfig \
|
||||
"
|
||||
|
||||
SRC_URI:append:corstone1000 = " ${@bb.utils.contains('MACHINE_FEATURES', \
|
||||
'corstone1000_kernel_debug', \
|
||||
'file://corstone1000_kernel_debug.cfg', \
|
||||
'', \
|
||||
d)}"
|
||||
|
||||
# Default kernel features not needed for corstone1000
|
||||
# otherwise the extra kernel modules will increase the rootfs size
|
||||
# corstone1000 has limited flash memory constraints
|
||||
KERNEL_EXTRA_FEATURES:corstone1000 = ""
|
||||
KERNEL_FEATURES:corstone1000 = ""
|
||||
# No need to include the kernel image in the rootfs
|
||||
# So, let's delete the package doing that and uninstalling the initial
|
||||
# kernel binary.
|
||||
# The kernel binary needed is the initramfs bundle
|
||||
|
||||
FILES:kernel-image-image:corstone1000=""
|
||||
|
||||
# Uninstalling the initial kernel binary
|
||||
|
||||
do_install:append:corstone1000() {
|
||||
if [ -e "${D}/${KERNEL_IMAGEDEST}/$imageType-${KERNEL_VERSION}" ]; then
|
||||
rm ${D}/${KERNEL_IMAGEDEST}/$imageType-${KERNEL_VERSION}
|
||||
fi
|
||||
|
||||
if [ -e "${D}/${KERNEL_IMAGEDEST}/$imageType" ]; then
|
||||
rm ${D}/${KERNEL_IMAGEDEST}/$imageType
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# FVP BASE KMACHINE
|
||||
#
|
||||
|
||||
+201
@@ -0,0 +1,201 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From 439a87df6a9f60f2b29afd988ad58a67e6f0b603 Mon Sep 17 00:00:00 2001
|
||||
From: Vishnu Banavath <vishnu.banavath@arm.com>
|
||||
Date: Tue, 22 Jun 2021 22:09:28 +0100
|
||||
Subject: [PATCH] plat-corstone1000: add corstone1000 platform
|
||||
|
||||
These changes are to add corstone1000 platform to optee core
|
||||
|
||||
Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
|
||||
|
||||
diff --git a/core/arch/arm/plat-corstone1000/conf.mk b/core/arch/arm/plat-corstone1000/conf.mk
|
||||
new file mode 100644
|
||||
index 00000000..b14dd442
|
||||
--- /dev/null
|
||||
+++ b/core/arch/arm/plat-corstone1000/conf.mk
|
||||
@@ -0,0 +1,37 @@
|
||||
+PLATFORM_FLAVOR ?= mps3
|
||||
+
|
||||
+$(call force,CFG_HWSUPP_MEM_PERM_WXN,y)
|
||||
+$(call force,CFG_HWSUPP_MEM_PERM_PXN,y)
|
||||
+$(call force,CFG_ENABLE_SCTLR_RR,n)
|
||||
+$(call force,CFG_ENABLE_SCTLR_Z,n)
|
||||
+
|
||||
+arm64-platform-cpuarch := cortex-a35
|
||||
+arm64-platform-cflags += -mcpu=$(arm64-platform-cpuarch)
|
||||
+arm64-platform-aflags += -mcpu=$(arm64-platform-cpuarch)
|
||||
+platform-flavor-armv8 := 1
|
||||
+
|
||||
+$(call force,CFG_GIC,y)
|
||||
+$(call force,CFG_PL011,y)
|
||||
+$(call force,CFG_SECURE_TIME_SOURCE_CNTPCT,y)
|
||||
+
|
||||
+$(call force,CFG_ARM64_core,y)
|
||||
+
|
||||
+CFG_WITH_STATS ?= y
|
||||
+
|
||||
+CFG_WITH_ARM_TRUSTED_FW ?= y
|
||||
+CFG_WITH_LPAE ?=y
|
||||
+
|
||||
+CFG_TEE_CORE_NB_CORE = 1
|
||||
+CFG_TZDRAM_START ?= 0x02002000
|
||||
+CFG_TZDRAM_SIZE ?= 0x000FE000
|
||||
+CFG_TEE_RAM_VA_SIZE ?= 0x00AF000
|
||||
+CFG_SHMEM_START ?= 0x86000000
|
||||
+CFG_SHMEM_SIZE ?= 0x00200000
|
||||
+
|
||||
+CFG_DDR_SIZE ?= 0x80000000
|
||||
+CFG_DT_ADDR ?= 0x82100000
|
||||
+CFG_DTB_MAX_SIZE ?= 0x100000
|
||||
+
|
||||
+$(call force,CFG_PSCI_ARM64,y)
|
||||
+$(call force,CFG_DT,y)
|
||||
+$(call force,CFG_EXTERNAL_DTB_OVERLAY,y)
|
||||
diff --git a/core/arch/arm/plat-corstone1000/main.c b/core/arch/arm/plat-corstone1000/main.c
|
||||
new file mode 100644
|
||||
index 00000000..35d89535
|
||||
--- /dev/null
|
||||
+++ b/core/arch/arm/plat-corstone1000/main.c
|
||||
@@ -0,0 +1,77 @@
|
||||
+// SPDX-License-Identifier: BSD-2-Clause
|
||||
+/*
|
||||
+ * Copyright (c) 2020, Linaro Limited
|
||||
+ */
|
||||
+
|
||||
+#include <arm64.h>
|
||||
+#include <console.h>
|
||||
+#include <drivers/gic.h>
|
||||
+#include <drivers/pl011.h>
|
||||
+#include <drivers/tzc400.h>
|
||||
+#include <initcall.h>
|
||||
+#include <keep.h>
|
||||
+#include <kernel/boot.h>
|
||||
+#include <kernel/interrupt.h>
|
||||
+#include <kernel/misc.h>
|
||||
+#include <kernel/panic.h>
|
||||
+#include <kernel/tee_time.h>
|
||||
+#include <mm/core_memprot.h>
|
||||
+#include <mm/core_mmu.h>
|
||||
+#include <platform_config.h>
|
||||
+#include <sm/psci.h>
|
||||
+#include <stdint.h>
|
||||
+#include <string.h>
|
||||
+#include <trace.h>
|
||||
+
|
||||
+static struct gic_data gic_data __nex_bss;
|
||||
+static struct pl011_data console_data __nex_bss;
|
||||
+
|
||||
+register_phys_mem_pgdir(MEM_AREA_IO_SEC, CONSOLE_UART_BASE, PL011_REG_SIZE);
|
||||
+#ifdef DRAM0_BASE
|
||||
+register_ddr(DRAM0_BASE, DRAM0_SIZE);
|
||||
+#endif
|
||||
+
|
||||
+#ifdef GIC_BASE
|
||||
+register_phys_mem_pgdir(MEM_AREA_IO_SEC, GICD_BASE, GIC_DIST_REG_SIZE);
|
||||
+register_phys_mem_pgdir(MEM_AREA_IO_SEC, GICC_BASE, GIC_DIST_REG_SIZE);
|
||||
+
|
||||
+void main_init_gic(void)
|
||||
+{
|
||||
+ vaddr_t gicc_base;
|
||||
+ vaddr_t gicd_base;
|
||||
+
|
||||
+ gicc_base = core_mmu_get_va(GICC_BASE, MEM_AREA_IO_SEC);
|
||||
+ gicd_base = core_mmu_get_va(GICD_BASE, MEM_AREA_IO_SEC);
|
||||
+
|
||||
+ if (!gicc_base || !gicd_base)
|
||||
+ panic();
|
||||
+
|
||||
+ /* Initialize GIC */
|
||||
+ gic_init(&gic_data, gicc_base, gicd_base);
|
||||
+ itr_init(&gic_data.chip);
|
||||
+
|
||||
+}
|
||||
+
|
||||
+void main_secondary_init_gic(void)
|
||||
+{
|
||||
+ gic_cpu_init(&gic_data);
|
||||
+}
|
||||
+
|
||||
+void itr_core_handler(void)
|
||||
+{
|
||||
+ gic_it_handle(&gic_data);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+void console_init(void)
|
||||
+{
|
||||
+ pl011_init(&console_data, CONSOLE_UART_BASE, CONSOLE_UART_CLK_IN_HZ,
|
||||
+ CONSOLE_BAUDRATE);
|
||||
+ register_serial_console(&console_data.chip);
|
||||
+}
|
||||
+
|
||||
+void ffa_secondary_cpu_boot_req(vaddr_t secondary_ep, uint64_t cookie)
|
||||
+{
|
||||
+ DMSG("This is single core platform\n");
|
||||
+}
|
||||
+
|
||||
diff --git a/core/arch/arm/plat-corstone1000/platform_config.h b/core/arch/arm/plat-corstone1000/platform_config.h
|
||||
new file mode 100644
|
||||
index 00000000..cfee6fa4
|
||||
--- /dev/null
|
||||
+++ b/core/arch/arm/plat-corstone1000/platform_config.h
|
||||
@@ -0,0 +1,46 @@
|
||||
+/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
+/*
|
||||
+ * Copyright (c) 2020, Linaro Limited
|
||||
+ */
|
||||
+
|
||||
+#ifndef PLATFORM_CONFIG_H
|
||||
+#define PLATFORM_CONFIG_H
|
||||
+
|
||||
+#include <mm/generic_ram_layout.h>
|
||||
+#include <stdint.h>
|
||||
+
|
||||
+/* Make stacks aligned to data cache line length */
|
||||
+#define STACK_ALIGNMENT 64
|
||||
+
|
||||
+
|
||||
+#define GIC_BASE 0x1c000000
|
||||
+#define UART0_BASE 0x1a510000
|
||||
+#define UART1_BASE 0x1a520000
|
||||
+
|
||||
+#define CONSOLE_UART_BASE UART1_BASE
|
||||
+
|
||||
+#define DRAM0_BASE 0x80000000
|
||||
+#define DRAM0_SIZE 0x7f000000
|
||||
+
|
||||
+#define GICD_OFFSET 0x10000
|
||||
+#define GICC_OFFSET 0x2f000
|
||||
+
|
||||
+#ifdef GIC_BASE
|
||||
+#define GICD_BASE (GIC_BASE + GICD_OFFSET)
|
||||
+#define GICC_BASE (GIC_BASE + GICC_OFFSET)
|
||||
+#endif
|
||||
+
|
||||
+#ifndef UART_BAUDRATE
|
||||
+#define UART_BAUDRATE 115200
|
||||
+#endif
|
||||
+#ifndef CONSOLE_BAUDRATE
|
||||
+#define CONSOLE_BAUDRATE UART_BAUDRATE
|
||||
+#endif
|
||||
+
|
||||
+#ifndef SYS_COUNTER_FREQ_IN_TICKS
|
||||
+#define SYS_COUNTER_FREQ_IN_TICKS UL(50000000) /* 32MHz */
|
||||
+#endif
|
||||
+
|
||||
+#define CONSOLE_UART_CLK_IN_HZ UL(50000000) /* 32MHz*/
|
||||
+
|
||||
+#endif /*PLATFORM_CONFIG_H*/
|
||||
diff --git a/core/arch/arm/plat-corstone1000/sub.mk b/core/arch/arm/plat-corstone1000/sub.mk
|
||||
new file mode 100644
|
||||
index 00000000..8ddc2fd4
|
||||
--- /dev/null
|
||||
+++ b/core/arch/arm/plat-corstone1000/sub.mk
|
||||
@@ -0,0 +1,2 @@
|
||||
+global-incdirs-y += .
|
||||
+srcs-y += main.c
|
||||
--
|
||||
2.17.1
|
||||
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||
Signed-off-by: Arpita S.K <arpita.s.k@arm.com>
|
||||
|
||||
From dbaf7a11e686d362eb09e63841eb718ea777dd03 Mon Sep 17 00:00:00 2001
|
||||
From: Vishnu Banavath <vishnu.banavath@arm.com>
|
||||
Date: Wed, 1 Sep 2021 16:46:42 +0100
|
||||
Subject: [PATCH] plat-corstone1000: reserve 3MB CVM memory for optee
|
||||
|
||||
optee requires 3MB CVM memory to include SecurePartition's into
|
||||
it's image
|
||||
|
||||
Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
|
||||
|
||||
diff --git a/core/arch/arm/plat-corstone1000/conf.mk b/core/arch/arm/plat-corstone1000/conf.mk
|
||||
index b14dd442..7a4aa13c 100644
|
||||
--- a/core/arch/arm/plat-corstone1000/conf.mk
|
||||
+++ b/core/arch/arm/plat-corstone1000/conf.mk
|
||||
@@ -23,8 +23,7 @@ CFG_WITH_LPAE ?=y
|
||||
|
||||
CFG_TEE_CORE_NB_CORE = 1
|
||||
CFG_TZDRAM_START ?= 0x02002000
|
||||
-CFG_TZDRAM_SIZE ?= 0x000FE000
|
||||
-CFG_TEE_RAM_VA_SIZE ?= 0x00AF000
|
||||
+CFG_TZDRAM_SIZE ?= 0x300000 # OPTEE CODE + DATA +TA_RAM = 3MB
|
||||
CFG_SHMEM_START ?= 0x86000000
|
||||
CFG_SHMEM_SIZE ?= 0x00200000
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# Machine specific configurations
|
||||
|
||||
MACHINE_OPTEE_OS_REQUIRE ?= ""
|
||||
MACHINE_OPTEE_OS_REQUIRE:corstone1000 = "optee-os_corstone1000.inc"
|
||||
MACHINE_OPTEE_OS_REQUIRE:tc = "optee-os-tc.inc"
|
||||
|
||||
require ${MACHINE_OPTEE_OS_REQUIRE}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
SRC_URI = "git://git.trustedfirmware.org/OP-TEE/optee_os.git;protocol=https;branch=psa-development"
|
||||
SRCREV = "f9de2c9520ed97b89760cc4c99424aae440b63f4"
|
||||
PV .= "+git${SRCREV}"
|
||||
|
||||
DEPENDS += "python3-pycryptodomex-native"
|
||||
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/files/optee-os/corstone1000:"
|
||||
|
||||
SRC_URI:append = " \
|
||||
file://0001-plat-corstone1000-add-corstone1000-platform.patch \
|
||||
file://0002-plat-corstone1000-reserve-3MB-CVM-memory-for-optee.patch"
|
||||
|
||||
COMPATIBLE_MACHINE = "corstone1000"
|
||||
|
||||
OPTEEMACHINE = "corstone1000"
|
||||
# Enable optee memory layout and boot logs
|
||||
EXTRA_OEMAKE += " CFG_TEE_CORE_LOG_LEVEL=4"
|
||||
|
||||
# default disable latency benchmarks (over all OP-TEE layers)
|
||||
EXTRA_OEMAKE += " CFG_TEE_BENCHMARK=n"
|
||||
|
||||
EXTRA_OEMAKE += " CFG_CORE_SEL1_SPMC=y CFG_CORE_FFA=y"
|
||||
|
||||
EXTRA_OEMAKE += " CFG_WITH_SP=y"
|
||||
|
||||
EXTRA_OEMAKE += " HOST_PREFIX=${HOST_PREFIX}"
|
||||
EXTRA_OEMAKE += " CROSS_COMPILE64=${HOST_PREFIX}"
|
||||
@@ -0,0 +1,3 @@
|
||||
# This is needed so that multiple locations can provide the same package
|
||||
from pkgutil import extend_path
|
||||
__path__ = extend_path(__path__, __name__)
|
||||
@@ -0,0 +1,88 @@
|
||||
import asyncio
|
||||
import os
|
||||
import pathlib
|
||||
import signal
|
||||
import subprocess
|
||||
|
||||
import oeqa.core.target.ssh
|
||||
|
||||
class OEFVPTarget(oeqa.core.target.ssh.OESSHTarget):
|
||||
|
||||
# meta-arm/scripts isn't on PATH, so work out where it is
|
||||
metaarm = pathlib.Path(__file__).parents[4]
|
||||
|
||||
def __init__(self, logger, target_ip, server_ip, timeout=300, user='root',
|
||||
port=None, server_port=0, dir_image=None, rootfs=None, bootlog=None,
|
||||
**kwargs):
|
||||
super().__init__(logger, target_ip, server_ip, timeout, user, port)
|
||||
image_dir = pathlib.Path(dir_image)
|
||||
basename = pathlib.Path(rootfs).stem
|
||||
self.fvpconf = image_dir / (basename + ".fvpconf")
|
||||
|
||||
if not self.fvpconf.exists():
|
||||
raise FileNotFoundError(f"Cannot find {self.fvpconf}")
|
||||
# FVPs boot slowly, so allow ten minutes
|
||||
self.boot_timeout = 10 * 60
|
||||
|
||||
self.logfile = bootlog and open(bootlog, "wb") or None
|
||||
|
||||
async def boot_fvp(self):
|
||||
cmd = [OEFVPTarget.metaarm / "scripts" / "runfvp", "--console", "--verbose", self.fvpconf]
|
||||
# Python 3.7 needs the command items to be str
|
||||
cmd = [str(c) for c in cmd]
|
||||
self.logger.debug(f"Starting {cmd}")
|
||||
|
||||
# TODO: refactor runfvp so this can import it and directly hook to the
|
||||
# console callback, then use telnetlib directly to access the console.
|
||||
|
||||
# As we're using --console, telnet expects stdin to be readable too.
|
||||
self.fvp = await asyncio.create_subprocess_exec(*cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
|
||||
self.logger.debug(f"Started runfvp PID {self.fvp.pid}")
|
||||
|
||||
async def wait_for_login():
|
||||
bootlog = bytearray()
|
||||
while True:
|
||||
line = await self.fvp.stdout.read(1024)
|
||||
if not line:
|
||||
self.logger.debug("runfvp terminated")
|
||||
return False, bootlog
|
||||
|
||||
self.logger.debug(f"Read line [{line}]")
|
||||
|
||||
bootlog += line
|
||||
if self.logfile:
|
||||
self.logfile.write(line)
|
||||
|
||||
if b" login:" in bootlog:
|
||||
self.logger.debug("Found login prompt")
|
||||
return True, bootlog
|
||||
return False, bootlog
|
||||
|
||||
try:
|
||||
found, bootlog = await asyncio.wait_for(wait_for_login(), self.boot_timeout)
|
||||
if found:
|
||||
return
|
||||
except asyncio.TimeoutError:
|
||||
self.logger.info("Timed out waiting for login prompt.")
|
||||
self.logger.info(b"".join(bootlog.splitlines()[-20:]).decode("utf-8", errors="replace"))
|
||||
raise RuntimeError("Failed to start FVP.")
|
||||
|
||||
def start(self, **kwargs):
|
||||
# When we can assume Py3.7+, this can simply be asyncio.run()
|
||||
loop = asyncio.get_event_loop()
|
||||
loop.run_until_complete(asyncio.gather(self.boot_fvp()))
|
||||
|
||||
def stop(self, **kwargs):
|
||||
loop = asyncio.get_event_loop()
|
||||
|
||||
try:
|
||||
# Kill the process group so that the telnet and FVP die too
|
||||
gid = os.getpgid(self.fvp.pid)
|
||||
self.logger.debug(f"Sending SIGTERM to {gid}")
|
||||
os.killpg(gid, signal.SIGTERM)
|
||||
loop.run_until_complete(asyncio.wait_for(self.fvp.wait(), 10))
|
||||
except TimeoutError:
|
||||
self.logger.debug(f"Timed out, sending SIGKILL to {gid}")
|
||||
os.killpg(gid, signal.SIGKILL)
|
||||
except ProcessLookupError:
|
||||
return
|
||||
@@ -0,0 +1,52 @@
|
||||
fiptool: respect OPENSSL_DIR
|
||||
|
||||
fiptool links to libcrypto, so as with the other tools it should respect
|
||||
OPENSSL_DIR for include/library paths.
|
||||
|
||||
Upstream-Status: Submitted
|
||||
Signed-off-by: Ross Burton <ross.burton@arm.com>
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index ec6f88585..2d3b9fc26 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1388,7 +1388,7 @@ fwu_fip: ${BUILD_PLAT}/${FWU_FIP_NAME}
|
||||
|
||||
${FIPTOOL}: FORCE
|
||||
ifdef UNIX_MK
|
||||
- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" FIPTOOL=${FIPTOOL} --no-print-directory -C ${FIPTOOLPATH}
|
||||
+ ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" FIPTOOL=${FIPTOOL} OPENSSL_DIR=${OPENSSL_DIR} --no-print-directory -C ${FIPTOOLPATH}
|
||||
else
|
||||
# Clear the MAKEFLAGS as we do not want
|
||||
# to pass the gnumake flags to nmake.
|
||||
diff --git a/tools/fiptool/Makefile b/tools/fiptool/Makefile
|
||||
index 11d2e7b0b..7c2a08379 100644
|
||||
--- a/tools/fiptool/Makefile
|
||||
+++ b/tools/fiptool/Makefile
|
||||
@@ -12,6 +12,8 @@ FIPTOOL ?= fiptool${BIN_EXT}
|
||||
PROJECT := $(notdir ${FIPTOOL})
|
||||
OBJECTS := fiptool.o tbbr_config.o
|
||||
V ?= 0
|
||||
+OPENSSL_DIR := /usr
|
||||
+
|
||||
|
||||
override CPPFLAGS += -D_GNU_SOURCE -D_XOPEN_SOURCE=700
|
||||
HOSTCCFLAGS := -Wall -Werror -pedantic -std=c99
|
||||
@@ -20,7 +22,7 @@ ifeq (${DEBUG},1)
|
||||
else
|
||||
HOSTCCFLAGS += -O2
|
||||
endif
|
||||
-LDLIBS := -lcrypto
|
||||
+LDLIBS := -L${OPENSSL_DIR}/lib -lcrypto
|
||||
|
||||
ifeq (${V},0)
|
||||
Q := @
|
||||
@@ -28,7 +30,7 @@ else
|
||||
Q :=
|
||||
endif
|
||||
|
||||
-INCLUDE_PATHS := -I../../include/tools_share
|
||||
+INCLUDE_PATHS := -I../../include/tools_share -I${OPENSSL_DIR}/include
|
||||
|
||||
HOSTCC ?= gcc
|
||||
|
||||
@@ -7,7 +7,8 @@ PACKAGE_ARCH = "${MACHINE_ARCH}"
|
||||
|
||||
inherit deploy
|
||||
|
||||
SRC_URI = "git://git.trustedfirmware.org/TF-A/trusted-firmware-a.git;protocol=https;name=tfa"
|
||||
SRC_URI = "git://git.trustedfirmware.org/TF-A/trusted-firmware-a.git;protocol=https;name=tfa \
|
||||
file://ssl.patch"
|
||||
UPSTREAM_CHECK_GITTAGREGEX = "^v(?P<pver>\d+(\.\d+)+)$"
|
||||
|
||||
COMPATIBLE_MACHINE ?= "invalid"
|
||||
@@ -140,30 +141,25 @@ EXTRA_OEMAKE += "${@bb.utils.contains('SEL2_SPMC', '1', 'ARM_SPMC_MANIFEST_DTS=$
|
||||
|
||||
# Tell the tools where the native OpenSSL is located
|
||||
EXTRA_OEMAKE += "OPENSSL_DIR=${STAGING_DIR_NATIVE}/${prefix_native}"
|
||||
# Use the correct native compiler
|
||||
EXTRA_OEMAKE += "HOSTCC='${BUILD_CC}'"
|
||||
|
||||
# Runtime variables
|
||||
EXTRA_OEMAKE += "RUNTIME_SYSROOT=${STAGING_DIR_HOST}"
|
||||
EXTRA_OEMAKE += "TARGET_FPU=${TARGET_FPU}"
|
||||
|
||||
BUILD_DIR = "${B}/${TFA_PLATFORM}"
|
||||
BUILD_DIR .= "${@'/${TFA_BOARD}' if d.getVar('TFA_BOARD') else ''}"
|
||||
BUILD_DIR .= "/${@'debug' if d.getVar("TFA_DEBUG") == '1' else 'release'}"
|
||||
|
||||
# The following hack is needed to fit properly in yocto build environment
|
||||
# TFA is forcing the host compiler and its flags in the Makefile using :=
|
||||
# assignment for GCC and CFLAGS.
|
||||
do_compile() {
|
||||
cd ${S}
|
||||
|
||||
# These changes are needed to have the native tools compiling and executing properly
|
||||
# This is still needed to have the native fiptool executing properly by
|
||||
# setting the RPATH
|
||||
sed -i '/^LDLIBS/ s,$, \$\{BUILD_LDFLAGS},' ${S}/tools/fiptool/Makefile
|
||||
sed -i '/^INCLUDE_PATHS/ s,$, \$\{BUILD_CFLAGS},' ${S}/tools/fiptool/Makefile
|
||||
# This can be removed when only TF-A 2.4 onwards is supported
|
||||
sed -i 's^OPENSSL_DIR.*=.*$^OPENSSL_DIR = ${STAGING_DIR_NATIVE}/${prefix_native}^' ${S}/tools/*/Makefile
|
||||
|
||||
# Currently there are races if you build all the targets at once in parallel
|
||||
for T in ${TFA_BUILD_TARGET}; do
|
||||
oe_runmake $T
|
||||
oe_runmake -C ${S} $T
|
||||
done
|
||||
}
|
||||
do_compile[cleandirs] = "${B}"
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
#
|
||||
# Trusted firmware-A 1.5
|
||||
#
|
||||
|
||||
require trusted-firmware-a.inc
|
||||
|
||||
# Use TF-A for version
|
||||
SRCREV_FORMAT = "tfa"
|
||||
|
||||
# TF-A v1.5
|
||||
SRCREV_tfa = "ed8112606c54d85781fc8429160883d6310ece32"
|
||||
|
||||
LIC_FILES_CHKSUM += "file://license.rst;md5=e927e02bca647e14efd87e9e914b2443"
|
||||
|
||||
#
|
||||
# mbed TLS source
|
||||
# Those are used in trusted-firmware-a.inc if TFA_MBEDTLS is set to 1
|
||||
#
|
||||
|
||||
SRC_URI_MBEDTLS = "git://github.com/ARMmbed/mbedtls.git;name=mbedtls;protocol=https;destsuffix=git/mbedtls;branch=mbedtls-2.16"
|
||||
|
||||
# mbed TLS v2.16.2
|
||||
SRCREV_mbedtls = "d81c11b8ab61fd5b2da8133aa73c5fe33a0633eb"
|
||||
|
||||
LIC_FILES_CHKSUM_MBEDTLS = " \
|
||||
file://mbedtls/apache-2.0.txt;md5=3b83ef96387f14655fc854ddc3c6bd57 \
|
||||
file://mbedtls/LICENSE;md5=302d50a6369f5f22efdb674db908167a \
|
||||
"
|
||||
+12
-12
@@ -18,18 +18,18 @@ LIC_FILES_CHKSUM = "file://license.rst;md5=07f368487da347f3c7bd0fc3085f3afa \
|
||||
SRC_URI = "git://git.trustedfirmware.org/TF-M/trusted-firmware-m.git;protocol=https;branch=master;name=tfm;destsuffix=${S} \
|
||||
git://git.trustedfirmware.org/TF-M/tf-m-tests.git;protocol=https;branch=master;name=tfm-tests;destsuffix=${S}/../tf-m-tests \
|
||||
git://github.com/ARMmbed/mbedtls.git;protocol=https;branch=master;name=mbedtls;destsuffix=${S}/../mbedtls \
|
||||
git://github.com/mcu-tools/mcuboot.git;protocol=https;branch=v1.7-branch;name=mcuboot;destsuffix=${S}/../mcuboot \
|
||||
git://github.com/mcu-tools/mcuboot.git;protocol=https;branch=main;name=mcuboot;destsuffix=${S}/../mcuboot \
|
||||
"
|
||||
|
||||
# The required dependencies are documented in tf-m/config/config_default.cmake
|
||||
# TF-Mv1.3.0
|
||||
SRCREV_tfm = "aa7d90a23b045e50c26ef66b11250842b665f54b"
|
||||
# mbedtls 2.26
|
||||
SRCREV_mbedtls = "e483a77c85e1f9c1dd2eb1c5a8f552d2617fe400"
|
||||
# tf-m-tests v1.3.0
|
||||
SRCREV_tfm-tests = "e7430d13b388a106c9f4cfb534e7340ce1482575"
|
||||
# 1.7.2
|
||||
SRCREV_mcuboot = "4aa516e7281fc6f9a2dce0b0efda9acc580fa254"
|
||||
# TF-Mv1.4.0
|
||||
SRCREV_tfm = "7ef9178adad866d48e3af42d8a3129dfab792ed8"
|
||||
# mbedtls-3.0.0
|
||||
SRCREV_mbedtls = "8df2f8e7b9c7bb9390ac74bb7bace27edca81a2b"
|
||||
# TF-Mv1.4.0
|
||||
SRCREV_tfm-tests = "e1a8c9fb8394b1f6ea66d2611c070915b0d4b573"
|
||||
# TF-Mv1.4-integ
|
||||
SRCREV_mcuboot = "4f8091318b4026d14af9e5a7036825bff62fb612"
|
||||
|
||||
UPSTREAM_CHECK_GITTAGREGEX = "^TF-Mv(?P<pver>\d+(\.\d+)+)$"
|
||||
|
||||
@@ -69,8 +69,8 @@ python() {
|
||||
|
||||
PACKAGECONFIG ??= "cc-gnuarm"
|
||||
# What compiler to use
|
||||
PACKAGECONFIG[cc-gnuarm] = "-DTFM_TOOLCHAIN_FILE=toolchain_GNUARM.cmake,,gcc-arm-none-eabi-native"
|
||||
PACKAGECONFIG[cc-armclang] = "-DTFM_TOOLCHAIN_FILE=toolchain_ARMCLANG.cmake,,armcompiler-native"
|
||||
PACKAGECONFIG[cc-gnuarm] = "-DTFM_TOOLCHAIN_FILE=${S}/toolchain_GNUARM.cmake,,gcc-arm-none-eabi-native"
|
||||
PACKAGECONFIG[cc-armclang] = "-DTFM_TOOLCHAIN_FILE=${S}/toolchain_ARMCLANG.cmake,,armcompiler-native"
|
||||
# Whether to integrate the test suite
|
||||
PACKAGECONFIG[test-secure] = "-DTEST_S=ON,-DTEST_S=OFF"
|
||||
PACKAGECONFIG[test-nonsecure] = "-DTEST_NS=ON,-DTEST_NS=OFF"
|
||||
@@ -101,7 +101,7 @@ do_patch[postfuncs] += "apply_local_patches"
|
||||
|
||||
do_configure[cleandirs] = "${B}"
|
||||
do_configure() {
|
||||
cmake -G"Unix Makefiles" -S ${S} -B ${B} ${EXTRA_OECMAKE}
|
||||
cmake -G"Unix Makefiles" -S ${S} -B ${B} ${EXTRA_OECMAKE} ${PACKAGECONFIG_CONFARGS}
|
||||
}
|
||||
|
||||
# Invoke install here as there's no point in splitting compile from install: the
|
||||
@@ -1,4 +0,0 @@
|
||||
SRCREV_edk2 ?= "ef91b07388e1c0a50c604e5350eeda98428ccea6"
|
||||
SRCREV_edk2-platforms ?= "2620e05c6fade20ef5e1ba69280d09f9e2b3eff6"
|
||||
|
||||
require edk2-firmware.inc
|
||||
@@ -0,0 +1,4 @@
|
||||
SRCREV_edk2 ?= "e1999b264f1f9d7230edf2448f757c73da567832"
|
||||
SRCREV_edk2-platforms ?= "86984c17d562fc60a6dabbc3a479d79163656a0c"
|
||||
|
||||
require edk2-firmware.inc
|
||||
@@ -7,20 +7,12 @@ diff --git a/ShellPkg/ShellPkg.dsc b/ShellPkg/ShellPkg.dsc
|
||||
index c42bc9464a..ea21f07a31 100644
|
||||
--- a/ShellPkg/ShellPkg.dsc
|
||||
+++ b/ShellPkg/ShellPkg.dsc
|
||||
@@ -20,6 +20,8 @@
|
||||
SKUID_IDENTIFIER = DEFAULT
|
||||
|
||||
@@ -24,2 +24,4 @@
|
||||
[LibraryClasses.common]
|
||||
+ SbsaValLib|ShellPkg/Application/sbsa-acs/val/SbsaValLib.inf
|
||||
+ SbsaPalLib|ShellPkg/Application/sbsa-acs/platform/pal_uefi/SbsaPalLib.inf
|
||||
UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
|
||||
UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
|
||||
UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
|
||||
@@ -83,6 +85,7 @@
|
||||
# Build all the libraries when building this package.
|
||||
# This helps developers test changes and how they affect the package.
|
||||
@@ -88,2 +90,3 @@
|
||||
#
|
||||
+ ShellPkg/Application/sbsa-acs/uefi_app/SbsaAvs.inf
|
||||
+ ShellPkg/Application/sbsa-acs/uefi_app/SbsaAvs.inf
|
||||
ShellPkg/Library/UefiShellLib/UefiShellLib.inf
|
||||
ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf
|
||||
ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
require recipes-bsp/uefi/edk2-firmware_202102.bb
|
||||
require recipes-bsp/uefi/edk2-firmware_202105.bb
|
||||
|
||||
PROVIDES:remove = "virtual/uefi-firmware"
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
fiptool: respect OPENSSL_DIR
|
||||
|
||||
fiptool links to libcrypto, so as with the other tools it should respect
|
||||
OPENSSL_DIR for include/library paths.
|
||||
|
||||
Upstream-Status: Submitted
|
||||
Signed-off-by: Ross Burton <ross.burton@arm.com>
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index ec6f88585..2d3b9fc26 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1388,7 +1388,7 @@ fwu_fip: ${BUILD_PLAT}/${FWU_FIP_NAME}
|
||||
|
||||
${FIPTOOL}: FORCE
|
||||
ifdef UNIX_MK
|
||||
- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" FIPTOOL=${FIPTOOL} --no-print-directory -C ${FIPTOOLPATH}
|
||||
+ ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" FIPTOOL=${FIPTOOL} OPENSSL_DIR=${OPENSSL_DIR} --no-print-directory -C ${FIPTOOLPATH}
|
||||
else
|
||||
# Clear the MAKEFLAGS as we do not want
|
||||
# to pass the gnumake flags to nmake.
|
||||
diff --git a/tools/fiptool/Makefile b/tools/fiptool/Makefile
|
||||
index 11d2e7b0b..7c2a08379 100644
|
||||
--- a/tools/fiptool/Makefile
|
||||
+++ b/tools/fiptool/Makefile
|
||||
@@ -12,6 +12,8 @@ FIPTOOL ?= fiptool${BIN_EXT}
|
||||
PROJECT := $(notdir ${FIPTOOL})
|
||||
OBJECTS := fiptool.o tbbr_config.o
|
||||
V ?= 0
|
||||
+OPENSSL_DIR := /usr
|
||||
+
|
||||
|
||||
override CPPFLAGS += -D_GNU_SOURCE -D_XOPEN_SOURCE=700
|
||||
HOSTCCFLAGS := -Wall -Werror -pedantic -std=c99
|
||||
@@ -20,7 +22,7 @@ ifeq (${DEBUG},1)
|
||||
else
|
||||
HOSTCCFLAGS += -O2
|
||||
endif
|
||||
-LDLIBS := -lcrypto
|
||||
+LDLIBS := -L${OPENSSL_DIR}/lib -lcrypto
|
||||
|
||||
ifeq (${V},0)
|
||||
Q := @
|
||||
@@ -28,7 +30,7 @@ else
|
||||
Q :=
|
||||
endif
|
||||
|
||||
-INCLUDE_PATHS := -I../../include/tools_share
|
||||
+INCLUDE_PATHS := -I../../include/tools_share -I${OPENSSL_DIR}/include
|
||||
|
||||
HOSTCC ?= gcc
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
# Firmware Image Package (FIP)
|
||||
# It is a packaging format used by TF-A to package the
|
||||
# firmware images in a single binary.
|
||||
|
||||
DESCRIPTION = "fiptool - Trusted Firmware tool for packaging"
|
||||
LICENSE = "BSD-3-Clause"
|
||||
|
||||
SRC_URI = "git://git.trustedfirmware.org/TF-A/trusted-firmware-a.git;destsuffix=fiptool-${PV};protocol=https;"
|
||||
LIC_FILES_CHKSUM = "file://docs/license.rst;md5=189505435dbcdcc8caa63c46fe93fa89"
|
||||
|
||||
# Use fiptool from TF-A v2.3
|
||||
SRCREV = "ecd27ad85f1eba29f6bf92c39dc002c85b07dad5"
|
||||
|
||||
DEPENDS += "openssl-native"
|
||||
|
||||
inherit native
|
||||
|
||||
do_compile () {
|
||||
# These changes are needed to have the fiptool compiling and executing properly
|
||||
sed -i '/^LDLIBS/ s,$, \$\{BUILD_LDFLAGS},' ${S}/tools/fiptool/Makefile
|
||||
sed -i '/^INCLUDE_PATHS/ s,$, \$\{BUILD_CFLAGS},' ${S}/tools/fiptool/Makefile
|
||||
|
||||
oe_runmake fiptool
|
||||
}
|
||||
|
||||
do_install () {
|
||||
install -d ${D}${bindir}/
|
||||
install -m 0755 tools/fiptool/fiptool ${D}${bindir}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user