blob: 722abe7d0d8343be2969180bcb16c08c3a2fa8fc [file] [log] [blame]
/*
* 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_ */