53 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *  linux/arch/arm/kernel/smp_scu.c
 | |
|  *
 | |
|  *  Copyright (C) 2002 ARM Ltd.
 | |
|  *  All Rights Reserved
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License version 2 as
 | |
|  * published by the Free Software Foundation.
 | |
|  */
 | |
| #include <linux/init.h>
 | |
| #include <linux/io.h>
 | |
| 
 | |
| #include <asm/smp_scu.h>
 | |
| #include <asm/cacheflush.h>
 | |
| 
 | |
| #define SCU_CTRL		0x00
 | |
| #define SCU_CONFIG		0x04
 | |
| #define SCU_CPU_STATUS		0x08
 | |
| #define SCU_INVALIDATE		0x0c
 | |
| #define SCU_FPGA_REVISION	0x10
 | |
| 
 | |
| /*
 | |
|  * Get the number of CPU cores from the SCU configuration
 | |
|  */
 | |
| unsigned int __init scu_get_core_count(void __iomem *scu_base)
 | |
| {
 | |
| 	unsigned int ncores = __raw_readl(scu_base + SCU_CONFIG);
 | |
| 	return (ncores & 0x03) + 1;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Enable the SCU
 | |
|  */
 | |
| void __init scu_enable(void __iomem *scu_base)
 | |
| {
 | |
| 	u32 scu_ctrl;
 | |
| 
 | |
| 	scu_ctrl = __raw_readl(scu_base + SCU_CTRL);
 | |
| 	/* already enabled? */
 | |
| 	if (scu_ctrl & 1)
 | |
| 		return;
 | |
| 
 | |
| 	scu_ctrl |= 1;
 | |
| 	__raw_writel(scu_ctrl, scu_base + SCU_CTRL);
 | |
| 
 | |
| 	/*
 | |
| 	 * Ensure that the data accessed by CPU0 before the SCU was
 | |
| 	 * initialised is visible to the other CPUs.
 | |
| 	 */
 | |
| 	flush_cache_all();
 | |
| }
 |