/*
 * Copyright (C) 2020 Benson Leung <bleung@chromium.org>
 *
 * SPDX-License-Identifier: LGPL-2.1+
 */

#pragma once

#include "fu-firmware.h"
#include "fu-fmap-firmware.h"
#include "fu-cros-ec-common.h"

#define FU_TYPE_CROS_EC_FIRMWARE (fu_cros_ec_firmware_get_type ())
G_DECLARE_FINAL_TYPE (FuCrosEcFirmware, fu_cros_ec_firmware, FU, CROS_EC_FIRMWARE, FuFmapFirmware)

/*
 * Each RO or RW section of the new image can be in one of the following
 * states.
 */
typedef enum {
	FU_CROS_EC_FW_NOT_NEEDED= 0,	/* Version below or equal that on the target. */
	FU_CROS_EC_FW_NOT_POSSIBLE,	/*
					 * RO is newer, but can't be transferred due to
					 * target RW shortcomings.
					 */
	FU_CROS_EC_FW_NEEDED		/*
					 * This section needs to be transferred to the
					 * target.
					 */
} FuCrosEcFirmwareUpgradeStatus;

typedef struct {
	const gchar			*name;
	guint32				offset;
	gsize				size;
	FuCrosEcFirmwareUpgradeStatus	ustatus;
	gchar				raw_version[FU_FMAP_FIRMWARE_STRLEN];
	struct cros_ec_version		version;
	gint32				rollback;
	guint32				key_version;
	guint64				image_idx;
} FuCrosEcFirmwareSection;

gboolean			 fu_cros_ec_firmware_pick_sections	(FuCrosEcFirmware *self,
									 guint32 writeable_offset,
									 GError **error);
GPtrArray			*fu_cros_ec_firmware_get_sections	(FuCrosEcFirmware *self);
FuFirmware			*fu_cros_ec_firmware_new		(void);
