From 1543e317f1da31b75942316931e8f491a8920811 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Thu, 04 Jan 2024 10:08:02 +0000
Subject: [PATCH] disable FB
---
kernel/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c | 139 +++++++++++++++++++++++++++++++++++++++-------
1 files changed, 117 insertions(+), 22 deletions(-)
diff --git a/kernel/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c b/kernel/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c
index 5a99b5e..ce87a00 100644
--- a/kernel/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c
+++ b/kernel/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c
@@ -31,6 +31,22 @@
#if IS_ENABLED(CONFIG_DEBUG_FS)
+#define SHOW_GPU_MEM_DATA(type, format) \
+{ \
+ unsigned int i, j; \
+ const type *ptr = (type *)cpu_addr; \
+ const unsigned int col_width = sizeof(type); \
+ const unsigned int row_width = (col_width == sizeof(u64)) ? 32 : 16; \
+ const unsigned int num_cols = row_width / col_width; \
+ for (i = 0; i < PAGE_SIZE; i += row_width) { \
+ seq_printf(m, "%016llx:", gpu_addr + i); \
+ for (j = 0; j < num_cols; j++) \
+ seq_printf(m, format, ptr[j]); \
+ ptr += num_cols; \
+ seq_putc(m, '\n'); \
+ } \
+}
+
struct debug_mem_mapping {
struct list_head node;
@@ -44,6 +60,7 @@
struct debug_mem_data {
struct list_head mapping_list;
struct kbase_context *kctx;
+ unsigned int column_width;
};
struct debug_mem_seq_off {
@@ -111,9 +128,9 @@
struct debug_mem_data *mem_data = m->private;
struct debug_mem_seq_off *data = v;
struct debug_mem_mapping *map;
- int i, j;
+ unsigned long long gpu_addr;
struct page *page;
- uint32_t *mapping;
+ void *cpu_addr;
pgprot_t prot = PAGE_KERNEL;
map = list_entry(data->lh, struct debug_mem_mapping, node);
@@ -130,20 +147,33 @@
prot = pgprot_writecombine(prot);
page = as_page(map->alloc->pages[data->offset]);
- mapping = vmap(&page, 1, VM_MAP, prot);
- if (!mapping)
+ cpu_addr = vmap(&page, 1, VM_MAP, prot);
+ if (!cpu_addr)
goto out;
- for (i = 0; i < PAGE_SIZE; i += 4*sizeof(*mapping)) {
- seq_printf(m, "%016llx:", i + ((map->start_pfn +
- data->offset) << PAGE_SHIFT));
+ gpu_addr = (map->start_pfn + data->offset) << PAGE_SHIFT;
- for (j = 0; j < 4*sizeof(*mapping); j += sizeof(*mapping))
- seq_printf(m, " %08x", mapping[(i+j)/sizeof(*mapping)]);
- seq_putc(m, '\n');
+ /* Cases for 4 supported values of column_width for showing
+ * the GPU memory contents.
+ */
+ switch (mem_data->column_width) {
+ case 1:
+ SHOW_GPU_MEM_DATA(u8, " %02hhx");
+ break;
+ case 2:
+ SHOW_GPU_MEM_DATA(u16, " %04hx");
+ break;
+ case 4:
+ SHOW_GPU_MEM_DATA(u32, " %08x");
+ break;
+ case 8:
+ SHOW_GPU_MEM_DATA(u64, " %016llx");
+ break;
+ default:
+ dev_warn(mem_data->kctx->kbdev->dev, "Unexpected column width");
}
- vunmap(mapping);
+ vunmap(cpu_addr);
seq_putc(m, '\n');
@@ -207,6 +237,14 @@
if (get_file_rcu(kctx->filp) == 0)
return -ENOENT;
+ /* Check if file was opened in write mode. GPU memory contents
+ * are returned only when the file is not opened in write mode.
+ */
+ if (file->f_mode & FMODE_WRITE) {
+ file->private_data = kctx;
+ return 0;
+ }
+
ret = seq_open(file, &ops);
if (ret)
goto open_fail;
@@ -222,6 +260,8 @@
INIT_LIST_HEAD(&mem_data->mapping_list);
kbase_gpu_vm_lock(kctx);
+
+ mem_data->column_width = kctx->mem_view_column_width;
ret = debug_mem_zone_open(&kctx->reg_rbtree_same, mem_data);
if (ret != 0) {
@@ -240,6 +280,20 @@
kbase_gpu_vm_unlock(kctx);
goto out;
}
+
+#if MALI_USE_CSF
+ ret = debug_mem_zone_open(&kctx->reg_rbtree_exec_fixed, mem_data);
+ if (ret != 0) {
+ kbase_gpu_vm_unlock(kctx);
+ goto out;
+ }
+
+ ret = debug_mem_zone_open(&kctx->reg_rbtree_fixed, mem_data);
+ if (ret != 0) {
+ kbase_gpu_vm_unlock(kctx);
+ goto out;
+ }
+#endif
kbase_gpu_vm_unlock(kctx);
@@ -270,25 +324,62 @@
static int debug_mem_release(struct inode *inode, struct file *file)
{
struct kbase_context *const kctx = inode->i_private;
- struct seq_file *sfile = file->private_data;
- struct debug_mem_data *mem_data = sfile->private;
- struct debug_mem_mapping *mapping;
- seq_release(inode, file);
+ /* If the file wasn't opened in write mode, then release the
+ * memory allocated to show the GPU memory contents.
+ */
+ if (!(file->f_mode & FMODE_WRITE)) {
+ struct seq_file *sfile = file->private_data;
+ struct debug_mem_data *mem_data = sfile->private;
+ struct debug_mem_mapping *mapping;
- while (!list_empty(&mem_data->mapping_list)) {
- mapping = list_first_entry(&mem_data->mapping_list,
+ seq_release(inode, file);
+
+ while (!list_empty(&mem_data->mapping_list)) {
+ mapping = list_first_entry(&mem_data->mapping_list,
struct debug_mem_mapping, node);
- kbase_mem_phy_alloc_put(mapping->alloc);
- list_del(&mapping->node);
- kfree(mapping);
- }
+ kbase_mem_phy_alloc_put(mapping->alloc);
+ list_del(&mapping->node);
+ kfree(mapping);
+ }
- kfree(mem_data);
+ kfree(mem_data);
+ }
fput(kctx->filp);
return 0;
+}
+
+static ssize_t debug_mem_write(struct file *file, const char __user *ubuf,
+ size_t count, loff_t *ppos)
+{
+ struct kbase_context *const kctx = file->private_data;
+ unsigned int column_width = 0;
+ int ret = 0;
+
+ CSTD_UNUSED(ppos);
+
+ ret = kstrtouint_from_user(ubuf, count, 0, &column_width);
+
+ if (ret)
+ return ret;
+ if (!is_power_of_2(column_width)) {
+ dev_dbg(kctx->kbdev->dev,
+ "Column width %u not a multiple of power of 2", column_width);
+ return -EINVAL;
+ }
+ if (column_width > 8) {
+ dev_dbg(kctx->kbdev->dev,
+ "Column width %u greater than 8 not supported", column_width);
+ return -EINVAL;
+ }
+
+ kbase_gpu_vm_lock(kctx);
+ kctx->mem_view_column_width = column_width;
+ kbase_gpu_vm_unlock(kctx);
+
+ return count;
}
static const struct file_operations kbase_debug_mem_view_fops = {
@@ -296,6 +387,7 @@
.open = debug_mem_open,
.release = debug_mem_release,
.read = seq_read,
+ .write = debug_mem_write,
.llseek = seq_lseek
};
@@ -308,6 +400,9 @@
WARN_ON(IS_ERR_OR_NULL(kctx->kctx_dentry)))
return;
+ /* Default column width is 4 */
+ kctx->mem_view_column_width = sizeof(u32);
+
debugfs_create_file("mem_view", 0400, kctx->kctx_dentry, kctx,
&kbase_debug_mem_view_fops);
}
--
Gitblit v1.6.2