blob: bf1a17ab030e41eca091d167c6e47fdf8867c400 [file] [log] [blame]
Rayagonda Kokatanur13dc1c22020-07-15 22:48:56 +05301/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Copyright 2020 Broadcom.
4 *
5 */
6
7#include <asm/macro.h>
8#include <linux/linkage.h>
9
10hnf_pstate_poll:
11 /* x0 has the desired status, return 0 for success, 1 for timeout
12 * clobber x1, x2, x3, x4, x6, x7
13 */
14 mov x1, x0
15 mov x7, #0 /* flag for timeout */
16 mrs x3, cntpct_el0 /* read timer */
17 mov w0, #600
18 mov w6, #1000
19 mul w0, w0, w6
20 add x3, x3, x0 /* timeout after 100 microseconds */
21 mov x0, #0x18
22 movk x0, #0x6120, lsl #16 /* HNF0_PSTATE_STATUS */
23 mov w6, #4 /* HN-F node count */
241:
25 ldr x2, [x0]
26 cmp x2, x1 /* check status */
27 b.eq 2f
28 mrs x4, cntpct_el0
29 cmp x4, x3
30 b.ls 1b
31 mov x7, #1 /* timeout */
32 b 3f
332:
34 add x0, x0, #0x10000 /* move to next node */
35 subs w6, w6, #1
36 cbnz w6, 1b
373:
38 mov x0, x7
39 ret
40
41hnf_set_pstate:
42 /* x0 has the desired state, clobber x1, x2, x6 */
43 mov x1, x0
44 /* power state to SFONLY */
45 mov w6, #4 /* HN-F node count */
46 mov x0, #0x10
47 movk x0, #0x6120, lsl #16 /* HNF0_PSTATE_REQ */
481: /* set pstate to sfonly */
49 ldr x2, [x0]
50 and x2, x2, #0xfffffffffffffffc /* & HNFPSTAT_MASK */
51 orr x2, x2, x1
52 str x2, [x0]
53 add x0, x0, #0x10000 /* move to next node */
54 subs w6, w6, #1
55 cbnz w6, 1b
56
57 ret
58
59ENTRY(__asm_flush_l3_dcache)
60 /*
61 * Return status in x0
62 * success 0
63 * timeout 1 for setting SFONLY, 2 for FAM, 3 for both
64 */
65 mov x29, lr
66 mov x8, #0
67
68 dsb sy
69 mov x0, #0x1 /* HNFPSTAT_SFONLY */
70 bl hnf_set_pstate
71
72 mov x0, #0x4 /* SFONLY status */
73 bl hnf_pstate_poll
74 cbz x0, 1f
75 mov x8, #1 /* timeout */
761:
77 dsb sy
78 mov x0, #0x3 /* HNFPSTAT_FAM */
79 bl hnf_set_pstate
80
81 mov x0, #0xc /* FAM status */
82 bl hnf_pstate_poll
83 cbz x0, 1f
84 add x8, x8, #0x2
851:
86 mov x0, x8
87 mov lr, x29
88 ret
89ENDPROC(__asm_flush_l3_dcache)
Abhishek Shaha2936da2020-07-15 22:48:59 +053090
91ENTRY(save_boot_params)
92/*
93 * void set_boot_params(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3)
94 */
95 adr x4, bl33_info
96 str x0, [x4]
97 b save_boot_params_ret
98ENDPROC(save_boot_params)