/* SPDX-License-Identifier: GPL-2.0-only */
/*
 *  Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 */

#ifndef _HFI_DEFS_H_
#define _HFI_DEFS_H_

#include <linux/types.h>

/*
 * Following base acts as common starting points
 * for all enumerations.
 */
#define HFI_COMMON_BASE                 0x0

/* HFI Domain base offset for commands and messages */
#define HFI_DOMAIN_SHFT                 (24)
#define HFI_DOMAIN_BMSK                 (0x7 << HFI_DOMAIN_SHFT)
#define HFI_DOMAIN_BASE_ICP             (0x0 << HFI_DOMAIN_SHFT)
#define HFI_DOMAIN_BASE_IPE_BPS         (0x1 << HFI_DOMAIN_SHFT)
#define HFI_DOMAIN_BASE_CDM             (0x2 << HFI_DOMAIN_SHFT)
#define HFI_DOMAIN_BASE_DBG             (0x3 << HFI_DOMAIN_SHFT)

/* Command base offset for commands */
#define HFI_CMD_START_OFFSET            0x10000

/* Command base offset for messages */
#define HFI_MSG_START_OFFSET            0x20000

/* System Level Error types */
#define HFI_ERR_SYS_NONE                (HFI_COMMON_BASE)
#define HFI_ERR_SYS_FATAL               (HFI_COMMON_BASE + 0x1)
#define HFI_ERR_SYS_VERSION_MISMATCH    (HFI_COMMON_BASE + 0x2)
#define HFI_ERR_SYS_UNSUPPORTED_DOMAIN  (HFI_COMMON_BASE + 0x3)
#define HFI_ERR_SYS_UNSUPPORT_CMD       (HFI_COMMON_BASE + 0x4)
#define HFI_ERR_SYS_CMDFAILED           (HFI_COMMON_BASE + 0x5)
#define HFI_ERR_SYS_CMDSIZE             (HFI_COMMON_BASE + 0x6)

/* System Level Event types */
#define HFI_EVENT_SYS_ERROR             (HFI_COMMON_BASE + 0x1)
#define HFI_EVENT_ICP_ERROR             (HFI_COMMON_BASE + 0x2)
#define HFI_EVENT_IPE_BPS_ERROR         (HFI_COMMON_BASE + 0x3)
#define HFI_EVENT_CDM_ERROR             (HFI_COMMON_BASE + 0x4)
#define HFI_EVENT_DBG_ERROR             (HFI_COMMON_BASE + 0x5)

/* Core level start Ranges for errors */
#define HFI_ERR_ICP_START               (HFI_COMMON_BASE + 0x64)
#define HFI_ERR_IPE_BPS_START           (HFI_ERR_ICP_START + 0x64)
#define HFI_ERR_CDM_START               (HFI_ERR_IPE_BPS_START + 0x64)
#define HFI_ERR_DBG_START               (HFI_ERR_CDM_START + 0x64)

/*ICP Core level  error messages */
#define HFI_ERR_NO_RES                  (HFI_ERR_ICP_START + 0x1)
#define HFI_ERR_UNSUPPORTED_RES         (HFI_ERR_ICP_START + 0x2)
#define HFI_ERR_UNSUPPORTED_PROP        (HFI_ERR_ICP_START + 0x3)
#define HFI_ERR_INIT_EXPECTED           (HFI_ERR_ICP_START + 0x4)
#define HFI_ERR_INIT_IGNORED            (HFI_ERR_ICP_START + 0x5)

/* System level commands */
#define HFI_CMD_COMMON_START \
		(HFI_DOMAIN_BASE_ICP + HFI_CMD_START_OFFSET + 0x0)
#define HFI_CMD_SYS_INIT               (HFI_CMD_COMMON_START + 0x1)
#define HFI_CMD_SYS_PC_PREP            (HFI_CMD_COMMON_START + 0x2)
#define HFI_CMD_SYS_SET_PROPERTY       (HFI_CMD_COMMON_START + 0x3)
#define HFI_CMD_SYS_GET_PROPERTY       (HFI_CMD_COMMON_START + 0x4)
#define HFI_CMD_SYS_PING               (HFI_CMD_COMMON_START + 0x5)
#define HFI_CMD_SYS_RESET              (HFI_CMD_COMMON_START + 0x6)

