xref: /OK3568_Linux_fs/kernel/drivers/soc/rockchip/rk_memblock_procfs.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Procfs for reserved memory blocks.
4  *
5  * Copyright (C) 2022 Rockchip Electronics Co. Ltd.
6  */
7 
8 #include <linux/init.h>
9 #include <linux/memblock.h>
10 #include <linux/proc_fs.h>
11 #include <linux/seq_file.h>
12 
13 #define K(size) ((unsigned long)((size) >> 10))
14 
memblock_procfs_show(struct seq_file * m,void * private)15 static int memblock_procfs_show(struct seq_file *m, void *private)
16 {
17 	struct memblock_type *type = m->private;
18 	struct memblock_region *reg;
19 	int i;
20 	phys_addr_t end;
21 	unsigned long z = 0, t = 0;
22 
23 	for (i = 0; i < type->cnt; i++) {
24 		reg = &type->regions[i];
25 		end = reg->base + reg->size - 1;
26 		z = (unsigned long)reg->size;
27 		t += z;
28 
29 		seq_printf(m, "%4d: ", i);
30 		seq_printf(m, "%pa..%pa (%10lu %s)\n", &reg->base, &end,
31 			   (z >= 1024) ? (K(z)) : z,
32 			   (z >= 1024) ? "KiB" : "Bytes");
33 	}
34 	seq_printf(m, "Total: %lu KiB\n", K(t));
35 
36 	return 0;
37 }
38 
rk_memblock_procfs_init(void)39 static int __init rk_memblock_procfs_init(void)
40 {
41 	struct proc_dir_entry *root = proc_mkdir("rk_memblock", NULL);
42 
43 	proc_create_single_data("memory", 0, root, memblock_procfs_show,
44 		&memblock.memory);
45 	proc_create_single_data("reserved", 0, root, memblock_procfs_show,
46 		&memblock.reserved);
47 
48 	return 0;
49 }
50 late_initcall_sync(rk_memblock_procfs_init);
51