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 CPI ID from SDS Structure 19 * Returns CPUID on success or -1 on failure 20 */ 21func sds_get_primary_cpu_id 22 mov_imm x0, PLAT_ARM_SDS_MEM_BASE 23 mov w2, #SDS_REGION_SIGNATURE 24 ldr w1, [x0] 25 26 /* Check if the SDS region signature found */ 27 cmp w2, w1, uxth 28 b.ne 2f 29 30 /* Get the structure count from region descriptor in `w1 */ 31 ubfx w1, w1, #SDS_REGION_STRUCT_COUNT_SHIFT, #SDS_REGION_STRUCT_COUNT_WIDTH 32 cbz w1, 2f 33 add x0, x0, #SDS_REGION_DESC_SIZE 34 35 /* Initialize the loop iterator count in w3 */ 36 mov w3, #0 37loop_begin: 38 ldrh w2, [x0] 39 cmp w2, #SDS_AP_CPU_INFO_STRUCT_ID 40 b.ne continue_loop 41 42 /* We have found the required structure */ 43 ldr w0, [x0,#(SDS_HEADER_SIZE + SDS_AP_CPU_INFO_PRIMARY_CPUID_OFFSET)] 44 ret 45continue_loop: 46 /* Increment the loop counter and exit loop if counter == structure count */ 47 add w3, w3, #0x1 48 cmp w1, w3 49 b.eq 2f 50 51 /* Read the 2nd word in header */ 52 ldr w2, [x0,#4] 53 /* Get the structure size from header */ 54 ubfx x2, x2, #SDS_HEADER_STRUCT_SIZE_SHIFT, #SDS_HEADER_STRUCT_SIZE_WIDTH 55 /* Add the structure size and SDS HEADER SIZE to point to next header */ 56 add x2, x2, #SDS_HEADER_SIZE 57 add x0, x0, x2 58 b loop_begin 592: 60 mov w0, #0xffffffff 61 ret 62endfunc sds_get_primary_cpu_id 63