Skip to content

Commit 461011b

Browse files
Ravi PatelMichal Simek
authored andcommitted
drivers: firmware: xilinx: Add support for feature check
Query for corresponding feature before calling EEMI API from the driver. Signed-off-by: Ravi Patel <[email protected]> Signed-off-by: Michal Simek <[email protected]> Signed-off-by: Rajan Vaja <[email protected]>
1 parent e42617b commit 461011b

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

drivers/firmware/xilinx/zynqmp.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626

2727
static const struct zynqmp_eemi_ops *eemi_ops_tbl;
2828

29+
static bool feature_check_enabled;
30+
static u32 zynqmp_pm_features[PM_API_MAX];
31+
2932
static const struct mfd_cell firmware_devs[] = {
3033
{
3134
.name = "zynqmp_power_controller",
@@ -44,6 +47,8 @@ static int zynqmp_pm_ret_code(u32 ret_status)
4447
case XST_PM_SUCCESS:
4548
case XST_PM_DOUBLE_REQ:
4649
return 0;
50+
case XST_PM_NO_FEATURE:
51+
return -ENOTSUPP;
4752
case XST_PM_NO_ACCESS:
4853
return -EACCES;
4954
case XST_PM_ABORT_SUSPEND:
@@ -126,6 +131,39 @@ static noinline int do_fw_call_hvc(u64 arg0, u64 arg1, u64 arg2,
126131
return zynqmp_pm_ret_code((enum pm_ret_status)res.a0);
127132
}
128133

134+
/**
135+
* zynqmp_pm_feature() - Check weather given feature is supported or not
136+
* @api_id: API ID to check
137+
*
138+
* Return: Returns status, either success or error+reason
139+
*/
140+
static int zynqmp_pm_feature(u32 api_id)
141+
{
142+
int ret;
143+
u32 ret_payload[PAYLOAD_ARG_CNT];
144+
u64 smc_arg[2];
145+
146+
if (!feature_check_enabled)
147+
return 0;
148+
149+
/* Return value if feature is already checked */
150+
if (zynqmp_pm_features[api_id] != PM_FEATURE_UNCHECKED)
151+
return zynqmp_pm_features[api_id];
152+
153+
smc_arg[0] = PM_SIP_SVC | PM_FEATURE_CHECK;
154+
smc_arg[1] = api_id;
155+
156+
ret = do_fw_call(smc_arg[0], smc_arg[1], 0, ret_payload);
157+
if (ret) {
158+
zynqmp_pm_features[api_id] = PM_FEATURE_INVALID;
159+
return PM_FEATURE_INVALID;
160+
}
161+
162+
zynqmp_pm_features[api_id] = ret_payload[1];
163+
164+
return zynqmp_pm_features[api_id];
165+
}
166+
129167
/**
130168
* zynqmp_pm_invoke_fn() - Invoke the system-level platform management layer
131169
* caller function depending on the configuration
@@ -160,6 +198,9 @@ int zynqmp_pm_invoke_fn(u32 pm_api_id, u32 arg0, u32 arg1,
160198
*/
161199
u64 smc_arg[4];
162200

201+
if (zynqmp_pm_feature(pm_api_id) == PM_FEATURE_INVALID)
202+
return -ENOTSUPP;
203+
163204
smc_arg[0] = PM_SIP_SVC | pm_api_id;
164205
smc_arg[1] = ((u64)arg1 << 32) | arg0;
165206
smc_arg[2] = ((u64)arg3 << 32) | arg2;
@@ -715,6 +756,8 @@ static int zynqmp_firmware_probe(struct platform_device *pdev)
715756
np = of_find_compatible_node(NULL, NULL, "xlnx,versal");
716757
if (!np)
717758
return 0;
759+
760+
feature_check_enabled = true;
718761
}
719762
of_node_put(np);
720763

include/linux/firmware/xlnx-zynqmp.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@
4848
#define ZYNQMP_PM_CAPABILITY_WAKEUP 0x4U
4949
#define ZYNQMP_PM_CAPABILITY_UNUSABLE 0x8U
5050

51+
/* Feature check status */
52+
#define PM_FEATURE_INVALID -1
53+
#define PM_FEATURE_UNCHECKED 0
54+
5155
/*
5256
* Firmware FPGA Manager flags
5357
* XILINX_ZYNQMP_PM_FPGA_FULL: FPGA full reconfiguration
@@ -78,11 +82,14 @@ enum pm_api_id {
7882
PM_CLOCK_GETRATE,
7983
PM_CLOCK_SETPARENT,
8084
PM_CLOCK_GETPARENT,
85+
PM_FEATURE_CHECK = 63,
86+
PM_API_MAX,
8187
};
8288

8389
/* PMU-FW return status codes */
8490
enum pm_ret_status {
8591
XST_PM_SUCCESS = 0,
92+
XST_PM_NO_FEATURE = 19,
8693
XST_PM_INTERNAL = 2000,
8794
XST_PM_CONFLICT,
8895
XST_PM_NO_ACCESS,

0 commit comments

Comments
 (0)