regmap-debugfs.c 16.2 KB
Newer Older
1
2
3
4
5
6
7
// SPDX-License-Identifier: GPL-2.0
//
// Register map access API - debugfs
//
// Copyright 2011 Wolfson Microelectronics plc
//
// Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
8
9
10
11
12

#include <linux/slab.h>
#include <linux/mutex.h>
#include <linux/debugfs.h>
#include <linux/uaccess.h>
13
#include <linux/device.h>
14
#include <linux/list.h>
15
16
17

#include "internal.h"

18
19
20
21
22
23
struct regmap_debugfs_node {
	struct regmap *map;
	const char *name;
	struct list_head link;
};

24
static unsigned int dummy_index;
25
static struct dentry *regmap_debugfs_root;
26
27
static LIST_HEAD(regmap_debugfs_early_list);
static DEFINE_MUTEX(regmap_debugfs_early_lock);
28

29
/* Calculate the length of a fixed format  */
30
static size_t regmap_calc_reg_len(int max_val)
31
{
32
	return snprintf(NULL, 0, "%x", max_val);
33
34
}

35
36
37
38
39
static ssize_t regmap_name_read_file(struct file *file,
				     char __user *user_buf, size_t count,
				     loff_t *ppos)
{
	struct regmap *map = file->private_data;
40
	const char *name = "nodev";
41
42
43
44
45
46
47
	int ret;
	char *buf;

	buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

48
49
50
51
	if (map->dev && map->dev->driver)
		name = map->dev->driver->name;

	ret = snprintf(buf, PAGE_SIZE, "%s\n", name);
52
53
54
55
56
57
58
59
60
61
62
	if (ret < 0) {
		kfree(buf);
		return ret;
	}

	ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
	kfree(buf);
	return ret;
}

static const struct file_operations regmap_name_fops = {
63
	.open = simple_open,
64
65
66
67
	.read = regmap_name_read_file,
	.llseek = default_llseek,
};

68
69
70
71
72
73
74
75
76
77
78
79
80
static void regmap_debugfs_free_dump_cache(struct regmap *map)
{
	struct regmap_debugfs_off_cache *c;

	while (!list_empty(&map->debugfs_off_cache)) {
		c = list_first_entry(&map->debugfs_off_cache,
				     struct regmap_debugfs_off_cache,
				     list);
		list_del(&c->list);
		kfree(c);
	}
}

81
82
83
84
85
86
87
88
89
90
91
static bool regmap_printable(struct regmap *map, unsigned int reg)
{
	if (regmap_precious(map, reg))
		return false;

	if (!regmap_readable(map, reg) && !regmap_cached(map, reg))
		return false;

	return true;
}

92
93
94
95
96
97
98
99
100
/*
 * Work out where the start offset maps into register numbers, bearing
 * in mind that we suppress hidden registers.
 */
static unsigned int regmap_debugfs_get_dump_start(struct regmap *map,
						  unsigned int base,
						  loff_t from,
						  loff_t *pos)
{
101
102
103
	struct regmap_debugfs_off_cache *c = NULL;
	loff_t p = 0;
	unsigned int i, ret;
104
105
	unsigned int fpos_offset;
	unsigned int reg_offset;
106

107
	/* Suppress the cache if we're using a subrange */
108
109
	if (base)
		return base;
110

111
112
113
114
	/*
	 * If we don't have a cache build one so we don't have to do a
	 * linear scan each time.
	 */
115
	mutex_lock(&map->cache_lock);
116
	i = base;
117
	if (list_empty(&map->debugfs_off_cache)) {
118
		for (; i <= map->max_register; i += map->reg_stride) {
119
			/* Skip unprinted registers, closing off cache entry */
120
			if (!regmap_printable(map, i)) {
121
122
				if (c) {
					c->max = p - 1;
123
					c->max_reg = i - map->reg_stride;
124
125
126
127
128
129
130
131
132
133
134
					list_add_tail(&c->list,
						      &map->debugfs_off_cache);
					c = NULL;
				}

				continue;
			}

			/* No cache entry?  Start a new one */
			if (!c) {
				c = kzalloc(sizeof(*c), GFP_KERNEL);
135
136
				if (!c) {
					regmap_debugfs_free_dump_cache(map);
137
					mutex_unlock(&map->cache_lock);
138
139
					return base;
				}
140
141
142
143
144
145
146
				c->min = p;
				c->base_reg = i;
			}

			p += map->debugfs_tot_len;
		}
	}
147

148
149
150
	/* Close the last entry off if we didn't scan beyond it */
	if (c) {
		c->max = p - 1;
151
		c->max_reg = i - map->reg_stride;
152
153
154
155
		list_add_tail(&c->list,
			      &map->debugfs_off_cache);
	}

156
157
158
159
160
	/*
	 * This should never happen; we return above if we fail to
	 * allocate and we should never be in this code if there are
	 * no registers at all.
	 */
161
162
	WARN_ON(list_empty(&map->debugfs_off_cache));
	ret = base;
163

164
	/* Find the relevant block:offset */
165
	list_for_each_entry(c, &map->debugfs_off_cache, list) {
166
		if (from >= c->min && from <= c->max) {
167
168
169
			fpos_offset = from - c->min;
			reg_offset = fpos_offset / map->debugfs_tot_len;
			*pos = c->min + (reg_offset * map->debugfs_tot_len);
170
			mutex_unlock(&map->cache_lock);
171
			return c->base_reg + (reg_offset * map->reg_stride);
172
173
		}

174
175
		*pos = c->max;
		ret = c->max_reg;
176
	}
177
	mutex_unlock(&map->cache_lock);
178

179
	return ret;
180
181
}

