xref: /rk3399_ARM-atf/include/lib/cpus/aarch32/cpu_macros.S (revision 007433d8cf54afeab7e2fe160c5710e6035c7705)
1e33b78a6SSoby Mathew/*
242d4d3baSArvind Ram Prakash * Copyright (c) 2016-2023, ARM Limited and Contributors. All rights reserved.
3e33b78a6SSoby Mathew *
482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause
5e33b78a6SSoby Mathew */
6c3cf06f1SAntonio Nino Diaz#ifndef CPU_MACROS_S
7c3cf06f1SAntonio Nino Diaz#define CPU_MACROS_S
8e33b78a6SSoby Mathew
9e33b78a6SSoby Mathew#include <arch.h>
10*007433d8SBoyan Karatotev#include <lib/cpus/cpu_ops.h>
1109d40e0eSAntonio Nino Diaz#include <lib/cpus/errata_report.h>
12e33b78a6SSoby Mathew
13e33b78a6SSoby Mathew	/*
145dd9dbb5SJeenu Viswambharan	 * Write given expressions as words
155dd9dbb5SJeenu Viswambharan	 *
165dd9dbb5SJeenu Viswambharan	 * _count:
175dd9dbb5SJeenu Viswambharan	 *	Write at least _count words. If the given number of expressions
185dd9dbb5SJeenu Viswambharan	 *	is less than _count, repeat the last expression to fill _count
195dd9dbb5SJeenu Viswambharan	 *	words in total
205dd9dbb5SJeenu Viswambharan	 * _rest:
215dd9dbb5SJeenu Viswambharan	 *	Optional list of expressions. _this is for parameter extraction
225dd9dbb5SJeenu Viswambharan	 *	only, and has no significance to the caller
235dd9dbb5SJeenu Viswambharan	 *
245dd9dbb5SJeenu Viswambharan	 * Invoked as:
255dd9dbb5SJeenu Viswambharan	 *	fill_constants 2, foo, bar, blah, ...
26e33b78a6SSoby Mathew	 */
275dd9dbb5SJeenu Viswambharan	.macro fill_constants _count:req, _this, _rest:vararg
285dd9dbb5SJeenu Viswambharan	  .ifgt \_count
295dd9dbb5SJeenu Viswambharan	    /* Write the current expression */
305dd9dbb5SJeenu Viswambharan	    .ifb \_this
315dd9dbb5SJeenu Viswambharan	      .error "Nothing to fill"
325dd9dbb5SJeenu Viswambharan	    .endif
335dd9dbb5SJeenu Viswambharan	    .word \_this
345dd9dbb5SJeenu Viswambharan
355dd9dbb5SJeenu Viswambharan	    /* Invoke recursively for remaining expressions */
365dd9dbb5SJeenu Viswambharan	    .ifnb \_rest
375dd9dbb5SJeenu Viswambharan	      fill_constants \_count-1, \_rest
385dd9dbb5SJeenu Viswambharan	    .else
395dd9dbb5SJeenu Viswambharan	      fill_constants \_count-1, \_this
405dd9dbb5SJeenu Viswambharan	    .endif
415dd9dbb5SJeenu Viswambharan	  .endif
425dd9dbb5SJeenu Viswambharan	.endm
435dd9dbb5SJeenu Viswambharan
445dd9dbb5SJeenu Viswambharan	/*
455dd9dbb5SJeenu Viswambharan	 * Declare CPU operations
465dd9dbb5SJeenu Viswambharan	 *
475dd9dbb5SJeenu Viswambharan	 * _name:
485dd9dbb5SJeenu Viswambharan	 *	Name of the CPU for which operations are being specified
495dd9dbb5SJeenu Viswambharan	 * _midr:
505dd9dbb5SJeenu Viswambharan	 *	Numeric value expected to read from CPU's MIDR
515dd9dbb5SJeenu Viswambharan	 * _resetfunc:
525dd9dbb5SJeenu Viswambharan	 *	Reset function for the CPU. If there's no CPU reset function,
535dd9dbb5SJeenu Viswambharan	 *	specify CPU_NO_RESET_FUNC
545dd9dbb5SJeenu Viswambharan	 * _power_down_ops:
555dd9dbb5SJeenu Viswambharan	 *	Comma-separated list of functions to perform power-down
565dd9dbb5SJeenu Viswambharan	 *	operatios on the CPU. At least one, and up to
575dd9dbb5SJeenu Viswambharan	 *	CPU_MAX_PWR_DWN_OPS number of functions may be specified.
585dd9dbb5SJeenu Viswambharan	 *	Starting at power level 0, these functions shall handle power
595dd9dbb5SJeenu Viswambharan	 *	down at subsequent power levels. If there aren't exactly
605dd9dbb5SJeenu Viswambharan	 *	CPU_MAX_PWR_DWN_OPS functions, the last specified one will be
615dd9dbb5SJeenu Viswambharan	 *	used to handle power down at subsequent levels
625dd9dbb5SJeenu Viswambharan	 */
635dd9dbb5SJeenu Viswambharan	.macro declare_cpu_ops _name:req, _midr:req, _resetfunc:req, \
645dd9dbb5SJeenu Viswambharan		_power_down_ops:vararg
65da04341eSChris Kay	.section .cpu_ops, "a"
66e33b78a6SSoby Mathew	.align 2
67e33b78a6SSoby Mathew	.type cpu_ops_\_name, %object
68e33b78a6SSoby Mathew	.word \_midr
69b1d27b48SRoberto Vargas#if defined(IMAGE_AT_EL3)
705dd9dbb5SJeenu Viswambharan	.word \_resetfunc
711a0a3f06SYatharth Kochar#endif
723d8256b2SMasahiro Yamada#ifdef IMAGE_BL32
735dd9dbb5SJeenu Viswambharan	/* Insert list of functions */
745dd9dbb5SJeenu Viswambharan	fill_constants CPU_MAX_PWR_DWN_OPS, \_power_down_ops
751a0a3f06SYatharth Kochar#endif
7610bcd761SJeenu Viswambharan
7710bcd761SJeenu Viswambharan#if REPORT_ERRATA
7810bcd761SJeenu Viswambharan	.ifndef \_name\()_cpu_str
7910bcd761SJeenu Viswambharan	  /*
8010bcd761SJeenu Viswambharan	   * Place errata reported flag, and the spinlock to arbitrate access to
8110bcd761SJeenu Viswambharan	   * it in the data section.
8210bcd761SJeenu Viswambharan	   */
8310bcd761SJeenu Viswambharan	  .pushsection .data
8410bcd761SJeenu Viswambharan	  define_asm_spinlock \_name\()_errata_lock
8510bcd761SJeenu Viswambharan	  \_name\()_errata_reported:
8610bcd761SJeenu Viswambharan	  .word	0
8710bcd761SJeenu Viswambharan	  .popsection
8810bcd761SJeenu Viswambharan
8910bcd761SJeenu Viswambharan	  /* Place CPU string in rodata */
9010bcd761SJeenu Viswambharan	  .pushsection .rodata
9110bcd761SJeenu Viswambharan	  \_name\()_cpu_str:
9210bcd761SJeenu Viswambharan	  .asciz "\_name"
9310bcd761SJeenu Viswambharan	  .popsection
9410bcd761SJeenu Viswambharan	.endif
9510bcd761SJeenu Viswambharan
9610bcd761SJeenu Viswambharan	/*
9712af5ed4SSoby Mathew	 * Mandatory errata status printing function for CPUs of
9810bcd761SJeenu Viswambharan	 * this class.
9910bcd761SJeenu Viswambharan	 */
10010bcd761SJeenu Viswambharan	.word \_name\()_errata_report
10110bcd761SJeenu Viswambharan
10210bcd761SJeenu Viswambharan#ifdef IMAGE_BL32
10310bcd761SJeenu Viswambharan	/* Pointers to errata lock and reported flag */
10410bcd761SJeenu Viswambharan	.word \_name\()_errata_lock
10510bcd761SJeenu Viswambharan	.word \_name\()_errata_reported
10610bcd761SJeenu Viswambharan#endif
10710bcd761SJeenu Viswambharan#endif
108e33b78a6SSoby Mathew	.endm
109e33b78a6SSoby Mathew
11010bcd761SJeenu Viswambharan#if REPORT_ERRATA
11110bcd761SJeenu Viswambharan	/*
11210bcd761SJeenu Viswambharan	 * Print status of a CPU errata
11310bcd761SJeenu Viswambharan	 *
11410bcd761SJeenu Viswambharan	 * _chosen:
11510bcd761SJeenu Viswambharan	 *	Identifier indicating whether or not a CPU errata has been
11610bcd761SJeenu Viswambharan	 *	compiled in.
11710bcd761SJeenu Viswambharan	 * _cpu:
11810bcd761SJeenu Viswambharan	 *	Name of the CPU
11910bcd761SJeenu Viswambharan	 * _id:
12010bcd761SJeenu Viswambharan	 *	Errata identifier
12110bcd761SJeenu Viswambharan	 * _rev_var:
12210bcd761SJeenu Viswambharan	 *	Register containing the combined value CPU revision and variant
12310bcd761SJeenu Viswambharan	 *	- typically the return value of cpu_get_rev_var
12410bcd761SJeenu Viswambharan	 */
12510bcd761SJeenu Viswambharan	.macro report_errata _chosen, _cpu, _id, _rev_var=r4
12610bcd761SJeenu Viswambharan	/* Stash a string with errata ID */
12710bcd761SJeenu Viswambharan	.pushsection .rodata
12810bcd761SJeenu Viswambharan	\_cpu\()_errata_\_id\()_str:
12910bcd761SJeenu Viswambharan	.asciz	"\_id"
13010bcd761SJeenu Viswambharan	.popsection
13110bcd761SJeenu Viswambharan
13210bcd761SJeenu Viswambharan	/* Check whether errata applies */
13310bcd761SJeenu Viswambharan	mov	r0, \_rev_var
13410bcd761SJeenu Viswambharan	bl	check_errata_\_id
13510bcd761SJeenu Viswambharan
13610bcd761SJeenu Viswambharan	.ifeq \_chosen
13710bcd761SJeenu Viswambharan	/*
13810bcd761SJeenu Viswambharan	 * Errata workaround has not been compiled in. If the errata would have
13910bcd761SJeenu Viswambharan	 * applied had it been compiled in, print its status as missing.
14010bcd761SJeenu Viswambharan	 */
14110bcd761SJeenu Viswambharan	cmp	r0, #0
14210bcd761SJeenu Viswambharan	movne	r0, #ERRATA_MISSING
14310bcd761SJeenu Viswambharan	.endif
14410bcd761SJeenu Viswambharan	ldr	r1, =\_cpu\()_cpu_str
14510bcd761SJeenu Viswambharan	ldr	r2, =\_cpu\()_errata_\_id\()_str
14610bcd761SJeenu Viswambharan	bl	errata_print_msg
14710bcd761SJeenu Viswambharan	.endm
14810bcd761SJeenu Viswambharan#endif
149da3b038fSDeepak Pandey	/*
150da3b038fSDeepak Pandey	 * Helper macro that reads the part number of the current CPU and jumps
151da3b038fSDeepak Pandey	 * to the given label if it matches the CPU MIDR provided.
152da3b038fSDeepak Pandey	 *
153da3b038fSDeepak Pandey	 * Clobbers: r0-r1
154da3b038fSDeepak Pandey	 */
155da3b038fSDeepak Pandey	.macro  jump_if_cpu_midr _cpu_midr, _label
156da3b038fSDeepak Pandey	ldcopr	r0, MIDR
157da3b038fSDeepak Pandey	ubfx	r0, r0, #MIDR_PN_SHIFT, #12
158da3b038fSDeepak Pandey	ldr	r1, =((\_cpu_midr >> MIDR_PN_SHIFT) & MIDR_PN_MASK)
159da3b038fSDeepak Pandey	cmp	r0, r1
160da3b038fSDeepak Pandey	beq	\_label
161da3b038fSDeepak Pandey	.endm
16210bcd761SJeenu Viswambharan
163c3cf06f1SAntonio Nino Diaz#endif /* CPU_MACROS_S */
164