--- zzzz-none-000/linux-4.4.271/include/linux/qcom_scm.h 2021-06-03 06:22:09.000000000 +0000 +++ hawkeye-5590-750/linux-4.4.271/include/linux/qcom_scm.h 2023-04-19 10:22:30.000000000 +0000 @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2018, 2020 The Linux Foundation. All rights reserved. * Copyright (C) 2015 Linaro Ltd. * * This program is free software; you can redistribute it and/or modify @@ -13,21 +13,114 @@ #ifndef __QCOM_SCM_H #define __QCOM_SCM_H +#include +#include + +#define QCOM_KERNEL_AUTH_CMD 0x15 +#define QCOM_SCM_PAS_AUTH_DEBUG_RESET_CMD 0x14 + +struct qcom_scm_tcsr_req { + u32 mask; + u32 status; + u16 tcsr_reg; + u16 set; +}; + +struct log_read { + uint32_t log_buf; + uint32_t buf_size; +}; + +#define TZ_SVC_CRYPTO 10 +#define TZ_SYSCALL_CREATE_CMD_ID(s, f) \ + ((uint32_t)(((s & 0x3ff) << 10) | (f & 0x3ff))) + +struct scm_cmd_buf_t { + uint32_t req_addr; + uint32_t req_size; + uint32_t resp_addr; + uint32_t resp_size; +}; + +extern int qcom_scm_aes(struct scm_cmd_buf_t *scm_cmd_buf, + size_t buf_size, u32 cmd_id); + +extern int qcom_scm_tls_hardening(struct scm_cmd_buf_t *scm_cmd_buf, + size_t buf_size, u32 cmd_id); + +extern int qcom_qfprom_write_version(void *wrip, int size); +int qcom_qfprom_read_version(uint32_t sw_type, uint32_t value, + uint32_t qfprom_ret_ptr); +extern int qcom_qfprom_show_authenticate(void); +extern int qcom_sec_upgrade_auth(unsigned int scm_cmd_id, unsigned int sw_type, + unsigned int img_size, + unsigned int load_addr); +extern bool qcom_scm_sec_auth_available(unsigned int); extern int qcom_scm_set_cold_boot_addr(void *entry, const cpumask_t *cpus); extern int qcom_scm_set_warm_boot_addr(void *entry, const cpumask_t *cpus); -#define QCOM_SCM_HDCP_MAX_REQ_CNT 5 +#define SCM_GSBI_ADM_MUX_SEL_CMD 0x5 +extern int qcom_scm_tcsr(u32 svc_id, u32 cmd_id, + struct qcom_scm_tcsr_req *tcsr_cmd); -struct qcom_scm_hdcp_req { - u32 addr; - u32 val; -}; +#define QCOM_SCM_HDCP_MAX_REQ_CNT 5 extern bool qcom_scm_is_available(void); extern bool qcom_scm_hdcp_available(void); -extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, - u32 *resp); +extern bool qcom_scm_pdseg_memcpy_v2_available(void); + +extern bool qcom_scm_pas_supported(u32 peripheral); +extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, + size_t size); +extern int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, + phys_addr_t size); +extern int qcom_scm_pas_auth_and_reset(u32 peripheral, u32 debug, u32 cmd); +extern int qcom_scm_pas_shutdown(u32 peripheral); +extern int qcom_scm_set_resettype(u32 reset_type); +extern int qcom_scm_get_smmustate(void); + +#define SCM_SVC_UTIL 0x3 +#define SCM_CMD_SET_REGSAVE 0x2 + +extern int qcom_scm_regsave(u32 svc_id, u32 cmd_id, void *, + unsigned int size); + +#define SCM_SVC_EXTWDT 0x5 +#define SCM_CMD_EXTWDT 0x2 +extern int qcom_scm_extwdt(u32 svc_id, u32 cmd_id, unsigned int regaddr, + unsigned int val); + +#define TZ_INFO_GET_DIAG_ID 0x2 +#define SCM_SVC_INFO 0x6 +#define HVC_INFO_GET_DIAG_ID 0x7 +#define QCOM_SCM_SVC_SMMUSTATE_CMD 0x19 + +extern int qcom_scm_tz_log(u32 svc_id, u32 cmd_id, void *ker_buf, u32 buf_len); +extern int qcom_scm_hvc_log(u32 svc_id, u32 cmd_id, void *ker_buf, + u32 buf_len); +#define QTI_TZ_LOG_ENCR_ALLOWED_ID \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_QSEE_OS, TZ_SVC_APP_MGR, 0x0B) +#define QTI_TZ_REQ_ENCR_LOG_BUFFER_ID \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_QSEE_OS, TZ_SVC_APP_MGR, 0x0C) +#define QTI_TZ_DIAG_LOG_ENCR_ID 0x0 +#define QTI_TZ_QSEE_LOG_ENCR_ID 0x1 +#define TZ_LOG_NO_UPDATE -6 + +extern int qti_scm_is_log_encrypt_supported(void); +extern int qti_scm_tz_log_is_encrypted(void); +extern int qti_scm_tz_log_encrypted(void *ker_buf, u32 buf_len, u32 log_id); +extern int parse_encrypted_log( char *ker_buf, uint32_t buf_len, + char *copy_buf, uint32_t log_id); +extern int print_text(char *intro_message, unsigned char *text_addr, + unsigned int size, char *buf, uint32_t buf_len); + + +extern int qcom_scm_pshold(void); + +extern int qcom_config_sec_ice(void *buf, int size); +extern int qcom_set_qcekey_sec(void *buf, int size); +extern int qce_sec_release_xpu_prot(void); #define QCOM_SCM_CPU_PWR_DOWN_L2_ON 0x0 #define QCOM_SCM_CPU_PWR_DOWN_L2_OFF 0x1 @@ -37,5 +130,244 @@ #define QCOM_SCM_VERSION(major, minor) (((major) << 16) | ((minor) & 0xFF)) extern u32 qcom_scm_get_version(void); +extern bool is_scm_armv8(void); + +extern s32 qcom_scm_pinmux_read(u32 arg1); +extern s32 qcom_scm_pinmux_write(u32 arg1, u32 arg2); +extern s32 qcom_scm_usb_mode_write(u32 arg1, u32 arg2); + +extern int qcom_scm_cache_dump(u32 cpu); +extern int qcom_scm_get_cache_dump_size(u32 cmd_id, void *cmd_buf, u32 size); +extern int qcom_scm_send_cache_dump_addr(u32 cmd_id, void *cmd_buf, u32 size); +extern int qcom_scm_tzsched(const void *req, size_t req_size, + void *resp, size_t resp_size); + + +#ifdef CONFIG_AVM_FASTIRQ +#define SCM_SVC_AVM 0xA0 +#define SCM_SVC_AVM_WDT_CFG 0xA +#define SCM_SVC_AVM_WDT_PET 0x9 +#define SCM_SVC_AVM_TZ_LOG_LAST 0xC + +int qcom_scm_avm_wdt_config(u32 enable, u32 bark_ms, u32 bite_ms); +int qcom_scm_avm_wdt_pet(void); +int qcom_scm_avm_tz_log_last(u32 svc_id, u32 cmd_id, void *ker_buf, u32 buf_len); +#endif /* CONFIG_AVM_FASTIRQ */ + +#define TZ_OWNER_QSEE_OS 50 +#define TZ_OWNER_TZ_APPS 48 +#define TZ_SVC_APP_MGR 1 /* Application management */ +#define TZ_SVC_APP_ID_PLACEHOLDER 0 /* SVC bits will contain App ID */ + +#define TZ_ARMv8_CMD_REMOVE_XPU 0x09 +#define TZ_ARMv8_CMD_NOTIFY_REGION_ID 0x05 +#define TZ_ARMv8_CMD_REGISTER_LOG_BUF 0x06 +#define TZ_ARMv8_CMD_LOAD_LIB 0x07 +#define TZ_ARMv8_CMD_UNLOAD_LIB 0x08 +#define TZ_ARMv8_CMD_LOAD_APP_ID 0x01 +#define TZ_ARMv8_CMD_SEND_DATA_ID 0x01 +#define TZ_ARMv8_CMD_UNLOAD_APP_ID 0x02 + +#define MAX_APP_NAME_SIZE 32 + +#define TZ_SYSCALL_CREATE_SMC_ID(o, s, f) \ + ((uint32_t)((((o & 0x3f) << 24) | (s & 0xff) << 8) | (f & 0xff))) + +#define TZ_BLOW_FUSE_SECDAT 0x20 +#define FUSEPROV_SUCCESS 0x0 +#define FUSEPROV_INVALID_HASH 0x09 +#define FUSEPROV_SECDAT_LOCK_BLOWN 0xB + +enum qseecom_qceos_cmd_id { + QSEOS_APP_START_COMMAND = 0x01, + QSEOS_APP_SHUTDOWN_COMMAND, + QSEOS_APP_LOOKUP_COMMAND, + QSEOS_REGISTER_LISTENER, + QSEOS_DEREGISTER_LISTENER, + QSEOS_CLIENT_SEND_DATA_COMMAND, + QSEOS_LISTENER_DATA_RSP_COMMAND, + QSEOS_LOAD_EXTERNAL_ELF_COMMAND, + QSEOS_UNLOAD_EXTERNAL_ELF_COMMAND, + QSEOS_CMD_MAX = 0xEFFFFFFF, + QSEE_LOAD_SERV_IMAGE_COMMAND = 0xB, + QSEE_UNLOAD_SERV_IMAGE_COMMAND = 12, + QSEE_APP_NOTIFY_COMMAND = 13, + QSEE_REGISTER_LOG_BUF_COMMAND = 14 +}; + +__packed struct qseecom_load_lib_ireq { + uint32_t qsee_cmd_id; + uint32_t mdt_len; /* Length of the mdt file */ + uint32_t img_len; /* Length of .bxx and .mdt files */ + phys_addr_t phy_addr; /* phy addr of the start of image */ +}; + +__packed struct qseecom_load_app_ireq { + struct qseecom_load_lib_ireq load_ireq; + char app_name[MAX_APP_NAME_SIZE]; /* application name*/ +}; + +union qseecom_load_ireq { + struct qseecom_load_lib_ireq load_lib_req; + struct qseecom_load_app_ireq load_app_req; +}; + +struct qsee_notify_app { + uint32_t cmd_id; + phys_addr_t applications_region_addr; + size_t applications_region_size; +}; + +__packed struct qseecom_client_send_data_v1_ireq { + uint32_t qsee_cmd_id; + uint32_t app_id; + dma_addr_t req_ptr; + uint32_t req_len; + /** First 4 bytes should always be the return status */ + dma_addr_t rsp_ptr; + uint32_t rsp_len; +}; + +__packed struct qseecom_client_send_data_v2_ireq { + struct qseecom_client_send_data_v1_ireq send_data_ireq; + uint64_t sglistinfo_ptr; + uint32_t sglistinfo_len; +}; + +union qseecom_client_send_data_ireq { + struct qseecom_client_send_data_v1_ireq v1; + struct qseecom_client_send_data_v2_ireq v2; +}; + +__packed struct qseecom_unload_ireq { + uint32_t qsee_cmd_id; + uint32_t app_id; +}; + +enum qseecom_command_scm_resp_type { + QSEOS_APP_ID = 0xEE01, + QSEOS_LISTENER_ID +}; + +__packed struct qseecom_command_scm_resp { + unsigned long result; + enum qseecom_command_scm_resp_type resp_type; + unsigned long data; +}; + +struct tzdbg_log_pos_t { + uint16_t wrap; + uint16_t offset; +}; + +struct tzdbg_log_t { + struct tzdbg_log_pos_t log_pos; + uint8_t log_buf[]; +}; + +struct qsee_reg_log_buf_req { + uint32_t qsee_cmd_id; + phys_addr_t phy_addr; + uint64_t len; +}; + +struct cp2_mem_chunks { + u32 chunk_list; + u32 chunk_list_size; + u32 chunk_size; +} __attribute__ ((__packed__)); + +struct cp2_lock_req { + struct cp2_mem_chunks chunks; + u32 mem_usage; + u32 lock; +} __attribute__ ((__packed__)); + + +struct mem_prot_info { + phys_addr_t addr; + u64 size; +}; + +#define MEM_PROT_ASSIGN_ID 0x16 +#define MEM_PROTECT_LOCK_ID2 0x0A +#define MEM_PROTECT_LOCK_ID2_FLAT 0x11 +#define V2_CHUNK_SIZE SZ_1M +#define FEATURE_ID_CP 12 +#define SCM_SVC_MP 0xC +#define BATCH_MAX_SIZE SZ_2M +#define BATCH_MAX_SECTIONS 32 +#define GET_FEAT_VERSION_CMD 3 + +struct dest_vm_and_perm_info { + u32 vm; + u32 perm; + u64 ctx; + u32 ctx_size; +}; + +extern int qcom_scm_get_feat_version(u32 feat, u64 *version); + +extern int qcom_scm_mem_prot_assign(struct sg_table *table, + u32 *source_vm_copy, + size_t source_vm_copy_size, + struct dest_vm_and_perm_info *dest_vm_copy, + size_t dest_vm_copy_size, + struct mem_prot_info *sg_table_copy, + u32 *resp, size_t resp_size); + +extern int qcom_scm_mem_protect_lock(struct cp2_lock_req *req, size_t req_size, + u32 *resp, size_t resp_size); + +extern int qcom_scm_qseecom_remove_xpu(void); +extern int qcom_scm_qseecom_notify(struct qsee_notify_app *req, + size_t req_size, + struct qseecom_command_scm_resp *resp, + size_t resp_size); + +extern int qcom_scm_qseecom_load(uint32_t smc_id, uint32_t cmd_id, + union qseecom_load_ireq *req, size_t req_size, + struct qseecom_command_scm_resp *resp, + size_t resp_size); + +extern int qcom_scm_qseecom_send_data(union qseecom_client_send_data_ireq *req, + size_t req_size, + struct qseecom_command_scm_resp *resp, + size_t resp_size); + +extern int qcom_scm_qseecom_unload(uint32_t smc_id, uint32_t cmd_id, + struct qseecom_unload_ireq *req, + size_t req_size, + struct qseecom_command_scm_resp *resp, + size_t resp_size); + +extern int qcom_scm_tz_register_log_buf(struct device *dev, + struct qsee_reg_log_buf_req *request, + size_t req_size, + struct qseecom_command_scm_resp + *response, size_t resp_size); + +#define QCOM_SCM_SVC_FUSE 0x8 + +extern int qcom_los_scm_call(struct device *, u32 svc_id, u32 cmd_id, + void *cmd_buf, size_t size); + +extern int qcom_fuseipq_scm_call(struct device *, u32 svc_id, u32 cmd_id, + void *cmd_buf, size_t size); + +extern int qcom_scm_lock_subsys_mem(u32 subsys_id, void *paddr, size_t size); +extern int qcom_scm_unlock_subsys_mem(u32 subsys_id, void *paddr, size_t size, + uint8_t key); +extern int qcom_scm_load_otp(u32 peripheral); +extern bool qcom_scm_pil_cfg_available(void); +extern int qcom_scm_pil_cfg(u32 peripheral, u32 args); #endif +extern int qcom_scm_wcss_boot(u32 svc_id, u32 cmd_id, void *cmd_buf); +extern int qcom_scm_tcsr_reg_write(u32 arg1, u32 arg2); +extern int qcom_scm_pdseg_memcpy_v2(u32 peripheral, int phno, dma_addr_t dma, + int seg_cnt); +extern int qcom_scm_pdseg_memcpy(u32 peripheral, int phno, dma_addr_t dma, + size_t size); +extern int qcom_scm_int_radio_powerup(u32 peripheral); +extern int qcom_scm_int_radio_powerdown(u32 peripheral);