From af28ace6322496414ec031879e642eb834d4c484 Mon Sep 17 00:00:00 2001 From: Durga Challa Date: Thu, 11 Oct 2018 16:22:52 +0530 Subject: [PATCH] zynqmp: firmware: provides support to access efuse This patch adds support for accessing efuse memory from Linux. Signed-off-by: Durga Challa Signed-off-by: Michal Simek --- drivers/firmware/xilinx/zynqmp/firmware.c | 23 +++++++++++++++++++ .../linux/firmware/xilinx/zynqmp/firmware.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/drivers/firmware/xilinx/zynqmp/firmware.c b/drivers/firmware/xilinx/zynqmp/firmware.c index 6b8f53ddf7f5..b049d2c55ecb 100644 --- a/drivers/firmware/xilinx/zynqmp/firmware.c +++ b/drivers/firmware/xilinx/zynqmp/firmware.c @@ -1018,6 +1018,28 @@ static int zynqmp_pm_clock_getparent(u32 clock_id, u32 *parent_id) return ret; } +/** + * zynqmp_pm_efuse_access - Provides access to efuse memory. + * @address: Address of the efuse params structure + * @out: Returned output value + * + * Return: Returns status, either success or error code. + */ +static int zynqmp_pm_efuse_access(const u64 address, u32 *out) +{ + u32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + if (!out) + return -EINVAL; + + ret = zynqmp_pm_invoke_fn(PM_EFUSE_ACCESS, upper_32_bits(address), + lower_32_bits(address), 0, 0, ret_payload); + *out = ret_payload[1]; + + return ret; +} + static const struct zynqmp_eemi_ops eemi_ops = { .get_api_version = zynqmp_pm_get_api_version, .get_chipid = zynqmp_pm_get_chipid, @@ -1061,6 +1083,7 @@ static const struct zynqmp_eemi_ops eemi_ops = { .clock_getparent = zynqmp_pm_clock_getparent, .register_access = zynqmp_pm_config_reg_access, .aes = zynqmp_pm_aes_engine, + .efuse_access = zynqmp_pm_efuse_access, }; /** diff --git a/include/linux/firmware/xilinx/zynqmp/firmware.h b/include/linux/firmware/xilinx/zynqmp/firmware.h index c9ccdbf74bb2..ba048ad7b5a5 100644 --- a/include/linux/firmware/xilinx/zynqmp/firmware.h +++ b/include/linux/firmware/xilinx/zynqmp/firmware.h @@ -130,6 +130,7 @@ enum pm_api_id { PM_SECURE_AES, /* PM_REGISTER_ACCESS API */ PM_REGISTER_ACCESS = 52, + PM_EFUSE_ACCESS, }; /* PMU-FW return status codes */ @@ -605,6 +606,7 @@ struct zynqmp_eemi_ops { int (*register_access)(u32 register_access_id, u32 address, u32 mask, u32 value, u32 *out); int (*aes)(const u64 address, u32 *out); + int (*efuse_access)(const u64 address, u32 *out); }; /* -- 2.39.2