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