blob: 41c96115047f546be2406bba5dbd86b139b7dd3c [file] [log] [blame]
Shashank Mittal246f8d02011-01-21 17:12:27 -08001/*
2 * Copyright (c) 2009, Google Inc.
3 * All rights reserved.
Aravind Venkateswarandd50c1a2014-02-25 14:42:43 -08004 * Copyright (c) 2009-2014, The Linux Foundation. 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
Ajay Dudanib01e5062011-12-03 23:23:42 -0800189 if (target_is_emmc_boot()) {
Amol Jadi2dfe3392011-07-19 16:03:37 -0700190 /* Must wait for modem-up before we can intialize MMC.
191 */
Ajay Dudanib01e5062011-12-03 23:23:42 -0800192 while (readl(MSM_SHARED_BASE + 0x14) != 1) ;
Amol Jadi2dfe3392011-07-19 16:03:37 -0700193
Ajay Dudanib01e5062011-12-03 23:23:42 -0800194 if (mmc_boot_main(MMC_SLOT, MSM_SDC3_BASE)) {
Shashank Mittal246f8d02011-01-21 17:12:27 -0800195 dprintf(CRITICAL, "mmc init failed!");
196 ASSERT(0);
197 }
198 return;
199 }
200
201 ptable_init(&flash_ptable);
202 smem_ptable_init();
203
204 flash_init();
205 flash_info = flash_get_info();
206 ASSERT(flash_info);
207
208 offset = smem_get_apps_flash_start();
209 if (offset == 0xffffffff)
Ajay Dudanib01e5062011-12-03 23:23:42 -0800210 while (1) ;
Shashank Mittal246f8d02011-01-21 17:12:27 -0800211
212 total_num_of_blocks = flash_info->num_blocks;
213 blocks_per_1MB = (1 << 20) / (flash_info->block_size);
214
Channagoud Kadabib3e08032012-09-25 16:04:16 +0530215 if (target_is_sku3())
216 board_part_list = board_part_list_sku3;
217 else
218 board_part_list = board_part_list_default;
219
Shashank Mittal246f8d02011-01-21 17:12:27 -0800220 for (i = 0; i < num_parts; i++) {
221 struct ptentry *ptn = &board_part_list[i];
222 unsigned len = ((ptn->length) * blocks_per_1MB);
223
Ajay Dudanib01e5062011-12-03 23:23:42 -0800224 if (ptn->start != 0)
225 ASSERT(ptn->start == DIFF_START_ADDR);
Shashank Mittal246f8d02011-01-21 17:12:27 -0800226
227 ptn->start = next_ptr_start_adr;
228
Ajay Dudanib01e5062011-12-03 23:23:42 -0800229 if (ptn->length == VARIABLE_LENGTH) {
Shashank Mittal246f8d02011-01-21 17:12:27 -0800230 unsigned length_for_prt = 0;
231 unsigned j;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800232 for (j = i + 1; j < num_parts; j++) {
233 struct ptentry *temp_ptn = &board_part_list[j];
234 ASSERT(temp_ptn->length != VARIABLE_LENGTH);
235 length_for_prt +=
236 ((temp_ptn->length) * blocks_per_1MB);
Shashank Mittal246f8d02011-01-21 17:12:27 -0800237 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800238 len =
239 (total_num_of_blocks - 1) - (offset + ptn->start +
240 length_for_prt);
Shashank Mittal246f8d02011-01-21 17:12:27 -0800241 ASSERT(len >= 0);
242 }
243 next_ptr_start_adr = ptn->start + len;
244 ptable_add(&flash_ptable, ptn->name, offset + ptn->start,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800245 len, ptn->flags, TYPE_APPS_PARTITION,
246 PERM_WRITEABLE);
Shashank Mittal246f8d02011-01-21 17:12:27 -0800247 }
248
249 smem_add_modem_partitions(&flash_ptable);
250
251 ptable_dump(&flash_ptable);
252 flash_set_ptable(&flash_ptable);
253}
Shashank Mittalcb25d252011-04-05 12:13:30 -0700254void board_info(void)
255{
256 struct smem_board_info_v4 board_info_v4;
257 unsigned int board_info_len = 0;
258 unsigned smem_status;
259 unsigned format = 0;
260 unsigned id = 0;
261
262 if (hw_platform && target_msm_id)
263 return;
264
265 hw_platform = MSM7X27A_SURF;
266 target_msm_id = MSM7225A;
267
268 smem_status = smem_read_alloc_entry_offset(SMEM_BOARD_INFO_LOCATION,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800269 &format, sizeof(format), 0);
270 if (!smem_status) {
271 if (format == 4) {
Shashank Mittalcb25d252011-04-05 12:13:30 -0700272 board_info_len = sizeof(board_info_v4);
Ajay Dudanib01e5062011-12-03 23:23:42 -0800273 smem_status =
274 smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
275 &board_info_v4,
276 board_info_len);
277 if (!smem_status) {
Shashank Mittalcb25d252011-04-05 12:13:30 -0700278 id = board_info_v4.board_info_v3.hw_platform;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800279 target_msm_id =
280 board_info_v4.board_info_v3.msm_id;
Aparna Mallavarapuc1eb99b2012-09-24 20:13:42 +0530281 msm_version =
282 board_info_v4.board_info_v3.msm_version;
Shashank Mittalcb25d252011-04-05 12:13:30 -0700283 }
284 }
285
Channagoud Kadabi4c41c412011-09-08 15:38:30 +0530286 /* Detect SURF v/s FFA v/s QRD */
Aparna Mallavarapu51879412012-08-27 12:55:50 +0530287 if (target_msm_id >= MSM8225 && target_msm_id <= MSM8625
Aparna Mallavarapu11e72872012-10-11 15:57:05 +0530288 || (target_msm_id == MSM8125A)
289 || (target_msm_id == MSM8125)) {
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530290 switch (id) {
291 case 0x1:
292 hw_platform = MSM8X25_SURF;
293 break;
Aparna Mallavarapu1bb33672012-04-20 16:07:24 +0530294 case 0x2:
295 hw_platform = MSM8X25_FFA;
296 break;
Aparna Mallavarapubac9a722012-05-22 10:15:29 +0530297 case 0x10:
Aparna Mallavarapu287d89c2012-05-11 14:27:03 +0530298 hw_platform = MSM8X25_EVT;
299 break;
Aparna Mallavarapu332887b2012-10-11 15:51:26 +0530300 case 0x11:
301 hw_platform = MSM8X25Q_SKUD;
302 break;
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530303 case 0xC:
304 hw_platform = MSM8X25_EVB;
305 break;
Aparna Mallavarapuac332982012-03-18 14:02:38 +0530306 case 0xF:
307 hw_platform = MSM8X25_QRD7;
308 break;
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530309 default:
310 hw_platform = MSM8X25_SURF;
311 }
312 } else {
313 switch (id) {
314 case 0x1:
315 /* Set the machine type based on msm ID */
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530316 if (msm_is_7x25a(target_msm_id))
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530317 hw_platform = MSM7X25A_SURF;
Channagoud Kadabi849ad5e2012-04-02 23:21:21 +0530318 else
319 hw_platform = MSM7X27A_SURF;
320 break;
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530321 case 0x2:
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530322 if (msm_is_7x25a(target_msm_id))
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530323 hw_platform = MSM7X25A_FFA;
Channagoud Kadabi849ad5e2012-04-02 23:21:21 +0530324 else
325 hw_platform = MSM7X27A_FFA;
326 break;
327 case 0xB:
328 if(target_is_emmc_boot())
329 hw_platform = MSM7X27A_QRD1;
330 else
331 hw_platform = MSM7X27A_QRD3;
332 break;
333 case 0xC:
334 hw_platform = MSM7X27A_EVB;
335 break;
336 case 0xF:
Channagoud Kadabib33d4832012-02-06 17:10:56 +0530337 hw_platform = MSM7X27A_QRD3;
Channagoud Kadabi849ad5e2012-04-02 23:21:21 +0530338 break;
339 default:
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530340 if (msm_is_7x25a(target_msm_id))
Channagoud Kadabi849ad5e2012-04-02 23:21:21 +0530341 hw_platform = MSM7X25A_SURF;
342 else
343 hw_platform = MSM7X27A_SURF;
344 };
345 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800346 /* Set msm ID for target variants based on values read from smem */
347 switch (target_msm_id) {
348 case MSM7225A:
349 case MSM7625A:
350 case ESM7225A:
351 case MSM7225AA:
352 case MSM7625AA:
353 case ESM7225AA:
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530354 case MSM7225AB:
355 case MSM7625AB:
356 case ESM7225AB:
Channagoud Kadabi647f0852012-06-08 11:51:45 +0530357 case MSM7125A:
Ajay Dudanib01e5062011-12-03 23:23:42 -0800358 target_msm_id = MSM7625A;
359 break;
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530360 case MSM8225:
361 case MSM8625:
Aparna Mallavarapu51879412012-08-27 12:55:50 +0530362 case MSM8125A:
Aparna Mallavarapu11e72872012-10-11 15:57:05 +0530363 case MSM8125:
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530364 target_msm_id = MSM8625;
365 break;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800366 default:
367 target_msm_id = MSM7627A;
Shashank Mittalcb25d252011-04-05 12:13:30 -0700368 }
369 }
370 return;
371}
372
Shashank Mittal246f8d02011-01-21 17:12:27 -0800373unsigned board_machtype(void)
374{
Shashank Mittalcb25d252011-04-05 12:13:30 -0700375 board_info();
376 return hw_platform;
377}
378
379unsigned board_msm_id(void)
380{
381 board_info();
382 return target_msm_id;
Shashank Mittal246f8d02011-01-21 17:12:27 -0800383}
384
Aparna Mallavarapuc1eb99b2012-09-24 20:13:42 +0530385unsigned board_msm_version(void)
386{
387 board_info();
388 msm_version = (msm_version & 0xffff0000) >> 16;
389 return msm_version;
390}
391
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -0800392crypto_engine_type board_ce_type(void)
393{
394 return platform_ce_type;
395}
396
Shashank Mittal246f8d02011-01-21 17:12:27 -0800397void reboot_device(unsigned reboot_reason)
398{
399 reboot(reboot_reason);
400}
401
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530402static int read_from_flash(struct ptentry* ptn, int offset, int size, void *dest)
403{
404 void *buffer = NULL;
405 unsigned page_size = flash_page_size();
406 unsigned page_mask = page_size - 1;
407 int read_size = (size + page_mask) & (~page_mask);
408
409 buffer = malloc(read_size);
410 if(!buffer){
411 dprintf(CRITICAL, "ERROR : Malloc failed for read_from_flash \n");
412 return -1;
413 }
414
415 if(flash_read(ptn, offset, buffer, read_size)){
416 dprintf(CRITICAL, "ERROR : Flash read failed \n");
417 return -1;
418 }
419 memcpy(dest, buffer, size);
420 free(buffer);
421 return 0;
422}
423
424static unsigned int get_fota_cookie_mtd(void)
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530425{
426 struct ptentry *ptn;
427 struct ptable *ptable;
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530428 unsigned int cookie = 0;
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530429
430 ptable = flash_get_ptable();
431 if (ptable == NULL) {
432 dprintf(CRITICAL, "ERROR: Partition table not found\n");
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530433 return 0;
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530434 }
435
436 ptn = ptable_find(ptable, "FOTA");
437 if (ptn == NULL) {
438 dprintf(CRITICAL, "ERROR: No FOTA partition found\n");
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530439 return 0;
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530440 }
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530441
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530442 if (read_from_flash(ptn, 0, sizeof(unsigned int), &cookie) == -1) {
443 dprintf(CRITICAL, "ERROR: failed to read fota cookie from flash\n");
444 return 0;
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530445 }
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530446 return cookie;
447}
448
449static int read_from_mmc(struct ptentry* ptn, int size, void *dest)
450{
451 void *buffer = NULL;
452 unsigned sector_mask = 511;
453 int read_size = (size + sector_mask) & (~sector_mask);
454
455 buffer = malloc(read_size);
456 if(!buffer){
457 dprintf(CRITICAL, "ERROR : Malloc failed for read_from_flash \n");
458 return -1;
459 }
460
461 if(mmc_read(ptn, buffer, read_size)) {
462 dprintf(CRITICAL, "ERROR : Flash read failed \n");
463 return -1;
464 }
465 memcpy(dest, buffer, size);
466 free(buffer);
467 return 0;
468}
469
470static int get_fota_cookie_mmc(void)
471{
472 unsigned long long ptn = 0;
473 int index = -1;
474 unsigned int cookie = 0;
475
476 index = partition_get_index("FOTA");
477 ptn = partition_get_offset(index);
478
479 if(ptn == 0) {
480 dprintf(CRITICAL,"ERROR: FOTA partition not found\n");
481 return 0;
482 }
483 if(read_from_mmc(ptn, sizeof(unsigned int), &cookie)) {
484 dprintf(CRITICAL, "ERROR: Cannot read cookie info\n");
485 return 0;
486 }
487 return cookie;
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530488}
489
Shashank Mittal246f8d02011-01-21 17:12:27 -0800490unsigned check_reboot_mode(void)
491{
Ajay Dudanib01e5062011-12-03 23:23:42 -0800492 unsigned mode[2] = { 0, 0 };
Shashank Mittal246f8d02011-01-21 17:12:27 -0800493 unsigned int mode_len = sizeof(mode);
494 unsigned smem_status;
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530495 unsigned int cookie = 0;
Shashank Mittal246f8d02011-01-21 17:12:27 -0800496
497 smem_status = smem_read_alloc_entry(SMEM_APPS_BOOT_MODE,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800498 &mode, mode_len);
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530499
500 /*
501 * SMEM value is relied upon on power shutdown. Check either of SMEM
502 * or FOTA update cookie is set
503 */
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530504 if (target_is_emmc_boot())
505 cookie = get_fota_cookie_mmc();
506 else
507 cookie = get_fota_cookie_mtd();
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530508
Channagoud Kadabi16f50952012-04-02 16:24:07 +0530509 if ((mode[0] == RECOVERY_MODE) || (cookie == FOTA_COOKIE))
Channagoud Kadabi16da3a22011-10-24 20:25:07 +0530510 return RECOVERY_MODE;
511
Ajay Dudanib01e5062011-12-03 23:23:42 -0800512 if (smem_status) {
513 dprintf(CRITICAL,
514 "ERROR: unable to read shared memory for reboot mode\n");
515 return 0;
Shashank Mittal246f8d02011-01-21 17:12:27 -0800516 }
517 return mode[0];
518}
519
520static unsigned target_check_power_on_reason(void)
521{
522 unsigned power_on_status = 0;
523 unsigned int status_len = sizeof(power_on_status);
524 unsigned smem_status;
525
526 smem_status = smem_read_alloc_entry(SMEM_POWER_ON_STATUS_INFO,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800527 &power_on_status, status_len);
528 if (smem_status) {
529 dprintf(CRITICAL,
530 "ERROR: unable to read shared memory for power on reason\n");
Shashank Mittal246f8d02011-01-21 17:12:27 -0800531 }
532
533 return power_on_status;
534}
535
536unsigned target_pause_for_battery_charge(void)
537{
Ajay Dudaniba822332011-11-25 13:37:31 -0800538 if (target_check_power_on_reason() == PWR_ON_EVENT_WALL_CHG)
Shashank Mittal246f8d02011-01-21 17:12:27 -0800539 return 1;
540 return 0;
541}
542
543void target_battery_charging_enable(unsigned enable, unsigned disconnect)
544{
545}
Shashank Mittal59392f32011-05-01 20:49:56 -0700546
547#if _EMMC_BOOT
548void target_serialno(unsigned char *buf)
549{
550 unsigned int serialno;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800551 serialno = mmc_get_psn();
552 sprintf(buf, "%x", serialno);
Shashank Mittal59392f32011-05-01 20:49:56 -0700553}
Subbaraman Narayanamurthy0e445b02011-06-19 21:34:46 -0700554
555int emmc_recovery_init(void)
556{
557 int rc;
558 rc = _emmc_recovery_init();
559 return rc;
560}
Shashank Mittal59392f32011-05-01 20:49:56 -0700561#endif
Channagoud Kadabid53664b2011-12-28 16:39:15 +0530562
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530563int machine_is_evb()
Channagoud Kadabid53664b2011-12-28 16:39:15 +0530564{
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530565 int ret = 0;
566 unsigned mach_type = board_machtype();
567
568 switch(mach_type) {
569 case MSM7X27A_EVB:
570 case MSM8X25_EVB:
Aparna Mallavarapu287d89c2012-05-11 14:27:03 +0530571 case MSM8X25_EVT:
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530572 ret = 1;
573 break;
574 default:
575 ret = 0;
576 }
577 return ret;
Channagoud Kadabid53664b2011-12-28 16:39:15 +0530578}
Aparna Mallavarapuac332982012-03-18 14:02:38 +0530579int machine_is_qrd()
Channagoud Kadabib33d4832012-02-06 17:10:56 +0530580{
Aparna Mallavarapuac332982012-03-18 14:02:38 +0530581 int ret = 0;
582 unsigned mach_type = board_machtype();
Channagoud Kadabib33d4832012-02-06 17:10:56 +0530583
Aparna Mallavarapuac332982012-03-18 14:02:38 +0530584 switch(mach_type) {
585 case MSM7X27A_QRD1:
586 case MSM7X27A_QRD3:
587 case MSM8X25_QRD7:
588 ret = 1;
589 break;
590 default:
591 ret = 0;
592 }
593 return ret;
Channagoud Kadabib33d4832012-02-06 17:10:56 +0530594}
Aparna Mallavarapu332887b2012-10-11 15:51:26 +0530595int machine_is_skud()
596{
597 int ret = 0;
598 unsigned mach_type = board_machtype();
599
600 switch(mach_type) {
601 case MSM8X25Q_SKUD:
602 ret = 1;
603 break;
604 default:
605 ret = 0;
606 }
607 return ret;
608}
Channagoud Kadabi81ba1102011-10-01 16:37:59 +0530609int machine_is_8x25()
610{
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530611 int ret = 0;
612 unsigned mach_type = board_machtype();
613
614 switch(mach_type) {
615 case MSM8X25_SURF:
Aparna Mallavarapu1bb33672012-04-20 16:07:24 +0530616 case MSM8X25_FFA:
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530617 case MSM8X25_EVB:
Aparna Mallavarapu287d89c2012-05-11 14:27:03 +0530618 case MSM8X25_EVT:
Aparna Mallavarapuac332982012-03-18 14:02:38 +0530619 case MSM8X25_QRD7:
Aparna Mallavarapu332887b2012-10-11 15:51:26 +0530620 case MSM8X25Q_SKUD:
Channagoud Kadabi3acfb742011-11-15 18:19:32 +0530621 ret = 1;
622 break;
623 default:
624 ret = 0;
625 }
626 return ret;
Channagoud Kadabi81ba1102011-10-01 16:37:59 +0530627}
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530628
629int msm_is_7x25a(int msm_id)
630{
631 int ret = 0;
632
633 switch (msm_id) {
634 case MSM7225A:
635 case MSM7625A:
636 case ESM7225A:
637 case MSM7225AA:
638 case MSM7625AA:
639 case ESM7225AA:
640 case MSM7225AB:
641 case MSM7625AB:
642 case ESM7225AB:
Channagoud Kadabi647f0852012-06-08 11:51:45 +0530643 case MSM7125A:
Channagoud Kadabibd14e2f2012-05-03 22:54:50 +0530644 ret = 1;
645 break;
646 default:
647 ret = 0;
648 };
649 return ret;
650}
Amol Jadida118b92012-07-06 19:53:18 -0700651
652static void target_ulpi_init(void)
653{
654 unsigned int reg;
655
656 ulpi_read(0x31);
657 dprintf(INFO, " Value of ulpi read 0x31 is %08x\n", reg);
658 /* todo : the write back value should be calculated according to
659 * reg &= 0xF3 but sometimes the value that is read initially
660 * doesnt look right
661 */
662 ulpi_write(0x4A, 0x31);
663 reg = ulpi_read(0x31);
664 dprintf(INFO, " Value of ulpi read 0x31 after write is %08x\n", reg);
665
666 reg = ulpi_read(0x32);
667 dprintf(INFO, " Value of ulpi read 0x32 is %08x\n", reg);
668 ulpi_write(0x30, 0x32);
669 reg = ulpi_read(0x32);
670 dprintf(INFO, " Value of ulpi read 0x32 after write is %08x\n", reg);
671
672 reg = ulpi_read(0x36);
673 dprintf(INFO, " Value of ulpi read 0x36 is %08x\n", reg);
674 ulpi_write(reg | 0x2, 0x36);
675 reg = ulpi_read(0x36);
676 dprintf(INFO, " Value of ulpi read 0x36 after write is %08x\n", reg);
677}
678
679void target_usb_init(void)
680{
681 target_ulpi_init();
682}
Channagoud Kadabif2488462012-06-12 15:22:48 +0530683
684int target_cont_splash_screen()
685{
686 int ret = 0;
687 unsigned mach_type = 0;
688
689 mach_type = board_machtype();
690
691 switch(mach_type) {
692 case MSM8X25_EVB:
693 case MSM8X25_EVT:
Channagoud Kadabicdda0fe2012-07-13 11:44:28 +0530694 case MSM8X25_QRD7:
Channagoud Kadabif2488462012-06-12 15:22:48 +0530695 ret = 1;
696 break;
697 default:
698 ret = 0;
699 };
700 return ret;
701}
Channagoud Kadabib3e08032012-09-25 16:04:16 +0530702
703int target_is_sku3()
704{
705 int ret = 0;
706 unsigned mach_type = 0;
707
708 mach_type = board_machtype();
709
710 switch(mach_type) {
711 case MSM7X27A_QRD3:
712 ret = 1;
713 break;
714 default:
715 ret = 0;
716 };
717 return ret;
718}
Channagoud Kadabibfdadc62013-05-08 13:05:12 -0700719
720/* Function to set the capabilities for the host */
721void target_mmc_caps(struct mmc_host *host)
722{
723 host->caps.ddr_mode = 0;
724 host->caps.hs200_mode = 0;
725 host->caps.bus_width = MMC_BOOT_BUS_WIDTH_4_BIT;
726 host->caps.hs_clk_rate = MMC_CLK_50MHZ;
727}