162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
362306a36Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
462306a36Sopenharmony_ci * for more details.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2011 by Kevin Cernekee (cernekee@gmail.com)
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Definitions for BMIPS processors
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci#ifndef _ASM_BMIPS_H
1162306a36Sopenharmony_ci#define _ASM_BMIPS_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/compiler.h>
1462306a36Sopenharmony_ci#include <linux/linkage.h>
1562306a36Sopenharmony_ci#include <asm/addrspace.h>
1662306a36Sopenharmony_ci#include <asm/mipsregs.h>
1762306a36Sopenharmony_ci#include <asm/hazards.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/* NOTE: the CBR register returns a PA, and it can be above 0xff00_0000 */
2062306a36Sopenharmony_ci#define BMIPS_GET_CBR()			((void __iomem *)(CKSEG1 | \
2162306a36Sopenharmony_ci					 (unsigned long) \
2262306a36Sopenharmony_ci					 ((read_c0_brcm_cbr() >> 18) << 18)))
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define BMIPS_RAC_CONFIG		0x00000000
2562306a36Sopenharmony_ci#define BMIPS_RAC_ADDRESS_RANGE		0x00000004
2662306a36Sopenharmony_ci#define BMIPS_RAC_CONFIG_1		0x00000008
2762306a36Sopenharmony_ci#define BMIPS_L2_CONFIG			0x0000000c
2862306a36Sopenharmony_ci#define BMIPS_LMB_CONTROL		0x0000001c
2962306a36Sopenharmony_ci#define BMIPS_SYSTEM_BASE		0x00000020
3062306a36Sopenharmony_ci#define BMIPS_PERF_GLOBAL_CONTROL	0x00020000
3162306a36Sopenharmony_ci#define BMIPS_PERF_CONTROL_0		0x00020004
3262306a36Sopenharmony_ci#define BMIPS_PERF_CONTROL_1		0x00020008
3362306a36Sopenharmony_ci#define BMIPS_PERF_COUNTER_0		0x00020010
3462306a36Sopenharmony_ci#define BMIPS_PERF_COUNTER_1		0x00020014
3562306a36Sopenharmony_ci#define BMIPS_PERF_COUNTER_2		0x00020018
3662306a36Sopenharmony_ci#define BMIPS_PERF_COUNTER_3		0x0002001c
3762306a36Sopenharmony_ci#define BMIPS_RELO_VECTOR_CONTROL_0	0x00030000
3862306a36Sopenharmony_ci#define BMIPS_RELO_VECTOR_CONTROL_1	0x00038000
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#define BMIPS_NMI_RESET_VEC		0x80000000
4162306a36Sopenharmony_ci#define BMIPS_WARM_RESTART_VEC		0x80000380
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define ZSCM_REG_BASE			0x97000000
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#if !defined(__ASSEMBLY__)
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#include <linux/cpumask.h>
4862306a36Sopenharmony_ci#include <asm/r4kcache.h>
4962306a36Sopenharmony_ci#include <asm/smp-ops.h>
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciextern const struct plat_smp_ops bmips43xx_smp_ops;
5262306a36Sopenharmony_ciextern const struct plat_smp_ops bmips5000_smp_ops;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistatic inline int register_bmips_smp_ops(void)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_CPU_BMIPS) && IS_ENABLED(CONFIG_SMP)
5762306a36Sopenharmony_ci	switch (current_cpu_type()) {
5862306a36Sopenharmony_ci	case CPU_BMIPS32:
5962306a36Sopenharmony_ci	case CPU_BMIPS3300:
6062306a36Sopenharmony_ci		return register_up_smp_ops();
6162306a36Sopenharmony_ci	case CPU_BMIPS4350:
6262306a36Sopenharmony_ci	case CPU_BMIPS4380:
6362306a36Sopenharmony_ci		register_smp_ops(&bmips43xx_smp_ops);
6462306a36Sopenharmony_ci		break;
6562306a36Sopenharmony_ci	case CPU_BMIPS5000:
6662306a36Sopenharmony_ci		register_smp_ops(&bmips5000_smp_ops);
6762306a36Sopenharmony_ci		break;
6862306a36Sopenharmony_ci	default:
6962306a36Sopenharmony_ci		return -ENODEV;
7062306a36Sopenharmony_ci	}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	return 0;
7362306a36Sopenharmony_ci#else
7462306a36Sopenharmony_ci	return -ENODEV;
7562306a36Sopenharmony_ci#endif
7662306a36Sopenharmony_ci}
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ciextern char bmips_reset_nmi_vec[];
7962306a36Sopenharmony_ciextern char bmips_reset_nmi_vec_end[];
8062306a36Sopenharmony_ciextern char bmips_smp_movevec[];
8162306a36Sopenharmony_ciextern char bmips_smp_int_vec[];
8262306a36Sopenharmony_ciextern char bmips_smp_int_vec_end[];
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ciextern int bmips_smp_enabled;
8562306a36Sopenharmony_ciextern int bmips_cpu_offset;
8662306a36Sopenharmony_ciextern cpumask_t bmips_booted_mask;
8762306a36Sopenharmony_ciextern unsigned long bmips_tp1_irqs;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ciextern void bmips_ebase_setup(void);
9062306a36Sopenharmony_ciextern asmlinkage void plat_wired_tlb_setup(void);
9162306a36Sopenharmony_ciextern void bmips_cpu_setup(void);
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistatic inline unsigned long bmips_read_zscm_reg(unsigned int offset)
9462306a36Sopenharmony_ci{
9562306a36Sopenharmony_ci	unsigned long ret;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	barrier();
9862306a36Sopenharmony_ci	cache_op(Index_Load_Tag_S, ZSCM_REG_BASE + offset);
9962306a36Sopenharmony_ci	__sync();
10062306a36Sopenharmony_ci	_ssnop();
10162306a36Sopenharmony_ci	_ssnop();
10262306a36Sopenharmony_ci	_ssnop();
10362306a36Sopenharmony_ci	_ssnop();
10462306a36Sopenharmony_ci	_ssnop();
10562306a36Sopenharmony_ci	_ssnop();
10662306a36Sopenharmony_ci	_ssnop();
10762306a36Sopenharmony_ci	ret = read_c0_ddatalo();
10862306a36Sopenharmony_ci	_ssnop();
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	return ret;
11162306a36Sopenharmony_ci}
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_cistatic inline void bmips_write_zscm_reg(unsigned int offset, unsigned long data)
11462306a36Sopenharmony_ci{
11562306a36Sopenharmony_ci	write_c0_ddatalo(data);
11662306a36Sopenharmony_ci	_ssnop();
11762306a36Sopenharmony_ci	_ssnop();
11862306a36Sopenharmony_ci	_ssnop();
11962306a36Sopenharmony_ci	cache_op(Index_Store_Tag_S, ZSCM_REG_BASE + offset);
12062306a36Sopenharmony_ci	_ssnop();
12162306a36Sopenharmony_ci	_ssnop();
12262306a36Sopenharmony_ci	_ssnop();
12362306a36Sopenharmony_ci	barrier();
12462306a36Sopenharmony_ci}
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci#endif /* !defined(__ASSEMBLY__) */
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci#endif /* _ASM_BMIPS_H */
129