root/drivers/media/platform/amd/isp4/isp4_fw_cmd_resp.h
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (C) 2025 Advanced Micro Devices, Inc.
 */

#ifndef _ISP4_FW_CMD_RESP_H_
#define _ISP4_FW_CMD_RESP_H_

/*
 *        Two types of command/response channel.
 *          Type Global Command has one command/response channel.
 *          Type Stream Command has one command/response channel.
 *-----------                                        ------------
 *|         |       ---------------------------      |          |
 *|         |  ---->|  Global Command         |----> |          |
 *|         |       ---------------------------      |          |
 *|         |                                        |          |
 *|         |                                        |          |
 *|         |       ---------------------------      |          |
 *|         |  ---->|   Stream Command        |----> |          |
 *|         |       ---------------------------      |          |
 *|         |                                        |          |
 *|         |                                        |          |
 *|         |                                        |          |
 *|  HOST   |                                        | Firmware |
 *|         |                                        |          |
 *|         |                                        |          |
 *|         |       --------------------------       |          |
 *|         |  <----|  Global Response       |<----  |          |
 *|         |       --------------------------       |          |
 *|         |                                        |          |
 *|         |                                        |          |
 *|         |       --------------------------       |          |
 *|         |  <----|  Stream Response       |<----  |          |
 *|         |       --------------------------       |          |
 *|         |                                        |          |
 *|         |                                        |          |
 *-----------                                        ------------
 */

/*
 *        cmd_id is in the format of following type:
 *        type: indicate command type, global/stream commands.
 *        group: indicate the command group.
 *        id: A unique command identification in one type and group.
 *        |<-Bit31 ~ Bit24->|<-Bit23 ~ Bit16->|<-Bit15 ~ Bit0->|
 *        |      type       |      group      |       id       |
 */

#define ISP4FW_CMD_TYPE_SHIFT            24
#define ISP4FW_CMD_GROUP_SHIFT           16
#define ISP4FW_CMD_TYPE_STREAM_CTRL      (0x2U << ISP4FW_CMD_TYPE_SHIFT)

#define ISP4FW_CMD_GROUP_STREAM_CTRL     (0x1U << ISP4FW_CMD_GROUP_SHIFT)
#define ISP4FW_CMD_GROUP_STREAM_BUFFER   (0x4U << ISP4FW_CMD_GROUP_SHIFT)

/* Stream  Command */
#define ISP4FW_CMD_ID_SET_STREAM_CONFIG  (ISP4FW_CMD_TYPE_STREAM_CTRL\
                                         | ISP4FW_CMD_GROUP_STREAM_CTRL | 0x1)
#define ISP4FW_CMD_ID_SET_OUT_CHAN_PROP  (ISP4FW_CMD_TYPE_STREAM_CTRL\
                                         | ISP4FW_CMD_GROUP_STREAM_CTRL | 0x3)
#define ISP4FW_CMD_ID_ENABLE_OUT_CHAN    (ISP4FW_CMD_TYPE_STREAM_CTRL\
                                         | ISP4FW_CMD_GROUP_STREAM_CTRL | 0x5)
#define ISP4FW_CMD_ID_START_STREAM       (ISP4FW_CMD_TYPE_STREAM_CTRL\
                                         | ISP4FW_CMD_GROUP_STREAM_CTRL | 0x7)
#define ISP4FW_CMD_ID_STOP_STREAM        (ISP4FW_CMD_TYPE_STREAM_CTRL\
                                         | ISP4FW_CMD_GROUP_STREAM_CTRL | 0x8)

/* Stream Buffer Command */
#define ISP4FW_CMD_ID_SEND_BUFFER        (ISP4FW_CMD_TYPE_STREAM_CTRL\
                                         | ISP4FW_CMD_GROUP_STREAM_BUFFER | 0x1)

/*
 *        resp_id is in the format of following type:
 *        type: indicate command type, global/stream commands.
 *        group: indicate the command group.
 *        id: A unique command identification in one type and group.
 *        |<-Bit31 ~ Bit24->|<-Bit23 ~ Bit16->|<-Bit15 ~ Bit0->|
 *        |      type       |      group      |       id       |
 */

#define ISP4FW_RESP_GROUP_SHIFT          16

