blob: ba6ed88561fb023adc3baf03197fcd6f9e26a42d [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 */
120#define TZBSP_SVC_INFO 0x06
121#define SCM_SVC_SSD 0x07
122#define SVC_MEMORY_PROTECTION 0x0C
123
124/*Service specific command IDs */
Neeti Desai127b9e02012-03-20 16:11:23 -0700125#define SSD_DECRYPT_ID 0x01
126#define SSD_ENCRYPT_ID 0x02
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800127#define SSD_PROTECT_KEYSTORE_ID 0x05
128#define SSD_PARSE_MD_ID 0x06
129#define SSD_DECRYPT_IMG_FRAG_ID 0x07
Shashank Mittal162244e2011-08-08 19:01:25 -0700130
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800131
132#define SECURE_DEVICE_MDSS 0x01
133
Siddhartha Agrawaleb094c52013-01-28 12:11:43 -0800134#define IOMMU_SECURE_CFG 0x02
135
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800136#define TZ_INFO_GET_FEATURE_ID 0x03
137
138/* SSD parsing status messages from TZ */
139#define SSD_PMD_ENCRYPTED 0
140#define SSD_PMD_NOT_ENCRYPTED 1
141#define SSD_PMD_NO_MD_FOUND 3
142#define SSD_PMD_BUSY 4
143#define SSD_PMD_BAD_MD_PTR_OR_LEN 5
144#define SSD_PMD_PARSING_INCOMPLETE 6
145#define SSD_PMD_PARSING_FAILED 7
146#define SSD_PMD_SETUP_CIPHER_FAILED 8
147
148/* Keystore status messages */
149#define TZBSP_SSD_PKS_SUCCESS 0 /**< Successful return. */
150#define TZBSP_SSD_PKS_INVALID_PTR 1 /**< Keystore pointer invalid. */
151#define TZBSP_SSD_PKS_INVALID_LEN 2 /**< Keystore length incorrect. */
152#define TZBSP_SSD_PKS_UNALIGNED_PTR 3 /**< Keystore pointer not word
153 aligned. */
154#define TZBSP_SSD_PKS_PROTECT_MEM_FAILED 4 /**< Failure when protecting
155 the keystore memory.*/
156#define TZBSP_SSD_PKS_INVALID_NUM_KEYS 5 /**< Unsupported number of
157 keys passed. If a valid
158 pointer to non-secure
159 memory is passed that
160 isn't a keystore, this is
161 a likely return code. */
162#define TZBSP_SSD_PKS_DECRYPT_FAILED 6 /**< The keystore could not be
163 decrypted. */
164
165/* Features in TZ */
166#define TZBSP_FVER_SSD 5
167
168#define TZBSP_GET_FEATURE_VERSION(major) ((major >> 22)& 0x3FF)
Siddhartha Agrawaleb094c52013-01-28 12:11:43 -0800169
Shashank Mittal162244e2011-08-08 19:01:25 -0700170static uint32 smc(uint32 cmd_addr);
Neeti Desai127b9e02012-03-20 16:11:23 -0700171int decrypt_scm(uint32_t ** img_ptr, uint32_t * img_len_ptr);
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800172int decrypt_scm_v2(uint32_t ** img_ptr, uint32_t * img_len_ptr);
Neeti Desai127b9e02012-03-20 16:11:23 -0700173int encrypt_scm(uint32_t ** img_ptr, uint32_t * img_len_ptr);
sundarajan srinivasan4dfd4f72013-02-27 14:13:09 -0800174int scm_svc_version(uint32 * major, uint32 * minor);
175int scm_protect_keystore(uint32_t * img_ptr, uint32_t img_len);
Shashank Mittal162244e2011-08-08 19:01:25 -0700176
Deepa Dinamani193874e2012-02-07 14:00:04 -0800177#define SCM_SVC_FUSE 0x08
178#define SCM_BLOW_SW_FUSE_ID 0x01
179#define SCM_IS_SW_FUSE_BLOWN_ID 0x02
Shashank Mittal162244e2011-08-08 19:01:25 -0700180
Deepa Dinamani193874e2012-02-07 14:00:04 -0800181#define HLOS_IMG_TAMPER_FUSE 0
182
183
184#define SCM_SVC_CE_CHN_SWITCH_ID 0x04
185#define SCM_CE_CHN_SWITCH_ID 0x02
186
Amir Samuelov4620ad22013-03-13 11:30:05 +0200187#define SCM_SVC_ES 0x10
188#define SCM_SAVE_PARTITION_HASH_ID 0x01
189
Channagoud Kadabi179df0b2013-12-12 14:53:31 -0800190#define SCM_SVC_PWR 0x9
191#define SCM_IO_DISABLE_PMIC_ARBITER 0x1
192
Abhimanyu Kapurb3207fb2014-01-27 21:33:23 -0800193#define SCM_SVC_MILESTONE_32_64_ID 0x1
194#define SCM_SVC_MILESTONE_CMD_ID 0xf
195
Deepa Dinamani193874e2012-02-07 14:00:04 -0800196enum ap_ce_channel_type {
197AP_CE_REGISTER_USE = 0,
198AP_CE_ADM_USE = 1
199};
200
201/* Apps CE resource. */
202#define TZ_RESOURCE_CE_AP 2
203
204uint8_t switch_ce_chn_cmd(enum ap_ce_channel_type channel);
205
206
Shashank Mittal162244e2011-08-08 19:01:25 -0700207void set_tamper_fuse_cmd();
208
Channagoud Kadabi179df0b2013-12-12 14:53:31 -0800209int scm_halt_pmic_arbiter();
210
Abhimanyu Kapurb3207fb2014-01-27 21:33:23 -0800211void scm_elexec_call(paddr_t kernel_entry, paddr_t dtb_offset);
212
Shashank Mittal162244e2011-08-08 19:01:25 -0700213/**
214 * struct scm_command - one SCM command buffer
215 * @len: total available memory for command and response
216 * @buf_offset: start of command buffer
217 * @resp_hdr_offset: start of response buffer
218 * @id: command to be executed
219 * @buf: buffer returned from scm_get_command_buffer()
220 *
221 * An SCM command is layed out in memory as follows:
222 *
223 * ------------------- <--- struct scm_command
224 * | command header |
225 * ------------------- <--- scm_get_command_buffer()
226 * | command buffer |
227 * ------------------- <--- struct scm_response and
228 * | response header | scm_command_to_response()
229 * ------------------- <--- scm_get_response_buffer()
230 * | response buffer |
231 * -------------------
232 *
233 * There can be arbitrary padding between the headers and buffers so
234 * you should always use the appropriate scm_get_*_buffer() routines
235 * to access the buffers in a safe manner.
236 */
237struct scm_command {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800238 uint32_t len;
239 uint32_t buf_offset;
240 uint32_t resp_hdr_offset;
241 uint32_t id;
242 uint32_t buf[0];
Shashank Mittal162244e2011-08-08 19:01:25 -0700243};
244
245/**
246 * struct scm_response - one SCM response buffer
247 * @len: total available memory for response
248 * @buf_offset: start of response data relative to start of scm_response
249 * @is_complete: indicates if the command has finished processing
250 */
251struct scm_response {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800252 uint32_t len;
253 uint32_t buf_offset;
254 uint32_t is_complete;
Shashank Mittal162244e2011-08-08 19:01:25 -0700255};
Shashank Mittal162244e2011-08-08 19:01:25 -0700256#endif