sds_helpers.S 1.55 KB
Newer Older
Soby Mathew's avatar
Soby Mathew committed
1
2
3
4
5
6
7
8
/*
 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <arch.h>
#include <asm_macros.S>
9
#include <drivers/arm/css/sds.h>
Soby Mathew's avatar
Soby Mathew committed
10
#include <platform_def.h>
11

Soby Mathew's avatar
Soby Mathew committed
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "../sds_private.h"

	.globl	sds_get_primary_cpu_id

	/*
	 * int sds_get_primary_cpu_id(void);
	 * Return the primary CPU ID from SDS Structure
	 * Returns CPUID on success or -1 on failure
	 */
func sds_get_primary_cpu_id
	ldr	r0, =PLAT_ARM_SDS_MEM_BASE
	ldr	r2, =SDS_REGION_SIGNATURE
	ldr	r1, [r0]
	ubfx	r3, r1, #0, #16

	/* Check if the SDS region signature found */
	cmp	r2, r3
	bne	2f

	/* Get the structure count from region descriptor in r1 */
	ubfx	r1, r1, #SDS_REGION_STRUCT_COUNT_SHIFT, #SDS_REGION_STRUCT_COUNT_WIDTH
	cmp	r1, #0
	beq	2f
	add	r0, r0, #SDS_REGION_DESC_SIZE

	/* Initialize the loop iterator count in r3 */
	mov	r3, #0
loop_begin:
	ldrh	r2, [r0]
	cmp	r2, #SDS_AP_CPU_INFO_STRUCT_ID
	bne	continue_loop

	/* We have found the required structure */
	ldr	r0, [r0,#(SDS_HEADER_SIZE + SDS_AP_CPU_INFO_PRIMARY_CPUID_OFFSET)]
	bx	lr
continue_loop:
	/* Increment the loop counter and exit loop if counter == structure count */
	add	r3, r3, #0x1
	cmp	r1, r3
	beq	2f

	/* Read the 2nd word in header */
	ldr	r2, [r0,#4]
	/* Get the structure size from header */
	ubfx	r2, r2, #SDS_HEADER_STRUCT_SIZE_SHIFT, #SDS_HEADER_STRUCT_SIZE_WIDTH
	/* Add the structure size and SDS HEADER SIZE to point to next header */
	add	r2, r2, #SDS_HEADER_SIZE
	add	r0, r0, r2
	b	loop_begin
2:
	mov	r0, #0xffffffff
	bx	lr
endfunc sds_get_primary_cpu_id