/* * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include "../sds.h" #include "../sds_private.h" .globl sds_get_primary_cpu_id /* * int sds_get_primary_cpu_id(void); * Return the primary CPI ID from SDS Structure * Returns CPUID on success or -1 on failure */ func sds_get_primary_cpu_id mov_imm x0, PLAT_ARM_SDS_MEM_BASE mov w2, #SDS_REGION_SIGNATURE ldr w1, [x0] /* Check if the SDS region signature found */ cmp w2, w1, uxth b.ne 2f /* Get the structure count from region descriptor in `w1 */ ubfx w1, w1, #SDS_REGION_STRUCT_COUNT_SHIFT, #SDS_REGION_STRUCT_COUNT_WIDTH cbz w1, 2f add x0, x0, #SDS_REGION_DESC_SIZE /* Initialize the loop iterator count in w3 */ mov w3, #0 loop_begin: ldrh w2, [x0] cmp w2, #SDS_AP_CPU_INFO_STRUCT_ID b.ne continue_loop /* We have found the required structure */ ldr w0, [x0,#(SDS_HEADER_SIZE + SDS_AP_CPU_INFO_PRIMARY_CPUID_OFFSET)] ret continue_loop: /* Increment the loop counter and exit loop if counter == structure count */ add w3, w3, #0x1 cmp w1, w3 b.eq 2f /* Read the 2nd word in header */ ldr w2, [x0,#4] /* Get the structure size from header */ ubfx x2, x2, #SDS_HEADER_STRUCT_SIZE_SHIFT, #SDS_HEADER_STRUCT_SIZE_WIDTH /* Add the structure size and SDS HEADER SIZE to point to next header */ add x2, x2, #SDS_HEADER_SIZE add x0, x0, x2 b loop_begin 2: mov w0, #0xffffffff ret endfunc sds_get_primary_cpu_id