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