cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hbm.h (7146B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * ISHTP bus layer messages handling
      4 *
      5 * Copyright (c) 2003-2016, Intel Corporation.
      6 */
      7
      8#ifndef _ISHTP_HBM_H_
      9#define _ISHTP_HBM_H_
     10
     11#include <linux/uuid.h>
     12
     13struct ishtp_device;
     14struct ishtp_msg_hdr;
     15struct ishtp_cl;
     16
     17/*
     18 * Timeouts in Seconds
     19 */
     20#define ISHTP_INTEROP_TIMEOUT		7 /* Timeout on ready message */
     21
     22#define ISHTP_CL_CONNECT_TIMEOUT	15 /* HPS: Client Connect Timeout */
     23
     24/*
     25 * ISHTP Version
     26 */
     27#define HBM_MINOR_VERSION		0
     28#define HBM_MAJOR_VERSION		1
     29
     30/* Host bus message command opcode */
     31#define ISHTP_HBM_CMD_OP_MSK		0x7f
     32/* Host bus message command RESPONSE */
     33#define ISHTP_HBM_CMD_RES_MSK		0x80
     34
     35/*
     36 * ISHTP Bus Message Command IDs
     37 */
     38#define HOST_START_REQ_CMD		0x01
     39#define HOST_START_RES_CMD		0x81
     40
     41#define HOST_STOP_REQ_CMD		0x02
     42#define HOST_STOP_RES_CMD		0x82
     43
     44#define FW_STOP_REQ_CMD			0x03
     45
     46#define HOST_ENUM_REQ_CMD		0x04
     47#define HOST_ENUM_RES_CMD		0x84
     48
     49#define HOST_CLIENT_PROPERTIES_REQ_CMD	0x05
     50#define HOST_CLIENT_PROPERTIES_RES_CMD	0x85
     51
     52#define CLIENT_CONNECT_REQ_CMD		0x06
     53#define CLIENT_CONNECT_RES_CMD		0x86
     54
     55#define CLIENT_DISCONNECT_REQ_CMD	0x07
     56#define CLIENT_DISCONNECT_RES_CMD	0x87
     57
     58#define ISHTP_FLOW_CONTROL_CMD		0x08
     59
     60#define DMA_BUFFER_ALLOC_NOTIFY		0x11
     61#define DMA_BUFFER_ALLOC_RESPONSE	0x91
     62
     63#define DMA_XFER			0x12
     64#define DMA_XFER_ACK			0x92
     65
     66/*
     67 * ISHTP Stop Reason
     68 * used by hbm_host_stop_request.reason
     69 */
     70#define	DRIVER_STOP_REQUEST		0x00
     71
     72/*
     73 * ISHTP BUS Interface Section
     74 */
     75struct ishtp_msg_hdr {
     76	uint32_t fw_addr:8;
     77	uint32_t host_addr:8;
     78	uint32_t length:9;
     79	uint32_t reserved:6;
     80	uint32_t msg_complete:1;
     81} __packed;
     82
     83struct ishtp_bus_message {
     84	uint8_t hbm_cmd;
     85	uint8_t data[];
     86} __packed;
     87
     88/**
     89 * struct hbm_cl_cmd - client specific host bus command
     90 *	CONNECT, DISCONNECT, and FlOW CONTROL
     91 *
     92 * @hbm_cmd - bus message command header
     93 * @fw_addr - address of the fw client
     94 * @host_addr - address of the client in the driver
     95 * @data
     96 */
     97struct ishtp_hbm_cl_cmd {
     98	uint8_t hbm_cmd;
     99	uint8_t fw_addr;
    100	uint8_t host_addr;
    101	uint8_t data;
    102};
    103
    104struct hbm_version {
    105	uint8_t minor_version;
    106	uint8_t major_version;
    107} __packed;
    108
    109struct hbm_host_version_request {
    110	uint8_t hbm_cmd;
    111	uint8_t reserved;
    112	struct hbm_version host_version;
    113} __packed;
    114
    115struct hbm_host_version_response {
    116	uint8_t hbm_cmd;
    117	uint8_t host_version_supported;
    118	struct hbm_version fw_max_version;
    119} __packed;
    120
    121struct hbm_host_stop_request {
    122	uint8_t hbm_cmd;
    123	uint8_t reason;
    124	uint8_t reserved[2];
    125} __packed;
    126
    127struct hbm_host_stop_response {
    128	uint8_t hbm_cmd;
    129	uint8_t reserved[3];
    130} __packed;
    131
    132struct hbm_host_enum_request {
    133	uint8_t hbm_cmd;
    134	uint8_t reserved[3];
    135} __packed;
    136
    137struct hbm_host_enum_response {
    138	uint8_t hbm_cmd;
    139	uint8_t reserved[3];
    140	uint8_t valid_addresses[32];
    141} __packed;
    142
    143struct ishtp_client_properties {
    144	guid_t protocol_name;
    145	uint8_t protocol_version;
    146	uint8_t max_number_of_connections;
    147	uint8_t fixed_address;
    148	uint8_t single_recv_buf;
    149	uint32_t max_msg_length;
    150	uint8_t dma_hdr_len;
    151#define	ISHTP_CLIENT_DMA_ENABLED	0x80
    152	uint8_t reserved4;
    153	uint8_t reserved5;
    154	uint8_t reserved6;
    155} __packed;
    156
    157struct hbm_props_request {
    158	uint8_t hbm_cmd;
    159	uint8_t address;
    160	uint8_t reserved[2];
    161} __packed;
    162
    163struct hbm_props_response {
    164	uint8_t hbm_cmd;
    165	uint8_t address;
    166	uint8_t status;
    167	uint8_t reserved[1];
    168	struct ishtp_client_properties client_properties;
    169} __packed;
    170
    171/**
    172 * struct hbm_client_connect_request - connect/disconnect request
    173 *
    174 * @hbm_cmd - bus message command header
    175 * @fw_addr - address of the fw client
    176 * @host_addr - address of the client in the driver
    177 * @reserved
    178 */
    179struct hbm_client_connect_request {
    180	uint8_t hbm_cmd;
    181	uint8_t fw_addr;
    182	uint8_t host_addr;
    183	uint8_t reserved;
    184} __packed;
    185
    186/**
    187 * struct hbm_client_connect_response - connect/disconnect response
    188 *
    189 * @hbm_cmd - bus message command header
    190 * @fw_addr - address of the fw client
    191 * @host_addr - address of the client in the driver
    192 * @status - status of the request
    193 */
    194struct hbm_client_connect_response {
    195	uint8_t hbm_cmd;
    196	uint8_t fw_addr;
    197	uint8_t host_addr;
    198	uint8_t status;
    199} __packed;
    200
    201
    202#define ISHTP_FC_MESSAGE_RESERVED_LENGTH		5
    203
    204struct hbm_flow_control {
    205	uint8_t hbm_cmd;
    206	uint8_t fw_addr;
    207	uint8_t host_addr;
    208	uint8_t reserved[ISHTP_FC_MESSAGE_RESERVED_LENGTH];
    209} __packed;
    210
    211struct dma_alloc_notify {
    212	uint8_t hbm;
    213	uint8_t status;
    214	uint8_t reserved[2];
    215	uint32_t buf_size;
    216	uint64_t buf_address;
    217	/* [...] May come more size/address pairs */
    218} __packed;
    219
    220struct dma_xfer_hbm {
    221	uint8_t hbm;
    222	uint8_t fw_client_id;
    223	uint8_t host_client_id;
    224	uint8_t reserved;
    225	uint64_t msg_addr;
    226	uint32_t msg_length;
    227	uint32_t reserved2;
    228} __packed;
    229
    230/* System state */
    231#define ISHTP_SYSTEM_STATE_CLIENT_ADDR		13
    232
    233#define SYSTEM_STATE_SUBSCRIBE			0x1
    234#define SYSTEM_STATE_STATUS			0x2
    235#define SYSTEM_STATE_QUERY_SUBSCRIBERS		0x3
    236#define SYSTEM_STATE_STATE_CHANGE_REQ		0x4
    237/*indicates suspend and resume states*/
    238#define CONNECTED_STANDBY_STATE_BIT		(1<<0)
    239#define SUSPEND_STATE_BIT			(1<<1)
    240
    241struct ish_system_states_header {
    242	uint32_t cmd;
    243	uint32_t cmd_status;	/*responses will have this set*/
    244} __packed;
    245
    246struct ish_system_states_subscribe {
    247	struct ish_system_states_header hdr;
    248	uint32_t states;
    249} __packed;
    250
    251struct ish_system_states_status {
    252	struct ish_system_states_header hdr;
    253	uint32_t supported_states;
    254	uint32_t states_status;
    255} __packed;
    256
    257struct ish_system_states_query_subscribers {
    258	struct ish_system_states_header hdr;
    259} __packed;
    260
    261struct ish_system_states_state_change_req {
    262	struct ish_system_states_header hdr;
    263	uint32_t requested_states;
    264	uint32_t states_status;
    265} __packed;
    266
    267/**
    268 * enum ishtp_hbm_state - host bus message protocol state
    269 *
    270 * @ISHTP_HBM_IDLE : protocol not started
    271 * @ISHTP_HBM_START : start request message was sent
    272 * @ISHTP_HBM_ENUM_CLIENTS : enumeration request was sent
    273 * @ISHTP_HBM_CLIENT_PROPERTIES : acquiring clients properties
    274 */
    275enum ishtp_hbm_state {
    276	ISHTP_HBM_IDLE = 0,
    277	ISHTP_HBM_START,
    278	ISHTP_HBM_STARTED,
    279	ISHTP_HBM_ENUM_CLIENTS,
    280	ISHTP_HBM_CLIENT_PROPERTIES,
    281	ISHTP_HBM_WORKING,
    282	ISHTP_HBM_STOPPED,
    283};
    284
    285static inline void ishtp_hbm_hdr(struct ishtp_msg_hdr *hdr, size_t length)
    286{
    287	hdr->host_addr = 0;
    288	hdr->fw_addr = 0;
    289	hdr->length = length;
    290	hdr->msg_complete = 1;
    291	hdr->reserved = 0;
    292}
    293
    294int ishtp_hbm_start_req(struct ishtp_device *dev);
    295int ishtp_hbm_start_wait(struct ishtp_device *dev);
    296int ishtp_hbm_cl_flow_control_req(struct ishtp_device *dev,
    297				  struct ishtp_cl *cl);
    298int ishtp_hbm_cl_disconnect_req(struct ishtp_device *dev, struct ishtp_cl *cl);
    299int ishtp_hbm_cl_connect_req(struct ishtp_device *dev, struct ishtp_cl *cl);
    300void ishtp_hbm_enum_clients_req(struct ishtp_device *dev);
    301void bh_hbm_work_fn(struct work_struct *work);
    302void recv_hbm(struct ishtp_device *dev, struct ishtp_msg_hdr *ishtp_hdr);
    303void recv_fixed_cl_msg(struct ishtp_device *dev,
    304	struct ishtp_msg_hdr *ishtp_hdr);
    305void ishtp_hbm_dispatch(struct ishtp_device *dev,
    306	struct ishtp_bus_message *hdr);
    307
    308void ishtp_query_subscribers(struct ishtp_device *dev);
    309
    310/* Exported I/F */
    311void ishtp_send_suspend(struct ishtp_device *dev);
    312void ishtp_send_resume(struct ishtp_device *dev);
    313
    314#endif /* _ISHTP_HBM_H_ */