/* General Frame process errors */
#define CAMERAICP_SUCCESS              0
#define CAMERAICP_EFAILED              1
#define CAMERAICP_ENOMEMORY            2
#define CAMERAICP_EBADSTATE            3
#define CAMERAICP_EBADPARM             4
#define CAMERAICP_EBADITEM             5
#define CAMERAICP_EINVALIDFORMAT       6
#define CAMERAICP_EUNSUPPORTED         7
#define CAMERAICP_EOUTOFBOUND          8
#define CAMERAICP_ETIMEDOUT            9
#define CAMERAICP_EABORTED             10
#define CAMERAICP_EHWVIOLATION         11
#define CAMERAICP_ECDMERROR            12

/* Core level commands */
/* IPE/BPS core Commands */
#define HFI_CMD_IPE_BPS_COMMON_START \
		(HFI_DOMAIN_BASE_IPE_BPS + HFI_CMD_START_OFFSET + 0x0)
#define HFI_CMD_IPEBPS_CREATE_HANDLE \
		(HFI_CMD_IPE_BPS_COMMON_START + 0x8)
#define HFI_CMD_IPEBPS_ASYNC_COMMAND_DIRECT \
		(HFI_CMD_IPE_BPS_COMMON_START + 0xa)
#define HFI_CMD_IPEBPS_ASYNC_COMMAND_INDIRECT \
		(HFI_CMD_IPE_BPS_COMMON_START + 0xe)

/* CDM core Commands */
#define HFI_CMD_CDM_COMMON_START \
		(HFI_DOMAIN_BASE_CDM + HFI_CMD_START_OFFSET + 0x0)
#define HFI_CMD_CDM_TEST_START (HFI_CMD_CDM_COMMON_START + 0x800)
#define HFI_CMD_CDM_END        (HFI_CMD_CDM_COMMON_START + 0xFFF)

/* Debug/Test Commands */
#define HFI_CMD_DBG_COMMON_START \
		(HFI_DOMAIN_BASE_DBG + HFI_CMD_START_OFFSET + 0x0)
#define HFI_CMD_DBG_TEST_START  (HFI_CMD_DBG_COMMON_START + 0x800)
#define HFI_CMD_DBG_END         (HFI_CMD_DBG_COMMON_START + 0xFFF)

/* System level messages */
#define HFI_MSG_ICP_COMMON_START \
		(HFI_DOMAIN_BASE_ICP + HFI_MSG_START_OFFSET + 0x0)
#define HFI_MSG_SYS_INIT_DONE           (HFI_MSG_ICP_COMMON_START + 0x1)
#define HFI_MSG_SYS_PC_PREP_DONE        (HFI_MSG_ICP_COMMON_START + 0x2)
#define HFI_MSG_SYS_DEBUG               (HFI_MSG_ICP_COMMON_START + 0x3)
#define HFI_MSG_SYS_IDLE                (HFI_MSG_ICP_COMMON_START + 0x4)
#define HFI_MSG_SYS_PROPERTY_INFO       (HFI_MSG_ICP_COMMON_START + 0x5)
#define HFI_MSG_SYS_PING_ACK            (HFI_MSG_ICP_COMMON_START + 0x6)
#define HFI_MSG_SYS_RESET_ACK           (HFI_MSG_ICP_COMMON_START + 0x7)
#define HFI_MSG_EVENT_NOTIFY            (HFI_MSG_ICP_COMMON_START + 0x8)

/* Core level Messages */
/* IPE/BPS core Messages */
#define HFI_MSG_IPE_BPS_COMMON_START \
		(HFI_DOMAIN_BASE_IPE_BPS + HFI_MSG_START_OFFSET + 0x0)
#define HFI_MSG_IPEBPS_CREATE_HANDLE_ACK \
		(HFI_MSG_IPE_BPS_COMMON_START + 0x08)
