/*
 * (C) Copyright 2014
 * Texas Instruments Incorporated
 * Add gpimage format for keystone devices to format spl image. This is
 * Based on omapimage.c
 *
 * (C) Copyright 2010
 * Linaro LTD, www.linaro.org
 * Author: John Rigby <john.rigby@linaro.org>
 * Based on TI's signGP.c
 *
 * (C) Copyright 2009
 * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
 *
 * (C) Copyright 2008
 * Marvell Semiconductor <www.marvell.com>
 * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include "imagetool.h"
#include <compiler.h>
#include <image.h>
#include "gpheader.h"

static uint8_t gpimage_header[GPIMAGE_HDR_SIZE];

/* to be in keystone gpimage */
static int gpimage_check_image_types(uint8_t type)
{
	if (type == IH_TYPE_GPIMAGE)
		return EXIT_SUCCESS;
	return EXIT_FAILURE;
}

static int gpimage_verify_header(unsigned char *ptr, int image_size,
			struct image_tool_params *params)
{
	struct gp_header *gph = (struct gp_header *)ptr;

	return gph_verify_header(gph, 1);
}

static void gpimage_print_header(const void *ptr)
{
	const struct gp_header *gph = (struct gp_header *)ptr;

	gph_print_header(gph, 1);
}

static void gpimage_set_header(void *ptr, struct stat *sbuf, int ifd,
				struct image_tool_params *params)
{
	struct gp_header *gph = (struct gp_header *)ptr;

	gph_set_header(gph, sbuf->st_size - GPIMAGE_HDR_SIZE, params->addr, 1);
}

/*
 * gpimage parameters
 */
static struct image_type_params gpimage_params = {
	.name		= "TI KeyStone GP Image support",
	.header_size	= GPIMAGE_HDR_SIZE,
	.hdr		= (void *)&gpimage_header,
	.check_image_type = gpimage_check_image_types,
	.verify_header	= gpimage_verify_header,
	.print_header	= gpimage_print_header,
	.set_header	= gpimage_set_header,
	.check_params	= gpimage_check_params,
};

void init_gpimage_type(void)
{
	register_image_type(&gpimage_params);
}
