/* SPDX-License-Identifier: BSD-2-Clause */
/*
 * OP-TEE related definitions
 *
 * (C) Copyright 2016 Linaro Limited
 * Andrew F. Davis <andrew.davis@linaro.org>
 */

#ifndef	_OPTEE_H
#define _OPTEE_H

#include <linux/errno.h>

#define OPTEE_MAGIC             0x4554504f
#define OPTEE_VERSION           1
#define OPTEE_ARCH_ARM32        0
#define OPTEE_ARCH_ARM64        1

struct optee_header {
	uint32_t magic;
	uint8_t version;
	uint8_t arch;
	uint16_t flags;
	uint32_t init_size;
	uint32_t init_load_addr_hi;
	uint32_t init_load_addr_lo;
	uint32_t init_mem_usage;
	uint32_t paged_size;
};

static inline uint32_t optee_image_get_entry_point(const image_header_t *hdr)
{
	struct optee_header *optee_hdr = (struct optee_header *)(hdr + 1);

	return optee_hdr->init_load_addr_lo;
}

static inline uint32_t optee_image_get_load_addr(const image_header_t *hdr)
{
	return optee_image_get_entry_point(hdr) - sizeof(struct optee_header);
}

#if defined(CONFIG_OPTEE)
int optee_verify_image(struct optee_header *hdr, unsigned long tzdram_start,
		       unsigned long tzdram_len, unsigned long image_len);
#else
static inline int optee_verify_image(struct optee_header *hdr,
				     unsigned long tzdram_start,
				     unsigned long tzdram_len,
				     unsigned long image_len)
{
	return -EPERM;
}

#endif

#if defined(CONFIG_OPTEE)
int optee_verify_bootm_image(unsigned long image_addr,
			     unsigned long image_load_addr,
			     unsigned long image_len);
#else
static inline int optee_verify_bootm_image(unsigned long image_addr,
					   unsigned long image_load_addr,
					   unsigned long image_len)
{
	return -EPERM;
}
#endif

#if defined(DEV_BUILD_CONFIG)
enum optee_suppl_cmd_raw_io_op {
	optee_suppl_cmd_raw_io_read,
	optee_suppl_cmd_raw_io_write,
};

// A helper based on `optee_suppl_cmd_raw_io()` for writing/reading data
// to/from the reserved partition. The helper is mainly for firmware testing by
// fastboot oem command
// `fastboot oem optee-supl-cmd-raw-io <"read"|"write"> <off> <len>`
int optee_suppl_cmd_raw_io_wrapper(enum optee_suppl_cmd_raw_io_op op,
				   void *buffer, size_t offset, size_t length);
#endif

#endif /* _OPTEE_H */
