zephyr/drivers/fpga/fpga_altera_agilex_bridge.h

206 lines
6.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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