// SPDX-License-Identifier: GPL-2.0
/*
 *  Copyright (C) 1995, 1996, 2001  Ralf Baechle
 *  Copyright (C) 2001, 2004  MIPS Technologies, Inc.
 *  Copyright (C) 2004	Maciej W. Rozycki
 */
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/seq_file.h>
#include <asm/bootinfo.h>
#include <asm/cpu.h>
#include <asm/cpu-features.h>
#include <asm/idle.h>
#include <asm/mipsregs.h>
#include <asm/processor.h>
#include <asm/prom.h>

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;
	char fmt[64];
	int i;

#ifdef CONFIG_SMP
	if (!cpu_online(n))
		return 0;
#endif

	/*
	 * For the first processor also print the system type
	 */
	if (n == 0) {
		seq_printf(m, "system type\t\t: %s\n", get_system_type());
		if (mips_get_machine_name())
			seq_printf(m, "machine\t\t\t: %s\n",
				   mips_get_machine_name());
	}

	seq_printf(m, "processor\t\t: %ld\n", n);
	sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n",
		      cpu_data[n].options & MIPS_CPU_FPU ? "  FPU V%d.%d" : "");
	seq_printf(m, fmt, __cpu_name[n],
		      (version >> 4) & 0x0f, version & 0x0f,
		      (fp_vers >> 4) & 0x0f, fp_vers & 0x0f);
	seq_printf(m, "BogoMIPS\t\t: %u.%02u\n",
		      cpu_data[n].udelay_val / (500000/HZ),
		      (cpu_data[n].udelay_val / (5000/HZ)) % 100);
	seq_printf(m, "wait instruction\t: %s\n", cpu_wait ? "yes" : "no");
	seq_printf(m, "microsecond timers\t: %s\n",
		      cpu_has_counter ? "yes" : "no");
	seq_printf(m, "tlb_entries\t\t: %d\n", cpu_data[n].tlbsize);
	seq_printf(m, "extra interrupt vector\t: %s\n",
		      cpu_has_divec ? "yes" : "no");
	seq_printf(m, "hardware watchpoint\t: %s",
		      cpu_has_watch ? "yes, " : "no\n");
	if (cpu_has_watch) {
		seq_printf(m, "count: %d, address/irw mask: [",
		      cpu_data[n].watch_reg_count);
		for (i = 0; i < cpu_data[n].watch_reg_count; i++)
			seq_printf(m, "%s0x%04x", i ? ", " : "",
				cpu_data[n].watch_reg_masks[i]);
		seq_puts(m, "]\n");
	}

	seq_puts(m, "isa\t\t\t:");
	if (cpu_has_mips_1)
		seq_puts(m, " mips1");
	if (cpu_has_mips_2)
		seq_puts(m, " mips2");
	if (cpu_has_mips_3)
		seq_puts(m, " mips3");
	if (cpu_has_mips_4)
		seq_puts(m, " mips4");
	if (cpu_has_mips_5)
		seq_puts(m, " mips5");
	if (cpu_has_mips32r1)
		seq_puts(m, " mips32r1");
	if (cpu_has_mips32r2)
		seq_puts(m, " mips32r2");
	if (cpu_has_mips32r5)
		seq_puts(m, " mips32r5");
	if (cpu_has_mips32r6)
		seq_puts(m, " mips32r6");
	if (cpu_has_mips64r1)
		seq_puts(m, " mips64r1");
	if (cpu_has_mips64r2)
		seq_puts(m, " mips64r2");
	if (cpu_has_mips64r5)
		seq_puts(m, " mips64r5");
	if (cpu_has_mips64r6)
		seq_puts(m, " mips64r6");
	seq_puts(m, "\n");

	seq_puts(m, "ASEs implemented\t:");
	if (cpu_has_mips16)
		seq_puts(m, " mips16");
	if (cpu_has_mips16e2)
		seq_puts(m, " mips16e2");
	if (cpu_has_mdmx)
		seq_puts(m, " mdmx");
	if (cpu_has_mips3d)
		seq_puts(m, " mips3d");
	if (cpu_has_smartmips)
		seq_puts(m, " smartmips");
	if (cpu_has_dsp)
		seq_puts(m, " dsp");
	if (cpu_has_dsp2)
		seq_puts(m, " dsp2");
	if (cpu_has_dsp3)
		seq_puts(m, " dsp3");
	if (cpu_has_mipsmt)
		seq_puts(m, " mt");
	if (cpu_has_mmips)
		seq_puts(m, " micromips");
	if (cpu_has_vz)
		seq_puts(m, " vz");
	if (cpu_has_msa)
		seq_puts(m, " msa");
	if (cpu_has_eva)
		seq_puts(m, " eva");
	if (cpu_has_htw)
		seq_puts(m, " htw");
	if (cpu_has_xpa)
		seq_puts(m, " xpa");
	if (cpu_has_loongson_mmi)
		seq_puts(m, " loongson-mmi");
	if (cpu_has_loongson_cam)
		seq_puts(m, " loongson-cam");
	if (cpu_has_loongson_ext)
		seq_puts(m, " loongson-ext");
	if (cpu_has_loongson_ext2)
		seq_puts(m, " loongson-ext2");
	seq_puts(m, "\n");

	if (cpu_has_mmips) {
		seq_printf(m, "micromips kernel\t: %s\n",
		      (read_c0_config3() & MIPS_CONF3_ISA_OE) ?  "yes" : "no");
	}

	seq_puts(m, "Options implemented\t:");
	if (cpu_has_tlb)
		seq_puts(m, " tlb");
	if (cpu_has_ftlb)
		seq_puts(m, " ftlb");
	if (cpu_has_tlbinv)
		seq_puts(m, " tlbinv");
	if (cpu_has_segments)
		seq_puts(m, " segments");
	if (cpu_has_rixiex)
		seq_puts(m, " rixiex");
	if (cpu_has_ldpte)
		seq_puts(m, " ldpte");
	if (cpu_has_maar)
		seq_puts(m, " maar");
	if (cpu_has_rw_llb)
		seq_puts(m, " rw_llb");
	if (cpu_has_4kex)
		seq_puts(m, " 4kex");
	if (cpu_has_3k_cache)
		seq_puts(m, " 3k_cache");
	if (cpu_has_4k_cache)
		seq_puts(m, " 4k_cache");
	if (cpu_has_tx39_cache)
		seq_puts(m, " tx39_cache");
	if (cpu_has_octeon_cache)
		seq_puts(m, " octeon_cache");
	if (cpu_has_fpu)
		seq_puts(m, " fpu");
	if (cpu_has_32fpr)
		seq_puts(m, " 32fpr");
	if (cpu_has_cache_cdex_p)
		seq_puts(m, " cache_cdex_p");
	if (cpu_has_cache_cdex_s)
		seq_puts(m, " cache_cdex_s");
	if (cpu_has_prefetch)
		seq_puts(m, " prefetch");
	if (cpu_has_mcheck)
		seq_puts(m, " mcheck");
	if (cpu_has_ejtag)
		seq_puts(m, " ejtag");
	if (cpu_has_llsc)
		seq_puts(m, " llsc");
	if (cpu_has_guestctl0ext)
		seq_puts(m, " guestctl0ext");
	if (cpu_has_guestctl1)
		seq_puts(m, " guestctl1");
	if (cpu_has_guestctl2)
		seq_puts(m, " guestctl2");
	if (cpu_has_guestid)
		seq_puts(m, " guestid");
	if (cpu_has_drg)
		seq_puts(m, " drg");
	if (cpu_has_rixi)
		seq_puts(m, " rixi");
	if (cpu_has_lpa)
		seq_puts(m, " lpa");
	if (cpu_has_mvh)
		seq_puts(m, " mvh");
	if (cpu_has_vtag_icache)
		seq_puts(m, " vtag_icache");
	if (cpu_has_dc_aliases)
		seq_puts(m, " dc_aliases");
	if (cpu_has_ic_fills_f_dc)
		seq_puts(m, " ic_fills_f_dc");
	if (cpu_has_pindexed_dcache)
		seq_puts(m, " pindexed_dcache");
	if (cpu_has_userlocal)
		seq_puts(m, " userlocal");
	if (cpu_has_nofpuex)
		seq_puts(m, " nofpuex");
	if (cpu_has_vint)
		seq_puts(m, " vint");
	if (cpu_has_veic)
		seq_puts(m, " veic");
	if (cpu_has_inclusive_pcaches)
		seq_puts(m, " inclusive_pcaches");
	if (cpu_has_perf_cntr_intr_bit)
		seq_puts(m, " perf_cntr_intr_bit");
	if (cpu_has_ufr)
		seq_puts(m, " ufr");
	if (cpu_has_fre)
		seq_puts(m, " fre");
	if (cpu_has_cdmm)
		seq_puts(m, " cdmm");
	if (cpu_has_small_pages)
		seq_puts(m, " small_pages");
	if (cpu_has_nan_legacy)
		seq_puts(m, " nan_legacy");
	if (cpu_has_nan_2008)
		seq_puts(m, " nan_2008");
	if (cpu_has_ebase_wg)
		seq_puts(m, " ebase_wg");
	if (cpu_has_badinstr)
		seq_puts(m, " badinstr");
	if (cpu_has_badinstrp)
		seq_puts(m, " badinstrp");
	if (cpu_has_contextconfig)
		seq_puts(m, " contextconfig");
	if (cpu_has_perf)
		seq_puts(m, " perf");
	if (cpu_has_mac2008_only)
		seq_puts(m, " mac2008_only");
	if (cpu_has_ftlbparex)
		seq_puts(m, " ftlbparex");
	if (cpu_has_gsexcex)
		seq_puts(m, " gsexcex");
	if (cpu_has_shared_ftlb_ram)
		seq_puts(m, " shared_ftlb_ram");
	if (cpu_has_shared_ftlb_entries)
		seq_puts(m, " shared_ftlb_entries");
	if (cpu_has_mipsmt_pertccounters)
		seq_puts(m, " mipsmt_pertccounters");
	if (cpu_has_mmid)
		seq_puts(m, " mmid");
	if (cpu_has_mm_sysad)
		seq_puts(m, " mm_sysad");
	if (cpu_has_mm_full)
		seq_puts(m, " mm_full");
	seq_puts(m, "\n");

	seq_printf(m, "shadow register sets\t: %d\n",
		      cpu_data[n].srsets);
	seq_printf(m, "kscratch registers\t: %d\n",
		      hweight8(cpu_data[n].kscratch_mask));
	seq_printf(m, "package\t\t\t: %d\n", cpu_data[n].package);
	seq_printf(m, "core\t\t\t: %d\n", cpu_core(&cpu_data[n]));

#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_CPU_MIPSR6)
	if (cpu_has_mipsmt)
		seq_printf(m, "VPE\t\t\t: %d\n", cpu_vpe_id(&cpu_data[n]));
	else if (cpu_has_vp)
		seq_printf(m, "VP\t\t\t: %d\n", cpu_vpe_id(&cpu_data[n]));
#endif

	sprintf(fmt, "VCE%%c exceptions\t\t: %s\n",
		      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_puts(m, "\n");

	return 0;
}

static void *c_start(struct seq_file *m, loff_t *pos)
{
	unsigned long i = *pos;

	return i < NR_CPUS ? (void *) (i + 1) : NULL;
}

static void *c_next(struct seq_file *m, void *v, loff_t *pos)
{
	++*pos;
	return c_start(m, pos);
}

static void c_stop(struct seq_file *m, void *v)
{
}

const struct seq_operations cpuinfo_op = {
	.start	= c_start,
	.next	= c_next,
	.stop	= c_stop,
	.show	= show_cpuinfo,
};
