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