xref: /rk3399_ARM-atf/drivers/arm/css/sds/aarch64/sds_helpers.S (revision 83a2285ec8d5e4bdbf12481b441489eed5bb6018)
1*5932d194SAntonio Nino Diaz/*
2*5932d194SAntonio Nino Diaz * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3*5932d194SAntonio Nino Diaz *
4*5932d194SAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause
5*5932d194SAntonio Nino Diaz */
6*5932d194SAntonio Nino Diaz
7*5932d194SAntonio Nino Diaz#include <arch.h>
8*5932d194SAntonio Nino Diaz#include <asm_macros.S>
9*5932d194SAntonio Nino Diaz#include <drivers/arm/css/sds.h>
10*5932d194SAntonio Nino Diaz#include <platform_def.h>
11*5932d194SAntonio Nino Diaz
12*5932d194SAntonio Nino Diaz#include "../sds_private.h"
13*5932d194SAntonio Nino Diaz
14*5932d194SAntonio Nino Diaz	.globl	sds_get_primary_cpu_id
15*5932d194SAntonio Nino Diaz
16*5932d194SAntonio Nino Diaz	/*
17*5932d194SAntonio Nino Diaz	 * int sds_get_primary_cpu_id(void);
18*5932d194SAntonio Nino Diaz	 * Return the primary CPI ID from SDS Structure
19*5932d194SAntonio Nino Diaz	 * Returns CPUID on success or -1 on failure
20*5932d194SAntonio Nino Diaz	 */
21*5932d194SAntonio Nino Diazfunc sds_get_primary_cpu_id
22*5932d194SAntonio Nino Diaz	mov_imm	x0, PLAT_ARM_SDS_MEM_BASE
23*5932d194SAntonio Nino Diaz	mov	w2, #SDS_REGION_SIGNATURE
24*5932d194SAntonio Nino Diaz	ldr	w1, [x0]
25*5932d194SAntonio Nino Diaz
26*5932d194SAntonio Nino Diaz	/* Check if the SDS region signature found */
27*5932d194SAntonio Nino Diaz	cmp	w2, w1, uxth
28*5932d194SAntonio Nino Diaz	b.ne	2f
29*5932d194SAntonio Nino Diaz
30*5932d194SAntonio Nino Diaz	/* Get the structure count from region descriptor in `w1 */
31*5932d194SAntonio Nino Diaz	ubfx	w1, w1, #SDS_REGION_STRUCT_COUNT_SHIFT, #SDS_REGION_STRUCT_COUNT_WIDTH
32*5932d194SAntonio Nino Diaz	cbz	w1, 2f
33*5932d194SAntonio Nino Diaz	add	x0, x0, #SDS_REGION_DESC_SIZE
34*5932d194SAntonio Nino Diaz
35*5932d194SAntonio Nino Diaz	/* Initialize the loop iterator count in w3 */
36*5932d194SAntonio Nino Diaz	mov	w3, #0
37*5932d194SAntonio Nino Diazloop_begin:
38*5932d194SAntonio Nino Diaz	ldrh	w2, [x0]
39*5932d194SAntonio Nino Diaz	cmp	w2, #SDS_AP_CPU_INFO_STRUCT_ID
40*5932d194SAntonio Nino Diaz	b.ne	continue_loop
41*5932d194SAntonio Nino Diaz
42*5932d194SAntonio Nino Diaz	/* We have found the required structure */
43*5932d194SAntonio Nino Diaz	ldr	w0, [x0,#(SDS_HEADER_SIZE + SDS_AP_CPU_INFO_PRIMARY_CPUID_OFFSET)]
44*5932d194SAntonio Nino Diaz	ret
45*5932d194SAntonio Nino Diazcontinue_loop:
46*5932d194SAntonio Nino Diaz	/* Increment the loop counter and exit loop if counter == structure count */
47*5932d194SAntonio Nino Diaz	add	w3, w3, #0x1
48*5932d194SAntonio Nino Diaz	cmp	w1, w3
49*5932d194SAntonio Nino Diaz	b.eq	2f
50*5932d194SAntonio Nino Diaz
51*5932d194SAntonio Nino Diaz	/* Read the 2nd word in header */
52*5932d194SAntonio Nino Diaz	ldr	w2, [x0,#4]
53*5932d194SAntonio Nino Diaz	/* Get the structure size from header */
54*5932d194SAntonio Nino Diaz	ubfx	x2, x2, #SDS_HEADER_STRUCT_SIZE_SHIFT, #SDS_HEADER_STRUCT_SIZE_WIDTH
55*5932d194SAntonio Nino Diaz	/* Add the structure size and SDS HEADER SIZE to point to next header */
56*5932d194SAntonio Nino Diaz	add	x2, x2, #SDS_HEADER_SIZE
57*5932d194SAntonio Nino Diaz	add	x0, x0, x2
58*5932d194SAntonio Nino Diaz	b	loop_begin
59*5932d194SAntonio Nino Diaz2:
60*5932d194SAntonio Nino Diaz	mov	w0, #0xffffffff
61*5932d194SAntonio Nino Diaz	ret
62*5932d194SAntonio Nino Diazendfunc sds_get_primary_cpu_id
63