summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerrit Code Review <gerrit2@git-master.nvidia.com>2010-01-20 05:05:43 +0200
committerGerrit Code Review <gerrit2@git-master.nvidia.com>2010-01-20 05:05:43 +0200
commit646ce4ccb5864590c95327826a4bdc5b68c1b2ba (patch)
tree6c023f9ebb2a5b34f0a734826680b35eae66ed91
parentf6bd461ac2bcf4927c42c52c835bf4a47ac757f8 (diff)
parent42c23da437b457743645733170aa8fdcbb80c4ff (diff)
Merge change Ib8c2a45c into android-tegra-2.6.29
* changes: tegra power: Add Warmboot boot arg to the kernel
-rw-r--r--arch/arm/mach-tegra/include/nvbootargs.h14
-rw-r--r--arch/arm/mach-tegra/nvos/nvos.c22
2 files changed, 34 insertions, 2 deletions
diff --git a/arch/arm/mach-tegra/include/nvbootargs.h b/arch/arm/mach-tegra/include/nvbootargs.h
index 7dc32a8a3204..908c26f0ea52 100644
--- a/arch/arm/mach-tegra/include/nvbootargs.h
+++ b/arch/arm/mach-tegra/include/nvbootargs.h
@@ -44,7 +44,7 @@
* The maximum number of memory handles that may be preserved across the
* bootloader-to-OS transition. @see NvRmBootArg_PreservedMemHandle.
*/
-#define NV_BOOTARGS_MAX_PRESERVED_MEMHANDLES 2
+#define NV_BOOTARGS_MAX_PRESERVED_MEMHANDLES 3
#if defined(__cplusplus)
extern "C"
@@ -60,6 +60,7 @@ typedef enum
NvBootArgKey_ChipShmoo,
NvBootArgKey_ChipShmooPhys,
NvBootArgKey_Carveout,
+ NvBootArgKey_WarmBoot,
NvBootArgKey_PreservedMemHandle_0 = 0x10000,
NvBootArgKey_PreservedMemHandle_Num = (NvBootArgKey_PreservedMemHandle_0 +
NV_BOOTARGS_MAX_PRESERVED_MEMHANDLES),
@@ -87,6 +88,16 @@ typedef struct NvBootArgsCarveoutRec
} NvBootArgsCarveout;
/**
+ * Warmbootloader boot args. This structure only contains
+ * a mem handle key to preserve the warm bootloader
+ * across the bootloader->os transition
+ */
+typedef struct NvBootArgsWarmbootRec
+{
+ NvU32 MemHandleKey;
+} NvBootArgsWarmboot;
+
+/**
* PreservedMemHandle boot args, indexed by PreservedMemHandle_0 + n.
* All values n from 0 to the first value which does not return NvSuccess will
* be quered at RM initialization in the OS environment. If present, a new
@@ -212,6 +223,7 @@ typedef struct NvBootArgsRec
NvBootArgsFramebuffer FramebufferArgs;
NvBootArgsChipShmoo ChipShmooArgs;
NvBootArgsChipShmooPhys ChipShmooPhysArgs;
+ NvBootArgsWarmboot WarmbootArgs;
NvBootArgsPreservedMemHandle MemHandleArgs[NVBOOTARG_NUM_PRESERVED_HANDLES];
} NvBootArgs;
diff --git a/arch/arm/mach-tegra/nvos/nvos.c b/arch/arm/mach-tegra/nvos/nvos.c
index b5e5b0181ea0..620c9ed1b624 100644
--- a/arch/arm/mach-tegra/nvos/nvos.c
+++ b/arch/arm/mach-tegra/nvos/nvos.c
@@ -161,7 +161,7 @@ typedef struct NvOsInterruptBlockRec
static NvOsInterruptBlock *s_pIrqList[NVOS_MAX_SYSTEM_IRQS] = { NULL };
-static NvBootArgs s_BootArgs = { {0}, {0}, {0}, {0}, {0}, {{0}} };
+static NvBootArgs s_BootArgs = { {0}, {0}, {0}, {0}, {0}, {0}, {{0}} };
/* Defined in mach-tegra/irq.c. Stores the number of native (non-GPIO) SoC
* IRQs. */
@@ -1707,6 +1707,10 @@ NvError NvOsBootArgGet(NvU32 key, void *arg, NvU32 size)
break;
case NvBootArgKey_Carveout:
return NvOsGetCarveoutParam((NvBootArgsCarveout*)arg, size);
+ case NvBootArgKey_WarmBoot:
+ src = &s_BootArgs.WarmbootArgs;
+ size_src = sizeof(NvBootArgsWarmboot);
+ break;
default:
src = NULL;
size_src = 0;
@@ -1906,6 +1910,22 @@ static int __init parse_tegra_tag(const struct tag *tag)
}
return 0;
}
+ case NvBootArgKey_WarmBoot:
+ {
+ NvBootArgsWarmboot *dst = &s_BootArgs.WarmbootArgs;
+ const NvBootArgsWarmboot *src =
+ (const NvBootArgsWarmboot *)nvtag->bootarg;
+
+ if (nvtag->bootarg_len != sizeof(NvBootArgsWarmboot))
+ printk("Unexpected warmboot tag length!\n");
+ else
+ {
+ printk("Found a warmboot tag!\n");
+ *dst = *src;
+ }
+ return 0;
+ }
+
default:
return 0;
}