| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: cpufunc.c,v 1.122 2013/06/12 01:16:48 matt Exp $ */ | | 1 | /* $NetBSD: cpufunc.c,v 1.123 2013/06/18 15:27:05 matt Exp $ */ |
2 | | | 2 | |
3 | /* | | 3 | /* |
4 | * arm7tdmi support code Copyright (c) 2001 John Fremlin | | 4 | * arm7tdmi support code Copyright (c) 2001 John Fremlin |
5 | * arm8 support code Copyright (c) 1997 ARM Limited | | 5 | * arm8 support code Copyright (c) 1997 ARM Limited |
6 | * arm8 support code Copyright (c) 1997 Causality Limited | | 6 | * arm8 support code Copyright (c) 1997 Causality Limited |
7 | * arm9 support code Copyright (C) 2001 ARM Ltd | | 7 | * arm9 support code Copyright (C) 2001 ARM Ltd |
8 | * arm11 support code Copyright (c) 2007 Microsoft | | 8 | * arm11 support code Copyright (c) 2007 Microsoft |
9 | * cortexa8 support code Copyright (c) 2008 3am Software Foundry | | 9 | * cortexa8 support code Copyright (c) 2008 3am Software Foundry |
10 | * cortexa8 improvements Copyright (c) Goeran Weinholt | | 10 | * cortexa8 improvements Copyright (c) Goeran Weinholt |
11 | * Copyright (c) 1997 Mark Brinicombe. | | 11 | * Copyright (c) 1997 Mark Brinicombe. |
12 | * Copyright (c) 1997 Causality Limited | | 12 | * Copyright (c) 1997 Causality Limited |
13 | * All rights reserved. | | 13 | * All rights reserved. |
14 | * | | 14 | * |
| @@ -39,27 +39,27 @@ | | | @@ -39,27 +39,27 @@ |
39 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 39 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
40 | * SUCH DAMAGE. | | 40 | * SUCH DAMAGE. |
41 | * | | 41 | * |
42 | * RiscBSD kernel project | | 42 | * RiscBSD kernel project |
43 | * | | 43 | * |
44 | * cpufuncs.c | | 44 | * cpufuncs.c |
45 | * | | 45 | * |
46 | * C functions for supporting CPU / MMU / TLB specific operations. | | 46 | * C functions for supporting CPU / MMU / TLB specific operations. |
47 | * | | 47 | * |
48 | * Created : 30/01/97 | | 48 | * Created : 30/01/97 |
49 | */ | | 49 | */ |
50 | | | 50 | |
51 | #include <sys/cdefs.h> | | 51 | #include <sys/cdefs.h> |
52 | __KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.122 2013/06/12 01:16:48 matt Exp $"); | | 52 | __KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.123 2013/06/18 15:27:05 matt Exp $"); |
53 | | | 53 | |
54 | #include "opt_compat_netbsd.h" | | 54 | #include "opt_compat_netbsd.h" |
55 | #include "opt_cpuoptions.h" | | 55 | #include "opt_cpuoptions.h" |
56 | #include "opt_perfctrs.h" | | 56 | #include "opt_perfctrs.h" |
57 | | | 57 | |
58 | #include <sys/types.h> | | 58 | #include <sys/types.h> |
59 | #include <sys/param.h> | | 59 | #include <sys/param.h> |
60 | #include <sys/pmc.h> | | 60 | #include <sys/pmc.h> |
61 | #include <sys/systm.h> | | 61 | #include <sys/systm.h> |
62 | #include <machine/cpu.h> | | 62 | #include <machine/cpu.h> |
63 | #include <machine/bootconfig.h> | | 63 | #include <machine/bootconfig.h> |
64 | #include <arch/arm/arm/disassem.h> | | 64 | #include <arch/arm/arm/disassem.h> |
65 | | | 65 | |
| @@ -2784,28 +2784,30 @@ arm9_setup(char *args) | | | @@ -2784,28 +2784,30 @@ arm9_setup(char *args) |
2784 | | CPU_CONTROL_LABT_ENABLE | CPU_CONTROL_VECRELOC | | 2784 | | CPU_CONTROL_LABT_ENABLE | CPU_CONTROL_VECRELOC |
2785 | | CPU_CONTROL_ROUNDROBIN; | | 2785 | | CPU_CONTROL_ROUNDROBIN; |
2786 | | | 2786 | |
2787 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 2787 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
2788 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 2788 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
2789 | #endif | | 2789 | #endif |
2790 | | | 2790 | |
2791 | cpuctrl = parse_cpu_options(args, arm9_options, cpuctrl); | | 2791 | cpuctrl = parse_cpu_options(args, arm9_options, cpuctrl); |
2792 | | | 2792 | |
2793 | #ifdef __ARMEB__ | | 2793 | #ifdef __ARMEB__ |
2794 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; | | 2794 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; |
2795 | #endif | | 2795 | #endif |
2796 | | | 2796 | |
| | | 2797 | #ifndef ARM_HAS_VBAR |
2797 | if (vector_page == ARM_VECTORS_HIGH) | | 2798 | if (vector_page == ARM_VECTORS_HIGH) |
2798 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 2799 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 2800 | #endif |
2799 | | | 2801 | |
2800 | /* Clear out the cache */ | | 2802 | /* Clear out the cache */ |
2801 | cpu_idcache_wbinv_all(); | | 2803 | cpu_idcache_wbinv_all(); |
2802 | | | 2804 | |
2803 | /* Set the control register */ | | 2805 | /* Set the control register */ |
2804 | curcpu()->ci_ctrl = cpuctrl; | | 2806 | curcpu()->ci_ctrl = cpuctrl; |
2805 | cpu_control(cpuctrlmask, cpuctrl); | | 2807 | cpu_control(cpuctrlmask, cpuctrl); |
2806 | | | 2808 | |
2807 | } | | 2809 | } |
2808 | #endif /* CPU_ARM9 */ | | 2810 | #endif /* CPU_ARM9 */ |
2809 | | | 2811 | |
2810 | #if defined(CPU_ARM9E) || defined(CPU_ARM10) | | 2812 | #if defined(CPU_ARM9E) || defined(CPU_ARM10) |
2811 | struct cpu_option arm10_options[] = { | | 2813 | struct cpu_option arm10_options[] = { |
| @@ -2835,28 +2837,30 @@ arm10_setup(char *args) | | | @@ -2835,28 +2837,30 @@ arm10_setup(char *args) |
2835 | | CPU_CONTROL_BPRD_ENABLE | | 2837 | | CPU_CONTROL_BPRD_ENABLE |
2836 | | CPU_CONTROL_ROUNDROBIN | CPU_CONTROL_CPCLK; | | 2838 | | CPU_CONTROL_ROUNDROBIN | CPU_CONTROL_CPCLK; |
2837 | | | 2839 | |
2838 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 2840 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
2839 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 2841 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
2840 | #endif | | 2842 | #endif |
2841 | | | 2843 | |
2842 | cpuctrl = parse_cpu_options(args, arm10_options, cpuctrl); | | 2844 | cpuctrl = parse_cpu_options(args, arm10_options, cpuctrl); |
2843 | | | 2845 | |
2844 | #ifdef __ARMEB__ | | 2846 | #ifdef __ARMEB__ |
2845 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; | | 2847 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; |
2846 | #endif | | 2848 | #endif |
2847 | | | 2849 | |
| | | 2850 | #ifndef ARM_HAS_VBAR |
2848 | if (vector_page == ARM_VECTORS_HIGH) | | 2851 | if (vector_page == ARM_VECTORS_HIGH) |
2849 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 2852 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 2853 | #endif |
2850 | | | 2854 | |
2851 | /* Clear out the cache */ | | 2855 | /* Clear out the cache */ |
2852 | cpu_idcache_wbinv_all(); | | 2856 | cpu_idcache_wbinv_all(); |
2853 | | | 2857 | |
2854 | /* Now really make sure they are clean. */ | | 2858 | /* Now really make sure they are clean. */ |
2855 | __asm volatile ("mcr\tp15, 0, r0, c7, c7, 0" : : ); | | 2859 | __asm volatile ("mcr\tp15, 0, r0, c7, c7, 0" : : ); |
2856 | | | 2860 | |
2857 | /* Set the control register */ | | 2861 | /* Set the control register */ |
2858 | curcpu()->ci_ctrl = cpuctrl; | | 2862 | curcpu()->ci_ctrl = cpuctrl; |
2859 | cpu_control(0xffffffff, cpuctrl); | | 2863 | cpu_control(0xffffffff, cpuctrl); |
2860 | | | 2864 | |
2861 | /* And again. */ | | 2865 | /* And again. */ |
2862 | cpu_idcache_wbinv_all(); | | 2866 | cpu_idcache_wbinv_all(); |
| @@ -2889,28 +2893,30 @@ arm11_setup(char *args) | | | @@ -2889,28 +2893,30 @@ arm11_setup(char *args) |
2889 | | CPU_CONTROL_BEND_ENABLE | CPU_CONTROL_AFLT_ENABLE | | 2893 | | CPU_CONTROL_BEND_ENABLE | CPU_CONTROL_AFLT_ENABLE |
2890 | | CPU_CONTROL_ROUNDROBIN | CPU_CONTROL_CPCLK; | | 2894 | | CPU_CONTROL_ROUNDROBIN | CPU_CONTROL_CPCLK; |
2891 | | | 2895 | |
2892 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 2896 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
2893 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 2897 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
2894 | #endif | | 2898 | #endif |
2895 | | | 2899 | |
2896 | cpuctrl = parse_cpu_options(args, arm11_options, cpuctrl); | | 2900 | cpuctrl = parse_cpu_options(args, arm11_options, cpuctrl); |
2897 | | | 2901 | |
2898 | #ifdef __ARMEB__ | | 2902 | #ifdef __ARMEB__ |
2899 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; | | 2903 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; |
2900 | #endif | | 2904 | #endif |
2901 | | | 2905 | |
| | | 2906 | #ifndef ARM_HAS_VBAR |
2902 | if (vector_page == ARM_VECTORS_HIGH) | | 2907 | if (vector_page == ARM_VECTORS_HIGH) |
2903 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 2908 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 2909 | #endif |
2904 | | | 2910 | |
2905 | /* Clear out the cache */ | | 2911 | /* Clear out the cache */ |
2906 | cpu_idcache_wbinv_all(); | | 2912 | cpu_idcache_wbinv_all(); |
2907 | | | 2913 | |
2908 | /* Now really make sure they are clean. */ | | 2914 | /* Now really make sure they are clean. */ |
2909 | __asm volatile ("mcr\tp15, 0, r0, c7, c7, 0" : : ); | | 2915 | __asm volatile ("mcr\tp15, 0, r0, c7, c7, 0" : : ); |
2910 | | | 2916 | |
2911 | /* Allow detection code to find the VFP if it's fitted. */ | | 2917 | /* Allow detection code to find the VFP if it's fitted. */ |
2912 | __asm volatile ("mcr\tp15, 0, %0, c1, c0, 2" : : "r" (0x0fffffff)); | | 2918 | __asm volatile ("mcr\tp15, 0, %0, c1, c0, 2" : : "r" (0x0fffffff)); |
2913 | | | 2919 | |
2914 | /* Set the control register */ | | 2920 | /* Set the control register */ |
2915 | curcpu()->ci_ctrl = cpuctrl; | | 2921 | curcpu()->ci_ctrl = cpuctrl; |
2916 | cpu_control(0xffffffff, cpuctrl); | | 2922 | cpu_control(0xffffffff, cpuctrl); |
| @@ -2936,28 +2942,30 @@ arm11mpcore_setup(char *args) | | | @@ -2936,28 +2942,30 @@ arm11mpcore_setup(char *args) |
2936 | | CPU_CONTROL_AFLT_ENABLE | | 2942 | | CPU_CONTROL_AFLT_ENABLE |
2937 | | CPU_CONTROL_VECRELOC; | | 2943 | | CPU_CONTROL_VECRELOC; |
2938 | | | 2944 | |
2939 | #ifdef ARM11MPCORE_MMU_COMPAT | | 2945 | #ifdef ARM11MPCORE_MMU_COMPAT |
2940 | /* XXX: S and R? */ | | 2946 | /* XXX: S and R? */ |
2941 | #endif | | 2947 | #endif |
2942 | | | 2948 | |
2943 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 2949 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
2944 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 2950 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
2945 | #endif | | 2951 | #endif |
2946 | | | 2952 | |
2947 | cpuctrl = parse_cpu_options(args, arm11_options, cpuctrl); | | 2953 | cpuctrl = parse_cpu_options(args, arm11_options, cpuctrl); |
2948 | | | 2954 | |
| | | 2955 | #ifndef ARM_HAS_VBAR |
2949 | if (vector_page == ARM_VECTORS_HIGH) | | 2956 | if (vector_page == ARM_VECTORS_HIGH) |
2950 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 2957 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 2958 | #endif |
2951 | | | 2959 | |
2952 | /* Clear out the cache */ | | 2960 | /* Clear out the cache */ |
2953 | cpu_idcache_wbinv_all(); | | 2961 | cpu_idcache_wbinv_all(); |
2954 | | | 2962 | |
2955 | /* Now really make sure they are clean. */ | | 2963 | /* Now really make sure they are clean. */ |
2956 | __asm volatile ("mcr\tp15, 0, r0, c7, c7, 0" : : ); | | 2964 | __asm volatile ("mcr\tp15, 0, r0, c7, c7, 0" : : ); |
2957 | | | 2965 | |
2958 | /* Allow detection code to find the VFP if it's fitted. */ | | 2966 | /* Allow detection code to find the VFP if it's fitted. */ |
2959 | __asm volatile ("mcr\tp15, 0, %0, c1, c0, 2" : : "r" (0x0fffffff)); | | 2967 | __asm volatile ("mcr\tp15, 0, %0, c1, c0, 2" : : "r" (0x0fffffff)); |
2960 | | | 2968 | |
2961 | /* Set the control register */ | | 2969 | /* Set the control register */ |
2962 | curcpu()->ci_ctrl = cpu_control(cpuctrlmask, cpuctrl); | | 2970 | curcpu()->ci_ctrl = cpu_control(cpuctrlmask, cpuctrl); |
2963 | | | 2971 | |
| @@ -2975,28 +2983,30 @@ pj4bv7_setup(char *args) | | | @@ -2975,28 +2983,30 @@ pj4bv7_setup(char *args) |
2975 | pj4b_config(); | | 2983 | pj4b_config(); |
2976 | | | 2984 | |
2977 | cpuctrl = CPU_CONTROL_MMU_ENABLE; | | 2985 | cpuctrl = CPU_CONTROL_MMU_ENABLE; |
2978 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 2986 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
2979 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 2987 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
2980 | #endif | | 2988 | #endif |
2981 | cpuctrl |= CPU_CONTROL_DC_ENABLE; | | 2989 | cpuctrl |= CPU_CONTROL_DC_ENABLE; |
2982 | cpuctrl |= CPU_CONTROL_IC_ENABLE; | | 2990 | cpuctrl |= CPU_CONTROL_IC_ENABLE; |
2983 | cpuctrl |= (0xf << 3); | | 2991 | cpuctrl |= (0xf << 3); |
2984 | cpuctrl |= CPU_CONTROL_BPRD_ENABLE; | | 2992 | cpuctrl |= CPU_CONTROL_BPRD_ENABLE; |
2985 | cpuctrl |= (0x5 << 16) | (1 < 22); | | 2993 | cpuctrl |= (0x5 << 16) | (1 < 22); |
2986 | cpuctrl |= CPU_CONTROL_XP_ENABLE; | | 2994 | cpuctrl |= CPU_CONTROL_XP_ENABLE; |
2987 | | | 2995 | |
| | | 2996 | #ifndef ARM_HAS_VBAR |
2988 | if (vector_page == ARM_VECTORS_HIGH) | | 2997 | if (vector_page == ARM_VECTORS_HIGH) |
2989 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 2998 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 2999 | #endif |
2990 | | | 3000 | |
2991 | /* Clear out the cache */ | | 3001 | /* Clear out the cache */ |
2992 | cpu_idcache_wbinv_all(); | | 3002 | cpu_idcache_wbinv_all(); |
2993 | | | 3003 | |
2994 | /* Set the control register */ | | 3004 | /* Set the control register */ |
2995 | cpu_control(0xffffffff, cpuctrl); | | 3005 | cpu_control(0xffffffff, cpuctrl); |
2996 | | | 3006 | |
2997 | /* And again. */ | | 3007 | /* And again. */ |
2998 | cpu_idcache_wbinv_all(); | | 3008 | cpu_idcache_wbinv_all(); |
2999 | | | 3009 | |
3000 | curcpu()->ci_ctrl = cpuctrl; | | 3010 | curcpu()->ci_ctrl = cpuctrl; |
3001 | } | | 3011 | } |
3002 | #endif /* CPU_PJ4B */ | | 3012 | #endif /* CPU_PJ4B */ |
| @@ -3024,28 +3034,30 @@ armv7_setup(char *args) | | | @@ -3024,28 +3034,30 @@ armv7_setup(char *args) |
3024 | | CPU_CONTROL_BEND_ENABLE | CPU_CONTROL_AFLT_ENABLE | | 3034 | | CPU_CONTROL_BEND_ENABLE | CPU_CONTROL_AFLT_ENABLE |
3025 | | CPU_CONTROL_ROUNDROBIN | CPU_CONTROL_CPCLK; | | 3035 | | CPU_CONTROL_ROUNDROBIN | CPU_CONTROL_CPCLK; |
3026 | | | 3036 | |
3027 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 3037 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
3028 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 3038 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
3029 | #endif | | 3039 | #endif |
3030 | | | 3040 | |
3031 | cpuctrl = parse_cpu_options(args, armv7_options, cpuctrl); | | 3041 | cpuctrl = parse_cpu_options(args, armv7_options, cpuctrl); |
3032 | | | 3042 | |
3033 | #ifdef __ARMEB__ | | 3043 | #ifdef __ARMEB__ |
3034 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; | | 3044 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; |
3035 | #endif | | 3045 | #endif |
3036 | | | 3046 | |
| | | 3047 | #ifndef ARM_HAS_VBAR |
3037 | if (vector_page == ARM_VECTORS_HIGH) | | 3048 | if (vector_page == ARM_VECTORS_HIGH) |
3038 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 3049 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 3050 | #endif |
3039 | | | 3051 | |
3040 | /* Clear out the cache */ | | 3052 | /* Clear out the cache */ |
3041 | cpu_idcache_wbinv_all(); | | 3053 | cpu_idcache_wbinv_all(); |
3042 | | | 3054 | |
3043 | /* Set the control register */ | | 3055 | /* Set the control register */ |
3044 | curcpu()->ci_ctrl = cpuctrl; | | 3056 | curcpu()->ci_ctrl = cpuctrl; |
3045 | cpu_control(0xffffffff, cpuctrl); | | 3057 | cpu_control(0xffffffff, cpuctrl); |
3046 | } | | 3058 | } |
3047 | #endif /* CPU_CORTEX */ | | 3059 | #endif /* CPU_CORTEX */ |
3048 | | | 3060 | |
3049 | | | 3061 | |
3050 | #if defined(CPU_ARM1136) || defined(CPU_ARM1176) | | 3062 | #if defined(CPU_ARM1136) || defined(CPU_ARM1176) |
3051 | void | | 3063 | void |
| @@ -3081,28 +3093,30 @@ arm11x6_setup(char *args) | | | @@ -3081,28 +3093,30 @@ arm11x6_setup(char *args) |
3081 | (3 << 19) | | | 3093 | (3 << 19) | |
3082 | (1 << 17); | | 3094 | (1 << 17); |
3083 | | | 3095 | |
3084 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 3096 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
3085 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 3097 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
3086 | #endif | | 3098 | #endif |
3087 | | | 3099 | |
3088 | cpuctrl = parse_cpu_options(args, arm11_options, cpuctrl); | | 3100 | cpuctrl = parse_cpu_options(args, arm11_options, cpuctrl); |
3089 | | | 3101 | |
3090 | #ifdef __ARMEB__ | | 3102 | #ifdef __ARMEB__ |
3091 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; | | 3103 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; |
3092 | #endif | | 3104 | #endif |
3093 | | | 3105 | |
| | | 3106 | #ifndef ARM_HAS_VBAR |
3094 | if (vector_page == ARM_VECTORS_HIGH) | | 3107 | if (vector_page == ARM_VECTORS_HIGH) |
3095 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 3108 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 3109 | #endif |
3096 | | | 3110 | |
3097 | auxctrl = 0; | | 3111 | auxctrl = 0; |
3098 | auxctrl_wax = ~0; | | 3112 | auxctrl_wax = ~0; |
3099 | /* | | 3113 | /* |
3100 | * This options enables the workaround for the 364296 ARM1136 | | 3114 | * This options enables the workaround for the 364296 ARM1136 |
3101 | * r0pX errata (possible cache data corruption with | | 3115 | * r0pX errata (possible cache data corruption with |
3102 | * hit-under-miss enabled). It sets the undocumented bit 31 in | | 3116 | * hit-under-miss enabled). It sets the undocumented bit 31 in |
3103 | * the auxiliary control register and the FI bit in the control | | 3117 | * the auxiliary control register and the FI bit in the control |
3104 | * register, thus disabling hit-under-miss without putting the | | 3118 | * register, thus disabling hit-under-miss without putting the |
3105 | * processor into full low interrupt latency mode. ARM11MPCore | | 3119 | * processor into full low interrupt latency mode. ARM11MPCore |
3106 | * is not affected. | | 3120 | * is not affected. |
3107 | */ | | 3121 | */ |
3108 | if ((cpuid & CPU_ID_CPU_MASK) == CPU_ID_ARM1136JS) { /* ARM1136JSr0pX */ | | 3122 | if ((cpuid & CPU_ID_CPU_MASK) == CPU_ID_ARM1136JS) { /* ARM1136JSr0pX */ |
| @@ -3179,28 +3193,30 @@ sa110_setup(char *args) | | | @@ -3179,28 +3193,30 @@ sa110_setup(char *args) |
3179 | | CPU_CONTROL_LABT_ENABLE | CPU_CONTROL_BPRD_ENABLE | | 3193 | | CPU_CONTROL_LABT_ENABLE | CPU_CONTROL_BPRD_ENABLE |
3180 | | CPU_CONTROL_CPCLK; | | 3194 | | CPU_CONTROL_CPCLK; |
3181 | | | 3195 | |
3182 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 3196 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
3183 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 3197 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
3184 | #endif | | 3198 | #endif |
3185 | | | 3199 | |
3186 | cpuctrl = parse_cpu_options(args, sa110_options, cpuctrl); | | 3200 | cpuctrl = parse_cpu_options(args, sa110_options, cpuctrl); |
3187 | | | 3201 | |
3188 | #ifdef __ARMEB__ | | 3202 | #ifdef __ARMEB__ |
3189 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; | | 3203 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; |
3190 | #endif | | 3204 | #endif |
3191 | | | 3205 | |
| | | 3206 | #ifndef ARM_HAS_VBAR |
3192 | if (vector_page == ARM_VECTORS_HIGH) | | 3207 | if (vector_page == ARM_VECTORS_HIGH) |
3193 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 3208 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 3209 | #endif |
3194 | | | 3210 | |
3195 | /* Clear out the cache */ | | 3211 | /* Clear out the cache */ |
3196 | cpu_idcache_wbinv_all(); | | 3212 | cpu_idcache_wbinv_all(); |
3197 | | | 3213 | |
3198 | /* Set the control register */ | | 3214 | /* Set the control register */ |
3199 | curcpu()->ci_ctrl = cpuctrl; | | 3215 | curcpu()->ci_ctrl = cpuctrl; |
3200 | /* cpu_control(cpuctrlmask, cpuctrl);*/ | | 3216 | /* cpu_control(cpuctrlmask, cpuctrl);*/ |
3201 | cpu_control(0xffffffff, cpuctrl); | | 3217 | cpu_control(0xffffffff, cpuctrl); |
3202 | | | 3218 | |
3203 | /* | | 3219 | /* |
3204 | * enable clockswitching, note that this doesn't read or write to r0, | | 3220 | * enable clockswitching, note that this doesn't read or write to r0, |
3205 | * r0 is just to make it valid asm | | 3221 | * r0 is just to make it valid asm |
3206 | */ | | 3222 | */ |
| @@ -3242,28 +3258,30 @@ sa11x0_setup(char *args) | | | @@ -3242,28 +3258,30 @@ sa11x0_setup(char *args) |
3242 | | CPU_CONTROL_LABT_ENABLE | CPU_CONTROL_BPRD_ENABLE | | 3258 | | CPU_CONTROL_LABT_ENABLE | CPU_CONTROL_BPRD_ENABLE |
3243 | | CPU_CONTROL_CPCLK | CPU_CONTROL_VECRELOC; | | 3259 | | CPU_CONTROL_CPCLK | CPU_CONTROL_VECRELOC; |
3244 | | | 3260 | |
3245 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 3261 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
3246 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 3262 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
3247 | #endif | | 3263 | #endif |
3248 | | | 3264 | |
3249 | cpuctrl = parse_cpu_options(args, sa11x0_options, cpuctrl); | | 3265 | cpuctrl = parse_cpu_options(args, sa11x0_options, cpuctrl); |
3250 | | | 3266 | |
3251 | #ifdef __ARMEB__ | | 3267 | #ifdef __ARMEB__ |
3252 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; | | 3268 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; |
3253 | #endif | | 3269 | #endif |
3254 | | | 3270 | |
| | | 3271 | #ifndef ARM_HAS_VBAR |
3255 | if (vector_page == ARM_VECTORS_HIGH) | | 3272 | if (vector_page == ARM_VECTORS_HIGH) |
3256 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 3273 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 3274 | #endif |
3257 | | | 3275 | |
3258 | /* Clear out the cache */ | | 3276 | /* Clear out the cache */ |
3259 | cpu_idcache_wbinv_all(); | | 3277 | cpu_idcache_wbinv_all(); |
3260 | | | 3278 | |
3261 | /* Set the control register */ | | 3279 | /* Set the control register */ |
3262 | curcpu()->ci_ctrl = cpuctrl; | | 3280 | curcpu()->ci_ctrl = cpuctrl; |
3263 | cpu_control(0xffffffff, cpuctrl); | | 3281 | cpu_control(0xffffffff, cpuctrl); |
3264 | } | | 3282 | } |
3265 | #endif /* CPU_SA1100 || CPU_SA1110 */ | | 3283 | #endif /* CPU_SA1100 || CPU_SA1110 */ |
3266 | | | 3284 | |
3267 | #if defined(CPU_FA526) | | 3285 | #if defined(CPU_FA526) |
3268 | struct cpu_option fa526_options[] = { | | 3286 | struct cpu_option fa526_options[] = { |
3269 | #ifdef COMPAT_12 | | 3287 | #ifdef COMPAT_12 |
| @@ -3294,28 +3312,30 @@ fa526_setup(char *args) | | | @@ -3294,28 +3312,30 @@ fa526_setup(char *args) |
3294 | | CPU_CONTROL_LABT_ENABLE | CPU_CONTROL_BPRD_ENABLE | | 3312 | | CPU_CONTROL_LABT_ENABLE | CPU_CONTROL_BPRD_ENABLE |
3295 | | CPU_CONTROL_CPCLK | CPU_CONTROL_VECRELOC; | | 3313 | | CPU_CONTROL_CPCLK | CPU_CONTROL_VECRELOC; |
3296 | | | 3314 | |
3297 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 3315 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
3298 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 3316 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
3299 | #endif | | 3317 | #endif |
3300 | | | 3318 | |
3301 | cpuctrl = parse_cpu_options(args, fa526_options, cpuctrl); | | 3319 | cpuctrl = parse_cpu_options(args, fa526_options, cpuctrl); |
3302 | | | 3320 | |
3303 | #ifdef __ARMEB__ | | 3321 | #ifdef __ARMEB__ |
3304 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; | | 3322 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; |
3305 | #endif | | 3323 | #endif |
3306 | | | 3324 | |
| | | 3325 | #ifndef ARM_HAS_VBAR |
3307 | if (vector_page == ARM_VECTORS_HIGH) | | 3326 | if (vector_page == ARM_VECTORS_HIGH) |
3308 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 3327 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 3328 | #endif |
3309 | | | 3329 | |
3310 | /* Clear out the cache */ | | 3330 | /* Clear out the cache */ |
3311 | cpu_idcache_wbinv_all(); | | 3331 | cpu_idcache_wbinv_all(); |
3312 | | | 3332 | |
3313 | /* Set the control register */ | | 3333 | /* Set the control register */ |
3314 | curcpu()->ci_ctrl = cpuctrl; | | 3334 | curcpu()->ci_ctrl = cpuctrl; |
3315 | cpu_control(0xffffffff, cpuctrl); | | 3335 | cpu_control(0xffffffff, cpuctrl); |
3316 | } | | 3336 | } |
3317 | #endif /* CPU_FA526 */ | | 3337 | #endif /* CPU_FA526 */ |
3318 | | | 3338 | |
3319 | #if defined(CPU_IXP12X0) | | 3339 | #if defined(CPU_IXP12X0) |
3320 | struct cpu_option ixp12x0_options[] = { | | 3340 | struct cpu_option ixp12x0_options[] = { |
3321 | { "cpu.cache", BIC, OR, (CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE) }, | | 3341 | { "cpu.cache", BIC, OR, (CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE) }, |
| @@ -3345,28 +3365,30 @@ ixp12x0_setup(char *args) | | | @@ -3345,28 +3365,30 @@ ixp12x0_setup(char *args) |
3345 | | CPU_CONTROL_ROM_ENABLE | CPU_CONTROL_IC_ENABLE | | 3365 | | CPU_CONTROL_ROM_ENABLE | CPU_CONTROL_IC_ENABLE |
3346 | | CPU_CONTROL_VECRELOC; | | 3366 | | CPU_CONTROL_VECRELOC; |
3347 | | | 3367 | |
3348 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 3368 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
3349 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 3369 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
3350 | #endif | | 3370 | #endif |
3351 | | | 3371 | |
3352 | cpuctrl = parse_cpu_options(args, ixp12x0_options, cpuctrl); | | 3372 | cpuctrl = parse_cpu_options(args, ixp12x0_options, cpuctrl); |
3353 | | | 3373 | |
3354 | #ifdef __ARMEB__ | | 3374 | #ifdef __ARMEB__ |
3355 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; | | 3375 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; |
3356 | #endif | | 3376 | #endif |
3357 | | | 3377 | |
| | | 3378 | #ifndef ARM_HAS_VBAR |
3358 | if (vector_page == ARM_VECTORS_HIGH) | | 3379 | if (vector_page == ARM_VECTORS_HIGH) |
3359 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 3380 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 3381 | #endif |
3360 | | | 3382 | |
3361 | /* Clear out the cache */ | | 3383 | /* Clear out the cache */ |
3362 | cpu_idcache_wbinv_all(); | | 3384 | cpu_idcache_wbinv_all(); |
3363 | | | 3385 | |
3364 | /* Set the control register */ | | 3386 | /* Set the control register */ |
3365 | curcpu()->ci_ctrl = cpuctrl; | | 3387 | curcpu()->ci_ctrl = cpuctrl; |
3366 | /* cpu_control(0xffffffff, cpuctrl); */ | | 3388 | /* cpu_control(0xffffffff, cpuctrl); */ |
3367 | cpu_control(cpuctrlmask, cpuctrl); | | 3389 | cpu_control(cpuctrlmask, cpuctrl); |
3368 | } | | 3390 | } |
3369 | #endif /* CPU_IXP12X0 */ | | 3391 | #endif /* CPU_IXP12X0 */ |
3370 | | | 3392 | |
3371 | #if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ | | 3393 | #if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ |
3372 | defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || defined(CPU_CORTEX) | | 3394 | defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || defined(CPU_CORTEX) |
| @@ -3410,28 +3432,30 @@ xscale_setup(char *args) | | | @@ -3410,28 +3432,30 @@ xscale_setup(char *args) |
3410 | | CPU_CONTROL_LABT_ENABLE | CPU_CONTROL_BPRD_ENABLE | | 3432 | | CPU_CONTROL_LABT_ENABLE | CPU_CONTROL_BPRD_ENABLE |
3411 | | CPU_CONTROL_CPCLK | CPU_CONTROL_VECRELOC; | | 3433 | | CPU_CONTROL_CPCLK | CPU_CONTROL_VECRELOC; |
3412 | | | 3434 | |
3413 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS | | 3435 | #ifndef ARM32_DISABLE_ALIGNMENT_FAULTS |
3414 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; | | 3436 | cpuctrl |= CPU_CONTROL_AFLT_ENABLE; |
3415 | #endif | | 3437 | #endif |
3416 | | | 3438 | |
3417 | cpuctrl = parse_cpu_options(args, xscale_options, cpuctrl); | | 3439 | cpuctrl = parse_cpu_options(args, xscale_options, cpuctrl); |
3418 | | | 3440 | |
3419 | #ifdef __ARMEB__ | | 3441 | #ifdef __ARMEB__ |
3420 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; | | 3442 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; |
3421 | #endif | | 3443 | #endif |
3422 | | | 3444 | |
| | | 3445 | #ifndef ARM_HAS_VBAR |
3423 | if (vector_page == ARM_VECTORS_HIGH) | | 3446 | if (vector_page == ARM_VECTORS_HIGH) |
3424 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 3447 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 3448 | #endif |
3425 | | | 3449 | |
3426 | /* Clear out the cache */ | | 3450 | /* Clear out the cache */ |
3427 | cpu_idcache_wbinv_all(); | | 3451 | cpu_idcache_wbinv_all(); |
3428 | | | 3452 | |
3429 | /* | | 3453 | /* |
3430 | * Set the control register. Note that bits 6:3 must always | | 3454 | * Set the control register. Note that bits 6:3 must always |
3431 | * be set to 1. | | 3455 | * be set to 1. |
3432 | */ | | 3456 | */ |
3433 | curcpu()->ci_ctrl = cpuctrl; | | 3457 | curcpu()->ci_ctrl = cpuctrl; |
3434 | /* cpu_control(cpuctrlmask, cpuctrl);*/ | | 3458 | /* cpu_control(cpuctrlmask, cpuctrl);*/ |
3435 | cpu_control(0xffffffff, cpuctrl); | | 3459 | cpu_control(0xffffffff, cpuctrl); |
3436 | | | 3460 | |
3437 | /* Make sure write coalescing is turned on */ | | 3461 | /* Make sure write coalescing is turned on */ |
| @@ -3490,28 +3514,30 @@ sheeva_setup(char *args) | | | @@ -3490,28 +3514,30 @@ sheeva_setup(char *args) |
3490 | | | 3514 | |
3491 | __asm volatile("mcr p15, 1, %0, c15, c1, 0" | | 3515 | __asm volatile("mcr p15, 1, %0, c15, c1, 0" |
3492 | :: "r" (sheeva_ext)); | | 3516 | :: "r" (sheeva_ext)); |
3493 | | | 3517 | |
3494 | /* | | 3518 | /* |
3495 | * Sheeva has L2 Cache. Enable/Disable it here. | | 3519 | * Sheeva has L2 Cache. Enable/Disable it here. |
3496 | * Really not support yet... | | 3520 | * Really not support yet... |
3497 | */ | | 3521 | */ |
3498 | | | 3522 | |
3499 | #ifdef __ARMEB__ | | 3523 | #ifdef __ARMEB__ |
3500 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; | | 3524 | cpuctrl |= CPU_CONTROL_BEND_ENABLE; |
3501 | #endif | | 3525 | #endif |
3502 | | | 3526 | |
| | | 3527 | #ifndef ARM_HAS_VBAR |
3503 | if (vector_page == ARM_VECTORS_HIGH) | | 3528 | if (vector_page == ARM_VECTORS_HIGH) |
3504 | cpuctrl |= CPU_CONTROL_VECRELOC; | | 3529 | cpuctrl |= CPU_CONTROL_VECRELOC; |
| | | 3530 | #endif |
3505 | | | 3531 | |
3506 | /* Clear out the cache */ | | 3532 | /* Clear out the cache */ |
3507 | cpu_idcache_wbinv_all(); | | 3533 | cpu_idcache_wbinv_all(); |
3508 | | | 3534 | |
3509 | /* Now really make sure they are clean. */ | | 3535 | /* Now really make sure they are clean. */ |
3510 | __asm volatile ("mcr\tp15, 0, r0, c7, c7, 0" : : ); | | 3536 | __asm volatile ("mcr\tp15, 0, r0, c7, c7, 0" : : ); |
3511 | | | 3537 | |
3512 | /* Set the control register */ | | 3538 | /* Set the control register */ |
3513 | curcpu()->ci_ctrl = cpuctrl; | | 3539 | curcpu()->ci_ctrl = cpuctrl; |
3514 | cpu_control(0xffffffff, cpuctrl); | | 3540 | cpu_control(0xffffffff, cpuctrl); |
3515 | | | 3541 | |
3516 | /* And again. */ | | 3542 | /* And again. */ |
3517 | cpu_idcache_wbinv_all(); | | 3543 | cpu_idcache_wbinv_all(); |