@@ -31,12 +31,50 @@ static char debugfs_buf[PAGE_SIZE];
31
31
32
32
#define PM_API (id ) {id, #id, strlen(#id)}
33
33
static struct pm_api_info pm_api_list [] = {
34
+ PM_API (PM_FORCE_POWERDOWN ),
35
+ PM_API (PM_REQUEST_WAKEUP ),
36
+ PM_API (PM_SYSTEM_SHUTDOWN ),
37
+ PM_API (PM_REQUEST_NODE ),
38
+ PM_API (PM_RELEASE_NODE ),
39
+ PM_API (PM_SET_REQUIREMENT ),
34
40
PM_API (PM_GET_API_VERSION ),
41
+ PM_API (PM_REGISTER_NOTIFIER ),
42
+ PM_API (PM_RESET_ASSERT ),
43
+ PM_API (PM_RESET_GET_STATUS ),
44
+ PM_API (PM_GET_CHIPID ),
45
+ PM_API (PM_PINCTRL_SET_FUNCTION ),
46
+ PM_API (PM_PINCTRL_CONFIG_PARAM_GET ),
47
+ PM_API (PM_PINCTRL_CONFIG_PARAM_SET ),
48
+ PM_API (PM_IOCTL ),
49
+ PM_API (PM_CLOCK_ENABLE ),
50
+ PM_API (PM_CLOCK_DISABLE ),
51
+ PM_API (PM_CLOCK_GETSTATE ),
52
+ PM_API (PM_CLOCK_SETDIVIDER ),
53
+ PM_API (PM_CLOCK_GETDIVIDER ),
54
+ PM_API (PM_CLOCK_SETPARENT ),
55
+ PM_API (PM_CLOCK_GETPARENT ),
35
56
PM_API (PM_QUERY_DATA ),
36
57
};
37
58
38
59
static struct dentry * firmware_debugfs_root ;
39
60
61
+ /**
62
+ * zynqmp_pm_ioctl - PM IOCTL for device control and configs
63
+ * @node: Node ID of the device
64
+ * @ioctl: ID of the requested IOCTL
65
+ * @arg1: Argument 1 of requested IOCTL call
66
+ * @arg2: Argument 2 of requested IOCTL call
67
+ * @arg3: Argument 3 of requested IOCTL call
68
+ * @out: Returned output value
69
+ *
70
+ * Return: Returns status, either success or error+reason
71
+ */
72
+ static int zynqmp_pm_ioctl (const u32 node , const u32 ioctl , const u32 arg1 ,
73
+ const u32 arg2 , const u32 arg3 , u32 * out )
74
+ {
75
+ return zynqmp_pm_invoke_fn (PM_IOCTL , out , 5 , node , ioctl , arg1 , arg2 , arg3 );
76
+ }
77
+
40
78
/**
41
79
* zynqmp_pm_argument_value() - Extract argument value from a PM-API request
42
80
* @arg: Entered PM-API argument in string format
@@ -95,6 +133,128 @@ static int process_api_request(u32 pm_id, u64 *pm_api_arg, u32 *pm_api_ret)
95
133
sprintf (debugfs_buf , "PM-API Version = %d.%d\n" ,
96
134
pm_api_version >> 16 , pm_api_version & 0xffff );
97
135
break ;
136
+ case PM_FORCE_POWERDOWN :
137
+ ret = zynqmp_pm_force_pwrdwn (pm_api_arg [0 ],
138
+ pm_api_arg [1 ] ? pm_api_arg [1 ] :
139
+ ZYNQMP_PM_REQUEST_ACK_NO );
140
+ break ;
141
+ case PM_REQUEST_WAKEUP :
142
+ ret = zynqmp_pm_request_wake (pm_api_arg [0 ],
143
+ pm_api_arg [1 ], pm_api_arg [2 ],
144
+ pm_api_arg [3 ] ? pm_api_arg [3 ] :
145
+ ZYNQMP_PM_REQUEST_ACK_NO );
146
+ break ;
147
+ case PM_SYSTEM_SHUTDOWN :
148
+ ret = zynqmp_pm_system_shutdown (pm_api_arg [0 ], pm_api_arg [1 ]);
149
+ break ;
150
+ case PM_REQUEST_NODE :
151
+ ret = zynqmp_pm_request_node (pm_api_arg [0 ],
152
+ pm_api_arg [1 ] ? pm_api_arg [1 ] :
153
+ ZYNQMP_PM_CAPABILITY_ACCESS ,
154
+ pm_api_arg [2 ] ? pm_api_arg [2 ] : 0 ,
155
+ pm_api_arg [3 ] ? pm_api_arg [3 ] :
156
+ ZYNQMP_PM_REQUEST_ACK_BLOCKING );
157
+ break ;
158
+ case PM_RELEASE_NODE :
159
+ ret = zynqmp_pm_release_node (pm_api_arg [0 ]);
160
+ break ;
161
+ case PM_SET_REQUIREMENT :
162
+ ret = zynqmp_pm_set_requirement (pm_api_arg [0 ],
163
+ pm_api_arg [1 ] ? pm_api_arg [1 ] :
164
+ ZYNQMP_PM_CAPABILITY_CONTEXT ,
165
+ pm_api_arg [2 ] ?
166
+ pm_api_arg [2 ] : 0 ,
167
+ pm_api_arg [3 ] ? pm_api_arg [3 ] :
168
+ ZYNQMP_PM_REQUEST_ACK_BLOCKING );
169
+ break ;
170
+ case PM_REGISTER_NOTIFIER :
171
+ ret = zynqmp_pm_register_notifier (pm_api_arg [0 ],
172
+ pm_api_arg [1 ] ?
173
+ pm_api_arg [1 ] : 0 ,
174
+ pm_api_arg [2 ] ?
175
+ pm_api_arg [2 ] : 0 ,
176
+ pm_api_arg [3 ] ?
177
+ pm_api_arg [3 ] : 0 );
178
+ break ;
179
+ case PM_RESET_ASSERT :
180
+ ret = zynqmp_pm_reset_assert (pm_api_arg [0 ], pm_api_arg [1 ]);
181
+ break ;
182
+ case PM_RESET_GET_STATUS :
183
+ ret = zynqmp_pm_reset_get_status (pm_api_arg [0 ], & pm_api_ret [0 ]);
184
+ if (!ret )
185
+ sprintf (debugfs_buf , "Reset status: %u\n" ,
186
+ pm_api_ret [0 ]);
187
+ break ;
188
+ case PM_GET_CHIPID :
189
+ ret = zynqmp_pm_get_chipid (& pm_api_ret [0 ], & pm_api_ret [1 ]);
190
+ if (!ret )
191
+ sprintf (debugfs_buf , "Idcode: %#x, Version:%#x\n" ,
192
+ pm_api_ret [0 ], pm_api_ret [1 ]);
193
+ break ;
194
+ case PM_PINCTRL_SET_FUNCTION :
195
+ ret = zynqmp_pm_pinctrl_set_function (pm_api_arg [0 ],
196
+ pm_api_arg [1 ]);
197
+ break ;
198
+ case PM_PINCTRL_CONFIG_PARAM_GET :
199
+ ret = zynqmp_pm_pinctrl_get_config (pm_api_arg [0 ], pm_api_arg [1 ],
200
+ & pm_api_ret [0 ]);
201
+ if (!ret )
202
+ sprintf (debugfs_buf ,
203
+ "Pin: %llu, Param: %llu, Value: %u\n" ,
204
+ pm_api_arg [0 ], pm_api_arg [1 ],
205
+ pm_api_ret [0 ]);
206
+ break ;
207
+ case PM_PINCTRL_CONFIG_PARAM_SET :
208
+ ret = zynqmp_pm_pinctrl_set_config (pm_api_arg [0 ],
209
+ pm_api_arg [1 ],
210
+ pm_api_arg [2 ]);
211
+ break ;
212
+ case PM_IOCTL :
213
+ ret = zynqmp_pm_ioctl (pm_api_arg [0 ], pm_api_arg [1 ],
214
+ pm_api_arg [2 ], pm_api_arg [3 ],
215
+ pm_api_arg [4 ], & pm_api_ret [0 ]);
216
+ if (!ret && (pm_api_arg [1 ] == IOCTL_GET_RPU_OPER_MODE ||
217
+ pm_api_arg [1 ] == IOCTL_GET_PLL_FRAC_MODE ||
218
+ pm_api_arg [1 ] == IOCTL_GET_PLL_FRAC_DATA ||
219
+ pm_api_arg [1 ] == IOCTL_READ_GGS ||
220
+ pm_api_arg [1 ] == IOCTL_READ_PGGS ||
221
+ pm_api_arg [1 ] == IOCTL_READ_REG ))
222
+ sprintf (debugfs_buf , "IOCTL return value: %u\n" ,
223
+ pm_api_ret [1 ]);
224
+ if (!ret && pm_api_arg [1 ] == IOCTL_GET_QOS )
225
+ sprintf (debugfs_buf , "Default QoS: %u\nCurrent QoS: %u\n" ,
226
+ pm_api_ret [1 ], pm_api_ret [2 ]);
227
+ break ;
228
+ case PM_CLOCK_ENABLE :
229
+ ret = zynqmp_pm_clock_enable (pm_api_arg [0 ]);
230
+ break ;
231
+ case PM_CLOCK_DISABLE :
232
+ ret = zynqmp_pm_clock_disable (pm_api_arg [0 ]);
233
+ break ;
234
+ case PM_CLOCK_GETSTATE :
235
+ ret = zynqmp_pm_clock_getstate (pm_api_arg [0 ], & pm_api_ret [0 ]);
236
+ if (!ret )
237
+ sprintf (debugfs_buf , "Clock state: %u\n" ,
238
+ pm_api_ret [0 ]);
239
+ break ;
240
+ case PM_CLOCK_SETDIVIDER :
241
+ ret = zynqmp_pm_clock_setdivider (pm_api_arg [0 ], pm_api_arg [1 ]);
242
+ break ;
243
+ case PM_CLOCK_GETDIVIDER :
244
+ ret = zynqmp_pm_clock_getdivider (pm_api_arg [0 ], & pm_api_ret [0 ]);
245
+ if (!ret )
246
+ sprintf (debugfs_buf , "Divider Value: %d\n" ,
247
+ pm_api_ret [0 ]);
248
+ break ;
249
+ case PM_CLOCK_SETPARENT :
250
+ ret = zynqmp_pm_clock_setparent (pm_api_arg [0 ], pm_api_arg [1 ]);
251
+ break ;
252
+ case PM_CLOCK_GETPARENT :
253
+ ret = zynqmp_pm_clock_getparent (pm_api_arg [0 ], & pm_api_ret [0 ]);
254
+ if (!ret )
255
+ sprintf (debugfs_buf ,
256
+ "Clock parent Index: %u\n" , pm_api_ret [0 ]);
257
+ break ;
98
258
case PM_QUERY_DATA :
99
259
qdata .qid = pm_api_arg [0 ];
100
260
qdata .arg1 = pm_api_arg [1 ];
@@ -150,7 +310,7 @@ static ssize_t zynqmp_pm_debugfs_api_write(struct file *file,
150
310
char * kern_buff , * tmp_buff ;
151
311
char * pm_api_req ;
152
312
u32 pm_id = 0 ;
153
- u64 pm_api_arg [4 ] = {0 , 0 , 0 , 0 };
313
+ u64 pm_api_arg [5 ] = {0 , 0 , 0 , 0 , 0 };
154
314
/* Return values from PM APIs calls */
155
315
u32 pm_api_ret [4 ] = {0 , 0 , 0 , 0 };
156
316
0 commit comments