Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d478b088 authored by Paul Burton's avatar Paul Burton Committed by Ralf Baechle
Browse files

MIPS: Allow L2 prefetch to be configured via debugfs



When debugging or examining the performance of a system it can be useful
to examine the effect of L2 prefetching. Provide an optional debugfs
entry to allow a user to enable or disable L2 prefetching.

Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
Cc: Maciej W. Rozycki <macro@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/11182/


Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 75dcfc1d
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -149,4 +149,14 @@ endchoice

endif # CPU_MIPSR6

config SCACHE_DEBUGFS
	bool "L2 cache debugfs entries"
	depends on DEBUG_FS
	help
	  Enable this to allow parts of the L2 cache configuration, such as
	  whether or not prefetching is enabled, to be exposed to userland
	  via debugfs.

	  If unsure, say N.

endmenu
+1 −0
Original line number Diff line number Diff line
@@ -28,3 +28,4 @@ obj-$(CONFIG_IP22_CPU_SCACHE) += sc-ip22.o
obj-$(CONFIG_R5000_CPU_SCACHE)	+= sc-r5k.o
obj-$(CONFIG_RM7000_CPU_SCACHE) += sc-rm7k.o
obj-$(CONFIG_MIPS_CPU_SCACHE)	+= sc-mips.o
obj-$(CONFIG_SCACHE_DEBUGFS)	+= sc-debugfs.o
+81 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 Imagination Technologies
 * Author: Paul Burton <paul.burton@imgtec.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 */

#include <asm/bcache.h>
#include <asm/debug.h>
#include <asm/uaccess.h>
#include <linux/debugfs.h>
#include <linux/init.h>

static ssize_t sc_prefetch_read(struct file *file, char __user *user_buf,
				size_t count, loff_t *ppos)
{
	bool enabled = bc_prefetch_is_enabled();
	char buf[3];

	buf[0] = enabled ? 'Y' : 'N';
	buf[1] = '\n';
	buf[2] = 0;

	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
}

static ssize_t sc_prefetch_write(struct file *file,
				 const char __user *user_buf,
				 size_t count, loff_t *ppos)
{
	char buf[32];
	ssize_t buf_size;
	bool enabled;
	int err;

	buf_size = min(count, sizeof(buf) - 1);
	if (copy_from_user(buf, user_buf, buf_size))
		return -EFAULT;

	buf[buf_size] = '\0';
	err = strtobool(buf, &enabled);
	if (err)
		return err;

	if (enabled)
		bc_prefetch_enable();
	else
		bc_prefetch_disable();

	return count;
}

static const struct file_operations sc_prefetch_fops = {
	.open = simple_open,
	.llseek = default_llseek,
	.read = sc_prefetch_read,
	.write = sc_prefetch_write,
};

static int __init sc_debugfs_init(void)
{
	struct dentry *dir, *file;

	if (!mips_debugfs_dir)
		return -ENODEV;

	dir = debugfs_create_dir("l2cache", mips_debugfs_dir);
	if (IS_ERR(dir))
		return PTR_ERR(dir);

	file = debugfs_create_file("prefetch", S_IRUGO | S_IWUSR, dir,
				   NULL, &sc_prefetch_fops);
	if (IS_ERR(file))
		return PTR_ERR(file);

	return 0;
}
late_initcall(sc_debugfs_init);