#define HFI_MSG_IPEBPS_ASYNC_COMMAND_DIRECT_ACK \
		(HFI_MSG_IPE_BPS_COMMON_START + 0x0a)
#define HFI_MSG_IPEBPS_ASYNC_COMMAND_INDIRECT_ACK \
		(HFI_MSG_IPE_BPS_COMMON_START + 0x0e)
#define HFI_MSG_IPE_BPS_TEST_START	\
		(HFI_MSG_IPE_BPS_COMMON_START + 0x800)
#define HFI_MSG_IPE_BPS_END \
		(HFI_MSG_IPE_BPS_COMMON_START + 0xFFF)

/* CDM core Messages */
#define HFI_MSG_CDM_COMMON_START \
		(HFI_DOMAIN_BASE_CDM + HFI_MSG_START_OFFSET + 0x0)
#define  HFI_MSG_PRI_CDM_PAYLOAD_ACK    (HFI_MSG_CDM_COMMON_START + 0xa)
#define  HFI_MSG_PRI_LLD_PAYLOAD_ACK    (HFI_MSG_CDM_COMMON_START + 0xb)
#define HFI_MSG_CDM_TEST_START          (HFI_MSG_CDM_COMMON_START + 0x800)
#define HFI_MSG_CDM_END                 (HFI_MSG_CDM_COMMON_START + 0xFFF)

/* core level test command ranges */
/* ICP core level test command range */
#define HFI_CMD_ICP_TEST_START          (HFI_CMD_ICP_COMMON_START + 0x800)
#define HFI_CMD_ICP_END                 (HFI_CMD_ICP_COMMON_START + 0xFFF)

/* IPE/BPS core level test command range */
#define HFI_CMD_IPE_BPS_TEST_START \
		(HFI_CMD_IPE_BPS_COMMON_START + 0x800)
#define HFI_CMD_IPE_BPS_END (HFI_CMD_IPE_BPS_COMMON_START + 0xFFF)

/* ICP core level test message range */
#define HFI_MSG_ICP_TEST_START  (HFI_MSG_ICP_COMMON_START + 0x800)
#define HFI_MSG_ICP_END         (HFI_MSG_ICP_COMMON_START + 0xFFF)

/* ICP core level Debug test message range */
#define HFI_MSG_DBG_COMMON_START \
		(HFI_DOMAIN_BASE_DBG + 0x0)
#define HFI_MSG_DBG_TEST_START  (HFI_MSG_DBG_COMMON_START + 0x800)
#define HFI_MSG_DBG_END         (HFI_MSG_DBG_COMMON_START + 0xFFF)

/* System  level property base offset */
#define HFI_PROPERTY_ICP_COMMON_START  (HFI_DOMAIN_BASE_ICP + 0x0)

#define HFI_PROP_SYS_DEBUG_CFG           (HFI_PROPERTY_ICP_COMMON_START + 0x1)
#define HFI_PROP_SYS_UBWC_CFG            (HFI_PROPERTY_ICP_COMMON_START + 0x2)
#define HFI_PROP_SYS_IMAGE_VER           (HFI_PROPERTY_ICP_COMMON_START + 0x3)
#define HFI_PROP_SYS_SUPPORTED           (HFI_PROPERTY_ICP_COMMON_START + 0x4)
#define HFI_PROP_SYS_IPEBPS_PC           (HFI_PROPERTY_ICP_COMMON_START + 0x5)
#define HFI_PROP_SYS_FW_DUMP_CFG         (HFI_PROPERTY_ICP_COMMON_START + 0x8)
#define HFI_PROPERTY_SYS_UBWC_CONFIG_EX  (HFI_PROPERTY_ICP_COMMON_START + 0x9)

/* Capabilities reported at sys init */
#define HFI_CAPS_PLACEHOLDER_1         (HFI_COMMON_BASE + 0x1)
#define HFI_CAPS_PLACEHOLDER_2         (HFI_COMMON_BASE + 0x2)

/* Section describes different debug levels (HFI_DEBUG_MSG_X)
 * available for debug messages from FW
 */
