162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2012 Synopsys, Inc. (www.synopsys.com)
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * based on METAG mach/arch.h (which in turn was based on ARM)
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _ASM_ARC_MACH_DESC_H_
962306a36Sopenharmony_ci#define _ASM_ARC_MACH_DESC_H_
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/**
1262306a36Sopenharmony_ci * struct machine_desc - Board specific callbacks, called from ARC common code
1362306a36Sopenharmony_ci *	Provided by each ARC board using MACHINE_START()/MACHINE_END(), so
1462306a36Sopenharmony_ci *	a multi-platform kernel builds with array of such descriptors.
1562306a36Sopenharmony_ci *	We extend the early DT scan to also match the DT's "compatible" string
1662306a36Sopenharmony_ci *	against the @dt_compat of all such descriptors, and one with highest
1762306a36Sopenharmony_ci *	"DT score" is selected as global @machine_desc.
1862306a36Sopenharmony_ci *
1962306a36Sopenharmony_ci * @name:		Board/SoC name
2062306a36Sopenharmony_ci * @dt_compat:		Array of device tree 'compatible' strings
2162306a36Sopenharmony_ci * 			(XXX: although only 1st entry is looked at)
2262306a36Sopenharmony_ci * @init_early:		Very early callback [called from setup_arch()]
2362306a36Sopenharmony_ci * @init_per_cpu:	for each CPU as it is coming up (SMP as well as UP)
2462306a36Sopenharmony_ci * 			[(M):init_IRQ(), (o):start_kernel_secondary()]
2562306a36Sopenharmony_ci * @init_machine:	arch initcall level callback (e.g. populate static
2662306a36Sopenharmony_ci * 			platform devices or parse Devicetree)
2762306a36Sopenharmony_ci * @init_late:		Late initcall level callback
2862306a36Sopenharmony_ci *
2962306a36Sopenharmony_ci */
3062306a36Sopenharmony_cistruct machine_desc {
3162306a36Sopenharmony_ci	const char		*name;
3262306a36Sopenharmony_ci	const char		**dt_compat;
3362306a36Sopenharmony_ci	void			(*init_early)(void);
3462306a36Sopenharmony_ci	void			(*init_per_cpu)(unsigned int);
3562306a36Sopenharmony_ci	void			(*init_machine)(void);
3662306a36Sopenharmony_ci	void			(*init_late)(void);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/*
4162306a36Sopenharmony_ci * Current machine - only accessible during boot.
4262306a36Sopenharmony_ci */
4362306a36Sopenharmony_ciextern const struct machine_desc *machine_desc;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci/*
4662306a36Sopenharmony_ci * Machine type table - also only accessible during boot
4762306a36Sopenharmony_ci */
4862306a36Sopenharmony_ciextern const struct machine_desc __arch_info_begin[], __arch_info_end[];
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci/*
5162306a36Sopenharmony_ci * Set of macros to define architecture features.
5262306a36Sopenharmony_ci * This is built into a table by the linker.
5362306a36Sopenharmony_ci */
5462306a36Sopenharmony_ci#define MACHINE_START(_type, _name)			\
5562306a36Sopenharmony_cistatic const struct machine_desc __mach_desc_##_type	\
5662306a36Sopenharmony_ci__used __section(".arch.info.init") = {			\
5762306a36Sopenharmony_ci	.name		= _name,
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define MACHINE_END				\
6062306a36Sopenharmony_ci};
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciextern const struct machine_desc *setup_machine_fdt(void *dt);
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#endif
65