Extend the MAX10 BMC Secure Update driver to provide a handler to expose the flash update count for the FPGA user image in sysfs. Signed-off-by: Russ Weight <russell.h.weight@xxxxxxxxx> Reviewed-by: Tom Rix <trix@xxxxxxxxxx> --- v3: - Changed: iops -> sops, imgr -> smgr, IFPGA_ -> FPGA_, ifpga_ to fpga_ - Changed "MAX10 BMC Secure Engine driver" to "MAX10 BMC Secure Update driver" - Removed wrapper functions (m10bmc_raw_*, m10bmc_sys_*). The underlying functions are now called directly. v2: - Renamed get_qspi_flash_count() to m10bmc_user_flash_count() - Minor code cleanup per review comments - Added m10bmc_ prefix to functions in m10bmc_iops structure --- drivers/fpga/intel-m10-bmc-secure.c | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/drivers/fpga/intel-m10-bmc-secure.c b/drivers/fpga/intel-m10-bmc-secure.c index 433af08a9507..e1fb7f7aa3e2 100644 --- a/drivers/fpga/intel-m10-bmc-secure.c +++ b/drivers/fpga/intel-m10-bmc-secure.c @@ -11,6 +11,7 @@ #include <linux/mfd/intel-m10-bmc.h> #include <linux/module.h> #include <linux/platform_device.h> +#include <linux/slab.h> #include <linux/vmalloc.h> struct m10bmc_sec { @@ -106,7 +107,39 @@ static int m10bmc_pr_reh(struct fpga_sec_mgr *smgr, u8 *hash, return m10bmc_reh(smgr, PR_REH_ADDR, hash, size); } +#define FLASH_COUNT_SIZE 4096 /* count stored in inverted bit vector */ + +static int m10bmc_user_flash_count(struct fpga_sec_mgr *smgr) +{ + struct m10bmc_sec *sec = smgr->priv; + unsigned int stride = regmap_get_reg_stride(sec->m10bmc->regmap); + unsigned int num_bits = FLASH_COUNT_SIZE * 8; + u8 *flash_buf; + int ret; + + flash_buf = kmalloc(FLASH_COUNT_SIZE, GFP_KERNEL); + if (!flash_buf) + return -ENOMEM; + + ret = regmap_bulk_read(sec->m10bmc->regmap, USER_FLASH_COUNT, + flash_buf, FLASH_COUNT_SIZE / stride); + if (ret) { + dev_err(sec->dev, + "failed to read flash count: %x cnt %x: %d\n", + USER_FLASH_COUNT, FLASH_COUNT_SIZE / stride, ret); + goto exit_free; + } + + ret = num_bits - bitmap_weight((unsigned long *)flash_buf, num_bits); + +exit_free: + kfree(flash_buf); + + return ret; +} + static const struct fpga_sec_mgr_ops m10bmc_sops = { + .user_flash_count = m10bmc_user_flash_count, .bmc_root_entry_hash = m10bmc_bmc_reh, .sr_root_entry_hash = m10bmc_sr_reh, .pr_root_entry_hash = m10bmc_pr_reh, -- 2.17.1