xref: /rk3399_ARM-atf/drivers/arm/css/sds/aarch32/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 CPU 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	ldr	r0, =PLAT_ARM_SDS_MEM_BASE
23*5932d194SAntonio Nino Diaz	ldr	r2, =SDS_REGION_SIGNATURE
24*5932d194SAntonio Nino Diaz	ldr	r1, [r0]
25*5932d194SAntonio Nino Diaz	ubfx	r3, r1, #0, #16
26*5932d194SAntonio Nino Diaz
27*5932d194SAntonio Nino Diaz	/* Check if the SDS region signature found */
28*5932d194SAntonio Nino Diaz	cmp	r2, r3
29*5932d194SAntonio Nino Diaz	bne	2f
30*5932d194SAntonio Nino Diaz
31*5932d194SAntonio Nino Diaz	/* Get the structure count from region descriptor in r1 */
32*5932d194SAntonio Nino Diaz	ubfx	r1, r1, #SDS_REGION_STRUCT_COUNT_SHIFT, #SDS_REGION_STRUCT_COUNT_WIDTH
33*5932d194SAntonio Nino Diaz	cmp	r1, #0
34*5932d194SAntonio Nino Diaz	beq	2f
35*5932d194SAntonio Nino Diaz	add	r0, r0, #SDS_REGION_DESC_SIZE
36*5932d194SAntonio Nino Diaz
37*5932d194SAntonio Nino Diaz	/* Initialize the loop iterator count in r3 */
38*5932d194SAntonio Nino Diaz	mov	r3, #0
39*5932d194SAntonio Nino Diazloop_begin:
40*5932d194SAntonio Nino Diaz	ldrh	r2, [r0]
41*5932d194SAntonio Nino Diaz	cmp	r2, #SDS_AP_CPU_INFO_STRUCT_ID
42*5932d194SAntonio Nino Diaz	bne	continue_loop
43*5932d194SAntonio Nino Diaz
44*5932d194SAntonio Nino Diaz	/* We have found the required structure */
45*5932d194SAntonio Nino Diaz	ldr	r0, [r0,#(SDS_HEADER_SIZE + SDS_AP_CPU_INFO_PRIMARY_CPUID_OFFSET)]
46*5932d194SAntonio Nino Diaz	bx	lr
47*5932d194SAntonio Nino Diazcontinue_loop:
48*5932d194SAntonio Nino Diaz	/* Increment the loop counter and exit loop if counter == structure count */
49*5932d194SAntonio Nino Diaz	add	r3, r3, #0x1
50*5932d194SAntonio Nino Diaz	cmp	r1, r3
51*5932d194SAntonio Nino Diaz	beq	2f
52*5932d194SAntonio Nino Diaz
53*5932d194SAntonio Nino Diaz	/* Read the 2nd word in header */
54*5932d194SAntonio Nino Diaz	ldr	r2, [r0,#4]
55*5932d194SAntonio Nino Diaz	/* Get the structure size from header */
56*5932d194SAntonio Nino Diaz	ubfx	r2, r2, #SDS_HEADER_STRUCT_SIZE_SHIFT, #SDS_HEADER_STRUCT_SIZE_WIDTH
57*5932d194SAntonio Nino Diaz	/* Add the structure size and SDS HEADER SIZE to point to next header */
58*5932d194SAntonio Nino Diaz	add	r2, r2, #SDS_HEADER_SIZE
59*5932d194SAntonio Nino Diaz	add	r0, r0, r2
60*5932d194SAntonio Nino Diaz	b	loop_begin
61*5932d194SAntonio Nino Diaz2:
62*5932d194SAntonio Nino Diaz	mov	r0, #0xffffffff
63*5932d194SAntonio Nino Diaz	bx	lr
64*5932d194SAntonio Nino Diazendfunc sds_get_primary_cpu_id
65