182
183
184
185
186
static inline void regmap_calc_tot_len(struct regmap *map,
				       void *buf, size_t count)
{
	/* Calculate the length of a fixed format  */
	if (!map->debugfs_tot_len) {
187
		map->debugfs_reg_len = regmap_calc_reg_len(map->max_register),
188
189
190
191
192
193
		map->debugfs_val_len = 2 * map->format.val_bytes;
		map->debugfs_tot_len = map->debugfs_reg_len +
			map->debugfs_val_len + 3;      /* : \n */
	}
}

194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
static int regmap_next_readable_reg(struct regmap *map, int reg)
{
	struct regmap_debugfs_off_cache *c;
	int ret = -EINVAL;

	if (regmap_printable(map, reg + map->reg_stride)) {
		ret = reg + map->reg_stride;
	} else {
		mutex_lock(&map->cache_lock);
		list_for_each_entry(c, &map->debugfs_off_cache, list) {
			if (reg > c->max_reg)
				continue;
			if (reg < c->base_reg) {
				ret = c->base_reg;
				break;
			}
		}
		mutex_unlock(&map->cache_lock);
	}
	return ret;
}

216
217
218
static ssize_t regmap_read_debugfs(struct regmap *map, unsigned int from,
				   unsigned int to, char __user *user_buf,
				   size_t count, loff_t *ppos)
