1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2012 Russell King
4 * Rewritten from the dovefb driver, and Armada510 manuals.
7 #include <linux/ctype.h>
8 #include <linux/module.h>
9 #include <linux/seq_file.h>
10 #include <linux/uaccess.h>
12 #include <drm/drm_debugfs.h>
13 #include <drm/drm_file.h>
15 #include "armada_crtc.h"
16 #include "armada_drm.h"
18 static int armada_debugfs_gem_linear_show(struct seq_file
*m
, void *data
)
20 struct drm_info_node
*node
= m
->private;
21 struct drm_device
*dev
= node
->minor
->dev
;
22 struct armada_private
*priv
= drm_to_armada_dev(dev
);
23 struct drm_printer p
= drm_seq_file_printer(m
);
25 mutex_lock(&priv
->linear_lock
);
26 drm_mm_print(&priv
->linear
, &p
);
27 mutex_unlock(&priv
->linear_lock
);
32 static int armada_debugfs_crtc_reg_show(struct seq_file
*m
, void *data
)
34 struct armada_crtc
*dcrtc
= m
->private;
37 for (i
= 0x84; i
<= 0x1c4; i
+= 4) {
38 u32 v
= readl_relaxed(dcrtc
->base
+ i
);
39 seq_printf(m
, "0x%04x: 0x%08x\n", i
, v
);
45 static int armada_debugfs_crtc_reg_open(struct inode
*inode
, struct file
*file
)
47 return single_open(file
, armada_debugfs_crtc_reg_show
,
51 static int armada_debugfs_crtc_reg_write(struct file
*file
,
52 const char __user
*ptr
, size_t len
, loff_t
*off
)
54 struct armada_crtc
*dcrtc
;
55 unsigned long reg
, mask
, val
;
63 if (len
> sizeof(buf
) - 1)
64 len
= sizeof(buf
) - 1;
66 ret
= strncpy_from_user(buf
, ptr
, len
);
71 if (sscanf(buf
, "%lx %lx %lx", ®
, &mask
, &val
) != 3)
73 if (reg
< 0x84 || reg
> 0x1c4 || reg
& 3)
76 dcrtc
= ((struct seq_file
*)file
->private_data
)->private;
77 v
= readl(dcrtc
->base
+ reg
);
80 writel(v
, dcrtc
->base
+ reg
);
85 static const struct file_operations armada_debugfs_crtc_reg_fops
= {
87 .open
= armada_debugfs_crtc_reg_open
,
89 .write
= armada_debugfs_crtc_reg_write
,
91 .release
= single_release
,
94 void armada_drm_crtc_debugfs_init(struct armada_crtc
*dcrtc
)
96 debugfs_create_file("armada-regs", 0600, dcrtc
->crtc
.debugfs_entry
,
97 dcrtc
, &armada_debugfs_crtc_reg_fops
);
100 static struct drm_info_list armada_debugfs_list
[] = {
101 { "gem_linear", armada_debugfs_gem_linear_show
, 0 },
103 #define ARMADA_DEBUGFS_ENTRIES ARRAY_SIZE(armada_debugfs_list)
105 int armada_drm_debugfs_init(struct drm_minor
*minor
)
107 drm_debugfs_create_files(armada_debugfs_list
, ARMADA_DEBUGFS_ENTRIES
,
108 minor
->debugfs_root
, minor
);