| /* Copyright 2018 The ChromiumOS Authors |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| /* IPC module for ISH */ |
| #ifndef __IPC_HECI_H |
| #define __IPC_HECI_H |
| |
| enum IPC_ERR { |
| IPC_ERR_IPC_IS_NOT_READY = EC_ERROR_INTERNAL_FIRST + 0, |
| IPC_ERR_TOO_SMALL_BUFFER = EC_ERROR_INTERNAL_FIRST + 1, |
| IPC_ERR_TX_QUEUE_FULL = EC_ERROR_INTERNAL_FIRST + 2, |
| IPC_ERR_INVALID_TASK = EC_ERROR_INTERNAL_FIRST + 3, |
| IPC_ERR_MSG_NOT_AVAILABLE = EC_ERROR_INTERNAL_FIRST + 4, |
| IPC_ERR_INVALID_MSG = EC_ERROR_INTERNAL_FIRST + 5, |
| }; |
| |
| enum ipc_peer_id { |
| IPC_PEER_ID_HOST = 0, /* x64 host */ |
| #if 0 /* other peers are not implemented yet */ |
| IPC_PEER_ID_PMC = 1, /* Power Management Controller */ |
| IPC_PEER_ID_CSME = 2, /* Converged Security Management Engine */ |
| IPC_PEER_ID_CAVS = 3, /* Audio, Voice, and Speech engine */ |
| IPC_PEER_ID_ISP = 4, /* Image Signal Processor */ |
| #endif |
| IPC_PEERS_COUNT, |
| }; |
| /* |
| * Currently ipc handle encoding only allows maximum 16 peers which is |
| * enough for ISH3, ISH4, and ISH5. They have 5 peers. |
| */ |
| BUILD_ASSERT(IPC_PEERS_COUNT <= 0x0F); |
| |
| enum ipc_protocol { |
| IPC_PROTOCOL_BOOT = 0, /* Not supported */ |
| IPC_PROTOCOL_HECI, /* Host Embedded Controller Interface */ |
| IPC_PROTOCOL_MCTP, /* not supported */ |
| IPC_PROTOCOL_MNG, /* Management protocol */ |
| IPC_PROTOCOL_ECP, /* EC Protocol. not supported */ |
| IPC_PROTOCOL_COUNT |
| }; |
| /* |
| * IPC handle enconding only supports 16 protocols which is the |
| * maximum protocols supported by IPC doorbell encoding. |
| */ |
| BUILD_ASSERT(IPC_PROTOCOL_COUNT <= 0x0F); |
| |
| typedef void * ipc_handle_t; |
| |
| #define IPC_MAX_PAYLOAD_SIZE 128 |
| #define IPC_INVALID_HANDLE NULL |
| |
| /* |
| * Open ipc channel |
| * |
| * @param peer_id select peer to communicate. |
| * @param protocol select protocol |
| * @param event set event flag |
| * |
| * @return ipc handle or IPC_INVALID_HANDLE if there's error |
| */ |
| ipc_handle_t ipc_open(const enum ipc_peer_id peer_id, |
| const enum ipc_protocol protocol, |
| const uint32_t event); |
| void ipc_close(const ipc_handle_t handle); |
| |
| /* |
| * Read message from ipc channel. |
| * The function should be call by the same task called ipc_open(). |
| * The function waits until message is available. |
| * @param timeout_us if == -1, wait until message is available. |
| * if == 0, return immediately. |
| * if > 0, wait for the specified microsecond duration time |
| */ |
| int ipc_read(const ipc_handle_t handle, void *buf, const size_t buf_size, |
| int timeout_us); |
| |
| /* Write message to ipc channel. */ |
| int ipc_write_timestamp(const ipc_handle_t handle, const void *buf, |
| const size_t buf_size, uint32_t *timestamp); |
| |
| #endif /* __IPC_HECI_H */ |