#define  HFI_DEBUG_MSG_LOW      0x00000001
#define  HFI_DEBUG_MSG_MEDIUM   0x00000002
#define  HFI_DEBUG_MSG_HIGH     0x00000004
#define  HFI_DEBUG_MSG_ERROR    0x00000008
#define  HFI_DEBUG_MSG_FATAL    0x00000010
/* Messages containing performance data */
#define  HFI_DEBUG_MSG_PERF     0x00000020
/* Disable ARM9 WFI in low power mode. */
#define  HFI_DEBUG_CFG_WFI      0x01000000
/* Disable ARM9 watchdog. */
#define  HFI_DEBUG_CFG_ARM9WD   0x10000000


/*
 * HFI_FW_DUMP levels
 * HFI_FW_DUMP_xx
 */
#define HFI_FW_DUMP_DISABLED    0x00000000
#define HFI_FW_DUMP_ON_FAILURE  0x00000001
#define HFI_FW_DUMP_ALWAYS      0x00000002

/* Number of available dump levels. */
#define NUM_HFI_DUMP_LVL        0x00000003

/* Debug Msg Communication types:
 * Section describes different modes (HFI_DEBUG_MODE_X)
 * available to communicate the debug messages
 */
 /* Debug message output through the interface debug queue. */
#define HFI_DEBUG_MODE_QUEUE     0x00000001
 /* Debug message output through QDSS. */
#define HFI_DEBUG_MODE_QDSS      0x00000002
 /* Number of debug modes available. */
#define NUM_HFI_DEBUG_MODE       0x00000002

#define HFI_DEBUG_MSG_LOW        0x00000001
#define HFI_DEBUG_MSG_MEDIUM     0x00000002
#define HFI_DEBUG_MSG_HIGH       0x00000004
#define HFI_DEBUG_MSG_ERROR      0x00000008
#define HFI_DEBUG_MSG_FATAL      0x00000010
#define HFI_DEBUG_MSG_PERF       0x00000020
#define HFI_DEBUG_CFG_WFI        0x01000000
#define HFI_DEBUG_CFG_ARM9WD     0x10000000

#define HFI_DEV_VERSION_MAX      0x5

/* Hang dump settings */
#define HFI_SET_HANG_DUMP_ALWAYS     0x2
#define HFI_SET_HANG_DUMP_ON_FAILURE 0x1

/**
 * start of sys command packet types
 * These commands are used to get system level information
 * from firmware
 */

/**
 * struct hfi_caps_support
 * payload to report caps through HFI_PROPERTY_PARAM_CAPABILITY_SUPPORTED
 * @type: capability type
 * @min: minimum supported value for the capability
 * @max: maximum supported value for the capability
 * @step_size: supported steps between min-max
 */
struct hfi_caps_support {
	uint32_t type;
	uint32_t min;
	uint32_t max;
	uint32_t step_size;
} __packed;

/**
 * struct hfi_caps_support_info
 * capability report through HFI_PROPERTY_PARAM_CAPABILITY_SUPPORTED
 * @num_caps: number of capabilities listed
 * @caps_data: capabilities info array
 */
struct hfi_caps_support_info {
	uint32_t num_caps;
	struct hfi_caps_support caps_data[1];
} __packed;

/**
 * struct hfi_debug
 * payload structure to configure HFI_PROPERTY_SYS_DEBUG_CONFIG
 * @debug_config: it is a result of HFI_DEBUG_MSG_X values that
 *                are OR-ed together to specify the debug message types
 *                to otput
 * @debug_mode: debug message output through debug queue/qdss
 * @HFI_PROPERTY_SYS_DEBUG_CONFIG
 */
struct hfi_debug {
	uint32_t debug_config;
	uint32_t debug_mode;
} __packed;

/**
 * struct hfi_ipe_bps_pc
 * payload structure to configure HFI_PROPERTY_SYS_IPEBPS_PC
 * @enable: Flag to enable IPE, BPS interfrane power collapse
 * @core_info: Core information to firmware
 */
struct hfi_ipe_bps_pc {
	uint32_t enable;
	uint32_t core_info;
} __packed;

