/*
 * Copyright (c) 2018 The Fuchsia Authors
 *
 * SPDX-License-Identifier:	BSD-3-Clause
 */

#ifndef _ZIRCON_ZIRCON_H_
#define _ZIRCON_ZIRCON_H_

#include <libabr/abr.h>
#include <libabr/ops.h>
#include <zircon/boot/image.h>
#include <zircon/boot/driver-config.h>
#include <zircon/hw/gpt.h>

#if defined(DEV_BUILD_CONFIG)
#define BOOTLOADER_BUILD_VARIANT "dev"
#elif defined(DOGFOOD_BUILD_CONFIG)
#define BOOTLOADER_BUILD_VARIANT "dogfood"
#elif defined(PROD_BUILD_CONFIG)
#define BOOTLOADER_BUILD_VARIANT "prod"
#else
#error Unknown bootloader build variant
#endif

/* called before booting to allow board specific additions to the bootdata */
int zircon_preboot(zbi_header_t *zbi);

/**
 * Maps slot index to partition name.
 * Returns empty string for invalid slot_index.
 */
const char *zircon_slot_idx_to_part_name(AbrSlotIndex slot_index);

/* AbrOps implementation. */
const AbrOps *zircon_abr_ops(void);

/**
 * Name of partition containing A/B/R config data - normally "misc" or
 * "durable_boot".
 */
extern const char *zircon_abr_partition_name;

/**
 * slot suffix of the current tpl slot (i.e. _a, _b or _r). It is determined
 * when entering u-boot.
 */
extern const char *g_tpl_slot;

/**
 * Loads zircon image using A/B/R scheme.
 *
 * @loadaddr: Address at which to load the zircon image.
 * @loadsize: Size of the load buffer.
 * @img_offset: Set to entry point offset. Zero if unknown.
 *
 * Return: 0 if successful, negative value on failure.
 */
int zircon_abr_img_load(unsigned char *loadaddr, size_t loadsize,
			size_t *img_offset);

/**
 * Stages a ZBI_TYPE_BOOTLOADER_FILE item.
 *
 * This functionality is used by fastboot before the ZBI is loaded into
 * memory, so we can't append it to the prebuilt ZBI directly. Instead we
 * stage it in a buffer and it will be appended by zircon_fixup_zbi().
 *
 * @name: file name.
 * @data: file contents.
 * @data_len: contents length.
 *
 * Returns: 0 on success, nonzero on failure.
 */
int zircon_stage_zbi_file(const char *name, const uint8_t *data,
			  size_t data_len);

/**
 * Modifies the ZBI to add bootloader-generated items.
 *
 * This should be called exactly once after the prebuilt ZBI has been loaded
 * into memory, before booting it.
 *
 * @zbi: ZBI container.
 * @capacity: Total available space the container can expand to.
 * @slot: Zircon slot we're booting into.
 *
 * Returns: 0 on success, nonzero on failure.
 */
int zircon_fixup_zbi(zbi_header_t *zbi, size_t capacity);

/**
 * Modifies the ZBI to add bootloader-generated items.
 *
 * This should be called exactly once after the prebuilt ZBI has been loaded
 * into memory, before booting it.
 *
 * @zbi: ZBI container.
 * @capacity: Total available space the container can expand to.
 *
 * Returns: 0 on success, nonzero on failure.
 */
int zircon_fixup_zbi_no_slot(zbi_header_t *zbi, size_t capacity);


/**
 * Adds a ZBI item to the given container.
 *
 * This is a thin wrapper around libzbi's zbi_create_entry_with_payload(),
 * which adds:
 *  - additional length checks to prevent uint32_t overflow
 *  - automatic logging if appending the item fails
 *
 * @zbi: ZBI container.
 * @capacity: ZBI container capacity.
 * @type: ZBI item type to add.
 * @extra: ZBI item extra value.
 * @payload: ZBI item payload.
 * @size: ZBI item payload size.
 *
 * Return: 0 on success, nonzero on error.
 */
int append_zbi_item_or_log(void *zbi, size_t capacity, uint32_t type,
			   uint32_t extra, const void *payload, size_t size);

#endif
