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