@@ -136,9 +136,10 @@ static int sdw_slave_reg_show(struct seq_file *s_file, void *data)
136
136
}
137
137
DEFINE_SHOW_ATTRIBUTE (sdw_slave_reg );
138
138
139
- #define MAX_CMD_BYTES 256
139
+ #define MAX_CMD_BYTES (1024 * 1024)
140
140
141
141
static int cmd ;
142
+ static int cmd_type ;
142
143
static u32 start_addr ;
143
144
static size_t num_bytes ;
144
145
static u8 read_buffer [MAX_CMD_BYTES ];
@@ -162,6 +163,25 @@ static int set_command(void *data, u64 value)
162
163
DEFINE_DEBUGFS_ATTRIBUTE (set_command_fops , NULL ,
163
164
set_command , "%llu\n" );
164
165
166
+ static int set_command_type (void * data , u64 value )
167
+ {
168
+ struct sdw_slave * slave = data ;
169
+
170
+ if (value > 1 )
171
+ return - EINVAL ;
172
+
173
+ /* Userspace changed the hardware state behind the kernel's back */
174
+ add_taint (TAINT_USER , LOCKDEP_STILL_OK );
175
+
176
+ dev_dbg (& slave -> dev , "command type: %s\n" , value ? "BRA" : "Column0" );
177
+
178
+ cmd_type = (int )value ;
179
+
180
+ return 0 ;
181
+ }
182
+ DEFINE_DEBUGFS_ATTRIBUTE (set_command_type_fops , NULL ,
183
+ set_command_type , "%llu\n" );
184
+
165
185
static int set_start_address (void * data , u64 value )
166
186
{
167
187
struct sdw_slave * slave = data ;
@@ -197,9 +217,28 @@ static int set_num_bytes(void *data, u64 value)
197
217
DEFINE_DEBUGFS_ATTRIBUTE (set_num_bytes_fops , NULL ,
198
218
set_num_bytes , "%llu\n" );
199
219
220
+ static int do_bpt_sequence (struct sdw_slave * slave , bool write , u8 * buffer )
221
+ {
222
+ struct sdw_bpt_msg msg = {0 };
223
+
224
+ msg .addr = start_addr ;
225
+ msg .len = num_bytes ;
226
+ msg .dev_num = slave -> dev_num ;
227
+ if (write )
228
+ msg .flags = SDW_MSG_FLAG_WRITE ;
229
+ else
230
+ msg .flags = SDW_MSG_FLAG_READ ;
231
+ msg .buf = buffer ;
232
+
233
+ return sdw_bpt_send_sync (slave -> bus , slave , & msg );
234
+ }
235
+
200
236
static int cmd_go (void * data , u64 value )
201
237
{
238
+ const struct firmware * fw = NULL ;
202
239
struct sdw_slave * slave = data ;
240
+ ktime_t start_t ;
241
+ ktime_t finish_t ;
203
242
int ret ;
204
243
205
244
if (value != 1 )
@@ -216,40 +255,52 @@ static int cmd_go(void *data, u64 value)
216
255
return ret ;
217
256
}
218
257
219
- /* Userspace changed the hardware state behind the kernel's back */
220
- add_taint (TAINT_USER , LOCKDEP_STILL_OK );
221
-
222
- dev_dbg (& slave -> dev , "starting command\n" );
223
-
224
258
if (cmd == 0 ) {
225
- const struct firmware * fw ;
226
-
227
259
ret = request_firmware (& fw , firmware_file , & slave -> dev );
228
260
if (ret < 0 ) {
229
261
dev_err (& slave -> dev , "firmware %s not found\n" , firmware_file );
230
262
goto out ;
231
263
}
232
-
233
- if (fw -> size != num_bytes ) {
264
+ if (fw -> size < num_bytes ) {
234
265
dev_err (& slave -> dev ,
235
- "firmware %s: unexpected size %zd, desired %zd\n" ,
266
+ "firmware %s: firmware size %zd, desired %zd\n" ,
236
267
firmware_file , fw -> size , num_bytes );
237
- release_firmware (fw );
238
268
goto out ;
239
269
}
270
+ }
240
271
241
- ret = sdw_nwrite_no_pm (slave , start_addr , num_bytes , fw -> data );
242
- release_firmware (fw );
272
+ /* Userspace changed the hardware state behind the kernel's back */
273
+ add_taint (TAINT_USER , LOCKDEP_STILL_OK );
274
+
275
+ dev_dbg (& slave -> dev , "starting command\n" );
276
+ start_t = ktime_get ();
277
+
278
+ if (cmd == 0 ) {
279
+ if (cmd_type )
280
+ ret = do_bpt_sequence (slave , true, (u8 * )fw -> data );
281
+ else
282
+ ret = sdw_nwrite_no_pm (slave , start_addr , num_bytes , fw -> data );
243
283
} else {
244
- ret = sdw_nread_no_pm (slave , start_addr , num_bytes , read_buffer );
284
+ memset (read_buffer , 0 , sizeof (read_buffer ));
285
+
286
+ if (cmd_type )
287
+ ret = do_bpt_sequence (slave , false, read_buffer );
288
+ else
289
+ ret = sdw_nread_no_pm (slave , start_addr , num_bytes , read_buffer );
245
290
}
246
291
247
- dev_dbg ( & slave -> dev , "command completed %d\n" , ret );
292
+ finish_t = ktime_get ( );
248
293
249
294
out :
295
+ if (fw )
296
+ release_firmware (fw );
297
+
250
298
pm_runtime_mark_last_busy (& slave -> dev );
251
299
pm_runtime_put (& slave -> dev );
252
300
301
+ dev_dbg (& slave -> dev , "command completed, num_byte %zu status %d, time %lld ms\n" ,
302
+ num_bytes , ret , div_u64 (finish_t - start_t , NSEC_PER_MSEC ));
303
+
253
304
return ret ;
254
305
}
255
306
DEFINE_DEBUGFS_ATTRIBUTE (cmd_go_fops , NULL ,
@@ -291,6 +342,7 @@ void sdw_slave_debugfs_init(struct sdw_slave *slave)
291
342
292
343
/* interface to send arbitrary commands */
293
344
debugfs_create_file ("command" , 0200 , d , slave , & set_command_fops );
345
+ debugfs_create_file ("command_type" , 0200 , d , slave , & set_command_type_fops );
294
346
debugfs_create_file ("start_address" , 0200 , d , slave , & set_start_address_fops );
295
347
debugfs_create_file ("num_bytes" , 0200 , d , slave , & set_num_bytes_fops );
296
348
debugfs_create_file ("go" , 0200 , d , slave , & cmd_go_fops );
0 commit comments