1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * FPGA Manager Driver for Intel Stratix10 SoC 4 * 5 * Copyright (C) 2018 Intel Corporation 6 */ 7 #include <linux/completion.h> 8 #include <linux/fpga/fpga-mgr.h> 9 #include <linux/firmware/intel/stratix10-svc-client.h> 10 #include <linux/module.h> 11 #include <linux/of.h> 12 #include <linux/of_platform.h> 13 #include <linux/platform_device.h> 14 15 /* 16 * FPGA programming requires a higher level of privilege (EL3), per the SoC 17 * design. 18 */ 19 #define NUM_SVC_BUFS 4 20 #define SVC_BUF_SIZE SZ_512K 21 22 /* Indicates buffer is in use if set */ 23 #define SVC_BUF_LOCK 0 24 25 #define S10_BUFFER_TIMEOUT (msecs_to_jiffies(SVC_RECONFIG_BUFFER_TIMEOUT_MS)) 26 #define S10_RECONFIG_TIMEOUT (msecs_to_jiffies(SVC_RECONFIG_REQUEST_TIMEOUT_MS)) 27 28 /* 29 * struct s10_svc_buf 30 * buf: virtual address of buf provided by service layer 31 * lock: locked if buffer is in use 32 */ 33 struct s10_svc_buf { 34 char *buf; 35 unsigned long lock; 36 }; 37 38 struct s10_priv { 39 struct stratix10_svc_chan *chan; 40 struct stratix10_svc_client client; 41 struct completion status_return_completion; 42 struct s10_svc_buf svc_bufs[NUM_SVC_BUFS]; 43 unsigned long status; 44 }; 45 46 static int s10_svc_send_msg(struct s10_priv *priv, 47 enum stratix10_svc_command_code command, 48 void *payload, u32 payload_length) 49 { 50 struct stratix10_svc_chan *chan = priv->chan; 51 struct device *dev = priv->client.dev; 52 struct stratix10_svc_client_msg msg; 53 int ret; 54 55 dev_dbg(dev, "%s cmd=%d payload=%p length=%d\n", 56 __func__, command, payload, payload_length); 57 58 msg.command = command; 59 msg.payload = payload; 60 msg.payload_length = payload_length; 61 62 ret = stratix10_svc_send(chan, &msg); 63 dev_dbg(dev, "stratix10_svc_send returned status %d\n", ret); 64 65 return ret; 66 } 67 68 /* 69 * Free buffers allocated from the service layer's pool that are not in use. 70 * Return true when all buffers are freed. 71 */ 72 static bool s10_free_buffers(struct fpga_manager *mgr) 73 { 74 struct s10_priv *priv = mgr->priv; 75 uint num_free = 0; 76 uint i; 77 78 for (i = 0; i < NUM_SVC_BUFS; i++) { 79 if (!priv->svc_bufs[i].buf) { 80 num_free++; 81 continue; 82 } 83 84 if (!test_and_set_bit_lock(SVC_BUF_LOCK, 85 &priv->svc_bufs[i].lock)) { 86 stratix10_svc_free_memory(priv->chan, 87 priv->svc_bufs[i].buf); 88 priv->svc_bufs[i].buf = NULL; 89 num_free++; 90 } 91 } 92 93 return num_free == NUM_SVC_BUFS; 94 } 95 96 /* 97 * Returns count of how many buffers are not in use. 98 */ 99 static uint s10_free_buffer_count(struct fpga_manager *mgr) 100 { 101 struct s10_priv *priv = mgr->priv; 102 uint num_free = 0; 103 uint i; 104 105 for (i = 0; i < NUM_SVC_BUFS; i++) 106 if (!priv->svc_bufs[i].buf) 107 num_free++; 108 109 return num_free; 110 } 111 112 /* 113 * s10_unlock_bufs 114 * Given the returned buffer address, match that address to our buffer struct 115 * and unlock that buffer. This marks it as available to be refilled and sent 116 * (or freed). 117 * priv: private data 118 * kaddr: kernel address of buffer that was returned from service layer 119 */ 120 static void s10_unlock_bufs(struct s10_priv *priv, void *kaddr) 121 { 122 uint i; 123 124 if (!kaddr) 125 return; 126 127 for (i = 0; i < NUM_SVC_BUFS; i++) 128 if (priv->svc_bufs[i].buf == kaddr) { 129 clear_bit_unlock(SVC_BUF_LOCK, 130 &priv->svc_bufs[i].lock); 131 return; 132 } 133 134 WARN(1, "Unknown buffer returned from service layer %p\n", kaddr); 135 } 136 137 /* 138 * s10_receive_callback - callback for service layer to use to provide client 139 * (this driver) messages received through the mailbox. 140 * client: service layer client struct 141 * data: message from service layer 142 */ 143 static void s10_receive_callback(struct stratix10_svc_client *client, 144 struct stratix10_svc_cb_data *data) 145 { 146 struct s10_priv *priv = client->priv; 147 u32 status; 148 int i; 149 150 WARN_ONCE(!data, "%s: stratix10_svc_rc_data = NULL", __func__); 151 152 status = data->status; 153 154 /* 155 * Here we set status bits as we receive them. Elsewhere, we always use 156 * test_and_clear_bit() to check status in priv->status 157 */ 158 for (i = 0; i <= SVC_STATUS_ERROR; i++) 159 if (status & (1 << i)) 160 set_bit(i, &priv->status); 161 162 if (status & BIT(SVC_STATUS_BUFFER_DONE)) { 163 s10_unlock_bufs(priv, data->kaddr1); 164 s10_unlock_bufs(priv, data->kaddr2); 165 s10_unlock_bufs(priv, data->kaddr3); 166 } 167 168 complete(&priv->status_return_completion); 169 } 170 171 /* 172 * s10_ops_write_init - prepare for FPGA reconfiguration by requesting 173 * partial reconfig and allocating buffers from the service layer. 174 */ 175 static int s10_ops_write_init(struct fpga_manager *mgr, 176 struct fpga_image_info *info, 177 const char *buf, size_t count) 178 { 179 struct s10_priv *priv = mgr->priv; 180 struct device *dev = priv->client.dev; 181 struct stratix10_svc_command_config_type ctype; 182 char *kbuf; 183 uint i; 184 int ret; 185 186 ctype.flags = 0; 187 if (info->flags & FPGA_MGR_PARTIAL_RECONFIG) { 188 dev_dbg(dev, "Requesting partial reconfiguration.\n"); 189 ctype.flags |= BIT(COMMAND_RECONFIG_FLAG_PARTIAL); 190 } else { 191 dev_dbg(dev, "Requesting full reconfiguration.\n"); 192 } 193 194 reinit_completion(&priv->status_return_completion); 195 ret = s10_svc_send_msg(priv, COMMAND_RECONFIG, 196 &ctype, sizeof(ctype)); 197 if (ret < 0) 198 goto init_error; 199 200 if (!wait_for_completion_timeout(&priv->status_return_completion, 201 S10_RECONFIG_TIMEOUT)) { 202 dev_err(dev, "timeout waiting for RECONFIG_REQUEST\n"); 203 ret = -ETIMEDOUT; 204 goto init_error; 205 } 206 207 if (!test_and_clear_bit(SVC_STATUS_OK, &priv->status)) { 208 ret = -ETIMEDOUT; 209 goto init_error; 210 } 211 212 /* Allocate buffers from the service layer's pool. */ 213 for (i = 0; i < NUM_SVC_BUFS; i++) { 214 kbuf = stratix10_svc_allocate_memory(priv->chan, SVC_BUF_SIZE); 215 if (IS_ERR(kbuf)) { 216 s10_free_buffers(mgr); 217 ret = PTR_ERR(kbuf); 218 goto init_error; 219 } 220 221 priv->svc_bufs[i].buf = kbuf; 222 priv->svc_bufs[i].lock = 0; 223 } 224 225 return 0; 226 227 init_error: 228 stratix10_svc_done(priv->chan); 229 return ret; 230 } 231 232 /* 233 * s10_send_buf - send a buffer to the service layer queue 234 * mgr: fpga manager struct 235 * buf: fpga image buffer 236 * count: size of buf in bytes 237 * Returns # of bytes transferred or -ENOBUFS if the all the buffers are in use 238 * or if the service queue is full. Never returns 0. 239 */ 240 static int s10_send_buf(struct fpga_manager *mgr, const char *buf, size_t count) 241 { 242 struct s10_priv *priv = mgr->priv; 243 struct device *dev = priv->client.dev; 244 void *svc_buf; 245 size_t xfer_sz; 246 int ret; 247 uint i; 248 249 /* get/lock a buffer that that's not being used */ 250 for (i = 0; i < NUM_SVC_BUFS; i++) 251 if (!test_and_set_bit_lock(SVC_BUF_LOCK, 252 &priv->svc_bufs[i].lock)) 253 break; 254 255 if (i == NUM_SVC_BUFS) 256 return -ENOBUFS; 257 258 xfer_sz = count < SVC_BUF_SIZE ? count : SVC_BUF_SIZE; 259 260 svc_buf = priv->svc_bufs[i].buf; 261 memcpy(svc_buf, buf, xfer_sz); 262 ret = s10_svc_send_msg(priv, COMMAND_RECONFIG_DATA_SUBMIT, 263 svc_buf, xfer_sz); 264 if (ret < 0) { 265 dev_err(dev, 266 "Error while sending data to service layer (%d)", ret); 267 clear_bit_unlock(SVC_BUF_LOCK, &priv->svc_bufs[i].lock); 268 return ret; 269 } 270 271 return xfer_sz; 272 } 273 274 /* 275 * Send an FPGA image to privileged layers to write to the FPGA. When done 276 * sending, free all service layer buffers we allocated in write_init. 277 */ 278 static int s10_ops_write(struct fpga_manager *mgr, const char *buf, 279 size_t count) 280 { 281 struct s10_priv *priv = mgr->priv; 282 struct device *dev = priv->client.dev; 283 long wait_status; 284 int sent = 0; 285 int ret = 0; 286 287 /* 288 * Loop waiting for buffers to be returned. When a buffer is returned, 289 * reuse it to send more data or free if if all data has been sent. 290 */ 291 while (count > 0 || s10_free_buffer_count(mgr) != NUM_SVC_BUFS) { 292 reinit_completion(&priv->status_return_completion); 293 294 if (count > 0) { 295 sent = s10_send_buf(mgr, buf, count); 296 if (sent < 0) 297 continue; 298 299 count -= sent; 300 buf += sent; 301 } else { 302 if (s10_free_buffers(mgr)) 303 return 0; 304 305 ret = s10_svc_send_msg( 306 priv, COMMAND_RECONFIG_DATA_CLAIM, 307 NULL, 0); 308 if (ret < 0) 309 break; 310 } 311 312 /* 313 * If callback hasn't already happened, wait for buffers to be 314 * returned from service layer 315 */ 316 wait_status = 1; /* not timed out */ 317 if (!priv->status) 318 wait_status = wait_for_completion_timeout( 319 &priv->status_return_completion, 320 S10_BUFFER_TIMEOUT); 321 322 if (test_and_clear_bit(SVC_STATUS_BUFFER_DONE, &priv->status) || 323 test_and_clear_bit(SVC_STATUS_BUFFER_SUBMITTED, 324 &priv->status)) { 325 ret = 0; 326 continue; 327 } 328 329 if (test_and_clear_bit(SVC_STATUS_ERROR, &priv->status)) { 330 dev_err(dev, "ERROR - giving up - SVC_STATUS_ERROR\n"); 331 ret = -EFAULT; 332 break; 333 } 334 335 if (!wait_status) { 336 dev_err(dev, "timeout waiting for svc layer buffers\n"); 337 ret = -ETIMEDOUT; 338 break; 339 } 340 } 341 342 if (!s10_free_buffers(mgr)) 343 dev_err(dev, "%s not all buffers were freed\n", __func__); 344 345 if (ret < 0) 346 stratix10_svc_done(priv->chan); 347 348 return ret; 349 } 350 351 static int s10_ops_write_complete(struct fpga_manager *mgr, 352 struct fpga_image_info *info) 353 { 354 struct s10_priv *priv = mgr->priv; 355 struct device *dev = priv->client.dev; 356 unsigned long timeout; 357 int ret; 358 359 timeout = usecs_to_jiffies(info->config_complete_timeout_us); 360 361 do { 362 reinit_completion(&priv->status_return_completion); 363 364 ret = s10_svc_send_msg(priv, COMMAND_RECONFIG_STATUS, NULL, 0); 365 if (ret < 0) 366 break; 367 368 ret = wait_for_completion_timeout( 369 &priv->status_return_completion, timeout); 370 if (!ret) { 371 dev_err(dev, 372 "timeout waiting for RECONFIG_COMPLETED\n"); 373 ret = -ETIMEDOUT; 374 break; 375 } 376 /* Not error or timeout, so ret is # of jiffies until timeout */ 377 timeout = ret; 378 ret = 0; 379 380 if (test_and_clear_bit(SVC_STATUS_COMPLETED, &priv->status)) 381 break; 382 383 if (test_and_clear_bit(SVC_STATUS_ERROR, &priv->status)) { 384 dev_err(dev, "ERROR - giving up - SVC_STATUS_ERROR\n"); 385 ret = -EFAULT; 386 break; 387 } 388 } while (1); 389 390 stratix10_svc_done(priv->chan); 391 392 return ret; 393 } 394 395 static const struct fpga_manager_ops s10_ops = { 396 .write_init = s10_ops_write_init, 397 .write = s10_ops_write, 398 .write_complete = s10_ops_write_complete, 399 }; 400 401 static int s10_probe(struct platform_device *pdev) 402 { 403 struct device *dev = &pdev->dev; 404 struct s10_priv *priv; 405 struct fpga_manager *mgr; 406 int ret; 407 408 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 409 if (!priv) 410 return -ENOMEM; 411 412 priv->client.dev = dev; 413 priv->client.receive_cb = s10_receive_callback; 414 priv->client.priv = priv; 415 416 priv->chan = stratix10_svc_request_channel_byname(&priv->client, 417 SVC_CLIENT_FPGA); 418 if (IS_ERR(priv->chan)) { 419 dev_err(dev, "couldn't get service channel (%s)\n", 420 SVC_CLIENT_FPGA); 421 return PTR_ERR(priv->chan); 422 } 423 424 init_completion(&priv->status_return_completion); 425 426 mgr = fpga_mgr_register(dev, "Stratix10 SOC FPGA Manager", 427 &s10_ops, priv); 428 if (IS_ERR(mgr)) { 429 dev_err(dev, "unable to register FPGA manager\n"); 430 ret = PTR_ERR(mgr); 431 goto probe_err; 432 } 433 434 platform_set_drvdata(pdev, mgr); 435 return 0; 436 437 probe_err: 438 stratix10_svc_free_channel(priv->chan); 439 return ret; 440 } 441 442 static void s10_remove(struct platform_device *pdev) 443 { 444 struct fpga_manager *mgr = platform_get_drvdata(pdev); 445 struct s10_priv *priv = mgr->priv; 446 447 fpga_mgr_unregister(mgr); 448 stratix10_svc_free_channel(priv->chan); 449 } 450 451 static const struct of_device_id s10_of_match[] = { 452 {.compatible = "intel,stratix10-soc-fpga-mgr"}, 453 {.compatible = "intel,agilex-soc-fpga-mgr"}, 454 {}, 455 }; 456 457 MODULE_DEVICE_TABLE(of, s10_of_match); 458 459 static struct platform_driver s10_driver = { 460 .probe = s10_probe, 461 .remove = s10_remove, 462 .driver = { 463 .name = "Stratix10 SoC FPGA manager", 464 .of_match_table = of_match_ptr(s10_of_match), 465 }, 466 }; 467 468 static int __init s10_init(void) 469 { 470 struct device_node *fw_np; 471 struct device_node *np; 472 int ret; 473 474 fw_np = of_find_node_by_name(NULL, "svc"); 475 if (!fw_np) 476 return -ENODEV; 477 478 of_node_get(fw_np); 479 np = of_find_matching_node(fw_np, s10_of_match); 480 if (!np) { 481 of_node_put(fw_np); 482 return -ENODEV; 483 } 484 485 of_node_put(np); 486 ret = of_platform_populate(fw_np, s10_of_match, NULL, NULL); 487 of_node_put(fw_np); 488 if (ret) 489 return ret; 490 491 return platform_driver_register(&s10_driver); 492 } 493 494 static void __exit s10_exit(void) 495 { 496 return platform_driver_unregister(&s10_driver); 497 } 498 499 module_init(s10_init); 500 module_exit(s10_exit); 501 502 MODULE_AUTHOR("Alan Tull <atull@kernel.org>"); 503 MODULE_DESCRIPTION("Intel Stratix 10 SOC FPGA Manager"); 504 MODULE_LICENSE("GPL v2"); 505