1/* 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)
90
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)
99