blob: 291b24258dee6eb01f517dc80215f540b2600a70 [file] [log] [blame]
Dima Zavin9caac252009-01-26 12:37:15 -08001/*
2 * Copyright (c) 2009, Google Inc.
3 * All rights reserved.
4 *
Amol Jadi6133e8d2012-10-07 22:15:02 -07005 * Copyright (c) 2009-2012, The Linux Foundation. All rights reserved.
Shashank Mittal8e49dec2010-03-01 15:19:04 -08006 *
Dima Zavin9caac252009-01-26 12:37:15 -08007 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
Amol Jadi6133e8d2012-10-07 22:15:02 -070014 * the documentation and/or other materials provided with the
Dima Zavin9caac252009-01-26 12:37:15 -080015 * distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
20 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
Amol Jadi6133e8d2012-10-07 22:15:02 -070024 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
Dima Zavin9caac252009-01-26 12:37:15 -080025 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
27 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 */
30
31#include <debug.h>
32#include <reg.h>
33#include <string.h>
34#include <sys/types.h>
35#include <platform/iomap.h>
Shashank Mittal8e49dec2010-03-01 15:19:04 -080036#include <lib/ptable.h>
Dima Zavin9caac252009-01-26 12:37:15 -080037
38#include "smem.h"
39
Dima Zavin9caac252009-01-26 12:37:15 -080040
41/* partition table from SMEM */
42static struct smem_ptable smem_ptable;
Amol Jadi6133e8d2012-10-07 22:15:02 -070043static unsigned smem_apps_flash_start = 0xFFFFFFFF;
Dima Zavin9caac252009-01-26 12:37:15 -080044
45static void dump_smem_ptable(void)
46{
Amol Jadi6133e8d2012-10-07 22:15:02 -070047 unsigned i;
Dima Zavin9caac252009-01-26 12:37:15 -080048
Amol Jadi6133e8d2012-10-07 22:15:02 -070049 for (i = 0; i < smem_ptable.len; i++) {
Dima Zavin9caac252009-01-26 12:37:15 -080050 struct smem_ptn *p = &smem_ptable.parts[i];
51 if (p->name[0] == '\0')
52 continue;
53 dprintf(SPEW, "%d: %s offs=0x%08x size=0x%08x attr: 0x%08x\n",
54 i, p->name, p->start, p->size, p->attr);
55 }
56}
57
58void smem_ptable_init(void)
59{
60 unsigned i;
Amol Jadi6133e8d2012-10-07 22:15:02 -070061 unsigned ret;
62 unsigned len;
Dima Zavin9caac252009-01-26 12:37:15 -080063
Amol Jadi6133e8d2012-10-07 22:15:02 -070064 /* Read only the header portion of ptable */
65 ret = smem_read_alloc_entry_offset(SMEM_AARM_PARTITION_TABLE,
66 &smem_ptable,
67 SMEM_PTABLE_HDR_LEN,
68 0);
69 if (ret)
70 {
71 dprintf(CRITICAL, "Failed to read ptable hdr (%d)", ret);
72 ASSERT(0);
73 }
Dima Zavin9caac252009-01-26 12:37:15 -080074
Amol Jadi6133e8d2012-10-07 22:15:02 -070075 /* Verify ptable magic */
Dima Zavin9caac252009-01-26 12:37:15 -080076 if (smem_ptable.magic[0] != _SMEM_PTABLE_MAGIC_1 ||
77 smem_ptable.magic[1] != _SMEM_PTABLE_MAGIC_2)
78 return;
79
Amol Jadi6133e8d2012-10-07 22:15:02 -070080 /* Ensure that # of partitions is less than the max we have allocated. */
81 ASSERT(smem_ptable.len <= SMEM_PTABLE_MAX_PARTS);
82
83 /* Find out length of partition data based on table version. */
84 if (smem_ptable.version <= 3)
85 {
86 len = SMEM_PTABLE_HDR_LEN + SMEM_PTABLE_MAX_PARTS_V3*sizeof(struct smem_ptn);
87 }
88 else if (smem_ptable.version == 4)
89 {
90 len = SMEM_PTABLE_HDR_LEN + SMEM_PTABLE_MAX_PARTS_V4*sizeof(struct smem_ptn);
91 }
92 else
93 {
94 dprintf(CRITICAL, "Unknown ptable version (%d)", smem_ptable.version);
95 ASSERT(0);
96 }
97
98 ret = smem_read_alloc_entry(SMEM_AARM_PARTITION_TABLE,
99 &smem_ptable,
100 len);
101 if (ret)
102 {
103 dprintf(CRITICAL, "Failed to read ptable (%d)", ret);
104 ASSERT(0);
105 }
106
Dima Zavin9caac252009-01-26 12:37:15 -0800107 dump_smem_ptable();
108 dprintf(INFO, "smem ptable found: ver: %d len: %d\n",
Amol Jadi6133e8d2012-10-07 22:15:02 -0700109 smem_ptable.version, smem_ptable.len);
Dima Zavin9caac252009-01-26 12:37:15 -0800110
111 for (i = 0; i < smem_ptable.len; i++) {
112 if (!strcmp(smem_ptable.parts[i].name, "0:APPS"))
Ajay Dudanib01e5062011-12-03 23:23:42 -0800113 break;
Dima Zavin9caac252009-01-26 12:37:15 -0800114 }
115 if (i == smem_ptable.len)
116 return;
117
118 smem_apps_flash_start = smem_ptable.parts[i].start;
119}
120
121unsigned smem_get_apps_flash_start(void)
122{
123 return smem_apps_flash_start;
124}
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800125
126void smem_add_modem_partitions(struct ptable *flash_ptable)
127{
Amol Jadi6133e8d2012-10-07 22:15:02 -0700128 unsigned i;
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800129
130 if (smem_ptable.magic[0] != _SMEM_PTABLE_MAGIC_1 ||
131 smem_ptable.magic[1] != _SMEM_PTABLE_MAGIC_2)
132 return;
133
Amol Jadi6133e8d2012-10-07 22:15:02 -0700134 for (i = 0; i < smem_ptable.len; i++) {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800135 char *token;
136 char *pname = NULL;
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800137 struct smem_ptn *p = &smem_ptable.parts[i];
Ajay Dudanib01e5062011-12-03 23:23:42 -0800138 if (p->name[0] == '\0')
139 continue;
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800140 token = strtok(p->name, ":");
Ajay Dudanib01e5062011-12-03 23:23:42 -0800141 while (token) {
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800142 pname = token;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800143 token = strtok(NULL, ":");
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800144 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800145 if (pname) {
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800146 ptable_add(flash_ptable, pname, p->start,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800147 p->size, 0, TYPE_MODEM_PARTITION,
148 PERM_WRITEABLE);
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800149 }
150 }
151}
152
Ajay Dudania1eafc42010-04-21 19:48:11 -0700153/* RAM Partition table from SMEM */
154int smem_ram_ptable_init(struct smem_ram_ptable *smem_ram_ptable)
155{
156 unsigned i;
157
158 i = smem_read_alloc_entry(SMEM_USABLE_RAM_PARTITION_TABLE,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800159 smem_ram_ptable,
160 sizeof(struct smem_ram_ptable));
Ajay Dudania1eafc42010-04-21 19:48:11 -0700161 if (i != 0)
162 return 0;
163
164 if (smem_ram_ptable->magic[0] != _SMEM_RAM_PTABLE_MAGIC_1 ||
165 smem_ram_ptable->magic[1] != _SMEM_RAM_PTABLE_MAGIC_2)
166 return 0;
167
Ajay Dudaniebb0b5b2011-08-02 14:35:55 -0700168 dprintf(SPEW, "smem ram ptable found: ver: %d len: %d\n",
Ajay Dudania1eafc42010-04-21 19:48:11 -0700169 smem_ram_ptable->version, smem_ram_ptable->len);
170
171 return 1;
172}