blob: 95477c229a51566252757ccdf6de1017925e8f28 [file] [log] [blame]
Shashank Mittal246f8d02011-01-21 17:12:27 -08001/*
2 * Copyright (c) 2009, Google Inc.
3 * All rights reserved.
Channagoud Kadabi3acfb742011-11-15 18:19:32 +05304 * Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
Shashank Mittal246f8d02011-01-21 17:12:27 -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
Amol Jadi2dfe3392011-07-19 16:03:37 -070033#include <reg.h>
Shashank Mittal246f8d02011-01-21 17:12:27 -080034#include <debug.h>
35#include <dev/keys.h>
Kinson Chikea646242011-09-01 13:53:16 -070036#include <dev/ssbi.h>
Shashank Mittal246f8d02011-01-21 17:12:27 -080037#include <lib/ptable.h>
38#include <dev/flash.h>
39#include <smem.h>
Greg Griscod6250552011-06-29 14:40:23 -070040#include <mmc.h>
Shashank Mittal246f8d02011-01-21 17:12:27 -080041#include <platform/iomap.h>
Channagoud Kadabi539ef722012-03-29 16:02:50 +053042#include <target/board.h>
Greg Griscod6250552011-06-29 14:40:23 -070043#include <platform.h>
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -080044#include <crypto_hash.h>
Shashank Mittal246f8d02011-01-21 17:12:27 -080045
Shashank Mittal246f8d02011-01-21 17:12:27 -080046#define VARIABLE_LENGTH 0x10101010
47#define DIFF_START_ADDR 0xF0F0F0F0
48#define NUM_PAGES_PER_BLOCK 0x40
Channagoud Kadabi16da3a22011-10-24 20:25:07 +053049#define RECOVERY_MODE 0x77665502
50#define FOTA_COOKIE 0x64645343
51
52unsigned int fota_cookie[1];
Shashank Mittal246f8d02011-01-21 17:12:27 -080053
54static struct ptable flash_ptable;
Shashank Mittalcb25d252011-04-05 12:13:30 -070055unsigned hw_platform = 0;
56unsigned target_msm_id = 0;
Aparna Mallavarapuc1eb99b2012-09-24 20:13:42 +053057unsigned msm_version = 0;
Shashank Mittal246f8d02011-01-21 17:12:27 -080058
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -080059/* Setting this variable to different values defines the
60 * behavior of CE engine:
61 * platform_ce_type = CRYPTO_ENGINE_TYPE_NONE : No CE engine
62 * platform_ce_type = CRYPTO_ENGINE_TYPE_SW : Software CE engine
63 * platform_ce_type = CRYPTO_ENGINE_TYPE_HW : Hardware CE engine
64 * Behavior is determined in the target code.
65 */
66static crypto_engine_type platform_ce_type = CRYPTO_ENGINE_TYPE_SW;
67
Channagoud Kadabi3acfb742011-11-15 18:19:32 +053068int machine_is_evb();
Channagoud Kadabid53664b2011-12-28 16:39:15 +053069
Shashank Mittal246f8d02011-01-21 17:12:27 -080070/* for these partitions, start will be offset by either what we get from
71 * smem, or from the above offset if smem is not useful. Also, we should
72 * probably have smem_ptable code populate our flash_ptable.
73 *
74 * When smem provides us with a full partition table, we can get rid of
75 * this altogether.
76 *
77 */
Channagoud Kadabib3e08032012-09-25 16:04:16 +053078static struct ptentry board_part_list_default[] = {
Shashank Mittal246f8d02011-01-21 17:12:27 -080079 {
Ajay Dudanib01e5062011-12-03 23:23:42 -080080 .start = 0,
81 .length = 10 /* In MB */ ,
82 .name = "boot",
83 },
Shashank Mittal246f8d02011-01-21 17:12:27 -080084 {
Ajay Dudanib01e5062011-12-03 23:23:42 -080085 .start = DIFF_START_ADDR,
Channagoud Kadabi71961882012-02-09 16:32:41 +053086 .length = 253 /* In MB */ ,
Ajay Dudanib01e5062011-12-03 23:23:42 -080087 .name = "system",
88 },
Shashank Mittal246f8d02011-01-21 17:12:27 -080089 {
Ajay Dudanib01e5062011-12-03 23:23:42 -080090 .start = DIFF_START_ADDR,
Channagoud Kadabi2ce67412012-09-11 18:26:27 +053091 .length = 80 /* In MB */ ,
Ajay Dudanib01e5062011-12-03 23:23:42 -080092 .name = "cache",
93 },
Shashank Mittal246f8d02011-01-21 17:12:27 -080094 {
Ajay Dudanib01e5062011-12-03 23:23:42 -080095 .start = DIFF_START_ADDR,
96 .length = 4 /* In MB */ ,
97 .name = "misc",
98 },
Shashank Mittal246f8d02011-01-21 17:12:27 -080099 {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800100 .start = DIFF_START_ADDR,
101 .length = VARIABLE_LENGTH,
102 .name = "userdata",
103 },
Shashank Mittal246f8d02011-01-21 17:12:27 -0800104 {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800105 .start = DIFF_START_ADDR,
106 .length = 4 /* In MB */ ,
107 .name = "persist",
108 },
Shashank Mittal246f8d02011-01-21 17:12:27 -0800109 {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800110 .start = DIFF_START_ADDR,
111 .length = 10 /* In MB */ ,
112 .name = "recovery",
113 },
Shashank Mittal246f8d02011-01-21 17:12:27 -0800114};
Ajay Dudanib01e5062011-12-03 23:23:42 -0800115
Channagoud Kadabib3e08032012-09-25 16:04:16 +0530116/*
117 * SKU3 & SKU PVT devices use the same micron NAND device with different density,
118 * due to this SKU3 partition creation fails as the number of blocks calculated
119 * from flash density is wrong, To avoid this use a different partition table &
120 * move the variable length partition to the end, this way kernel will truncate
121 * the variable length partition & we need not add target checks in the shared
122 * nand driver code.
123 */
124
125static struct ptentry board_part_list_sku3[] = {
126 {
127 .start = 0,
128 .length = 10 /* In MB */ ,
129 .name = "boot",
130 },
131 {
132 .start = DIFF_START_ADDR,
133 .length = 253 /* In MB */ ,
134 .name = "system",
135 },
136 {
137 .start = DIFF_START_ADDR,
138 .length = 80 /* In MB */ ,
139 .name = "cache",
140 },
141 {
142 .start = DIFF_START_ADDR,
143 .length = 4 /* In MB */ ,
144 .name = "misc",
145 },
146 {
147 .start = DIFF_START_ADDR,
148 .length = 4 /* In MB */ ,
149 .name = "persist",
150 },
151 {
152 .start = DIFF_START_ADDR,
153 .length = 10 /* In MB */ ,
154 .name = "recovery",
155 },
156 {
157 .start = DIFF_START_ADDR,
158 .length = VARIABLE_LENGTH,
159 .name = "userdata",
160 },
161};
162
163static int num_parts = sizeof(board_part_list_default) / sizeof(struct ptentry);
Ajay Dudanib01e5062011-12-03 23:23:42 -0800164
Shashank Mittal246f8d02011-01-21 17:12:27 -0800165void smem_ptable_init(void);
166unsigned smem_get_apps_flash_start(void);
167
168void keypad_init(void);
169
170int target_is_emmc_boot(void);
171
172void target_init(void)
173{
174 unsigned offset;
175 struct flash_info *flash_info;
Channagoud Kadabib3e08032012-09-25 16:04:16 +0530176 struct ptentry *board_part_list;
Shashank Mittal246f8d02011-01-21 17:12:27 -0800177 unsigned total_num_of_blocks;
178 unsigned next_ptr_start_adr = 0;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800179 unsigned blocks_per_1MB = 8; /* Default value of 2k page size on 256MB flash drive */
Shashank Mittal246f8d02011-01-21 17:12:27 -0800180 int i;
181
182 dprintf(INFO, "target_init()\n");
183
Shashank Mittal246f8d02011-01-21 17:12:27 -0800184#if (!ENABLE_NANDWRITE)
185 keys_init();
186 keypad_init();
187#endif
Shashank Mittal246f8d02011-01-21 17:12:27 -0800188
Kinson Chikce306ff2011-07-08 15:23:33 -0700189 /* Display splash screen if enabled */
190#if DISPLAY_SPLASH_SCREEN
Channagoud Kadabi539ef722012-03-29 16:02:50 +0530191 display_init();
192 dprintf(SPEW, "Diplay initialized\n");
Kinson Chikce306ff2011-07-08 15:23:33 -0700193#endif
194
Ajay Dudanib01e5062011-12-03 23:23:42 -0800195 if (target_is_emmc_boot()) {
Amol Jadi2dfe3392011-07-19 16:03:37 -0700196 /* Must wait for modem-up before we can intialize MMC.
197 */
Ajay Dudanib01e5062011-12-03 23:23:42 -0800198 while (readl(MSM_SHARED_BASE + 0x14) != 1) ;
Amol Jadi2dfe3392011-07-19 16:03:37 -0700199
Ajay Dudanib01e5062011-12-03 23:23:42 -0800200 if (mmc_boot_main(MMC_SLOT, MSM_SDC3_BASE)) {
Shashank Mittal246f8d02011-01-21 17:12:27 -0800201 dprintf(CRITICAL, "mmc init failed!");
202 ASSERT(0);
203 }
204 return;
205 }
206
207 ptable_init(&flash_ptable);
208 smem_ptable_init();
209
210 flash_init();
211 flash_info = flash_get_info();
212 ASSERT(flash_info);
213
214 offset = smem_get_apps_flash_start();
215 if (offset == 0xffffffff)
Ajay Dudanib01e5062011-12-03 23:23:42 -0800216 while (1) ;
Shashank Mittal246f8d02011-01-21 17:12:27 -0800217
218 total_num_of_blocks = flash_info->num_blocks;
219 blocks_per_1MB = (1 << 20) / (flash_info->block_size);
220
Channagoud Kadabib3e08032012-09-25 16:04:16 +0530221 if (target_is_sku3())
222 board_part_list = board_part_list_sku3;
223 else
224 board_part_list = board_part_list_default;
225
Shashank Mittal246f8d02011-01-21 17:12:27 -0800226 for (i = 0; i < num_parts; i++) {
227 struct ptentry *ptn = &board_part_list[i];
228 unsigned len = ((ptn->length) * blocks_per_1MB);
229
Ajay Dudanib01e5062011-12-03 23:23:42 -0800230 if (ptn->start != 0)
231 ASSERT(ptn->start == DIFF_START_ADDR);
Shashank Mittal246f8d02011-01-21 17:12:27 -0800232
233 ptn->start = next_ptr_start_adr;
234
Ajay Dudanib01e5062011-12-03 23:23:42 -0800235 if (ptn->length == VARIABLE_LENGTH) {
Shashank Mittal246f8d02011-01-21 17:12:27 -0800236 unsigned length_for_prt = 0;
237 unsigned j;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800238 for (j = i + 1; j < num_parts; j++) {
239 struct ptentry *temp_ptn = &board_part_list[j];
240 ASSERT(temp_ptn->length != VARIABLE_LENGTH);
241 length_for_prt +=
242 ((temp_ptn->length) * blocks_per_1MB);
Shashank Mittal246f8d02011-01-21 17:12:27 -0800243 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800244 len =
245 (total_num_of_blocks - 1) - (offset + ptn->start +
246 length_for_prt);
Shashank Mittal246f8d02011-01-21 17:12:27 -0800247 ASSERT(len >= 0);
248 }
249 next_ptr_start_adr = ptn->start + len;
250 ptable_add(&flash_ptable, ptn->name, offset + ptn->start,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800251 len, ptn->flags, TYPE_APPS_PARTITION,
252 PERM_WRITEABLE);
Shashank Mittal246f8d02011-01-21 17:12:27 -0800253 }
254
255 smem_add_modem_partitions(&flash_ptable);
256
257 ptable_dump(&flash_ptable);
258 flash_set_ptable(&flash_ptable);
259}
Shashank Mittalcb25d252011-04-05 12:13:30 -0700260void board_info(void)
261{
262 struct smem_board_info_v4 board_info_v4;
263 unsigned int board_info_len = 0;
264 unsigned smem_status;
265 unsigned format = 0;
266 unsigned id = 0;
267
268 if (hw_platform && target_msm_id)
269 return;
270
271 hw_platform = MSM7X27A_SURF;
272 target_msm_id = MSM7225A;
273
274 smem_status = smem_read_alloc_entry_offset(SMEM_BOARD_INFO_LOCATION,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800275 &format, sizeof(format), 0);
276 if (!smem_status) {
277 if (format == 4) {
Shashank Mittalcb25d252011-04-05 12:13:30 -0700278 board_info_len = sizeof(board_info_v4);
Ajay Dudanib01e5062011-12-03 23:23:42 -0800279 smem_status =
280 smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
281 &board_info_v4,
282 board_info_len);
283 if (!smem_status) {
Shashank Mittalcb25d252011-04-05 12:13:30 -0700284 id = board_info_v4.board_info_v3.hw_platform;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800285 target_msm_id =
286 board_info_v4.board_info_v3.msm_id;
Aparna Mallavarapuc1eb99b2012-09-24 20:13:42 +0530287 msm_version =
288 board_info_v4.board_info_v3.msm_version;
Shashank Mittalcb25d252011-04-05 12:13:30 -0700289 }
290 }
291
Channagoud Kadabi4c41c412011-09-08 15:38:30 +0530292 /* Detect SURF v/s FFA v/s QRD */
Aparna Mallavarapu51879412012-08-27 12:55:50 +0530293 if (target_msm_id >= MSM8225 && target_msm_id <= MSM8625
294 || (target_msm_id == MSM8125A)) {
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530295 switch (id) {
296 case 0x1:
297 hw_platform = MSM8X25_SURF;
298 break;
Aparna Mallavarapu1bb33672012-04-20 16:07:24 +0530299 case 0x2:
300 hw_platform = MSM8X25_FFA;
301 break;
Aparna Mallavarapubac9a722012-05-22 10:15:29 +0530302 case 0x10:
Aparna Mallavarapu287d89c2012-05-11 14:27:03 +0530303 hw_platform = MSM8X25_EVT;
304 break;
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530305 case 0xC:
306 hw_platform = MSM8X25_EVB;
307 break;
Aparna Mallavarapuac332982012-03-18 14:02:38 +0530308 case 0xF:
309 hw_platform = MSM8X25_QRD7;
310 break;
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530311 default:
312 hw_platform = MSM8X25_SURF;
313 }
314 } else {
315 switch (id) {
316 case 0x1:
317 /* Set the machine type based on msm ID */
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530318 if (msm_is_7x25a(target_msm_id))
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530319 hw_platform = MSM7X25A_SURF;
Channagoud Kadabi849ad5e2012-04-02 23:21:21 +0530320 else
321 hw_platform = MSM7X27A_SURF;
322 break;
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530323 case 0x2:
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530324 if (msm_is_7x25a(target_msm_id))
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530325 hw_platform = MSM7X25A_FFA;
Channagoud Kadabi849ad5e2012-04-02 23:21:21 +0530326 else
327 hw_platform = MSM7X27A_FFA;
328 break;
329 case 0xB:
330 if(target_is_emmc_boot())
331 hw_platform = MSM7X27A_QRD1;
332 else
333 hw_platform = MSM7X27A_QRD3;
334 break;
335 case 0xC:
336 hw_platform = MSM7X27A_EVB;
337 break;
338 case 0xF:
Channagoud Kadabib33d4832012-02-06 17:10:56 +0530339 hw_platform = MSM7X27A_QRD3;
Channagoud Kadabi849ad5e2012-04-02 23:21:21 +0530340 break;
341 default:
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530342 if (msm_is_7x25a(target_msm_id))
Channagoud Kadabi849ad5e2012-04-02 23:21:21 +0530343 hw_platform = MSM7X25A_SURF;
344 else
345 hw_platform = MSM7X27A_SURF;
346 };
347 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800348 /* Set msm ID for target variants based on values read from smem */
349 switch (target_msm_id) {
350 case MSM7225A:
351 case MSM7625A:
352 case ESM7225A:
353 case MSM7225AA:
354 case MSM7625AA:
355 case ESM7225AA:
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530356 case MSM7225AB:
357 case MSM7625AB:
358 case ESM7225AB:
Channagoud Kadabi647f0852012-06-08 11:51:45 +0530359 case MSM7125A:
Ajay Dudanib01e5062011-12-03 23:23:42 -0800360 target_msm_id = MSM7625A;
361 break;
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530362 case MSM8225:
363 case MSM8625:
Aparna Mallavarapu51879412012-08-27 12:55:50 +0530364 case MSM8125A:
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530365 target_msm_id = MSM8625;
366 break;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800367 default:
368 target_msm_id = MSM7627A;
Shashank Mittalcb25d252011-04-05 12:13:30 -0700369 }
370 }
371 return;
372}
373
Shashank Mittal246f8d02011-01-21 17:12:27 -0800374unsigned board_machtype(void)
375{
Shashank Mittalcb25d252011-04-05 12:13:30 -0700376 board_info();
377 return hw_platform;
378}
379
380unsigned board_msm_id(void)
381{
382 board_info();
383 return target_msm_id;
Shashank Mittal246f8d02011-01-21 17:12:27 -0800384}
385
Aparna Mallavarapuc1eb99b2012-09-24 20:13:42 +0530386unsigned board_msm_version(void)
387{
388 board_info();
389 msm_version = (msm_version & 0xffff0000) >> 16;
390 return msm_version;
391}
392
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -0800393crypto_engine_type board_ce_type(void)
394{
395 return platform_ce_type;
396}
397
Shashank Mittal246f8d02011-01-21 17:12:27 -0800398void reboot_device(unsigned reboot_reason)
399{
400 reboot(reboot_reason);
401}
402
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530403static int read_from_flash(struct ptentry* ptn, int offset, int size, void *dest)
404{
405 void *buffer = NULL;
406 unsigned page_size = flash_page_size();
407 unsigned page_mask = page_size - 1;
408 int read_size = (size + page_mask) & (~page_mask);
409
410 buffer = malloc(read_size);
411 if(!buffer){
412 dprintf(CRITICAL, "ERROR : Malloc failed for read_from_flash \n");
413 return -1;
414 }
415
416 if(flash_read(ptn, offset, buffer, read_size)){
417 dprintf(CRITICAL, "ERROR : Flash read failed \n");
418 return -1;
419 }
420 memcpy(dest, buffer, size);
421 free(buffer);
422 return 0;
423}
424
425static unsigned int get_fota_cookie_mtd(void)
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530426{
427 struct ptentry *ptn;
428 struct ptable *ptable;
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530429 unsigned int cookie = 0;
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530430
431 ptable = flash_get_ptable();
432 if (ptable == NULL) {
433 dprintf(CRITICAL, "ERROR: Partition table not found\n");
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530434 return 0;
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530435 }
436
437 ptn = ptable_find(ptable, "FOTA");
438 if (ptn == NULL) {
439 dprintf(CRITICAL, "ERROR: No FOTA partition found\n");
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530440 return 0;
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530441 }
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530442
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530443 if (read_from_flash(ptn, 0, sizeof(unsigned int), &cookie) == -1) {
444 dprintf(CRITICAL, "ERROR: failed to read fota cookie from flash\n");
445 return 0;
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530446 }
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530447 return cookie;
448}
449
450static int read_from_mmc(struct ptentry* ptn, int size, void *dest)
451{
452 void *buffer = NULL;
453 unsigned sector_mask = 511;
454 int read_size = (size + sector_mask) & (~sector_mask);
455
456 buffer = malloc(read_size);
457 if(!buffer){
458 dprintf(CRITICAL, "ERROR : Malloc failed for read_from_flash \n");
459 return -1;
460 }
461
462 if(mmc_read(ptn, buffer, read_size)) {
463 dprintf(CRITICAL, "ERROR : Flash read failed \n");
464 return -1;
465 }
466 memcpy(dest, buffer, size);
467 free(buffer);
468 return 0;
469}
470
471static int get_fota_cookie_mmc(void)
472{
473 unsigned long long ptn = 0;
474 int index = -1;
475 unsigned int cookie = 0;
476
477 index = partition_get_index("FOTA");
478 ptn = partition_get_offset(index);
479
480 if(ptn == 0) {
481 dprintf(CRITICAL,"ERROR: FOTA partition not found\n");
482 return 0;
483 }
484 if(read_from_mmc(ptn, sizeof(unsigned int), &cookie)) {
485 dprintf(CRITICAL, "ERROR: Cannot read cookie info\n");
486 return 0;
487 }
488 return cookie;
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530489}
490
Shashank Mittal246f8d02011-01-21 17:12:27 -0800491unsigned check_reboot_mode(void)
492{
Ajay Dudanib01e5062011-12-03 23:23:42 -0800493 unsigned mode[2] = { 0, 0 };
Shashank Mittal246f8d02011-01-21 17:12:27 -0800494 unsigned int mode_len = sizeof(mode);
495 unsigned smem_status;
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530496 unsigned int cookie = 0;
Shashank Mittal246f8d02011-01-21 17:12:27 -0800497
498 smem_status = smem_read_alloc_entry(SMEM_APPS_BOOT_MODE,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800499 &mode, mode_len);
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530500
501 /*
502 * SMEM value is relied upon on power shutdown. Check either of SMEM
503 * or FOTA update cookie is set
504 */
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530505 if (target_is_emmc_boot())
506 cookie = get_fota_cookie_mmc();
507 else
508 cookie = get_fota_cookie_mtd();
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530509
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530510 if ((mode[0] == RECOVERY_MODE) || (cookie == FOTA_COOKIE))
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530511 return RECOVERY_MODE;
512
Ajay Dudanib01e5062011-12-03 23:23:42 -0800513 if (smem_status) {
514 dprintf(CRITICAL,
515 "ERROR: unable to read shared memory for reboot mode\n");
516 return 0;
Shashank Mittal246f8d02011-01-21 17:12:27 -0800517 }
518 return mode[0];
519}
520
521static unsigned target_check_power_on_reason(void)
522{
523 unsigned power_on_status = 0;
524 unsigned int status_len = sizeof(power_on_status);
525 unsigned smem_status;
526
527 smem_status = smem_read_alloc_entry(SMEM_POWER_ON_STATUS_INFO,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800528 &power_on_status, status_len);
529 if (smem_status) {
530 dprintf(CRITICAL,
531 "ERROR: unable to read shared memory for power on reason\n");
Shashank Mittal246f8d02011-01-21 17:12:27 -0800532 }
533
534 return power_on_status;
535}
536
537unsigned target_pause_for_battery_charge(void)
538{
Ajay Dudaniba822332011-11-25 13:37:31 -0800539 if (target_check_power_on_reason() == PWR_ON_EVENT_WALL_CHG)
Shashank Mittal246f8d02011-01-21 17:12:27 -0800540 return 1;
541 return 0;
542}
543
544void target_battery_charging_enable(unsigned enable, unsigned disconnect)
545{
546}
Shashank Mittal59392f32011-05-01 20:49:56 -0700547
548#if _EMMC_BOOT
549void target_serialno(unsigned char *buf)
550{
551 unsigned int serialno;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800552 serialno = mmc_get_psn();
553 sprintf(buf, "%x", serialno);
Shashank Mittal59392f32011-05-01 20:49:56 -0700554}
Subbaraman Narayanamurthy0e445b02011-06-19 21:34:46 -0700555
556int emmc_recovery_init(void)
557{
558 int rc;
559 rc = _emmc_recovery_init();
560 return rc;
561}
Shashank Mittal59392f32011-05-01 20:49:56 -0700562#endif
Channagoud Kadabid53664b2011-12-28 16:39:15 +0530563
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530564int machine_is_evb()
Channagoud Kadabid53664b2011-12-28 16:39:15 +0530565{
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530566 int ret = 0;
567 unsigned mach_type = board_machtype();
568
569 switch(mach_type) {
570 case MSM7X27A_EVB:
571 case MSM8X25_EVB:
Aparna Mallavarapu287d89c2012-05-11 14:27:03 +0530572 case MSM8X25_EVT:
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530573 ret = 1;
574 break;
575 default:
576 ret = 0;
577 }
578 return ret;
Channagoud Kadabid53664b2011-12-28 16:39:15 +0530579}
Aparna Mallavarapuac332982012-03-18 14:02:38 +0530580int machine_is_qrd()
Channagoud Kadabib33d4832012-02-06 17:10:56 +0530581{
Aparna Mallavarapuac332982012-03-18 14:02:38 +0530582 int ret = 0;
583 unsigned mach_type = board_machtype();
Channagoud Kadabib33d4832012-02-06 17:10:56 +0530584
Aparna Mallavarapuac332982012-03-18 14:02:38 +0530585 switch(mach_type) {
586 case MSM7X27A_QRD1:
587 case MSM7X27A_QRD3:
588 case MSM8X25_QRD7:
589 ret = 1;
590 break;
591 default:
592 ret = 0;
593 }
594 return ret;
Channagoud Kadabib33d4832012-02-06 17:10:56 +0530595}
Channagoud Kadabi81ba1102011-10-01 16:37:59 +0530596int machine_is_8x25()
597{
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530598 int ret = 0;
599 unsigned mach_type = board_machtype();
600
601 switch(mach_type) {
602 case MSM8X25_SURF:
Aparna Mallavarapu1bb33672012-04-20 16:07:24 +0530603 case MSM8X25_FFA:
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530604 case MSM8X25_EVB:
Aparna Mallavarapu287d89c2012-05-11 14:27:03 +0530605 case MSM8X25_EVT:
Aparna Mallavarapuac332982012-03-18 14:02:38 +0530606 case MSM8X25_QRD7:
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530607 ret = 1;
608 break;
609 default:
610 ret = 0;
611 }
612 return ret;
Channagoud Kadabi81ba1102011-10-01 16:37:59 +0530613}
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530614
615int msm_is_7x25a(int msm_id)
616{
617 int ret = 0;
618
619 switch (msm_id) {
620 case MSM7225A:
621 case MSM7625A:
622 case ESM7225A:
623 case MSM7225AA:
624 case MSM7625AA:
625 case ESM7225AA:
626 case MSM7225AB:
627 case MSM7625AB:
628 case ESM7225AB:
Channagoud Kadabi647f0852012-06-08 11:51:45 +0530629 case MSM7125A:
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530630 ret = 1;
631 break;
632 default:
633 ret = 0;
634 };
635 return ret;
636}
Amol Jadida118b92012-07-06 19:53:18 -0700637
638static void target_ulpi_init(void)
639{
640 unsigned int reg;
641
642 ulpi_read(0x31);
643 dprintf(INFO, " Value of ulpi read 0x31 is %08x\n", reg);
644 /* todo : the write back value should be calculated according to
645 * reg &= 0xF3 but sometimes the value that is read initially
646 * doesnt look right
647 */
648 ulpi_write(0x4A, 0x31);
649 reg = ulpi_read(0x31);
650 dprintf(INFO, " Value of ulpi read 0x31 after write is %08x\n", reg);
651
652 reg = ulpi_read(0x32);
653 dprintf(INFO, " Value of ulpi read 0x32 is %08x\n", reg);
654 ulpi_write(0x30, 0x32);
655 reg = ulpi_read(0x32);
656 dprintf(INFO, " Value of ulpi read 0x32 after write is %08x\n", reg);
657
658 reg = ulpi_read(0x36);
659 dprintf(INFO, " Value of ulpi read 0x36 is %08x\n", reg);
660 ulpi_write(reg | 0x2, 0x36);
661 reg = ulpi_read(0x36);
662 dprintf(INFO, " Value of ulpi read 0x36 after write is %08x\n", reg);
663}
664
665void target_usb_init(void)
666{
667 target_ulpi_init();
668}
Channagoud Kadabif2488462012-06-12 15:22:48 +0530669
670int target_cont_splash_screen()
671{
672 int ret = 0;
673 unsigned mach_type = 0;
674
675 mach_type = board_machtype();
676
677 switch(mach_type) {
678 case MSM8X25_EVB:
679 case MSM8X25_EVT:
Channagoud Kadabicdda0fe2012-07-13 11:44:28 +0530680 case MSM8X25_QRD7:
Channagoud Kadabif2488462012-06-12 15:22:48 +0530681 ret = 1;
682 break;
683 default:
684 ret = 0;
685 };
686 return ret;
687}
Channagoud Kadabib3e08032012-09-25 16:04:16 +0530688
689int target_is_sku3()
690{
691 int ret = 0;
692 unsigned mach_type = 0;
693
694 mach_type = board_machtype();
695
696 switch(mach_type) {
697 case MSM7X27A_QRD3:
698 ret = 1;
699 break;
700 default:
701 ret = 0;
702 };
703 return ret;
704}