blob: b2e981bb490cd50bb3fdc64dbd2f3e41539708e2 [file] [log] [blame]
Erik Gillingc5f80062010-01-21 16:53:02 -08001/*
Todd Poynor433cb7f2010-09-02 15:10:29 -07002 * arch/arm/mach-tegra/common.c
Erik Gillingc5f80062010-01-21 16:53:02 -08003 *
4 * Copyright (C) 2010 Google, Inc.
5 *
6 * Author:
7 * Colin Cross <ccross@android.com>
8 *
9 * This software is licensed under the terms of the GNU General Public
10 * License version 2, as published by the Free Software Foundation, and
11 * may be copied, distributed, and modified under those terms.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 */
19
Dima Zavin7e158ac2010-11-11 15:28:46 -080020#include <linux/console.h>
Erik Gillingc5f80062010-01-21 16:53:02 -080021#include <linux/init.h>
22#include <linux/io.h>
Colin Cross4de3a8f2010-04-05 13:16:42 -070023#include <linux/clk.h>
24#include <linux/delay.h>
Colin Cross115467a2010-10-19 21:09:29 -070025#include <linux/highmem.h>
Colin Cross8e437c22010-11-28 22:36:08 -080026#include <linux/memblock.h>
Erik Gillingc5f80062010-01-21 16:53:02 -080027
28#include <asm/hardware/cache-l2x0.h>
Dima Zavin7e158ac2010-11-11 15:28:46 -080029#include <asm/system.h>
Erik Gillingc5f80062010-01-21 16:53:02 -080030
Colin Cross45a1ca02011-03-28 17:47:31 -070031#include <mach/gpio.h>
Erik Gillingc5f80062010-01-21 16:53:02 -080032#include <mach/iomap.h>
Colin Cross120c3562011-03-28 17:48:56 -070033#include <mach/pinmux.h>
Dima Zavin7db7cbc2010-09-16 17:58:05 -070034#include <mach/powergate.h>
Colin Cross699fe142010-08-23 18:37:25 -070035#include <mach/system.h>
Erik Gillingc5f80062010-01-21 16:53:02 -080036
Jon Mayo6ae77a92010-12-21 15:09:33 -080037#include "apbio.h"
Erik Gillingc5f80062010-01-21 16:53:02 -080038#include "board.h"
Colin Crossd8611962010-01-28 16:40:29 -080039#include "clock.h"
Colin Cross73625e32010-06-23 15:49:17 -070040#include "fuse.h"
Colin Cross8e437c22010-11-28 22:36:08 -080041#include "pm.h"
42
Scott Williams816ab052010-12-07 11:19:20 -080043#define MC_SECURITY_CFG2 0x7c
Colin Crossf9c9bde2010-10-19 16:12:33 -070044
Colin Cross838d7d62010-10-19 14:45:50 -070045unsigned long tegra_bootloader_fb_start;
46unsigned long tegra_bootloader_fb_size;
47unsigned long tegra_fb_start;
48unsigned long tegra_fb_size;
49unsigned long tegra_fb2_start;
50unsigned long tegra_fb2_size;
51unsigned long tegra_carveout_start;
52unsigned long tegra_carveout_size;
Colin Cross8e437c22010-11-28 22:36:08 -080053unsigned long tegra_lp0_vec_start;
54unsigned long tegra_lp0_vec_size;
Scott Williams03122532011-01-13 14:30:20 -080055unsigned long tegra_grhost_aperture = ~0ul;
Pradeep Goudagunta3dd04c42011-03-23 23:16:12 +053056static bool is_tegra_debug_uart_hsport;
Colin Crossd8611962010-01-28 16:40:29 -080057
Colin Cross699fe142010-08-23 18:37:25 -070058void (*arch_reset)(char mode, const char *cmd) = tegra_assert_system_reset;
59
60void tegra_assert_system_reset(char mode, const char *cmd)
61{
Deepesh Gujarathi43921782010-12-07 14:09:22 +053062 void __iomem *reset = IO_ADDRESS(TEGRA_PMC_BASE + 0x00);
Colin Cross699fe142010-08-23 18:37:25 -070063 u32 reg;
64
Simon Glass375b19c2011-02-17 08:13:57 -080065 /* use *_related to avoid spinlock since caches are off */
66 reg = readl_relaxed(reset);
Deepesh Gujarathi43921782010-12-07 14:09:22 +053067 reg |= 0x10;
Simon Glass375b19c2011-02-17 08:13:57 -080068 writel_relaxed(reg, reset);
Colin Cross699fe142010-08-23 18:37:25 -070069}
70
Nitin Kumbhar637ced42010-12-10 15:16:37 +053071static struct board_info tegra_board_info = {
72 .board_id = -1,
73 .sku = -1,
74 .fab = -1,
75 .major_revision = -1,
76 .minor_revision = -1,
77};
78
Colin Crossd8611962010-01-28 16:40:29 -080079static __initdata struct tegra_clk_init_table common_clk_init_table[] = {
80 /* name parent rate enabled */
81 { "clk_m", NULL, 0, true },
Scott Williams816ab052010-12-07 11:19:20 -080082 { "pll_p", NULL, 216000000, true },
Colin Crossd8611962010-01-28 16:40:29 -080083 { "pll_p_out1", "pll_p", 28800000, true },
84 { "pll_p_out2", "pll_p", 48000000, true },
85 { "pll_p_out3", "pll_p", 72000000, true },
86 { "pll_p_out4", "pll_p", 108000000, true },
Alex Frid8b5ce662011-01-31 10:07:57 -080087#ifdef CONFIG_ARCH_TEGRA_3x_SOC
88 { "pll_m_out1", "pll_m", 275000000, true },
89 { "sclk", "pll_m_out1", 275000000, true },
90 { "hclk", "sclk", 275000000, true },
91 { "pclk", "hclk", 70000000, true },
92#else
Colin Cross170b2642010-11-03 11:42:20 -070093 { "pll_m_out1", "pll_m", 120000000, true },
94 { "sclk", "pll_m_out1", 120000000, true },
95 { "hclk", "sclk", 120000000, true },
96 { "pclk", "hclk", 60000000, true },
Alex Frid8b5ce662011-01-31 10:07:57 -080097#endif
Colin Crosscd51d0e2011-02-21 17:05:36 -080098 { "csite", NULL, 0, true },
99 { "emc", NULL, 0, true },
100 { "cpu", NULL, 0, true },
Jon Mayoa51a72a12011-01-05 11:17:30 -0800101 { "kfuse", NULL, 0, true },
Scott Williams816ab052010-12-07 11:19:20 -0800102 { "pll_u", NULL, 480000000, false },
Pavan Kunapuli4eae05f2011-02-02 23:20:22 -0800103 { "sdmmc1", "pll_p", 48000000, true},
104 { "sdmmc3", "pll_p", 48000000, true},
105 { "sdmmc4", "pll_p", 48000000, true},
Alex Frid7f970e72011-02-04 12:04:14 -0800106#ifdef CONFIG_ARCH_TEGRA_3x_SOC
107 { "vde", "pll_c", 300000000, false },
108#endif
Colin Crossd8611962010-01-28 16:40:29 -0800109 { NULL, NULL, 0, 0},
110};
Erik Gillingc5f80062010-01-21 16:53:02 -0800111
Colin Cross8e437c22010-11-28 22:36:08 -0800112void tegra_init_cache(void)
Erik Gillingc5f80062010-01-21 16:53:02 -0800113{
114#ifdef CONFIG_CACHE_L2X0
115 void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000;
Scott Williams191914c2010-12-27 19:03:57 -0800116 u32 aux_ctrl;
Erik Gillingc5f80062010-01-21 16:53:02 -0800117
Scott Williams816ab052010-12-07 11:19:20 -0800118#if defined(CONFIG_ARCH_TEGRA_2x_SOC)
Colin Cross535371c2011-01-22 00:36:14 -0800119 writel_relaxed(0x331, p + L2X0_TAG_LATENCY_CTRL);
120 writel_relaxed(0x441, p + L2X0_DATA_LATENCY_CTRL);
Erik Gillingc5f80062010-01-21 16:53:02 -0800121
Scott Williams816ab052010-12-07 11:19:20 -0800122#elif defined(CONFIG_ARCH_TEGRA_3x_SOC)
123#ifdef CONFIG_TEGRA_FPGA_PLATFORM
124 writel(0x770, p + L2X0_TAG_LATENCY_CTRL);
125 writel(0x770, p + L2X0_DATA_LATENCY_CTRL);
Scott Williams816ab052010-12-07 11:19:20 -0800126#else
Scott Williams1245c8e2011-01-05 17:53:39 -0800127 /* PL310 RAM latency is CPU dependent. NOTE: Changes here
128 must also be reflected in __cortex_a9_l2x0_restart */
129
130 if (is_lp_cluster()) {
131 writel(0x221, p + L2X0_TAG_LATENCY_CTRL);
132 writel(0x221, p + L2X0_DATA_LATENCY_CTRL);
133 } else {
134 writel(0x331, p + L2X0_TAG_LATENCY_CTRL);
135 writel(0x441, p + L2X0_DATA_LATENCY_CTRL);
136 }
Scott Williams816ab052010-12-07 11:19:20 -0800137#endif
138
139 /* Enable PL310 double line fill feature. */
140 writel(((1<<30) | 7), p + L2X0_PREFETCH_CTRL);
141#endif
Scott Williams191914c2010-12-27 19:03:57 -0800142 aux_ctrl = readl(p + L2X0_CACHE_TYPE);
143 aux_ctrl = (aux_ctrl & 0x700) << (17-8);
144 aux_ctrl |= 0x6C000001;
145 l2x0_init(p, aux_ctrl, 0x8200c3fe);
Erik Gillingc5f80062010-01-21 16:53:02 -0800146#endif
147}
148
Dima Zavin7db7cbc2010-09-16 17:58:05 -0700149static void __init tegra_init_power(void)
150{
151 tegra_powergate_power_off(TEGRA_POWERGATE_MPE);
152 tegra_powergate_power_off(TEGRA_POWERGATE_3D);
Roger Hsiehac108442011-03-21 16:51:36 +0800153 tegra_powergate_power_off(TEGRA_POWERGATE_PCIE);
Dima Zavin7db7cbc2010-09-16 17:58:05 -0700154}
155
Dima Zavin7e158ac2010-11-11 15:28:46 -0800156static bool console_flushed;
157
158static void tegra_pm_flush_console(void)
159{
160 if (console_flushed)
161 return;
162 console_flushed = true;
163
164 printk("\n");
165 pr_emerg("Restarting %s\n", linux_banner);
Colin Crossfec84b22011-04-07 14:40:23 -0700166 if (console_trylock()) {
167 console_unlock();
Dima Zavin7e158ac2010-11-11 15:28:46 -0800168 return;
169 }
170
171 mdelay(50);
172
173 local_irq_disable();
Colin Crossfec84b22011-04-07 14:40:23 -0700174 if (!console_trylock())
Dima Zavin7e158ac2010-11-11 15:28:46 -0800175 pr_emerg("tegra_restart: Console was locked! Busting\n");
176 else
177 pr_emerg("tegra_restart: Console was locked!\n");
Colin Crossfec84b22011-04-07 14:40:23 -0700178 console_unlock();
Dima Zavin7e158ac2010-11-11 15:28:46 -0800179}
180
181static void tegra_pm_restart(char mode, const char *cmd)
182{
183 tegra_pm_flush_console();
184 arm_machine_restart(mode, cmd);
185}
186
Colin Cross0cf62302011-02-21 17:10:14 -0800187void __init tegra_init_early(void)
Erik Gillingc5f80062010-01-21 16:53:02 -0800188{
Dima Zavin7e158ac2010-11-11 15:28:46 -0800189 arm_pm_restart = tegra_pm_restart;
Colin Cross73625e32010-06-23 15:49:17 -0700190 tegra_init_fuse();
Colin Cross45a1ca02011-03-28 17:47:31 -0700191 tegra_gpio_resume_init();
Colin Crossd8611962010-01-28 16:40:29 -0800192 tegra_init_clock();
Colin Cross120c3562011-03-28 17:48:56 -0700193 tegra_init_pinmux();
Colin Crossd8611962010-01-28 16:40:29 -0800194 tegra_clk_init_from_table(common_clk_init_table);
Dima Zavin7db7cbc2010-09-16 17:58:05 -0700195 tegra_init_power();
Erik Gillingc5f80062010-01-21 16:53:02 -0800196 tegra_init_cache();
Hiro Sugawarac00e4312011-01-19 13:57:30 -0800197#ifndef CONFIG_ARCH_TEGRA_2x_SOC
198 tegra_mc_init(); /* !!!FIXME!!! Change Tegra3 behavior to match Tegra2 */
199#endif
Erik Gillingc5f80062010-01-21 16:53:02 -0800200}
Colin Cross8e437c22010-11-28 22:36:08 -0800201
202static int __init tegra_lp0_vec_arg(char *options)
203{
204 char *p = options;
205
206 tegra_lp0_vec_size = memparse(p, &p);
207 if (*p == '@')
208 tegra_lp0_vec_start = memparse(p+1, &p);
Scott Williams03122532011-01-13 14:30:20 -0800209 if (!tegra_lp0_vec_size || !tegra_lp0_vec_start) {
210 tegra_lp0_vec_size = 0;
211 tegra_lp0_vec_start = 0;
212 }
Colin Cross8e437c22010-11-28 22:36:08 -0800213
214 return 0;
215}
216early_param("lp0_vec", tegra_lp0_vec_arg);
217
Colin Cross838d7d62010-10-19 14:45:50 -0700218static int __init tegra_bootloader_fb_arg(char *options)
219{
220 char *p = options;
Scott Williams03122532011-01-13 14:30:20 -0800221 unsigned long start;
222 unsigned long size;
Colin Cross838d7d62010-10-19 14:45:50 -0700223
224 tegra_bootloader_fb_size = memparse(p, &p);
225 if (*p == '@')
226 tegra_bootloader_fb_start = memparse(p+1, &p);
227
228 pr_info("Found tegra_fbmem: %08lx@%08lx\n",
229 tegra_bootloader_fb_size, tegra_bootloader_fb_start);
230
231 return 0;
232}
233early_param("tegra_fbmem", tegra_bootloader_fb_arg);
234
Nitin Kumbhar637ced42010-12-10 15:16:37 +0530235static int __init tegra_board_info_parse(char *info)
236{
237 char *p;
238 int pos = 0;
239 struct board_info *bi = &tegra_board_info;
240
241 while (info && *info) {
242 if ((p = strchr(info, ':')))
243 *p++ = '\0';
244
245 if (strlen(info) > 0) {
246 switch(pos) {
247 case 0:
248 bi->board_id = simple_strtol(info, NULL, 16);
249 break;
250 case 1:
251 bi->sku = simple_strtol(info, NULL, 16);
252 break;
253 case 2:
254 bi->fab = simple_strtol(info, NULL, 16);
255 break;
256 case 3:
257 bi->major_revision = simple_strtol(info, NULL, 16);
258 break;
259 case 4:
260 bi->minor_revision = simple_strtol(info, NULL, 16);
261 break;
262 default:
263 break;
264 }
265 }
266
267 info = p;
268 pos++;
269 }
270
Laxman Dewangan8a16d8c82011-02-03 19:42:15 +0530271 pr_info("board info: Id:%d%2d SKU:%d%02d Fab:%d Rev:%c MinRev:%d\n",
Nitin Kumbhar637ced42010-12-10 15:16:37 +0530272 bi->board_id >> 8 & 0xFF, bi->board_id & 0xFF,
Laxman Dewangan8a16d8c82011-02-03 19:42:15 +0530273 bi->sku >> 8 & 0xFF, bi->sku & 0xFF, bi->fab,
274 bi->major_revision, bi->minor_revision);
Nitin Kumbhar637ced42010-12-10 15:16:37 +0530275
276 return 1;
277}
278
279__setup("board_info=", tegra_board_info_parse);
280
Pradeep Goudagunta3dd04c42011-03-23 23:16:12 +0530281static int __init tegra_debug_uartport(char *info)
282{
283 if (!strcmp(info, "hsport"))
284 is_tegra_debug_uart_hsport = true;
285 else if (!strcmp(info, "lsport"))
286 is_tegra_debug_uart_hsport = false;
287
288 return 1;
289}
290
291bool is_tegra_debug_uartport_hs(void)
292{
293 return is_tegra_debug_uart_hsport;
294}
295
296__setup("debug_uartport=", tegra_debug_uartport);
297
Nitin Kumbhar637ced42010-12-10 15:16:37 +0530298void tegra_get_board_info(struct board_info *bi)
299{
300 memcpy(bi, &tegra_board_info, sizeof(*bi));
301}
302
Colin Crossf9c9bde2010-10-19 16:12:33 -0700303/*
304 * Tegra has a protected aperture that prevents access by most non-CPU
305 * memory masters to addresses above the aperture value. Enabling it
306 * secures the CPU's memory from the GPU, except through the GART.
307 */
308void __init tegra_protected_aperture_init(unsigned long aperture)
309{
310#ifndef CONFIG_NVMAP_ALLOW_SYSMEM
311 void __iomem *mc_base = IO_ADDRESS(TEGRA_MC_BASE);
312 pr_info("Enabling Tegra protected aperture at 0x%08lx\n", aperture);
313 writel(aperture, mc_base + MC_SECURITY_CFG2);
314#else
315 pr_err("Tegra protected aperture disabled because nvmap is using "
316 "system memory\n");
317#endif
318}
319
Colin Cross115467a2010-10-19 21:09:29 -0700320/*
321 * Due to conflicting restrictions on the placement of the framebuffer,
322 * the bootloader is likely to leave the framebuffer pointed at a location
323 * in memory that is outside the grhost aperture. This function will move
324 * the framebuffer contents from a physical address that is anywher (lowmem,
325 * highmem, or outside the memory map) to a physical address that is outside
326 * the memory map.
327 */
328void tegra_move_framebuffer(unsigned long to, unsigned long from,
329 unsigned long size)
330{
331 struct page *page;
332 void __iomem *to_io;
333 void *from_virt;
334 unsigned long i;
335
336 BUG_ON(PAGE_ALIGN((unsigned long)to) != (unsigned long)to);
337 BUG_ON(PAGE_ALIGN(from) != from);
338 BUG_ON(PAGE_ALIGN(size) != size);
339
340 to_io = ioremap(to, size);
341 if (!to_io) {
342 pr_err("%s: Failed to map target framebuffer\n", __func__);
343 return;
344 }
345
Colin Cross115467a2010-10-19 21:09:29 -0700346 if (pfn_valid(page_to_pfn(phys_to_page(from)))) {
347 for (i = 0 ; i < size; i += PAGE_SIZE) {
348 page = phys_to_page(from + i);
349 from_virt = kmap(page);
350 memcpy_toio(to_io + i, from_virt, PAGE_SIZE);
351 kunmap(page);
352 }
353 } else {
354 void __iomem *from_io = ioremap(from, size);
355 if (!from_io) {
356 pr_err("%s: Failed to map source framebuffer\n",
357 __func__);
358 goto out;
359 }
360
361 for (i = 0; i < size; i+= 4)
362 writel(readl(from_io + i), to_io + i);
363
364 iounmap(from_io);
365 }
366out:
367 iounmap(to_io);
368}
369
Colin Cross838d7d62010-10-19 14:45:50 -0700370void __init tegra_reserve(unsigned long carveout_size, unsigned long fb_size,
371 unsigned long fb2_size)
372{
373 if (tegra_lp0_vec_size)
Scott Williams03122532011-01-13 14:30:20 -0800374 if (memblock_reserve(tegra_lp0_vec_start, tegra_lp0_vec_size)) {
Colin Cross838d7d62010-10-19 14:45:50 -0700375 pr_err("Failed to reserve lp0_vec %08lx@%08lx\n",
376 tegra_lp0_vec_size, tegra_lp0_vec_start);
Scott Williams03122532011-01-13 14:30:20 -0800377 tegra_lp0_vec_start = 0;
378 tegra_lp0_vec_size = 0;
379 }
Colin Cross838d7d62010-10-19 14:45:50 -0700380
Scott Williams03122532011-01-13 14:30:20 -0800381 if (carveout_size) {
382 tegra_carveout_start = memblock_end_of_DRAM() - carveout_size;
383 if (memblock_remove(tegra_carveout_start, carveout_size)) {
384 pr_err("Failed to remove carveout %08lx@%08lx "
385 "from memory map\n",
386 tegra_carveout_start, carveout_size);
387 tegra_carveout_start = 0;
388 tegra_carveout_size = 0;
389 }
390 else
391 tegra_carveout_size = carveout_size;
392 }
Colin Cross838d7d62010-10-19 14:45:50 -0700393
Scott Williams03122532011-01-13 14:30:20 -0800394 if (fb2_size) {
395 tegra_fb2_start = memblock_end_of_DRAM() - fb2_size;
396 if (memblock_remove(tegra_fb2_start, fb2_size)) {
397 pr_err("Failed to remove second framebuffer %08lx@%08lx "
398 "from memory map\n",
399 tegra_fb2_start, fb2_size);
400 tegra_fb2_start = 0;
401 tegra_fb2_size = 0;
402 } else
403 tegra_fb2_size = fb2_size;
404 }
Colin Cross838d7d62010-10-19 14:45:50 -0700405
Scott Williams03122532011-01-13 14:30:20 -0800406 if (fb_size) {
407 tegra_fb_start = memblock_end_of_DRAM() - fb_size;
408 if (memblock_remove(tegra_fb_start, fb_size)) {
409 pr_err("Failed to remove framebuffer %08lx@%08lx "
410 "from memory map\n",
411 tegra_fb_start, fb_size);
412 tegra_fb_start = 0;
413 tegra_fb_size = 0;
414 } else
415 tegra_fb_size = fb_size;
416 }
Colin Cross838d7d62010-10-19 14:45:50 -0700417
Colin Crossf9c9bde2010-10-19 16:12:33 -0700418 if (tegra_fb_size)
419 tegra_grhost_aperture = tegra_fb_start;
420
421 if (tegra_fb2_size && tegra_fb2_start < tegra_grhost_aperture)
422 tegra_grhost_aperture = tegra_fb2_start;
423
424 if (tegra_carveout_size && tegra_carveout_start < tegra_grhost_aperture)
425 tegra_grhost_aperture = tegra_carveout_start;
426
Colin Cross838d7d62010-10-19 14:45:50 -0700427 /*
428 * TODO: We should copy the bootloader's framebuffer to the framebuffer
429 * allocated above, and then free this one.
430 */
431 if (tegra_bootloader_fb_size)
432 if (memblock_reserve(tegra_bootloader_fb_start,
Scott Williams03122532011-01-13 14:30:20 -0800433 tegra_bootloader_fb_size)) {
434 pr_err("Failed to reserve bootloader frame buffer %08lx@%08lx\n",
435 tegra_bootloader_fb_size, tegra_bootloader_fb_start);
436 tegra_bootloader_fb_start = 0;
437 tegra_bootloader_fb_size = 0;
438 }
Colin Cross838d7d62010-10-19 14:45:50 -0700439
440 pr_info("Tegra reserved memory:\n"
441 "LP0: %08lx - %08lx\n"
442 "Bootloader framebuffer: %08lx - %08lx\n"
443 "Framebuffer: %08lx - %08lx\n"
Scott Williams22d51692011-01-11 10:50:52 -0800444 "2nd Framebuffer: %08lx - %08lx\n"
Colin Cross838d7d62010-10-19 14:45:50 -0700445 "Carveout: %08lx - %08lx\n",
446 tegra_lp0_vec_start,
Scott Williams03122532011-01-13 14:30:20 -0800447 tegra_lp0_vec_size ?
448 tegra_lp0_vec_start + tegra_lp0_vec_size - 1 : 0,
Colin Cross838d7d62010-10-19 14:45:50 -0700449 tegra_bootloader_fb_start,
Scott Williams03122532011-01-13 14:30:20 -0800450 tegra_bootloader_fb_size ?
451 tegra_bootloader_fb_start + tegra_bootloader_fb_size - 1 : 0,
Colin Cross838d7d62010-10-19 14:45:50 -0700452 tegra_fb_start,
Scott Williams03122532011-01-13 14:30:20 -0800453 tegra_fb_size ?
454 tegra_fb_start + tegra_fb_size - 1 : 0,
Colin Cross838d7d62010-10-19 14:45:50 -0700455 tegra_fb2_start,
Scott Williams03122532011-01-13 14:30:20 -0800456 tegra_fb2_size ?
457 tegra_fb2_start + tegra_fb2_size - 1 : 0,
Colin Cross838d7d62010-10-19 14:45:50 -0700458 tegra_carveout_start,
Scott Williams03122532011-01-13 14:30:20 -0800459 tegra_carveout_size ?
460 tegra_carveout_start + tegra_carveout_size - 1 : 0);
Colin Cross838d7d62010-10-19 14:45:50 -0700461}