#define ISP4FW_RESP_GROUP_GENERAL        (0x1 << ISP4FW_RESP_GROUP_SHIFT)
#define ISP4FW_RESP_GROUP_NOTIFICATION   (0x3 << ISP4FW_RESP_GROUP_SHIFT)

/* General Response */
#define ISP4FW_RESP_ID_CMD_DONE          (ISP4FW_RESP_GROUP_GENERAL | 0x1)

/* Notification */
#define ISP4FW_RESP_ID_NOTI_FRAME_DONE   (ISP4FW_RESP_GROUP_NOTIFICATION | 0x1)

#define ISP4FW_CMD_STATUS_SUCCESS        0
#define ISP4FW_CMD_STATUS_FAIL           1
#define ISP4FW_CMD_STATUS_SKIPPED        2

#define ISP4FW_ADDR_SPACE_TYPE_GPU_VA    4

#define ISP4FW_MEMORY_POOL_SIZE          (100 * 1024 * 1024)

/*
 * standard ISP pipeline: mipicsi=>isp
 */
#define ISP4FW_MIPI0_ISP_PIPELINE_ID     0x5f91

enum isp4fw_sensor_id {
        /* Sensor id for ISP input from MIPI port 0 */
        ISP4FW_SENSOR_ID_ON_MIPI0  = 0,
};

enum isp4fw_stream_id {
        ISP4FW_STREAM_ID_INVALID = -1,
        ISP4FW_STREAM_ID_1 = 0,
        ISP4FW_STREAM_ID_2 = 1,
        ISP4FW_STREAM_ID_3 = 2,
        ISP4FW_STREAM_ID_MAXIMUM
};

enum isp4fw_image_format {
        /* 4:2:0,semi-planar, 8-bit */
        ISP4FW_IMAGE_FORMAT_NV12 = 1,
        /* interleave, 4:2:2, 8-bit */
        ISP4FW_IMAGE_FORMAT_YUV422INTERLEAVED = 7,
};

enum isp4fw_pipe_out_ch {
        ISP4FW_ISP_PIPE_OUT_CH_PREVIEW = 0,
};

enum isp4fw_yuv_range {
        ISP4FW_ISP_YUV_RANGE_FULL = 0,     /* YUV value range in 0~255 */
        ISP4FW_ISP_YUV_RANGE_NARROW = 1,   /* YUV value range in 16~235 */
        ISP4FW_ISP_YUV_RANGE_MAX
};

enum isp4fw_buffer_type {
        ISP4FW_BUFFER_TYPE_PREVIEW = 8,
        ISP4FW_BUFFER_TYPE_META_INFO = 10,
        ISP4FW_BUFFER_TYPE_MEM_POOL = 15,
};

enum isp4fw_buffer_status {
        /* The buffer is INVALID */
        ISP4FW_BUFFER_STATUS_INVALID,
        /* The buffer is not filled with image data */
        ISP4FW_BUFFER_STATUS_SKIPPED,
        /* The buffer is available and awaiting to be filled */
        ISP4FW_BUFFER_STATUS_EXIST,
        /* The buffer is filled with image data */
        ISP4FW_BUFFER_STATUS_DONE,
        /* The buffer is unavailable */
        ISP4FW_BUFFER_STATUS_LACK,
        /* The buffer is dirty, probably caused by LMI leakage */
        ISP4FW_BUFFER_STATUS_DIRTY,
        ISP4FW_BUFFER_STATUS_MAX
};

enum isp4fw_buffer_source {
        /* The buffer is from the stream buffer queue */
        ISP4FW_BUFFER_SOURCE_STREAM,
};

struct isp4fw_error_code {
        u32 code1;
        u32 code2;
        u32 code3;
        u32 code4;
        u32 code5;
};

/* Command Structure for FW */

struct isp4fw_cmd {
        u32 cmd_seq_num;
        u32 cmd_id;
        u32 cmd_param[12];
        u16 cmd_stream_id;
        u8 cmd_silent_resp;
        u8 reserved;
        u32 cmd_check_sum;
};

struct isp4fw_resp_cmd_done {
        /*
         * The host2fw command seqNum.
         * To indicate which command this response refers to.
         */
        u32 cmd_seq_num;
        /* The host2fw command id for host double check. */
        u32 cmd_id;
        /*
         * Indicate the command process status.
         * 0 means success. 1 means fail. 2 means skipped
         */
        u16 cmd_status;
        /*
         * If cmd_status is 1, the command failed. The host can check
         * isp4fw_error_code for details.
         */
        u16 isp4fw_error_code;
        /* The response payload type varies by cmd. */
        u8 payload[36];
};

