162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2003-2022, Intel Corporation. All rights reserved 462306a36Sopenharmony_ci * Intel Management Engine Interface (Intel MEI) Linux driver 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef _MEI_HW_TYPES_H_ 862306a36Sopenharmony_ci#define _MEI_HW_TYPES_H_ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/mei.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* 1362306a36Sopenharmony_ci * Timeouts in Seconds 1462306a36Sopenharmony_ci */ 1562306a36Sopenharmony_ci#define MEI_HW_READY_TIMEOUT 2 /* Timeout on ready message */ 1662306a36Sopenharmony_ci#define MEI_CONNECT_TIMEOUT 3 /* HPS: at least 2 seconds */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define MEI_CL_CONNECT_TIMEOUT 15 /* HPS: Client Connect Timeout */ 1962306a36Sopenharmony_ci#define MEI_CL_CONNECT_TIMEOUT_SLOW 30 /* HPS: Client Connect Timeout, slow FW */ 2062306a36Sopenharmony_ci#define MEI_CLIENTS_INIT_TIMEOUT 15 /* HPS: Clients Enumeration Timeout */ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define MEI_PGI_TIMEOUT 1 /* PG Isolation time response 1 sec */ 2362306a36Sopenharmony_ci#define MEI_D0I3_TIMEOUT 5 /* D0i3 set/unset max response time */ 2462306a36Sopenharmony_ci#define MEI_HBM_TIMEOUT 1 /* 1 second */ 2562306a36Sopenharmony_ci#define MEI_HBM_TIMEOUT_SLOW 5 /* 5 second, slow FW */ 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define MKHI_RCV_TIMEOUT 500 /* receive timeout in msec */ 2862306a36Sopenharmony_ci#define MKHI_RCV_TIMEOUT_SLOW 10000 /* receive timeout in msec, slow FW */ 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/* 3162306a36Sopenharmony_ci * FW page size for DMA allocations 3262306a36Sopenharmony_ci */ 3362306a36Sopenharmony_ci#define MEI_FW_PAGE_SIZE 4096UL 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* 3662306a36Sopenharmony_ci * MEI Version 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_ci#define HBM_MINOR_VERSION 2 3962306a36Sopenharmony_ci#define HBM_MAJOR_VERSION 2 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* 4262306a36Sopenharmony_ci * MEI version with PGI support 4362306a36Sopenharmony_ci */ 4462306a36Sopenharmony_ci#define HBM_MINOR_VERSION_PGI 1 4562306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_PGI 1 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/* 4862306a36Sopenharmony_ci * MEI version with Dynamic clients support 4962306a36Sopenharmony_ci */ 5062306a36Sopenharmony_ci#define HBM_MINOR_VERSION_DC 0 5162306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_DC 2 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/* 5462306a36Sopenharmony_ci * MEI version with immediate reply to enum request support 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ci#define HBM_MINOR_VERSION_IE 0 5762306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_IE 2 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* 6062306a36Sopenharmony_ci * MEI version with disconnect on connection timeout support 6162306a36Sopenharmony_ci */ 6262306a36Sopenharmony_ci#define HBM_MINOR_VERSION_DOT 0 6362306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_DOT 2 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/* 6662306a36Sopenharmony_ci * MEI version with notification support 6762306a36Sopenharmony_ci */ 6862306a36Sopenharmony_ci#define HBM_MINOR_VERSION_EV 0 6962306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_EV 2 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* 7262306a36Sopenharmony_ci * MEI version with fixed address client support 7362306a36Sopenharmony_ci */ 7462306a36Sopenharmony_ci#define HBM_MINOR_VERSION_FA 0 7562306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_FA 2 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* 7862306a36Sopenharmony_ci * MEI version with OS ver message support 7962306a36Sopenharmony_ci */ 8062306a36Sopenharmony_ci#define HBM_MINOR_VERSION_OS 0 8162306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_OS 2 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* 8462306a36Sopenharmony_ci * MEI version with dma ring support 8562306a36Sopenharmony_ci */ 8662306a36Sopenharmony_ci#define HBM_MINOR_VERSION_DR 1 8762306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_DR 2 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/* 9062306a36Sopenharmony_ci * MEI version with vm tag support 9162306a36Sopenharmony_ci */ 9262306a36Sopenharmony_ci#define HBM_MINOR_VERSION_VT 2 9362306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_VT 2 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci/* 9662306a36Sopenharmony_ci * MEI version with GSC support 9762306a36Sopenharmony_ci */ 9862306a36Sopenharmony_ci#define HBM_MINOR_VERSION_GSC 2 9962306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_GSC 2 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci/* 10262306a36Sopenharmony_ci * MEI version with capabilities message support 10362306a36Sopenharmony_ci */ 10462306a36Sopenharmony_ci#define HBM_MINOR_VERSION_CAP 2 10562306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_CAP 2 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/* 10862306a36Sopenharmony_ci * MEI version with client DMA support 10962306a36Sopenharmony_ci */ 11062306a36Sopenharmony_ci#define HBM_MINOR_VERSION_CD 2 11162306a36Sopenharmony_ci#define HBM_MAJOR_VERSION_CD 2 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* Host bus message command opcode */ 11462306a36Sopenharmony_ci#define MEI_HBM_CMD_OP_MSK 0x7f 11562306a36Sopenharmony_ci/* Host bus message command RESPONSE */ 11662306a36Sopenharmony_ci#define MEI_HBM_CMD_RES_MSK 0x80 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci/* 11962306a36Sopenharmony_ci * MEI Bus Message Command IDs 12062306a36Sopenharmony_ci */ 12162306a36Sopenharmony_ci#define HOST_START_REQ_CMD 0x01 12262306a36Sopenharmony_ci#define HOST_START_RES_CMD 0x81 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#define HOST_STOP_REQ_CMD 0x02 12562306a36Sopenharmony_ci#define HOST_STOP_RES_CMD 0x82 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci#define ME_STOP_REQ_CMD 0x03 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci#define HOST_ENUM_REQ_CMD 0x04 13062306a36Sopenharmony_ci#define HOST_ENUM_RES_CMD 0x84 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci#define HOST_CLIENT_PROPERTIES_REQ_CMD 0x05 13362306a36Sopenharmony_ci#define HOST_CLIENT_PROPERTIES_RES_CMD 0x85 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci#define CLIENT_CONNECT_REQ_CMD 0x06 13662306a36Sopenharmony_ci#define CLIENT_CONNECT_RES_CMD 0x86 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci#define CLIENT_DISCONNECT_REQ_CMD 0x07 13962306a36Sopenharmony_ci#define CLIENT_DISCONNECT_RES_CMD 0x87 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#define MEI_FLOW_CONTROL_CMD 0x08 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci#define MEI_PG_ISOLATION_ENTRY_REQ_CMD 0x0a 14462306a36Sopenharmony_ci#define MEI_PG_ISOLATION_ENTRY_RES_CMD 0x8a 14562306a36Sopenharmony_ci#define MEI_PG_ISOLATION_EXIT_REQ_CMD 0x0b 14662306a36Sopenharmony_ci#define MEI_PG_ISOLATION_EXIT_RES_CMD 0x8b 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci#define MEI_HBM_ADD_CLIENT_REQ_CMD 0x0f 14962306a36Sopenharmony_ci#define MEI_HBM_ADD_CLIENT_RES_CMD 0x8f 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci#define MEI_HBM_NOTIFY_REQ_CMD 0x10 15262306a36Sopenharmony_ci#define MEI_HBM_NOTIFY_RES_CMD 0x90 15362306a36Sopenharmony_ci#define MEI_HBM_NOTIFICATION_CMD 0x11 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci#define MEI_HBM_DMA_SETUP_REQ_CMD 0x12 15662306a36Sopenharmony_ci#define MEI_HBM_DMA_SETUP_RES_CMD 0x92 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci#define MEI_HBM_CAPABILITIES_REQ_CMD 0x13 15962306a36Sopenharmony_ci#define MEI_HBM_CAPABILITIES_RES_CMD 0x93 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci#define MEI_HBM_CLIENT_DMA_MAP_REQ_CMD 0x14 16262306a36Sopenharmony_ci#define MEI_HBM_CLIENT_DMA_MAP_RES_CMD 0x94 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci#define MEI_HBM_CLIENT_DMA_UNMAP_REQ_CMD 0x15 16562306a36Sopenharmony_ci#define MEI_HBM_CLIENT_DMA_UNMAP_RES_CMD 0x95 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci/* 16862306a36Sopenharmony_ci * MEI Stop Reason 16962306a36Sopenharmony_ci * used by hbm_host_stop_request.reason 17062306a36Sopenharmony_ci */ 17162306a36Sopenharmony_cienum mei_stop_reason_types { 17262306a36Sopenharmony_ci DRIVER_STOP_REQUEST = 0x00, 17362306a36Sopenharmony_ci DEVICE_D1_ENTRY = 0x01, 17462306a36Sopenharmony_ci DEVICE_D2_ENTRY = 0x02, 17562306a36Sopenharmony_ci DEVICE_D3_ENTRY = 0x03, 17662306a36Sopenharmony_ci SYSTEM_S1_ENTRY = 0x04, 17762306a36Sopenharmony_ci SYSTEM_S2_ENTRY = 0x05, 17862306a36Sopenharmony_ci SYSTEM_S3_ENTRY = 0x06, 17962306a36Sopenharmony_ci SYSTEM_S4_ENTRY = 0x07, 18062306a36Sopenharmony_ci SYSTEM_S5_ENTRY = 0x08 18162306a36Sopenharmony_ci}; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci/** 18562306a36Sopenharmony_ci * enum mei_hbm_status - mei host bus messages return values 18662306a36Sopenharmony_ci * 18762306a36Sopenharmony_ci * @MEI_HBMS_SUCCESS : status success 18862306a36Sopenharmony_ci * @MEI_HBMS_CLIENT_NOT_FOUND : client not found 18962306a36Sopenharmony_ci * @MEI_HBMS_ALREADY_EXISTS : connection already established 19062306a36Sopenharmony_ci * @MEI_HBMS_REJECTED : connection is rejected 19162306a36Sopenharmony_ci * @MEI_HBMS_INVALID_PARAMETER : invalid parameter 19262306a36Sopenharmony_ci * @MEI_HBMS_NOT_ALLOWED : operation not allowed 19362306a36Sopenharmony_ci * @MEI_HBMS_ALREADY_STARTED : system is already started 19462306a36Sopenharmony_ci * @MEI_HBMS_NOT_STARTED : system not started 19562306a36Sopenharmony_ci * 19662306a36Sopenharmony_ci * @MEI_HBMS_MAX : sentinel 19762306a36Sopenharmony_ci */ 19862306a36Sopenharmony_cienum mei_hbm_status { 19962306a36Sopenharmony_ci MEI_HBMS_SUCCESS = 0, 20062306a36Sopenharmony_ci MEI_HBMS_CLIENT_NOT_FOUND = 1, 20162306a36Sopenharmony_ci MEI_HBMS_ALREADY_EXISTS = 2, 20262306a36Sopenharmony_ci MEI_HBMS_REJECTED = 3, 20362306a36Sopenharmony_ci MEI_HBMS_INVALID_PARAMETER = 4, 20462306a36Sopenharmony_ci MEI_HBMS_NOT_ALLOWED = 5, 20562306a36Sopenharmony_ci MEI_HBMS_ALREADY_STARTED = 6, 20662306a36Sopenharmony_ci MEI_HBMS_NOT_STARTED = 7, 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci MEI_HBMS_MAX 20962306a36Sopenharmony_ci}; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci/* 21362306a36Sopenharmony_ci * Client Connect Status 21462306a36Sopenharmony_ci * used by hbm_client_connect_response.status 21562306a36Sopenharmony_ci */ 21662306a36Sopenharmony_cienum mei_cl_connect_status { 21762306a36Sopenharmony_ci MEI_CL_CONN_SUCCESS = MEI_HBMS_SUCCESS, 21862306a36Sopenharmony_ci MEI_CL_CONN_NOT_FOUND = MEI_HBMS_CLIENT_NOT_FOUND, 21962306a36Sopenharmony_ci MEI_CL_CONN_ALREADY_STARTED = MEI_HBMS_ALREADY_EXISTS, 22062306a36Sopenharmony_ci MEI_CL_CONN_OUT_OF_RESOURCES = MEI_HBMS_REJECTED, 22162306a36Sopenharmony_ci MEI_CL_CONN_MESSAGE_SMALL = MEI_HBMS_INVALID_PARAMETER, 22262306a36Sopenharmony_ci MEI_CL_CONN_NOT_ALLOWED = MEI_HBMS_NOT_ALLOWED, 22362306a36Sopenharmony_ci}; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci/* 22662306a36Sopenharmony_ci * Client Disconnect Status 22762306a36Sopenharmony_ci */ 22862306a36Sopenharmony_cienum mei_cl_disconnect_status { 22962306a36Sopenharmony_ci MEI_CL_DISCONN_SUCCESS = MEI_HBMS_SUCCESS 23062306a36Sopenharmony_ci}; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci/** 23362306a36Sopenharmony_ci * enum mei_ext_hdr_type - extended header type used in 23462306a36Sopenharmony_ci * extended header TLV 23562306a36Sopenharmony_ci * 23662306a36Sopenharmony_ci * @MEI_EXT_HDR_NONE: sentinel 23762306a36Sopenharmony_ci * @MEI_EXT_HDR_VTAG: vtag header 23862306a36Sopenharmony_ci * @MEI_EXT_HDR_GSC: gsc header 23962306a36Sopenharmony_ci */ 24062306a36Sopenharmony_cienum mei_ext_hdr_type { 24162306a36Sopenharmony_ci MEI_EXT_HDR_NONE = 0, 24262306a36Sopenharmony_ci MEI_EXT_HDR_VTAG = 1, 24362306a36Sopenharmony_ci MEI_EXT_HDR_GSC = 2, 24462306a36Sopenharmony_ci}; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci/** 24762306a36Sopenharmony_ci * struct mei_ext_hdr - extend header descriptor (TLV) 24862306a36Sopenharmony_ci * @type: enum mei_ext_hdr_type 24962306a36Sopenharmony_ci * @length: length excluding descriptor 25062306a36Sopenharmony_ci * @data: the extended header payload 25162306a36Sopenharmony_ci */ 25262306a36Sopenharmony_cistruct mei_ext_hdr { 25362306a36Sopenharmony_ci u8 type; 25462306a36Sopenharmony_ci u8 length; 25562306a36Sopenharmony_ci u8 data[]; 25662306a36Sopenharmony_ci} __packed; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci/** 25962306a36Sopenharmony_ci * struct mei_ext_meta_hdr - extend header meta data 26062306a36Sopenharmony_ci * @count: number of headers 26162306a36Sopenharmony_ci * @size: total size of the extended header list excluding meta header 26262306a36Sopenharmony_ci * @reserved: reserved 26362306a36Sopenharmony_ci * @hdrs: extended headers TLV list 26462306a36Sopenharmony_ci */ 26562306a36Sopenharmony_cistruct mei_ext_meta_hdr { 26662306a36Sopenharmony_ci u8 count; 26762306a36Sopenharmony_ci u8 size; 26862306a36Sopenharmony_ci u8 reserved[2]; 26962306a36Sopenharmony_ci u8 hdrs[]; 27062306a36Sopenharmony_ci} __packed; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci/** 27362306a36Sopenharmony_ci * struct mei_ext_hdr_vtag - extend header for vtag 27462306a36Sopenharmony_ci * 27562306a36Sopenharmony_ci * @hdr: standard extend header 27662306a36Sopenharmony_ci * @vtag: virtual tag 27762306a36Sopenharmony_ci * @reserved: reserved 27862306a36Sopenharmony_ci */ 27962306a36Sopenharmony_cistruct mei_ext_hdr_vtag { 28062306a36Sopenharmony_ci struct mei_ext_hdr hdr; 28162306a36Sopenharmony_ci u8 vtag; 28262306a36Sopenharmony_ci u8 reserved; 28362306a36Sopenharmony_ci} __packed; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci/* 28662306a36Sopenharmony_ci * Extended header iterator functions 28762306a36Sopenharmony_ci */ 28862306a36Sopenharmony_ci/** 28962306a36Sopenharmony_ci * mei_ext_begin - extended header iterator begin 29062306a36Sopenharmony_ci * 29162306a36Sopenharmony_ci * @meta: meta header of the extended header list 29262306a36Sopenharmony_ci * 29362306a36Sopenharmony_ci * Return: The first extended header 29462306a36Sopenharmony_ci */ 29562306a36Sopenharmony_cistatic inline struct mei_ext_hdr *mei_ext_begin(struct mei_ext_meta_hdr *meta) 29662306a36Sopenharmony_ci{ 29762306a36Sopenharmony_ci return (struct mei_ext_hdr *)meta->hdrs; 29862306a36Sopenharmony_ci} 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci/** 30162306a36Sopenharmony_ci * mei_ext_last - check if the ext is the last one in the TLV list 30262306a36Sopenharmony_ci * 30362306a36Sopenharmony_ci * @meta: meta header of the extended header list 30462306a36Sopenharmony_ci * @ext: a meta header on the list 30562306a36Sopenharmony_ci * 30662306a36Sopenharmony_ci * Return: true if ext is the last header on the list 30762306a36Sopenharmony_ci */ 30862306a36Sopenharmony_cistatic inline bool mei_ext_last(struct mei_ext_meta_hdr *meta, 30962306a36Sopenharmony_ci struct mei_ext_hdr *ext) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci return (u8 *)ext >= (u8 *)meta + sizeof(*meta) + (meta->size * 4); 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistruct mei_gsc_sgl { 31562306a36Sopenharmony_ci u32 low; 31662306a36Sopenharmony_ci u32 high; 31762306a36Sopenharmony_ci u32 length; 31862306a36Sopenharmony_ci} __packed; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci#define GSC_HECI_MSG_KERNEL 0 32162306a36Sopenharmony_ci#define GSC_HECI_MSG_USER 1 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci#define GSC_ADDRESS_TYPE_GTT 0 32462306a36Sopenharmony_ci#define GSC_ADDRESS_TYPE_PPGTT 1 32562306a36Sopenharmony_ci#define GSC_ADDRESS_TYPE_PHYSICAL_CONTINUOUS 2 /* max of 64K */ 32662306a36Sopenharmony_ci#define GSC_ADDRESS_TYPE_PHYSICAL_SGL 3 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci/** 32962306a36Sopenharmony_ci * struct mei_ext_hdr_gsc_h2f - extended header: gsc host to firmware interface 33062306a36Sopenharmony_ci * 33162306a36Sopenharmony_ci * @hdr: extended header 33262306a36Sopenharmony_ci * @client_id: GSC_HECI_MSG_KERNEL or GSC_HECI_MSG_USER 33362306a36Sopenharmony_ci * @addr_type: GSC_ADDRESS_TYPE_{GTT, PPGTT, PHYSICAL_CONTINUOUS, PHYSICAL_SGL} 33462306a36Sopenharmony_ci * @fence_id: synchronization marker 33562306a36Sopenharmony_ci * @input_address_count: number of input sgl buffers 33662306a36Sopenharmony_ci * @output_address_count: number of output sgl buffers 33762306a36Sopenharmony_ci * @reserved: reserved 33862306a36Sopenharmony_ci * @sgl: sg list 33962306a36Sopenharmony_ci */ 34062306a36Sopenharmony_cistruct mei_ext_hdr_gsc_h2f { 34162306a36Sopenharmony_ci struct mei_ext_hdr hdr; 34262306a36Sopenharmony_ci u8 client_id; 34362306a36Sopenharmony_ci u8 addr_type; 34462306a36Sopenharmony_ci u32 fence_id; 34562306a36Sopenharmony_ci u8 input_address_count; 34662306a36Sopenharmony_ci u8 output_address_count; 34762306a36Sopenharmony_ci u8 reserved[2]; 34862306a36Sopenharmony_ci struct mei_gsc_sgl sgl[]; 34962306a36Sopenharmony_ci} __packed; 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci/** 35262306a36Sopenharmony_ci * struct mei_ext_hdr_gsc_f2h - gsc firmware to host interface 35362306a36Sopenharmony_ci * 35462306a36Sopenharmony_ci * @hdr: extended header 35562306a36Sopenharmony_ci * @client_id: GSC_HECI_MSG_KERNEL or GSC_HECI_MSG_USER 35662306a36Sopenharmony_ci * @reserved: reserved 35762306a36Sopenharmony_ci * @fence_id: synchronization marker 35862306a36Sopenharmony_ci * @written: number of bytes written to firmware 35962306a36Sopenharmony_ci */ 36062306a36Sopenharmony_cistruct mei_ext_hdr_gsc_f2h { 36162306a36Sopenharmony_ci struct mei_ext_hdr hdr; 36262306a36Sopenharmony_ci u8 client_id; 36362306a36Sopenharmony_ci u8 reserved; 36462306a36Sopenharmony_ci u32 fence_id; 36562306a36Sopenharmony_ci u32 written; 36662306a36Sopenharmony_ci} __packed; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci/** 36962306a36Sopenharmony_ci * mei_ext_next - following extended header on the TLV list 37062306a36Sopenharmony_ci * 37162306a36Sopenharmony_ci * @ext: current extend header 37262306a36Sopenharmony_ci * 37362306a36Sopenharmony_ci * Context: The function does not check for the overflows, 37462306a36Sopenharmony_ci * one should call mei_ext_last before. 37562306a36Sopenharmony_ci * 37662306a36Sopenharmony_ci * Return: The following extend header after @ext 37762306a36Sopenharmony_ci */ 37862306a36Sopenharmony_cistatic inline struct mei_ext_hdr *mei_ext_next(struct mei_ext_hdr *ext) 37962306a36Sopenharmony_ci{ 38062306a36Sopenharmony_ci return (struct mei_ext_hdr *)((u8 *)ext + (ext->length * 4)); 38162306a36Sopenharmony_ci} 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci/** 38462306a36Sopenharmony_ci * mei_ext_hdr_len - get ext header length in bytes 38562306a36Sopenharmony_ci * 38662306a36Sopenharmony_ci * @ext: extend header 38762306a36Sopenharmony_ci * 38862306a36Sopenharmony_ci * Return: extend header length in bytes 38962306a36Sopenharmony_ci */ 39062306a36Sopenharmony_cistatic inline u32 mei_ext_hdr_len(const struct mei_ext_hdr *ext) 39162306a36Sopenharmony_ci{ 39262306a36Sopenharmony_ci if (!ext) 39362306a36Sopenharmony_ci return 0; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci return ext->length * sizeof(u32); 39662306a36Sopenharmony_ci} 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci/** 39962306a36Sopenharmony_ci * struct mei_msg_hdr - MEI BUS Interface Section 40062306a36Sopenharmony_ci * 40162306a36Sopenharmony_ci * @me_addr: device address 40262306a36Sopenharmony_ci * @host_addr: host address 40362306a36Sopenharmony_ci * @length: message length 40462306a36Sopenharmony_ci * @reserved: reserved 40562306a36Sopenharmony_ci * @extended: message has extended header 40662306a36Sopenharmony_ci * @dma_ring: message is on dma ring 40762306a36Sopenharmony_ci * @internal: message is internal 40862306a36Sopenharmony_ci * @msg_complete: last packet of the message 40962306a36Sopenharmony_ci * @extension: extension of the header 41062306a36Sopenharmony_ci */ 41162306a36Sopenharmony_cistruct mei_msg_hdr { 41262306a36Sopenharmony_ci u32 me_addr:8; 41362306a36Sopenharmony_ci u32 host_addr:8; 41462306a36Sopenharmony_ci u32 length:9; 41562306a36Sopenharmony_ci u32 reserved:3; 41662306a36Sopenharmony_ci u32 extended:1; 41762306a36Sopenharmony_ci u32 dma_ring:1; 41862306a36Sopenharmony_ci u32 internal:1; 41962306a36Sopenharmony_ci u32 msg_complete:1; 42062306a36Sopenharmony_ci u32 extension[]; 42162306a36Sopenharmony_ci} __packed; 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci/* The length is up to 9 bits */ 42462306a36Sopenharmony_ci#define MEI_MSG_MAX_LEN_MASK GENMASK(9, 0) 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_cistruct mei_bus_message { 42762306a36Sopenharmony_ci u8 hbm_cmd; 42862306a36Sopenharmony_ci u8 data[]; 42962306a36Sopenharmony_ci} __packed; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci/** 43262306a36Sopenharmony_ci * struct hbm_cl_cmd - client specific host bus command 43362306a36Sopenharmony_ci * CONNECT, DISCONNECT, and FlOW CONTROL 43462306a36Sopenharmony_ci * 43562306a36Sopenharmony_ci * @hbm_cmd: bus message command header 43662306a36Sopenharmony_ci * @me_addr: address of the client in ME 43762306a36Sopenharmony_ci * @host_addr: address of the client in the driver 43862306a36Sopenharmony_ci * @data: generic data 43962306a36Sopenharmony_ci */ 44062306a36Sopenharmony_cistruct mei_hbm_cl_cmd { 44162306a36Sopenharmony_ci u8 hbm_cmd; 44262306a36Sopenharmony_ci u8 me_addr; 44362306a36Sopenharmony_ci u8 host_addr; 44462306a36Sopenharmony_ci u8 data; 44562306a36Sopenharmony_ci}; 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_cistruct hbm_version { 44862306a36Sopenharmony_ci u8 minor_version; 44962306a36Sopenharmony_ci u8 major_version; 45062306a36Sopenharmony_ci} __packed; 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_cistruct hbm_host_version_request { 45362306a36Sopenharmony_ci u8 hbm_cmd; 45462306a36Sopenharmony_ci u8 reserved; 45562306a36Sopenharmony_ci struct hbm_version host_version; 45662306a36Sopenharmony_ci} __packed; 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_cistruct hbm_host_version_response { 45962306a36Sopenharmony_ci u8 hbm_cmd; 46062306a36Sopenharmony_ci u8 host_version_supported; 46162306a36Sopenharmony_ci struct hbm_version me_max_version; 46262306a36Sopenharmony_ci} __packed; 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_cistruct hbm_host_stop_request { 46562306a36Sopenharmony_ci u8 hbm_cmd; 46662306a36Sopenharmony_ci u8 reason; 46762306a36Sopenharmony_ci u8 reserved[2]; 46862306a36Sopenharmony_ci} __packed; 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_cistruct hbm_host_stop_response { 47162306a36Sopenharmony_ci u8 hbm_cmd; 47262306a36Sopenharmony_ci u8 reserved[3]; 47362306a36Sopenharmony_ci} __packed; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_cistruct hbm_me_stop_request { 47662306a36Sopenharmony_ci u8 hbm_cmd; 47762306a36Sopenharmony_ci u8 reason; 47862306a36Sopenharmony_ci u8 reserved[2]; 47962306a36Sopenharmony_ci} __packed; 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci/** 48262306a36Sopenharmony_ci * enum hbm_host_enum_flags - enumeration request flags (HBM version >= 2.0) 48362306a36Sopenharmony_ci * 48462306a36Sopenharmony_ci * @MEI_HBM_ENUM_F_ALLOW_ADD: allow dynamic clients add 48562306a36Sopenharmony_ci * @MEI_HBM_ENUM_F_IMMEDIATE_ENUM: allow FW to send answer immediately 48662306a36Sopenharmony_ci */ 48762306a36Sopenharmony_cienum hbm_host_enum_flags { 48862306a36Sopenharmony_ci MEI_HBM_ENUM_F_ALLOW_ADD = BIT(0), 48962306a36Sopenharmony_ci MEI_HBM_ENUM_F_IMMEDIATE_ENUM = BIT(1), 49062306a36Sopenharmony_ci}; 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci/** 49362306a36Sopenharmony_ci * struct hbm_host_enum_request - enumeration request from host to fw 49462306a36Sopenharmony_ci * 49562306a36Sopenharmony_ci * @hbm_cmd : bus message command header 49662306a36Sopenharmony_ci * @flags : request flags 49762306a36Sopenharmony_ci * @reserved: reserved 49862306a36Sopenharmony_ci */ 49962306a36Sopenharmony_cistruct hbm_host_enum_request { 50062306a36Sopenharmony_ci u8 hbm_cmd; 50162306a36Sopenharmony_ci u8 flags; 50262306a36Sopenharmony_ci u8 reserved[2]; 50362306a36Sopenharmony_ci} __packed; 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_cistruct hbm_host_enum_response { 50662306a36Sopenharmony_ci u8 hbm_cmd; 50762306a36Sopenharmony_ci u8 reserved[3]; 50862306a36Sopenharmony_ci u8 valid_addresses[32]; 50962306a36Sopenharmony_ci} __packed; 51062306a36Sopenharmony_ci 51162306a36Sopenharmony_ci/** 51262306a36Sopenharmony_ci * struct mei_client_properties - mei client properties 51362306a36Sopenharmony_ci * 51462306a36Sopenharmony_ci * @protocol_name: guid of the client 51562306a36Sopenharmony_ci * @protocol_version: client protocol version 51662306a36Sopenharmony_ci * @max_number_of_connections: number of possible connections. 51762306a36Sopenharmony_ci * @fixed_address: fixed me address (0 if the client is dynamic) 51862306a36Sopenharmony_ci * @single_recv_buf: 1 if all connections share a single receive buffer. 51962306a36Sopenharmony_ci * @vt_supported: the client support vtag 52062306a36Sopenharmony_ci * @reserved: reserved 52162306a36Sopenharmony_ci * @max_msg_length: MTU of the client 52262306a36Sopenharmony_ci */ 52362306a36Sopenharmony_cistruct mei_client_properties { 52462306a36Sopenharmony_ci uuid_le protocol_name; 52562306a36Sopenharmony_ci u8 protocol_version; 52662306a36Sopenharmony_ci u8 max_number_of_connections; 52762306a36Sopenharmony_ci u8 fixed_address; 52862306a36Sopenharmony_ci u8 single_recv_buf:1; 52962306a36Sopenharmony_ci u8 vt_supported:1; 53062306a36Sopenharmony_ci u8 reserved:6; 53162306a36Sopenharmony_ci u32 max_msg_length; 53262306a36Sopenharmony_ci} __packed; 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_cistruct hbm_props_request { 53562306a36Sopenharmony_ci u8 hbm_cmd; 53662306a36Sopenharmony_ci u8 me_addr; 53762306a36Sopenharmony_ci u8 reserved[2]; 53862306a36Sopenharmony_ci} __packed; 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_cistruct hbm_props_response { 54162306a36Sopenharmony_ci u8 hbm_cmd; 54262306a36Sopenharmony_ci u8 me_addr; 54362306a36Sopenharmony_ci u8 status; 54462306a36Sopenharmony_ci u8 reserved; 54562306a36Sopenharmony_ci struct mei_client_properties client_properties; 54662306a36Sopenharmony_ci} __packed; 54762306a36Sopenharmony_ci 54862306a36Sopenharmony_ci/** 54962306a36Sopenharmony_ci * struct hbm_add_client_request - request to add a client 55062306a36Sopenharmony_ci * might be sent by fw after enumeration has already completed 55162306a36Sopenharmony_ci * 55262306a36Sopenharmony_ci * @hbm_cmd: bus message command header 55362306a36Sopenharmony_ci * @me_addr: address of the client in ME 55462306a36Sopenharmony_ci * @reserved: reserved 55562306a36Sopenharmony_ci * @client_properties: client properties 55662306a36Sopenharmony_ci */ 55762306a36Sopenharmony_cistruct hbm_add_client_request { 55862306a36Sopenharmony_ci u8 hbm_cmd; 55962306a36Sopenharmony_ci u8 me_addr; 56062306a36Sopenharmony_ci u8 reserved[2]; 56162306a36Sopenharmony_ci struct mei_client_properties client_properties; 56262306a36Sopenharmony_ci} __packed; 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci/** 56562306a36Sopenharmony_ci * struct hbm_add_client_response - response to add a client 56662306a36Sopenharmony_ci * sent by the host to report client addition status to fw 56762306a36Sopenharmony_ci * 56862306a36Sopenharmony_ci * @hbm_cmd: bus message command header 56962306a36Sopenharmony_ci * @me_addr: address of the client in ME 57062306a36Sopenharmony_ci * @status: if HBMS_SUCCESS then the client can now accept connections. 57162306a36Sopenharmony_ci * @reserved: reserved 57262306a36Sopenharmony_ci */ 57362306a36Sopenharmony_cistruct hbm_add_client_response { 57462306a36Sopenharmony_ci u8 hbm_cmd; 57562306a36Sopenharmony_ci u8 me_addr; 57662306a36Sopenharmony_ci u8 status; 57762306a36Sopenharmony_ci u8 reserved; 57862306a36Sopenharmony_ci} __packed; 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_ci/** 58162306a36Sopenharmony_ci * struct hbm_power_gate - power gate request/response 58262306a36Sopenharmony_ci * 58362306a36Sopenharmony_ci * @hbm_cmd: bus message command header 58462306a36Sopenharmony_ci * @reserved: reserved 58562306a36Sopenharmony_ci */ 58662306a36Sopenharmony_cistruct hbm_power_gate { 58762306a36Sopenharmony_ci u8 hbm_cmd; 58862306a36Sopenharmony_ci u8 reserved[3]; 58962306a36Sopenharmony_ci} __packed; 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci/** 59262306a36Sopenharmony_ci * struct hbm_client_connect_request - connect/disconnect request 59362306a36Sopenharmony_ci * 59462306a36Sopenharmony_ci * @hbm_cmd: bus message command header 59562306a36Sopenharmony_ci * @me_addr: address of the client in ME 59662306a36Sopenharmony_ci * @host_addr: address of the client in the driver 59762306a36Sopenharmony_ci * @reserved: reserved 59862306a36Sopenharmony_ci */ 59962306a36Sopenharmony_cistruct hbm_client_connect_request { 60062306a36Sopenharmony_ci u8 hbm_cmd; 60162306a36Sopenharmony_ci u8 me_addr; 60262306a36Sopenharmony_ci u8 host_addr; 60362306a36Sopenharmony_ci u8 reserved; 60462306a36Sopenharmony_ci} __packed; 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci/** 60762306a36Sopenharmony_ci * struct hbm_client_connect_response - connect/disconnect response 60862306a36Sopenharmony_ci * 60962306a36Sopenharmony_ci * @hbm_cmd: bus message command header 61062306a36Sopenharmony_ci * @me_addr: address of the client in ME 61162306a36Sopenharmony_ci * @host_addr: address of the client in the driver 61262306a36Sopenharmony_ci * @status: status of the request 61362306a36Sopenharmony_ci */ 61462306a36Sopenharmony_cistruct hbm_client_connect_response { 61562306a36Sopenharmony_ci u8 hbm_cmd; 61662306a36Sopenharmony_ci u8 me_addr; 61762306a36Sopenharmony_ci u8 host_addr; 61862306a36Sopenharmony_ci u8 status; 61962306a36Sopenharmony_ci} __packed; 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_ci#define MEI_FC_MESSAGE_RESERVED_LENGTH 5 62362306a36Sopenharmony_ci 62462306a36Sopenharmony_cistruct hbm_flow_control { 62562306a36Sopenharmony_ci u8 hbm_cmd; 62662306a36Sopenharmony_ci u8 me_addr; 62762306a36Sopenharmony_ci u8 host_addr; 62862306a36Sopenharmony_ci u8 reserved[MEI_FC_MESSAGE_RESERVED_LENGTH]; 62962306a36Sopenharmony_ci} __packed; 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci#define MEI_HBM_NOTIFICATION_START 1 63262306a36Sopenharmony_ci#define MEI_HBM_NOTIFICATION_STOP 0 63362306a36Sopenharmony_ci/** 63462306a36Sopenharmony_ci * struct hbm_notification_request - start/stop notification request 63562306a36Sopenharmony_ci * 63662306a36Sopenharmony_ci * @hbm_cmd: bus message command header 63762306a36Sopenharmony_ci * @me_addr: address of the client in ME 63862306a36Sopenharmony_ci * @host_addr: address of the client in the driver 63962306a36Sopenharmony_ci * @start: start = 1 or stop = 0 asynchronous notifications 64062306a36Sopenharmony_ci */ 64162306a36Sopenharmony_cistruct hbm_notification_request { 64262306a36Sopenharmony_ci u8 hbm_cmd; 64362306a36Sopenharmony_ci u8 me_addr; 64462306a36Sopenharmony_ci u8 host_addr; 64562306a36Sopenharmony_ci u8 start; 64662306a36Sopenharmony_ci} __packed; 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_ci/** 64962306a36Sopenharmony_ci * struct hbm_notification_response - start/stop notification response 65062306a36Sopenharmony_ci * 65162306a36Sopenharmony_ci * @hbm_cmd: bus message command header 65262306a36Sopenharmony_ci * @me_addr: address of the client in ME 65362306a36Sopenharmony_ci * @host_addr: - address of the client in the driver 65462306a36Sopenharmony_ci * @status: (mei_hbm_status) response status for the request 65562306a36Sopenharmony_ci * - MEI_HBMS_SUCCESS: successful stop/start 65662306a36Sopenharmony_ci * - MEI_HBMS_CLIENT_NOT_FOUND: if the connection could not be found. 65762306a36Sopenharmony_ci * - MEI_HBMS_ALREADY_STARTED: for start requests for a previously 65862306a36Sopenharmony_ci * started notification. 65962306a36Sopenharmony_ci * - MEI_HBMS_NOT_STARTED: for stop request for a connected client for whom 66062306a36Sopenharmony_ci * asynchronous notifications are currently disabled. 66162306a36Sopenharmony_ci * 66262306a36Sopenharmony_ci * @start: start = 1 or stop = 0 asynchronous notifications 66362306a36Sopenharmony_ci * @reserved: reserved 66462306a36Sopenharmony_ci */ 66562306a36Sopenharmony_cistruct hbm_notification_response { 66662306a36Sopenharmony_ci u8 hbm_cmd; 66762306a36Sopenharmony_ci u8 me_addr; 66862306a36Sopenharmony_ci u8 host_addr; 66962306a36Sopenharmony_ci u8 status; 67062306a36Sopenharmony_ci u8 start; 67162306a36Sopenharmony_ci u8 reserved[3]; 67262306a36Sopenharmony_ci} __packed; 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci/** 67562306a36Sopenharmony_ci * struct hbm_notification - notification event 67662306a36Sopenharmony_ci * 67762306a36Sopenharmony_ci * @hbm_cmd: bus message command header 67862306a36Sopenharmony_ci * @me_addr: address of the client in ME 67962306a36Sopenharmony_ci * @host_addr: address of the client in the driver 68062306a36Sopenharmony_ci * @reserved: reserved for alignment 68162306a36Sopenharmony_ci */ 68262306a36Sopenharmony_cistruct hbm_notification { 68362306a36Sopenharmony_ci u8 hbm_cmd; 68462306a36Sopenharmony_ci u8 me_addr; 68562306a36Sopenharmony_ci u8 host_addr; 68662306a36Sopenharmony_ci u8 reserved; 68762306a36Sopenharmony_ci} __packed; 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_ci/** 69062306a36Sopenharmony_ci * struct hbm_dma_mem_dscr - dma ring 69162306a36Sopenharmony_ci * 69262306a36Sopenharmony_ci * @addr_hi: the high 32bits of 64 bit address 69362306a36Sopenharmony_ci * @addr_lo: the low 32bits of 64 bit address 69462306a36Sopenharmony_ci * @size : size in bytes (must be power of 2) 69562306a36Sopenharmony_ci */ 69662306a36Sopenharmony_cistruct hbm_dma_mem_dscr { 69762306a36Sopenharmony_ci u32 addr_hi; 69862306a36Sopenharmony_ci u32 addr_lo; 69962306a36Sopenharmony_ci u32 size; 70062306a36Sopenharmony_ci} __packed; 70162306a36Sopenharmony_ci 70262306a36Sopenharmony_cienum { 70362306a36Sopenharmony_ci DMA_DSCR_HOST = 0, 70462306a36Sopenharmony_ci DMA_DSCR_DEVICE = 1, 70562306a36Sopenharmony_ci DMA_DSCR_CTRL = 2, 70662306a36Sopenharmony_ci DMA_DSCR_NUM, 70762306a36Sopenharmony_ci}; 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_ci/** 71062306a36Sopenharmony_ci * struct hbm_dma_setup_request - dma setup request 71162306a36Sopenharmony_ci * 71262306a36Sopenharmony_ci * @hbm_cmd: bus message command header 71362306a36Sopenharmony_ci * @reserved: reserved for alignment 71462306a36Sopenharmony_ci * @dma_dscr: dma descriptor for HOST, DEVICE, and CTRL 71562306a36Sopenharmony_ci */ 71662306a36Sopenharmony_cistruct hbm_dma_setup_request { 71762306a36Sopenharmony_ci u8 hbm_cmd; 71862306a36Sopenharmony_ci u8 reserved[3]; 71962306a36Sopenharmony_ci struct hbm_dma_mem_dscr dma_dscr[DMA_DSCR_NUM]; 72062306a36Sopenharmony_ci} __packed; 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_ci/** 72362306a36Sopenharmony_ci * struct hbm_dma_setup_response - dma setup response 72462306a36Sopenharmony_ci * 72562306a36Sopenharmony_ci * @hbm_cmd: bus message command header 72662306a36Sopenharmony_ci * @status: 0 on success; otherwise DMA setup failed. 72762306a36Sopenharmony_ci * @reserved: reserved for alignment 72862306a36Sopenharmony_ci */ 72962306a36Sopenharmony_cistruct hbm_dma_setup_response { 73062306a36Sopenharmony_ci u8 hbm_cmd; 73162306a36Sopenharmony_ci u8 status; 73262306a36Sopenharmony_ci u8 reserved[2]; 73362306a36Sopenharmony_ci} __packed; 73462306a36Sopenharmony_ci 73562306a36Sopenharmony_ci/** 73662306a36Sopenharmony_ci * struct mei_dma_ring_ctrl - dma ring control block 73762306a36Sopenharmony_ci * 73862306a36Sopenharmony_ci * @hbuf_wr_idx: host circular buffer write index in slots 73962306a36Sopenharmony_ci * @reserved1: reserved for alignment 74062306a36Sopenharmony_ci * @hbuf_rd_idx: host circular buffer read index in slots 74162306a36Sopenharmony_ci * @reserved2: reserved for alignment 74262306a36Sopenharmony_ci * @dbuf_wr_idx: device circular buffer write index in slots 74362306a36Sopenharmony_ci * @reserved3: reserved for alignment 74462306a36Sopenharmony_ci * @dbuf_rd_idx: device circular buffer read index in slots 74562306a36Sopenharmony_ci * @reserved4: reserved for alignment 74662306a36Sopenharmony_ci */ 74762306a36Sopenharmony_cistruct hbm_dma_ring_ctrl { 74862306a36Sopenharmony_ci u32 hbuf_wr_idx; 74962306a36Sopenharmony_ci u32 reserved1; 75062306a36Sopenharmony_ci u32 hbuf_rd_idx; 75162306a36Sopenharmony_ci u32 reserved2; 75262306a36Sopenharmony_ci u32 dbuf_wr_idx; 75362306a36Sopenharmony_ci u32 reserved3; 75462306a36Sopenharmony_ci u32 dbuf_rd_idx; 75562306a36Sopenharmony_ci u32 reserved4; 75662306a36Sopenharmony_ci} __packed; 75762306a36Sopenharmony_ci 75862306a36Sopenharmony_ci/* virtual tag supported */ 75962306a36Sopenharmony_ci#define HBM_CAP_VT BIT(0) 76062306a36Sopenharmony_ci 76162306a36Sopenharmony_ci/* gsc extended header support */ 76262306a36Sopenharmony_ci#define HBM_CAP_GSC BIT(1) 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ci/* client dma supported */ 76562306a36Sopenharmony_ci#define HBM_CAP_CD BIT(2) 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_ci/** 76862306a36Sopenharmony_ci * struct hbm_capability_request - capability request from host to fw 76962306a36Sopenharmony_ci * 77062306a36Sopenharmony_ci * @hbm_cmd : bus message command header 77162306a36Sopenharmony_ci * @capability_requested: bitmask of capabilities requested by host 77262306a36Sopenharmony_ci */ 77362306a36Sopenharmony_cistruct hbm_capability_request { 77462306a36Sopenharmony_ci u8 hbm_cmd; 77562306a36Sopenharmony_ci u8 capability_requested[3]; 77662306a36Sopenharmony_ci} __packed; 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_ci/** 77962306a36Sopenharmony_ci * struct hbm_capability_response - capability response from fw to host 78062306a36Sopenharmony_ci * 78162306a36Sopenharmony_ci * @hbm_cmd : bus message command header 78262306a36Sopenharmony_ci * @capability_granted: bitmask of capabilities granted by FW 78362306a36Sopenharmony_ci */ 78462306a36Sopenharmony_cistruct hbm_capability_response { 78562306a36Sopenharmony_ci u8 hbm_cmd; 78662306a36Sopenharmony_ci u8 capability_granted[3]; 78762306a36Sopenharmony_ci} __packed; 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_ci/** 79062306a36Sopenharmony_ci * struct hbm_client_dma_map_request - client dma map request from host to fw 79162306a36Sopenharmony_ci * 79262306a36Sopenharmony_ci * @hbm_cmd: bus message command header 79362306a36Sopenharmony_ci * @client_buffer_id: client buffer id 79462306a36Sopenharmony_ci * @reserved: reserved 79562306a36Sopenharmony_ci * @address_lsb: DMA address LSB 79662306a36Sopenharmony_ci * @address_msb: DMA address MSB 79762306a36Sopenharmony_ci * @size: DMA size 79862306a36Sopenharmony_ci */ 79962306a36Sopenharmony_cistruct hbm_client_dma_map_request { 80062306a36Sopenharmony_ci u8 hbm_cmd; 80162306a36Sopenharmony_ci u8 client_buffer_id; 80262306a36Sopenharmony_ci u8 reserved[2]; 80362306a36Sopenharmony_ci u32 address_lsb; 80462306a36Sopenharmony_ci u32 address_msb; 80562306a36Sopenharmony_ci u32 size; 80662306a36Sopenharmony_ci} __packed; 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_ci/** 80962306a36Sopenharmony_ci * struct hbm_client_dma_unmap_request 81062306a36Sopenharmony_ci * client dma unmap request from the host to the firmware 81162306a36Sopenharmony_ci * 81262306a36Sopenharmony_ci * @hbm_cmd: bus message command header 81362306a36Sopenharmony_ci * @status: unmap status 81462306a36Sopenharmony_ci * @client_buffer_id: client buffer id 81562306a36Sopenharmony_ci * @reserved: reserved 81662306a36Sopenharmony_ci */ 81762306a36Sopenharmony_cistruct hbm_client_dma_unmap_request { 81862306a36Sopenharmony_ci u8 hbm_cmd; 81962306a36Sopenharmony_ci u8 status; 82062306a36Sopenharmony_ci u8 client_buffer_id; 82162306a36Sopenharmony_ci u8 reserved; 82262306a36Sopenharmony_ci} __packed; 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_ci/** 82562306a36Sopenharmony_ci * struct hbm_client_dma_response 82662306a36Sopenharmony_ci * client dma unmap response from the firmware to the host 82762306a36Sopenharmony_ci * 82862306a36Sopenharmony_ci * @hbm_cmd: bus message command header 82962306a36Sopenharmony_ci * @status: command status 83062306a36Sopenharmony_ci */ 83162306a36Sopenharmony_cistruct hbm_client_dma_response { 83262306a36Sopenharmony_ci u8 hbm_cmd; 83362306a36Sopenharmony_ci u8 status; 83462306a36Sopenharmony_ci} __packed; 83562306a36Sopenharmony_ci 83662306a36Sopenharmony_ci#endif 837