/**
 * struct hfi_cmd_ubwc_cfg
 * Payload structure to configure HFI_PROP_SYS_UBWC_CFG
 * @ubwc_fetch_cfg: UBWC configuration for fecth
 * @ubwc_write_cfg: UBWC configuration for write
 */
struct hfi_cmd_ubwc_cfg {
	uint32_t ubwc_fetch_cfg;
	uint32_t ubwc_write_cfg;
} __packed;

/**
 * struct hfi_cmd_ubwc_cfg_ext
 * Payload structure to configure HFI_UBWC_CFG_TYPE_EXT
 * @bps: UBWC configuration for bps
 * @ipe: UBWC configuration for ipe
 */
struct hfi_cmd_ubwc_cfg_ext {
	struct hfi_cmd_ubwc_cfg bps;
	struct hfi_cmd_ubwc_cfg ipe;
} __packed;

/**
 * struct hfi_cmd_sys_init
 * command to initialization of system session
 * @size: packet size in bytes
 * @pkt_type: opcode of a packet
 * @HFI_CMD_SYS_INIT
 */
struct hfi_cmd_sys_init {
	uint32_t size;
	uint32_t pkt_type;
} __packed;

/**
 * struct hfi_cmd_pc_prep
 * command to firmware to prepare for power collapse
 * @eize: packet size in bytes
 * @pkt_type: opcode of a packet
 * @HFI_CMD_SYS_PC_PREP
 */
struct hfi_cmd_pc_prep {
	uint32_t size;
	uint32_t pkt_type;
} __packed;

/**
 * struct hfi_cmd_prop
 * command to get/set properties of firmware
 * @size: packet size in bytes
 * @pkt_type: opcode of a packet
 * @num_prop: number of properties queried/set
 * @prop_data: array of property IDs being queried. size depends on num_prop
 *             array of property IDs and associated structure pairs in set
 * @HFI_CMD_SYS_GET_PROPERTY
 * @HFI_CMD_SYS_SET_PROPERTY
 */
struct hfi_cmd_prop {
	uint32_t size;
	uint32_t pkt_type;
	uint32_t num_prop;
	uint32_t prop_data[1];
} __packed;

/**
 * struct hfi_cmd_ping_pkt
 * ping command pings the firmware to confirm whether
 * it is alive.
 * @size: packet size in bytes
 * @pkt_type: opcode of a packet
 * @user_data: client data, firmware returns this data
 *             as part of HFI_MSG_SYS_PING_ACK
 * @HFI_CMD_SYS_PING
 */
struct hfi_cmd_ping_pkt {
	uint32_t size;
	uint32_t pkt_type;
	uint64_t user_data;
} __packed;

/**
 * struct hfi_cmd_sys_reset_pkt
 * sends the reset command to FW. FW responds in the same type
 * of packet. so can be used for reset_ack_pkt type also
 * @size: packet size in bytes
 * @pkt_type: opcode of a packet
 * @user_data: client data, firmware returns this data
 *             as part of HFI_MSG_SYS_RESET_ACK
 * @HFI_CMD_SYS_RESET
 */

struct hfi_cmd_sys_reset_pkt {
	uint32_t size;
	uint32_t pkt_type;
	uint64_t user_data;
} __packed;

/* end of sys command packet types */

/* start of sys message packet types */

/**
 * struct hfi_prop
 * structure to report maximum supported features of firmware.
 */
struct hfi_sys_support {
	uint32_t place_holder;
} __packed;

/**
 * struct hfi_supported_prop
 * structure to report HFI_PROPERTY_PARAM_PROPERTIES_SUPPORTED
 * for a session
 * @num_prop: number of properties supported
 * @prop_data: array of supported property IDs
 */
struct hfi_supported_prop {
	uint32_t num_prop;
	uint32_t prop_data[1];
} __packed;

/**
 * struct hfi_image_version
 * system image version
 * @major: major version number
 * @minor: minor version number
 * @ver_name_size: size of version name
 * @ver_name: image version name
 */
struct hfi_image_version {
	uint32_t major;
	uint32_t minor;
	uint32_t ver_name_size;
	uint8_t  ver_name[1];
} __packed;

