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