/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * High-level firmware API for loading and verifying kernel.
 * (Firmware Portion)
 */

#ifndef VBOOT_REFERENCE_LOAD_KERNEL_FW_H_
#define VBOOT_REFERENCE_LOAD_KERNEL_FW_H_

#include "vboot_api.h"
#include "vboot_nvstorage.h"

/* Interface provided by verified boot library to BDS */

/* Boot flags for LoadKernel().boot_flags */
/* Developer switch is on */
#define BOOT_FLAG_DEVELOPER (0x01ULL)
/* In recovery mode */
#define BOOT_FLAG_RECOVERY  (0x02ULL)

struct RollbackSpaceFwmp;

typedef struct LoadKernelParams {
	/* Inputs to LoadKernel() */
	/*
	 * Buffer for data shared between LoadFirmware() and LoadKernel().
	 * Pass the same buffer which was passed to LoadFirmware().
	 */
	void *shared_data_blob;
	/*
	 * Size of shared data blob buffer, in bytes.  On output, this will
	 * contain the actual data size placed into the buffer.
	 */
	uint64_t shared_data_size;
	/* Pointer to GBB data */
	void *gbb_data;
	/* Size of GBB data in bytes */
	uint64_t gbb_size;
	/* Disk handle for current device */
	VbExDiskHandle_t disk_handle;
	/* Bytes per lba sector on current device */
	uint64_t bytes_per_lba;
	/* Last addressable lba sector on current device */
	uint64_t ending_lba;
	/* Destination buffer for kernel (normally at 0x100000) */
	void *kernel_buffer;
	/* Size of kernel buffer in bytes */
	uint64_t kernel_buffer_size;
	/* Boot flags */
	uint64_t boot_flags;
	/*
	 * Context for NV storage.  Caller is responsible for calling
	 * VbNvSetup() and VbNvTeardown() on the context.
	 */
	VbNvContext *nv_context;
	/* Firmware management parameters; may be NULL if not present. */
	const struct RollbackSpaceFwmp *fwmp;

	/*
	 * Outputs from LoadKernel(); valid only if LoadKernel() returns
	 * LOAD_KERNEL_SUCCESS
	 */
	/* Partition number to boot on current device (1...M) */
	uint64_t partition_number;
	/* Address of bootloader image in RAM */
	uint64_t bootloader_address;
	/* Size of bootloader image in bytes */
	uint64_t bootloader_size;
	/* UniquePartitionGuid for boot partition */
	uint8_t  partition_guid[16];
} LoadKernelParams;

/**
 * Attempt to load the kernel from the current device.
 *
 * Returns VBERROR_SUCCESS if successful.  If unsuccessful, sets a recovery
 * reason via VbNvStorage and returns an error code.
 */
VbError_t LoadKernel(LoadKernelParams *params, VbCommonParams *cparams);

/*
 * The bootloader is loaded using the EFI LoadImage() and StartImage() calls.
 * Pass this struct via loaded_image->load_options.
 */
typedef struct KernelBootloaderOptions {
	/* Drive number of boot device (0...N) */
	uint64_t drive_number;
	/*
	 * Partition number, as returned from LoadKernel() in
	 * LoadKernelParams.partition_number
	 */
	uint64_t partition_number;
	/*
	 * Absolute bootloader start adddress, as returned from LoadKernel() in
	 * LoadKernelParams.bootloader_start
	 */
	uint64_t original_address;
	  /* UniquePartitionGuid for boot partition */
	uint8_t partition_guid[16];
} KernelBootloaderOptions;

#endif  /* VBOOT_REFERENCE_LOAD_KERNEL_FW_H_ */
