blob: 149f06bba4b8e7dabc23a5f20a22d09a9e5ce5b1 [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,
Ajay Dudanib01e5062011-12-03 23:23:42 -080080 &smem_ptable, sizeof(smem_ptable));
Dima Zavin9caac252009-01-26 12:37:15 -080081 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"))
Ajay Dudanib01e5062011-12-03 23:23:42 -080094 break;
Dima Zavin9caac252009-01-26 12:37:15 -080095 }
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
Ajay Dudanib01e5062011-12-03 23:23:42 -0800115 for (i = 0; i < 16; i++) {
116 char *token;
117 char *pname = NULL;
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800118 struct smem_ptn *p = &smem_ptable.parts[i];
Ajay Dudanib01e5062011-12-03 23:23:42 -0800119 if (p->name[0] == '\0')
120 continue;
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800121 token = strtok(p->name, ":");
Ajay Dudanib01e5062011-12-03 23:23:42 -0800122 while (token) {
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800123 pname = token;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800124 token = strtok(NULL, ":");
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800125 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800126 if (pname) {
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800127 ptable_add(flash_ptable, pname, p->start,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800128 p->size, 0, TYPE_MODEM_PARTITION,
129 PERM_WRITEABLE);
Shashank Mittal8e49dec2010-03-01 15:19:04 -0800130 }
131 }
132}
133
Ajay Dudania1eafc42010-04-21 19:48:11 -0700134/* RAM Partition table from SMEM */
135int smem_ram_ptable_init(struct smem_ram_ptable *smem_ram_ptable)
136{
137 unsigned i;
138
139 i = smem_read_alloc_entry(SMEM_USABLE_RAM_PARTITION_TABLE,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800140 smem_ram_ptable,
141 sizeof(struct smem_ram_ptable));
Ajay Dudania1eafc42010-04-21 19:48:11 -0700142 if (i != 0)
143 return 0;
144
145 if (smem_ram_ptable->magic[0] != _SMEM_RAM_PTABLE_MAGIC_1 ||
146 smem_ram_ptable->magic[1] != _SMEM_RAM_PTABLE_MAGIC_2)
147 return 0;
148
Ajay Dudaniebb0b5b2011-08-02 14:35:55 -0700149 dprintf(SPEW, "smem ram ptable found: ver: %d len: %d\n",
Ajay Dudania1eafc42010-04-21 19:48:11 -0700150 smem_ram_ptable->version, smem_ram_ptable->len);
151
152 return 1;
153}