/*
 * Copyright (c) 2016 Quantenna Communications, Inc.
 */

/*
 * This file defines a firmware information section, which contains
 * firmware version for sanity checking.
 */
#ifndef _QTN_FW_INFO_H_
#define _QTN_FW_INFO_H_

#define FW_INFO_SECTION		".fwinfo"
/*
 * defining memory address for this section is to make sure it is easy
 * to be found and won't be stripped, we won't actually load the section.
 */
#define FW_INFO_MEM_ADDR	0xFFFF0000
#define FW_INFO_MEM_SIZE	0xFFFF
#define FW_INFO_MEMORY		FWINFO_MEM: ORIGIN=FW_INFO_MEM_ADDR LENGTH=FW_INFO_MEM_SIZE
#define FW_INFO_ADD_SECTION	GROUP : { FW_INFO_SECTION ALIGN(4): { *(FW_INFO_SECTION) } } > FWINFO_MEM

#ifndef __ASSEMBLY__
#include <qtn/qdrv_bld.h>

#define FW_INFO_IDENT		"FWINFO"
#define FW_INFO_IDENT_SIZE	8
#define FW_INFO_REV		1

struct qtn_fw_info {
	char fwinfo_ident[FW_INFO_IDENT_SIZE];
	uint32_t fwinfo_rev;
	uint32_t fwinfo_fw_version;
};

#define FW_INFO_DATA_SIZE (sizeof(struct qtn_fw_info))

#define FW_INFO_SEGMENT_FOUND(_vaddr, _filesz, _pdata) \
	(((_vaddr) == FW_INFO_MEM_ADDR) && \
	 ((_filesz) >= FW_INFO_DATA_SIZE) && \
	 !strncmp(((struct qtn_fw_info *)(_pdata))->fwinfo_ident, FW_INFO_IDENT, strlen(FW_INFO_IDENT)))

#define FW_INFO_CHECK_DATA(_fwinfo, _match, _print)	do {			\
	if ((_fwinfo)->fwinfo_rev != FW_INFO_REV)				\
		_print("Mismatched fw info revision 0x%x - expected 0x%x\n",	\
			(_fwinfo)->fwinfo_rev, FW_INFO_REV);			\
	else if ((_fwinfo)->fwinfo_fw_version != QDRV_BLD_VER)			\
		_print("Firmware version 0x%x does not match lhost version 0x%x\n",	\
				(_fwinfo)->fwinfo_fw_version, QDRV_BLD_VER);	\
	else			\
		_match = 1;	\
} while(0)

#define FW_INFO_ADD_DATA	\
	struct qtn_fw_info _fwinfo = {	\
		FW_INFO_IDENT,		\
		FW_INFO_REV,		\
		QDRV_BLD_VER		\
	}
#endif /* __ASSEMBLY__ */
#endif /* _QTN_FW_INFO_H_ */
