12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
23703f53bSSrinivas Pandruvada /*
33703f53bSSrinivas Pandruvada  * ISHTP bus layer messages handling
43703f53bSSrinivas Pandruvada  *
53703f53bSSrinivas Pandruvada  * Copyright (c) 2003-2016, Intel Corporation.
63703f53bSSrinivas Pandruvada  */
73703f53bSSrinivas Pandruvada 
83703f53bSSrinivas Pandruvada #ifndef _ISHTP_HBM_H_
93703f53bSSrinivas Pandruvada #define _ISHTP_HBM_H_
103703f53bSSrinivas Pandruvada 
113703f53bSSrinivas Pandruvada #include <linux/uuid.h>
123703f53bSSrinivas Pandruvada 
133703f53bSSrinivas Pandruvada struct ishtp_device;
143703f53bSSrinivas Pandruvada struct ishtp_msg_hdr;
153703f53bSSrinivas Pandruvada struct ishtp_cl;
163703f53bSSrinivas Pandruvada 
173703f53bSSrinivas Pandruvada /*
183703f53bSSrinivas Pandruvada  * Timeouts in Seconds
193703f53bSSrinivas Pandruvada  */
203703f53bSSrinivas Pandruvada #define ISHTP_INTEROP_TIMEOUT		7 /* Timeout on ready message */
213703f53bSSrinivas Pandruvada 
223703f53bSSrinivas Pandruvada #define ISHTP_CL_CONNECT_TIMEOUT	15 /* HPS: Client Connect Timeout */
233703f53bSSrinivas Pandruvada 
243703f53bSSrinivas Pandruvada /*
253703f53bSSrinivas Pandruvada  * ISHTP Version
263703f53bSSrinivas Pandruvada  */
273703f53bSSrinivas Pandruvada #define HBM_MINOR_VERSION		0
283703f53bSSrinivas Pandruvada #define HBM_MAJOR_VERSION		1
293703f53bSSrinivas Pandruvada 
303703f53bSSrinivas Pandruvada /* Host bus message command opcode */
313703f53bSSrinivas Pandruvada #define ISHTP_HBM_CMD_OP_MSK		0x7f
323703f53bSSrinivas Pandruvada /* Host bus message command RESPONSE */
333703f53bSSrinivas Pandruvada #define ISHTP_HBM_CMD_RES_MSK		0x80
343703f53bSSrinivas Pandruvada 
353703f53bSSrinivas Pandruvada /*
363703f53bSSrinivas Pandruvada  * ISHTP Bus Message Command IDs
373703f53bSSrinivas Pandruvada  */
383703f53bSSrinivas Pandruvada #define HOST_START_REQ_CMD		0x01
393703f53bSSrinivas Pandruvada #define HOST_START_RES_CMD		0x81
403703f53bSSrinivas Pandruvada 
413703f53bSSrinivas Pandruvada #define HOST_STOP_REQ_CMD		0x02
423703f53bSSrinivas Pandruvada #define HOST_STOP_RES_CMD		0x82
433703f53bSSrinivas Pandruvada 
443703f53bSSrinivas Pandruvada #define FW_STOP_REQ_CMD			0x03
453703f53bSSrinivas Pandruvada 
463703f53bSSrinivas Pandruvada #define HOST_ENUM_REQ_CMD		0x04
473703f53bSSrinivas Pandruvada #define HOST_ENUM_RES_CMD		0x84
483703f53bSSrinivas Pandruvada 
493703f53bSSrinivas Pandruvada #define HOST_CLIENT_PROPERTIES_REQ_CMD	0x05
503703f53bSSrinivas Pandruvada #define HOST_CLIENT_PROPERTIES_RES_CMD	0x85
513703f53bSSrinivas Pandruvada 
523703f53bSSrinivas Pandruvada #define CLIENT_CONNECT_REQ_CMD		0x06
533703f53bSSrinivas Pandruvada #define CLIENT_CONNECT_RES_CMD		0x86
543703f53bSSrinivas Pandruvada 
553703f53bSSrinivas Pandruvada #define CLIENT_DISCONNECT_REQ_CMD	0x07
563703f53bSSrinivas Pandruvada #define CLIENT_DISCONNECT_RES_CMD	0x87
573703f53bSSrinivas Pandruvada 
583703f53bSSrinivas Pandruvada #define ISHTP_FLOW_CONTROL_CMD		0x08
593703f53bSSrinivas Pandruvada 
603703f53bSSrinivas Pandruvada #define DMA_BUFFER_ALLOC_NOTIFY		0x11
613703f53bSSrinivas Pandruvada #define DMA_BUFFER_ALLOC_RESPONSE	0x91
623703f53bSSrinivas Pandruvada 
633703f53bSSrinivas Pandruvada #define DMA_XFER			0x12
643703f53bSSrinivas Pandruvada #define DMA_XFER_ACK			0x92
653703f53bSSrinivas Pandruvada 
663703f53bSSrinivas Pandruvada /*
673703f53bSSrinivas Pandruvada  * ISHTP Stop Reason
683703f53bSSrinivas Pandruvada  * used by hbm_host_stop_request.reason
693703f53bSSrinivas Pandruvada  */
703703f53bSSrinivas Pandruvada #define	DRIVER_STOP_REQUEST		0x00
713703f53bSSrinivas Pandruvada 
723703f53bSSrinivas Pandruvada /*
733703f53bSSrinivas Pandruvada  * ISHTP BUS Interface Section
743703f53bSSrinivas Pandruvada  */
753703f53bSSrinivas Pandruvada struct ishtp_msg_hdr {
763703f53bSSrinivas Pandruvada 	uint32_t fw_addr:8;
773703f53bSSrinivas Pandruvada 	uint32_t host_addr:8;
783703f53bSSrinivas Pandruvada 	uint32_t length:9;
793703f53bSSrinivas Pandruvada 	uint32_t reserved:6;
803703f53bSSrinivas Pandruvada 	uint32_t msg_complete:1;
813703f53bSSrinivas Pandruvada } __packed;
823703f53bSSrinivas Pandruvada 
833703f53bSSrinivas Pandruvada struct ishtp_bus_message {
843703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
8556d8623cSGustavo A. R. Silva 	uint8_t data[];
863703f53bSSrinivas Pandruvada } __packed;
873703f53bSSrinivas Pandruvada 
883703f53bSSrinivas Pandruvada /**
893703f53bSSrinivas Pandruvada  * struct hbm_cl_cmd - client specific host bus command
903703f53bSSrinivas Pandruvada  *	CONNECT, DISCONNECT, and FlOW CONTROL
913703f53bSSrinivas Pandruvada  *
923703f53bSSrinivas Pandruvada  * @hbm_cmd - bus message command header
933703f53bSSrinivas Pandruvada  * @fw_addr - address of the fw client
943703f53bSSrinivas Pandruvada  * @host_addr - address of the client in the driver
953703f53bSSrinivas Pandruvada  * @data
963703f53bSSrinivas Pandruvada  */
973703f53bSSrinivas Pandruvada struct ishtp_hbm_cl_cmd {
983703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
993703f53bSSrinivas Pandruvada 	uint8_t fw_addr;
1003703f53bSSrinivas Pandruvada 	uint8_t host_addr;
1013703f53bSSrinivas Pandruvada 	uint8_t data;
1023703f53bSSrinivas Pandruvada };
1033703f53bSSrinivas Pandruvada 
1043703f53bSSrinivas Pandruvada struct hbm_version {
1053703f53bSSrinivas Pandruvada 	uint8_t minor_version;
1063703f53bSSrinivas Pandruvada 	uint8_t major_version;
1073703f53bSSrinivas Pandruvada } __packed;
1083703f53bSSrinivas Pandruvada 
1093703f53bSSrinivas Pandruvada struct hbm_host_version_request {
1103703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
1113703f53bSSrinivas Pandruvada 	uint8_t reserved;
1123703f53bSSrinivas Pandruvada 	struct hbm_version host_version;
1133703f53bSSrinivas Pandruvada } __packed;
1143703f53bSSrinivas Pandruvada 
1153703f53bSSrinivas Pandruvada struct hbm_host_version_response {
1163703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
1173703f53bSSrinivas Pandruvada 	uint8_t host_version_supported;
1183703f53bSSrinivas Pandruvada 	struct hbm_version fw_max_version;
1193703f53bSSrinivas Pandruvada } __packed;
1203703f53bSSrinivas Pandruvada 
1213703f53bSSrinivas Pandruvada struct hbm_host_stop_request {
1223703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
1233703f53bSSrinivas Pandruvada 	uint8_t reason;
1243703f53bSSrinivas Pandruvada 	uint8_t reserved[2];
1253703f53bSSrinivas Pandruvada } __packed;
1263703f53bSSrinivas Pandruvada 
1273703f53bSSrinivas Pandruvada struct hbm_host_stop_response {
1283703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
1293703f53bSSrinivas Pandruvada 	uint8_t reserved[3];
1303703f53bSSrinivas Pandruvada } __packed;
1313703f53bSSrinivas Pandruvada 
1323703f53bSSrinivas Pandruvada struct hbm_host_enum_request {
1333703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
1343703f53bSSrinivas Pandruvada 	uint8_t reserved[3];
1353703f53bSSrinivas Pandruvada } __packed;
1363703f53bSSrinivas Pandruvada 
1373703f53bSSrinivas Pandruvada struct hbm_host_enum_response {
1383703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
1393703f53bSSrinivas Pandruvada 	uint8_t reserved[3];
1403703f53bSSrinivas Pandruvada 	uint8_t valid_addresses[32];
1413703f53bSSrinivas Pandruvada } __packed;
1423703f53bSSrinivas Pandruvada 
1433703f53bSSrinivas Pandruvada struct ishtp_client_properties {
14414106501SAndy Shevchenko 	guid_t protocol_name;
1453703f53bSSrinivas Pandruvada 	uint8_t protocol_version;
1463703f53bSSrinivas Pandruvada 	uint8_t max_number_of_connections;
1473703f53bSSrinivas Pandruvada 	uint8_t fixed_address;
1483703f53bSSrinivas Pandruvada 	uint8_t single_recv_buf;
1493703f53bSSrinivas Pandruvada 	uint32_t max_msg_length;
1503703f53bSSrinivas Pandruvada 	uint8_t dma_hdr_len;
1513703f53bSSrinivas Pandruvada #define	ISHTP_CLIENT_DMA_ENABLED	0x80
1523703f53bSSrinivas Pandruvada 	uint8_t reserved4;
1533703f53bSSrinivas Pandruvada 	uint8_t reserved5;
1543703f53bSSrinivas Pandruvada 	uint8_t reserved6;
1553703f53bSSrinivas Pandruvada } __packed;
1563703f53bSSrinivas Pandruvada 
1573703f53bSSrinivas Pandruvada struct hbm_props_request {
1583703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
1593703f53bSSrinivas Pandruvada 	uint8_t address;
1603703f53bSSrinivas Pandruvada 	uint8_t reserved[2];
1613703f53bSSrinivas Pandruvada } __packed;
1623703f53bSSrinivas Pandruvada 
1633703f53bSSrinivas Pandruvada struct hbm_props_response {
1643703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
1653703f53bSSrinivas Pandruvada 	uint8_t address;
1663703f53bSSrinivas Pandruvada 	uint8_t status;
1673703f53bSSrinivas Pandruvada 	uint8_t reserved[1];
1683703f53bSSrinivas Pandruvada 	struct ishtp_client_properties client_properties;
1693703f53bSSrinivas Pandruvada } __packed;
1703703f53bSSrinivas Pandruvada 
1713703f53bSSrinivas Pandruvada /**
1723703f53bSSrinivas Pandruvada  * struct hbm_client_connect_request - connect/disconnect request
1733703f53bSSrinivas Pandruvada  *
1743703f53bSSrinivas Pandruvada  * @hbm_cmd - bus message command header
1753703f53bSSrinivas Pandruvada  * @fw_addr - address of the fw client
1763703f53bSSrinivas Pandruvada  * @host_addr - address of the client in the driver
1773703f53bSSrinivas Pandruvada  * @reserved
1783703f53bSSrinivas Pandruvada  */
1793703f53bSSrinivas Pandruvada struct hbm_client_connect_request {
1803703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
1813703f53bSSrinivas Pandruvada 	uint8_t fw_addr;
1823703f53bSSrinivas Pandruvada 	uint8_t host_addr;
1833703f53bSSrinivas Pandruvada 	uint8_t reserved;
1843703f53bSSrinivas Pandruvada } __packed;
1853703f53bSSrinivas Pandruvada 
1863703f53bSSrinivas Pandruvada /**
1873703f53bSSrinivas Pandruvada  * struct hbm_client_connect_response - connect/disconnect response
1883703f53bSSrinivas Pandruvada  *
1893703f53bSSrinivas Pandruvada  * @hbm_cmd - bus message command header
1903703f53bSSrinivas Pandruvada  * @fw_addr - address of the fw client
1913703f53bSSrinivas Pandruvada  * @host_addr - address of the client in the driver
1923703f53bSSrinivas Pandruvada  * @status - status of the request
1933703f53bSSrinivas Pandruvada  */
1943703f53bSSrinivas Pandruvada struct hbm_client_connect_response {
1953703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
1963703f53bSSrinivas Pandruvada 	uint8_t fw_addr;
1973703f53bSSrinivas Pandruvada 	uint8_t host_addr;
1983703f53bSSrinivas Pandruvada 	uint8_t status;
1993703f53bSSrinivas Pandruvada } __packed;
2003703f53bSSrinivas Pandruvada 
2013703f53bSSrinivas Pandruvada 
2023703f53bSSrinivas Pandruvada #define ISHTP_FC_MESSAGE_RESERVED_LENGTH		5
2033703f53bSSrinivas Pandruvada 
2043703f53bSSrinivas Pandruvada struct hbm_flow_control {
2053703f53bSSrinivas Pandruvada 	uint8_t hbm_cmd;
2063703f53bSSrinivas Pandruvada 	uint8_t fw_addr;
2073703f53bSSrinivas Pandruvada 	uint8_t host_addr;
2083703f53bSSrinivas Pandruvada 	uint8_t reserved[ISHTP_FC_MESSAGE_RESERVED_LENGTH];
2093703f53bSSrinivas Pandruvada } __packed;
2103703f53bSSrinivas Pandruvada 
2113703f53bSSrinivas Pandruvada struct dma_alloc_notify {
2123703f53bSSrinivas Pandruvada 	uint8_t hbm;
2133703f53bSSrinivas Pandruvada 	uint8_t status;
2143703f53bSSrinivas Pandruvada 	uint8_t reserved[2];
2153703f53bSSrinivas Pandruvada 	uint32_t buf_size;
2163703f53bSSrinivas Pandruvada 	uint64_t buf_address;
2173703f53bSSrinivas Pandruvada 	/* [...] May come more size/address pairs */
2183703f53bSSrinivas Pandruvada } __packed;
2193703f53bSSrinivas Pandruvada 
2203703f53bSSrinivas Pandruvada struct dma_xfer_hbm {
2213703f53bSSrinivas Pandruvada 	uint8_t hbm;
2223703f53bSSrinivas Pandruvada 	uint8_t fw_client_id;
2233703f53bSSrinivas Pandruvada 	uint8_t host_client_id;
2243703f53bSSrinivas Pandruvada 	uint8_t reserved;
2253703f53bSSrinivas Pandruvada 	uint64_t msg_addr;
2263703f53bSSrinivas Pandruvada 	uint32_t msg_length;
2273703f53bSSrinivas Pandruvada 	uint32_t reserved2;
2283703f53bSSrinivas Pandruvada } __packed;
2293703f53bSSrinivas Pandruvada 
2303703f53bSSrinivas Pandruvada /* System state */
2313703f53bSSrinivas Pandruvada #define ISHTP_SYSTEM_STATE_CLIENT_ADDR		13
2323703f53bSSrinivas Pandruvada 
2333703f53bSSrinivas Pandruvada #define SYSTEM_STATE_SUBSCRIBE			0x1
2343703f53bSSrinivas Pandruvada #define SYSTEM_STATE_STATUS			0x2
2353703f53bSSrinivas Pandruvada #define SYSTEM_STATE_QUERY_SUBSCRIBERS		0x3
2363703f53bSSrinivas Pandruvada #define SYSTEM_STATE_STATE_CHANGE_REQ		0x4
2373703f53bSSrinivas Pandruvada /*indicates suspend and resume states*/
238*94cad2ddSYe Xiang #define CONNECTED_STANDBY_STATE_BIT		(1<<0)
2393703f53bSSrinivas Pandruvada #define SUSPEND_STATE_BIT			(1<<1)
2403703f53bSSrinivas Pandruvada 
2413703f53bSSrinivas Pandruvada struct ish_system_states_header {
2423703f53bSSrinivas Pandruvada 	uint32_t cmd;
2433703f53bSSrinivas Pandruvada 	uint32_t cmd_status;	/*responses will have this set*/
2443703f53bSSrinivas Pandruvada } __packed;
2453703f53bSSrinivas Pandruvada 
2463703f53bSSrinivas Pandruvada struct ish_system_states_subscribe {
2473703f53bSSrinivas Pandruvada 	struct ish_system_states_header hdr;
2483703f53bSSrinivas Pandruvada 	uint32_t states;
2493703f53bSSrinivas Pandruvada } __packed;
2503703f53bSSrinivas Pandruvada 
2513703f53bSSrinivas Pandruvada struct ish_system_states_status {
2523703f53bSSrinivas Pandruvada 	struct ish_system_states_header hdr;
2533703f53bSSrinivas Pandruvada 	uint32_t supported_states;
2543703f53bSSrinivas Pandruvada 	uint32_t states_status;
2553703f53bSSrinivas Pandruvada } __packed;
2563703f53bSSrinivas Pandruvada 
2573703f53bSSrinivas Pandruvada struct ish_system_states_query_subscribers {
2583703f53bSSrinivas Pandruvada 	struct ish_system_states_header hdr;
2593703f53bSSrinivas Pandruvada } __packed;
2603703f53bSSrinivas Pandruvada 
2613703f53bSSrinivas Pandruvada struct ish_system_states_state_change_req {
2623703f53bSSrinivas Pandruvada 	struct ish_system_states_header hdr;
2633703f53bSSrinivas Pandruvada 	uint32_t requested_states;
2643703f53bSSrinivas Pandruvada 	uint32_t states_status;
2653703f53bSSrinivas Pandruvada } __packed;
2663703f53bSSrinivas Pandruvada 
2673703f53bSSrinivas Pandruvada /**
2683703f53bSSrinivas Pandruvada  * enum ishtp_hbm_state - host bus message protocol state
2693703f53bSSrinivas Pandruvada  *
2703703f53bSSrinivas Pandruvada  * @ISHTP_HBM_IDLE : protocol not started
2713703f53bSSrinivas Pandruvada  * @ISHTP_HBM_START : start request message was sent
2723703f53bSSrinivas Pandruvada  * @ISHTP_HBM_ENUM_CLIENTS : enumeration request was sent
2733703f53bSSrinivas Pandruvada  * @ISHTP_HBM_CLIENT_PROPERTIES : acquiring clients properties
2743703f53bSSrinivas Pandruvada  */
2753703f53bSSrinivas Pandruvada enum ishtp_hbm_state {
2763703f53bSSrinivas Pandruvada 	ISHTP_HBM_IDLE = 0,
2773703f53bSSrinivas Pandruvada 	ISHTP_HBM_START,
2783703f53bSSrinivas Pandruvada 	ISHTP_HBM_STARTED,
2793703f53bSSrinivas Pandruvada 	ISHTP_HBM_ENUM_CLIENTS,
2803703f53bSSrinivas Pandruvada 	ISHTP_HBM_CLIENT_PROPERTIES,
2813703f53bSSrinivas Pandruvada 	ISHTP_HBM_WORKING,
2823703f53bSSrinivas Pandruvada 	ISHTP_HBM_STOPPED,
2833703f53bSSrinivas Pandruvada };
2843703f53bSSrinivas Pandruvada 
ishtp_hbm_hdr(struct ishtp_msg_hdr * hdr,size_t length)2853703f53bSSrinivas Pandruvada static inline void ishtp_hbm_hdr(struct ishtp_msg_hdr *hdr, size_t length)
2863703f53bSSrinivas Pandruvada {
2873703f53bSSrinivas Pandruvada 	hdr->host_addr = 0;
2883703f53bSSrinivas Pandruvada 	hdr->fw_addr = 0;
2893703f53bSSrinivas Pandruvada 	hdr->length = length;
2903703f53bSSrinivas Pandruvada 	hdr->msg_complete = 1;
2913703f53bSSrinivas Pandruvada 	hdr->reserved = 0;
2923703f53bSSrinivas Pandruvada }
2933703f53bSSrinivas Pandruvada 
2943703f53bSSrinivas Pandruvada int ishtp_hbm_start_req(struct ishtp_device *dev);
2953703f53bSSrinivas Pandruvada int ishtp_hbm_start_wait(struct ishtp_device *dev);
2963703f53bSSrinivas Pandruvada int ishtp_hbm_cl_flow_control_req(struct ishtp_device *dev,
2973703f53bSSrinivas Pandruvada 				  struct ishtp_cl *cl);
2983703f53bSSrinivas Pandruvada int ishtp_hbm_cl_disconnect_req(struct ishtp_device *dev, struct ishtp_cl *cl);
2993703f53bSSrinivas Pandruvada int ishtp_hbm_cl_connect_req(struct ishtp_device *dev, struct ishtp_cl *cl);
3003703f53bSSrinivas Pandruvada void ishtp_hbm_enum_clients_req(struct ishtp_device *dev);
3013703f53bSSrinivas Pandruvada void bh_hbm_work_fn(struct work_struct *work);
3023703f53bSSrinivas Pandruvada void recv_hbm(struct ishtp_device *dev, struct ishtp_msg_hdr *ishtp_hdr);
3033703f53bSSrinivas Pandruvada void recv_fixed_cl_msg(struct ishtp_device *dev,
3043703f53bSSrinivas Pandruvada 	struct ishtp_msg_hdr *ishtp_hdr);
3053703f53bSSrinivas Pandruvada void ishtp_hbm_dispatch(struct ishtp_device *dev,
3063703f53bSSrinivas Pandruvada 	struct ishtp_bus_message *hdr);
3073703f53bSSrinivas Pandruvada 
3083703f53bSSrinivas Pandruvada void ishtp_query_subscribers(struct ishtp_device *dev);
3093703f53bSSrinivas Pandruvada 
3103703f53bSSrinivas Pandruvada /* Exported I/F */
3113703f53bSSrinivas Pandruvada void ishtp_send_suspend(struct ishtp_device *dev);
3123703f53bSSrinivas Pandruvada void ishtp_send_resume(struct ishtp_device *dev);
3133703f53bSSrinivas Pandruvada 
3143703f53bSSrinivas Pandruvada #endif /* _ISHTP_HBM_H_ */
315