diff options
author | Srikant Patnaik | 2015-01-11 12:28:04 +0530 |
---|---|---|
committer | Srikant Patnaik | 2015-01-11 12:28:04 +0530 |
commit | 871480933a1c28f8a9fed4c4d34d06c439a7a422 (patch) | |
tree | 8718f573808810c2a1e8cb8fb6ac469093ca2784 /ANDROID_3.4.5/arch/microblaze/kernel/cpu | |
parent | 9d40ac5867b9aefe0722bc1f110b965ff294d30d (diff) | |
download | FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.tar.gz FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.tar.bz2 FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.zip |
Moved, renamed, and deleted files
The original directory structure was scattered and unorganized.
Changes are basically to make it look like kernel structure.
Diffstat (limited to 'ANDROID_3.4.5/arch/microblaze/kernel/cpu')
-rw-r--r-- | ANDROID_3.4.5/arch/microblaze/kernel/cpu/Makefile | 12 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/microblaze/kernel/cpu/cache.c | 667 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c | 119 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo-static.c | 147 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo.c | 98 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/microblaze/kernel/cpu/mb.c | 161 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/microblaze/kernel/cpu/pvr.c | 80 |
7 files changed, 0 insertions, 1284 deletions
diff --git a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/Makefile b/ANDROID_3.4.5/arch/microblaze/kernel/cpu/Makefile deleted file mode 100644 index fceed4ed..00000000 --- a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# -# Build the appropriate CPU version support -# - -ifdef CONFIG_FUNCTION_TRACER -CFLAGS_REMOVE_cache.o = -pg -endif - -ccflags-y := -DCPU_MAJOR=$(CPU_MAJOR) -DCPU_MINOR=$(CPU_MINOR) \ - -DCPU_REV=$(CPU_REV) - -obj-y += cache.o cpuinfo.o cpuinfo-pvr-full.o cpuinfo-static.o mb.o pvr.o diff --git a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cache.c b/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cache.c deleted file mode 100644 index 4b7d8a3f..00000000 --- a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cache.c +++ /dev/null @@ -1,667 +0,0 @@ -/* - * Cache control for MicroBlaze cache memories - * - * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> - * Copyright (C) 2007-2009 PetaLogix - * Copyright (C) 2007-2009 John Williams <john.williams@petalogix.com> - * - * This file is subject to the terms and conditions of the GNU General - * Public License. See the file COPYING in the main directory of this - * archive for more details. - */ - -#include <asm/cacheflush.h> -#include <linux/cache.h> -#include <asm/cpuinfo.h> -#include <asm/pvr.h> - -static inline void __enable_icache_msr(void) -{ - __asm__ __volatile__ (" msrset r0, %0; \ - nop; " \ - : : "i" (MSR_ICE) : "memory"); -} - -static inline void __disable_icache_msr(void) -{ - __asm__ __volatile__ (" msrclr r0, %0; \ - nop; " \ - : : "i" (MSR_ICE) : "memory"); -} - -static inline void __enable_dcache_msr(void) -{ - __asm__ __volatile__ (" msrset r0, %0; \ - nop; " \ - : \ - : "i" (MSR_DCE) \ - : "memory"); -} - -static inline void __disable_dcache_msr(void) -{ - __asm__ __volatile__ (" msrclr r0, %0; \ - nop; " \ - : \ - : "i" (MSR_DCE) \ - : "memory"); -} - -static inline void __enable_icache_nomsr(void) -{ - __asm__ __volatile__ (" mfs r12, rmsr; \ - nop; \ - ori r12, r12, %0; \ - mts rmsr, r12; \ - nop; " \ - : \ - : "i" (MSR_ICE) \ - : "memory", "r12"); -} - -static inline void __disable_icache_nomsr(void) -{ - __asm__ __volatile__ (" mfs r12, rmsr; \ - nop; \ - andi r12, r12, ~%0; \ - mts rmsr, r12; \ - nop; " \ - : \ - : "i" (MSR_ICE) \ - : "memory", "r12"); -} - -static inline void __enable_dcache_nomsr(void) -{ - __asm__ __volatile__ (" mfs r12, rmsr; \ - nop; \ - ori r12, r12, %0; \ - mts rmsr, r12; \ - nop; " \ - : \ - : "i" (MSR_DCE) \ - : "memory", "r12"); -} - -static inline void __disable_dcache_nomsr(void) -{ - __asm__ __volatile__ (" mfs r12, rmsr; \ - nop; \ - andi r12, r12, ~%0; \ - mts rmsr, r12; \ - nop; " \ - : \ - : "i" (MSR_DCE) \ - : "memory", "r12"); -} - - -/* Helper macro for computing the limits of cache range loops - * - * End address can be unaligned which is OK for C implementation. - * ASM implementation align it in ASM macros - */ -#define CACHE_LOOP_LIMITS(start, end, cache_line_length, cache_size) \ -do { \ - int align = ~(cache_line_length - 1); \ - end = min(start + cache_size, end); \ - start &= align; \ -} while (0); - -/* - * Helper macro to loop over the specified cache_size/line_length and - * execute 'op' on that cacheline - */ -#define CACHE_ALL_LOOP(cache_size, line_length, op) \ -do { \ - unsigned int len = cache_size - line_length; \ - int step = -line_length; \ - WARN_ON(step >= 0); \ - \ - __asm__ __volatile__ (" 1: " #op " %0, r0; \ - bgtid %0, 1b; \ - addk %0, %0, %1; \ - " : : "r" (len), "r" (step) \ - : "memory"); \ -} while (0); - -/* Used for wdc.flush/clear which can use rB for offset which is not possible - * to use for simple wdc or wic. - * - * start address is cache aligned - * end address is not aligned, if end is aligned then I have to subtract - * cacheline length because I can't flush/invalidate the next cacheline. - * If is not, I align it because I will flush/invalidate whole line. - */ -#define CACHE_RANGE_LOOP_2(start, end, line_length, op) \ -do { \ - int step = -line_length; \ - int align = ~(line_length - 1); \ - int count; \ - end = ((end & align) == end) ? end - line_length : end & align; \ - count = end - start; \ - WARN_ON(count < 0); \ - \ - __asm__ __volatile__ (" 1: " #op " %0, %1; \ - bgtid %1, 1b; \ - addk %1, %1, %2; \ - " : : "r" (start), "r" (count), \ - "r" (step) : "memory"); \ -} while (0); - -/* It is used only first parameter for OP - for wic, wdc */ -#define CACHE_RANGE_LOOP_1(start, end, line_length, op) \ -do { \ - int volatile temp; \ - int align = ~(line_length - 1); \ - end = ((end & align) == end) ? end - line_length : end & align; \ - WARN_ON(end - start < 0); \ - \ - __asm__ __volatile__ (" 1: " #op " %1, r0; \ - cmpu %0, %1, %2; \ - bgtid %0, 1b; \ - addk %1, %1, %3; \ - " : : "r" (temp), "r" (start), "r" (end),\ - "r" (line_length) : "memory"); \ -} while (0); - -#define ASM_LOOP - -static void __flush_icache_range_msr_irq(unsigned long start, unsigned long end) -{ - unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s: start 0x%x, end 0x%x\n", __func__, - (unsigned int)start, (unsigned int) end); - - CACHE_LOOP_LIMITS(start, end, - cpuinfo.icache_line_length, cpuinfo.icache_size); - - local_irq_save(flags); - __disable_icache_msr(); - -#ifdef ASM_LOOP - CACHE_RANGE_LOOP_1(start, end, cpuinfo.icache_line_length, wic); -#else - for (i = start; i < end; i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif - __enable_icache_msr(); - local_irq_restore(flags); -} - -static void __flush_icache_range_nomsr_irq(unsigned long start, - unsigned long end) -{ - unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s: start 0x%x, end 0x%x\n", __func__, - (unsigned int)start, (unsigned int) end); - - CACHE_LOOP_LIMITS(start, end, - cpuinfo.icache_line_length, cpuinfo.icache_size); - - local_irq_save(flags); - __disable_icache_nomsr(); - -#ifdef ASM_LOOP - CACHE_RANGE_LOOP_1(start, end, cpuinfo.icache_line_length, wic); -#else - for (i = start; i < end; i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif - - __enable_icache_nomsr(); - local_irq_restore(flags); -} - -static void __flush_icache_range_noirq(unsigned long start, - unsigned long end) -{ -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s: start 0x%x, end 0x%x\n", __func__, - (unsigned int)start, (unsigned int) end); - - CACHE_LOOP_LIMITS(start, end, - cpuinfo.icache_line_length, cpuinfo.icache_size); -#ifdef ASM_LOOP - CACHE_RANGE_LOOP_1(start, end, cpuinfo.icache_line_length, wic); -#else - for (i = start; i < end; i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif -} - -static void __flush_icache_all_msr_irq(void) -{ - unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s\n", __func__); - - local_irq_save(flags); - __disable_icache_msr(); -#ifdef ASM_LOOP - CACHE_ALL_LOOP(cpuinfo.icache_size, cpuinfo.icache_line_length, wic); -#else - for (i = 0; i < cpuinfo.icache_size; - i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif - __enable_icache_msr(); - local_irq_restore(flags); -} - -static void __flush_icache_all_nomsr_irq(void) -{ - unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s\n", __func__); - - local_irq_save(flags); - __disable_icache_nomsr(); -#ifdef ASM_LOOP - CACHE_ALL_LOOP(cpuinfo.icache_size, cpuinfo.icache_line_length, wic); -#else - for (i = 0; i < cpuinfo.icache_size; - i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif - __enable_icache_nomsr(); - local_irq_restore(flags); -} - -static void __flush_icache_all_noirq(void) -{ -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s\n", __func__); -#ifdef ASM_LOOP - CACHE_ALL_LOOP(cpuinfo.icache_size, cpuinfo.icache_line_length, wic); -#else - for (i = 0; i < cpuinfo.icache_size; - i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif -} - -static void __invalidate_dcache_all_msr_irq(void) -{ - unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s\n", __func__); - - local_irq_save(flags); - __disable_dcache_msr(); -#ifdef ASM_LOOP - CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, wdc); -#else - for (i = 0; i < cpuinfo.dcache_size; - i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif - __enable_dcache_msr(); - local_irq_restore(flags); -} - -static void __invalidate_dcache_all_nomsr_irq(void) -{ - unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s\n", __func__); - - local_irq_save(flags); - __disable_dcache_nomsr(); -#ifdef ASM_LOOP - CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, wdc); -#else - for (i = 0; i < cpuinfo.dcache_size; - i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif - __enable_dcache_nomsr(); - local_irq_restore(flags); -} - -static void __invalidate_dcache_all_noirq_wt(void) -{ -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s\n", __func__); -#ifdef ASM_LOOP - CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, wdc) -#else - for (i = 0; i < cpuinfo.dcache_size; - i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif -} - -/* FIXME It is blindly invalidation as is expected - * but can't be called on noMMU in microblaze_cache_init below - * - * MS: noMMU kernel won't boot if simple wdc is used - * The reason should be that there are discared data which kernel needs - */ -static void __invalidate_dcache_all_wb(void) -{ -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s\n", __func__); -#ifdef ASM_LOOP - CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, - wdc) -#else - for (i = 0; i < cpuinfo.dcache_size; - i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif -} - -static void __invalidate_dcache_range_wb(unsigned long start, - unsigned long end) -{ -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s: start 0x%x, end 0x%x\n", __func__, - (unsigned int)start, (unsigned int) end); - - CACHE_LOOP_LIMITS(start, end, - cpuinfo.dcache_line_length, cpuinfo.dcache_size); -#ifdef ASM_LOOP - CACHE_RANGE_LOOP_2(start, end, cpuinfo.dcache_line_length, wdc.clear); -#else - for (i = start; i < end; i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc.clear %0, r0;" \ - : : "r" (i)); -#endif -} - -static void __invalidate_dcache_range_nomsr_wt(unsigned long start, - unsigned long end) -{ -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s: start 0x%x, end 0x%x\n", __func__, - (unsigned int)start, (unsigned int) end); - CACHE_LOOP_LIMITS(start, end, - cpuinfo.dcache_line_length, cpuinfo.dcache_size); - -#ifdef ASM_LOOP - CACHE_RANGE_LOOP_1(start, end, cpuinfo.dcache_line_length, wdc); -#else - for (i = start; i < end; i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif -} - -static void __invalidate_dcache_range_msr_irq_wt(unsigned long start, - unsigned long end) -{ - unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s: start 0x%x, end 0x%x\n", __func__, - (unsigned int)start, (unsigned int) end); - CACHE_LOOP_LIMITS(start, end, - cpuinfo.dcache_line_length, cpuinfo.dcache_size); - - local_irq_save(flags); - __disable_dcache_msr(); - -#ifdef ASM_LOOP - CACHE_RANGE_LOOP_1(start, end, cpuinfo.dcache_line_length, wdc); -#else - for (i = start; i < end; i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif - - __enable_dcache_msr(); - local_irq_restore(flags); -} - -static void __invalidate_dcache_range_nomsr_irq(unsigned long start, - unsigned long end) -{ - unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s: start 0x%x, end 0x%x\n", __func__, - (unsigned int)start, (unsigned int) end); - - CACHE_LOOP_LIMITS(start, end, - cpuinfo.dcache_line_length, cpuinfo.dcache_size); - - local_irq_save(flags); - __disable_dcache_nomsr(); - -#ifdef ASM_LOOP - CACHE_RANGE_LOOP_1(start, end, cpuinfo.dcache_line_length, wdc); -#else - for (i = start; i < end; i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif - - __enable_dcache_nomsr(); - local_irq_restore(flags); -} - -static void __flush_dcache_all_wb(void) -{ -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s\n", __func__); -#ifdef ASM_LOOP - CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, - wdc.flush); -#else - for (i = 0; i < cpuinfo.dcache_size; - i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc.flush %0, r0;" \ - : : "r" (i)); -#endif -} - -static void __flush_dcache_range_wb(unsigned long start, unsigned long end) -{ -#ifndef ASM_LOOP - int i; -#endif - pr_debug("%s: start 0x%x, end 0x%x\n", __func__, - (unsigned int)start, (unsigned int) end); - - CACHE_LOOP_LIMITS(start, end, - cpuinfo.dcache_line_length, cpuinfo.dcache_size); -#ifdef ASM_LOOP - CACHE_RANGE_LOOP_2(start, end, cpuinfo.dcache_line_length, wdc.flush); -#else - for (i = start; i < end; i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc.flush %0, r0;" \ - : : "r" (i)); -#endif -} - -/* struct for wb caches and for wt caches */ -struct scache *mbc; - -/* new wb cache model */ -static const struct scache wb_msr = { - .ie = __enable_icache_msr, - .id = __disable_icache_msr, - .ifl = __flush_icache_all_noirq, - .iflr = __flush_icache_range_noirq, - .iin = __flush_icache_all_noirq, - .iinr = __flush_icache_range_noirq, - .de = __enable_dcache_msr, - .dd = __disable_dcache_msr, - .dfl = __flush_dcache_all_wb, - .dflr = __flush_dcache_range_wb, - .din = __invalidate_dcache_all_wb, - .dinr = __invalidate_dcache_range_wb, -}; - -/* There is only difference in ie, id, de, dd functions */ -static const struct scache wb_nomsr = { - .ie = __enable_icache_nomsr, - .id = __disable_icache_nomsr, - .ifl = __flush_icache_all_noirq, - .iflr = __flush_icache_range_noirq, - .iin = __flush_icache_all_noirq, - .iinr = __flush_icache_range_noirq, - .de = __enable_dcache_nomsr, - .dd = __disable_dcache_nomsr, - .dfl = __flush_dcache_all_wb, - .dflr = __flush_dcache_range_wb, - .din = __invalidate_dcache_all_wb, - .dinr = __invalidate_dcache_range_wb, -}; - -/* Old wt cache model with disabling irq and turn off cache */ -static const struct scache wt_msr = { - .ie = __enable_icache_msr, - .id = __disable_icache_msr, - .ifl = __flush_icache_all_msr_irq, - .iflr = __flush_icache_range_msr_irq, - .iin = __flush_icache_all_msr_irq, - .iinr = __flush_icache_range_msr_irq, - .de = __enable_dcache_msr, - .dd = __disable_dcache_msr, - .dfl = __invalidate_dcache_all_msr_irq, - .dflr = __invalidate_dcache_range_msr_irq_wt, - .din = __invalidate_dcache_all_msr_irq, - .dinr = __invalidate_dcache_range_msr_irq_wt, -}; - -static const struct scache wt_nomsr = { - .ie = __enable_icache_nomsr, - .id = __disable_icache_nomsr, - .ifl = __flush_icache_all_nomsr_irq, - .iflr = __flush_icache_range_nomsr_irq, - .iin = __flush_icache_all_nomsr_irq, - .iinr = __flush_icache_range_nomsr_irq, - .de = __enable_dcache_nomsr, - .dd = __disable_dcache_nomsr, - .dfl = __invalidate_dcache_all_nomsr_irq, - .dflr = __invalidate_dcache_range_nomsr_irq, - .din = __invalidate_dcache_all_nomsr_irq, - .dinr = __invalidate_dcache_range_nomsr_irq, -}; - -/* New wt cache model for newer Microblaze versions */ -static const struct scache wt_msr_noirq = { - .ie = __enable_icache_msr, - .id = __disable_icache_msr, - .ifl = __flush_icache_all_noirq, - .iflr = __flush_icache_range_noirq, - .iin = __flush_icache_all_noirq, - .iinr = __flush_icache_range_noirq, - .de = __enable_dcache_msr, - .dd = __disable_dcache_msr, - .dfl = __invalidate_dcache_all_noirq_wt, - .dflr = __invalidate_dcache_range_nomsr_wt, - .din = __invalidate_dcache_all_noirq_wt, - .dinr = __invalidate_dcache_range_nomsr_wt, -}; - -static const struct scache wt_nomsr_noirq = { - .ie = __enable_icache_nomsr, - .id = __disable_icache_nomsr, - .ifl = __flush_icache_all_noirq, - .iflr = __flush_icache_range_noirq, - .iin = __flush_icache_all_noirq, - .iinr = __flush_icache_range_noirq, - .de = __enable_dcache_nomsr, - .dd = __disable_dcache_nomsr, - .dfl = __invalidate_dcache_all_noirq_wt, - .dflr = __invalidate_dcache_range_nomsr_wt, - .din = __invalidate_dcache_all_noirq_wt, - .dinr = __invalidate_dcache_range_nomsr_wt, -}; - -/* CPU version code for 7.20.c - see arch/microblaze/kernel/cpu/cpuinfo.c */ -#define CPUVER_7_20_A 0x0c -#define CPUVER_7_20_D 0x0f - -#define INFO(s) printk(KERN_INFO "cache: " s "\n"); - -void microblaze_cache_init(void) -{ - if (cpuinfo.use_instr & PVR2_USE_MSR_INSTR) { - if (cpuinfo.dcache_wb) { - INFO("wb_msr"); - mbc = (struct scache *)&wb_msr; - if (cpuinfo.ver_code <= CPUVER_7_20_D) { - /* MS: problem with signal handling - hw bug */ - INFO("WB won't work properly"); - } - } else { - if (cpuinfo.ver_code >= CPUVER_7_20_A) { - INFO("wt_msr_noirq"); - mbc = (struct scache *)&wt_msr_noirq; - } else { - INFO("wt_msr"); - mbc = (struct scache *)&wt_msr; - } - } - } else { - if (cpuinfo.dcache_wb) { - INFO("wb_nomsr"); - mbc = (struct scache *)&wb_nomsr; - if (cpuinfo.ver_code <= CPUVER_7_20_D) { - /* MS: problem with signal handling - hw bug */ - INFO("WB won't work properly"); - } - } else { - if (cpuinfo.ver_code >= CPUVER_7_20_A) { - INFO("wt_nomsr_noirq"); - mbc = (struct scache *)&wt_nomsr_noirq; - } else { - INFO("wt_nomsr"); - mbc = (struct scache *)&wt_nomsr; - } - } - } -/* FIXME Invalidation is done in U-BOOT - * WT cache: Data is already written to main memory - * WB cache: Discard data on noMMU which caused that kernel doesn't boot - */ - /* invalidate_dcache(); */ - enable_dcache(); - - invalidate_icache(); - enable_icache(); -} diff --git a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c b/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c deleted file mode 100644 index 916aaedf..00000000 --- a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Support for MicroBlaze PVR (processor version register) - * - * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> - * Copyright (C) 2007-2009 PetaLogix - * Copyright (C) 2007 John Williams <john.williams@petalogix.com> - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#include <linux/init.h> -#include <linux/string.h> -#include <asm/pvr.h> -#include <asm/cpuinfo.h> - -/* - * Helper macro to map between fields in our struct cpuinfo, and - * the PVR macros in pvr.h. - */ - -#define CI(c, p) { ci->c = PVR_##p(pvr); } - -#if defined(CONFIG_EARLY_PRINTK) && defined(CONFIG_SERIAL_UARTLITE_CONSOLE) -#define err_printk(x) \ - early_printk("ERROR: Microblaze " x "-different for PVR and DTS\n"); -#else -#define err_printk(x) \ - printk(KERN_INFO "ERROR: Microblaze " x "-different for PVR and DTS\n"); -#endif - -void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu) -{ - struct pvr_s pvr; - int temp; /* for saving temp value */ - get_pvr(&pvr); - - CI(ver_code, VERSION); - if (!ci->ver_code) { - printk(KERN_ERR "ERROR: MB has broken PVR regs " - "-> use DTS setting\n"); - return; - } - - temp = PVR_USE_BARREL(pvr) | PVR_USE_MSR_INSTR(pvr) |\ - PVR_USE_PCMP_INSTR(pvr) | PVR_USE_DIV(pvr); - if (ci->use_instr != temp) - err_printk("BARREL, MSR, PCMP or DIV"); - ci->use_instr = temp; - - temp = PVR_USE_HW_MUL(pvr) | PVR_USE_MUL64(pvr); - if (ci->use_mult != temp) - err_printk("HW_MUL"); - ci->use_mult = temp; - - temp = PVR_USE_FPU(pvr) | PVR_USE_FPU2(pvr); - if (ci->use_fpu != temp) - err_printk("HW_FPU"); - ci->use_fpu = temp; - - ci->use_exc = PVR_OPCODE_0x0_ILLEGAL(pvr) |\ - PVR_UNALIGNED_EXCEPTION(pvr) |\ - PVR_ILL_OPCODE_EXCEPTION(pvr) |\ - PVR_IOPB_BUS_EXCEPTION(pvr) |\ - PVR_DOPB_BUS_EXCEPTION(pvr) |\ - PVR_DIV_ZERO_EXCEPTION(pvr) |\ - PVR_FPU_EXCEPTION(pvr) |\ - PVR_FSL_EXCEPTION(pvr); - - CI(pvr_user1, USER1); - CI(pvr_user2, USER2); - - CI(mmu, USE_MMU); - CI(mmu_privins, MMU_PRIVINS); - CI(endian, ENDIAN); - - CI(use_icache, USE_ICACHE); - CI(icache_tagbits, ICACHE_ADDR_TAG_BITS); - CI(icache_write, ICACHE_ALLOW_WR); - ci->icache_line_length = PVR_ICACHE_LINE_LEN(pvr) << 2; - CI(icache_size, ICACHE_BYTE_SIZE); - CI(icache_base, ICACHE_BASEADDR); - CI(icache_high, ICACHE_HIGHADDR); - - CI(use_dcache, USE_DCACHE); - CI(dcache_tagbits, DCACHE_ADDR_TAG_BITS); - CI(dcache_write, DCACHE_ALLOW_WR); - ci->dcache_line_length = PVR_DCACHE_LINE_LEN(pvr) << 2; - CI(dcache_size, DCACHE_BYTE_SIZE); - CI(dcache_base, DCACHE_BASEADDR); - CI(dcache_high, DCACHE_HIGHADDR); - - temp = PVR_DCACHE_USE_WRITEBACK(pvr); - if (ci->dcache_wb != temp) - err_printk("DCACHE WB"); - ci->dcache_wb = temp; - - CI(use_dopb, D_OPB); - CI(use_iopb, I_OPB); - CI(use_dlmb, D_LMB); - CI(use_ilmb, I_LMB); - CI(num_fsl, FSL_LINKS); - - CI(irq_edge, INTERRUPT_IS_EDGE); - CI(irq_positive, EDGE_IS_POSITIVE); - - CI(area_optimised, AREA_OPTIMISED); - - CI(hw_debug, DEBUG_ENABLED); - CI(num_pc_brk, NUMBER_OF_PC_BRK); - CI(num_rd_brk, NUMBER_OF_RD_ADDR_BRK); - CI(num_wr_brk, NUMBER_OF_WR_ADDR_BRK); - - CI(fpga_family_code, TARGET_FAMILY); - - /* take timebase-frequency from DTS */ - ci->cpu_clock_freq = fcpu(cpu, "timebase-frequency"); -} diff --git a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo-static.c b/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo-static.c deleted file mode 100644 index 592bb2e8..00000000 --- a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo-static.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> - * Copyright (C) 2007-2009 PetaLogix - * Copyright (C) 2007 John Williams <john.williams@petalogix.com> - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/string.h> -#include <asm/cpuinfo.h> -#include <asm/pvr.h> - -static const char family_string[] = CONFIG_XILINX_MICROBLAZE0_FAMILY; -static const char cpu_ver_string[] = CONFIG_XILINX_MICROBLAZE0_HW_VER; - -#define err_printk(x) \ - early_printk("ERROR: Microblaze " x "-different for kernel and DTS\n"); - -void __init set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu) -{ - int i = 0; - - ci->use_instr = - (fcpu(cpu, "xlnx,use-barrel") ? PVR0_USE_BARREL_MASK : 0) | - (fcpu(cpu, "xlnx,use-msr-instr") ? PVR2_USE_MSR_INSTR : 0) | - (fcpu(cpu, "xlnx,use-pcmp-instr") ? PVR2_USE_PCMP_INSTR : 0) | - (fcpu(cpu, "xlnx,use-div") ? PVR0_USE_DIV_MASK : 0); - if (CONFIG_XILINX_MICROBLAZE0_USE_BARREL) - i |= PVR0_USE_BARREL_MASK; - if (CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR) - i |= PVR2_USE_MSR_INSTR; - if (CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR) - i |= PVR2_USE_PCMP_INSTR; - if (CONFIG_XILINX_MICROBLAZE0_USE_DIV) - i |= PVR0_USE_DIV_MASK; - if (ci->use_instr != i) - err_printk("BARREL, MSR, PCMP or DIV"); - - ci->use_mult = fcpu(cpu, "xlnx,use-hw-mul"); - if (ci->use_mult != CONFIG_XILINX_MICROBLAZE0_USE_HW_MUL) - err_printk("HW_MUL"); - ci->use_mult = - (ci->use_mult > 1 ? - (PVR2_USE_MUL64_MASK | PVR0_USE_HW_MUL_MASK) : - (ci->use_mult == 1 ? PVR0_USE_HW_MUL_MASK : 0)); - - ci->use_fpu = fcpu(cpu, "xlnx,use-fpu"); - if (ci->use_fpu != CONFIG_XILINX_MICROBLAZE0_USE_FPU) - err_printk("HW_FPU"); - ci->use_fpu = (ci->use_fpu > 1 ? - (PVR2_USE_FPU2_MASK | PVR0_USE_FPU_MASK) : - (ci->use_fpu == 1 ? PVR0_USE_FPU_MASK : 0)); - - ci->use_exc = - (fcpu(cpu, "xlnx,unaligned-exceptions") ? - PVR2_UNALIGNED_EXC_MASK : 0) | - (fcpu(cpu, "xlnx,ill-opcode-exception") ? - PVR2_ILL_OPCODE_EXC_MASK : 0) | - (fcpu(cpu, "xlnx,iopb-bus-exception") ? - PVR2_IOPB_BUS_EXC_MASK : 0) | - (fcpu(cpu, "xlnx,dopb-bus-exception") ? - PVR2_DOPB_BUS_EXC_MASK : 0) | - (fcpu(cpu, "xlnx,div-zero-exception") ? - PVR2_DIV_ZERO_EXC_MASK : 0) | - (fcpu(cpu, "xlnx,fpu-exception") ? PVR2_FPU_EXC_MASK : 0) | - (fcpu(cpu, "xlnx,fsl-exception") ? PVR2_USE_EXTEND_FSL : 0); - - ci->use_icache = fcpu(cpu, "xlnx,use-icache"); - ci->icache_tagbits = fcpu(cpu, "xlnx,addr-tag-bits"); - ci->icache_write = fcpu(cpu, "xlnx,allow-icache-wr"); - ci->icache_line_length = fcpu(cpu, "xlnx,icache-line-len") << 2; - if (!ci->icache_line_length) { - if (fcpu(cpu, "xlnx,icache-use-fsl")) - ci->icache_line_length = 4 << 2; - else - ci->icache_line_length = 1 << 2; - } - ci->icache_size = fcpu(cpu, "i-cache-size"); - ci->icache_base = fcpu(cpu, "i-cache-baseaddr"); - ci->icache_high = fcpu(cpu, "i-cache-highaddr"); - - ci->use_dcache = fcpu(cpu, "xlnx,use-dcache"); - ci->dcache_tagbits = fcpu(cpu, "xlnx,dcache-addr-tag"); - ci->dcache_write = fcpu(cpu, "xlnx,allow-dcache-wr"); - ci->dcache_line_length = fcpu(cpu, "xlnx,dcache-line-len") << 2; - if (!ci->dcache_line_length) { - if (fcpu(cpu, "xlnx,dcache-use-fsl")) - ci->dcache_line_length = 4 << 2; - else - ci->dcache_line_length = 1 << 2; - } - ci->dcache_size = fcpu(cpu, "d-cache-size"); - ci->dcache_base = fcpu(cpu, "d-cache-baseaddr"); - ci->dcache_high = fcpu(cpu, "d-cache-highaddr"); - ci->dcache_wb = fcpu(cpu, "xlnx,dcache-use-writeback"); - - ci->use_dopb = fcpu(cpu, "xlnx,d-opb"); - ci->use_iopb = fcpu(cpu, "xlnx,i-opb"); - ci->use_dlmb = fcpu(cpu, "xlnx,d-lmb"); - ci->use_ilmb = fcpu(cpu, "xlnx,i-lmb"); - - ci->num_fsl = fcpu(cpu, "xlnx,fsl-links"); - ci->irq_edge = fcpu(cpu, "xlnx,interrupt-is-edge"); - ci->irq_positive = fcpu(cpu, "xlnx,edge-is-positive"); - ci->area_optimised = 0; - - ci->hw_debug = fcpu(cpu, "xlnx,debug-enabled"); - ci->num_pc_brk = fcpu(cpu, "xlnx,number-of-pc-brk"); - ci->num_rd_brk = fcpu(cpu, "xlnx,number-of-rd-addr-brk"); - ci->num_wr_brk = fcpu(cpu, "xlnx,number-of-wr-addr-brk"); - - ci->cpu_clock_freq = fcpu(cpu, "timebase-frequency"); - - ci->pvr_user1 = fcpu(cpu, "xlnx,pvr-user1"); - ci->pvr_user2 = fcpu(cpu, "xlnx,pvr-user2"); - - ci->mmu = fcpu(cpu, "xlnx,use-mmu"); - ci->mmu_privins = fcpu(cpu, "xlnx,mmu-privileged-instr"); - ci->endian = fcpu(cpu, "xlnx,endianness"); - - ci->ver_code = 0; - ci->fpga_family_code = 0; - - /* Do various fixups based on CPU version and FPGA family strings */ - - /* Resolved the CPU version code */ - for (i = 0; cpu_ver_lookup[i].s != NULL; i++) { - if (strcmp(cpu_ver_lookup[i].s, cpu_ver_string) == 0) - ci->ver_code = cpu_ver_lookup[i].k; - } - - /* Resolved the fpga family code */ - for (i = 0; family_string_lookup[i].s != NULL; i++) { - if (strcmp(family_string_lookup[i].s, family_string) == 0) - ci->fpga_family_code = family_string_lookup[i].k; - } - - /* FIXME - mb3 and spartan2 do not exist in PVR */ - /* This is mb3 and on a non Spartan2 */ - if (ci->ver_code == 0x20 && ci->fpga_family_code != 0xf0) - /* Hardware Multiplier in use */ - ci->use_mult = 1; -} diff --git a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo.c b/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo.c deleted file mode 100644 index eab6abf5..00000000 --- a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/cpuinfo.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> - * Copyright (C) 2007-2009 PetaLogix - * Copyright (C) 2007 John Williams <john.williams@petalogix.com> - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#include <linux/init.h> -#include <asm/cpuinfo.h> -#include <asm/pvr.h> - -const struct cpu_ver_key cpu_ver_lookup[] = { - /* These key value are as per MBV field in PVR0 */ - {"5.00.a", 0x01}, - {"5.00.b", 0x02}, - {"5.00.c", 0x03}, - {"6.00.a", 0x04}, - {"6.00.b", 0x06}, - {"7.00.a", 0x05}, - {"7.00.b", 0x07}, - {"7.10.a", 0x08}, - {"7.10.b", 0x09}, - {"7.10.c", 0x0a}, - {"7.10.d", 0x0b}, - {"7.20.a", 0x0c}, - {"7.20.b", 0x0d}, - {"7.20.c", 0x0e}, - {"7.20.d", 0x0f}, - {"7.30.a", 0x10}, - {"7.30.b", 0x11}, - {"8.00.a", 0x12}, - {"8.00.b", 0x13}, - {"8.10.a", 0x14}, - {"8.20.a", 0x15}, - {"8.20.b", 0x16}, - {"8.30.a", 0x17}, - {NULL, 0}, -}; - -/* - * FIXME Not sure if the actual key is defined by Xilinx in the PVR - */ -const struct family_string_key family_string_lookup[] = { - {"virtex2", 0x4}, - {"virtex2pro", 0x5}, - {"spartan3", 0x6}, - {"virtex4", 0x7}, - {"virtex5", 0x8}, - {"spartan3e", 0x9}, - {"spartan3a", 0xa}, - {"spartan3an", 0xb}, - {"spartan3adsp", 0xc}, - {"spartan6", 0xd}, - {"virtex6", 0xe}, - /* FIXME There is no key code defined for spartan2 */ - {"spartan2", 0xf0}, - {NULL, 0}, -}; - -struct cpuinfo cpuinfo; - -void __init setup_cpuinfo(void) -{ - struct device_node *cpu = NULL; - - cpu = (struct device_node *) of_find_node_by_type(NULL, "cpu"); - if (!cpu) - printk(KERN_ERR "You don't have cpu!!!\n"); - - printk(KERN_INFO "%s: initialising\n", __func__); - - switch (cpu_has_pvr()) { - case 0: - printk(KERN_WARNING - "%s: No PVR support. Using static CPU info from FDT\n", - __func__); - set_cpuinfo_static(&cpuinfo, cpu); - break; -/* FIXME I found weird behavior with MB 7.00.a/b 7.10.a - * please do not use FULL PVR with MMU */ - case 1: - printk(KERN_INFO "%s: Using full CPU PVR support\n", - __func__); - set_cpuinfo_static(&cpuinfo, cpu); - set_cpuinfo_pvr_full(&cpuinfo, cpu); - break; - default: - printk(KERN_WARNING "%s: Unsupported PVR setting\n", __func__); - set_cpuinfo_static(&cpuinfo, cpu); - } - - if (cpuinfo.mmu_privins) - printk(KERN_WARNING "%s: Stream instructions enabled" - " - USERSPACE CAN LOCK THIS KERNEL!\n", __func__); -} diff --git a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/mb.c b/ANDROID_3.4.5/arch/microblaze/kernel/cpu/mb.c deleted file mode 100644 index 7b5dca7e..00000000 --- a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/mb.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * CPU-version specific code - * - * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> - * Copyright (C) 2006-2009 PetaLogix - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#include <linux/init.h> -#include <linux/string.h> -#include <linux/seq_file.h> -#include <linux/cpu.h> -#include <linux/initrd.h> - -#include <linux/bug.h> -#include <asm/cpuinfo.h> -#include <linux/delay.h> -#include <linux/io.h> -#include <asm/page.h> -#include <linux/param.h> -#include <asm/pvr.h> -#include <asm/sections.h> -#include <asm/setup.h> - -static int show_cpuinfo(struct seq_file *m, void *v) -{ - int count = 0; - char *fpga_family = "Unknown"; - char *cpu_ver = "Unknown"; - int i; - - /* Denormalised to get the fpga family string */ - for (i = 0; family_string_lookup[i].s != NULL; i++) { - if (cpuinfo.fpga_family_code == family_string_lookup[i].k) { - fpga_family = (char *)family_string_lookup[i].s; - break; - } - } - - /* Denormalised to get the hw version string */ - for (i = 0; cpu_ver_lookup[i].s != NULL; i++) { - if (cpuinfo.ver_code == cpu_ver_lookup[i].k) { - cpu_ver = (char *)cpu_ver_lookup[i].s; - break; - } - } - - count = seq_printf(m, - "CPU-Family: MicroBlaze\n" - "FPGA-Arch: %s\n" - "CPU-Ver: %s, %s endian\n" - "CPU-MHz: %d.%02d\n" - "BogoMips: %lu.%02lu\n", - fpga_family, - cpu_ver, - cpuinfo.endian ? "little" : "big", - cpuinfo.cpu_clock_freq / - 1000000, - cpuinfo.cpu_clock_freq % - 1000000, - loops_per_jiffy / (500000 / HZ), - (loops_per_jiffy / (5000 / HZ)) % 100); - - count += seq_printf(m, - "HW:\n Shift:\t\t%s\n" - " MSR:\t\t%s\n" - " PCMP:\t\t%s\n" - " DIV:\t\t%s\n", - (cpuinfo.use_instr & PVR0_USE_BARREL_MASK) ? "yes" : "no", - (cpuinfo.use_instr & PVR2_USE_MSR_INSTR) ? "yes" : "no", - (cpuinfo.use_instr & PVR2_USE_PCMP_INSTR) ? "yes" : "no", - (cpuinfo.use_instr & PVR0_USE_DIV_MASK) ? "yes" : "no"); - - count += seq_printf(m, - " MMU:\t\t%x\n", - cpuinfo.mmu); - - count += seq_printf(m, - " MUL:\t\t%s\n" - " FPU:\t\t%s\n", - (cpuinfo.use_mult & PVR2_USE_MUL64_MASK) ? "v2" : - (cpuinfo.use_mult & PVR0_USE_HW_MUL_MASK) ? "v1" : "no", - (cpuinfo.use_fpu & PVR2_USE_FPU2_MASK) ? "v2" : - (cpuinfo.use_fpu & PVR0_USE_FPU_MASK) ? "v1" : "no"); - - count += seq_printf(m, - " Exc:\t\t%s%s%s%s%s%s%s%s\n", - (cpuinfo.use_exc & PVR2_OPCODE_0x0_ILL_MASK) ? "op0x0 " : "", - (cpuinfo.use_exc & PVR2_UNALIGNED_EXC_MASK) ? "unal " : "", - (cpuinfo.use_exc & PVR2_ILL_OPCODE_EXC_MASK) ? "ill " : "", - (cpuinfo.use_exc & PVR2_IOPB_BUS_EXC_MASK) ? "iopb " : "", - (cpuinfo.use_exc & PVR2_DOPB_BUS_EXC_MASK) ? "dopb " : "", - (cpuinfo.use_exc & PVR2_DIV_ZERO_EXC_MASK) ? "zero " : "", - (cpuinfo.use_exc & PVR2_FPU_EXC_MASK) ? "fpu " : "", - (cpuinfo.use_exc & PVR2_USE_FSL_EXC) ? "fsl " : ""); - - count += seq_printf(m, - "Stream-insns:\t%sprivileged\n", - cpuinfo.mmu_privins ? "un" : ""); - - if (cpuinfo.use_icache) - count += seq_printf(m, - "Icache:\t\t%ukB\tline length:\t%dB\n", - cpuinfo.icache_size >> 10, - cpuinfo.icache_line_length); - else - count += seq_printf(m, "Icache:\t\tno\n"); - - if (cpuinfo.use_dcache) { - count += seq_printf(m, - "Dcache:\t\t%ukB\tline length:\t%dB\n", - cpuinfo.dcache_size >> 10, - cpuinfo.dcache_line_length); - seq_printf(m, "Dcache-Policy:\t"); - if (cpuinfo.dcache_wb) - count += seq_printf(m, "write-back\n"); - else - count += seq_printf(m, "write-through\n"); - } else - count += seq_printf(m, "Dcache:\t\tno\n"); - - count += seq_printf(m, - "HW-Debug:\t%s\n", - cpuinfo.hw_debug ? "yes" : "no"); - - count += seq_printf(m, - "PVR-USR1:\t%02x\n" - "PVR-USR2:\t%08x\n", - cpuinfo.pvr_user1, - cpuinfo.pvr_user2); - - count += seq_printf(m, "Page size:\t%lu\n", PAGE_SIZE); - return 0; -} - -static void *c_start(struct seq_file *m, loff_t *pos) -{ - int i = *pos; - - return i < NR_CPUS ? (void *) (i + 1) : NULL; -} - -static void *c_next(struct seq_file *m, void *v, loff_t *pos) -{ - ++*pos; - return c_start(m, pos); -} - -static void c_stop(struct seq_file *m, void *v) -{ -} - -const struct seq_operations cpuinfo_op = { - .start = c_start, - .next = c_next, - .stop = c_stop, - .show = show_cpuinfo, -}; diff --git a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/pvr.c b/ANDROID_3.4.5/arch/microblaze/kernel/cpu/pvr.c deleted file mode 100644 index 3a749d5e..00000000 --- a/ANDROID_3.4.5/arch/microblaze/kernel/cpu/pvr.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Support for MicroBlaze PVR (processor version register) - * - * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> - * Copyright (C) 2007-2009 PetaLogix - * Copyright (C) 2007 John Williams <john.williams@petalogix.com> - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#include <linux/kernel.h> -#include <linux/compiler.h> -#include <asm/exceptions.h> -#include <asm/pvr.h> - -/* - * Until we get an assembler that knows about the pvr registers, - * this horrible cruft will have to do. - * That hardcoded opcode is mfs r3, rpvrNN - */ - -#define get_single_pvr(pvrid, val) \ -{ \ - register unsigned tmp __asm__("r3"); \ - tmp = 0x0; /* Prevent warning about unused */ \ - __asm__ __volatile__ ( \ - "mfs %0, rpvr" #pvrid ";" \ - : "=r" (tmp) : : "memory"); \ - val = tmp; \ -} - -/* - * Does the CPU support the PVR register? - * return value: - * 0: no PVR - * 1: simple PVR - * 2: full PVR - * - * This must work on all CPU versions, including those before the - * PVR was even an option. - */ - -int cpu_has_pvr(void) -{ - unsigned long flags; - unsigned pvr0; - - local_save_flags(flags); - - /* PVR bit in MSR tells us if there is any support */ - if (!(flags & PVR_MSR_BIT)) - return 0; - - get_single_pvr(0, pvr0); - pr_debug("%s: pvr0 is 0x%08x\n", __func__, pvr0); - - if (pvr0 & PVR0_PVR_FULL_MASK) - return 1; - - /* for partial PVR use static cpuinfo */ - return 2; -} - -void get_pvr(struct pvr_s *p) -{ - get_single_pvr(0, p->pvr[0]); - get_single_pvr(1, p->pvr[1]); - get_single_pvr(2, p->pvr[2]); - get_single_pvr(3, p->pvr[3]); - get_single_pvr(4, p->pvr[4]); - get_single_pvr(5, p->pvr[5]); - get_single_pvr(6, p->pvr[6]); - get_single_pvr(7, p->pvr[7]); - get_single_pvr(8, p->pvr[8]); - get_single_pvr(9, p->pvr[9]); - get_single_pvr(10, p->pvr[10]); - get_single_pvr(11, p->pvr[11]); -} |