blob: 18f8d782064b049e695de17ce5d74be534d5a0be [file] [log] [blame]
Abhimanyu Kapurb3207fb2014-01-27 21:33:23 -08001/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
Shashank Mittal162244e2011-08-08 19:01:25 -07002
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
Siddhartha Agrawaleb094c52013-01-28 12:11:43 -080012 * * Neither the name of The Linux Foundation nor the names of its
Shashank Mittal162244e2011-08-08 19:01:25 -070013 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef __SCM_H__
30#define __SCM_H__
31
32/* 8 Byte SSD magic number (LE) */
Neeti Desai127b9e02012-03-20 16:11:23 -070033#define DECRYPT_MAGIC_0 0x73737A74
34#define DECRYPT_MAGIC_1 0x676D6964
35#define ENCRYPT_MAGIC_0 0x6B647373
36#define ENCRYPT_MAGIC_1 0x676D6973
Shashank Mittal162244e2011-08-08 19:01:25 -070037#define SSD_HEADER_MAGIC_SIZE 8
38#define SSD_HEADER_XML_SIZE 2048
sundarajan srinivasan6173b872013-03-13 17:36:48 -070039#define SSD_HEADER_MIN_SIZE 128
40#define MULTIPLICATION_FACTOR 2
Shashank Mittal162244e2011-08-08 19:01:25 -070041
42typedef unsigned int uint32;
43
Ajay Dudanib01e5062011-12-03 23:23:42 -080044typedef struct {
45 uint32 len;
46 uint32 buf_offset;
47 uint32 resp_hdr_offset;
48 uint32 id;
Shashank Mittal162244e2011-08-08 19:01:25 -070049} scm_command;
50
Ajay Dudanib01e5062011-12-03 23:23:42 -080051typedef struct {
52 uint32 len;
53 uint32 buf_offset;
54 uint32 is_complete;
Shashank Mittal162244e2011-08-08 19:01:25 -070055} scm_response;
56
Ajay Dudanib01e5062011-12-03 23:23:42 -080057typedef struct {
Ajay Dudanib01e5062011-12-03 23:23:42 -080058 uint32 *img_ptr;
59 uint32 *img_len_ptr;
Neeti Desai127b9e02012-03-20 16:11:23 -070060} img_req;
Shashank Mittal162244e2011-08-08 19:01:25 -070061
Siddhartha Agrawaleb094c52013-01-28 12:11:43 -080062typedef struct {
63 uint32 id;
64 uint32 spare;
65} tz_secure_cfg;
66
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -080067typedef struct {
68 uint32 md_len;
69 uint32* md;
70} ssd_parse_md_req;
71
72typedef struct {
73 uint32 status;
74 uint32 md_ctx_id;
75 uint32* md_end_ptr;
76} ssd_parse_md_rsp;
77
78typedef struct {
79 uint32 md_ctx_id;
80 uint32 last_frag;
81 uint32 frag_len;
82 uint32 *frag;
83} ssd_decrypt_img_frag_req;
84
85typedef struct {
86 uint32 status;
87} ssd_decrypt_img_frag_rsp;
88
89typedef struct{
90 uint32 feature_id;
91} feature_version_req;
92
93typedef struct{
94 uint32 version;
95} feature_version_rsp;
96
97typedef struct{
98 uint32 *keystore_ptr;
99 uint32 keystore_len;
100} ssd_protect_keystore_req;
101
102typedef struct{
103 uint32 status;
104} ssd_protect_keystore_rsp;
105
Abhimanyu Kapurb3207fb2014-01-27 21:33:23 -0800106typedef struct {
107 uint64_t el1_x0;
108 uint64_t el1_x1;
109 uint64_t el1_x2;
110 uint64_t el1_x3;
111 uint64_t el1_x4;
112 uint64_t el1_x5;
113 uint64_t el1_x6;
114 uint64_t el1_x7;
115 uint64_t el1_x8;
116 uint64_t el1_elr;
117} el1_system_param;
118
Maria Yubeeeeaf2014-06-30 13:05:43 +0800119struct tz_prng_data {
120 uint8_t *out_buf;
121 uint32_t out_buf_size;
122}__packed;
123
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800124/* Service IDs */
Aparna Mallavarapu68e233f2014-03-21 19:18:34 +0530125#define SCM_SVC_BOOT 0x01
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800126#define TZBSP_SVC_INFO 0x06
127#define SCM_SVC_SSD 0x07
128#define SVC_MEMORY_PROTECTION 0x0C
Maria Yubeeeeaf2014-06-30 13:05:43 +0800129#define TZ_SVC_CRYPTO 0x0A
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800130
131/*Service specific command IDs */
Neeti Desai127b9e02012-03-20 16:11:23 -0700132#define SSD_DECRYPT_ID 0x01
133#define SSD_ENCRYPT_ID 0x02
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800134#define SSD_PROTECT_KEYSTORE_ID 0x05
135#define SSD_PARSE_MD_ID 0x06
136#define SSD_DECRYPT_IMG_FRAG_ID 0x07
Aparna Mallavarapu68e233f2014-03-21 19:18:34 +0530137#define WDOG_DEBUG_DISABLE 0x09
138#define SCM_DLOAD_CMD 0x10
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800139
140#define SECURE_DEVICE_MDSS 0x01
141
Siddhartha Agrawaleb094c52013-01-28 12:11:43 -0800142#define IOMMU_SECURE_CFG 0x02
143
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800144#define TZ_INFO_GET_FEATURE_ID 0x03
145
Maria Yubeeeeaf2014-06-30 13:05:43 +0800146#define PRNG_CMD_ID 0x01
147
Aparna Mallavarapu68e233f2014-03-21 19:18:34 +0530148/* Download Mode specific arguments to be passed to TZ */
149#define SCM_EDLOAD_MODE 0x02
150#define SCM_DLOAD_MODE 0x10
151
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800152/* SSD parsing status messages from TZ */
153#define SSD_PMD_ENCRYPTED 0
154#define SSD_PMD_NOT_ENCRYPTED 1
155#define SSD_PMD_NO_MD_FOUND 3
156#define SSD_PMD_BUSY 4
157#define SSD_PMD_BAD_MD_PTR_OR_LEN 5
158#define SSD_PMD_PARSING_INCOMPLETE 6
159#define SSD_PMD_PARSING_FAILED 7
160#define SSD_PMD_SETUP_CIPHER_FAILED 8
161
162/* Keystore status messages */
163#define TZBSP_SSD_PKS_SUCCESS 0 /**< Successful return. */
164#define TZBSP_SSD_PKS_INVALID_PTR 1 /**< Keystore pointer invalid. */
165#define TZBSP_SSD_PKS_INVALID_LEN 2 /**< Keystore length incorrect. */
166#define TZBSP_SSD_PKS_UNALIGNED_PTR 3 /**< Keystore pointer not word
167 aligned. */
168#define TZBSP_SSD_PKS_PROTECT_MEM_FAILED 4 /**< Failure when protecting
169 the keystore memory.*/
170#define TZBSP_SSD_PKS_INVALID_NUM_KEYS 5 /**< Unsupported number of
171 keys passed. If a valid
172 pointer to non-secure
173 memory is passed that
174 isn't a keystore, this is
175 a likely return code. */
176#define TZBSP_SSD_PKS_DECRYPT_FAILED 6 /**< The keystore could not be
177 decrypted. */
178
179/* Features in TZ */
180#define TZBSP_FVER_SSD 5
181
182#define TZBSP_GET_FEATURE_VERSION(major) ((major >> 22)& 0x3FF)
Siddhartha Agrawaleb094c52013-01-28 12:11:43 -0800183
Shashank Mittal162244e2011-08-08 19:01:25 -0700184static uint32 smc(uint32 cmd_addr);
Neeti Desai127b9e02012-03-20 16:11:23 -0700185int decrypt_scm(uint32_t ** img_ptr, uint32_t * img_len_ptr);
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800186int decrypt_scm_v2(uint32_t ** img_ptr, uint32_t * img_len_ptr);
Neeti Desai127b9e02012-03-20 16:11:23 -0700187int encrypt_scm(uint32_t ** img_ptr, uint32_t * img_len_ptr);
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800188int scm_svc_version(uint32 * major, uint32 * minor);
189int scm_protect_keystore(uint32_t * img_ptr, uint32_t img_len);
Shashank Mittal162244e2011-08-08 19:01:25 -0700190
Deepa Dinamani193874e2012-02-07 14:00:04 -0800191#define SCM_SVC_FUSE 0x08
192#define SCM_BLOW_SW_FUSE_ID 0x01
193#define SCM_IS_SW_FUSE_BLOWN_ID 0x02
Shashank Mittal162244e2011-08-08 19:01:25 -0700194
Deepa Dinamani193874e2012-02-07 14:00:04 -0800195#define HLOS_IMG_TAMPER_FUSE 0
196
197
198#define SCM_SVC_CE_CHN_SWITCH_ID 0x04
199#define SCM_CE_CHN_SWITCH_ID 0x02
200
Amir Samuelov4620ad22013-03-13 11:30:05 +0200201#define SCM_SVC_ES 0x10
202#define SCM_SAVE_PARTITION_HASH_ID 0x01
203
Channagoud Kadabi179df0b2013-12-12 14:53:31 -0800204#define SCM_SVC_PWR 0x9
205#define SCM_IO_DISABLE_PMIC_ARBITER 0x1
206
Abhimanyu Kapurb3207fb2014-01-27 21:33:23 -0800207#define SCM_SVC_MILESTONE_32_64_ID 0x1
208#define SCM_SVC_MILESTONE_CMD_ID 0xf
209
Deepa Dinamani193874e2012-02-07 14:00:04 -0800210enum ap_ce_channel_type {
211AP_CE_REGISTER_USE = 0,
212AP_CE_ADM_USE = 1
213};
214
215/* Apps CE resource. */
216#define TZ_RESOURCE_CE_AP 2
217
218uint8_t switch_ce_chn_cmd(enum ap_ce_channel_type channel);
219
220
Shashank Mittal162244e2011-08-08 19:01:25 -0700221void set_tamper_fuse_cmd();
222
Channagoud Kadabi179df0b2013-12-12 14:53:31 -0800223int scm_halt_pmic_arbiter();
Aparna Mallavarapu68e233f2014-03-21 19:18:34 +0530224int scm_call_atomic2(uint32_t svc, uint32_t cmd, uint32_t arg1, uint32_t arg2);
Channagoud Kadabi179df0b2013-12-12 14:53:31 -0800225
Abhimanyu Kapurb3207fb2014-01-27 21:33:23 -0800226void scm_elexec_call(paddr_t kernel_entry, paddr_t dtb_offset);
Maria Yubeeeeaf2014-06-30 13:05:43 +0800227void *get_canary();
Abhimanyu Kapurb3207fb2014-01-27 21:33:23 -0800228
Shashank Mittal162244e2011-08-08 19:01:25 -0700229/**
230 * struct scm_command - one SCM command buffer
231 * @len: total available memory for command and response
232 * @buf_offset: start of command buffer
233 * @resp_hdr_offset: start of response buffer
234 * @id: command to be executed
235 * @buf: buffer returned from scm_get_command_buffer()
236 *
237 * An SCM command is layed out in memory as follows:
238 *
239 * ------------------- <--- struct scm_command
240 * | command header |
241 * ------------------- <--- scm_get_command_buffer()
242 * | command buffer |
243 * ------------------- <--- struct scm_response and
244 * | response header | scm_command_to_response()
245 * ------------------- <--- scm_get_response_buffer()
246 * | response buffer |
247 * -------------------
248 *
249 * There can be arbitrary padding between the headers and buffers so
250 * you should always use the appropriate scm_get_*_buffer() routines
251 * to access the buffers in a safe manner.
252 */
253struct scm_command {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800254 uint32_t len;
255 uint32_t buf_offset;
256 uint32_t resp_hdr_offset;
257 uint32_t id;
258 uint32_t buf[0];
Shashank Mittal162244e2011-08-08 19:01:25 -0700259};
260
261/**
262 * struct scm_response - one SCM response buffer
263 * @len: total available memory for response
264 * @buf_offset: start of response data relative to start of scm_response
265 * @is_complete: indicates if the command has finished processing
266 */
267struct scm_response {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800268 uint32_t len;
269 uint32_t buf_offset;
270 uint32_t is_complete;
Shashank Mittal162244e2011-08-08 19:01:25 -0700271};
Shashank Mittal162244e2011-08-08 19:01:25 -0700272#endif