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