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

Commit d6d3c9af authored by Ralf Baechle's avatar Ralf Baechle
Browse files

MIPS: MT: proc: Add support for printing VPE and TC ids



And there are more CPUs or configurations that want to provide special
per-CPU information in /proc/cpuinfo.  So I think there needs to be a
hook mechanism, such as a notifier.

This is a first cut only; I need to think about what sort of looking
the notifier needs to have.  But I'd appreciate testing on MT hardware!

Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
Cc: Markos Chandras <markos.chandras@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/6066/
parent a2bec078
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -96,6 +96,27 @@ extern void cpu_report(void);
extern const char *__cpu_name[];
#define cpu_name_string()	__cpu_name[smp_processor_id()]

struct seq_file;
struct notifier_block;

extern int register_proc_cpuinfo_notifier(struct notifier_block *nb);
extern int proc_cpuinfo_notifier_call_chain(unsigned long val, void *v);

#define proc_cpuinfo_notifier(fn, pri)					\
({									\
	static struct notifier_block fn##_nb = {			\
		.notifier_call = fn,					\
		.priority = pri						\
	};								\
									\
	register_proc_cpuinfo_notifier(&fn##_nb);			\
})

struct proc_cpuinfo_notifier_args {
	struct seq_file *m;
	unsigned long n;
};

#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC)
# define cpu_vpe_id(cpuinfo)	((cpuinfo)->vpe_id)
#else
+23 −0
Original line number Diff line number Diff line
@@ -17,8 +17,24 @@

unsigned int vced_count, vcei_count;

/*
 *  * No lock; only written during early bootup by CPU 0.
 *   */
static RAW_NOTIFIER_HEAD(proc_cpuinfo_chain);

int __ref register_proc_cpuinfo_notifier(struct notifier_block *nb)
{
	return raw_notifier_chain_register(&proc_cpuinfo_chain, nb);
}

int proc_cpuinfo_notifier_call_chain(unsigned long val, void *v)
{
	return raw_notifier_call_chain(&proc_cpuinfo_chain, val, v);
}

static int show_cpuinfo(struct seq_file *m, void *v)
{
	struct proc_cpuinfo_notifier_args proc_cpuinfo_notifier_args;
	unsigned long n = (unsigned long) v - 1;
	unsigned int version = cpu_data[n].processor_id;
	unsigned int fp_vers = cpu_data[n].fpu_id;
@@ -120,6 +136,13 @@ static int show_cpuinfo(struct seq_file *m, void *v)
		      cpu_has_vce ? "%u" : "not available");
	seq_printf(m, fmt, 'D', vced_count);
	seq_printf(m, fmt, 'I', vcei_count);

	proc_cpuinfo_notifier_args.m = m;
	proc_cpuinfo_notifier_args.n = n;

	raw_notifier_call_chain(&proc_cpuinfo_chain, 0,
				&proc_cpuinfo_notifier_args);

	seq_printf(m, "\n");

	return 0;
+22 −0
Original line number Diff line number Diff line
@@ -313,3 +313,25 @@ struct plat_smp_ops vsmp_smp_ops = {
	.smp_setup		= vsmp_smp_setup,
	.prepare_cpus		= vsmp_prepare_cpus,
};

static int proc_cpuinfo_chain_call(struct notifier_block *nfb,
	unsigned long action_unused, void *data)
{
	struct proc_cpuinfo_notifier_args *pcn = data;
	struct seq_file *m = pcn->m;
	unsigned long n = pcn->n;

	if (!cpu_has_mipsmt)
		return NOTIFY_OK;

	seq_printf(m, "VPE\t\t\t: %d\n", cpu_data[n].vpe_id);

	return NOTIFY_OK;
}

static int __init proc_cpuinfo_notifier_init(void)
{
	return proc_cpuinfo_notifier(proc_cpuinfo_chain_call, 0);
}

subsys_initcall(proc_cpuinfo_notifier_init);
+23 −0
Original line number Diff line number Diff line
@@ -77,3 +77,26 @@ void init_smtc_stats(void)

	proc_create("smtc", 0444, NULL, &smtc_proc_fops);
}

static int proc_cpuinfo_chain_call(struct notifier_block *nfb,
	unsigned long action_unused, void *data)
{
	struct proc_cpuinfo_notifier_args *pcn = data;
	struct seq_file *m = pcn->m;
	unsigned long n = pcn->n;

	if (!cpu_has_mipsmt)
		return NOTIFY_OK;

	seq_printf(m, "VPE\t\t\t: %d\n", cpu_data[n].vpe_id);
	seq_printf(m, "TC\t\t\t: %d\n", cpu_data[n].tc_id);

	return NOTIFY_OK;
}

static int __init proc_cpuinfo_notifier_init(void)
{
	return proc_cpuinfo_notifier(proc_cpuinfo_chain_call, 0);
}

subsys_initcall(proc_cpuinfo_notifier_init);