/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (c) 2024
 */
#include "cmd.h"
#include "common.h"
#include "ocp-nvme.h"

#ifndef OCP_HARDWARE_COMPONENT_LOG_H
#define OCP_HARDWARE_COMPONENT_LOG_H

#define LID_HWCOMP 0xc6
#define HWCOMP_RSVD2_LEN 14
#define HWCOMP_SIZE_LEN 16
#define HWCOMP_RSVD48_LEN 16

struct __packed hwcomp_desc {
	__le64 date_lot_size;
	__le64 add_info_size;
	__le32 id;
	__le64 mfg;
	__le64 rev;
	__le64 mfg_code;
};

struct __packed hwcomp_log {
	__le16 ver;
	__u8 rsvd2[HWCOMP_RSVD2_LEN];
	__u8 guid[GUID_LEN];
	__u8 size[HWCOMP_SIZE_LEN];
	__u8 rsvd48[HWCOMP_RSVD48_LEN];
	struct hwcomp_desc *desc;
};

struct hwcomp_desc_entry {
	struct hwcomp_desc *desc;
	__u64 date_lot_size;
	__u8 *date_lot_code;
	__u64 add_info_size;
	__u8 *add_info;
	__u64 desc_size;
};

enum hwcomp_id {
	HWCOMP_ID_RSVD,
	HWCOMP_ID_ASIC,
	HWCOMP_ID_NAND,
	HWCOMP_ID_DRAM,
	HWCOMP_ID_PMIC,
	HWCOMP_ID_PCB,
	HWCOMP_ID_CAP,
	HWCOMP_ID_REG,
	HWCOMP_ID_CASE,
	HWCOMP_ID_SN,
	HWCOMP_ID_COUNTRY,
	HWCOMP_ID_HW_REV,
	HWCOMP_ID_VENDOR = 0x8000,
	HWCOMP_ID_MAX = 0xffff,
};

int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *plugin);
const char *hwcomp_id_to_string(__u32 id);

#endif /* OCP_HARDWARE_COMPONENT_LOG_H */