blob: 6c8f7efffc711f063cbfc51726ec8bef4a6a0e6d [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
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800119/* Service IDs */
Aparna Mallavarapu68e233f2014-03-21 19:18:34 +0530120#define SCM_SVC_BOOT 0x01
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800121#define TZBSP_SVC_INFO 0x06
122#define SCM_SVC_SSD 0x07
123#define SVC_MEMORY_PROTECTION 0x0C
124
125/*Service specific command IDs */
Neeti Desai127b9e02012-03-20 16:11:23 -0700126#define SSD_DECRYPT_ID 0x01
127#define SSD_ENCRYPT_ID 0x02
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800128#define SSD_PROTECT_KEYSTORE_ID 0x05
129#define SSD_PARSE_MD_ID 0x06
130#define SSD_DECRYPT_IMG_FRAG_ID 0x07
Aparna Mallavarapu68e233f2014-03-21 19:18:34 +0530131#define WDOG_DEBUG_DISABLE 0x09
132#define SCM_DLOAD_CMD 0x10
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800133
134#define SECURE_DEVICE_MDSS 0x01
135
Siddhartha Agrawaleb094c52013-01-28 12:11:43 -0800136#define IOMMU_SECURE_CFG 0x02
137
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800138#define TZ_INFO_GET_FEATURE_ID 0x03
139
Aparna Mallavarapu68e233f2014-03-21 19:18:34 +0530140/* Download Mode specific arguments to be passed to TZ */
141#define SCM_EDLOAD_MODE 0x02
142#define SCM_DLOAD_MODE 0x10
143
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800144/* SSD parsing status messages from TZ */
145#define SSD_PMD_ENCRYPTED 0
146#define SSD_PMD_NOT_ENCRYPTED 1
147#define SSD_PMD_NO_MD_FOUND 3
148#define SSD_PMD_BUSY 4
149#define SSD_PMD_BAD_MD_PTR_OR_LEN 5
150#define SSD_PMD_PARSING_INCOMPLETE 6
151#define SSD_PMD_PARSING_FAILED 7
152#define SSD_PMD_SETUP_CIPHER_FAILED 8
153
154/* Keystore status messages */
155#define TZBSP_SSD_PKS_SUCCESS 0 /**< Successful return. */
156#define TZBSP_SSD_PKS_INVALID_PTR 1 /**< Keystore pointer invalid. */
157#define TZBSP_SSD_PKS_INVALID_LEN 2 /**< Keystore length incorrect. */
158#define TZBSP_SSD_PKS_UNALIGNED_PTR 3 /**< Keystore pointer not word
159 aligned. */
160#define TZBSP_SSD_PKS_PROTECT_MEM_FAILED 4 /**< Failure when protecting
161 the keystore memory.*/
162#define TZBSP_SSD_PKS_INVALID_NUM_KEYS 5 /**< Unsupported number of
163 keys passed. If a valid
164 pointer to non-secure
165 memory is passed that
166 isn't a keystore, this is
167 a likely return code. */
168#define TZBSP_SSD_PKS_DECRYPT_FAILED 6 /**< The keystore could not be
169 decrypted. */
170
171/* Features in TZ */
172#define TZBSP_FVER_SSD 5
173
174#define TZBSP_GET_FEATURE_VERSION(major) ((major >> 22)& 0x3FF)
Siddhartha Agrawaleb094c52013-01-28 12:11:43 -0800175
Shashank Mittal162244e2011-08-08 19:01:25 -0700176static uint32 smc(uint32 cmd_addr);
Neeti Desai127b9e02012-03-20 16:11:23 -0700177int decrypt_scm(uint32_t ** img_ptr, uint32_t * img_len_ptr);
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800178int decrypt_scm_v2(uint32_t ** img_ptr, uint32_t * img_len_ptr);
Neeti Desai127b9e02012-03-20 16:11:23 -0700179int encrypt_scm(uint32_t ** img_ptr, uint32_t * img_len_ptr);
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800180int scm_svc_version(uint32 * major, uint32 * minor);
181int scm_protect_keystore(uint32_t * img_ptr, uint32_t img_len);
Shashank Mittal162244e2011-08-08 19:01:25 -0700182
Deepa Dinamani193874e2012-02-07 14:00:04 -0800183#define SCM_SVC_FUSE 0x08
184#define SCM_BLOW_SW_FUSE_ID 0x01
185#define SCM_IS_SW_FUSE_BLOWN_ID 0x02
Shashank Mittal162244e2011-08-08 19:01:25 -0700186
Deepa Dinamani193874e2012-02-07 14:00:04 -0800187#define HLOS_IMG_TAMPER_FUSE 0
188
189
190#define SCM_SVC_CE_CHN_SWITCH_ID 0x04
191#define SCM_CE_CHN_SWITCH_ID 0x02
192
Amir Samuelov4620ad22013-03-13 11:30:05 +0200193#define SCM_SVC_ES 0x10
194#define SCM_SAVE_PARTITION_HASH_ID 0x01
195
Channagoud Kadabi179df0b2013-12-12 14:53:31 -0800196#define SCM_SVC_PWR 0x9
197#define SCM_IO_DISABLE_PMIC_ARBITER 0x1
198
Abhimanyu Kapurb3207fb2014-01-27 21:33:23 -0800199#define SCM_SVC_MILESTONE_32_64_ID 0x1
200#define SCM_SVC_MILESTONE_CMD_ID 0xf
201
Deepa Dinamani193874e2012-02-07 14:00:04 -0800202enum ap_ce_channel_type {
203AP_CE_REGISTER_USE = 0,
204AP_CE_ADM_USE = 1
205};
206
207/* Apps CE resource. */
208#define TZ_RESOURCE_CE_AP 2
209
210uint8_t switch_ce_chn_cmd(enum ap_ce_channel_type channel);
211
212
Shashank Mittal162244e2011-08-08 19:01:25 -0700213void set_tamper_fuse_cmd();
214
Channagoud Kadabi179df0b2013-12-12 14:53:31 -0800215int scm_halt_pmic_arbiter();
Aparna Mallavarapu68e233f2014-03-21 19:18:34 +0530216int scm_call_atomic2(uint32_t svc, uint32_t cmd, uint32_t arg1, uint32_t arg2);
Channagoud Kadabi179df0b2013-12-12 14:53:31 -0800217
Abhimanyu Kapurb3207fb2014-01-27 21:33:23 -0800218void scm_elexec_call(paddr_t kernel_entry, paddr_t dtb_offset);
219
Shashank Mittal162244e2011-08-08 19:01:25 -0700220/**
221 * struct scm_command - one SCM command buffer
222 * @len: total available memory for command and response
223 * @buf_offset: start of command buffer
224 * @resp_hdr_offset: start of response buffer
225 * @id: command to be executed
226 * @buf: buffer returned from scm_get_command_buffer()
227 *
228 * An SCM command is layed out in memory as follows:
229 *
230 * ------------------- <--- struct scm_command
231 * | command header |
232 * ------------------- <--- scm_get_command_buffer()
233 * | command buffer |
234 * ------------------- <--- struct scm_response and
235 * | response header | scm_command_to_response()
236 * ------------------- <--- scm_get_response_buffer()
237 * | response buffer |
238 * -------------------
239 *
240 * There can be arbitrary padding between the headers and buffers so
241 * you should always use the appropriate scm_get_*_buffer() routines
242 * to access the buffers in a safe manner.
243 */
244struct scm_command {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800245 uint32_t len;
246 uint32_t buf_offset;
247 uint32_t resp_hdr_offset;
248 uint32_t id;
249 uint32_t buf[0];
Shashank Mittal162244e2011-08-08 19:01:25 -0700250};
251
252/**
253 * struct scm_response - one SCM response buffer
254 * @len: total available memory for response
255 * @buf_offset: start of response data relative to start of scm_response
256 * @is_complete: indicates if the command has finished processing
257 */
258struct scm_response {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800259 uint32_t len;
260 uint32_t buf_offset;
261 uint32_t is_complete;
Shashank Mittal162244e2011-08-08 19:01:25 -0700262};
Shashank Mittal162244e2011-08-08 19:01:25 -0700263#endif