Loading drivers/gpu/msm/kgsl.c +51 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <linux/sort.h> #include <linux/security.h> #include <linux/compat.h> #include <linux/ctype.h> #include "kgsl.h" #include "kgsl_debugfs.h" Loading Loading @@ -2970,6 +2971,28 @@ err: return ERR_PTR(ret); } static void copy_metadata(struct kgsl_mem_entry *entry, uint64_t metadata, unsigned int len) { unsigned int i, size; if (len == 0) return; size = min_t(unsigned int, len, sizeof(entry->metadata) - 1); if (copy_from_user(entry->metadata, to_user_ptr(metadata), size)) { memset(entry->metadata, 0, sizeof(entry->metadata)); return; } /* Clean up non printable characters in the string */ for (i = 0; i < size && entry->metadata[i] != 0; i++) { if (!isprint(entry->metadata[i])) entry->metadata[i] = '?'; } } long kgsl_ioctl_gpuobj_alloc(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data) { Loading @@ -2982,6 +3005,8 @@ long kgsl_ioctl_gpuobj_alloc(struct kgsl_device_private *dev_priv, if (IS_ERR(entry)) return PTR_ERR(entry); copy_metadata(entry, param->metadata, param->metadata_len); param->size = entry->memdesc.size; param->flags = entry->memdesc.flags; param->mmapsize = kgsl_memdesc_mmapsize(&entry->memdesc); Loading Loading @@ -3102,6 +3127,32 @@ long kgsl_ioctl_gpuobj_info(struct kgsl_device_private *dev_priv, return 0; } long kgsl_ioctl_gpuobj_set_info(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data) { struct kgsl_process_private *private = dev_priv->process_priv; struct kgsl_gpuobj_set_info *param = data; struct kgsl_mem_entry *entry; if (param->id == 0) return -EINVAL; entry = kgsl_sharedmem_find_id(private, param->id); if (entry == NULL) return -EINVAL; if (param->flags & KGSL_GPUOBJ_SET_INFO_METADATA) copy_metadata(entry, param->metadata, param->metadata_len); if (param->flags & KGSL_GPUOBJ_SET_INFO_TYPE) { entry->memdesc.flags &= ~KGSL_MEMTYPE_MASK; entry->memdesc.flags |= param->type << KGSL_MEMTYPE_SHIFT; } kgsl_mem_entry_put(entry); return 0; } long kgsl_ioctl_cff_syncmem(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data) { Loading drivers/gpu/msm/kgsl.h +4 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,7 @@ struct kgsl_memdesc { * @pending_free: if !0, userspace requested that his memory be freed, but there * are still references to it. * @dev_priv: back pointer to the device file that created this entry. * @metadata: String containing user specified metadata for the entry */ struct kgsl_mem_entry { struct kref refcount; Loading @@ -198,6 +199,7 @@ struct kgsl_mem_entry { unsigned int id; struct kgsl_process_private *priv; int pending_free; char metadata[KGSL_GPUOBJ_ALLOC_METADATA_MAX + 1]; }; struct kgsl_device_private; Loading Loading @@ -326,6 +328,8 @@ long kgsl_ioctl_gpuobj_sync(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data); long kgsl_ioctl_gpu_command(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data); long kgsl_ioctl_gpuobj_set_info(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data); void kgsl_mem_entry_destroy(struct kref *kref); Loading drivers/gpu/msm/kgsl_compat.c +2 −0 Original line number Diff line number Diff line Loading @@ -370,6 +370,8 @@ static const struct kgsl_ioctl kgsl_compat_ioctl_funcs[] = { kgsl_ioctl_gpuobj_sync), KGSL_IOCTL_FUNC(IOCTL_KGSL_GPU_COMMAND, kgsl_ioctl_gpu_command), KGSL_IOCTL_FUNC(IOCTL_KGSL_GPUOBJ_SET_INFO, kgsl_ioctl_gpuobj_set_info), }; long kgsl_compat_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) Loading drivers/gpu/msm/kgsl_debugfs.c +28 −1 Original line number Diff line number Diff line Loading @@ -52,6 +52,20 @@ KGSL_DEBUGFS_LOG(ctxt_log); KGSL_DEBUGFS_LOG(mem_log); KGSL_DEBUGFS_LOG(pwr_log); static int _strict_set(void *data, u64 val) { kgsl_sharedmem_set_noretry(val ? true : false); return 0; } static int _strict_get(void *data, u64 *val) { *val = kgsl_sharedmem_get_noretry(); return 0; } DEFINE_SIMPLE_ATTRIBUTE(_strict_fops, _strict_get, _strict_set, "%llu\n"); void kgsl_device_debugfs_init(struct kgsl_device *device) { if (kgsl_debugfs_dir && !IS_ERR(kgsl_debugfs_dir)) Loading Loading @@ -130,13 +144,18 @@ static int print_mem_entry(int id, void *ptr, void *data) kgsl_get_memory_usage(usage, sizeof(usage), m->flags); seq_printf(s, "%pK %pK %16llu %5d %8s %10s %16s %5d\n", seq_printf(s, "%pK %pK %16llu %5d %8s %10s %16s %5d", (uint64_t *)(uintptr_t) m->gpuaddr, (unsigned long *) m->useraddr, m->size, entry->id, flags, memtype_str(kgsl_memdesc_usermem_type(m)), usage, m->sgt->nents); if (entry->metadata[0] != 0) seq_printf(s, " %s", entry->metadata); seq_putc(s, '\n'); return 0; } Loading Loading @@ -235,7 +254,15 @@ void kgsl_process_init_debugfs(struct kgsl_process_private *private) void kgsl_core_debugfs_init(void) { struct dentry *debug_dir; kgsl_debugfs_dir = debugfs_create_dir("kgsl", NULL); debug_dir = debugfs_create_dir("debug", kgsl_debugfs_dir); debugfs_create_file("strict_memory", 0644, debug_dir, NULL, &_strict_fops); proc_d_debugfs = debugfs_create_dir("proc", kgsl_debugfs_dir); } Loading drivers/gpu/msm/kgsl_ioctl.c +2 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,8 @@ static const struct kgsl_ioctl kgsl_ioctl_funcs[] = { kgsl_ioctl_gpuobj_sync), KGSL_IOCTL_FUNC(IOCTL_KGSL_GPU_COMMAND, kgsl_ioctl_gpu_command), KGSL_IOCTL_FUNC(IOCTL_KGSL_GPUOBJ_SET_INFO, kgsl_ioctl_gpuobj_set_info), }; long kgsl_ioctl_copy_in(unsigned int kernel_cmd, unsigned int user_cmd, Loading Loading
drivers/gpu/msm/kgsl.c +51 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <linux/sort.h> #include <linux/security.h> #include <linux/compat.h> #include <linux/ctype.h> #include "kgsl.h" #include "kgsl_debugfs.h" Loading Loading @@ -2970,6 +2971,28 @@ err: return ERR_PTR(ret); } static void copy_metadata(struct kgsl_mem_entry *entry, uint64_t metadata, unsigned int len) { unsigned int i, size; if (len == 0) return; size = min_t(unsigned int, len, sizeof(entry->metadata) - 1); if (copy_from_user(entry->metadata, to_user_ptr(metadata), size)) { memset(entry->metadata, 0, sizeof(entry->metadata)); return; } /* Clean up non printable characters in the string */ for (i = 0; i < size && entry->metadata[i] != 0; i++) { if (!isprint(entry->metadata[i])) entry->metadata[i] = '?'; } } long kgsl_ioctl_gpuobj_alloc(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data) { Loading @@ -2982,6 +3005,8 @@ long kgsl_ioctl_gpuobj_alloc(struct kgsl_device_private *dev_priv, if (IS_ERR(entry)) return PTR_ERR(entry); copy_metadata(entry, param->metadata, param->metadata_len); param->size = entry->memdesc.size; param->flags = entry->memdesc.flags; param->mmapsize = kgsl_memdesc_mmapsize(&entry->memdesc); Loading Loading @@ -3102,6 +3127,32 @@ long kgsl_ioctl_gpuobj_info(struct kgsl_device_private *dev_priv, return 0; } long kgsl_ioctl_gpuobj_set_info(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data) { struct kgsl_process_private *private = dev_priv->process_priv; struct kgsl_gpuobj_set_info *param = data; struct kgsl_mem_entry *entry; if (param->id == 0) return -EINVAL; entry = kgsl_sharedmem_find_id(private, param->id); if (entry == NULL) return -EINVAL; if (param->flags & KGSL_GPUOBJ_SET_INFO_METADATA) copy_metadata(entry, param->metadata, param->metadata_len); if (param->flags & KGSL_GPUOBJ_SET_INFO_TYPE) { entry->memdesc.flags &= ~KGSL_MEMTYPE_MASK; entry->memdesc.flags |= param->type << KGSL_MEMTYPE_SHIFT; } kgsl_mem_entry_put(entry); return 0; } long kgsl_ioctl_cff_syncmem(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data) { Loading
drivers/gpu/msm/kgsl.h +4 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,7 @@ struct kgsl_memdesc { * @pending_free: if !0, userspace requested that his memory be freed, but there * are still references to it. * @dev_priv: back pointer to the device file that created this entry. * @metadata: String containing user specified metadata for the entry */ struct kgsl_mem_entry { struct kref refcount; Loading @@ -198,6 +199,7 @@ struct kgsl_mem_entry { unsigned int id; struct kgsl_process_private *priv; int pending_free; char metadata[KGSL_GPUOBJ_ALLOC_METADATA_MAX + 1]; }; struct kgsl_device_private; Loading Loading @@ -326,6 +328,8 @@ long kgsl_ioctl_gpuobj_sync(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data); long kgsl_ioctl_gpu_command(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data); long kgsl_ioctl_gpuobj_set_info(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data); void kgsl_mem_entry_destroy(struct kref *kref); Loading
drivers/gpu/msm/kgsl_compat.c +2 −0 Original line number Diff line number Diff line Loading @@ -370,6 +370,8 @@ static const struct kgsl_ioctl kgsl_compat_ioctl_funcs[] = { kgsl_ioctl_gpuobj_sync), KGSL_IOCTL_FUNC(IOCTL_KGSL_GPU_COMMAND, kgsl_ioctl_gpu_command), KGSL_IOCTL_FUNC(IOCTL_KGSL_GPUOBJ_SET_INFO, kgsl_ioctl_gpuobj_set_info), }; long kgsl_compat_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) Loading
drivers/gpu/msm/kgsl_debugfs.c +28 −1 Original line number Diff line number Diff line Loading @@ -52,6 +52,20 @@ KGSL_DEBUGFS_LOG(ctxt_log); KGSL_DEBUGFS_LOG(mem_log); KGSL_DEBUGFS_LOG(pwr_log); static int _strict_set(void *data, u64 val) { kgsl_sharedmem_set_noretry(val ? true : false); return 0; } static int _strict_get(void *data, u64 *val) { *val = kgsl_sharedmem_get_noretry(); return 0; } DEFINE_SIMPLE_ATTRIBUTE(_strict_fops, _strict_get, _strict_set, "%llu\n"); void kgsl_device_debugfs_init(struct kgsl_device *device) { if (kgsl_debugfs_dir && !IS_ERR(kgsl_debugfs_dir)) Loading Loading @@ -130,13 +144,18 @@ static int print_mem_entry(int id, void *ptr, void *data) kgsl_get_memory_usage(usage, sizeof(usage), m->flags); seq_printf(s, "%pK %pK %16llu %5d %8s %10s %16s %5d\n", seq_printf(s, "%pK %pK %16llu %5d %8s %10s %16s %5d", (uint64_t *)(uintptr_t) m->gpuaddr, (unsigned long *) m->useraddr, m->size, entry->id, flags, memtype_str(kgsl_memdesc_usermem_type(m)), usage, m->sgt->nents); if (entry->metadata[0] != 0) seq_printf(s, " %s", entry->metadata); seq_putc(s, '\n'); return 0; } Loading Loading @@ -235,7 +254,15 @@ void kgsl_process_init_debugfs(struct kgsl_process_private *private) void kgsl_core_debugfs_init(void) { struct dentry *debug_dir; kgsl_debugfs_dir = debugfs_create_dir("kgsl", NULL); debug_dir = debugfs_create_dir("debug", kgsl_debugfs_dir); debugfs_create_file("strict_memory", 0644, debug_dir, NULL, &_strict_fops); proc_d_debugfs = debugfs_create_dir("proc", kgsl_debugfs_dir); } Loading
drivers/gpu/msm/kgsl_ioctl.c +2 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,8 @@ static const struct kgsl_ioctl kgsl_ioctl_funcs[] = { kgsl_ioctl_gpuobj_sync), KGSL_IOCTL_FUNC(IOCTL_KGSL_GPU_COMMAND, kgsl_ioctl_gpu_command), KGSL_IOCTL_FUNC(IOCTL_KGSL_GPUOBJ_SET_INFO, kgsl_ioctl_gpuobj_set_info), }; long kgsl_ioctl_copy_in(unsigned int kernel_cmd, unsigned int user_cmd, Loading