| /* |
| * Copyright (c) 2024, Intel Corporation. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef ZEPHYR_SUBSYS_FPGA_BRIDGE_INTEL_H_ |
| #define ZEPHYR_SUBSYS_FPGA_BRIDGE_INTEL_H_ |
| |
| #include <zephyr/kernel.h> |
| |
| /* Mask for FPGA-HPS bridges */ |
| #define BRIDGE_MASK 0x0F |
| /* Mailbox command header index */ |
| #define MBOX_CMD_HEADER_INDEX 0x00 |
| /* Mailbox command memory size */ |
| #define FPGA_MB_CMD_ADDR_MEM_SIZE 20 |
| /* Mailbox command response memory size */ |
| #define FPGA_MB_RESPONSE_MEM_SIZE 20 |
| /* Config status response length */ |
| #define FPGA_CONFIG_STATUS_RESPONSE_LEN 0x07 |
| |
| #define MBOX_CMD_CODE_OFFSET 0x00 |
| #define MBOX_CMD_ID_MASK 0x7FF |
| |
| #define MBOX_CMD_MODE_OFFSET 0x0B |
| #define MBOX_CMD_MODE_MASK 0x800 |
| |
| #define MBOX_DATA_LEN_OFFSET 0x0C |
| #define MBOX_DATA_LEN_MASK 0xFFF000 |
| |
| #define RECONFIG_DIRECT_COUNT_OFFSET 0x00 |
| #define RECONFIG_DIRECT_COUNT_MASK 0xFF |
| |
| #define RECONFIG_INDIRECT_ARG_OFFSET 0x08 |
| #define RECONFIG_INDIRECT_COUNT_MASK 0xFF00 |
| |
| #define RECONFIG_INDIRECT_RESPONSE_OFFSET 0x10 |
| #define RECONFIG_RESPONSE_COUNT_MASK 0xFF0000 |
| |
| #define RECONFIG_DATA_MB_CMD_SIZE 0x10 |
| #define RECONFIG_DATA_MB_CMD_INDIRECT_MODE 0x01 |
| |
| #define RECONFIG_DATA_MB_CMD_LENGTH 0x03 |
| |
| #define RECONFIG_DATA_MB_CMD_DIRECT_COUNT 0x00 |
| #define RECONFIG_DATA_MB_CMD_INDIRECT_ARG 0x01 |
| #define RECONFIG_DATA_MB_CMD_INDIRECT_RESPONSE 0x00 |
| #define RECONFIG_STATUS_INTERVAL_DELAY_US 1000 |
| #define RECONFIG_STATUS_RETRY_COUNT 20 |
| |
| #define MBOX_CONFIG_STATUS_STATE_CONFIG 0x10000000 |
| #define MBOX_CFGSTAT_VAB_BS_PREAUTH 0x20000000 |
| |
| #define FPGA_NOT_CONFIGURED_ERROR 0x02000004 |
| |
| #define MBOX_CFGSTAT_STATE_ERROR_HARDWARE 0xF0000005 |
| #define RECONFIG_SOFTFUNC_STATUS_CONF_DONE BIT(0) |
| #define RECONFIG_SOFTFUNC_STATUS_INIT_DONE BIT(1) |
| #define RECONFIG_SOFTFUNC_STATUS_SEU_ERROR BIT(3) |
| #define RECONFIG_PIN_STATUS_NSTATUS BIT(31) |
| |
| #define MBOX_REQUEST_HEADER(cmd_id, cmd_mode, len) \ |
| ((cmd_id << MBOX_CMD_CODE_OFFSET) & (MBOX_CMD_ID_MASK)) | \ |
| ((cmd_mode << MBOX_CMD_MODE_OFFSET) & (MBOX_CMD_MODE_MASK)) | \ |
| ((len << MBOX_DATA_LEN_OFFSET) & (MBOX_DATA_LEN_MASK)) |
| |
| #define MBOX_RECONFIG_REQUEST_DATA_FORMAT(direct_count, indirect_arg_count, response_arg_count) \ |
| ((direct_count << RECONFIG_DIRECT_COUNT_OFFSET) & (RECONFIG_DIRECT_COUNT_MASK)) | \ |
| ((indirect_arg_count << RECONFIG_INDIRECT_ARG_OFFSET) & \ |
| (RECONFIG_INDIRECT_COUNT_MASK)) | \ |
| ((response_arg_count << RECONFIG_INDIRECT_RESPONSE_OFFSET) & \ |
| (RECONFIG_RESPONSE_COUNT_MASK)) |
| |
| union mailbox_response_header { |
| /* Header of the config status response */ |
| uint32_t header; |
| |
| struct { |
| /* error_code – Field provides a basic description of whether the command |
| * succeeded or not. A successful response returns an error code of 0x0, |
| * non-zero values indicate failure |
| */ |
| uint32_t error_code : 11; |
| /* indirect_bit - Field indicates an indirect command */ |
| uint32_t indirect_bit : 1; |
| /* data_length - Field counts the number of word arguments which follow the |
| * response header word. The meaning of these words depends on the command |
| * code. Units are words |
| */ |
| uint32_t data_length : 11; |
| /* reserve bit */ |
| uint32_t reserved_bit : 1; |
| /* id - Field is returned unchanged from the matching command header and is |
| * useful for matching responses to commands along with the CLIENT |
| */ |
| uint32_t id : 4; |
| /* client_id - Field is returned unchanged from the matching command header and |
| * is useful for matching responses to commands along with the ID |
| */ |
| uint32_t client_id : 4; |
| } mailbox_resp_header; |
| }; |
| |
| union config_status_version { |
| /* Version of the config status response */ |
| uint32_t version; |
| |
| struct { |
| /* update number bits */ |
| uint32_t update_number : 8; |
| /* minor acds release number bits */ |
| uint32_t minor_acds_release_number : 8; |
| /* major acds release number bits */ |
| uint32_t major_acds_release_number : 8; |
| /* qspi flash index bits */ |
| uint32_t qspi_flash_index : 8; |
| } response_version_member; |
| }; |
| |
| union config_status_pin_status { |
| uint32_t pin_status; |
| |
| struct { |
| /* msel bits */ |
| uint32_t msel : 4; |
| /* pmf data bits */ |
| uint32_t pmf_data : 4; |
| /* reserve bits */ |
| uint32_t reserved_bit : 22; |
| /* nconfig bits */ |
| uint32_t nconfig : 1; |
| /* nconfig_status bits */ |
| uint32_t nconfig_status : 1; |
| } pin_status_member; |
| }; |
| |
| /* Struct to store the fpga_config_status */ |
| struct fpga_config_status { |
| /* Response header */ |
| union mailbox_response_header header; |
| /* Config state idle or config mode */ |
| uint32_t state; |
| /* Version number */ |
| union config_status_version version; |
| /* Pin status */ |
| union config_status_pin_status pin_status; |
| /* Soft function status details */ |
| uint32_t soft_function_status; |
| /* Location in the bitstream where the error occurred */ |
| uint32_t error_location; |
| /* Data is non-zero only for certain errors. The contents are highly dependent |
| * on which error was reported. The meaning of this data will not be made available to |
| * customers and can only be interpreted by investigating the source code directly |
| */ |
| uint32_t error_details; |
| }; |
| |
| enum smc_cmd_code { |
| /* SMC COMMAND ID to disable all the bridges */ |
| FPGA_ALL_BRIDGE_DISABLE = 0x00, |
| /* SMC COMMAND ID to enable all the bridges */ |
| FPGA_ALL_BRIDGE_ENABLE = 0x01, |
| /* SMC Cancel Command */ |
| FPGA_CANCEL = 0x03, |
| /* SMC COMMAND ID to check Reconfig status to SDM via mailbox */ |
| FPGA_CONFIG_STATUS = 0x04, |
| /* SMC COMMAND ID to check Reconfig status to SDM via mailbox */ |
| FPGA_RECONFIG_STATUS = 0x09 |
| }; |
| |
| enum mbox_reconfig_status_resp { |
| /* Mailbox reconfig status header */ |
| MBOX_RECONFIG_STATUS_HEADER, |
| /* Mailbox reconfig status state */ |
| MBOX_RECONFIG_STATUS_STATE, |
| /* Mailbox reconfig status version */ |
| MBOX_RECONFIG_STATUS_VERSION, |
| /* Mailbox reconfig status pin status */ |
| MBOX_RECONFIG_STATUS_PIN_STATUS, |
| /* Mailbox reconfig status soft function */ |
| MBOX_RECONFIG_STATUS_SOFT_FUNCTION, |
| /* Mailbox reconfig status error location */ |
| MBOX_RECONFIG_STATUS_ERROR_LOCATION, |
| /* Mailbox reconfig status error details */ |
| MBOX_RECONFIG_STATUS_ERROR_DETAILS |
| }; |
| |
| enum smc_request { |
| /* SMC request parameter a2 index*/ |
| SMC_REQUEST_A2_INDEX = 0x00, |
| /* SMC request parameter a3 index */ |
| SMC_REQUEST_A3_INDEX = 0x01 |
| }; |
| |
| /* SIP SVC response private data */ |
| struct sip_svc_private_data { |
| struct sip_svc_response response; |
| uint32_t *mbox_response_data; |
| uint32_t mbox_response_len; |
| struct k_sem smc_sem; |
| struct fpga_config_status config_status; |
| }; |
| |
| #endif |