1*65f0ecb9SAlexander Usyskin /* SPDX-License-Identifier: GPL-2.0 */ 2*65f0ecb9SAlexander Usyskin /* Copyright (C) 2023-2026 Intel Corporation */ 3*65f0ecb9SAlexander Usyskin #ifndef _ISSEI_HW_MSG_H_ 4*65f0ecb9SAlexander Usyskin #define _ISSEI_HW_MSG_H_ 5*65f0ecb9SAlexander Usyskin 6*65f0ecb9SAlexander Usyskin #include <linux/types.h> 7*65f0ecb9SAlexander Usyskin #include <linux/uuid.h> 8*65f0ecb9SAlexander Usyskin 9*65f0ecb9SAlexander Usyskin #define HAM_CB_MESSAGE_ID_REQ 0x8086cafe 10*65f0ecb9SAlexander Usyskin #define HAM_CB_MESSAGE_ID_RES 0xcafe8086 11*65f0ecb9SAlexander Usyskin #define HAM_CB_MESSAGE_VER 0x1 12*65f0ecb9SAlexander Usyskin 13*65f0ecb9SAlexander Usyskin /** 14*65f0ecb9SAlexander Usyskin * struct ham_setup_shared_memory_req - shared memory setup request 15*65f0ecb9SAlexander Usyskin * @msg_id: message id, should be %HAM_CB_MESSAGE_ID_REQ 16*65f0ecb9SAlexander Usyskin * @ver: message version (%HAM_CB_MESSAGE_VER) 17*65f0ecb9SAlexander Usyskin * @reserved: reserved 18*65f0ecb9SAlexander Usyskin * @buffer_physical_address: physical address of DMA buffer 19*65f0ecb9SAlexander Usyskin * @host_to_fw_section_length: memory size for host to fw communication 20*65f0ecb9SAlexander Usyskin * @fw_to_host_section_length: memory size for fw to host communication 21*65f0ecb9SAlexander Usyskin * @control_length: memory size for control buffer 22*65f0ecb9SAlexander Usyskin */ 23*65f0ecb9SAlexander Usyskin struct ham_setup_shared_memory_req { 24*65f0ecb9SAlexander Usyskin u32 msg_id; 25*65f0ecb9SAlexander Usyskin u16 ver; 26*65f0ecb9SAlexander Usyskin u16 reserved; 27*65f0ecb9SAlexander Usyskin u64 buffer_physical_address; 28*65f0ecb9SAlexander Usyskin u32 host_to_fw_section_length; 29*65f0ecb9SAlexander Usyskin u32 fw_to_host_section_length; 30*65f0ecb9SAlexander Usyskin u32 control_length; 31*65f0ecb9SAlexander Usyskin } __packed __aligned(4); 32*65f0ecb9SAlexander Usyskin 33*65f0ecb9SAlexander Usyskin /** 34*65f0ecb9SAlexander Usyskin * struct ham_setup_shared_memory_res - shared memory setup response 35*65f0ecb9SAlexander Usyskin * @msg_id: message id, should be %HAM_CB_MESSAGE_ID_RES 36*65f0ecb9SAlexander Usyskin * @status: operation status 37*65f0ecb9SAlexander Usyskin */ 38*65f0ecb9SAlexander Usyskin struct ham_setup_shared_memory_res { 39*65f0ecb9SAlexander Usyskin u32 msg_id; 40*65f0ecb9SAlexander Usyskin u32 status; 41*65f0ecb9SAlexander Usyskin }; 42*65f0ecb9SAlexander Usyskin 43*65f0ecb9SAlexander Usyskin /** 44*65f0ecb9SAlexander Usyskin * struct control_buffer - control buffer structure 45*65f0ecb9SAlexander Usyskin * @h2f_counter_wr: write counter host to fw 46*65f0ecb9SAlexander Usyskin * @h2f_counter_rd: read counter host to fw 47*65f0ecb9SAlexander Usyskin * @f2h_counter_wr: write counter fw to host 48*65f0ecb9SAlexander Usyskin * @f2h_counter_rd: read counter fw to host 49*65f0ecb9SAlexander Usyskin */ 50*65f0ecb9SAlexander Usyskin struct control_buffer { 51*65f0ecb9SAlexander Usyskin u32 h2f_counter_wr; 52*65f0ecb9SAlexander Usyskin u32 h2f_counter_rd; 53*65f0ecb9SAlexander Usyskin u32 f2h_counter_wr; 54*65f0ecb9SAlexander Usyskin u32 f2h_counter_rd; 55*65f0ecb9SAlexander Usyskin }; 56*65f0ecb9SAlexander Usyskin 57*65f0ecb9SAlexander Usyskin /* HAM messages over DMA */ 58*65f0ecb9SAlexander Usyskin 59*65f0ecb9SAlexander Usyskin /** 60*65f0ecb9SAlexander Usyskin * struct ham_message_header - message header over DMA 61*65f0ecb9SAlexander Usyskin * @length: message length (payload only, not including header) 62*65f0ecb9SAlexander Usyskin * @fw_id: firmware client id (0 means Bus Message) 63*65f0ecb9SAlexander Usyskin * @host_id: host client id (0 means Bus Message) 64*65f0ecb9SAlexander Usyskin * @flags: message flags 65*65f0ecb9SAlexander Usyskin * @status: operation status 66*65f0ecb9SAlexander Usyskin * @reserved: reserved 67*65f0ecb9SAlexander Usyskin */ 68*65f0ecb9SAlexander Usyskin struct ham_message_header { 69*65f0ecb9SAlexander Usyskin u32 length; 70*65f0ecb9SAlexander Usyskin u16 fw_id; 71*65f0ecb9SAlexander Usyskin u16 host_id; 72*65f0ecb9SAlexander Usyskin u32 flags; 73*65f0ecb9SAlexander Usyskin u32 status; 74*65f0ecb9SAlexander Usyskin u32 reserved; 75*65f0ecb9SAlexander Usyskin }; 76*65f0ecb9SAlexander Usyskin 77*65f0ecb9SAlexander Usyskin /* Bus Commands */ 78*65f0ecb9SAlexander Usyskin #define HAM_BUS_CMD_START_REQ 0x00 79*65f0ecb9SAlexander Usyskin #define HAM_BUS_CMD_START_RSP 0x80 80*65f0ecb9SAlexander Usyskin #define HAM_BUS_CMD_CLIENT_REQ 0x01 81*65f0ecb9SAlexander Usyskin #define HAM_BUS_CMD_CLIENT_RSP 0x81 82*65f0ecb9SAlexander Usyskin 83*65f0ecb9SAlexander Usyskin /** 84*65f0ecb9SAlexander Usyskin * struct ham_bus_message - bus message header 85*65f0ecb9SAlexander Usyskin * @cmd: command code 86*65f0ecb9SAlexander Usyskin */ 87*65f0ecb9SAlexander Usyskin struct ham_bus_message { 88*65f0ecb9SAlexander Usyskin u32 cmd; 89*65f0ecb9SAlexander Usyskin }; 90*65f0ecb9SAlexander Usyskin 91*65f0ecb9SAlexander Usyskin #define HAM_SUPPORTED_VERSION 0x01 92*65f0ecb9SAlexander Usyskin 93*65f0ecb9SAlexander Usyskin /** 94*65f0ecb9SAlexander Usyskin * struct ham_start_message_req - start message 95*65f0ecb9SAlexander Usyskin * @header: bus message header (%HAM_BUS_CMD_START_REQ) 96*65f0ecb9SAlexander Usyskin * @supported_version: supported protocol version 97*65f0ecb9SAlexander Usyskin * @heci_capabilities_length: protocol capabilities length in bytes 98*65f0ecb9SAlexander Usyskin * @heci_capabilities: protocol capabilities data 99*65f0ecb9SAlexander Usyskin */ 100*65f0ecb9SAlexander Usyskin struct ham_start_message_req { 101*65f0ecb9SAlexander Usyskin struct ham_bus_message header; 102*65f0ecb9SAlexander Usyskin u16 supported_version; 103*65f0ecb9SAlexander Usyskin u8 heci_capabilities_length; 104*65f0ecb9SAlexander Usyskin u8 heci_capabilities[] __counted_by(heci_capabilities_length); 105*65f0ecb9SAlexander Usyskin } __packed; 106*65f0ecb9SAlexander Usyskin 107*65f0ecb9SAlexander Usyskin /** 108*65f0ecb9SAlexander Usyskin * struct ham_start_message_res - start message response 109*65f0ecb9SAlexander Usyskin * @header: bus message header (%HAM_BUS_CMD_START_RSP) 110*65f0ecb9SAlexander Usyskin * @fw_version: firmware version (four u16 blocks) 111*65f0ecb9SAlexander Usyskin * @supported_version: supported protocol version 112*65f0ecb9SAlexander Usyskin * @heci_capabilities_length: protocol capabilities length in bytes 113*65f0ecb9SAlexander Usyskin * @heci_capabilities: protocol capabilities data 114*65f0ecb9SAlexander Usyskin */ 115*65f0ecb9SAlexander Usyskin struct ham_start_message_res { 116*65f0ecb9SAlexander Usyskin struct ham_bus_message header; 117*65f0ecb9SAlexander Usyskin u16 fw_version[4]; 118*65f0ecb9SAlexander Usyskin u16 supported_version; 119*65f0ecb9SAlexander Usyskin u8 heci_capabilities_length; 120*65f0ecb9SAlexander Usyskin u8 heci_capabilities[] __counted_by(heci_capabilities_length); 121*65f0ecb9SAlexander Usyskin } __packed; 122*65f0ecb9SAlexander Usyskin 123*65f0ecb9SAlexander Usyskin /** 124*65f0ecb9SAlexander Usyskin * struct ham_get_clients_req - clients list request 125*65f0ecb9SAlexander Usyskin * @header: bus message header (%HAM_BUS_CMD_CLIENT_REQ) 126*65f0ecb9SAlexander Usyskin */ 127*65f0ecb9SAlexander Usyskin struct ham_get_clients_req { 128*65f0ecb9SAlexander Usyskin struct ham_bus_message header; 129*65f0ecb9SAlexander Usyskin }; 130*65f0ecb9SAlexander Usyskin 131*65f0ecb9SAlexander Usyskin /** 132*65f0ecb9SAlexander Usyskin * struct ham_client_properties - single client properties 133*65f0ecb9SAlexander Usyskin * @client_number: client id in firmware 134*65f0ecb9SAlexander Usyskin * @protocol_ver: client protocol version 135*65f0ecb9SAlexander Usyskin * @reserved: reserved 136*65f0ecb9SAlexander Usyskin * @client_uuid: protocol name (UUID) 137*65f0ecb9SAlexander Usyskin * @client_mtu: max message length supported by client 138*65f0ecb9SAlexander Usyskin * @flags: client flags 139*65f0ecb9SAlexander Usyskin */ 140*65f0ecb9SAlexander Usyskin struct ham_client_properties { 141*65f0ecb9SAlexander Usyskin u16 client_number; 142*65f0ecb9SAlexander Usyskin u8 protocol_ver; 143*65f0ecb9SAlexander Usyskin u8 reserved; 144*65f0ecb9SAlexander Usyskin uuid_t client_uuid; 145*65f0ecb9SAlexander Usyskin u32 client_mtu; 146*65f0ecb9SAlexander Usyskin u32 flags; 147*65f0ecb9SAlexander Usyskin }; 148*65f0ecb9SAlexander Usyskin 149*65f0ecb9SAlexander Usyskin /** 150*65f0ecb9SAlexander Usyskin * struct ham_get_clients_res - client properties response 151*65f0ecb9SAlexander Usyskin * @header: bus message header (%HAM_BUS_CMD_CLIENT_RSP) 152*65f0ecb9SAlexander Usyskin * @client_count: number of clients in firmware 153*65f0ecb9SAlexander Usyskin * @reserved: reserved 154*65f0ecb9SAlexander Usyskin * @clients_props: list of client properties 155*65f0ecb9SAlexander Usyskin */ 156*65f0ecb9SAlexander Usyskin struct ham_get_clients_res { 157*65f0ecb9SAlexander Usyskin struct ham_bus_message header; 158*65f0ecb9SAlexander Usyskin u16 client_count; 159*65f0ecb9SAlexander Usyskin u16 reserved; 160*65f0ecb9SAlexander Usyskin struct ham_client_properties clients_props[] __counted_by(client_count); 161*65f0ecb9SAlexander Usyskin }; 162*65f0ecb9SAlexander Usyskin 163*65f0ecb9SAlexander Usyskin #endif /* _ISSEI_HW_MSG_H_ */ 164