/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright 2020 Broadcom. * */ #include #include hnf_pstate_poll: /* x0 has the desired status, return 0 for success, 1 for timeout * clobber x1, x2, x3, x4, x6, x7 */ mov x1, x0 mov x7, #0 /* flag for timeout */ mrs x3, cntpct_el0 /* read timer */ mov w0, #600 mov w6, #1000 mul w0, w0, w6 add x3, x3, x0 /* timeout after 100 microseconds */ mov x0, #0x18 movk x0, #0x6120, lsl #16 /* HNF0_PSTATE_STATUS */ mov w6, #4 /* HN-F node count */ 1: ldr x2, [x0] cmp x2, x1 /* check status */ b.eq 2f mrs x4, cntpct_el0 cmp x4, x3 b.ls 1b mov x7, #1 /* timeout */ b 3f 2: add x0, x0, #0x10000 /* move to next node */ subs w6, w6, #1 cbnz w6, 1b 3: mov x0, x7 ret hnf_set_pstate: /* x0 has the desired state, clobber x1, x2, x6 */ mov x1, x0 /* power state to SFONLY */ mov w6, #4 /* HN-F node count */ mov x0, #0x10 movk x0, #0x6120, lsl #16 /* HNF0_PSTATE_REQ */ 1: /* set pstate to sfonly */ ldr x2, [x0] and x2, x2, #0xfffffffffffffffc /* & HNFPSTAT_MASK */ orr x2, x2, x1 str x2, [x0] add x0, x0, #0x10000 /* move to next node */ subs w6, w6, #1 cbnz w6, 1b ret ENTRY(__asm_flush_l3_dcache) /* * Return status in x0 * success 0 * timeout 1 for setting SFONLY, 2 for FAM, 3 for both */ mov x29, lr mov x8, #0 dsb sy mov x0, #0x1 /* HNFPSTAT_SFONLY */ bl hnf_set_pstate mov x0, #0x4 /* SFONLY status */ bl hnf_pstate_poll cbz x0, 1f mov x8, #1 /* timeout */ 1: dsb sy mov x0, #0x3 /* HNFPSTAT_FAM */ bl hnf_set_pstate mov x0, #0xc /* FAM status */ bl hnf_pstate_poll cbz x0, 1f add x8, x8, #0x2 1: mov x0, x8 mov lr, x29 ret ENDPROC(__asm_flush_l3_dcache) ENTRY(save_boot_params) /* * void set_boot_params(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3) */ adr x4, bl33_info str x0, [x4] b save_boot_params_ret ENDPROC(save_boot_params)