forked from zephyrproject-rtos/zephyr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfpga_altera_agilex_bridge.h
205 lines (176 loc) · 6.5 KB
/
fpga_altera_agilex_bridge.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
/*
* 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