diff options
-rw-r--r-- | arch/arm/mach-tegra/include/nvbootargs.h | 14 | ||||
-rw-r--r-- | arch/arm/mach-tegra/nvos/nvos.c | 22 |
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; } |