Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2009, Google Inc. |
| 3 | * All rights reserved. |
Subbaraman Narayanamurthy | f17b4ae | 2011-02-16 20:19:56 -0800 | [diff] [blame] | 4 | * Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved. |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 5 | * |
| 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 Uddaraju | 14e57eb | 2010-06-28 12:11:06 -0700 | [diff] [blame] | 35 | #include <dev/gpio.h> |
Kinson Chik | ea64624 | 2011-09-01 13:53:16 -0700 | [diff] [blame] | 36 | #include <dev/ssbi.h> |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 37 | #include <lib/ptable.h> |
| 38 | #include <dev/flash.h> |
Chandan Uddaraju | 885e4db | 2009-12-03 22:45:26 -0800 | [diff] [blame] | 39 | #include <smem.h> |
Chandan Uddaraju | 14e57eb | 2010-06-28 12:11:06 -0700 | [diff] [blame] | 40 | #include <reg.h> |
Greg Grisco | d625055 | 2011-06-29 14:40:23 -0700 | [diff] [blame] | 41 | #include <mmc.h> |
Subbaraman Narayanamurthy | 4b43c35 | 2010-09-24 13:20:52 -0700 | [diff] [blame] | 42 | #include <platform/iomap.h> |
Wentao Xu | 97df7fd | 2011-01-19 15:01:17 -0500 | [diff] [blame] | 43 | #include <platform/machtype.h> |
Channagoud Kadabi | e1ecef5 | 2012-02-04 15:54:34 +0530 | [diff] [blame] | 44 | #ifdef TARGET_USES_RSPIN_LOCK |
| 45 | #include <platform/remote_spinlock.h> |
| 46 | #endif |
Greg Grisco | d625055 | 2011-06-29 14:40:23 -0700 | [diff] [blame] | 47 | #include <platform.h> |
Chandan Uddaraju | f759be3 | 2010-03-17 19:04:16 -0700 | [diff] [blame] | 48 | |
| 49 | #define MSM8255_ID 74 |
| 50 | #define MSM8655_ID 75 |
Ajay Dudani | 6507798 | 2010-09-12 23:55:10 -0700 | [diff] [blame] | 51 | #define APQ8055_ID 85 |
Chandan Uddaraju | 885e4db | 2009-12-03 22:45:26 -0800 | [diff] [blame] | 52 | |
Chandan Uddaraju | 9e5ab96 | 2010-01-21 15:36:37 -0800 | [diff] [blame] | 53 | #define VARIABLE_LENGTH 0x10101010 |
| 54 | #define DIFF_START_ADDR 0xF0F0F0F0 |
| 55 | #define NUM_PAGES_PER_BLOCK 0x40 |
| 56 | |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 57 | static unsigned mmc_sdc_base[] = |
| 58 | { MSM_SDC1_BASE, MSM_SDC2_BASE, MSM_SDC3_BASE, MSM_SDC4_BASE }; |
Subbaraman Narayanamurthy | 4b43c35 | 2010-09-24 13:20:52 -0700 | [diff] [blame] | 59 | |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 60 | static struct ptable flash_ptable; |
Chandan Uddaraju | 1434a60 | 2010-03-08 17:13:38 -0800 | [diff] [blame] | 61 | static int hw_platform_type = -1; |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 62 | |
| 63 | /* for these partitions, start will be offset by either what we get from |
| 64 | * smem, or from the above offset if smem is not useful. Also, we should |
| 65 | * probably have smem_ptable code populate our flash_ptable. |
| 66 | * |
| 67 | * When smem provides us with a full partition table, we can get rid of |
| 68 | * this altogether. |
| 69 | * |
| 70 | */ |
| 71 | static struct ptentry board_part_list[] = { |
| 72 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 73 | .start = 0, |
Channagoud Kadabi | 5af8816 | 2012-02-16 11:01:58 +0530 | [diff] [blame^] | 74 | .length = 10 /* In MB */ , |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 75 | .name = "boot", |
| 76 | }, |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 77 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 78 | .start = DIFF_START_ADDR, |
Channagoud Kadabi | aa74367 | 2011-12-19 16:25:52 +0530 | [diff] [blame] | 79 | .length = 256 /* In MB */ , |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 80 | .name = "system", |
| 81 | }, |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 82 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 83 | .start = DIFF_START_ADDR, |
| 84 | .length = 5 /* In MB */ , |
| 85 | .name = "cache", |
| 86 | }, |
Chandan Uddaraju | 94183c0 | 2010-01-15 15:13:59 -0800 | [diff] [blame] | 87 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 88 | .start = DIFF_START_ADDR, |
| 89 | .length = 1 /* In MB */ , |
| 90 | .name = "misc", |
| 91 | }, |
Subbaraman Narayanamurthy | eb92bcc | 2010-07-20 14:32:46 -0700 | [diff] [blame] | 92 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 93 | .start = DIFF_START_ADDR, |
| 94 | .length = 1 /* In MB */ , |
| 95 | .name = "devinfo", |
| 96 | }, |
Shashank Mittal | 162244e | 2011-08-08 19:01:25 -0700 | [diff] [blame] | 97 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 98 | .start = DIFF_START_ADDR, |
| 99 | .length = VARIABLE_LENGTH, |
| 100 | .name = "userdata", |
| 101 | }, |
Chandan Uddaraju | 9e5ab96 | 2010-01-21 15:36:37 -0800 | [diff] [blame] | 102 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 103 | .start = DIFF_START_ADDR, |
| 104 | .length = 3 /* In MB */ , |
| 105 | .name = "persist", |
| 106 | }, |
Chandan Uddaraju | 9e5ab96 | 2010-01-21 15:36:37 -0800 | [diff] [blame] | 107 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 108 | .start = DIFF_START_ADDR, |
Channagoud Kadabi | 5af8816 | 2012-02-16 11:01:58 +0530 | [diff] [blame^] | 109 | .length = 10 /* In MB */ , |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 110 | .name = "recovery", |
| 111 | }, |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 112 | }; |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 113 | |
| 114 | static int num_parts = sizeof(board_part_list) / sizeof(struct ptentry); |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 115 | |
| 116 | void smem_ptable_init(void); |
| 117 | unsigned smem_get_apps_flash_start(void); |
Chandan Uddaraju | 14e57eb | 2010-06-28 12:11:06 -0700 | [diff] [blame] | 118 | unsigned smem_read_alloc_entry_offset(smem_mem_type_t, void *, int, int); |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 119 | |
| 120 | void keypad_init(void); |
| 121 | |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 122 | static int emmc_boot = -1; /* set to uninitialized */ |
David Ng | 183a742 | 2009-12-07 14:55:21 -0800 | [diff] [blame] | 123 | int target_is_emmc_boot(void); |
Chandan Uddaraju | 1434a60 | 2010-03-08 17:13:38 -0800 | [diff] [blame] | 124 | static int platform_version = -1; |
Chandan Uddaraju | f759be3 | 2010-03-17 19:04:16 -0700 | [diff] [blame] | 125 | static int target_msm_id = -1; |
Chandan Uddaraju | 14e57eb | 2010-06-28 12:11:06 -0700 | [diff] [blame] | 126 | static int interleaved_mode_enabled = -1; |
| 127 | void enable_interleave_mode(int); |
| 128 | |
| 129 | int target_is_interleaved_mode(void) |
| 130 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 131 | struct smem_board_info_v4 board_info_v4; |
| 132 | unsigned int board_info_len = 0; |
| 133 | unsigned smem_status; |
| 134 | char *build_type; |
| 135 | unsigned format = 0; |
Chandan Uddaraju | 14e57eb | 2010-06-28 12:11:06 -0700 | [diff] [blame] | 136 | |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 137 | if (interleaved_mode_enabled != -1) { |
| 138 | return interleaved_mode_enabled; |
Chandan Uddaraju | 14e57eb | 2010-06-28 12:11:06 -0700 | [diff] [blame] | 139 | } |
Chandan Uddaraju | 14e57eb | 2010-06-28 12:11:06 -0700 | [diff] [blame] | 140 | |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 141 | smem_status = smem_read_alloc_entry_offset(SMEM_BOARD_INFO_LOCATION, |
| 142 | &format, sizeof(format), 0); |
| 143 | if (!smem_status) { |
| 144 | if ((format == 3) || (format == 4)) { |
| 145 | if (format == 4) |
| 146 | board_info_len = sizeof(board_info_v4); |
| 147 | else |
| 148 | board_info_len = |
| 149 | sizeof(board_info_v4.board_info_v3); |
| 150 | |
| 151 | smem_status = |
| 152 | smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION, |
| 153 | &board_info_v4, |
| 154 | board_info_len); |
| 155 | if (!smem_status) { |
| 156 | build_type = |
| 157 | (char *)(board_info_v4. |
| 158 | board_info_v3.build_id) + 9; |
| 159 | |
| 160 | interleaved_mode_enabled = 0; |
| 161 | |
| 162 | if (*build_type == 'C') { |
| 163 | interleaved_mode_enabled = 1; |
| 164 | } |
| 165 | } |
| 166 | } |
| 167 | } |
| 168 | |
| 169 | return interleaved_mode_enabled; |
Chandan Uddaraju | 14e57eb | 2010-06-28 12:11:06 -0700 | [diff] [blame] | 170 | } |
David Ng | 183a742 | 2009-12-07 14:55:21 -0800 | [diff] [blame] | 171 | |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 172 | void target_init(void) |
| 173 | { |
| 174 | unsigned offset; |
| 175 | struct flash_info *flash_info; |
Chandan Uddaraju | 9e5ab96 | 2010-01-21 15:36:37 -0800 | [diff] [blame] | 176 | unsigned total_num_of_blocks; |
Chandan Uddaraju | 9e5ab96 | 2010-01-21 15:36:37 -0800 | [diff] [blame] | 177 | unsigned next_ptr_start_adr = 0; |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 178 | unsigned blocks_per_1MB = 8; /* Default value of 2k page size on 256MB flash drive */ |
Subbaraman Narayanamurthy | 4b43c35 | 2010-09-24 13:20:52 -0700 | [diff] [blame] | 179 | unsigned base_addr; |
| 180 | unsigned char slot; |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 181 | int i; |
| 182 | |
| 183 | dprintf(INFO, "target_init()\n"); |
| 184 | |
Channagoud Kadabi | e1ecef5 | 2012-02-04 15:54:34 +0530 | [diff] [blame] | 185 | #ifdef TARGET_USES_RSPIN_LOCK |
| 186 | if(remote_spinlock_init(&rlock)) |
| 187 | dprintf(SPEW,"Failed to Initialize remote spin locks\n"); |
| 188 | #endif |
| 189 | |
Chandan Uddaraju | a0d26dd | 2009-12-13 01:04:38 -0800 | [diff] [blame] | 190 | #if (!ENABLE_NANDWRITE) |
Chandan Uddaraju | 5fa471a | 2009-12-02 17:31:34 -0800 | [diff] [blame] | 191 | keys_init(); |
| 192 | keypad_init(); |
Chandan Uddaraju | a0d26dd | 2009-12-13 01:04:38 -0800 | [diff] [blame] | 193 | #endif |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 194 | |
Kinson Chik | ce306ff | 2011-07-08 15:23:33 -0700 | [diff] [blame] | 195 | /* Display splash screen if enabled */ |
| 196 | #if DISPLAY_SPLASH_SCREEN |
| 197 | display_init(); |
| 198 | dprintf(SPEW, "Diplay initialized\n"); |
| 199 | display_image_on_screen(); |
| 200 | #endif |
| 201 | |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 202 | if (target_is_emmc_boot()) { |
Amol Jadi | 2dfe339 | 2011-07-19 16:03:37 -0700 | [diff] [blame] | 203 | /* Must wait for modem-up before we can intialize MMC. |
| 204 | */ |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 205 | while (readl(MSM_SHARED_BASE + 0x14) != 1) ; |
Amol Jadi | 2dfe339 | 2011-07-19 16:03:37 -0700 | [diff] [blame] | 206 | |
Subbaraman Narayanamurthy | 4b43c35 | 2010-09-24 13:20:52 -0700 | [diff] [blame] | 207 | /* Trying Slot 2 first */ |
| 208 | slot = 2; |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 209 | base_addr = mmc_sdc_base[slot - 1]; |
| 210 | if (mmc_boot_main(slot, base_addr)) { |
Subbaraman Narayanamurthy | 4b43c35 | 2010-09-24 13:20:52 -0700 | [diff] [blame] | 211 | /* Trying Slot 4 next */ |
| 212 | slot = 4; |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 213 | base_addr = mmc_sdc_base[slot - 1]; |
| 214 | if (mmc_boot_main(slot, base_addr)) { |
Subbaraman Narayanamurthy | 1ea479e | 2010-10-08 14:54:16 -0700 | [diff] [blame] | 215 | dprintf(CRITICAL, "mmc init failed!"); |
| 216 | ASSERT(0); |
Subbaraman Narayanamurthy | 4b43c35 | 2010-09-24 13:20:52 -0700 | [diff] [blame] | 217 | } |
| 218 | } |
David Ng | 183a742 | 2009-12-07 14:55:21 -0800 | [diff] [blame] | 219 | return; |
Subbaraman Narayanamurthy | fbe13a0 | 2010-09-10 11:51:12 -0700 | [diff] [blame] | 220 | } |
David Ng | 183a742 | 2009-12-07 14:55:21 -0800 | [diff] [blame] | 221 | |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 222 | ptable_init(&flash_ptable); |
| 223 | smem_ptable_init(); |
| 224 | |
| 225 | flash_init(); |
| 226 | flash_info = flash_get_info(); |
| 227 | ASSERT(flash_info); |
Chandan Uddaraju | 14e57eb | 2010-06-28 12:11:06 -0700 | [diff] [blame] | 228 | enable_interleave_mode(target_is_interleaved_mode()); |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 229 | |
| 230 | offset = smem_get_apps_flash_start(); |
| 231 | if (offset == 0xffffffff) |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 232 | while (1) ; |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 233 | |
Chandan Uddaraju | 4060511 | 2010-08-09 14:25:08 -0700 | [diff] [blame] | 234 | total_num_of_blocks = flash_info->num_blocks; |
| 235 | blocks_per_1MB = (1 << 20) / (flash_info->block_size); |
Chandan Uddaraju | 9e5ab96 | 2010-01-21 15:36:37 -0800 | [diff] [blame] | 236 | |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 237 | for (i = 0; i < num_parts; i++) { |
| 238 | struct ptentry *ptn = &board_part_list[i]; |
Chandan Uddaraju | d56669f | 2010-04-19 22:15:06 -0700 | [diff] [blame] | 239 | unsigned len = ((ptn->length) * blocks_per_1MB); |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 240 | |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 241 | if (ptn->start != 0) |
| 242 | ASSERT(ptn->start == DIFF_START_ADDR); |
Chandan Uddaraju | d56669f | 2010-04-19 22:15:06 -0700 | [diff] [blame] | 243 | |
| 244 | ptn->start = next_ptr_start_adr; |
| 245 | |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 246 | if (ptn->length == VARIABLE_LENGTH) { |
Chandan Uddaraju | 9e5ab96 | 2010-01-21 15:36:37 -0800 | [diff] [blame] | 247 | unsigned length_for_prt = 0; |
| 248 | unsigned j; |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 249 | for (j = i + 1; j < num_parts; j++) { |
| 250 | struct ptentry *temp_ptn = &board_part_list[j]; |
| 251 | ASSERT(temp_ptn->length != VARIABLE_LENGTH); |
| 252 | length_for_prt += |
| 253 | ((temp_ptn->length) * blocks_per_1MB); |
Chandan Uddaraju | 9e5ab96 | 2010-01-21 15:36:37 -0800 | [diff] [blame] | 254 | } |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 255 | len = |
| 256 | total_num_of_blocks - (offset + ptn->start + |
| 257 | length_for_prt); |
Chandan Uddaraju | 9e5ab96 | 2010-01-21 15:36:37 -0800 | [diff] [blame] | 258 | ASSERT(len >= 0); |
Chandan Uddaraju | 9e5ab96 | 2010-01-21 15:36:37 -0800 | [diff] [blame] | 259 | } |
Chandan Uddaraju | d56669f | 2010-04-19 22:15:06 -0700 | [diff] [blame] | 260 | next_ptr_start_adr = ptn->start + len; |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 261 | if (target_is_interleaved_mode()) { |
| 262 | ptable_add(&flash_ptable, ptn->name, |
| 263 | offset + (ptn->start / 2), (len / 2), |
| 264 | ptn->flags, TYPE_APPS_PARTITION, |
| 265 | PERM_WRITEABLE); |
| 266 | } else { |
| 267 | ptable_add(&flash_ptable, ptn->name, |
| 268 | offset + ptn->start, len, ptn->flags, |
| 269 | TYPE_APPS_PARTITION, PERM_WRITEABLE); |
Chandan Uddaraju | 14e57eb | 2010-06-28 12:11:06 -0700 | [diff] [blame] | 270 | } |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 271 | } |
| 272 | |
Shashank Mittal | 8e49dec | 2010-03-01 15:19:04 -0800 | [diff] [blame] | 273 | smem_add_modem_partitions(&flash_ptable); |
| 274 | |
Chandan Uddaraju | 8adde5a | 2009-11-17 11:31:28 -0800 | [diff] [blame] | 275 | ptable_dump(&flash_ptable); |
| 276 | flash_set_ptable(&flash_ptable); |
| 277 | } |
Chandan Uddaraju | 885e4db | 2009-12-03 22:45:26 -0800 | [diff] [blame] | 278 | |
Chandan Uddaraju | 1434a60 | 2010-03-08 17:13:38 -0800 | [diff] [blame] | 279 | int target_platform_version(void) |
| 280 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 281 | return platform_version; |
Chandan Uddaraju | 1434a60 | 2010-03-08 17:13:38 -0800 | [diff] [blame] | 282 | } |
| 283 | |
Chandan Uddaraju | f759be3 | 2010-03-17 19:04:16 -0700 | [diff] [blame] | 284 | int target_is_msm8x55(void) |
| 285 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 286 | if ((target_msm_id == MSM8255_ID) || |
| 287 | (target_msm_id == MSM8655_ID) || (target_msm_id == APQ8055_ID)) |
| 288 | return 1; |
| 289 | else |
| 290 | return 0; |
Chandan Uddaraju | f759be3 | 2010-03-17 19:04:16 -0700 | [diff] [blame] | 291 | } |
| 292 | |
Chandan Uddaraju | 885e4db | 2009-12-03 22:45:26 -0800 | [diff] [blame] | 293 | unsigned board_machtype(void) |
| 294 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 295 | struct smem_board_info_v4 board_info_v4; |
| 296 | unsigned int board_info_len = 0; |
| 297 | enum platform platform_type = 0; |
| 298 | unsigned smem_status; |
| 299 | unsigned format = 0; |
| 300 | if (hw_platform_type != -1) |
Chandan Uddaraju | f759be3 | 2010-03-17 19:04:16 -0700 | [diff] [blame] | 301 | return hw_platform_type; |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 302 | |
| 303 | smem_status = smem_read_alloc_entry_offset(SMEM_BOARD_INFO_LOCATION, |
| 304 | &format, sizeof(format), 0); |
| 305 | if (!smem_status) { |
| 306 | if ((format == 3) || (format == 4)) { |
| 307 | if (format == 4) |
| 308 | board_info_len = sizeof(board_info_v4); |
| 309 | else |
| 310 | board_info_len = |
| 311 | sizeof(board_info_v4.board_info_v3); |
| 312 | |
| 313 | smem_status = |
| 314 | smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION, |
| 315 | &board_info_v4, |
| 316 | board_info_len); |
| 317 | if (!smem_status) { |
| 318 | if (format == 4) |
| 319 | platform_version = |
| 320 | board_info_v4.platform_version; |
| 321 | |
| 322 | platform_type = |
| 323 | board_info_v4.board_info_v3.hw_platform; |
| 324 | target_msm_id = |
| 325 | board_info_v4.board_info_v3.msm_id; |
| 326 | switch (platform_type) { |
| 327 | case HW_PLATFORM_SURF: |
| 328 | hw_platform_type = |
| 329 | ((target_is_msm8x55())? |
| 330 | LINUX_MACHTYPE_8x55_SURF : |
| 331 | LINUX_MACHTYPE_7x30_SURF); |
| 332 | break; |
| 333 | case HW_PLATFORM_FFA: |
| 334 | hw_platform_type = |
| 335 | ((target_is_msm8x55())? |
| 336 | LINUX_MACHTYPE_8x55_FFA : |
| 337 | LINUX_MACHTYPE_7x30_FFA); |
| 338 | break; |
| 339 | case HW_PLATFORM_FLUID: |
| 340 | hw_platform_type = |
| 341 | LINUX_MACHTYPE_7x30_FLUID; |
| 342 | break; |
| 343 | case HW_PLATFORM_SVLTE: |
| 344 | hw_platform_type = |
| 345 | LINUX_MACHTYPE_8x55_SVLTE_FFA; |
| 346 | break; |
| 347 | default: |
| 348 | hw_platform_type = |
| 349 | ((target_is_msm8x55())? |
| 350 | LINUX_MACHTYPE_8x55_SURF : |
| 351 | LINUX_MACHTYPE_7x30_SURF); |
| 352 | break; |
| 353 | } |
| 354 | return hw_platform_type; |
| 355 | } |
| 356 | } |
Chandan Uddaraju | f759be3 | 2010-03-17 19:04:16 -0700 | [diff] [blame] | 357 | } |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 358 | hw_platform_type = LINUX_MACHTYPE_7x30_SURF; |
| 359 | return hw_platform_type; |
Chandan Uddaraju | 885e4db | 2009-12-03 22:45:26 -0800 | [diff] [blame] | 360 | } |
David Ng | 183a742 | 2009-12-07 14:55:21 -0800 | [diff] [blame] | 361 | |
Chandan Uddaraju | 94183c0 | 2010-01-15 15:13:59 -0800 | [diff] [blame] | 362 | void reboot_device(unsigned reboot_reason) |
| 363 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 364 | reboot(reboot_reason); |
Chandan Uddaraju | 94183c0 | 2010-01-15 15:13:59 -0800 | [diff] [blame] | 365 | } |
| 366 | |
Chandan Uddaraju | de85d3f | 2010-01-05 16:32:33 -0800 | [diff] [blame] | 367 | unsigned check_reboot_mode(void) |
| 368 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 369 | unsigned mode[2] = { 0, 0 }; |
| 370 | unsigned int mode_len = sizeof(mode); |
| 371 | unsigned smem_status; |
Chandan Uddaraju | 94183c0 | 2010-01-15 15:13:59 -0800 | [diff] [blame] | 372 | |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 373 | smem_status = smem_read_alloc_entry(SMEM_APPS_BOOT_MODE, |
| 374 | &mode, mode_len); |
| 375 | if (smem_status) { |
| 376 | dprintf(CRITICAL, |
| 377 | "ERROR: unable to read shared memory for reboot mode\n"); |
| 378 | return 0; |
| 379 | } |
| 380 | return mode[0]; |
Chandan Uddaraju | de85d3f | 2010-01-05 16:32:33 -0800 | [diff] [blame] | 381 | } |
Chandan Uddaraju | 7f5b901 | 2010-02-06 16:37:48 -0800 | [diff] [blame] | 382 | |
Wentao Xu | 530c2d8 | 2010-11-09 18:30:18 -0500 | [diff] [blame] | 383 | static unsigned target_check_power_on_reason(void) |
| 384 | { |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 385 | unsigned power_on_status = 0; |
| 386 | unsigned int status_len = sizeof(power_on_status); |
| 387 | unsigned smem_status; |
Wentao Xu | 530c2d8 | 2010-11-09 18:30:18 -0500 | [diff] [blame] | 388 | |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 389 | smem_status = smem_read_alloc_entry(SMEM_POWER_ON_STATUS_INFO, |
| 390 | &power_on_status, status_len); |
Wentao Xu | 530c2d8 | 2010-11-09 18:30:18 -0500 | [diff] [blame] | 391 | |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 392 | if (smem_status) { |
| 393 | dprintf(CRITICAL, |
| 394 | "ERROR: unable to read shared memory for power on reason\n"); |
| 395 | } |
Wentao Xu | 530c2d8 | 2010-11-09 18:30:18 -0500 | [diff] [blame] | 396 | |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 397 | return power_on_status; |
Wentao Xu | 530c2d8 | 2010-11-09 18:30:18 -0500 | [diff] [blame] | 398 | } |
| 399 | |
Subbaraman Narayanamurthy | f17b4ae | 2011-02-16 20:19:56 -0800 | [diff] [blame] | 400 | #if _EMMC_BOOT |
| 401 | void target_serialno(unsigned char *buf) |
| 402 | { |
| 403 | unsigned int serialno; |
Ajay Dudani | b01e506 | 2011-12-03 23:23:42 -0800 | [diff] [blame] | 404 | serialno = mmc_get_psn(); |
Ajay Dudani | f63d02f | 2011-10-01 08:29:53 -0700 | [diff] [blame] | 405 | snprintf(buf, 13, "%x", serialno); |
Subbaraman Narayanamurthy | f17b4ae | 2011-02-16 20:19:56 -0800 | [diff] [blame] | 406 | } |
Subbaraman Narayanamurthy | 0e445b0 | 2011-06-19 21:34:46 -0700 | [diff] [blame] | 407 | |
| 408 | int emmc_recovery_init(void) |
| 409 | { |
| 410 | int rc; |
| 411 | rc = _emmc_recovery_init(); |
| 412 | return rc; |
| 413 | } |
Subbaraman Narayanamurthy | f17b4ae | 2011-02-16 20:19:56 -0800 | [diff] [blame] | 414 | #endif |