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", ®->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