static int __init parse_tag_nvidia(const struct tag *tag) { const char *addr = (const char *)&tag->hdr + sizeof(struct tag_header); const struct tag_nvidia_tegra *nvtag = (const struct tag_nvidia_tegra*)addr; if (nvtag->bootarg_key >= ATAG_NVIDIA_PRESERVED_MEM_0 && nvtag->bootarg_key < (ATAG_NVIDIA_PRESERVED_MEM_0+ATAG_NVIDIA_PRESERVED_MEM_N) ) { int Index = nvtag->bootarg_key - ATAG_NVIDIA_PRESERVED_MEM_0; struct NVBOOTARGS_PreservedMemHandle *dst = &NvBootArgs.MemHandleArgs[Index]; const struct NVBOOTARGS_PreservedMemHandle *src = (const struct NVBOOTARGS_PreservedMemHandle *) nvtag->bootarg; if (nvtag->bootarg_len != sizeof(*dst)) { pr_err("Unexpected preserved memory handle tag length (expected: %d, got: %d!\n", sizeof(*dst), nvtag->bootarg_len); } else { pr_debug("Preserved memhandle: 0x%08x, address: 0x%08x, size: %d\n", nvtag->bootarg_key, src->Address, src->Size); memcpy(dst,src,sizeof(*dst)); } return get_cfg_from_tags(); } switch (nvtag->bootarg_key) { case ATAG_NVIDIA_FRAMEBUFFER: { struct NVBOOTARGS_Framebuffer *dst = &NvBootArgs.FramebufferArgs; const struct NVBOOTARGS_Framebuffer *src = (const struct NVBOOTARGS_Framebuffer *)nvtag->bootarg; if (nvtag->bootarg_len != sizeof(*dst)) { pr_err("Unexpected framebuffer tag length (expected: %d, got: %d!\n", sizeof(*dst), nvtag->bootarg_len); } else { pr_debug("Framebuffer tag with 0x%08x handle, size: %d\n", src->MemHandleKey,src->Size); memcpy(dst,src,sizeof(*dst)); } return get_cfg_from_tags(); } case ATAG_NVIDIA_WARMBOOT: { struct NVBOOTARGS_Warmboot *dst = &NvBootArgs.WarmbootArgs; const struct NVBOOTARGS_Warmboot *src = (const struct NVBOOTARGS_Warmboot *)nvtag->bootarg; if (nvtag->bootarg_len != sizeof(*dst)) { pr_err("Unexpected Warnboot tag length (expected: %d, got: %d!\n", sizeof(*dst), nvtag->bootarg_len); } else { pr_debug("Found a warmboot tag with handle 0x%08x!\n", src->MemHandleKey); memcpy(dst,src,sizeof(*dst)); } return get_cfg_from_tags(); } default: pr_info("Ignoring irrelevant nvidia tag 0x%04x!\n", nvtag->bootarg_key); break; } return 0; }
static int __init parse_tag_nvidia(const struct tag *tag) { const char *addr = (const char *)&tag->hdr + sizeof(struct tag_header); const struct tag_tegra *nvtag = (const struct tag_tegra*)addr; if (nvtag->bootarg_key >= ATAG_NVIDIA_PRESERVED_MEM_0 && nvtag->bootarg_key < (ATAG_NVIDIA_PRESERVED_MEM_0+ATAG_NVIDIA_PRESERVED_MEM_N) ) { int Index = nvtag->bootarg_key - ATAG_NVIDIA_PRESERVED_MEM_0; struct NVBOOTARGS_PreservedMemHandle *dst = &NvBootArgs.MemHandleArgs[Index]; const struct NVBOOTARGS_PreservedMemHandle *src = (const struct NVBOOTARGS_PreservedMemHandle *) nvtag->bootarg; if (nvtag->bootarg_len != sizeof(*dst)) { pr_err("Unexpected preserved memory handle tag length (expected: %d, got: %d!\n", sizeof(*dst), nvtag->bootarg_len); } else { pr_debug("Preserved memhandle: 0x%08x, address: 0x%08x, size: %d\n", nvtag->bootarg_key, src->Address, src->Size); memcpy(dst,src,sizeof(*dst)); } return get_cfg_from_tags(); } switch (nvtag->bootarg_key) { case ATAG_NVIDIA_CHIPSHMOO: { struct NVBOOTARGS_ChipShmoo *dst = &NvBootArgs.ChipShmooArgs; const struct NVBOOTARGS_ChipShmoo *src = (const struct NVBOOTARGS_ChipShmoo *)nvtag->bootarg; if (nvtag->bootarg_len != sizeof(*dst)) { pr_err("Unexpected preserved memory handle tag length (expected: %d, got: %d!\n", sizeof(*dst), nvtag->bootarg_len); } else { pr_debug("Shmoo tag with 0x%08x handle\n", src->MemHandleKey); memcpy(dst,src,sizeof(*dst)); } return get_cfg_from_tags(); } case ATAG_NVIDIA_DISPLAY: { struct NVBOOTARGS_Display *dst = &NvBootArgs.DisplayArgs; const struct NVBOOTARGS_Display *src = (const struct NVBOOTARGS_Display *)nvtag->bootarg; if (nvtag->bootarg_len != sizeof(*dst)) { pr_err("Unexpected display tag length (expected: %d, got: %d!\n", sizeof(*dst), nvtag->bootarg_len); } else { memcpy(dst,src,sizeof(*dst)); } return get_cfg_from_tags(); } case ATAG_NVIDIA_FRAMEBUFFER: { struct NVBOOTARGS_Framebuffer *dst = &NvBootArgs.FramebufferArgs; const struct NVBOOTARGS_Framebuffer *src = (const struct NVBOOTARGS_Framebuffer *)nvtag->bootarg; if (nvtag->bootarg_len != sizeof(*dst)) { pr_err("Unexpected framebuffer tag length (expected: %d, got: %d!\n", sizeof(*dst), nvtag->bootarg_len); } else { pr_debug("Framebuffer tag with 0x%08x handle, size: %d\n", src->MemHandleKey,src->Size); memcpy(dst,src,sizeof(*dst)); } return get_cfg_from_tags(); } case ATAG_NVIDIA_RM: { struct NVBOOTARGS_Rm *dst = &NvBootArgs.RmArgs; const struct NVBOOTARGS_Rm *src = (const struct NVBOOTARGS_Rm *)nvtag->bootarg; if (nvtag->bootarg_len != sizeof(*dst)) { pr_err("Unexpected RM tag length (expected: %d, got: %d!\n", sizeof(*dst), nvtag->bootarg_len); } else { memcpy(dst,src,sizeof(*dst)); } return get_cfg_from_tags(); } case ATAG_NVIDIA_CHIPSHMOOPHYS: { struct NVBOOTARGS_ChipShmooPhys *dst = &NvBootArgs.ChipShmooPhysArgs; const struct NVBOOTARGS_ChipShmooPhys *src = (const struct NVBOOTARGS_ChipShmooPhys *)nvtag->bootarg; if (nvtag->bootarg_len != sizeof(*dst)) { pr_err("Unexpected phys shmoo tag length (expected: %d, got: %d!\n", sizeof(*dst), nvtag->bootarg_len); } else { pr_debug("Phys shmoo tag with pointer 0x%x and length %u\n", src->PhysShmooPtr, src->Size); memcpy(dst,src,sizeof(*dst)); } return get_cfg_from_tags(); } case ATAG_NVIDIA_WARMBOOT: { struct NVBOOTARGS_Warmboot *dst = &NvBootArgs.WarmbootArgs; const struct NVBOOTARGS_Warmboot *src = (const struct NVBOOTARGS_Warmboot *)nvtag->bootarg; if (nvtag->bootarg_len != sizeof(*dst)) { pr_err("Unexpected Warnboot tag length (expected: %d, got: %d!\n", sizeof(*dst), nvtag->bootarg_len); } else { pr_debug("Found a warmboot tag with handle 0x%08x!\n", src->MemHandleKey); memcpy(dst,src,sizeof(*dst)); } return get_cfg_from_tags(); } default: return get_cfg_from_tags(); } return get_cfg_from_tags(); }