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;
}
Ejemplo n.º 2
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();
}