xref: /rk3399_ARM-atf/include/lib/cpus/aarch32/cpu_macros.S (revision 10bcd761574a5aaa208041382399e05275011603)
1e33b78a6SSoby Mathew/*
2*10bcd761SJeenu Viswambharan * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
3e33b78a6SSoby Mathew *
4e33b78a6SSoby Mathew * Redistribution and use in source and binary forms, with or without
5e33b78a6SSoby Mathew * modification, are permitted provided that the following conditions are met:
6e33b78a6SSoby Mathew *
7e33b78a6SSoby Mathew * Redistributions of source code must retain the above copyright notice, this
8e33b78a6SSoby Mathew * list of conditions and the following disclaimer.
9e33b78a6SSoby Mathew *
10e33b78a6SSoby Mathew * Redistributions in binary form must reproduce the above copyright notice,
11e33b78a6SSoby Mathew * this list of conditions and the following disclaimer in the documentation
12e33b78a6SSoby Mathew * and/or other materials provided with the distribution.
13e33b78a6SSoby Mathew *
14e33b78a6SSoby Mathew * Neither the name of ARM nor the names of its contributors may be used
15e33b78a6SSoby Mathew * to endorse or promote products derived from this software without specific
16e33b78a6SSoby Mathew * prior written permission.
17e33b78a6SSoby Mathew *
18e33b78a6SSoby Mathew * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19e33b78a6SSoby Mathew * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20e33b78a6SSoby Mathew * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21e33b78a6SSoby Mathew * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22e33b78a6SSoby Mathew * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23e33b78a6SSoby Mathew * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24e33b78a6SSoby Mathew * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25e33b78a6SSoby Mathew * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26e33b78a6SSoby Mathew * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27e33b78a6SSoby Mathew * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28e33b78a6SSoby Mathew * POSSIBILITY OF SUCH DAMAGE.
29e33b78a6SSoby Mathew */
30e33b78a6SSoby Mathew#ifndef __CPU_MACROS_S__
31e33b78a6SSoby Mathew#define __CPU_MACROS_S__
32e33b78a6SSoby Mathew
33e33b78a6SSoby Mathew#include <arch.h>
34*10bcd761SJeenu Viswambharan#include <errata_report.h>
35e33b78a6SSoby Mathew
36e33b78a6SSoby Mathew#define CPU_IMPL_PN_MASK	(MIDR_IMPL_MASK << MIDR_IMPL_SHIFT) | \
37e33b78a6SSoby Mathew				(MIDR_PN_MASK << MIDR_PN_SHIFT)
38e33b78a6SSoby Mathew
395dd9dbb5SJeenu Viswambharan/* The number of CPU operations allowed */
405dd9dbb5SJeenu Viswambharan#define CPU_MAX_PWR_DWN_OPS		2
415dd9dbb5SJeenu Viswambharan
425dd9dbb5SJeenu Viswambharan/* Special constant to specify that CPU has no reset function */
435dd9dbb5SJeenu Viswambharan#define CPU_NO_RESET_FUNC		0
445dd9dbb5SJeenu Viswambharan
455dd9dbb5SJeenu Viswambharan/* Word size for 32-bit CPUs */
465dd9dbb5SJeenu Viswambharan#define CPU_WORD_SIZE			4
475dd9dbb5SJeenu Viswambharan
48e33b78a6SSoby Mathew/*
49*10bcd761SJeenu Viswambharan * Whether errata status needs reporting. Errata status is printed in debug
50*10bcd761SJeenu Viswambharan * builds for both BL1 and BL32 images.
51*10bcd761SJeenu Viswambharan */
52*10bcd761SJeenu Viswambharan#if (defined(IMAGE_BL1) || defined(IMAGE_BL32)) && DEBUG
53*10bcd761SJeenu Viswambharan# define REPORT_ERRATA	1
54*10bcd761SJeenu Viswambharan#else
55*10bcd761SJeenu Viswambharan# define REPORT_ERRATA	0
56*10bcd761SJeenu Viswambharan#endif
57*10bcd761SJeenu Viswambharan
58*10bcd761SJeenu Viswambharan	/*
59e33b78a6SSoby Mathew	 * Define the offsets to the fields in cpu_ops structure.
60e33b78a6SSoby Mathew	 */
61e33b78a6SSoby Mathew	.struct 0
62e33b78a6SSoby MathewCPU_MIDR: /* cpu_ops midr */
63e33b78a6SSoby Mathew	.space  4
64e33b78a6SSoby Mathew/* Reset fn is needed during reset */
653d8256b2SMasahiro Yamada#if defined(IMAGE_BL1) || defined(IMAGE_BL32)
66e33b78a6SSoby MathewCPU_RESET_FUNC: /* cpu_ops reset_func */
67e33b78a6SSoby Mathew	.space  4
681a0a3f06SYatharth Kochar#endif
693d8256b2SMasahiro Yamada#ifdef IMAGE_BL32 /* The power down core and cluster is needed only in BL32 */
705dd9dbb5SJeenu ViswambharanCPU_PWR_DWN_OPS: /* cpu_ops power down functions */
715dd9dbb5SJeenu Viswambharan	.space  (4 * CPU_MAX_PWR_DWN_OPS)
721a0a3f06SYatharth Kochar#endif
73*10bcd761SJeenu Viswambharan
74*10bcd761SJeenu Viswambharan/*
75*10bcd761SJeenu Viswambharan * Fields required to print errata status. Only in BL32 that the printing
76*10bcd761SJeenu Viswambharan * require mutual exclusion and printed flag.
77*10bcd761SJeenu Viswambharan */
78*10bcd761SJeenu Viswambharan#if REPORT_ERRATA
79*10bcd761SJeenu ViswambharanCPU_ERRATA_FUNC: /* CPU errata status printing function */
80*10bcd761SJeenu Viswambharan	.space  4
81*10bcd761SJeenu Viswambharan#ifdef IMAGE_BL32
82*10bcd761SJeenu ViswambharanCPU_ERRATA_LOCK:
83*10bcd761SJeenu Viswambharan	.space	4
84*10bcd761SJeenu ViswambharanCPU_ERRATA_PRINTED:
85*10bcd761SJeenu Viswambharan	.space	4
86*10bcd761SJeenu Viswambharan#endif
87*10bcd761SJeenu Viswambharan#endif
88*10bcd761SJeenu Viswambharan
89e33b78a6SSoby MathewCPU_OPS_SIZE = .
90e33b78a6SSoby Mathew
91e33b78a6SSoby Mathew	/*
925dd9dbb5SJeenu Viswambharan	 * Write given expressions as words
935dd9dbb5SJeenu Viswambharan	 *
945dd9dbb5SJeenu Viswambharan	 * _count:
955dd9dbb5SJeenu Viswambharan	 *	Write at least _count words. If the given number of expressions
965dd9dbb5SJeenu Viswambharan	 *	is less than _count, repeat the last expression to fill _count
975dd9dbb5SJeenu Viswambharan	 *	words in total
985dd9dbb5SJeenu Viswambharan	 * _rest:
995dd9dbb5SJeenu Viswambharan	 *	Optional list of expressions. _this is for parameter extraction
1005dd9dbb5SJeenu Viswambharan	 *	only, and has no significance to the caller
1015dd9dbb5SJeenu Viswambharan	 *
1025dd9dbb5SJeenu Viswambharan	 * Invoked as:
1035dd9dbb5SJeenu Viswambharan	 *	fill_constants 2, foo, bar, blah, ...
104e33b78a6SSoby Mathew	 */
1055dd9dbb5SJeenu Viswambharan	.macro fill_constants _count:req, _this, _rest:vararg
1065dd9dbb5SJeenu Viswambharan	  .ifgt \_count
1075dd9dbb5SJeenu Viswambharan	    /* Write the current expression */
1085dd9dbb5SJeenu Viswambharan	    .ifb \_this
1095dd9dbb5SJeenu Viswambharan	      .error "Nothing to fill"
1105dd9dbb5SJeenu Viswambharan	    .endif
1115dd9dbb5SJeenu Viswambharan	    .word \_this
1125dd9dbb5SJeenu Viswambharan
1135dd9dbb5SJeenu Viswambharan	    /* Invoke recursively for remaining expressions */
1145dd9dbb5SJeenu Viswambharan	    .ifnb \_rest
1155dd9dbb5SJeenu Viswambharan	      fill_constants \_count-1, \_rest
1165dd9dbb5SJeenu Viswambharan	    .else
1175dd9dbb5SJeenu Viswambharan	      fill_constants \_count-1, \_this
1185dd9dbb5SJeenu Viswambharan	    .endif
1195dd9dbb5SJeenu Viswambharan	  .endif
1205dd9dbb5SJeenu Viswambharan	.endm
1215dd9dbb5SJeenu Viswambharan
1225dd9dbb5SJeenu Viswambharan	/*
1235dd9dbb5SJeenu Viswambharan	 * Declare CPU operations
1245dd9dbb5SJeenu Viswambharan	 *
1255dd9dbb5SJeenu Viswambharan	 * _name:
1265dd9dbb5SJeenu Viswambharan	 *	Name of the CPU for which operations are being specified
1275dd9dbb5SJeenu Viswambharan	 * _midr:
1285dd9dbb5SJeenu Viswambharan	 *	Numeric value expected to read from CPU's MIDR
1295dd9dbb5SJeenu Viswambharan	 * _resetfunc:
1305dd9dbb5SJeenu Viswambharan	 *	Reset function for the CPU. If there's no CPU reset function,
1315dd9dbb5SJeenu Viswambharan	 *	specify CPU_NO_RESET_FUNC
1325dd9dbb5SJeenu Viswambharan	 * _power_down_ops:
1335dd9dbb5SJeenu Viswambharan	 *	Comma-separated list of functions to perform power-down
1345dd9dbb5SJeenu Viswambharan	 *	operatios on the CPU. At least one, and up to
1355dd9dbb5SJeenu Viswambharan	 *	CPU_MAX_PWR_DWN_OPS number of functions may be specified.
1365dd9dbb5SJeenu Viswambharan	 *	Starting at power level 0, these functions shall handle power
1375dd9dbb5SJeenu Viswambharan	 *	down at subsequent power levels. If there aren't exactly
1385dd9dbb5SJeenu Viswambharan	 *	CPU_MAX_PWR_DWN_OPS functions, the last specified one will be
1395dd9dbb5SJeenu Viswambharan	 *	used to handle power down at subsequent levels
1405dd9dbb5SJeenu Viswambharan	 */
1415dd9dbb5SJeenu Viswambharan	.macro declare_cpu_ops _name:req, _midr:req, _resetfunc:req, \
1425dd9dbb5SJeenu Viswambharan		_power_down_ops:vararg
143e33b78a6SSoby Mathew	.section cpu_ops, "a"
144e33b78a6SSoby Mathew	.align 2
145e33b78a6SSoby Mathew	.type cpu_ops_\_name, %object
146e33b78a6SSoby Mathew	.word \_midr
1473d8256b2SMasahiro Yamada#if defined(IMAGE_BL1) || defined(IMAGE_BL32)
1485dd9dbb5SJeenu Viswambharan	.word \_resetfunc
1491a0a3f06SYatharth Kochar#endif
1503d8256b2SMasahiro Yamada#ifdef IMAGE_BL32
1515dd9dbb5SJeenu Viswambharan1:
1525dd9dbb5SJeenu Viswambharan	/* Insert list of functions */
1535dd9dbb5SJeenu Viswambharan	fill_constants CPU_MAX_PWR_DWN_OPS, \_power_down_ops
1545dd9dbb5SJeenu Viswambharan2:
1555dd9dbb5SJeenu Viswambharan	/*
1565dd9dbb5SJeenu Viswambharan	 * Error if no or more than CPU_MAX_PWR_DWN_OPS were specified in the
1575dd9dbb5SJeenu Viswambharan	 * list
1585dd9dbb5SJeenu Viswambharan	 */
1595dd9dbb5SJeenu Viswambharan	.ifeq 2b - 1b
1605dd9dbb5SJeenu Viswambharan	  .error "At least one power down function must be specified"
1615dd9dbb5SJeenu Viswambharan	.else
1625dd9dbb5SJeenu Viswambharan	  .iflt 2b - 1b - (CPU_MAX_PWR_DWN_OPS * CPU_WORD_SIZE)
1635dd9dbb5SJeenu Viswambharan	    .error "More than CPU_MAX_PWR_DWN_OPS functions specified"
1645dd9dbb5SJeenu Viswambharan	  .endif
1655dd9dbb5SJeenu Viswambharan	.endif
1661a0a3f06SYatharth Kochar#endif
167*10bcd761SJeenu Viswambharan
168*10bcd761SJeenu Viswambharan#if REPORT_ERRATA
169*10bcd761SJeenu Viswambharan	.ifndef \_name\()_cpu_str
170*10bcd761SJeenu Viswambharan	  /*
171*10bcd761SJeenu Viswambharan	   * Place errata reported flag, and the spinlock to arbitrate access to
172*10bcd761SJeenu Viswambharan	   * it in the data section.
173*10bcd761SJeenu Viswambharan	   */
174*10bcd761SJeenu Viswambharan	  .pushsection .data
175*10bcd761SJeenu Viswambharan	  define_asm_spinlock \_name\()_errata_lock
176*10bcd761SJeenu Viswambharan	  \_name\()_errata_reported:
177*10bcd761SJeenu Viswambharan	  .word	0
178*10bcd761SJeenu Viswambharan	  .popsection
179*10bcd761SJeenu Viswambharan
180*10bcd761SJeenu Viswambharan	  /* Place CPU string in rodata */
181*10bcd761SJeenu Viswambharan	  .pushsection .rodata
182*10bcd761SJeenu Viswambharan	  \_name\()_cpu_str:
183*10bcd761SJeenu Viswambharan	  .asciz "\_name"
184*10bcd761SJeenu Viswambharan	  .popsection
185*10bcd761SJeenu Viswambharan	.endif
186*10bcd761SJeenu Viswambharan
187*10bcd761SJeenu Viswambharan	/*
188*10bcd761SJeenu Viswambharan	 * Weakly-bound, optional errata status printing function for CPUs of
189*10bcd761SJeenu Viswambharan	 * this class.
190*10bcd761SJeenu Viswambharan	 */
191*10bcd761SJeenu Viswambharan	.weak \_name\()_errata_report
192*10bcd761SJeenu Viswambharan	.word \_name\()_errata_report
193*10bcd761SJeenu Viswambharan
194*10bcd761SJeenu Viswambharan#ifdef IMAGE_BL32
195*10bcd761SJeenu Viswambharan	/* Pointers to errata lock and reported flag */
196*10bcd761SJeenu Viswambharan	.word \_name\()_errata_lock
197*10bcd761SJeenu Viswambharan	.word \_name\()_errata_reported
198*10bcd761SJeenu Viswambharan#endif
199*10bcd761SJeenu Viswambharan#endif
200e33b78a6SSoby Mathew	.endm
201e33b78a6SSoby Mathew
202*10bcd761SJeenu Viswambharan#if REPORT_ERRATA
203*10bcd761SJeenu Viswambharan	/*
204*10bcd761SJeenu Viswambharan	 * Print status of a CPU errata
205*10bcd761SJeenu Viswambharan	 *
206*10bcd761SJeenu Viswambharan	 * _chosen:
207*10bcd761SJeenu Viswambharan	 *	Identifier indicating whether or not a CPU errata has been
208*10bcd761SJeenu Viswambharan	 *	compiled in.
209*10bcd761SJeenu Viswambharan	 * _cpu:
210*10bcd761SJeenu Viswambharan	 *	Name of the CPU
211*10bcd761SJeenu Viswambharan	 * _id:
212*10bcd761SJeenu Viswambharan	 *	Errata identifier
213*10bcd761SJeenu Viswambharan	 * _rev_var:
214*10bcd761SJeenu Viswambharan	 *	Register containing the combined value CPU revision and variant
215*10bcd761SJeenu Viswambharan	 *	- typically the return value of cpu_get_rev_var
216*10bcd761SJeenu Viswambharan	 */
217*10bcd761SJeenu Viswambharan	.macro report_errata _chosen, _cpu, _id, _rev_var=r4
218*10bcd761SJeenu Viswambharan	/* Stash a string with errata ID */
219*10bcd761SJeenu Viswambharan	.pushsection .rodata
220*10bcd761SJeenu Viswambharan	\_cpu\()_errata_\_id\()_str:
221*10bcd761SJeenu Viswambharan	.asciz	"\_id"
222*10bcd761SJeenu Viswambharan	.popsection
223*10bcd761SJeenu Viswambharan
224*10bcd761SJeenu Viswambharan	/* Check whether errata applies */
225*10bcd761SJeenu Viswambharan	mov	r0, \_rev_var
226*10bcd761SJeenu Viswambharan	bl	check_errata_\_id
227*10bcd761SJeenu Viswambharan
228*10bcd761SJeenu Viswambharan	.ifeq \_chosen
229*10bcd761SJeenu Viswambharan	/*
230*10bcd761SJeenu Viswambharan	 * Errata workaround has not been compiled in. If the errata would have
231*10bcd761SJeenu Viswambharan	 * applied had it been compiled in, print its status as missing.
232*10bcd761SJeenu Viswambharan	 */
233*10bcd761SJeenu Viswambharan	cmp	r0, #0
234*10bcd761SJeenu Viswambharan	movne	r0, #ERRATA_MISSING
235*10bcd761SJeenu Viswambharan	.endif
236*10bcd761SJeenu Viswambharan	ldr	r1, =\_cpu\()_cpu_str
237*10bcd761SJeenu Viswambharan	ldr	r2, =\_cpu\()_errata_\_id\()_str
238*10bcd761SJeenu Viswambharan	bl	errata_print_msg
239*10bcd761SJeenu Viswambharan	.endm
240*10bcd761SJeenu Viswambharan#endif
241*10bcd761SJeenu Viswambharan
242e33b78a6SSoby Mathew#endif /* __CPU_MACROS_S__ */
243