rt-thread/bsp/phytium/libraries/standalone/board/common/fcpu_info.c

265 lines
5.7 KiB
C
Raw Normal View History

/*
* Copyright : (C) 2022 Phytium Information Technology, Inc.
* All Rights Reserved.
*
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
* either version 1.0 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the Phytium Public License for more details.
*
*
* FilePath: cpu_info.c
* Date: 2022-03-08 19:37:19
* LastEditTime: 2022-03-15 11:18:14
* Description:  This file is for
*
* Modify History:
* Ver   Who        Date         Changes
* ----- ------     --------    --------------------------------------
*/
#include "fcpu_info.h"
#include "ferror_code.h"
#include "fparameters.h"
#include "fprintk.h"
FError GetCpuId(u32 *cpu_id_p)
{
u32 affinity = GetAffinity();
FError ret = ERR_SUCCESS ;
switch (affinity & 0xfff)
{
#ifdef CORE0_AFF
case CORE0_AFF:
*cpu_id_p = 0 ;
break;
#endif
#ifdef CORE1_AFF
case CORE1_AFF:
*cpu_id_p = 1 ;
break;
#endif
#ifdef CORE2_AFF
case CORE2_AFF:
*cpu_id_p = 2;
break;
#endif
#ifdef CORE3_AFF
case CORE3_AFF:
*cpu_id_p = 3 ;
break;
#endif
#ifdef CORE4_AFF
case CORE4_AFF:
*cpu_id_p = 4 ;
break;
#endif
#ifdef CORE5_AFF
case CORE5_AFF:
*cpu_id_p = 5 ;
break;
#endif
#ifdef CORE6_AFF
case CORE6_AFF:
*cpu_id_p = 6 ;
break;
#endif
#ifdef CORE7_AFF
case CORE7_AFF:
*cpu_id_p = 7 ;
break;
#endif
default:
ret = ERR_GENERAL ;
break;
}
return ret;
}
/**
* @name: GetCpuAffinityByMask
* @msg: Determine the cluster information using the CPU ID
* @param {u32} cpu_id cpu id mask .for example : 1 is core0 ,2 is core1 .....
* @param {u64} *affinity_level_p cluster information , format is:
* |--------[bit31-24]-------[bit23-16]-------------[bit15-8]--------[bit7-0]
* |--------Affinity level3-----Affinity level2-----Affinity level1---Affinity level0
* @return {*} ERR_SUCCESS is ok
*/
FError GetCpuAffinityByMask(u32 cpu_id_mask, u64 *affinity_level_p)
{
FError ret = ERR_SUCCESS ;
switch (cpu_id_mask)
{
#ifdef CORE0_AFF
case (1<<0):
*affinity_level_p = CORE0_AFF;
break ;
#endif
#ifdef CORE1_AFF
case (1<<1):
*affinity_level_p = CORE1_AFF;
break ;
#endif
#ifdef CORE2_AFF
case (1<<2):
*affinity_level_p = CORE2_AFF;
break ;
#endif
#ifdef CORE3_AFF
case (1<<3):
*affinity_level_p = CORE3_AFF;
break ;
#endif
#ifdef CORE4_AFF
case (1<<4):
*affinity_level_p = CORE4_AFF;
break ;
#endif
#ifdef CORE5_AFF
case (1<<5):
*affinity_level_p = CORE5_AFF;
break ;
#endif
#ifdef CORE6_AFF
case (1<<6):
*affinity_level_p = CORE6_AFF;
break ;
#endif
#ifdef CORE7_AFF
case (1<<7):
*affinity_level_p = CORE7_AFF;
break ;
#endif
default:
ret = ERR_GENERAL;
break;
}
return ret;
}
/**
* @name: GetCpuAffinity
* @msg: Determine the cluster information using the CPU ID
* @param {u32} cpu_id cpu id .for example : 0 is core0 ,1 is core1 .....
* @param {u64} *affinity_level_p cluster information , format is:
* |--------[bit31-24]-------[bit23-16]-------------[bit15-8]--------[bit7-0]
* |--------Affinity level3-----Affinity level2-----Affinity level1---Affinity level0
* @return {*} ERR_SUCCESS is ok
*/
FError GetCpuAffinity(u32 cpu_id, u64 *affinity_level_p)
{
FError ret = ERR_SUCCESS ;
switch (cpu_id)
{
#ifdef CORE0_AFF
case (0):
*affinity_level_p = CORE0_AFF;
break ;
#endif
#ifdef CORE1_AFF
case (1):
*affinity_level_p = CORE1_AFF;
break ;
#endif
#ifdef CORE2_AFF
case (2):
*affinity_level_p = CORE2_AFF;
break ;
#endif
#ifdef CORE3_AFF
case (3):
*affinity_level_p = CORE3_AFF;
break ;
#endif
#ifdef CORE4_AFF
case (4):
*affinity_level_p = CORE4_AFF;
break ;
#endif
#ifdef CORE5_AFF
case (5):
*affinity_level_p = CORE5_AFF;
break ;
#endif
#ifdef CORE6_AFF
case (6):
*affinity_level_p = CORE6_AFF;
break ;
#endif
#ifdef CORE7_AFF
case (7):
*affinity_level_p = CORE7_AFF;
break ;
#endif
default:
ret = ERR_GENERAL;
break;
}
return ret;
}
/**
* @name: UseAffinityGetCpuId
* @msg: Get the core value from affinity level
* @param {u64} affinity_level is cpu affinity level value
* @param {u32*} cpu_id_p is pointer to get cpu id value
* @return {*} ERR_SUCCESS is ok , ERR_GENERAL is fail
*/
FError UseAffinityGetCpuId(u64 affinity_level, u32 *cpu_id_p)
{
FError ret = ERR_SUCCESS ;
switch (affinity_level)
{
#ifdef CORE0_AFF
case CORE0_AFF:
*cpu_id_p = 0;
break ;
#endif
#ifdef CORE1_AFF
case CORE1_AFF:
*cpu_id_p = 1;
break ;
#endif
#ifdef CORE2_AFF
case CORE2_AFF:
*cpu_id_p = 2;
break ;
#endif
#ifdef CORE3_AFF
case CORE3_AFF:
*cpu_id_p = 3;
break ;
#endif
#ifdef CORE4_AFF
case CORE4_AFF:
*cpu_id_p = 4;
break ;
#endif
#ifdef CORE5_AFF
case CORE5_AFF:
*cpu_id_p = 5;
break ;
#endif
#ifdef CORE6_AFF
case CORE6_AFF:
*cpu_id_p = 6;
break ;
#endif
#ifdef CORE7_AFF
case CORE7_AFF:
*cpu_id_p = 7;
break ;
#endif
default:
ret = ERR_GENERAL;
break;
}
return ret;
}