struct isp4fw_resp_param_package {
        u32 package_addr_lo;    /* The low 32 bit of the pkg address. */
        u32 package_addr_hi;    /* The high 32 bit of the pkg address. */
        u32 package_size;       /* The total pkg size in bytes. */
        u32 package_check_sum;  /* The byte sum of the pkg. */
};

struct isp4fw_resp {
        u32 resp_seq_num;
        u32 resp_id;
        union {
                struct isp4fw_resp_cmd_done cmd_done;
                struct isp4fw_resp_param_package frame_done;
                u32 resp_param[12];
        } param;
        u8  reserved[4];
        u32 resp_check_sum;
};

struct isp4fw_mipi_pipe_path_cfg {
        u32 b_enable;
        enum isp4fw_sensor_id isp4fw_sensor_id;
};

struct isp4fw_isp_pipe_path_cfg {
        u32  isp_pipe_id;       /* pipe ids for pipeline construction */
};

struct isp4fw_isp_stream_cfg {
        /* Isp mipi path */
        struct isp4fw_mipi_pipe_path_cfg mipi_pipe_path_cfg;
        /* Isp pipe path */
        struct isp4fw_isp_pipe_path_cfg  isp_pipe_path_cfg;
        /* enable TNR */
        u32 b_enable_tnr;
        /*
         * Number of frames for RTA processing.
         * Set to 0 to use the firmware's default value.
         */
        u32 rta_frames_per_proc;
};

struct isp4fw_image_prop {
        enum isp4fw_image_format image_format;
        u32 width;
        u32 height;
        u32 luma_pitch;
        u32 chroma_pitch;
        enum isp4fw_yuv_range yuv_range;
};

struct isp4fw_buffer {
        /*
         * A check num for debug usage, host can set the buf_tags
         * to different numbers
         */
        u32 buf_tags;
        union {
                u32 value;
                struct {
                        u32 space : 16;
                        u32 vmid  : 16;
                } bit;
        } vmid_space;
        u32 buf_base_a_lo;              /* Low address of buffer A */
        u32 buf_base_a_hi;              /* High address of buffer A */
        u32 buf_size_a;                 /* Buffer size of buffer A */

        u32 buf_base_b_lo;              /* Low address of buffer B */
        u32 buf_base_b_hi;              /* High address of buffer B */
        u32 buf_size_b;                 /* Buffer size of buffer B */

        u32 buf_base_c_lo;              /* Low address of buffer C */
        u32 buf_base_c_hi;              /* High address of buffer C */
        u32 buf_size_c;                 /* Buffer size of buffer C */
};

struct isp4fw_buffer_meta_info {
        u32 enabled;                                    /* enabled flag */
        enum isp4fw_buffer_status status;               /* BufferStatus */
        struct isp4fw_error_code err;                   /* err code */
        enum isp4fw_buffer_source source;               /* BufferSource */
        struct isp4fw_image_prop image_prop;            /* image_prop */
        struct isp4fw_buffer buffer;                    /* buffer info */
};

struct isp4fw_meta_info {
        u32 poc;                                /* frame id */
        u32 fc_id;                              /* frame ctl id */
        u32 time_stamp_lo;                      /* timestamp low 32 bits */
        u32 time_stamp_hi;                      /* timestamp_high 32 bits */
        struct isp4fw_buffer_meta_info preview; /* preview BufferMetaInfo */
};

struct isp4fw_cmd_send_buffer {
        enum isp4fw_buffer_type buffer_type;
        struct isp4fw_buffer buffer;            /* buffer info */
};

struct isp4fw_cmd_set_out_ch_prop {
        enum isp4fw_pipe_out_ch ch;     /* ISP output channel */
        struct isp4fw_image_prop image_prop;    /* image property */
};

struct isp4fw_cmd_enable_out_ch {
        enum isp4fw_pipe_out_ch ch;     /* ISP output channel */
        u32 is_enable;                  /* If channel is enabled or not */
};

struct isp4fw_cmd_set_stream_cfg {
        struct isp4fw_isp_stream_cfg stream_cfg; /* stream path config */
};

#endif /* _ISP4_FW_CMD_RESP_H_ */