cregit-Linux how code gets into the kernel

Release 4.8 arch/mips/kernel/mips-cpc.c

Directory: arch/mips/kernel
/*
 * Copyright (C) 2013 Imagination Technologies
 * Author: Paul Burton <paul.burton@imgtec.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation;  either version 2 of the  License, or (at your
 * option) any later version.
 */

#include <linux/errno.h>
#include <linux/percpu.h>
#include <linux/spinlock.h>

#include <asm/mips-cm.h>
#include <asm/mips-cpc.h>


void __iomem *mips_cpc_base;

static DEFINE_PER_CPU_ALIGNED(spinlock_t, cpc_core_lock);

static DEFINE_PER_CPU_ALIGNED(unsigned long, cpc_core_lock_flags);

/**
 * mips_cpc_phys_base - retrieve the physical base address of the CPC
 *
 * This function returns the physical base address of the Cluster Power
 * Controller memory mapped registers, or 0 if no Cluster Power Controller
 * is present.
 */

static phys_addr_t mips_cpc_phys_base(void) { unsigned long cpc_base; if (!mips_cm_present()) return 0; if (!(read_gcr_cpc_status() & CM_GCR_CPC_STATUS_EX_MSK)) return 0; /* If the CPC is already enabled, leave it so */ cpc_base = read_gcr_cpc_base(); if (cpc_base & CM_GCR_CPC_BASE_CPCEN_MSK) return cpc_base & CM_GCR_CPC_BASE_CPCBASE_MSK; /* Otherwise, give it the default address & enable it */ cpc_base = mips_cpc_default_phys_base(); write_gcr_cpc_base(cpc_base | CM_GCR_CPC_BASE_CPCEN_MSK); return cpc_base; }

Contributors

PersonTokensPropCommitsCommitProp
paul burtonpaul burton6394.03%125.00%
markos chandrasmarkos chandras22.99%125.00%
ralf baechleralf baechle11.49%125.00%
bjorn helgaasbjorn helgaas11.49%125.00%
Total67100.00%4100.00%


int mips_cpc_probe(void) { phys_addr_t addr; unsigned cpu; for_each_possible_cpu(cpu) spin_lock_init(&per_cpu(cpc_core_lock, cpu)); addr = mips_cpc_phys_base(); if (!addr) return -ENODEV; mips_cpc_base = ioremap_nocache(addr, 0x8000); if (!mips_cpc_base) return -ENXIO; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
paul burtonpaul burton6298.41%266.67%
ralf baechleralf baechle11.59%133.33%
Total63100.00%3100.00%


void mips_cpc_lock_other(unsigned int core) { unsigned curr_core; preempt_disable(); curr_core = current_cpu_data.core; spin_lock_irqsave(&per_cpu(cpc_core_lock, curr_core), per_cpu(cpc_core_lock_flags, curr_core)); write_cpc_cl_other(core << CPC_Cx_OTHER_CORENUM_SHF); /* * Ensure the core-other region reflects the appropriate core & * VP before any accesses to it occur. */ mb(); }

Contributors

PersonTokensPropCommitsCommitProp
paul burtonpaul burton50100.00%2100.00%
Total50100.00%2100.00%


void mips_cpc_unlock_other(void) { unsigned curr_core = current_cpu_data.core; spin_unlock_irqrestore(&per_cpu(cpc_core_lock, curr_core), per_cpu(cpc_core_lock_flags, curr_core)); preempt_enable(); }

Contributors

PersonTokensPropCommitsCommitProp
paul burtonpaul burton35100.00%1100.00%
Total35100.00%1100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
paul burtonpaul burton24797.63%457.14%
ralf baechleralf baechle20.79%114.29%
markos chandrasmarkos chandras20.79%114.29%
bjorn helgaasbjorn helgaas20.79%114.29%
Total253100.00%7100.00%
Directory: arch/mips/kernel
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.