From 3e78c51775a2ec96a9013db377fc363bb98fcb54 Mon Sep 17 00:00:00 2001 From: Chao Liu Date: Tue, 18 Dec 2018 17:12:59 +0800 Subject: linuxdriver: merge code from branch p-amlogic-mainline [2/2] PD#OTT-924 Problem: the code of the branch p-tv-atom is too old Solution: update code to newest Verify: verified on txlx p-amlogic-mainline commit: 8d691592e0caf3188fb005bff81a3d69f59b3307 Change-Id: I7d5abb9322e731bbbcfffa47212d03ef35ed50ea Signed-off-by: Chao Liu --- Android.mk | 31 ++++++++++++------------ optee/Makefile | 4 ++++ optee/core.c | 7 +++++- optee/smccc-call-a32.S | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 16 deletions(-) create mode 100644 optee/smccc-call-a32.S diff --git a/Android.mk b/Android.mk index 576419f..de85d75 100755 --- a/Android.mk +++ b/Android.mk @@ -6,33 +6,34 @@ KERNEL_DIR := kernel/common_3.14 else KERNEL_DIR := common endif -KERNEL_OUT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/obj/KERNEL_OBJ +KERNEL_OUT_DIR := $(PRODUCT_OUT)/obj/KERNEL_OBJ +ifeq ($(KERNEL_A32_SUPPORT), true) +KERNEL_ARCH := arm +KERNEL_DRIVER_CROSS_COMPILE := /opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- +KERNEL_CONFIG=meson64_a32_defconfig +else KERNEL_ARCH := arm64 -PREFIX_CROSS_COMPILE := aarch64-linux-gnu- +KERNEL_DRIVER_CROSS_COMPILE := aarch64-linux-gnu- KERNEL_CONFIG=meson64_defconfig +endif +OPTEE_MODULES := $(shell pwd)/$(PRODUCT_OUT)/obj/optee_modules include $(CLEAR_VARS) $(info $(shell if [ ! -d $(KERNEL_OUT_DIR) ]; then mkdir -p $(KERNEL_OUT_DIR); fi)) -$(info $(shell if [ ! -e $(KERNEL_OUT_DIR)/include/generated/autoconf.h ]; then $(MAKE) -C $(KERNEL_DIR) O=../$(KERNEL_OUT_DIR) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(PREFIX_CROSS_COMPILE) $(KERNEL_CONFIG); fi)) - -$(info $(shell if [ ! -e $(KERNEL_OUT_DIR)/include/generated/autoconf.h ]; then $(MAKE) -C $(KERNEL_DIR) O=../$(KERNEL_OUT_DIR) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(PREFIX_CROSS_COMPILE) modules_prepare; fi)) +$(info $(shell if [ ! -e $(KERNEL_OUT_DIR)/include/generated/autoconf.h ]; then $(MAKE) -C $(KERNEL_DIR) O=../$(KERNEL_OUT_DIR) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_DRIVER_CROSS_COMPILE) $(KERNEL_CONFIG); fi)) -$(info $(shell $(MAKE) -C $(shell pwd)/$(KERNEL_OUT_DIR) M=$(shell pwd)/$(BOARD_AML_VENDOR_PATH)/tdk/linuxdriver/ ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(PREFIX_CROSS_COMPILE) modules)) -$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib)) -$(info $(shell cp -vf $(LOCAL_PATH)/optee/optee_armtz.ko $(PRODUCT_OUT)/obj/lib)) -$(info $(shell cp -vf $(LOCAL_PATH)/optee.ko $(PRODUCT_OUT)/obj/lib)) +$(info $(shell if [ ! -e $(KERNEL_OUT_DIR)/include/generated/autoconf.h ]; then $(MAKE) -C $(KERNEL_DIR) O=../$(KERNEL_OUT_DIR) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_DRIVER_CROSS_COMPILE) modules_prepare; fi)) -armtz_ko_file := $(wildcard $(LOCAL_PATH)/optee/*.ko) -armtz_ko_file := $(patsubst $(LOCAL_PATH)/optee/%,%,$(armtz_ko_file)) +$(info $(shell if [ ! -d $(OPTEE_MODULES) ]; then mkdir -p $(OPTEE_MODULES); fi)) +$(info $(shell cp $(LOCAL_PATH)/* $(OPTEE_MODULES) -rfa)) +$(info $(shell $(MAKE) -C $(shell pwd)/$(KERNEL_OUT_DIR) M=$(OPTEE_MODULES) KERNEL_A32_SUPPORT=$(KERNEL_A32_SUPPORT) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_DRIVER_CROSS_COMPILE) modules)) -core_ko_file := $(wildcard $(LOCAL_PATH)/*.ko) -core_ko_file := $(patsubst $(LOCAL_PATH)/%,%,$(core_ko_file)) include $(CLEAR_VARS) LOCAL_MODULE := optee_armtz -LOCAL_SRC_FILES := optee/$(armtz_ko_file) +LOCAL_PREBUILT_MODULE_FILE := $(OPTEE_MODULES)/optee/optee_armtz.ko LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_MODULE_SUFFIX := .ko @@ -42,7 +43,7 @@ include $(BUILD_PREBUILT) include $(CLEAR_VARS) LOCAL_MODULE := optee -LOCAL_SRC_FILES := $(core_ko_file) +LOCAL_PREBUILT_MODULE_FILE := $(OPTEE_MODULES)/optee.ko LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_MODULE_SUFFIX := .ko diff --git a/optee/Makefile b/optee/Makefile index 85d2fc9..b104819 100755 --- a/optee/Makefile +++ b/optee/Makefile @@ -8,4 +8,8 @@ optee_armtz-objs += core.o optee_armtz-objs += call.o optee_armtz-objs += rpc.o optee_armtz-objs += supp.o +ifeq ($(KERNEL_A32_SUPPORT), true) +optee_armtz-objs += smccc-call-a32.o +else optee_armtz-objs += smccc-call.o +endif diff --git a/optee/core.c b/optee/core.c index efffb3d..efacf4f 100644 --- a/optee/core.c +++ b/optee/core.c @@ -379,7 +379,12 @@ optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm) return ERR_PTR(-EINVAL); } - va = ioremap_cache(paddr, size); + /* For normal memory we already have a cacheable mapping. */ + if (pfn_valid(__phys_to_pfn(paddr))) + va = (void __iomem *)__phys_to_virt(paddr); + else + va = ioremap_cache(paddr, size); + if (!va) { pr_err("shared memory ioremap failed\n"); return ERR_PTR(-EINVAL); diff --git a/optee/smccc-call-a32.S b/optee/smccc-call-a32.S new file mode 100644 index 0000000..e5d4306 --- /dev/null +++ b/optee/smccc-call-a32.S @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2015, Linaro Limited + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#include + +#include +#include +#include + + /* + * Wrap c macros in asm macros to delay expansion until after the + * SMCCC asm macro is expanded. + */ + .macro SMCCC_SMC + __SMC(0) + .endm + + .macro SMCCC_HVC + __HVC(0) + .endm + + .macro SMCCC instr +UNWIND( .fnstart) + mov r12, sp + push {r4-r7} +UNWIND( .save {r4-r7}) + ldm r12, {r4-r7} + \instr + pop {r4-r7} + ldr r12, [sp, #(4 * 4)] + stm r12, {r0-r3} + bx lr +UNWIND( .fnend) + .endm + +/* + * void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2, + * unsigned long a3, unsigned long a4, unsigned long a5, + * unsigned long a6, unsigned long a7, struct arm_smccc_res *res, + * struct arm_smccc_quirk *quirk) + */ +ENTRY(__arm_smccc_smc) + SMCCC SMCCC_SMC +ENDPROC(__arm_smccc_smc) + +/* + * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2, + * unsigned long a3, unsigned long a4, unsigned long a5, + * unsigned long a6, unsigned long a7, struct arm_smccc_res *res, + * struct arm_smccc_quirk *quirk) + */ +ENTRY(__arm_smccc_hvc) + SMCCC SMCCC_HVC +ENDPROC(__arm_smccc_hvc) -- cgit v1.2.3