blob: 1233ce7dbb41f5cf18d66f99b34e6431e77e3bd8 [file] [log] [blame]
Amol Jadicd43ea02011-02-15 20:56:04 -08001/*
2 * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in
11 * the documentation and/or other materials provided with the
12 * distribution.
13 * * Neither the name of Google, Inc. nor the names of its contributors
14 * may be used to endorse or promote products derived from this
15 * software without specific prior written permission.
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 <platform/iomap.h>
Amol Jadidb1edb32011-07-18 14:24:46 -070034#include <qgic.h>
Amol Jadic52c8a32011-07-12 11:27:04 -070035#include <uart_dm.h>
Kinson Chike5c93432011-06-17 09:10:29 -070036#include <dev/fbcon.h>
Amol Jadida055742011-06-14 16:15:12 -070037#include <mmu.h>
38#include <arch/arm/mmu.h>
Shashank Mittal10a35342011-12-05 19:01:22 -080039#include <partition_parser.h>
Amol Jadicd43ea02011-02-15 20:56:04 -080040
Amol Jadicd43ea02011-02-15 20:56:04 -080041extern void platform_init_timer(void);
Greg Grisco1073a5e2011-07-28 18:59:18 -070042extern void platform_panel_backlight_on(void);
43extern void platform_uninit_timer(void);
Kinson Chike5c93432011-06-17 09:10:29 -070044extern void mipi_panel_reset(void);
45extern void mipi_dsi_panel_power_on(void);
46extern void mdp_clock_init(void);
47extern void mmss_clock_init(void);
48extern struct fbcon_config *mipi_init(void);
49extern void mipi_dsi_shutdown(void);
Amol Jadicd43ea02011-02-15 20:56:04 -080050
Amol Jadiaeda4e62011-07-19 18:07:29 -070051static uint32_t ticks_per_sec = 0;
52
Amol Jadida055742011-06-14 16:15:12 -070053#define MB (1024*1024)
54
55#define MSM_IOMAP_SIZE ((MSM_IOMAP_END - MSM_IOMAP_BASE)/MB)
56
57/* LK memory - cacheable, write through */
58#define LK_MEMORY (MMU_MEMORY_TYPE_NORMAL_WRITE_THROUGH | \
59 MMU_MEMORY_AP_READ_WRITE)
60
61/* Kernel region - cacheable, write through */
62#define KERNEL_MEMORY (MMU_MEMORY_TYPE_NORMAL_WRITE_THROUGH | \
Amol Jadi0228e9f2011-12-19 17:21:36 -080063 MMU_MEMORY_AP_READ_WRITE | MMU_MEMORY_XN)
Amol Jadida055742011-06-14 16:15:12 -070064
65/* Scratch region - cacheable, write through */
66#define SCRATCH_MEMORY (MMU_MEMORY_TYPE_NORMAL_WRITE_THROUGH | \
Amol Jadi0228e9f2011-12-19 17:21:36 -080067 MMU_MEMORY_AP_READ_WRITE | MMU_MEMORY_XN)
Amol Jadida055742011-06-14 16:15:12 -070068
69/* Peripherals - non-shared device */
70#define IOMAP_MEMORY (MMU_MEMORY_TYPE_DEVICE_NON_SHARED | \
Amol Jadi0228e9f2011-12-19 17:21:36 -080071 MMU_MEMORY_AP_READ_WRITE | MMU_MEMORY_XN)
72
73/* IMEM: Must set execute never bit to avoid instruction prefetch from TZ */
74#define IMEM_MEMORY (MMU_MEMORY_TYPE_STRONGLY_ORDERED | \
75 MMU_MEMORY_AP_READ_WRITE | MMU_MEMORY_XN)
Amol Jadida055742011-06-14 16:15:12 -070076
Amol Jadida055742011-06-14 16:15:12 -070077mmu_section_t mmu_section_table[] = {
78/* Physical addr, Virtual addr, Size (in MB), Flags */
Ajay Dudanib01e5062011-12-03 23:23:42 -080079 {MEMBASE, MEMBASE, (MEMSIZE / MB), LK_MEMORY},
80 {BASE_ADDR, BASE_ADDR, 44, KERNEL_MEMORY},
81 {SCRATCH_ADDR, SCRATCH_ADDR, 128, SCRATCH_MEMORY},
82 {MSM_IOMAP_BASE, MSM_IOMAP_BASE, MSM_IOMAP_SIZE, IOMAP_MEMORY},
Amol Jadi0228e9f2011-12-19 17:21:36 -080083 {MSM_IMEM_BASE, MSM_IMEM_BASE, 1, IMEM_MEMORY},
Amol Jadida055742011-06-14 16:15:12 -070084};
85
Amol Jadicd43ea02011-02-15 20:56:04 -080086void platform_early_init(void)
87{
Ajay Dudanib01e5062011-12-03 23:23:42 -080088 qgic_init();
89 platform_init_timer();
Amol Jadicd43ea02011-02-15 20:56:04 -080090}
91
92void platform_init(void)
93{
Ajay Dudanib01e5062011-12-03 23:23:42 -080094 dprintf(INFO, "platform_init()\n");
Amol Jadicd43ea02011-02-15 20:56:04 -080095}
Kinson Chike5c93432011-06-17 09:10:29 -070096
Ajay Dudanib01e5062011-12-03 23:23:42 -080097void display_init(void)
98{
99 struct fbcon_config *fb_cfg;
Kinson Chike5c93432011-06-17 09:10:29 -0700100
Ajay Dudanib01e5062011-12-03 23:23:42 -0800101 panel_backlight_on();
Kinson Chikc1ad9462011-07-20 17:40:06 -0700102
Ajay Dudanib01e5062011-12-03 23:23:42 -0800103 mipi_dsi_panel_power_on();
104 mipi_panel_reset();
Kinson Chike5c93432011-06-17 09:10:29 -0700105
Ajay Dudanib01e5062011-12-03 23:23:42 -0800106 mdp_clock_init();
107 mmss_clock_init();
Kinson Chike5c93432011-06-17 09:10:29 -0700108
Ajay Dudanib01e5062011-12-03 23:23:42 -0800109 fb_cfg = mipi_init();
110 fbcon_setup(fb_cfg);
Kinson Chike5c93432011-06-17 09:10:29 -0700111}
112
113void display_shutdown(void)
114{
Ajay Dudanib01e5062011-12-03 23:23:42 -0800115 mipi_dsi_shutdown();
Kinson Chike5c93432011-06-17 09:10:29 -0700116}
Amol Jadi4421e652011-06-16 15:00:48 -0700117
Shashank Mittal10a35342011-12-05 19:01:22 -0800118/*
119 * Write-protect partition list.
120 *
121 * Partition added in this list should have (size + padding) in multiple of
122 * mmc write protect group size. Otherwise this can end up write protecting
123 * some blocks from next partition.
124 */
125char *wp_list[] = {"fsg", NULL};
126
127void platform_wp_paritition(void)
128{
129 int count = 0;
130 while(wp_list[count] != NULL)
131 {
132 paritition_wp_by_name(wp_list[count]);
133 count++;
134 }
135}
136
Amol Jadi4421e652011-06-16 15:00:48 -0700137void platform_uninit(void)
138{
Amol Jadi4421e652011-06-16 15:00:48 -0700139#if DISPLAY_SPLASH_SCREEN
140 display_shutdown();
141#endif
Shashank Mittal10a35342011-12-05 19:01:22 -0800142 platform_wp_paritition();
Amol Jadid7cfc032012-01-09 16:56:08 -0800143 platform_uninit_timer();
Amol Jadi4421e652011-06-16 15:00:48 -0700144}
145
Amol Jadida055742011-06-14 16:15:12 -0700146/* Setup memory for this platform */
147void platform_init_mmu_mappings(void)
148{
Ajay Dudanib01e5062011-12-03 23:23:42 -0800149 uint32_t i;
150 uint32_t sections;
151 uint32_t table_size = ARRAY_SIZE(mmu_section_table);
Amol Jadida055742011-06-14 16:15:12 -0700152
Ajay Dudanib01e5062011-12-03 23:23:42 -0800153 for (i = 0; i < table_size; i++) {
154 sections = mmu_section_table[i].num_of_sections;
Amol Jadida055742011-06-14 16:15:12 -0700155
Ajay Dudanib01e5062011-12-03 23:23:42 -0800156 while (sections--) {
157 arm_mmu_map_section(mmu_section_table[i].paddress +
158 sections * MB,
159 mmu_section_table[i].vaddress +
160 sections * MB,
161 mmu_section_table[i].flags);
162 }
163 }
Amol Jadida055742011-06-14 16:15:12 -0700164}
Amol Jadiaeda4e62011-07-19 18:07:29 -0700165
166/* Initialize DGT timer */
167void platform_init_timer(void)
168{
169 /* disable timer */
170 writel(0, DGT_ENABLE);
171
172 /* DGT uses LPXO source which is 27MHz.
173 * Set clock divider to 4.
174 */
175 writel(3, DGT_CLK_CTL);
176
Ajay Dudanib01e5062011-12-03 23:23:42 -0800177 ticks_per_sec = 6750000; /* (27 MHz / 4) */
Amol Jadiaeda4e62011-07-19 18:07:29 -0700178}
179
180/* Returns timer ticks per sec */
181uint32_t platform_tick_rate(void)
182{
183 return ticks_per_sec;
184}
Shashank Mittal10a35342011-12-05 19:01:22 -0800185