/* SPDX-License-Identifier: GPL-2.0-only */ /* * ISHTP bus layer messages handling * * Copyright (c) 2003-2016, Intel Corporation. */ #ifndef _ISHTP_HBM_H_ #define _ISHTP_HBM_H_ #include struct ishtp_device; struct ishtp_msg_hdr; struct ishtp_cl; /* * Timeouts in Seconds */ #define ISHTP_INTEROP_TIMEOUT 7 /* Timeout on ready message */ #define ISHTP_CL_CONNECT_TIMEOUT 15 /* HPS: Client Connect Timeout */ /* * ISHTP Version */ #define HBM_MINOR_VERSION 0 #define HBM_MAJOR_VERSION 1 /* Host bus message command opcode */ #define ISHTP_HBM_CMD_OP_MSK 0x7f /* Host bus message command RESPONSE */ #define ISHTP_HBM_CMD_RES_MSK 0x80 /* * ISHTP Bus Message Command IDs */ #define HOST_START_REQ_CMD 0x01 #define HOST_START_RES_CMD 0x81 #define HOST_STOP_REQ_CMD 0x02 #define HOST_STOP_RES_CMD 0x82 #define FW_STOP_REQ_CMD 0x03 #define HOST_ENUM_REQ_CMD 0x04 #define HOST_ENUM_RES_CMD 0x84 #define HOST_CLIENT_PROPERTIES_REQ_CMD 0x05 #define HOST_CLIENT_PROPERTIES_RES_CMD 0x85 #define CLIENT_CONNECT_REQ_CMD 0x06 #define CLIENT_CONNECT_RES_CMD 0x86 #define CLIENT_DISCONNECT_REQ_CMD 0x07 #define CLIENT_DISCONNECT_RES_CMD 0x87 #define ISHTP_FLOW_CONTROL_CMD 0x08 #define DMA_BUFFER_ALLOC_NOTIFY 0x11 #define DMA_BUFFER_ALLOC_RESPONSE 0x91 #define DMA_XFER 0x12 #define DMA_XFER_ACK 0x92 /* * ISHTP Stop Reason * used by hbm_host_stop_request.reason */ #define DRIVER_STOP_REQUEST 0x00 /* * ISHTP BUS Interface Section */ struct ishtp_msg_hdr { uint32_t fw_addr:8; uint32_t host_addr:8; uint32_t length:9; uint32_t reserved:6; uint32_t msg_complete:1; } __packed; struct ishtp_bus_message { uint8_t hbm_cmd; uint8_t data[0]; } __packed; /** * struct hbm_cl_cmd - client specific host bus command * CONNECT, DISCONNECT, and FlOW CONTROL * * @hbm_cmd - bus message command header * @fw_addr - address of the fw client * @host_addr - address of the client in the driver * @data */ struct ishtp_hbm_cl_cmd { uint8_t hbm_cmd; uint8_t fw_addr; uint8_t host_addr; uint8_t data; }; struct hbm_version { uint8_t minor_version; uint8_t major_version; } __packed; struct hbm_host_version_request { uint8_t hbm_cmd; uint8_t reserved; struct hbm_version host_version; } __packed; struct hbm_host_version_response { uint8_t hbm_cmd; uint8_t host_version_supported; struct hbm_version fw_max_version; } __packed; struct hbm_host_stop_request { uint8_t hbm_cmd; uint8_t reason; uint8_t reserved[2]; } __packed; struct hbm_host_stop_response { uint8_t hbm_cmd; uint8_t reserved[3]; } __packed; struct hbm_host_enum_request { uint8_t hbm_cmd; uint8_t reserved[3]; } __packed; struct hbm_host_enum_response { uint8_t hbm_cmd; uint8_t reserved[3]; uint8_t valid_addresses[32]; } __packed; struct ishtp_client_properties { guid_t protocol_name; uint8_t protocol_version; uint8_t max_number_of_connections; uint8_t fixed_address; uint8_t single_recv_buf; uint32_t max_msg_length; uint8_t dma_hdr_len; #define ISHTP_CLIENT_DMA_ENABLED 0x80 uint8_t reserved4; uint8_t reserved5; uint8_t reserved6; } __packed; struct hbm_props_request { uint8_t hbm_cmd; uint8_t address; uint8_t reserved[2]; } __packed; struct hbm_props_response { uint8_t hbm_cmd; uint8_t address; uint8_t status; uint8_t reserved[1]; struct ishtp_client_properties client_properties; } __packed; /** * struct hbm_client_connect_request - connect/disconnect request * * @hbm_cmd - bus message command header * @fw_addr - address of the fw client * @host_addr - address of the client in the driver * @reserved */ struct hbm_client_connect_request { uint8_t hbm_cmd; uint8_t fw_addr; uint8_t host_addr; uint8_t reserved; } __packed; /** * struct hbm_client_connect_response - connect/disconnect response * * @hbm_cmd - bus message command header * @fw_addr - address of the fw client * @host_addr - address of the client in the driver * @status - status of the request */ struct hbm_client_connect_response { uint8_t hbm_cmd; uint8_t fw_addr; uint8_t host_addr; uint8_t status; } __packed; #define ISHTP_FC_MESSAGE_RESERVED_LENGTH 5 struct hbm_flow_control { uint8_t hbm_cmd; uint8_t fw_addr; uint8_t host_addr; uint8_t reserved[ISHTP_FC_MESSAGE_RESERVED_LENGTH]; } __packed; struct dma_alloc_notify { uint8_t hbm; uint8_t status; uint8_t reserved[2]; uint32_t buf_size; uint64_t buf_address; /* [...] May come more size/address pairs */ } __packed; struct dma_xfer_hbm { uint8_t hbm; uint8_t fw_client_id; uint8_t host_client_id; uint8_t reserved; uint64_t msg_addr; uint32_t msg_length; uint32_t reserved2; } __packed; /* System state */ #define ISHTP_SYSTEM_STATE_CLIENT_ADDR 13 #define SYSTEM_STATE_SUBSCRIBE 0x1 #define SYSTEM_STATE_STATUS 0x2 #define SYSTEM_STATE_QUERY_SUBSCRIBERS 0x3 #define SYSTEM_STATE_STATE_CHANGE_REQ 0x4 /*indicates suspend and resume states*/ #define SUSPEND_STATE_BIT (1<<1) struct ish_system_states_header { uint32_t cmd; uint32_t cmd_status; /*responses will have this set*/ } __packed; struct ish_system_states_subscribe { struct ish_system_states_header hdr; uint32_t states; } __packed; struct ish_system_states_status { struct ish_system_states_header hdr; uint32_t supported_states; uint32_t states_status; } __packed; struct ish_system_states_query_subscribers { struct ish_system_states_header hdr; } __packed; struct ish_system_states_state_change_req { struct ish_system_states_header hdr; uint32_t requested_states; uint32_t states_status; } __packed; /** * enum ishtp_hbm_state - host bus message protocol state * * @ISHTP_HBM_IDLE : protocol not started * @ISHTP_HBM_START : start request message was sent * @ISHTP_HBM_ENUM_CLIENTS : enumeration request was sent * @ISHTP_HBM_CLIENT_PROPERTIES : acquiring clients properties */ enum ishtp_hbm_state { ISHTP_HBM_IDLE = 0, ISHTP_HBM_START, ISHTP_HBM_STARTED, ISHTP_HBM_ENUM_CLIENTS, ISHTP_HBM_CLIENT_PROPERTIES, ISHTP_HBM_WORKING, ISHTP_HBM_STOPPED, }; static inline void ishtp_hbm_hdr(struct ishtp_msg_hdr *hdr, size_t length) { hdr->host_addr = 0; hdr->fw_addr = 0; hdr->length = length; hdr->msg_complete = 1; hdr->reserved = 0; } int ishtp_hbm_start_req(struct ishtp_device *dev); int ishtp_hbm_start_wait(struct ishtp_device *dev); int ishtp_hbm_cl_flow_control_req(struct ishtp_device *dev, struct ishtp_cl *cl); int ishtp_hbm_cl_disconnect_req(struct ishtp_device *dev, struct ishtp_cl *cl); int ishtp_hbm_cl_connect_req(struct ishtp_device *dev, struct ishtp_cl *cl); void ishtp_hbm_enum_clients_req(struct ishtp_device *dev); void bh_hbm_work_fn(struct work_struct *work); void recv_hbm(struct ishtp_device *dev, struct ishtp_msg_hdr *ishtp_hdr); void recv_fixed_cl_msg(struct ishtp_device *dev, struct ishtp_msg_hdr *ishtp_hdr); void ishtp_hbm_dispatch(struct ishtp_device *dev, struct ishtp_bus_message *hdr); void ishtp_query_subscribers(struct ishtp_device *dev); /* Exported I/F */ void ishtp_send_suspend(struct ishtp_device *dev); void ishtp_send_resume(struct ishtp_device *dev); #endif /* _ISHTP_HBM_H_ */