Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / include / linux / firmware / intel / stratix10-svc-client.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2017-2018, Intel Corporation
4  */
5
6 #ifndef __STRATIX10_SVC_CLIENT_H
7 #define __STRATIX10_SVC_CLIENT_H
8
9 /**
10  * Service layer driver supports client names
11  *
12  * fpga: for FPGA configuration
13  * rsu: for remote status update
14  */
15 #define SVC_CLIENT_FPGA                 "fpga"
16 #define SVC_CLIENT_RSU                  "rsu"
17
18 /**
19  * Status of the sent command, in bit number
20  *
21  * SVC_COMMAND_STATUS_RECONFIG_REQUEST_OK:
22  * Secure firmware accepts the request of FPGA reconfiguration.
23  *
24  * SVC_STATUS_RECONFIG_BUFFER_SUBMITTED:
25  * Service client successfully submits FPGA configuration
26  * data buffer to secure firmware.
27  *
28  * SVC_COMMAND_STATUS_RECONFIG_BUFFER_DONE:
29  * Secure firmware completes data process, ready to accept the
30  * next WRITE transaction.
31  *
32  * SVC_COMMAND_STATUS_RECONFIG_COMPLETED:
33  * Secure firmware completes FPGA configuration successfully, FPGA should
34  * be in user mode.
35  *
36  * SVC_COMMAND_STATUS_RECONFIG_BUSY:
37  * FPGA configuration is still in process.
38  *
39  * SVC_COMMAND_STATUS_RECONFIG_ERROR:
40  * Error encountered during FPGA configuration.
41  *
42  * SVC_STATUS_RSU_OK:
43  * Secure firmware accepts the request of remote status update (RSU).
44  */
45 #define SVC_STATUS_RECONFIG_REQUEST_OK          0
46 #define SVC_STATUS_RECONFIG_BUFFER_SUBMITTED    1
47 #define SVC_STATUS_RECONFIG_BUFFER_DONE         2
48 #define SVC_STATUS_RECONFIG_COMPLETED           3
49 #define SVC_STATUS_RECONFIG_BUSY                4
50 #define SVC_STATUS_RECONFIG_ERROR               5
51 #define SVC_STATUS_RSU_OK                       6
52 #define SVC_STATUS_RSU_ERROR                    7
53 /**
54  * Flag bit for COMMAND_RECONFIG
55  *
56  * COMMAND_RECONFIG_FLAG_PARTIAL:
57  * Set to FPGA configuration type (full or partial), the default
58  * is full reconfig.
59  */
60 #define COMMAND_RECONFIG_FLAG_PARTIAL   0
61
62 /**
63  * Timeout settings for service clients:
64  * timeout value used in Stratix10 FPGA manager driver.
65  * timeout value used in RSU driver
66  */
67 #define SVC_RECONFIG_REQUEST_TIMEOUT_MS         100
68 #define SVC_RECONFIG_BUFFER_TIMEOUT_MS          240
69 #define SVC_RSU_REQUEST_TIMEOUT_MS              300
70
71 struct stratix10_svc_chan;
72
73 /**
74  * enum stratix10_svc_command_code - supported service commands
75  *
76  * @COMMAND_NOOP: do 'dummy' request for integration/debug/trouble-shooting
77  *
78  * @COMMAND_RECONFIG: ask for FPGA configuration preparation, return status
79  * is SVC_STATUS_RECONFIG_REQUEST_OK
80  *
81  * @COMMAND_RECONFIG_DATA_SUBMIT: submit buffer(s) of bit-stream data for the
82  * FPGA configuration, return status is SVC_STATUS_RECONFIG_BUFFER_SUBMITTED,
83  * or SVC_STATUS_RECONFIG_ERROR
84  *
85  * @COMMAND_RECONFIG_DATA_CLAIM: check the status of the configuration, return
86  * status is SVC_STATUS_RECONFIG_COMPLETED, or SVC_STATUS_RECONFIG_BUSY, or
87  * SVC_STATUS_RECONFIG_ERROR
88  *
89  * @COMMAND_RECONFIG_STATUS: check the status of the configuration, return
90  * status is SVC_STATUS_RECONFIG_COMPLETED, or  SVC_STATUS_RECONFIG_BUSY, or
91  * SVC_STATUS_RECONFIG_ERROR
92  *
93  * @COMMAND_RSU_STATUS: request remote system update boot log, return status
94  * is log data or SVC_STATUS_RSU_ERROR
95  *
96  * @COMMAND_RSU_UPDATE: set the offset of the bitstream to boot after reboot,
97  * return status is SVC_STATUS_RSU_OK or SVC_STATUS_RSU_ERROR
98  */
99 enum stratix10_svc_command_code {
100         COMMAND_NOOP = 0,
101         COMMAND_RECONFIG,
102         COMMAND_RECONFIG_DATA_SUBMIT,
103         COMMAND_RECONFIG_DATA_CLAIM,
104         COMMAND_RECONFIG_STATUS,
105         COMMAND_RSU_STATUS,
106         COMMAND_RSU_UPDATE
107 };
108
109 /**
110  * struct stratix10_svc_client_msg - message sent by client to service
111  * @payload: starting address of data need be processed
112  * @payload_length: data size in bytes
113  * @command: service command
114  * @arg: args to be passed via registers and not physically mapped buffers
115  */
116 struct stratix10_svc_client_msg {
117         void *payload;
118         size_t payload_length;
119         enum stratix10_svc_command_code command;
120         u64 arg[3];
121 };
122
123 /**
124  * struct stratix10_svc_command_config_type - config type
125  * @flags: flag bit for the type of FPGA configuration
126  */
127 struct stratix10_svc_command_config_type {
128         u32 flags;
129 };
130
131 /**
132  * struct stratix10_svc_cb_data - callback data structure from service layer
133  * @status: the status of sent command
134  * @kaddr1: address of 1st completed data block
135  * @kaddr2: address of 2nd completed data block
136  * @kaddr3: address of 3rd completed data block
137  */
138 struct stratix10_svc_cb_data {
139         u32 status;
140         void *kaddr1;
141         void *kaddr2;
142         void *kaddr3;
143 };
144
145 /**
146  * struct stratix10_svc_client - service client structure
147  * @dev: the client device
148  * @receive_cb: callback to provide service client the received data
149  * @priv: client private data
150  */
151 struct stratix10_svc_client {
152         struct device *dev;
153         void (*receive_cb)(struct stratix10_svc_client *client,
154                            struct stratix10_svc_cb_data *cb_data);
155         void *priv;
156 };
157
158 /**
159  * stratix10_svc_request_channel_byname() - request service channel
160  * @client: identity of the client requesting the channel
161  * @name: supporting client name defined above
162  *
163  * Return: a pointer to channel assigned to the client on success,
164  * or ERR_PTR() on error.
165  */
166 struct stratix10_svc_chan
167 *stratix10_svc_request_channel_byname(struct stratix10_svc_client *client,
168         const char *name);
169
170 /**
171  * stratix10_svc_free_channel() - free service channel.
172  * @chan: service channel to be freed
173  */
174 void stratix10_svc_free_channel(struct stratix10_svc_chan *chan);
175
176 /**
177  * stratix10_svc_allocate_memory() - allocate the momory
178  * @chan: service channel assigned to the client
179  * @size: number of bytes client requests
180  *
181  * Service layer allocates the requested number of bytes from the memory
182  * pool for the client.
183  *
184  * Return: the starting address of allocated memory on success, or
185  * ERR_PTR() on error.
186  */
187 void *stratix10_svc_allocate_memory(struct stratix10_svc_chan *chan,
188                                     size_t size);
189
190 /**
191  * stratix10_svc_free_memory() - free allocated memory
192  * @chan: service channel assigned to the client
193  * @kaddr: starting address of memory to be free back to pool
194  */
195 void stratix10_svc_free_memory(struct stratix10_svc_chan *chan, void *kaddr);
196
197 /**
198  * stratix10_svc_send() - send a message to the remote
199  * @chan: service channel assigned to the client
200  * @msg: message data to be sent, in the format of
201  * struct stratix10_svc_client_msg
202  *
203  * Return: 0 for success, -ENOMEM or -ENOBUFS on error.
204  */
205 int stratix10_svc_send(struct stratix10_svc_chan *chan, void *msg);
206
207 /**
208  * intel_svc_done() - complete service request
209  * @chan: service channel assigned to the client
210  *
211  * This function is used by service client to inform service layer that
212  * client's service requests are completed, or there is an error in the
213  * request process.
214  */
215 void stratix10_svc_done(struct stratix10_svc_chan *chan);
216 #endif
217