blob: 60d0e26e21f1f94b0c487ce6533fc195d174e558 [file] [log] [blame]
Dima Zavin9caac252009-01-26 12:37:15 -08001/*
2 * Copyright (c) 2009, Google Inc.
3 * All rights reserved.
4 *
Shashank Mittal8e49dec2010-03-01 15:19:04 -08005 * Copyright (c) 2009-2010, Code Aurora Forum. All rights reserved.
6 *
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
14 * the documentation and/or other materials provided with the
15 * 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
24 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 * 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
40struct smem_ptn {
41 char name[16];
42 unsigned start;
43 unsigned size;
44 unsigned attr;
45} __attribute__ ((__packed__));
46
47struct smem_ptable {
48#define _SMEM_PTABLE_MAGIC_1 0x55ee73aa
49#define _SMEM_PTABLE_MAGIC_2 0xe35ebddb
50 unsigned magic[2];
51 unsigned version;
52 unsigned len;
53 struct smem_ptn parts[16];
54} __attribute__ ((__packed__));
55
56/* partition table from SMEM */
57static struct smem_ptable smem_ptable;
58static unsigned smem_apps_flash_start;
59
60static void dump_smem_ptable(void)
61{
62 int i;
63
64 for (i = 0; i < 16; i++) {
65 struct smem_ptn *p = &smem_ptable.parts[i];
66 if (p->name[0] == '\0')
67 continue;
68 dprintf(SPEW, "%d: %s offs=0x%08x size=0x%08x attr: 0x%08x\n",
69 i, p->name, p->start, p->size, p->attr);
70 }
71}
72
73void smem_ptable_init(void)
74{
75 unsigned i;
76
77 smem_apps_flash_start = 0xffffffff;
78
79 i = smem_read_alloc_entry(SMEM_AARM_PARTITION_TABLE,
80 &smem_ptable, sizeof(smem_ptable));
81 if (i != 0)
82 return;
83
84 if (smem_ptable.magic[0] != _SMEM_PTABLE_MAGIC_1 ||
85 smem_ptable.magic[1] != _SMEM_PTABLE_MAGIC_2)
86 return;
87
88 dump_smem_ptable();
89 dprintf(INFO, "smem ptable found: ver: %d len: %d\n",
90 smem_ptable.version, smem_ptable.len);
91
92 for (i = 0; i < smem_ptable.len; i++) {
93 if (!strcmp(smem_ptable.parts[i].name, "0:APPS"))
94 break;
95 }
96 if (i == smem_ptable.len)
97 return;
98
99 smem_apps_flash_start = smem_ptable.parts[i].start;
100}
101
102unsigned smem_get_apps_flash_start(void)
103{
104 return smem_apps_flash_start;
105}
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800106
107void smem_add_modem_partitions(struct ptable *flash_ptable)
108{
109 int i;
110
111 if (smem_ptable.magic[0] != _SMEM_PTABLE_MAGIC_1 ||
112 smem_ptable.magic[1] != _SMEM_PTABLE_MAGIC_2)
113 return;
114
115 for (i = 0; i < 16; i++)
116 {
117 char * token;
118 char * pname = NULL;
119 struct smem_ptn *p = &smem_ptable.parts[i];
120 if (p->name[0] == '\0')
121 continue;
122 token = strtok(p->name, ":");
123 while (token)
124 {
125 pname = token;
126 token = strtok (NULL, ":");
127 }
128 if(pname)
129 {
130 ptable_add(flash_ptable, pname, p->start,
131 p->size, 0, TYPE_MODEM_PARTITION, PERM_WRITEABLE);
132 }
133 }
134}
135
Ajay Dudania1eafc42010-04-21 19:48:11 -0700136/* RAM Partition table from SMEM */
137int smem_ram_ptable_init(struct smem_ram_ptable *smem_ram_ptable)
138{
139 unsigned i;
140
141 i = smem_read_alloc_entry(SMEM_USABLE_RAM_PARTITION_TABLE,
142 smem_ram_ptable, sizeof(struct smem_ram_ptable));
143 if (i != 0)
144 return 0;
145
146 if (smem_ram_ptable->magic[0] != _SMEM_RAM_PTABLE_MAGIC_1 ||
147 smem_ram_ptable->magic[1] != _SMEM_RAM_PTABLE_MAGIC_2)
148 return 0;
149
150 dprintf(INFO, "smem ram ptable found: ver: %d len: %d\n",
151 smem_ram_ptable->version, smem_ram_ptable->len);
152
153 return 1;
154}
155
156