blob: 9fb5b442fdf9a2eba9f56f06f349c540db595209 [file] [log] [blame]
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -08001/*
2 * Copyright (c) 2009, Google Inc.
3 * All rights reserved.
Duy Truongf3ac7b32013-02-13 01:07:28 -08004 * Copyright (c) 2009-2011, The Linux Foundation. All rights reserved.
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -08005 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 * * Neither the name of Google, Inc. nor the names of its contributors
16 * may be used to endorse or promote products derived from this
17 * software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
22 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
26 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
29 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#include <debug.h>
34#include <dev/keys.h>
Chandan Uddaraju14e57eb2010-06-28 12:11:06 -070035#include <dev/gpio.h>
Kinson Chikea646242011-09-01 13:53:16 -070036#include <dev/ssbi.h>
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -080037#include <lib/ptable.h>
38#include <dev/flash.h>
Chandan Uddaraju885e4db2009-12-03 22:45:26 -080039#include <smem.h>
Chandan Uddaraju14e57eb2010-06-28 12:11:06 -070040#include <reg.h>
Greg Griscod6250552011-06-29 14:40:23 -070041#include <mmc.h>
Subbaraman Narayanamurthy4b43c352010-09-24 13:20:52 -070042#include <platform/iomap.h>
Wentao Xu97df7fd2011-01-19 15:01:17 -050043#include <platform/machtype.h>
Channagoud Kadabie18a52d2012-10-04 15:18:55 +053044#if TARGET_USES_RSPIN_LOCK
Channagoud Kadabie1ecef52012-02-04 15:54:34 +053045#include <platform/remote_spinlock.h>
46#endif
Greg Griscod6250552011-06-29 14:40:23 -070047#include <platform.h>
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -080048#include <crypto_hash.h>
Chandan Uddarajuf759be32010-03-17 19:04:16 -070049
50#define MSM8255_ID 74
51#define MSM8655_ID 75
Ajay Dudani65077982010-09-12 23:55:10 -070052#define APQ8055_ID 85
Chandan Uddaraju885e4db2009-12-03 22:45:26 -080053
Chandan Uddaraju9e5ab962010-01-21 15:36:37 -080054#define VARIABLE_LENGTH 0x10101010
55#define DIFF_START_ADDR 0xF0F0F0F0
56#define NUM_PAGES_PER_BLOCK 0x40
57
Ajay Dudanib01e5062011-12-03 23:23:42 -080058static unsigned mmc_sdc_base[] =
59 { MSM_SDC1_BASE, MSM_SDC2_BASE, MSM_SDC3_BASE, MSM_SDC4_BASE };
Subbaraman Narayanamurthy4b43c352010-09-24 13:20:52 -070060
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -080061static struct ptable flash_ptable;
Chandan Uddaraju1434a602010-03-08 17:13:38 -080062static int hw_platform_type = -1;
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -080063
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -080064/* Setting this variable to different values defines the
65 * behavior of CE engine:
66 * platform_ce_type = CRYPTO_ENGINE_TYPE_NONE : No CE engine
67 * platform_ce_type = CRYPTO_ENGINE_TYPE_SW : Software CE engine
68 * platform_ce_type = CRYPTO_ENGINE_TYPE_HW : Hardware CE engine
69 * Behavior is determined in the target code.
70 */
71static crypto_engine_type platform_ce_type = CRYPTO_ENGINE_TYPE_HW;
72
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -080073/* for these partitions, start will be offset by either what we get from
74 * smem, or from the above offset if smem is not useful. Also, we should
75 * probably have smem_ptable code populate our flash_ptable.
76 *
77 * When smem provides us with a full partition table, we can get rid of
78 * this altogether.
79 *
80 */
81static struct ptentry board_part_list[] = {
82 {
Ajay Dudanib01e5062011-12-03 23:23:42 -080083 .start = 0,
Channagoud Kadabi5af88162012-02-16 11:01:58 +053084 .length = 10 /* In MB */ ,
Ajay Dudanib01e5062011-12-03 23:23:42 -080085 .name = "boot",
86 },
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -080087 {
Ajay Dudanib01e5062011-12-03 23:23:42 -080088 .start = DIFF_START_ADDR,
Channagoud Kadabiaa743672011-12-19 16:25:52 +053089 .length = 256 /* In MB */ ,
Ajay Dudanib01e5062011-12-03 23:23:42 -080090 .name = "system",
91 },
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -080092 {
Ajay Dudanib01e5062011-12-03 23:23:42 -080093 .start = DIFF_START_ADDR,
94 .length = 5 /* In MB */ ,
95 .name = "cache",
96 },
Chandan Uddaraju94183c02010-01-15 15:13:59 -080097 {
Ajay Dudanib01e5062011-12-03 23:23:42 -080098 .start = DIFF_START_ADDR,
99 .length = 1 /* In MB */ ,
100 .name = "misc",
101 },
Subbaraman Narayanamurthyeb92bcc2010-07-20 14:32:46 -0700102 {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800103 .start = DIFF_START_ADDR,
104 .length = 1 /* In MB */ ,
105 .name = "devinfo",
106 },
Shashank Mittal162244e2011-08-08 19:01:25 -0700107 {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800108 .start = DIFF_START_ADDR,
109 .length = VARIABLE_LENGTH,
110 .name = "userdata",
111 },
Chandan Uddaraju9e5ab962010-01-21 15:36:37 -0800112 {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800113 .start = DIFF_START_ADDR,
114 .length = 3 /* In MB */ ,
115 .name = "persist",
116 },
Chandan Uddaraju9e5ab962010-01-21 15:36:37 -0800117 {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800118 .start = DIFF_START_ADDR,
Channagoud Kadabi5af88162012-02-16 11:01:58 +0530119 .length = 10 /* In MB */ ,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800120 .name = "recovery",
121 },
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800122};
Ajay Dudanib01e5062011-12-03 23:23:42 -0800123
124static int num_parts = sizeof(board_part_list) / sizeof(struct ptentry);
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800125
126void smem_ptable_init(void);
127unsigned smem_get_apps_flash_start(void);
Chandan Uddaraju14e57eb2010-06-28 12:11:06 -0700128unsigned smem_read_alloc_entry_offset(smem_mem_type_t, void *, int, int);
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800129
130void keypad_init(void);
131
Ajay Dudanib01e5062011-12-03 23:23:42 -0800132static int emmc_boot = -1; /* set to uninitialized */
David Ng183a7422009-12-07 14:55:21 -0800133int target_is_emmc_boot(void);
Chandan Uddaraju1434a602010-03-08 17:13:38 -0800134static int platform_version = -1;
Chandan Uddarajuf759be32010-03-17 19:04:16 -0700135static int target_msm_id = -1;
Chandan Uddaraju14e57eb2010-06-28 12:11:06 -0700136static int interleaved_mode_enabled = -1;
137void enable_interleave_mode(int);
138
139int target_is_interleaved_mode(void)
140{
Ajay Dudanib01e5062011-12-03 23:23:42 -0800141 struct smem_board_info_v4 board_info_v4;
142 unsigned int board_info_len = 0;
143 unsigned smem_status;
144 char *build_type;
145 unsigned format = 0;
Chandan Uddaraju14e57eb2010-06-28 12:11:06 -0700146
Ajay Dudanib01e5062011-12-03 23:23:42 -0800147 if (interleaved_mode_enabled != -1) {
148 return interleaved_mode_enabled;
Chandan Uddaraju14e57eb2010-06-28 12:11:06 -0700149 }
Chandan Uddaraju14e57eb2010-06-28 12:11:06 -0700150
Ajay Dudanib01e5062011-12-03 23:23:42 -0800151 smem_status = smem_read_alloc_entry_offset(SMEM_BOARD_INFO_LOCATION,
152 &format, sizeof(format), 0);
153 if (!smem_status) {
154 if ((format == 3) || (format == 4)) {
155 if (format == 4)
156 board_info_len = sizeof(board_info_v4);
157 else
158 board_info_len =
159 sizeof(board_info_v4.board_info_v3);
160
161 smem_status =
162 smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
163 &board_info_v4,
164 board_info_len);
165 if (!smem_status) {
166 build_type =
167 (char *)(board_info_v4.
168 board_info_v3.build_id) + 9;
169
170 interleaved_mode_enabled = 0;
171
172 if (*build_type == 'C') {
173 interleaved_mode_enabled = 1;
174 }
175 }
176 }
177 }
178
179 return interleaved_mode_enabled;
Chandan Uddaraju14e57eb2010-06-28 12:11:06 -0700180}
David Ng183a7422009-12-07 14:55:21 -0800181
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800182void target_init(void)
183{
184 unsigned offset;
185 struct flash_info *flash_info;
Chandan Uddaraju9e5ab962010-01-21 15:36:37 -0800186 unsigned total_num_of_blocks;
Chandan Uddaraju9e5ab962010-01-21 15:36:37 -0800187 unsigned next_ptr_start_adr = 0;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800188 unsigned blocks_per_1MB = 8; /* Default value of 2k page size on 256MB flash drive */
Subbaraman Narayanamurthy4b43c352010-09-24 13:20:52 -0700189 unsigned base_addr;
190 unsigned char slot;
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800191 int i;
192
193 dprintf(INFO, "target_init()\n");
194
Channagoud Kadabie18a52d2012-10-04 15:18:55 +0530195#if TARGET_USES_RSPIN_LOCK
Channagoud Kadabie1ecef52012-02-04 15:54:34 +0530196 if(remote_spinlock_init(&rlock))
197 dprintf(SPEW,"Failed to Initialize remote spin locks\n");
198#endif
199
Chandan Uddarajua0d26dd2009-12-13 01:04:38 -0800200#if (!ENABLE_NANDWRITE)
Chandan Uddaraju5fa471a2009-12-02 17:31:34 -0800201 keys_init();
202 keypad_init();
Chandan Uddarajua0d26dd2009-12-13 01:04:38 -0800203#endif
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800204
Kinson Chikce306ff2011-07-08 15:23:33 -0700205 /* Display splash screen if enabled */
206#if DISPLAY_SPLASH_SCREEN
207 display_init();
208 dprintf(SPEW, "Diplay initialized\n");
209 display_image_on_screen();
210#endif
211
Ajay Dudanib01e5062011-12-03 23:23:42 -0800212 if (target_is_emmc_boot()) {
Amol Jadi2dfe3392011-07-19 16:03:37 -0700213 /* Must wait for modem-up before we can intialize MMC.
214 */
Ajay Dudanib01e5062011-12-03 23:23:42 -0800215 while (readl(MSM_SHARED_BASE + 0x14) != 1) ;
Amol Jadi2dfe3392011-07-19 16:03:37 -0700216
Subbaraman Narayanamurthy4b43c352010-09-24 13:20:52 -0700217 /* Trying Slot 2 first */
218 slot = 2;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800219 base_addr = mmc_sdc_base[slot - 1];
220 if (mmc_boot_main(slot, base_addr)) {
Subbaraman Narayanamurthy4b43c352010-09-24 13:20:52 -0700221 /* Trying Slot 4 next */
222 slot = 4;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800223 base_addr = mmc_sdc_base[slot - 1];
224 if (mmc_boot_main(slot, base_addr)) {
Subbaraman Narayanamurthy1ea479e2010-10-08 14:54:16 -0700225 dprintf(CRITICAL, "mmc init failed!");
226 ASSERT(0);
Subbaraman Narayanamurthy4b43c352010-09-24 13:20:52 -0700227 }
228 }
David Ng183a7422009-12-07 14:55:21 -0800229 return;
Subbaraman Narayanamurthyfbe13a02010-09-10 11:51:12 -0700230 }
David Ng183a7422009-12-07 14:55:21 -0800231
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800232 ptable_init(&flash_ptable);
233 smem_ptable_init();
234
235 flash_init();
236 flash_info = flash_get_info();
237 ASSERT(flash_info);
Chandan Uddaraju14e57eb2010-06-28 12:11:06 -0700238 enable_interleave_mode(target_is_interleaved_mode());
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800239
240 offset = smem_get_apps_flash_start();
241 if (offset == 0xffffffff)
Ajay Dudanib01e5062011-12-03 23:23:42 -0800242 while (1) ;
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800243
Chandan Uddaraju40605112010-08-09 14:25:08 -0700244 total_num_of_blocks = flash_info->num_blocks;
245 blocks_per_1MB = (1 << 20) / (flash_info->block_size);
Chandan Uddaraju9e5ab962010-01-21 15:36:37 -0800246
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800247 for (i = 0; i < num_parts; i++) {
248 struct ptentry *ptn = &board_part_list[i];
Chandan Uddarajud56669f2010-04-19 22:15:06 -0700249 unsigned len = ((ptn->length) * blocks_per_1MB);
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800250
Ajay Dudanib01e5062011-12-03 23:23:42 -0800251 if (ptn->start != 0)
252 ASSERT(ptn->start == DIFF_START_ADDR);
Chandan Uddarajud56669f2010-04-19 22:15:06 -0700253
254 ptn->start = next_ptr_start_adr;
255
Ajay Dudanib01e5062011-12-03 23:23:42 -0800256 if (ptn->length == VARIABLE_LENGTH) {
Chandan Uddaraju9e5ab962010-01-21 15:36:37 -0800257 unsigned length_for_prt = 0;
258 unsigned j;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800259 for (j = i + 1; j < num_parts; j++) {
260 struct ptentry *temp_ptn = &board_part_list[j];
261 ASSERT(temp_ptn->length != VARIABLE_LENGTH);
262 length_for_prt +=
263 ((temp_ptn->length) * blocks_per_1MB);
Chandan Uddaraju9e5ab962010-01-21 15:36:37 -0800264 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800265 len =
266 total_num_of_blocks - (offset + ptn->start +
267 length_for_prt);
Chandan Uddaraju9e5ab962010-01-21 15:36:37 -0800268 ASSERT(len >= 0);
Chandan Uddaraju9e5ab962010-01-21 15:36:37 -0800269 }
Chandan Uddarajud56669f2010-04-19 22:15:06 -0700270 next_ptr_start_adr = ptn->start + len;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800271 if (target_is_interleaved_mode()) {
272 ptable_add(&flash_ptable, ptn->name,
273 offset + (ptn->start / 2), (len / 2),
274 ptn->flags, TYPE_APPS_PARTITION,
275 PERM_WRITEABLE);
276 } else {
277 ptable_add(&flash_ptable, ptn->name,
278 offset + ptn->start, len, ptn->flags,
279 TYPE_APPS_PARTITION, PERM_WRITEABLE);
Chandan Uddaraju14e57eb2010-06-28 12:11:06 -0700280 }
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800281 }
282
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800283 smem_add_modem_partitions(&flash_ptable);
284
Chandan Uddaraju8adde5a2009-11-17 11:31:28 -0800285 ptable_dump(&flash_ptable);
286 flash_set_ptable(&flash_ptable);
287}
Chandan Uddaraju885e4db2009-12-03 22:45:26 -0800288
Chandan Uddaraju1434a602010-03-08 17:13:38 -0800289int target_platform_version(void)
290{
Ajay Dudanib01e5062011-12-03 23:23:42 -0800291 return platform_version;
Chandan Uddaraju1434a602010-03-08 17:13:38 -0800292}
293
Chandan Uddarajuf759be32010-03-17 19:04:16 -0700294int target_is_msm8x55(void)
295{
Ajay Dudanib01e5062011-12-03 23:23:42 -0800296 if ((target_msm_id == MSM8255_ID) ||
297 (target_msm_id == MSM8655_ID) || (target_msm_id == APQ8055_ID))
298 return 1;
299 else
300 return 0;
Chandan Uddarajuf759be32010-03-17 19:04:16 -0700301}
302
Chandan Uddaraju885e4db2009-12-03 22:45:26 -0800303unsigned board_machtype(void)
304{
Ajay Dudanib01e5062011-12-03 23:23:42 -0800305 struct smem_board_info_v4 board_info_v4;
306 unsigned int board_info_len = 0;
307 enum platform platform_type = 0;
308 unsigned smem_status;
309 unsigned format = 0;
310 if (hw_platform_type != -1)
Chandan Uddarajuf759be32010-03-17 19:04:16 -0700311 return hw_platform_type;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800312
313 smem_status = smem_read_alloc_entry_offset(SMEM_BOARD_INFO_LOCATION,
314 &format, sizeof(format), 0);
315 if (!smem_status) {
316 if ((format == 3) || (format == 4)) {
317 if (format == 4)
318 board_info_len = sizeof(board_info_v4);
319 else
320 board_info_len =
321 sizeof(board_info_v4.board_info_v3);
322
323 smem_status =
324 smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
325 &board_info_v4,
326 board_info_len);
327 if (!smem_status) {
328 if (format == 4)
329 platform_version =
330 board_info_v4.platform_version;
331
332 platform_type =
333 board_info_v4.board_info_v3.hw_platform;
334 target_msm_id =
335 board_info_v4.board_info_v3.msm_id;
336 switch (platform_type) {
337 case HW_PLATFORM_SURF:
338 hw_platform_type =
339 ((target_is_msm8x55())?
340 LINUX_MACHTYPE_8x55_SURF :
341 LINUX_MACHTYPE_7x30_SURF);
342 break;
343 case HW_PLATFORM_FFA:
344 hw_platform_type =
345 ((target_is_msm8x55())?
346 LINUX_MACHTYPE_8x55_FFA :
347 LINUX_MACHTYPE_7x30_FFA);
348 break;
349 case HW_PLATFORM_FLUID:
350 hw_platform_type =
351 LINUX_MACHTYPE_7x30_FLUID;
352 break;
353 case HW_PLATFORM_SVLTE:
354 hw_platform_type =
355 LINUX_MACHTYPE_8x55_SVLTE_FFA;
356 break;
357 default:
358 hw_platform_type =
359 ((target_is_msm8x55())?
360 LINUX_MACHTYPE_8x55_SURF :
361 LINUX_MACHTYPE_7x30_SURF);
362 break;
363 }
364 return hw_platform_type;
365 }
366 }
Chandan Uddarajuf759be32010-03-17 19:04:16 -0700367 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800368 hw_platform_type = LINUX_MACHTYPE_7x30_SURF;
369 return hw_platform_type;
Chandan Uddaraju885e4db2009-12-03 22:45:26 -0800370}
David Ng183a7422009-12-07 14:55:21 -0800371
Chandan Uddaraju94183c02010-01-15 15:13:59 -0800372void reboot_device(unsigned reboot_reason)
373{
Ajay Dudanib01e5062011-12-03 23:23:42 -0800374 reboot(reboot_reason);
Chandan Uddaraju94183c02010-01-15 15:13:59 -0800375}
376
Chandan Uddarajude85d3f2010-01-05 16:32:33 -0800377unsigned check_reboot_mode(void)
378{
Ajay Dudanib01e5062011-12-03 23:23:42 -0800379 unsigned mode[2] = { 0, 0 };
380 unsigned int mode_len = sizeof(mode);
381 unsigned smem_status;
Chandan Uddaraju94183c02010-01-15 15:13:59 -0800382
Ajay Dudanib01e5062011-12-03 23:23:42 -0800383 smem_status = smem_read_alloc_entry(SMEM_APPS_BOOT_MODE,
384 &mode, mode_len);
385 if (smem_status) {
386 dprintf(CRITICAL,
387 "ERROR: unable to read shared memory for reboot mode\n");
388 return 0;
389 }
390 return mode[0];
Chandan Uddarajude85d3f2010-01-05 16:32:33 -0800391}
Chandan Uddaraju7f5b9012010-02-06 16:37:48 -0800392
Wentao Xu530c2d82010-11-09 18:30:18 -0500393static unsigned target_check_power_on_reason(void)
394{
Ajay Dudanib01e5062011-12-03 23:23:42 -0800395 unsigned power_on_status = 0;
396 unsigned int status_len = sizeof(power_on_status);
397 unsigned smem_status;
Wentao Xu530c2d82010-11-09 18:30:18 -0500398
Ajay Dudanib01e5062011-12-03 23:23:42 -0800399 smem_status = smem_read_alloc_entry(SMEM_POWER_ON_STATUS_INFO,
400 &power_on_status, status_len);
Wentao Xu530c2d82010-11-09 18:30:18 -0500401
Ajay Dudanib01e5062011-12-03 23:23:42 -0800402 if (smem_status) {
403 dprintf(CRITICAL,
404 "ERROR: unable to read shared memory for power on reason\n");
405 }
Wentao Xu530c2d82010-11-09 18:30:18 -0500406
Ajay Dudanib01e5062011-12-03 23:23:42 -0800407 return power_on_status;
Wentao Xu530c2d82010-11-09 18:30:18 -0500408}
409
Subbaraman Narayanamurthyf17b4ae2011-02-16 20:19:56 -0800410#if _EMMC_BOOT
411void target_serialno(unsigned char *buf)
412{
413 unsigned int serialno;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800414 serialno = mmc_get_psn();
Ajay Dudanif63d02f2011-10-01 08:29:53 -0700415 snprintf(buf, 13, "%x", serialno);
Subbaraman Narayanamurthyf17b4ae2011-02-16 20:19:56 -0800416}
Subbaraman Narayanamurthy0e445b02011-06-19 21:34:46 -0700417
418int emmc_recovery_init(void)
419{
420 int rc;
421 rc = _emmc_recovery_init();
422 return rc;
423}
Subbaraman Narayanamurthyf17b4ae2011-02-16 20:19:56 -0800424#endif
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -0800425
426crypto_engine_type board_ce_type(void)
427{
428 return platform_ce_type;
429}
Channagoud Kadabi956cf502012-03-08 03:49:50 +0530430
431int machine_is_ffa()
432{
433 unsigned mach_type;
434 int ret = 0;
435
436 mach_type = board_machtype();
437 switch(mach_type) {
438 case LINUX_MACHTYPE_8x55_FFA:
439 case LINUX_MACHTYPE_7x30_FFA:
440 ret = 1;
441 break;
442 default:
443 ret = 0;
444 }
445 return ret;
446}