1 // SPDX-License-Identifier: GPL-2.0
3 * Microchip Polarfire SoC "Auto Update" FPGA reprogramming.
5 * Documentation of this functionality is available in the "PolarFire® FPGA and
6 * PolarFire SoC FPGA Programming" User Guide.
8 * Copyright (c) 2022-2023 Microchip Corporation. All rights reserved.
10 * Author: Conor Dooley <conor.dooley@microchip.com>
12 #include <linux/cleanup.h>
13 #include <linux/debugfs.h>
14 #include <linux/firmware.h>
15 #include <linux/math.h>
16 #include <linux/module.h>
17 #include <linux/mtd/mtd.h>
18 #include <linux/platform_device.h>
19 #include <linux/sizes.h>
21 #include <soc/microchip/mpfs.h>
23 #define AUTO_UPDATE_DEFAULT_MBOX_OFFSET 0u
24 #define AUTO_UPDATE_DEFAULT_RESP_OFFSET 0u
26 #define AUTO_UPDATE_FEATURE_CMD_OPCODE 0x05u
27 #define AUTO_UPDATE_FEATURE_CMD_DATA_SIZE 0u
28 #define AUTO_UPDATE_FEATURE_RESP_SIZE 33u
29 #define AUTO_UPDATE_FEATURE_CMD_DATA NULL
30 #define AUTO_UPDATE_FEATURE_ENABLED BIT(5)
32 #define AUTO_UPDATE_AUTHENTICATE_CMD_OPCODE 0x22u
33 #define AUTO_UPDATE_AUTHENTICATE_CMD_DATA_SIZE 0u
34 #define AUTO_UPDATE_AUTHENTICATE_RESP_SIZE 1u
35 #define AUTO_UPDATE_AUTHENTICATE_CMD_DATA NULL
37 #define AUTO_UPDATE_PROGRAM_CMD_OPCODE 0x46u
38 #define AUTO_UPDATE_PROGRAM_CMD_DATA_SIZE 0u
39 #define AUTO_UPDATE_PROGRAM_RESP_SIZE 1u
40 #define AUTO_UPDATE_PROGRAM_CMD_DATA NULL
43 * SPI Flash layout example:
44 * |------------------------------| 0x0000000
46 * | SPI "directories" |
47 * |------------------------------| 0x0000400
50 * | Used for bitstream info |
51 * |------------------------------| 0x0100400
54 * |------------------------------| 0x1500400
56 * | Auto Upgrade Image |
57 * |------------------------------| 0x2900400
59 * | Reserved for multi-image IAP |
60 * | Unused for Auto Upgrade |
61 * |------------------------------| 0x3D00400
64 * |------------------------------| 0x?
66 #define AUTO_UPDATE_DIRECTORY_BASE 0u
67 #define AUTO_UPDATE_DIRECTORY_WIDTH 4u
68 #define AUTO_UPDATE_GOLDEN_INDEX 0u
69 #define AUTO_UPDATE_UPGRADE_INDEX 1u
70 #define AUTO_UPDATE_BLANK_INDEX 2u
71 #define AUTO_UPDATE_GOLDEN_DIRECTORY (AUTO_UPDATE_DIRECTORY_WIDTH * AUTO_UPDATE_GOLDEN_INDEX)
72 #define AUTO_UPDATE_UPGRADE_DIRECTORY (AUTO_UPDATE_DIRECTORY_WIDTH * AUTO_UPDATE_UPGRADE_INDEX)
73 #define AUTO_UPDATE_BLANK_DIRECTORY (AUTO_UPDATE_DIRECTORY_WIDTH * AUTO_UPDATE_BLANK_INDEX)
74 #define AUTO_UPDATE_DIRECTORY_SIZE SZ_1K
75 #define AUTO_UPDATE_INFO_BASE AUTO_UPDATE_DIRECTORY_SIZE
76 #define AUTO_UPDATE_INFO_SIZE SZ_1M
77 #define AUTO_UPDATE_BITSTREAM_BASE (AUTO_UPDATE_DIRECTORY_SIZE + AUTO_UPDATE_INFO_SIZE)
79 struct mpfs_auto_update_priv
{
80 struct mpfs_sys_controller
*sys_controller
;
82 struct mtd_info
*flash
;
83 struct fw_upload
*fw_uploader
;
84 size_t size_per_bitstream
;
88 static bool mpfs_auto_update_is_bitstream_info(const u8
*data
, u32 size
)
93 if (data
[0] == 0x4d && data
[1] == 0x43 && data
[2] == 0x48 && data
[3] == 0x50)
99 static enum fw_upload_err
mpfs_auto_update_prepare(struct fw_upload
*fw_uploader
, const u8
*data
,
102 struct mpfs_auto_update_priv
*priv
= fw_uploader
->dd_handle
;
103 size_t erase_size
= AUTO_UPDATE_DIRECTORY_SIZE
;
106 * Verifying the Golden Image is idealistic. It will be evaluated
107 * against the currently programmed image and thus may fail - due to
108 * either rollback protection (if its an older version than that in use)
109 * or if the version is the same as that of the in-use image.
110 * Extracting the information as to why a failure occurred is not
111 * currently possible due to limitations of the system controller
112 * driver. If those are fixed, verification of the Golden Image should
116 priv
->flash
= mpfs_sys_controller_get_flash(priv
->sys_controller
);
118 return FW_UPLOAD_ERR_HW_ERROR
;
120 erase_size
= round_up(erase_size
, (u64
)priv
->flash
->erasesize
);
123 * We need to calculate if we have enough space in the flash for the
125 * First, chop off the first 1 KiB as it's reserved for the directory.
126 * The 1 MiB reserved for design info needs to be ignored also.
127 * All that remains is carved into 3 & rounded down to the erasesize.
128 * If this is smaller than the image size, we abort.
129 * There's also no need to consume more than 20 MiB per image.
131 priv
->size_per_bitstream
= priv
->flash
->size
- SZ_1K
- SZ_1M
;
132 priv
->size_per_bitstream
= round_down(priv
->size_per_bitstream
/ 3, erase_size
);
133 if (priv
->size_per_bitstream
> 20 * SZ_1M
)
134 priv
->size_per_bitstream
= 20 * SZ_1M
;
136 if (priv
->size_per_bitstream
< size
) {
138 "flash device has insufficient capacity to store this bitstream\n");
139 return FW_UPLOAD_ERR_INVALID_SIZE
;
142 priv
->cancel_request
= false;
144 return FW_UPLOAD_ERR_NONE
;
147 static void mpfs_auto_update_cancel(struct fw_upload
*fw_uploader
)
149 struct mpfs_auto_update_priv
*priv
= fw_uploader
->dd_handle
;
151 priv
->cancel_request
= true;
154 static enum fw_upload_err
mpfs_auto_update_poll_complete(struct fw_upload
*fw_uploader
)
156 return FW_UPLOAD_ERR_NONE
;
159 static int mpfs_auto_update_verify_image(struct fw_upload
*fw_uploader
)
161 struct mpfs_auto_update_priv
*priv
= fw_uploader
->dd_handle
;
162 u32
*response_msg
__free(kfree
) =
163 kzalloc(AUTO_UPDATE_FEATURE_RESP_SIZE
* sizeof(*response_msg
), GFP_KERNEL
);
164 struct mpfs_mss_response
*response
__free(kfree
) =
165 kzalloc(sizeof(struct mpfs_mss_response
), GFP_KERNEL
);
166 struct mpfs_mss_msg
*message
__free(kfree
) =
167 kzalloc(sizeof(struct mpfs_mss_msg
), GFP_KERNEL
);
170 if (!response_msg
|| !response
|| !message
)
174 * The system controller can verify that an image in the flash is valid.
175 * Rather than duplicate the check in this driver, call the relevant
176 * service from the system controller instead.
177 * This service has no command data and no response data. It overloads
178 * mbox_offset with the image index in the flash's SPI directory where
179 * the bitstream is located.
181 response
->resp_msg
= response_msg
;
182 response
->resp_size
= AUTO_UPDATE_AUTHENTICATE_RESP_SIZE
;
183 message
->cmd_opcode
= AUTO_UPDATE_AUTHENTICATE_CMD_OPCODE
;
184 message
->cmd_data_size
= AUTO_UPDATE_AUTHENTICATE_CMD_DATA_SIZE
;
185 message
->response
= response
;
186 message
->cmd_data
= AUTO_UPDATE_AUTHENTICATE_CMD_DATA
;
187 message
->mbox_offset
= AUTO_UPDATE_UPGRADE_INDEX
;
188 message
->resp_offset
= AUTO_UPDATE_DEFAULT_RESP_OFFSET
;
190 dev_info(priv
->dev
, "Running verification of Upgrade Image\n");
191 ret
= mpfs_blocking_transaction(priv
->sys_controller
, message
);
192 if (ret
| response
->resp_status
) {
193 dev_warn(priv
->dev
, "Verification of Upgrade Image failed!\n");
194 return ret
? ret
: -EBADMSG
;
197 dev_info(priv
->dev
, "Verification of Upgrade Image passed!\n");
202 static int mpfs_auto_update_set_image_address(struct mpfs_auto_update_priv
*priv
,
203 u32 image_address
, loff_t directory_address
)
205 struct erase_info erase
;
206 size_t erase_size
= round_up(AUTO_UPDATE_DIRECTORY_SIZE
, (u64
)priv
->flash
->erasesize
);
207 size_t bytes_written
= 0, bytes_read
= 0;
208 char *buffer
__free(kfree
) = kzalloc(erase_size
, GFP_KERNEL
);
214 erase
.addr
= AUTO_UPDATE_DIRECTORY_BASE
;
215 erase
.len
= erase_size
;
218 * We need to write the "SPI DIRECTORY" to the first 1 KiB, telling
219 * the system controller where to find the actual bitstream. Since
220 * this is spi-nor, we have to read the first eraseblock, erase that
221 * portion of the flash, modify the data and then write it back.
222 * There's no need to do this though if things are already the way they
223 * should be, so check and save the write in that case.
225 ret
= mtd_read(priv
->flash
, AUTO_UPDATE_DIRECTORY_BASE
, erase_size
, &bytes_read
,
230 if (bytes_read
!= erase_size
)
233 if ((*(u32
*)(buffer
+ AUTO_UPDATE_UPGRADE_DIRECTORY
) == image_address
) &&
234 !(*(u32
*)(buffer
+ AUTO_UPDATE_BLANK_DIRECTORY
)))
237 ret
= mtd_erase(priv
->flash
, &erase
);
242 * Populate the image address and then zero out the next directory so
243 * that the system controller doesn't complain if in "Single Image"
246 memcpy(buffer
+ AUTO_UPDATE_UPGRADE_DIRECTORY
, &image_address
,
247 AUTO_UPDATE_DIRECTORY_WIDTH
);
248 memset(buffer
+ AUTO_UPDATE_BLANK_DIRECTORY
, 0x0, AUTO_UPDATE_DIRECTORY_WIDTH
);
250 dev_info(priv
->dev
, "Writing the image address (0x%x) to the flash directory (0x%llx)\n",
251 image_address
, directory_address
);
253 ret
= mtd_write(priv
->flash
, 0x0, erase_size
, &bytes_written
, (u_char
*)buffer
);
257 if (bytes_written
!= erase_size
)
263 static int mpfs_auto_update_write_bitstream(struct fw_upload
*fw_uploader
, const u8
*data
,
264 u32 offset
, u32 size
, u32
*written
)
266 struct mpfs_auto_update_priv
*priv
= fw_uploader
->dd_handle
;
267 struct erase_info erase
;
268 loff_t directory_address
= AUTO_UPDATE_UPGRADE_DIRECTORY
;
269 size_t erase_size
= AUTO_UPDATE_DIRECTORY_SIZE
;
270 size_t bytes_written
= 0;
271 bool is_info
= mpfs_auto_update_is_bitstream_info(data
, size
);
275 erase_size
= round_up(erase_size
, (u64
)priv
->flash
->erasesize
);
278 image_address
= AUTO_UPDATE_INFO_BASE
;
280 image_address
= AUTO_UPDATE_BITSTREAM_BASE
+
281 AUTO_UPDATE_UPGRADE_INDEX
* priv
->size_per_bitstream
;
284 * For bitstream info, the descriptor is written to a fixed offset,
285 * so there is no need to set the image address.
288 ret
= mpfs_auto_update_set_image_address(priv
, image_address
, directory_address
);
290 dev_err(priv
->dev
, "failed to set image address in the SPI directory: %d\n", ret
);
294 if (size
> AUTO_UPDATE_INFO_SIZE
) {
295 dev_err(priv
->dev
, "bitstream info exceeds permitted size\n");
301 * Now the .spi image itself can be written to the flash. Preservation
302 * of contents here is not important here, unlike the spi "directory"
303 * which must be RMWed.
305 erase
.len
= round_up(size
, (size_t)priv
->flash
->erasesize
);
306 erase
.addr
= image_address
;
308 dev_info(priv
->dev
, "Erasing the flash at address (0x%x)\n", image_address
);
309 ret
= mtd_erase(priv
->flash
, &erase
);
314 * No parsing etc of the bitstream is required. The system controller
315 * will do all of that itself - including verifying that the bitstream
318 dev_info(priv
->dev
, "Writing the image to the flash at address (0x%x)\n", image_address
);
319 ret
= mtd_write(priv
->flash
, (loff_t
)image_address
, size
, &bytes_written
, data
);
323 if (bytes_written
!= size
)
326 *written
= bytes_written
;
327 dev_info(priv
->dev
, "Wrote 0x%zx bytes to the flash\n", bytes_written
);
332 static enum fw_upload_err
mpfs_auto_update_write(struct fw_upload
*fw_uploader
, const u8
*data
,
333 u32 offset
, u32 size
, u32
*written
)
335 struct mpfs_auto_update_priv
*priv
= fw_uploader
->dd_handle
;
338 ret
= mpfs_auto_update_write_bitstream(fw_uploader
, data
, offset
, size
, written
);
340 return FW_UPLOAD_ERR_RW_ERROR
;
342 if (priv
->cancel_request
)
343 return FW_UPLOAD_ERR_CANCELED
;
345 if (mpfs_auto_update_is_bitstream_info(data
, size
))
346 return FW_UPLOAD_ERR_NONE
;
348 ret
= mpfs_auto_update_verify_image(fw_uploader
);
350 return FW_UPLOAD_ERR_FW_INVALID
;
352 return FW_UPLOAD_ERR_NONE
;
355 static const struct fw_upload_ops mpfs_auto_update_ops
= {
356 .prepare
= mpfs_auto_update_prepare
,
357 .write
= mpfs_auto_update_write
,
358 .poll_complete
= mpfs_auto_update_poll_complete
,
359 .cancel
= mpfs_auto_update_cancel
,
362 static int mpfs_auto_update_available(struct mpfs_auto_update_priv
*priv
)
364 u32
*response_msg
__free(kfree
) =
365 kzalloc(AUTO_UPDATE_FEATURE_RESP_SIZE
* sizeof(*response_msg
), GFP_KERNEL
);
366 struct mpfs_mss_response
*response
__free(kfree
) =
367 kzalloc(sizeof(struct mpfs_mss_response
), GFP_KERNEL
);
368 struct mpfs_mss_msg
*message
__free(kfree
) =
369 kzalloc(sizeof(struct mpfs_mss_msg
), GFP_KERNEL
);
372 if (!response_msg
|| !response
|| !message
)
376 * To verify that Auto Update is possible, the "Query Security Service
377 * Request" is performed.
378 * This service has no command data & does not overload mbox_offset.
380 response
->resp_msg
= response_msg
;
381 response
->resp_size
= AUTO_UPDATE_FEATURE_RESP_SIZE
;
382 message
->cmd_opcode
= AUTO_UPDATE_FEATURE_CMD_OPCODE
;
383 message
->cmd_data_size
= AUTO_UPDATE_FEATURE_CMD_DATA_SIZE
;
384 message
->response
= response
;
385 message
->cmd_data
= AUTO_UPDATE_FEATURE_CMD_DATA
;
386 message
->mbox_offset
= AUTO_UPDATE_DEFAULT_MBOX_OFFSET
;
387 message
->resp_offset
= AUTO_UPDATE_DEFAULT_RESP_OFFSET
;
389 ret
= mpfs_blocking_transaction(priv
->sys_controller
, message
);
394 * Currently, the system controller's firmware does not generate any
395 * interrupts for failed services, so mpfs_blocking_transaction() should
396 * time out & therefore return an error.
397 * Hitting this check is highly unlikely at present, but if the system
398 * controller's behaviour changes so that it does generate interrupts
399 * for failed services, it will be required.
401 if (response
->resp_status
)
405 * Bit 5 of byte 1 is "UL_Auto Update" & if it is set, Auto Update is
408 if (response_msg
[1] & AUTO_UPDATE_FEATURE_ENABLED
)
414 static int mpfs_auto_update_probe(struct platform_device
*pdev
)
416 struct device
*dev
= &pdev
->dev
;
417 struct mpfs_auto_update_priv
*priv
;
418 struct fw_upload
*fw_uploader
;
421 priv
= devm_kzalloc(dev
, sizeof(*priv
), GFP_KERNEL
);
425 priv
->sys_controller
= mpfs_sys_controller_get(dev
);
426 if (IS_ERR(priv
->sys_controller
))
427 return dev_err_probe(dev
, PTR_ERR(priv
->sys_controller
),
428 "Could not register as a sub device of the system controller\n");
431 platform_set_drvdata(pdev
, priv
);
433 ret
= mpfs_auto_update_available(priv
);
435 return dev_err_probe(dev
, ret
,
436 "The current bitstream does not support auto-update\n");
438 fw_uploader
= firmware_upload_register(THIS_MODULE
, dev
, "mpfs-auto-update",
439 &mpfs_auto_update_ops
, priv
);
440 if (IS_ERR(fw_uploader
))
441 return dev_err_probe(dev
, PTR_ERR(fw_uploader
),
442 "Failed to register the bitstream uploader\n");
444 priv
->fw_uploader
= fw_uploader
;
449 static void mpfs_auto_update_remove(struct platform_device
*pdev
)
451 struct mpfs_auto_update_priv
*priv
= platform_get_drvdata(pdev
);
453 firmware_upload_unregister(priv
->fw_uploader
);
456 static struct platform_driver mpfs_auto_update_driver
= {
458 .name
= "mpfs-auto-update",
460 .probe
= mpfs_auto_update_probe
,
461 .remove
= mpfs_auto_update_remove
,
463 module_platform_driver(mpfs_auto_update_driver
);
465 MODULE_LICENSE("GPL");
466 MODULE_AUTHOR("Conor Dooley <conor.dooley@microchip.com>");
467 MODULE_DESCRIPTION("PolarFire SoC Auto Update FPGA reprogramming");