2019-05-29 07:18:02 -07:00
/* SPDX-License-Identifier: GPL-2.0-only */
2016-08-07 02:25:34 -07:00
/*
* ISHTP bus layer messages handling
*
* Copyright ( c ) 2003 - 2016 , Intel Corporation .
*/
# ifndef _ISHTP_HBM_H_
# define _ISHTP_HBM_H_
# include <linux/uuid.h>
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 {
2019-01-24 22:09:06 +02:00
guid_t protocol_name ;
2016-08-07 02:25:34 -07:00
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_ */