162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Generic support for queying CPU info
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu>
662306a36Sopenharmony_ci * Copyright (C) 2007-2009 PetaLogix
762306a36Sopenharmony_ci * Copyright (C) 2007 John Williams <jwilliams@itee.uq.edu.au>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef _ASM_MICROBLAZE_CPUINFO_H
1162306a36Sopenharmony_ci#define _ASM_MICROBLAZE_CPUINFO_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/of.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* CPU Version and FPGA Family code conversion table type */
1662306a36Sopenharmony_cistruct cpu_ver_key {
1762306a36Sopenharmony_ci	const char *s;
1862306a36Sopenharmony_ci	const unsigned k;
1962306a36Sopenharmony_ci};
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciextern const struct cpu_ver_key cpu_ver_lookup[];
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct family_string_key {
2462306a36Sopenharmony_ci	const char *s;
2562306a36Sopenharmony_ci	const unsigned k;
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciextern const struct family_string_key family_string_lookup[];
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistruct cpuinfo {
3162306a36Sopenharmony_ci	/* Core CPU configuration */
3262306a36Sopenharmony_ci	u32 use_instr;
3362306a36Sopenharmony_ci	u32 use_mult;
3462306a36Sopenharmony_ci	u32 use_fpu;
3562306a36Sopenharmony_ci	u32 use_exc;
3662306a36Sopenharmony_ci	u32 ver_code;
3762306a36Sopenharmony_ci	u32 mmu;
3862306a36Sopenharmony_ci	u32 mmu_privins;
3962306a36Sopenharmony_ci	u32 endian;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	/* CPU caches */
4262306a36Sopenharmony_ci	u32 use_icache;
4362306a36Sopenharmony_ci	u32 icache_tagbits;
4462306a36Sopenharmony_ci	u32 icache_write;
4562306a36Sopenharmony_ci	u32 icache_line_length;
4662306a36Sopenharmony_ci	u32 icache_size;
4762306a36Sopenharmony_ci	unsigned long icache_base;
4862306a36Sopenharmony_ci	unsigned long icache_high;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	u32 use_dcache;
5162306a36Sopenharmony_ci	u32 dcache_tagbits;
5262306a36Sopenharmony_ci	u32 dcache_write;
5362306a36Sopenharmony_ci	u32 dcache_line_length;
5462306a36Sopenharmony_ci	u32 dcache_size;
5562306a36Sopenharmony_ci	u32 dcache_wb;
5662306a36Sopenharmony_ci	unsigned long dcache_base;
5762306a36Sopenharmony_ci	unsigned long dcache_high;
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	/* Bus connections */
6062306a36Sopenharmony_ci	u32 use_dopb;
6162306a36Sopenharmony_ci	u32 use_iopb;
6262306a36Sopenharmony_ci	u32 use_dlmb;
6362306a36Sopenharmony_ci	u32 use_ilmb;
6462306a36Sopenharmony_ci	u32 num_fsl;
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	/* CPU interrupt line info */
6762306a36Sopenharmony_ci	u32 irq_edge;
6862306a36Sopenharmony_ci	u32 irq_positive;
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	u32 area_optimised;
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	/* HW debug support */
7362306a36Sopenharmony_ci	u32 hw_debug;
7462306a36Sopenharmony_ci	u32 num_pc_brk;
7562306a36Sopenharmony_ci	u32 num_rd_brk;
7662306a36Sopenharmony_ci	u32 num_wr_brk;
7762306a36Sopenharmony_ci	u32 cpu_clock_freq; /* store real freq of cpu */
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	/* FPGA family */
8062306a36Sopenharmony_ci	u32 fpga_family_code;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	/* User define */
8362306a36Sopenharmony_ci	u32 pvr_user1;
8462306a36Sopenharmony_ci	u32 pvr_user2;
8562306a36Sopenharmony_ci};
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ciextern struct cpuinfo cpuinfo;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci/* fwd declarations of the various CPUinfo populators */
9062306a36Sopenharmony_civoid setup_cpuinfo(void);
9162306a36Sopenharmony_civoid setup_cpuinfo_clk(void);
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_civoid set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu);
9462306a36Sopenharmony_civoid set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu);
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cistatic inline unsigned int fcpu(struct device_node *cpu, char *n)
9762306a36Sopenharmony_ci{
9862306a36Sopenharmony_ci	u32 val = 0;
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	of_property_read_u32(cpu, n, &val);
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	return val;
10362306a36Sopenharmony_ci}
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci#endif /* _ASM_MICROBLAZE_CPUINFO_H */
106