162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * ISHTP bus layer messages handling 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2003-2016, Intel Corporation. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _ISHTP_HBM_H_ 962306a36Sopenharmony_ci#define _ISHTP_HBM_H_ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/uuid.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistruct ishtp_device; 1462306a36Sopenharmony_cistruct ishtp_msg_hdr; 1562306a36Sopenharmony_cistruct ishtp_cl; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* 1862306a36Sopenharmony_ci * Timeouts in Seconds 1962306a36Sopenharmony_ci */ 2062306a36Sopenharmony_ci#define ISHTP_INTEROP_TIMEOUT 7 /* Timeout on ready message */ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define ISHTP_CL_CONNECT_TIMEOUT 15 /* HPS: Client Connect Timeout */ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* 2562306a36Sopenharmony_ci * ISHTP Version 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_ci#define HBM_MINOR_VERSION 0 2862306a36Sopenharmony_ci#define HBM_MAJOR_VERSION 1 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/* Host bus message command opcode */ 3162306a36Sopenharmony_ci#define ISHTP_HBM_CMD_OP_MSK 0x7f 3262306a36Sopenharmony_ci/* Host bus message command RESPONSE */ 3362306a36Sopenharmony_ci#define ISHTP_HBM_CMD_RES_MSK 0x80 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* 3662306a36Sopenharmony_ci * ISHTP Bus Message Command IDs 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_ci#define HOST_START_REQ_CMD 0x01 3962306a36Sopenharmony_ci#define HOST_START_RES_CMD 0x81 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define HOST_STOP_REQ_CMD 0x02 4262306a36Sopenharmony_ci#define HOST_STOP_RES_CMD 0x82 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define FW_STOP_REQ_CMD 0x03 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define HOST_ENUM_REQ_CMD 0x04 4762306a36Sopenharmony_ci#define HOST_ENUM_RES_CMD 0x84 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define HOST_CLIENT_PROPERTIES_REQ_CMD 0x05 5062306a36Sopenharmony_ci#define HOST_CLIENT_PROPERTIES_RES_CMD 0x85 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#define CLIENT_CONNECT_REQ_CMD 0x06 5362306a36Sopenharmony_ci#define CLIENT_CONNECT_RES_CMD 0x86 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#define CLIENT_DISCONNECT_REQ_CMD 0x07 5662306a36Sopenharmony_ci#define CLIENT_DISCONNECT_RES_CMD 0x87 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define ISHTP_FLOW_CONTROL_CMD 0x08 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define DMA_BUFFER_ALLOC_NOTIFY 0x11 6162306a36Sopenharmony_ci#define DMA_BUFFER_ALLOC_RESPONSE 0x91 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#define DMA_XFER 0x12 6462306a36Sopenharmony_ci#define DMA_XFER_ACK 0x92 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/* 6762306a36Sopenharmony_ci * ISHTP Stop Reason 6862306a36Sopenharmony_ci * used by hbm_host_stop_request.reason 6962306a36Sopenharmony_ci */ 7062306a36Sopenharmony_ci#define DRIVER_STOP_REQUEST 0x00 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* 7362306a36Sopenharmony_ci * ISHTP BUS Interface Section 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_cistruct ishtp_msg_hdr { 7662306a36Sopenharmony_ci uint32_t fw_addr:8; 7762306a36Sopenharmony_ci uint32_t host_addr:8; 7862306a36Sopenharmony_ci uint32_t length:9; 7962306a36Sopenharmony_ci uint32_t reserved:6; 8062306a36Sopenharmony_ci uint32_t msg_complete:1; 8162306a36Sopenharmony_ci} __packed; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistruct ishtp_bus_message { 8462306a36Sopenharmony_ci uint8_t hbm_cmd; 8562306a36Sopenharmony_ci uint8_t data[]; 8662306a36Sopenharmony_ci} __packed; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci/** 8962306a36Sopenharmony_ci * struct hbm_cl_cmd - client specific host bus command 9062306a36Sopenharmony_ci * CONNECT, DISCONNECT, and FlOW CONTROL 9162306a36Sopenharmony_ci * 9262306a36Sopenharmony_ci * @hbm_cmd - bus message command header 9362306a36Sopenharmony_ci * @fw_addr - address of the fw client 9462306a36Sopenharmony_ci * @host_addr - address of the client in the driver 9562306a36Sopenharmony_ci * @data 9662306a36Sopenharmony_ci */ 9762306a36Sopenharmony_cistruct ishtp_hbm_cl_cmd { 9862306a36Sopenharmony_ci uint8_t hbm_cmd; 9962306a36Sopenharmony_ci uint8_t fw_addr; 10062306a36Sopenharmony_ci uint8_t host_addr; 10162306a36Sopenharmony_ci uint8_t data; 10262306a36Sopenharmony_ci}; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistruct hbm_version { 10562306a36Sopenharmony_ci uint8_t minor_version; 10662306a36Sopenharmony_ci uint8_t major_version; 10762306a36Sopenharmony_ci} __packed; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistruct hbm_host_version_request { 11062306a36Sopenharmony_ci uint8_t hbm_cmd; 11162306a36Sopenharmony_ci uint8_t reserved; 11262306a36Sopenharmony_ci struct hbm_version host_version; 11362306a36Sopenharmony_ci} __packed; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistruct hbm_host_version_response { 11662306a36Sopenharmony_ci uint8_t hbm_cmd; 11762306a36Sopenharmony_ci uint8_t host_version_supported; 11862306a36Sopenharmony_ci struct hbm_version fw_max_version; 11962306a36Sopenharmony_ci} __packed; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_cistruct hbm_host_stop_request { 12262306a36Sopenharmony_ci uint8_t hbm_cmd; 12362306a36Sopenharmony_ci uint8_t reason; 12462306a36Sopenharmony_ci uint8_t reserved[2]; 12562306a36Sopenharmony_ci} __packed; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cistruct hbm_host_stop_response { 12862306a36Sopenharmony_ci uint8_t hbm_cmd; 12962306a36Sopenharmony_ci uint8_t reserved[3]; 13062306a36Sopenharmony_ci} __packed; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistruct hbm_host_enum_request { 13362306a36Sopenharmony_ci uint8_t hbm_cmd; 13462306a36Sopenharmony_ci uint8_t reserved[3]; 13562306a36Sopenharmony_ci} __packed; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistruct hbm_host_enum_response { 13862306a36Sopenharmony_ci uint8_t hbm_cmd; 13962306a36Sopenharmony_ci uint8_t reserved[3]; 14062306a36Sopenharmony_ci uint8_t valid_addresses[32]; 14162306a36Sopenharmony_ci} __packed; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistruct ishtp_client_properties { 14462306a36Sopenharmony_ci guid_t protocol_name; 14562306a36Sopenharmony_ci uint8_t protocol_version; 14662306a36Sopenharmony_ci uint8_t max_number_of_connections; 14762306a36Sopenharmony_ci uint8_t fixed_address; 14862306a36Sopenharmony_ci uint8_t single_recv_buf; 14962306a36Sopenharmony_ci uint32_t max_msg_length; 15062306a36Sopenharmony_ci uint8_t dma_hdr_len; 15162306a36Sopenharmony_ci#define ISHTP_CLIENT_DMA_ENABLED 0x80 15262306a36Sopenharmony_ci uint8_t reserved4; 15362306a36Sopenharmony_ci uint8_t reserved5; 15462306a36Sopenharmony_ci uint8_t reserved6; 15562306a36Sopenharmony_ci} __packed; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistruct hbm_props_request { 15862306a36Sopenharmony_ci uint8_t hbm_cmd; 15962306a36Sopenharmony_ci uint8_t address; 16062306a36Sopenharmony_ci uint8_t reserved[2]; 16162306a36Sopenharmony_ci} __packed; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistruct hbm_props_response { 16462306a36Sopenharmony_ci uint8_t hbm_cmd; 16562306a36Sopenharmony_ci uint8_t address; 16662306a36Sopenharmony_ci uint8_t status; 16762306a36Sopenharmony_ci uint8_t reserved[1]; 16862306a36Sopenharmony_ci struct ishtp_client_properties client_properties; 16962306a36Sopenharmony_ci} __packed; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci/** 17262306a36Sopenharmony_ci * struct hbm_client_connect_request - connect/disconnect request 17362306a36Sopenharmony_ci * 17462306a36Sopenharmony_ci * @hbm_cmd - bus message command header 17562306a36Sopenharmony_ci * @fw_addr - address of the fw client 17662306a36Sopenharmony_ci * @host_addr - address of the client in the driver 17762306a36Sopenharmony_ci * @reserved 17862306a36Sopenharmony_ci */ 17962306a36Sopenharmony_cistruct hbm_client_connect_request { 18062306a36Sopenharmony_ci uint8_t hbm_cmd; 18162306a36Sopenharmony_ci uint8_t fw_addr; 18262306a36Sopenharmony_ci uint8_t host_addr; 18362306a36Sopenharmony_ci uint8_t reserved; 18462306a36Sopenharmony_ci} __packed; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci/** 18762306a36Sopenharmony_ci * struct hbm_client_connect_response - connect/disconnect response 18862306a36Sopenharmony_ci * 18962306a36Sopenharmony_ci * @hbm_cmd - bus message command header 19062306a36Sopenharmony_ci * @fw_addr - address of the fw client 19162306a36Sopenharmony_ci * @host_addr - address of the client in the driver 19262306a36Sopenharmony_ci * @status - status of the request 19362306a36Sopenharmony_ci */ 19462306a36Sopenharmony_cistruct hbm_client_connect_response { 19562306a36Sopenharmony_ci uint8_t hbm_cmd; 19662306a36Sopenharmony_ci uint8_t fw_addr; 19762306a36Sopenharmony_ci uint8_t host_addr; 19862306a36Sopenharmony_ci uint8_t status; 19962306a36Sopenharmony_ci} __packed; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci#define ISHTP_FC_MESSAGE_RESERVED_LENGTH 5 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cistruct hbm_flow_control { 20562306a36Sopenharmony_ci uint8_t hbm_cmd; 20662306a36Sopenharmony_ci uint8_t fw_addr; 20762306a36Sopenharmony_ci uint8_t host_addr; 20862306a36Sopenharmony_ci uint8_t reserved[ISHTP_FC_MESSAGE_RESERVED_LENGTH]; 20962306a36Sopenharmony_ci} __packed; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistruct dma_alloc_notify { 21262306a36Sopenharmony_ci uint8_t hbm; 21362306a36Sopenharmony_ci uint8_t status; 21462306a36Sopenharmony_ci uint8_t reserved[2]; 21562306a36Sopenharmony_ci uint32_t buf_size; 21662306a36Sopenharmony_ci uint64_t buf_address; 21762306a36Sopenharmony_ci /* [...] May come more size/address pairs */ 21862306a36Sopenharmony_ci} __packed; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistruct dma_xfer_hbm { 22162306a36Sopenharmony_ci uint8_t hbm; 22262306a36Sopenharmony_ci uint8_t fw_client_id; 22362306a36Sopenharmony_ci uint8_t host_client_id; 22462306a36Sopenharmony_ci uint8_t reserved; 22562306a36Sopenharmony_ci uint64_t msg_addr; 22662306a36Sopenharmony_ci uint32_t msg_length; 22762306a36Sopenharmony_ci uint32_t reserved2; 22862306a36Sopenharmony_ci} __packed; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci/* System state */ 23162306a36Sopenharmony_ci#define ISHTP_SYSTEM_STATE_CLIENT_ADDR 13 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci#define SYSTEM_STATE_SUBSCRIBE 0x1 23462306a36Sopenharmony_ci#define SYSTEM_STATE_STATUS 0x2 23562306a36Sopenharmony_ci#define SYSTEM_STATE_QUERY_SUBSCRIBERS 0x3 23662306a36Sopenharmony_ci#define SYSTEM_STATE_STATE_CHANGE_REQ 0x4 23762306a36Sopenharmony_ci/*indicates suspend and resume states*/ 23862306a36Sopenharmony_ci#define CONNECTED_STANDBY_STATE_BIT (1<<0) 23962306a36Sopenharmony_ci#define SUSPEND_STATE_BIT (1<<1) 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistruct ish_system_states_header { 24262306a36Sopenharmony_ci uint32_t cmd; 24362306a36Sopenharmony_ci uint32_t cmd_status; /*responses will have this set*/ 24462306a36Sopenharmony_ci} __packed; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_cistruct ish_system_states_subscribe { 24762306a36Sopenharmony_ci struct ish_system_states_header hdr; 24862306a36Sopenharmony_ci uint32_t states; 24962306a36Sopenharmony_ci} __packed; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistruct ish_system_states_status { 25262306a36Sopenharmony_ci struct ish_system_states_header hdr; 25362306a36Sopenharmony_ci uint32_t supported_states; 25462306a36Sopenharmony_ci uint32_t states_status; 25562306a36Sopenharmony_ci} __packed; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_cistruct ish_system_states_query_subscribers { 25862306a36Sopenharmony_ci struct ish_system_states_header hdr; 25962306a36Sopenharmony_ci} __packed; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_cistruct ish_system_states_state_change_req { 26262306a36Sopenharmony_ci struct ish_system_states_header hdr; 26362306a36Sopenharmony_ci uint32_t requested_states; 26462306a36Sopenharmony_ci uint32_t states_status; 26562306a36Sopenharmony_ci} __packed; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci/** 26862306a36Sopenharmony_ci * enum ishtp_hbm_state - host bus message protocol state 26962306a36Sopenharmony_ci * 27062306a36Sopenharmony_ci * @ISHTP_HBM_IDLE : protocol not started 27162306a36Sopenharmony_ci * @ISHTP_HBM_START : start request message was sent 27262306a36Sopenharmony_ci * @ISHTP_HBM_ENUM_CLIENTS : enumeration request was sent 27362306a36Sopenharmony_ci * @ISHTP_HBM_CLIENT_PROPERTIES : acquiring clients properties 27462306a36Sopenharmony_ci */ 27562306a36Sopenharmony_cienum ishtp_hbm_state { 27662306a36Sopenharmony_ci ISHTP_HBM_IDLE = 0, 27762306a36Sopenharmony_ci ISHTP_HBM_START, 27862306a36Sopenharmony_ci ISHTP_HBM_STARTED, 27962306a36Sopenharmony_ci ISHTP_HBM_ENUM_CLIENTS, 28062306a36Sopenharmony_ci ISHTP_HBM_CLIENT_PROPERTIES, 28162306a36Sopenharmony_ci ISHTP_HBM_WORKING, 28262306a36Sopenharmony_ci ISHTP_HBM_STOPPED, 28362306a36Sopenharmony_ci}; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_cistatic inline void ishtp_hbm_hdr(struct ishtp_msg_hdr *hdr, size_t length) 28662306a36Sopenharmony_ci{ 28762306a36Sopenharmony_ci hdr->host_addr = 0; 28862306a36Sopenharmony_ci hdr->fw_addr = 0; 28962306a36Sopenharmony_ci hdr->length = length; 29062306a36Sopenharmony_ci hdr->msg_complete = 1; 29162306a36Sopenharmony_ci hdr->reserved = 0; 29262306a36Sopenharmony_ci} 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ciint ishtp_hbm_start_req(struct ishtp_device *dev); 29562306a36Sopenharmony_ciint ishtp_hbm_start_wait(struct ishtp_device *dev); 29662306a36Sopenharmony_ciint ishtp_hbm_cl_flow_control_req(struct ishtp_device *dev, 29762306a36Sopenharmony_ci struct ishtp_cl *cl); 29862306a36Sopenharmony_ciint ishtp_hbm_cl_disconnect_req(struct ishtp_device *dev, struct ishtp_cl *cl); 29962306a36Sopenharmony_ciint ishtp_hbm_cl_connect_req(struct ishtp_device *dev, struct ishtp_cl *cl); 30062306a36Sopenharmony_civoid ishtp_hbm_enum_clients_req(struct ishtp_device *dev); 30162306a36Sopenharmony_civoid bh_hbm_work_fn(struct work_struct *work); 30262306a36Sopenharmony_civoid recv_hbm(struct ishtp_device *dev, struct ishtp_msg_hdr *ishtp_hdr); 30362306a36Sopenharmony_civoid recv_fixed_cl_msg(struct ishtp_device *dev, 30462306a36Sopenharmony_ci struct ishtp_msg_hdr *ishtp_hdr); 30562306a36Sopenharmony_civoid ishtp_hbm_dispatch(struct ishtp_device *dev, 30662306a36Sopenharmony_ci struct ishtp_bus_message *hdr); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_civoid ishtp_query_subscribers(struct ishtp_device *dev); 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci/* Exported I/F */ 31162306a36Sopenharmony_civoid ishtp_send_suspend(struct ishtp_device *dev); 31262306a36Sopenharmony_civoid ishtp_send_resume(struct ishtp_device *dev); 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci#endif /* _ISHTP_HBM_H_ */ 315