/**
 * struct hfi_msg_init_done_data
 * @api_ver:    Firmware API version
 * @dev_ver:    Device version
 * @num_icp_hw: Number of ICP hardware information
 * @dev_hw_ver: Supported hardware version information
 * @reserved:   Reserved field
 */
struct hfi_msg_init_done_data {
	uint32_t api_ver;
	uint32_t dev_ver;
	uint32_t num_icp_hw;
	uint32_t dev_hw_ver[HFI_DEV_VERSION_MAX];
	uint32_t reserved;
};

/**
 * struct hfi_msg_init_done
 * system init done message from firmware. Many system level properties
 * are returned with the packet
 * @size:      Packet size in bytes
 * @pkt_type:  Opcode of a packet
 * @err_type:  Error code associated with response
 * @num_prop:  Number of default capability info
 * @prop_data: Array of property ids and corresponding structure pairs
 */
struct hfi_msg_init_done {
	uint32_t size;
	uint32_t pkt_type;
	uint32_t err_type;
	uint32_t num_prop;
	uint32_t prop_data[1];
} __packed;

/**
 * struct hfi_msg_pc_prep_done
 * system power collapse preparation done message
 * @size: packet size in bytes
 * @pkt_type: opcode of a packet
 * @err_type: error code associated with the response
 */
struct hfi_msg_pc_prep_done {
	uint32_t size;
	uint32_t pkt_type;
	uint32_t err_type;
} __packed;

/**
 * struct hfi_msg_prop
 * system property info from firmware
 * @size: packet size in bytes
 * @pkt_type: opcode of a packet
 * @num_prop: number of property info structures
 * @prop_data: array of property IDs and associated structure pairs
 */
struct hfi_msg_prop {
	uint32_t size;
	uint32_t pkt_type;
	uint32_t num_prop;
	uint32_t prop_data[1];
} __packed;

/**
 * struct hfi_msg_idle
 * system idle message from firmware
 * @size: packet size in bytes
 * @pkt_type: opcode of a packet
 */
struct hfi_msg_idle {
	uint32_t size;
	uint32_t pkt_type;
} __packed;

/**
 * struct hfi_msg_ping_ack
 * system ping ack message
 * @size: packet size in bytes
 * @pkt_type: opcode of a packet
 * @user_data: this data is sent as part of ping command from host
 */
struct hfi_msg_ping_ack {
	uint32_t size;
	uint32_t pkt_type;
	uint64_t user_data;
} __packed;

/**
 * struct hfi_msg_debug
 * system debug message defination
 * @size: packet size in bytes
 * @pkt_type: opcode of a packet
 * @msg_type: debug message type
 * @msg_size: size of debug message in bytes
 * @timestamp_hi: most significant 32 bits of the 64 bit timestamp field.
 *                timestamp shall be interpreted as a signed 64-bit value
 *                representing microseconds.
 * @timestamp_lo: least significant 32 bits of the 64 bit timestamp field.
 *                timestamp shall be interpreted as a signed 64-bit value
 *                representing microseconds.
 * @msg_data: message data in string form
 */
struct hfi_msg_debug {
	uint32_t size;
	uint32_t pkt_type;
	uint32_t msg_type;
	uint32_t msg_size;
	uint32_t timestamp_hi;
	uint32_t timestamp_lo;
	uint8_t  msg_data[1];
} __packed;
/**
 * struct hfi_msg_event_notify
 * event notify message
 * @size: packet size in bytes
 * @pkt_type: opcode of a packet
 * @fw_handle: firmware session handle
 * @event_id: session event id
 * @event_data1: event data corresponding to event ID
 * @event_data2: event data corresponding to event ID
 * @ext_event_data: info array, interpreted based on event_data1
 * and event_data2
 */
struct hfi_msg_event_notify {
	uint32_t size;
	uint32_t pkt_type;
	uint32_t fw_handle;
	uint32_t event_id;
	uint32_t event_data1;
	uint32_t event_data2;
	uint32_t ext_event_data[1];
} __packed;
/**
 * end of sys message packet types
 */

#endif /* _HFI_DEFS_H_ */
