xref: /arm-trusted-firmware/drivers/arm/css/sds/aarch32/sds_helpers.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu
7*91f16700Schasinglulu#include <arch.h>
8*91f16700Schasinglulu#include <asm_macros.S>
9*91f16700Schasinglulu#include <drivers/arm/css/sds.h>
10*91f16700Schasinglulu#include <platform_def.h>
11*91f16700Schasinglulu
12*91f16700Schasinglulu#include "../sds_private.h"
13*91f16700Schasinglulu
14*91f16700Schasinglulu	.globl	sds_get_primary_cpu_id
15*91f16700Schasinglulu
16*91f16700Schasinglulu	/*
17*91f16700Schasinglulu	 * int sds_get_primary_cpu_id(void);
18*91f16700Schasinglulu	 * Return the primary CPU ID from SDS Structure
19*91f16700Schasinglulu	 * Returns CPUID on success or -1 on failure
20*91f16700Schasinglulu	 */
21*91f16700Schasinglulufunc sds_get_primary_cpu_id
22*91f16700Schasinglulu	ldr	r0, =PLAT_ARM_SDS_MEM_BASE
23*91f16700Schasinglulu	ldr	r2, =SDS_REGION_SIGNATURE
24*91f16700Schasinglulu	ldr	r1, [r0]
25*91f16700Schasinglulu	ubfx	r3, r1, #0, #16
26*91f16700Schasinglulu
27*91f16700Schasinglulu	/* Check if the SDS region signature found */
28*91f16700Schasinglulu	cmp	r2, r3
29*91f16700Schasinglulu	bne	2f
30*91f16700Schasinglulu
31*91f16700Schasinglulu	/* Get the structure count from region descriptor in r1 */
32*91f16700Schasinglulu	ubfx	r1, r1, #SDS_REGION_STRUCT_COUNT_SHIFT, #SDS_REGION_STRUCT_COUNT_WIDTH
33*91f16700Schasinglulu	cmp	r1, #0
34*91f16700Schasinglulu	beq	2f
35*91f16700Schasinglulu	add	r0, r0, #SDS_REGION_DESC_SIZE
36*91f16700Schasinglulu
37*91f16700Schasinglulu	/* Initialize the loop iterator count in r3 */
38*91f16700Schasinglulu	mov	r3, #0
39*91f16700Schasinglululoop_begin:
40*91f16700Schasinglulu	ldrh	r2, [r0]
41*91f16700Schasinglulu	cmp	r2, #SDS_AP_CPU_INFO_STRUCT_ID
42*91f16700Schasinglulu	bne	continue_loop
43*91f16700Schasinglulu
44*91f16700Schasinglulu	/* We have found the required structure */
45*91f16700Schasinglulu	ldr	r0, [r0,#(SDS_HEADER_SIZE + SDS_AP_CPU_INFO_PRIMARY_CPUID_OFFSET)]
46*91f16700Schasinglulu	bx	lr
47*91f16700Schasinglulucontinue_loop:
48*91f16700Schasinglulu	/* Increment the loop counter and exit loop if counter == structure count */
49*91f16700Schasinglulu	add	r3, r3, #0x1
50*91f16700Schasinglulu	cmp	r1, r3
51*91f16700Schasinglulu	beq	2f
52*91f16700Schasinglulu
53*91f16700Schasinglulu	/* Read the 2nd word in header */
54*91f16700Schasinglulu	ldr	r2, [r0,#4]
55*91f16700Schasinglulu	/* Get the structure size from header */
56*91f16700Schasinglulu	ubfx	r2, r2, #SDS_HEADER_STRUCT_SIZE_SHIFT, #SDS_HEADER_STRUCT_SIZE_WIDTH
57*91f16700Schasinglulu	/* Add the structure size and SDS HEADER SIZE to point to next header */
58*91f16700Schasinglulu	add	r2, r2, #SDS_HEADER_SIZE
59*91f16700Schasinglulu	add	r0, r0, r2
60*91f16700Schasinglulu	b	loop_begin
61*91f16700Schasinglulu2:
62*91f16700Schasinglulu	mov	r0, #0xffffffff
63*91f16700Schasinglulu	bx	lr
64*91f16700Schasingluluendfunc sds_get_primary_cpu_id
65