/*
 * Created by jiaqiang.ye@lnxall.com
 *
 * Simple factory information definition for EM1000
 *
 * 2023/10/31
 */

#ifndef LNXALL_FACINI_H
#define LNXALL_FACINI_H 1

#include "nvmem.h"

#define FACINI_SN_LEN         20
#define FACINI_MAC_LEN        20
#define FACINI_DATE_LEN       32
#define FACINI_HWVER_LEN      32
#define FACINI_PRODUCT_LEN    32
#define FACINI_RESERVED       256

#define LNXALL_MAGIC0         0x20231031
#define LNXALL_MAGIC1         0x00163521

struct lnxall_facini {
	unsigned int              magic0;
	char                      sn[FACINI_SN_LEN];
	char                      mac[FACINI_MAC_LEN];
	char                      date[FACINI_DATE_LEN];
	char                      hwver[FACINI_HWVER_LEN];
	char                      product[FACINI_PRODUCT_LEN];
	char                      reserved[FACINI_RESERVED];
	unsigned int              magic1;
	unsigned int              chksum;
} __attribute__((packed));

#define FACINI_XOR_INIT       0x1ad1ebd7
#define FACINI_OFFSET_BEGIN   0
#define FACINI_OFFSET_END     4095

#define FACINI_SIZE           sizeof(struct lnxall_facini)
#define FACINI_ALIGN          512

int facini_validate(const struct lnxall_facini * facini);

int facini_find(nvmem_t * pnv, struct lnxall_facini * facini);

int facini_checksum(struct lnxall_facini * facini);

int facini_write(nvmem_t * pnv, int offs, const struct lnxall_facini * facini);

#endif