219
220
{
	size_t buf_pos = 0;
221
	loff_t p = *ppos;
222
223
224
	ssize_t ret;
	int i;
	char *buf;
225
	unsigned int val, start_reg;
226
227
228
229
230
231
232
233

	if (*ppos < 0 || !count)
		return -EINVAL;

	buf = kmalloc(count, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

234
	regmap_calc_tot_len(map, buf, count);
235

236
237
238
	/* Work out which register we're starting at */
	start_reg = regmap_debugfs_get_dump_start(map, from, *ppos, &p);

239
240
	for (i = start_reg; i >= 0 && i <= to;
	     i = regmap_next_readable_reg(map, i)) {
241

242
243
244
		/* If we're in the region the user is trying to read */
		if (p >= *ppos) {
			/* ...but not beyond it */
245
			if (buf_pos + map->debugfs_tot_len > count)
246
247
248
249
				break;

			/* Format the register */
			snprintf(buf + buf_pos, count - buf_pos, "%.*x: ",
250
251
				 map->debugfs_reg_len, i - from);
			buf_pos += map->debugfs_reg_len + 2;
252
253
254
255
256

			/* Format the value, write all X if we can't read */
			ret = regmap_read(map, i, &val);
			if (ret == 0)
				snprintf(buf + buf_pos, count - buf_pos,
257
					 "%.*x", map->debugfs_val_len, val);
258
			else
259
260
				memset(buf + buf_pos, 'X',
				       map->debugfs_val_len);
261
262
263
264
			buf_pos += 2 * map->format.val_bytes;

			buf[buf_pos++] = '\n';
		}
265
		p += map->debugfs_tot_len;
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
	}

	ret = buf_pos;

	if (copy_to_user(user_buf, buf, buf_pos)) {
		ret = -EFAULT;
		goto out;
	}

	*ppos += buf_pos;

out:
	kfree(buf);
	return ret;
}

282
283
284
285
286
287
288
289
290
static ssize_t regmap_map_read_file(struct file *file, char __user *user_buf,
				    size_t count, loff_t *ppos)
{
	struct regmap *map = file->private_data;

	return regmap_read_debugfs(map, 0, map->max_register, user_buf,
				   count, ppos);
}

291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
#undef REGMAP_ALLOW_WRITE_DEBUGFS
#ifdef REGMAP_ALLOW_WRITE_DEBUGFS
/*
 * This can be dangerous especially when we have clients such as
 * PMICs, therefore don't provide any real compile time configuration option
 * for this feature, people who want to use this will need to modify
 * the source code directly.
 */
static ssize_t regmap_map_write_file(struct file *file,
				     const char __user *user_buf,
				     size_t count, loff_t *ppos)
{
	char buf[32];
	size_t buf_size;
	char *start = buf;
	unsigned long reg, value;
	struct regmap *map = file->private_data;
308
	int ret;
309
310
311
312
313
314
315
316
317
318
319

	buf_size = min(count, (sizeof(buf)-1));
	if (copy_from_user(buf, user_buf, buf_size))
		return -EFAULT;
	buf[buf_size] = 0;

	while (*start == ' ')
		start++;
	reg = simple_strtoul(start, &start, 16);
	while (*start == ' ')
		start++;
320
	if (kstrtoul(start, 16, &value))
321
322
323
		return -EINVAL;

	/* Userspace has been fiddling around behind the kernel's back */
324
	add_taint(TAINT_USER, LOCKDEP_STILL_OK);
325

326
327
328
	ret = regmap_write(map, reg, value);
	if (ret < 0)
		return ret;
329
330
331
332
333
334
	return buf_size;
}
#else
#define regmap_map_write_file NULL
#endif

335
static const struct file_operations regmap_map_fops = {
336
	.open = simple_open,
337
	.read = regmap_map_read_file,
338
	.write = regmap_map_write_file,
339
340
341
	.llseek = default_llseek,
};

342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
static ssize_t regmap_range_read_file(struct file *file, char __user *user_buf,
				      size_t count, loff_t *ppos)
{
	struct regmap_range_node *range = file->private_data;
	struct regmap *map = range->map;

	return regmap_read_debugfs(map, range->range_min, range->range_max,
				   user_buf, count, ppos);
}

static const struct file_operations regmap_range_fops = {
	.open = simple_open,
	.read = regmap_range_read_file,
	.llseek = default_llseek,
};

358
359
360
361
362
363
364
365
366
367
368
static ssize_t regmap_reg_ranges_read_file(struct file *file,
					   char __user *user_buf, size_t count,
					   loff_t *ppos)
{
	struct regmap *map = file->private_data;
	struct regmap_debugfs_off_cache *c;
	loff_t p = 0;
	size_t buf_pos = 0;
	char *buf;
	char *entry;
	int ret;
369
	unsigned entry_len;
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396

	if (*ppos < 0 || !count)
		return -EINVAL;

	buf = kmalloc(count, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

	entry = kmalloc(PAGE_SIZE, GFP_KERNEL);
	if (!entry) {
		kfree(buf);
		return -ENOMEM;
	}

	/* While we are at it, build the register dump cache
	 * now so the read() operation on the `registers' file
	 * can benefit from using the cache.  We do not care
	 * about the file position information that is contained
	 * in the cache, just about the actual register blocks */
	regmap_calc_tot_len(map, buf, count);
	regmap_debugfs_get_dump_start(map, 0, *ppos, &p);

	/* Reset file pointer as the fixed-format of the `registers'
	 * file is not compatible with the `range' file */
	p = 0;
	mutex_lock(&map->cache_lock);
	list_for_each_entry(c, &map->debugfs_off_cache, list) {
397
		entry_len = snprintf(entry, PAGE_SIZE, "%x-%x\n",
398
				     c->base_reg, c->max_reg);
399
		if (p >= *ppos) {
400
			if (buf_pos + entry_len > count)
401
				break;
402
			memcpy(buf + buf_pos, entry, entry_len);
403
			buf_pos += entry_len;
404
		}
405
		p += entry_len;
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
	}
	mutex_unlock(&map->cache_lock);

	kfree(entry);
	ret = buf_pos;

	if (copy_to_user(user_buf, buf, buf_pos)) {
		ret = -EFAULT;
		goto out_buf;
	}

	*ppos += buf_pos;
out_buf:
	kfree(buf);
	return ret;
}

static const struct file_operations regmap_reg_ranges_fops = {
	.open = simple_open,
	.read = regmap_reg_ranges_read_file,
	.llseek = default_llseek,
};

429
static int regmap_access_show(struct seq_file *s, void *ignored)
430
{
431
432
	struct regmap *map = s->private;
	int i, reg_len;
433

434
	reg_len = regmap_calc_reg_len(map->max_register);
435

436
	for (i = 0; i <= map->max_register; i += map->reg_stride) {
437
438
439
440
		/* Ignore registers which are neither readable nor writable */
		if (!regmap_readable(map, i) && !regmap_writeable(map, i))
			continue;

441
442
443
444
445
446
		/* Format the register */
		seq_printf(s, "%.*x: %c %c %c %c\n", reg_len, i,
			   regmap_readable(map, i) ? 'y' : 'n',
			   regmap_writeable(map, i) ? 'y' : 'n',
			   regmap_volatile(map, i) ? 'y' : 'n',
			   regmap_precious(map, i) ? 'y' : 'n');
447
448
	}

449
450
	return 0;
}
451

452
DEFINE_SHOW_ATTRIBUTE(regmap_access);
453

454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
static ssize_t regmap_cache_only_write_file(struct file *file,
					    const char __user *user_buf,
					    size_t count, loff_t *ppos)
{
	struct regmap *map = container_of(file->private_data,
					  struct regmap, cache_only);
	ssize_t result;
	bool was_enabled, require_sync = false;
	int err;

	map->lock(map->lock_arg);

	was_enabled = map->cache_only;

	result = debugfs_write_file_bool(file, user_buf, count, ppos);
	if (result < 0) {
		map->unlock(map->lock_arg);
		return result;
	}

	if (map->cache_only && !was_enabled) {
		dev_warn(map->dev, "debugfs cache_only=Y forced\n");
		add_taint(TAINT_USER, LOCKDEP_STILL_OK);
	} else if (!map->cache_only && was_enabled) {
		dev_warn(map->dev, "debugfs cache_only=N forced: syncing cache\n");
		require_sync = true;
	}

	map->unlock(map->lock_arg);

	if (require_sync) {
		err = regcache_sync(map);
		if (err)
			dev_err(map->dev, "Failed to sync cache %d\n", err);
	}

	return result;
}

static const struct file_operations regmap_cache_only_fops = {
	.open = simple_open,
	.read = debugfs_read_file_bool,
	.write = regmap_cache_only_write_file,
};

static ssize_t regmap_cache_bypass_write_file(struct file *file,
					      const char __user *user_buf,
					      size_t count, loff_t *ppos)
{
	struct regmap *map = container_of(file->private_data,
					  struct regmap, cache_bypass);
	ssize_t result;
	bool was_enabled;

	map->lock(map->lock_arg);

	was_enabled = map->cache_bypass;

	result = debugfs_write_file_bool(file, user_buf, count, ppos);
	if (result < 0)
		goto out;

	if (map->cache_bypass && !was_enabled) {
		dev_warn(map->dev, "debugfs cache_bypass=Y forced\n");
		add_taint(TAINT_USER, LOCKDEP_STILL_OK);
	} else if (!map->cache_bypass && was_enabled) {
		dev_warn(map->dev, "debugfs cache_bypass=N forced\n");
	}

out:
	map->unlock(map->lock_arg);

	return result;
}

static const struct file_operations regmap_cache_bypass_fops = {
	.open = simple_open,
	.read = debugfs_read_file_bool,
	.write = regmap_cache_bypass_write_file,
};

535
void regmap_debugfs_init(struct regmap *map, const char *name)
536
{
537
538
	struct rb_node *next;
	struct regmap_range_node *range_node;
539
	const char *devname = "dummy";
540

541
542
543
544
545
546
547
	/*
	 * Userspace can initiate reads from the hardware over debugfs.
	 * Normally internal regmap structures and buffers are protected with
	 * a mutex or a spinlock, but if the regmap owner decided to disable
	 * all locking mechanisms, this is no longer the case. For safety:
	 * don't create the debugfs entries if locking is disabled.
	 */
548
549
	if (map->debugfs_disable) {
		dev_dbg(map->dev, "regmap locking disabled - not creating debugfs entries\n");
550
		return;
551
	}
552

553
554
555
556
557
558
559
560
561
562
563
564
565
566
	/* If we don't have the debugfs root yet, postpone init */
	if (!regmap_debugfs_root) {
		struct regmap_debugfs_node *node;
		node = kzalloc(sizeof(*node), GFP_KERNEL);
		if (!node)
			return;
		node->map = map;
		node->name = name;
		mutex_lock(&regmap_debugfs_early_lock);
		list_add(&node->link, &regmap_debugfs_early_list);
		mutex_unlock(&regmap_debugfs_early_lock);
		return;
	}

567
	INIT_LIST_HEAD(&map->debugfs_off_cache);
568
	mutex_init(&map->cache_lock);
569

570
571
572
	if (map->dev)
		devname = dev_name(map->dev);

573
574
	if (name) {
		map->debugfs_name = kasprintf(GFP_KERNEL, "%s-%s",
575
					      devname, name);
576
577
		name = map->debugfs_name;
	} else {
578
		name = devname;
579
580
	}

581
	if (!strcmp(name, "dummy")) {
582
583
		kfree(map->debugfs_name);

584
585
586
		map->debugfs_name = kasprintf(GFP_KERNEL, "dummy%d",
						dummy_index);
		name = map->debugfs_name;
587
588
589
		dummy_index++;
	}

590
	map->debugfs = debugfs_create_dir(name, regmap_debugfs_root);
591

592
593
594
	debugfs_create_file("name", 0400, map->debugfs,
			    map, &regmap_name_fops);

595
596
597
	debugfs_create_file("range", 0400, map->debugfs,
			    map, &regmap_reg_ranges_fops);

598
	if (map->max_register || regmap_readable(map, 0)) {
599
600
		umode_t registers_mode;

601
602
603
604
605
#if defined(REGMAP_ALLOW_WRITE_DEBUGFS)
		registers_mode = 0600;
#else
		registers_mode = 0400;
#endif
606
607

		debugfs_create_file("registers", registers_mode, map->debugfs,
608
				    map, &regmap_map_fops);
609
610
611
		debugfs_create_file("access", 0400, map->debugfs,
				    map, &regmap_access_fops);
	}
612
613

	if (map->cache_type) {
614
615
		debugfs_create_file("cache_only", 0600, map->debugfs,
				    &map->cache_only, &regmap_cache_only_fops);
616
617
		debugfs_create_bool("cache_dirty", 0400, map->debugfs,
				    &map->cache_dirty);
618
619
620
		debugfs_create_file("cache_bypass", 0600, map->debugfs,
				    &map->cache_bypass,
				    &regmap_cache_bypass_fops);
621
	}
622
623
624
625
626
627
628
629
630
631
632
633

	next = rb_first(&map->range_tree);
	while (next) {
		range_node = rb_entry(next, struct regmap_range_node, node);

		if (range_node->name)
			debugfs_create_file(range_node->name, 0400,
					    map->debugfs, range_node,
					    &regmap_range_fops);

		next = rb_next(&range_node->node);
	}
634
635
636

	if (map->cache_ops && map->cache_ops->debugfs_init)
		map->cache_ops->debugfs_init(map);
637
638
639
640
}

void regmap_debugfs_exit(struct regmap *map)
{
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
	if (map->debugfs) {
		debugfs_remove_recursive(map->debugfs);
		mutex_lock(&map->cache_lock);
		regmap_debugfs_free_dump_cache(map);
		mutex_unlock(&map->cache_lock);
		kfree(map->debugfs_name);
	} else {
		struct regmap_debugfs_node *node, *tmp;

		mutex_lock(&regmap_debugfs_early_lock);
		list_for_each_entry_safe(node, tmp, &regmap_debugfs_early_list,
					 link) {
			if (node->map == map) {
				list_del(&node->link);
				kfree(node);
			}
		}
		mutex_unlock(&regmap_debugfs_early_lock);
	}
660
661
662
663
}

void regmap_debugfs_initcall(void)
{
664
665
	struct regmap_debugfs_node *node, *tmp;

666
	regmap_debugfs_root = debugfs_create_dir("regmap", NULL);
667
668
669
670
671
672
673
674

	mutex_lock(&regmap_debugfs_early_lock);
	list_for_each_entry_safe(node, tmp, &regmap_debugfs_early_list, link) {
		regmap_debugfs_init(node->map, node->name);
		list_del(&node->link);
		kfree(node);
	}
	mutex_unlock(&regmap_debugfs_early_lock);
675
}