From 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 10 May 2024 07:44:59 +0000
Subject: [PATCH] gmac get mac form eeprom
---
kernel/drivers/gpu/drm/drm_debugfs.c | 510 ++++++++++++++++----------------------------------------
1 files changed, 147 insertions(+), 363 deletions(-)
diff --git a/kernel/drivers/gpu/drm/drm_debugfs.c b/kernel/drivers/gpu/drm/drm_debugfs.c
index 0265082..b0a8264 100644
--- a/kernel/drivers/gpu/drm/drm_debugfs.c
+++ b/kernel/drivers/gpu/drm/drm_debugfs.c
@@ -24,28 +24,117 @@
*/
#include <linux/debugfs.h>
+#include <linux/export.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
-#include <linux/export.h>
-#include <linux/ctype.h>
-#include <linux/syscalls.h>
+#include <linux/uaccess.h>
+#include <drm/drm_atomic.h>
+#include <drm/drm_auth.h>
#include <drm/drm_client.h>
#include <drm/drm_debugfs.h>
+#include <drm/drm_device.h>
+#include <drm/drm_drv.h>
#include <drm/drm_edid.h>
-#include <drm/drm_atomic.h>
-#include <drm/drmP.h>
+#include <drm/drm_file.h>
+#include <drm/drm_gem.h>
-#include "drm_internal.h"
#include "drm_crtc_internal.h"
+#include "drm_internal.h"
#if defined(CONFIG_DEBUG_FS)
-
-#define DUMP_BUF_PATH "/data/vop_buf"
/***************************************************
* Initialization, etc.
**************************************************/
+
+static int drm_name_info(struct seq_file *m, void *data)
+{
+ struct drm_info_node *node = (struct drm_info_node *) m->private;
+ struct drm_minor *minor = node->minor;
+ struct drm_device *dev = minor->dev;
+ struct drm_master *master;
+
+ mutex_lock(&dev->master_mutex);
+ master = dev->master;
+ seq_printf(m, "%s", dev->driver->name);
+ if (dev->dev)
+ seq_printf(m, " dev=%s", dev_name(dev->dev));
+ if (master && master->unique)
+ seq_printf(m, " master=%s", master->unique);
+ if (dev->unique)
+ seq_printf(m, " unique=%s", dev->unique);
+ seq_printf(m, "\n");
+ mutex_unlock(&dev->master_mutex);
+
+ return 0;
+}
+
+static int drm_clients_info(struct seq_file *m, void *data)
+{
+ struct drm_info_node *node = (struct drm_info_node *) m->private;
+ struct drm_device *dev = node->minor->dev;
+ struct drm_file *priv;
+ kuid_t uid;
+
+ seq_printf(m,
+ "%20s %5s %3s master a %5s %10s\n",
+ "command",
+ "pid",
+ "dev",
+ "uid",
+ "magic");
+
+ /* dev->filelist is sorted youngest first, but we want to present
+ * oldest first (i.e. kernel, servers, clients), so walk backwardss.
+ */
+ mutex_lock(&dev->filelist_mutex);
+ list_for_each_entry_reverse(priv, &dev->filelist, lhead) {
+ struct task_struct *task;
+ bool is_current_master = drm_is_current_master(priv);
+
+ rcu_read_lock(); /* locks pid_task()->comm */
+ task = pid_task(priv->pid, PIDTYPE_PID);
+ uid = task ? __task_cred(task)->euid : GLOBAL_ROOT_UID;
+ seq_printf(m, "%20s %5d %3d %c %c %5d %10u\n",
+ task ? task->comm : "<unknown>",
+ pid_vnr(priv->pid),
+ priv->minor->index,
+ is_current_master ? 'y' : 'n',
+ priv->authenticated ? 'y' : 'n',
+ from_kuid_munged(seq_user_ns(m), uid),
+ priv->magic);
+ rcu_read_unlock();
+ }
+ mutex_unlock(&dev->filelist_mutex);
+ return 0;
+}
+
+static int drm_gem_one_name_info(int id, void *ptr, void *data)
+{
+ struct drm_gem_object *obj = ptr;
+ struct seq_file *m = data;
+
+ seq_printf(m, "%6d %8zd %7d %8d\n",
+ obj->name, obj->size,
+ obj->handle_count,
+ kref_read(&obj->refcount));
+ return 0;
+}
+
+static int drm_gem_name_info(struct seq_file *m, void *data)
+{
+ struct drm_info_node *node = (struct drm_info_node *) m->private;
+ struct drm_device *dev = node->minor->dev;
+
+ seq_printf(m, " name size handles refcount\n");
+
+ mutex_lock(&dev->object_name_lock);
+ idr_for_each(&dev->object_name_idr, drm_gem_one_name_info, m);
+ mutex_unlock(&dev->object_name_lock);
+
+ return 0;
+}
static const struct drm_info_list drm_debugfs_list[] = {
{"name", drm_name_info, 0},
@@ -71,264 +160,6 @@
.release = single_release,
};
-#if defined(CONFIG_ROCKCHIP_DRM_DEBUG)
-static char *get_format_str(uint32_t format)
-{
- switch (format) {
- case DRM_FORMAT_XRGB8888:
- case DRM_FORMAT_ARGB8888:
- case DRM_FORMAT_XBGR8888:
- case DRM_FORMAT_ABGR8888:
- return "ARGB8888";
- case DRM_FORMAT_RGB888:
- case DRM_FORMAT_BGR888:
- return "BGR888";
- case DRM_FORMAT_RGB565:
- case DRM_FORMAT_BGR565:
- return "RGB565";
- case DRM_FORMAT_NV12:
- case DRM_FORMAT_NV12_10:
- return "YUV420NV12";
- case DRM_FORMAT_NV16:
- case DRM_FORMAT_NV16_10:
- return "YUV422NV16";
- case DRM_FORMAT_NV24:
- case DRM_FORMAT_NV24_10:
- return "YUV444NV24";
- case DRM_FORMAT_YUYV:
- return "YUYV";
- default:
- DRM_ERROR("unsupported format[%08x]\n", format);
- return "UNF";
- }
-}
-
-static int get_bpp(uint32_t format)
-{
- uint32_t bpp;
-
- switch (format) {
- case DRM_FORMAT_XRGB8888:
- case DRM_FORMAT_ARGB8888:
- case DRM_FORMAT_XBGR8888:
- case DRM_FORMAT_ABGR8888:
- bpp = 32;
- break;
- case DRM_FORMAT_RGB888:
- case DRM_FORMAT_BGR888:
- case DRM_FORMAT_NV24:
- case DRM_FORMAT_NV24_10:
- bpp = 24;
- break;
- case DRM_FORMAT_RGB565:
- case DRM_FORMAT_BGR565:
- case DRM_FORMAT_NV16:
- case DRM_FORMAT_NV16_10:
- bpp = 16;
- break;
- case DRM_FORMAT_NV12:
- case DRM_FORMAT_NV12_10:
- bpp = 12;
- break;
- case DRM_FORMAT_YUYV:
- bpp = 16;
- break;
- default:
- DRM_ERROR("unsupported format[%08x]\n", format);
- bpp = 0;
- }
-
- return bpp;
-}
-
-#define AFBC_HEADER_SIZE 16
-#define AFBC_HDR_ALIGN 64
-#define AFBC_SUPERBLK_PIXELS 256
-#define AFBC_SUPERBLK_ALIGNMENT 128
-
-static int get_afbc_size(uint32_t width, uint32_t height, uint32_t bpp)
-{
- uint32_t h_alignment = 16;
- uint32_t n_blocks;
- uint32_t hdr_size;
- uint32_t size;
-
- height = ALIGN(height, h_alignment);
- n_blocks = width * height / AFBC_SUPERBLK_PIXELS;
- hdr_size = ALIGN(n_blocks * AFBC_HEADER_SIZE, AFBC_HDR_ALIGN);
-
- size = hdr_size + n_blocks * ALIGN(bpp * AFBC_SUPERBLK_PIXELS / 8, AFBC_SUPERBLK_ALIGNMENT);
-
- return size;
-}
-
-int vop_plane_dump(struct vop_dump_info *dump_info, int frame_count)
-{
- int flags;
- int bpp;
- int fd;
- const char *ptr;
- char file_name[100];
- int width;
- size_t size;
- void *kvaddr;
- mm_segment_t old_fs;
- u32 format = dump_info->pixel_format;
-
- bpp = get_bpp(format);
-
- if (dump_info->yuv_format) {
- width = dump_info->pitches;
- flags = O_RDWR | O_CREAT | O_APPEND;
- snprintf(file_name, 100, "%s/video%d_%d_%s.%s", DUMP_BUF_PATH,
- width, dump_info->height, get_format_str(format),
- "bin");
- } else {
- width = dump_info->pitches * 8 / bpp;
- flags = O_RDWR | O_CREAT;
- snprintf(file_name, 100, "%s/win%d_area%d_%dx%d_%s%s%d.%s",
- DUMP_BUF_PATH, dump_info->win_id,
- dump_info->area_id, width, dump_info->height,
- get_format_str(format), dump_info->AFBC_flag ?
- "_AFBC_" : "_", frame_count, "bin");
- }
- kvaddr = vmap(dump_info->pages, dump_info->num_pages, VM_MAP,
- pgprot_writecombine(PAGE_KERNEL));
- if (!kvaddr) {
- DRM_ERROR("failed to vmap() buffer for %s\n", file_name);
- return -ENOMEM;
- }
- kvaddr += dump_info->offset;
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- ksys_mkdir(DUMP_BUF_PATH, 0700);
- ptr = file_name;
- if (dump_info->AFBC_flag)
- size = get_afbc_size(width, dump_info->height, bpp);
- else
- size = width * dump_info->height * bpp >> 3;
- fd = ksys_open(ptr, flags, 0644);
- if (fd >= 0) {
- ksys_write(fd, kvaddr, size);
- DRM_INFO("dump file name is:%s\n", file_name);
- ksys_close(fd);
- } else {
- DRM_INFO("write %s failed errno: %d\n", ptr, fd);
- }
- set_fs(old_fs);
- vunmap(kvaddr);
-
- return 0;
-}
-
-static int vop_dump_show(struct seq_file *m, void *data)
-{
- seq_puts(m, " echo dump > dump to dump one frame\n");
- seq_puts(m, " echo dumpon > dump to start vop keep dumping\n");
- seq_puts(m, " echo dumpoff > dump to stop keep dumping\n");
- seq_puts(m, " echo dumpn > dump n is the number of dump times\n");
- seq_puts(m, " dump path is /data/vop_buf\n");
- seq_puts(m, " if fd err = -3 try rm -r /data/vopbuf echo dump1 > dump can fix it\n");
- seq_puts(m, " if fd err = -28 save needed data try rm -r /data/vopbuf\n");
-
- return 0;
-}
-
-static int vop_dump_open(struct inode *inode, struct file *file)
-{
- struct drm_crtc *crtc = inode->i_private;
-
- return single_open(file, vop_dump_show, crtc);
-}
-
-static int temp_pow(int sum, int n)
-{
- int i;
- int temp = sum;
-
- if (n < 1)
- return 1;
- for (i = 1; i < n ; i++)
- sum *= temp;
- return sum;
-}
-
-static ssize_t vop_dump_write(struct file *file, const char __user *ubuf,
- size_t len, loff_t *offp)
-{
- struct seq_file *m = file->private_data;
- struct drm_crtc *crtc = m->private;
- char buf[14] = {};
- int dump_times = 0;
- struct vop_dump_list *pos, *n;
- int i = 0;
-
- if (!crtc->vop_dump_list_init_flag)
- return -EPERM;
- if (len > sizeof(buf) - 1)
- return -EINVAL;
- if (copy_from_user(buf, ubuf, len))
- return -EFAULT;
- buf[len - 1] = '\0';
- if (strncmp(buf, "dumpon", 6) == 0) {
- crtc->vop_dump_status = DUMP_KEEP;
- DRM_INFO("keep dumping\n");
- } else if (strncmp(buf, "dumpoff", 7) == 0) {
- crtc->vop_dump_status = DUMP_DISABLE;
- DRM_INFO("close keep dumping\n");
- } else if (strncmp(buf, "dump", 4) == 0) {
- if (isdigit(buf[4])) {
- for (i = 4; i < strlen(buf); i++) {
- dump_times += temp_pow(10, (strlen(buf)
- - i - 1))
- * (buf[i] - '0');
- }
- crtc->vop_dump_times = dump_times;
- } else {
- list_for_each_entry_safe(pos, n,
- &crtc->vop_dump_list_head,
- entry) {
- vop_plane_dump(&pos->dump_info,
- crtc->frame_count);
- }
- crtc->frame_count++;
- }
- } else {
- return -EINVAL;
- }
-
- return len;
-}
-
-static const struct file_operations drm_vop_dump_fops = {
- .owner = THIS_MODULE,
- .open = vop_dump_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
- .write = vop_dump_write,
-};
-
-int drm_debugfs_vop_add(struct drm_crtc *crtc, struct dentry *root)
-{
- struct dentry *vop_dump_root;
- struct dentry *ent;
-
- vop_dump_root = debugfs_create_dir("vop_dump", root);
- crtc->vop_dump_status = DUMP_DISABLE;
- crtc->vop_dump_list_init_flag = false;
- crtc->vop_dump_times = 0;
- crtc->frame_count = 0;
- ent = debugfs_create_file("dump", 0644, vop_dump_root,
- crtc, &drm_vop_dump_fops);
- if (!ent) {
- DRM_ERROR("create vop_plane_dump err\n");
- debugfs_remove_recursive(vop_dump_root);
- }
-
- return 0;
-}
-#endif
/**
* drm_debugfs_create_files - Initialize a given set of debugfs files for DRM
@@ -342,49 +173,33 @@
* &struct drm_info_list in the given root directory. These files will be removed
* automatically on drm_debugfs_cleanup().
*/
-int drm_debugfs_create_files(const struct drm_info_list *files, int count,
- struct dentry *root, struct drm_minor *minor)
+void drm_debugfs_create_files(const struct drm_info_list *files, int count,
+ struct dentry *root, struct drm_minor *minor)
{
struct drm_device *dev = minor->dev;
- struct dentry *ent;
struct drm_info_node *tmp;
- int i, ret;
+ int i;
for (i = 0; i < count; i++) {
u32 features = files[i].driver_features;
- if (features != 0 &&
- (dev->driver->driver_features & features) != features)
+ if (features && !drm_core_check_all_features(dev, features))
continue;
tmp = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL);
- if (tmp == NULL) {
- ret = -1;
- goto fail;
- }
- ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO,
- root, tmp, &drm_debugfs_fops);
- if (!ent) {
- DRM_ERROR("Cannot create /sys/kernel/debug/dri/%pd/%s\n",
- root, files[i].name);
- kfree(tmp);
- ret = -1;
- goto fail;
- }
+ if (tmp == NULL)
+ continue;
tmp->minor = minor;
- tmp->dent = ent;
+ tmp->dent = debugfs_create_file(files[i].name,
+ S_IFREG | S_IRUGO, root, tmp,
+ &drm_debugfs_fops);
tmp->info_ent = &files[i];
mutex_lock(&minor->debugfs_lock);
list_add(&tmp->list, &minor->debugfs_list);
mutex_unlock(&minor->debugfs_lock);
}
- return 0;
-
-fail:
- drm_debugfs_remove_files(files, count, minor);
- return ret;
}
EXPORT_SYMBOL(drm_debugfs_create_files);
@@ -393,56 +208,28 @@
{
struct drm_device *dev = minor->dev;
char name[64];
- int ret;
INIT_LIST_HEAD(&minor->debugfs_list);
mutex_init(&minor->debugfs_lock);
sprintf(name, "%d", minor_id);
minor->debugfs_root = debugfs_create_dir(name, root);
- if (!minor->debugfs_root) {
- DRM_ERROR("Cannot create /sys/kernel/debug/dri/%s\n", name);
- return -1;
- }
- ret = drm_debugfs_create_files(drm_debugfs_list, DRM_DEBUGFS_ENTRIES,
- minor->debugfs_root, minor);
- if (ret) {
- debugfs_remove(minor->debugfs_root);
- minor->debugfs_root = NULL;
- DRM_ERROR("Failed to create core drm debugfs files\n");
- return ret;
- }
+ drm_debugfs_create_files(drm_debugfs_list, DRM_DEBUGFS_ENTRIES,
+ minor->debugfs_root, minor);
if (drm_drv_uses_atomic_modeset(dev)) {
- ret = drm_atomic_debugfs_init(minor);
- if (ret) {
- DRM_ERROR("Failed to create atomic debugfs files\n");
- return ret;
- }
+ drm_atomic_debugfs_init(minor);
}
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
- ret = drm_framebuffer_debugfs_init(minor);
- if (ret) {
- DRM_ERROR("Failed to create framebuffer debugfs file\n");
- return ret;
- }
+ drm_framebuffer_debugfs_init(minor);
- ret = drm_client_debugfs_init(minor);
- if (ret) {
- DRM_ERROR("Failed to create client debugfs file\n");
- return ret;
- }
+ drm_client_debugfs_init(minor);
}
- if (dev->driver->debugfs_init) {
- ret = dev->driver->debugfs_init(minor);
- if (ret) {
- DRM_ERROR("DRM: Driver failed to initialize "
- "/sys/kernel/debug/dri.\n");
- return ret;
- }
- }
+ if (dev->driver->debugfs_init)
+ dev->driver->debugfs_init(minor);
+
return 0;
}
@@ -483,17 +270,15 @@
mutex_unlock(&minor->debugfs_lock);
}
-int drm_debugfs_cleanup(struct drm_minor *minor)
+void drm_debugfs_cleanup(struct drm_minor *minor)
{
if (!minor->debugfs_root)
- return 0;
+ return;
drm_debugfs_remove_all_files(minor);
debugfs_remove_recursive(minor->debugfs_root);
minor->debugfs_root = NULL;
-
- return 0;
}
static int connector_show(struct seq_file *m, void *data)
@@ -592,6 +377,24 @@
return (ret) ? ret : len;
}
+/*
+ * Returns the min and max vrr vfreq through the connector's debugfs file.
+ * Example usage: cat /sys/kernel/debug/dri/0/DP-1/vrr_range
+ */
+static int vrr_range_show(struct seq_file *m, void *data)
+{
+ struct drm_connector *connector = m->private;
+
+ if (connector->status != connector_status_connected)
+ return -ENODEV;
+
+ seq_printf(m, "Min: %u\n", (u8)connector->display_info.monitor_range.min_vfreq);
+ seq_printf(m, "Max: %u\n", (u8)connector->display_info.monitor_range.max_vfreq);
+
+ return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(vrr_range);
+
static const struct file_operations drm_edid_fops = {
.owner = THIS_MODULE,
.open = edid_open,
@@ -611,38 +414,28 @@
.write = connector_write
};
-int drm_debugfs_connector_add(struct drm_connector *connector)
+void drm_debugfs_connector_add(struct drm_connector *connector)
{
struct drm_minor *minor = connector->dev->primary;
- struct dentry *root, *ent;
+ struct dentry *root;
if (!minor->debugfs_root)
- return -1;
+ return;
root = debugfs_create_dir(connector->name, minor->debugfs_root);
- if (!root)
- return -ENOMEM;
-
connector->debugfs_entry = root;
/* force */
- ent = debugfs_create_file("force", S_IRUGO | S_IWUSR, root, connector,
- &drm_connector_fops);
- if (!ent)
- goto error;
+ debugfs_create_file("force", S_IRUGO | S_IWUSR, root, connector,
+ &drm_connector_fops);
/* edid */
- ent = debugfs_create_file("edid_override", S_IRUGO | S_IWUSR, root,
- connector, &drm_edid_fops);
- if (!ent)
- goto error;
+ debugfs_create_file("edid_override", S_IRUGO | S_IWUSR, root, connector,
+ &drm_edid_fops);
- return 0;
-
-error:
- debugfs_remove_recursive(connector->debugfs_entry);
- connector->debugfs_entry = NULL;
- return -ENOMEM;
+ /* vrr range */
+ debugfs_create_file("vrr_range", S_IRUGO, root, connector,
+ &vrr_range_fops);
}
void drm_debugfs_connector_remove(struct drm_connector *connector)
@@ -655,7 +448,7 @@
connector->debugfs_entry = NULL;
}
-int drm_debugfs_crtc_add(struct drm_crtc *crtc)
+void drm_debugfs_crtc_add(struct drm_crtc *crtc)
{
struct drm_minor *minor = crtc->dev->primary;
struct dentry *root;
@@ -663,23 +456,14 @@
name = kasprintf(GFP_KERNEL, "crtc-%d", crtc->index);
if (!name)
- return -ENOMEM;
+ return;
root = debugfs_create_dir(name, minor->debugfs_root);
kfree(name);
- if (!root)
- return -ENOMEM;
crtc->debugfs_entry = root;
- if (drm_debugfs_crtc_crc_add(crtc))
- goto error;
-
- return 0;
-
-error:
- drm_debugfs_crtc_remove(crtc);
- return -ENOMEM;
+ drm_debugfs_crtc_crc_add(crtc);
}
void drm_debugfs_crtc_remove(struct drm_crtc *crtc)
--
Gitblit v1.6.2