本文整理汇总了C++中MPIDR_AFFINITY_LEVEL函数的典型用法代码示例。如果您正苦于以下问题:C++ MPIDR_AFFINITY_LEVEL函数的具体用法?C++ MPIDR_AFFINITY_LEVEL怎么用?C++ MPIDR_AFFINITY_LEVEL使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MPIDR_AFFINITY_LEVEL函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: msm_cpu_prepare
static int __init msm_cpu_prepare(unsigned int cpu)
{
u64 mpidr_el1 = cpu_logical_map(cpu);
if (scm_is_mc_boot_available()) {
if (mpidr_el1 & ~MPIDR_HWID_BITMASK) {
pr_err("CPU%d:Failed to set boot address\n", cpu);
return -ENOSYS;
}
if (scm_set_boot_addr_mc(virt_to_phys(secondary_holding_pen),
BIT(MPIDR_AFFINITY_LEVEL(mpidr_el1, 0)),
BIT(MPIDR_AFFINITY_LEVEL(mpidr_el1, 1)),
BIT(MPIDR_AFFINITY_LEVEL(mpidr_el1, 2)),
SCM_FLAG_COLDBOOT_MC)) {
pr_warn("CPU%d:Failed to set boot address\n", cpu);
return -ENOSYS;
}
} else {
if (scm_set_boot_addr(virt_to_phys(secondary_holding_pen),
cold_boot_flags[cpu])) {
pr_warn("Failed to set CPU %u boot address\n", cpu);
return -ENOSYS;
}
}
/* Mark CPU0 cold boot flag as done */
if (per_cpu(cold_boot_done, 0) == false)
per_cpu(cold_boot_done, 0) = true;
return 0;
}
开发者ID:AudioGod,项目名称:Gods_kernel_yu_msm8916,代码行数:34,代码来源:cpu_ops.c
示例2: exynos_cpu_up
static void exynos_cpu_up(unsigned int cpu_id)
{
unsigned int phys_cpu = cpu_logical_map(cpu_id);
unsigned int core_config, core, cluster;
void __iomem *addr;
core = MPIDR_AFFINITY_LEVEL(phys_cpu, 0);
cluster = MPIDR_AFFINITY_LEVEL(phys_cpu, 1);
addr = EXYNOS_PMU_CPU_CONFIGURATION(core + (4 * cluster));
core_config = __raw_readl(addr);
if ((core_config & LOCAL_PWR_CFG) != LOCAL_PWR_CFG) {
#ifdef CONFIG_SOC_EXYNOS7420
if ((core_config & LOCAL_PWR_CFG) == CPU_RESET_UP_CONFIG) {
unsigned int tmp = __raw_readl(EXYNOS_PMU_CPU_STATUS(core + (4 * cluster)));
if ((tmp & LOCAL_PWR_CFG) != LOCAL_PWR_CFG)
panic("%s: Abnormal core status\n", __func__);
}
#endif
core_config |= LOCAL_PWR_CFG;
__raw_writel(core_config, addr);
}
}
开发者ID:ColinIanKing,项目名称:m576,代码行数:25,代码来源:pmu.c
示例3: exynos5420_cpu_suspend
static int exynos5420_cpu_suspend(unsigned long arg)
{
/* MCPM works with HW CPU identifiers */
unsigned int mpidr = read_cpuid_mpidr();
unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
unsigned int cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
__raw_writel(0x0, sysram_base_addr + EXYNOS5420_CPU_STATE);
if (IS_ENABLED(CONFIG_EXYNOS5420_MCPM)) {
mcpm_set_entry_vector(cpu, cluster, exynos_cpu_resume);
/*
* Residency value passed to mcpm_cpu_suspend back-end
* has to be given clear semantics. Set to 0 as a
* temporary value.
*/
mcpm_cpu_suspend(0);
}
pr_info("Failed to suspend the system\n");
/* return value != 0 means failure */
return 1;
}
开发者ID:Warter21,项目名称:linux-4.0_imx6,代码行数:25,代码来源:suspend.c
示例4: sunxi_cpu_power_down_c2state
static int sunxi_cpu_power_down_c2state(struct cpuidle_device *dev, \
struct cpuidle_driver *drv, \
int index)
{
unsigned int mpidr = read_cpuid_mpidr();
unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
unsigned int cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
cpu_pm_enter();
//cpu_cluster_pm_enter();
clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &dev->cpu);
smp_wmb();
cpu_suspend(CPUIDLE_FLAG_C2_STATE, sunxi_powerdown_c2_finisher);
/*
* Since this is called with IRQs enabled, and no arch_spin_lock_irq
* variant exists, we need to disable IRQs manually here.
*/
local_irq_disable();
arch_spin_lock(&sun8i_mcpm_lock);
sun8i_cpu_use_count[cluster][cpu]++;
sun8i_cluster_use_count[cluster]++;
arch_spin_unlock(&sun8i_mcpm_lock);
local_irq_enable();
clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &dev->cpu);
//cpu_cluster_pm_exit();
cpu_pm_exit();
return index;
}
开发者ID:925outer,项目名称:BPI-M2P-bsp,代码行数:34,代码来源:cpuidle-sun8iw6.c
示例5: cpu_to_pcpu
static void cpu_to_pcpu(unsigned int cpu,
unsigned int *pcpu, unsigned int *pcluster)
{
unsigned int mpidr;
mpidr = cpu_logical_map(cpu);
*pcpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
*pcluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
}
开发者ID:0-T-0,项目名称:ps4-linux,代码行数:9,代码来源:mcpm_platsmp.c
示例6: mcpm_cpu_die
static void mcpm_cpu_die(unsigned int cpu)
{
unsigned int mpidr, pcpu, pcluster;
mpidr = read_cpuid_mpidr();
pcpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
pcluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
mcpm_set_entry_vector(pcpu, pcluster, NULL);
mcpm_cpu_power_down();
}
开发者ID:DenZxd,项目名称:android_kernel_sd_x7,代码行数:9,代码来源:mcpm_platsmp.c
示例7: mcpm_powerdown_finisher
static int notrace mcpm_powerdown_finisher(unsigned long arg)
{
u32 mpidr = read_cpuid_mpidr();
u32 cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
u32 this_cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
mcpm_set_entry_vector(cpu, this_cluster, cpu_resume);
mcpm_cpu_suspend(arg);
return 1;
}
开发者ID:acorn-marvell,项目名称:brillo_pxa_kernel,代码行数:10,代码来源:cpuidle-mmp-armv7.c
示例8: store_boot_cpu_info
static void store_boot_cpu_info(void)
{
unsigned int mpidr = read_cpuid_mpidr();
boot_core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0);
boot_cluster_id = MPIDR_AFFINITY_LEVEL(mpidr, 1);
pr_info("A booting CPU: core %d cluster %d\n", boot_core_id,
boot_cluster_id);
}
开发者ID:MrRitwik97,项目名称:kernel_samsung_j7eltexx,代码行数:10,代码来源:exynos-powermode-smp.c
示例9: sunxi_powerdown_c2_finisher
/*
* notrace prevents trace shims from getting inserted where they
* should not. Global jumps and ldrex/strex must not be inserted
* in power down sequences where caches and MMU may be turned off.
*/
static int notrace sunxi_powerdown_c2_finisher(unsigned long flg)
{
/* MCPM works with HW CPU identifiers */
unsigned int mpidr = read_cpuid_mpidr();
unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
unsigned int cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
bool last_man = false;
struct sunxi_enter_idle_para sunxi_idle_para;
mcpm_set_entry_vector(cpu, cluster, cpu_resume);
arch_spin_lock(&sun8i_mcpm_lock);
sun8i_cpu_use_count[cluster][cpu]--;
/* check is the last-man, and set flg */
sun8i_cluster_use_count[cluster]--;
if (sun8i_cluster_use_count[cluster] == 0) {
writel(1, CLUSTER_CPUX_FLG(cluster, cpu));
last_man = true;
}
arch_spin_unlock(&sun8i_mcpm_lock);
/* call cpus to power off */
sunxi_idle_para.flags = (unsigned long)mpidr | flg;
sunxi_idle_para.resume_addr = (void *)(virt_to_phys(mcpm_entry_point));
arisc_enter_cpuidle(NULL, NULL, &sunxi_idle_para);
if (last_man) {
int t = 0;
/* wait for cpus received this message and respond,
* for reconfirm is this cpu the man really, then clear flg
*/
while (1) {
udelay(2);
if (readl(CLUSTER_CPUS_FLG(cluster, cpu)) == 2) {
writel(0, CLUSTER_CPUX_FLG(cluster, cpu));
break; /* last_man is true */
} else if (readl(CLUSTER_CPUS_FLG(cluster, cpu)) == 3) {
writel(0, CLUSTER_CPUX_FLG(cluster, cpu));
goto out; /* last_man is false */
}
if(++t > 5000) {
printk(KERN_WARNING "cpu%didle time out!\n", \
cluster * 4 + cpu);
t = 0;
}
}
sunxi_idle_cluster_die(cluster);
}
out:
sunxi_idle_cpu_die();
/* return value != 0 means failure */
return 1;
}
开发者ID:925outer,项目名称:BPI-M2P-bsp,代码行数:60,代码来源:cpuidle-sun8iw6.c
示例10: mmp_pm_usage_count_init
static void __init mmp_pm_usage_count_init(void)
{
unsigned int mpidr, cpu, cluster;
mpidr = read_cpuid_mpidr();
cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
BUG_ON(cpu >= MAX_CPUS_PER_CLUSTER || cluster >= MAX_NR_CLUSTERS);
memset(mmp_pm_use_count, 0, sizeof(mmp_pm_use_count));
mmp_pm_use_count[cluster][cpu] = 1;
}
开发者ID:acorn-marvell,项目名称:brillo_pxa_kernel,代码行数:12,代码来源:mmp_cpuidle.c
示例11: exynos7420_cpu_state
unsigned int exynos7420_cpu_state(unsigned int cpu_id)
{
unsigned int phys_cpu = cpu_logical_map(cpu_id);
unsigned int core, cluster, val;
core = MPIDR_AFFINITY_LEVEL(phys_cpu, 0);
cluster = MPIDR_AFFINITY_LEVEL(phys_cpu, 1);
val = __raw_readl(EXYNOS_ARM_CORE_STATUS(core + (4 * cluster)))
& EXYNOS_CORE_PWR_EN;
return val == 0xf;
}
开发者ID:1paul1,项目名称:dynamite,代码行数:13,代码来源:pmu-exynos7420.c
示例12: exynos_cpu_state
static int exynos_cpu_state(unsigned int cpu_id)
{
unsigned int phys_cpu = cpu_logical_map(cpu_id);
unsigned int core, cluster, val;
core = MPIDR_AFFINITY_LEVEL(phys_cpu, 0);
cluster = MPIDR_AFFINITY_LEVEL(phys_cpu, 1);
val = __raw_readl(EXYNOS_PMU_CPU_STATUS(core + (4 * cluster)))
& LOCAL_PWR_CFG;
return val == LOCAL_PWR_CFG;
}
开发者ID:ColinIanKing,项目名称:m576,代码行数:13,代码来源:pmu.c
示例13: tc2_pm_usage_count_init
static void __init tc2_pm_usage_count_init(void)
{
unsigned int mpidr, cpu, cluster;
mpidr = read_cpuid_mpidr();
cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster);
BUG_ON(cluster >= TC2_MAX_CLUSTERS ||
cpu >= vexpress_spc_get_nb_cpus(cluster));
atomic_set(&tc2_pm_use_count[cpu][cluster], 1);
}
开发者ID:monojo,项目名称:xu3,代码行数:14,代码来源:tc2_pm_psci.c
示例14: exynos7420_cpu_down
void exynos7420_cpu_down(unsigned int cpu_id)
{
unsigned int phys_cpu = cpu_logical_map(cpu_id);
unsigned int tmp, core, cluster;
void __iomem *addr;
core = MPIDR_AFFINITY_LEVEL(phys_cpu, 0);
cluster = MPIDR_AFFINITY_LEVEL(phys_cpu, 1);
addr = EXYNOS_ARM_CORE_CONFIGURATION(core + (4 * cluster));
tmp = __raw_readl(addr);
tmp &= ~(EXYNOS_CORE_PWR_EN);
__raw_writel(tmp, addr);
}
开发者ID:1paul1,项目名称:dynamite,代码行数:15,代码来源:pmu-exynos7420.c
示例15: msm_pm_write_boot_vector
static void msm_pm_write_boot_vector(unsigned int cpu, unsigned long address)
{
uint32_t clust_id = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 1);
uint32_t cpu_id = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 0);
unsigned long *start_address;
unsigned long *end_address;
if (clust_id >= MAX_NUM_CLUSTER || cpu_id >= MAX_CPUS_PER_CLUSTER)
BUG();
msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id)] = address;
start_address = &msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id)];
end_address = &msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id + 1)];
dmac_clean_range((void *)start_address, (void *)end_address);
}
开发者ID:SiddheshK15,项目名称:kernel_htc_820,代码行数:15,代码来源:pm-boot.c
示例16: mcpm_sync_init
int __init mcpm_sync_init(
void (*power_up_setup)(unsigned int affinity_level))
{
unsigned int i, j, mpidr, this_cluster;
BUILD_BUG_ON(MCPM_SYNC_CLUSTER_SIZE * MAX_NR_CLUSTERS != sizeof mcpm_sync);
BUG_ON((unsigned long)&mcpm_sync & (__CACHE_WRITEBACK_GRANULE - 1));
/*
* Set initial CPU and cluster states.
* Only one cluster is assumed to be active at this point.
*/
for (i = 0; i < MAX_NR_CLUSTERS; i++) {
mcpm_sync.clusters[i].cluster = CLUSTER_DOWN;
mcpm_sync.clusters[i].inbound = INBOUND_NOT_COMING_UP;
for (j = 0; j < MAX_CPUS_PER_CLUSTER; j++)
mcpm_sync.clusters[i].cpus[j].cpu = CPU_DOWN;
}
mpidr = read_cpuid_mpidr();
this_cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
for_each_online_cpu(i)
mcpm_sync.clusters[this_cluster].cpus[i].cpu = CPU_UP;
mcpm_sync.clusters[this_cluster].cluster = CLUSTER_UP;
sync_cache_w(&mcpm_sync);
if (power_up_setup) {
mcpm_power_up_setup_phys = virt_to_phys(power_up_setup);
sync_cache_w(&mcpm_power_up_setup_phys);
}
return 0;
}
开发者ID:925outer,项目名称:BPI-M2P-bsp,代码行数:32,代码来源:mcpm_entry.c
示例17: exynos7420_secondary_up
void exynos7420_secondary_up(unsigned int cpu_id)
{
unsigned int phys_cpu = cpu_logical_map(cpu_id);
unsigned int tmp, core, cluster;
void __iomem *addr;
core = MPIDR_AFFINITY_LEVEL(phys_cpu, 0);
cluster = MPIDR_AFFINITY_LEVEL(phys_cpu, 1);
addr = EXYNOS_ARM_CORE_CONFIGURATION(core + (4 * cluster));
tmp = __raw_readl(addr);
tmp |= EXYNOS_CORE_INIT_WAKEUP_FROM_LOWPWR | EXYNOS_CORE_PWR_EN;
__raw_writel(tmp, addr);
}
开发者ID:1paul1,项目名称:dynamite,代码行数:16,代码来源:pmu-exynos7420.c
示例18: mcpm_cpu_suspend
void mcpm_cpu_suspend(void)
{
if (WARN_ON_ONCE(!platform_ops))
return;
/* Some platforms might have to enable special resume modes, etc. */
if (platform_ops->cpu_suspend_prepare) {
unsigned int mpidr = read_cpuid_mpidr();
unsigned int cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
arch_spin_lock(&mcpm_lock);
platform_ops->cpu_suspend_prepare(cpu, cluster);
arch_spin_unlock(&mcpm_lock);
}
mcpm_cpu_power_down();
}
开发者ID:0-T-0,项目名称:ps4-linux,代码行数:16,代码来源:mcpm_entry.c
示例19: clear_boot_flag
void clear_boot_flag(unsigned int cpu, unsigned int mode)
{
unsigned int phys_cpu = cpu_logical_map(cpu);
unsigned int tmp, core, cluster;
void __iomem *addr;
BUG_ON(mode == 0);
core = MPIDR_AFFINITY_LEVEL(phys_cpu, 0);
cluster = MPIDR_AFFINITY_LEVEL(phys_cpu, 1);
addr = REG_CPU_STATE_ADDR + 4 * (core + cluster * 4);
tmp = __raw_readl(addr);
tmp &= ~mode;
__raw_writel(tmp, addr);
}
开发者ID:1paul1,项目名称:dynamite,代码行数:16,代码来源:pmu-exynos7420.c
示例20: smp_build_mpidr_hash
/**
* smp_build_mpidr_hash - Pre-compute shifts required at each affinity
* level in order to build a linear index from an
* MPIDR value. Resulting algorithm is a collision
* free hash carried out through shifting and ORing
*/
static void __init smp_build_mpidr_hash(void)
{
u32 i, affinity, fs[4], bits[4], ls;
u64 mask = 0;
/*
* Pre-scan the list of MPIDRS and filter out bits that do
* not contribute to affinity levels, ie they never toggle.
*/
for_each_possible_cpu(i)
mask |= (cpu_logical_map(i) ^ cpu_logical_map(0));
pr_debug("mask of set bits %#llx\n", mask);
/*
* Find and stash the last and first bit set at all affinity levels to
* check how many bits are required to represent them.
*/
for (i = 0; i < 4; i++) {
affinity = MPIDR_AFFINITY_LEVEL(mask, i);
/*
* Find the MSB bit and LSB bits position
* to determine how many bits are required
* to express the affinity level.
*/
ls = fls(affinity);
fs[i] = affinity ? ffs(affinity) - 1 : 0;
bits[i] = ls - fs[i];
}
/*
* An index can be created from the MPIDR_EL1 by isolating the
* significant bits at each affinity level and by shifting
* them in order to compress the 32 bits values space to a
* compressed set of values. This is equivalent to hashing
* the MPIDR_EL1 through shifting and ORing. It is a collision free
* hash though not minimal since some levels might contain a number
* of CPUs that is not an exact power of 2 and their bit
* representation might contain holes, eg MPIDR_EL1[7:0] = {0x2, 0x80}.
*/
mpidr_hash.shift_aff[0] = MPIDR_LEVEL_SHIFT(0) + fs[0];
mpidr_hash.shift_aff[1] = MPIDR_LEVEL_SHIFT(1) + fs[1] - bits[0];
mpidr_hash.shift_aff[2] = MPIDR_LEVEL_SHIFT(2) + fs[2] -
(bits[1] + bits[0]);
mpidr_hash.shift_aff[3] = MPIDR_LEVEL_SHIFT(3) +
fs[3] - (bits[2] + bits[1] + bits[0]);
mpidr_hash.mask = mask;
mpidr_hash.bits = bits[3] + bits[2] + bits[1] + bits[0];
pr_debug("MPIDR hash: aff0[%u] aff1[%u] aff2[%u] aff3[%u] mask[%#llx] bits[%u]\n",
mpidr_hash.shift_aff[0],
mpidr_hash.shift_aff[1],
mpidr_hash.shift_aff[2],
mpidr_hash.shift_aff[3],
mpidr_hash.mask,
mpidr_hash.bits);
/*
* 4x is an arbitrary value used to warn on a hash table much bigger
* than expected on most systems.
*/
if (mpidr_hash_size() > 4 * num_possible_cpus())
pr_warn("Large number of MPIDR hash buckets detected\n");
__flush_dcache_area(&mpidr_hash, sizeof(struct mpidr_hash));
}
开发者ID:EPDCenter,项目名称:android_kernel_rockchip,代码行数:65,代码来源:setup.c
注:本文中的MPIDR_AFFINITY_LEVEL函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论