machdep.c (259235) | machdep.c (262675) |
---|---|
1/*- 2 * Copyright (C) 1995, 1996 Wolfgang Solfrank. 3 * Copyright (C) 1995, 1996 TooLs GmbH. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 41 unchanged lines hidden (view full) --- 50 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 51 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 52 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 53 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 54 * $NetBSD: machdep.c,v 1.74.2.1 2000/11/01 16:13:48 tv Exp $ 55 */ 56 57#include <sys/cdefs.h> | 1/*- 2 * Copyright (C) 1995, 1996 Wolfgang Solfrank. 3 * Copyright (C) 1995, 1996 TooLs GmbH. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 41 unchanged lines hidden (view full) --- 50 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 51 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 52 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 53 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 54 * $NetBSD: machdep.c,v 1.74.2.1 2000/11/01 16:13:48 tv Exp $ 55 */ 56 57#include <sys/cdefs.h> |
58__FBSDID("$FreeBSD: stable/10/sys/powerpc/aim/machdep.c 259235 2013-12-11 22:36:20Z andreast $"); | 58__FBSDID("$FreeBSD: stable/10/sys/powerpc/aim/machdep.c 262675 2014-03-02 02:35:46Z jhibbits $"); |
59 60#include "opt_compat.h" 61#include "opt_ddb.h" 62#include "opt_kstack_pages.h" 63#include "opt_platform.h" 64 65#include <sys/param.h> 66#include <sys/proc.h> --- 70 unchanged lines hidden (view full) --- 137#ifdef __powerpc64__ 138extern int n_slbs; 139int cacheline_size = 128; 140#else 141int cacheline_size = 32; 142#endif 143int hw_direct_map = 1; 144 | 59 60#include "opt_compat.h" 61#include "opt_ddb.h" 62#include "opt_kstack_pages.h" 63#include "opt_platform.h" 64 65#include <sys/param.h> 66#include <sys/proc.h> --- 70 unchanged lines hidden (view full) --- 137#ifdef __powerpc64__ 138extern int n_slbs; 139int cacheline_size = 128; 140#else 141int cacheline_size = 32; 142#endif 143int hw_direct_map = 1; 144 |
145extern void *ap_pcpu; 146 |
|
145struct pcpu __pcpu[MAXCPU]; 146 147static struct trapframe frame0; 148 149char machine[] = "powerpc"; 150SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD, machine, 0, ""); 151 152static void cpu_startup(void *); --- 79 unchanged lines hidden (view full) --- 232#ifndef __powerpc64__ 233/* Bits for running on 64-bit systems in 32-bit mode. */ 234extern void *testppc64, *testppc64size; 235extern void *restorebridge, *restorebridgesize; 236extern void *rfid_patch, *rfi_patch1, *rfi_patch2; 237extern void *trapcode64; 238#endif 239 | 147struct pcpu __pcpu[MAXCPU]; 148 149static struct trapframe frame0; 150 151char machine[] = "powerpc"; 152SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD, machine, 0, ""); 153 154static void cpu_startup(void *); --- 79 unchanged lines hidden (view full) --- 234#ifndef __powerpc64__ 235/* Bits for running on 64-bit systems in 32-bit mode. */ 236extern void *testppc64, *testppc64size; 237extern void *restorebridge, *restorebridgesize; 238extern void *rfid_patch, *rfi_patch1, *rfi_patch2; 239extern void *trapcode64; 240#endif 241 |
240#ifdef SMP | |
241extern void *rstcode, *rstsize; | 242extern void *rstcode, *rstsize; |
242#endif | |
243extern void *trapcode, *trapsize; 244extern void *slbtrap, *slbtrapsize; 245extern void *alitrap, *alisize; 246extern void *dsitrap, *dsisize; 247extern void *decrint, *decrsize; 248extern void *extint, *extsize; 249extern void *dblow, *dbsize; 250extern void *imisstrap, *imisssize; --- 237 unchanged lines hidden (view full) --- 488 generictrap = &trapcode; 489 } 490 491 #else /* powerpc64 */ 492 cpu_features |= PPC_FEATURE_64; 493 generictrap = &trapcode; 494 #endif 495 | 243extern void *trapcode, *trapsize; 244extern void *slbtrap, *slbtrapsize; 245extern void *alitrap, *alisize; 246extern void *dsitrap, *dsisize; 247extern void *decrint, *decrsize; 248extern void *extint, *extsize; 249extern void *dblow, *dbsize; 250extern void *imisstrap, *imisssize; --- 237 unchanged lines hidden (view full) --- 488 generictrap = &trapcode; 489 } 490 491 #else /* powerpc64 */ 492 cpu_features |= PPC_FEATURE_64; 493 generictrap = &trapcode; 494 #endif 495 |
496#ifdef SMP | |
497 bcopy(&rstcode, (void *)(EXC_RST + trap_offset), (size_t)&rstsize); | 496 bcopy(&rstcode, (void *)(EXC_RST + trap_offset), (size_t)&rstsize); |
498#else 499 bcopy(generictrap, (void *)EXC_RST, (size_t)&trapsize); 500#endif | |
501 502#ifdef KDB 503 bcopy(&dblow, (void *)(EXC_MCHK + trap_offset), (size_t)&dbsize); 504 bcopy(&dblow, (void *)(EXC_PGM + trap_offset), (size_t)&dbsize); 505 bcopy(&dblow, (void *)(EXC_TRC + trap_offset), (size_t)&dbsize); 506 bcopy(&dblow, (void *)(EXC_BPT + trap_offset), (size_t)&dbsize); 507#else 508 bcopy(generictrap, (void *)EXC_MCHK, (size_t)&trapsize); --- 274 unchanged lines hidden (view full) --- 783 784uint64_t 785va_to_vsid(pmap_t pm, vm_offset_t va) 786{ 787 return ((pm->pm_sr[(uintptr_t)va >> ADDR_SR_SHFT]) & SR_VSID_MASK); 788} 789 790#endif | 497 498#ifdef KDB 499 bcopy(&dblow, (void *)(EXC_MCHK + trap_offset), (size_t)&dbsize); 500 bcopy(&dblow, (void *)(EXC_PGM + trap_offset), (size_t)&dbsize); 501 bcopy(&dblow, (void *)(EXC_TRC + trap_offset), (size_t)&dbsize); 502 bcopy(&dblow, (void *)(EXC_BPT + trap_offset), (size_t)&dbsize); 503#else 504 bcopy(generictrap, (void *)EXC_MCHK, (size_t)&trapsize); --- 274 unchanged lines hidden (view full) --- 779 780uint64_t 781va_to_vsid(pmap_t pm, vm_offset_t va) 782{ 783 return ((pm->pm_sr[(uintptr_t)va >> ADDR_SR_SHFT]) & SR_VSID_MASK); 784} 785 786#endif |
787 788/* From p3-53 of the MPC7450 RISC Microprocessor Family Reference Manual */ 789void 790flush_disable_caches(void) 791{ 792 register_t msr; 793 register_t msscr0; 794 register_t cache_reg; 795 volatile uint32_t *memp; 796 uint32_t temp; 797 int i; 798 int x; 799 800 msr = mfmsr(); 801 powerpc_sync(); 802 mtmsr(msr & ~(PSL_EE | PSL_DR)); 803 msscr0 = mfspr(SPR_MSSCR0); 804 msscr0 &= ~MSSCR0_L2PFE; 805 mtspr(SPR_MSSCR0, msscr0); 806 powerpc_sync(); 807 isync(); 808 __asm__ __volatile__("dssall; sync"); 809 powerpc_sync(); 810 isync(); 811 __asm__ __volatile__("dcbf 0,%0" :: "r"(0)); 812 __asm__ __volatile__("dcbf 0,%0" :: "r"(0)); 813 __asm__ __volatile__("dcbf 0,%0" :: "r"(0)); 814 815 /* Lock the L1 Data cache. */ 816 mtspr(SPR_LDSTCR, mfspr(SPR_LDSTCR) | 0xFF); 817 powerpc_sync(); 818 isync(); 819 820 mtspr(SPR_LDSTCR, 0); 821 822 /* 823 * Perform this in two stages: Flush the cache starting in RAM, then do it 824 * from ROM. 825 */ 826 memp = (volatile uint32_t *)0x00000000; 827 for (i = 0; i < 128 * 1024; i++) { 828 temp = *memp; 829 __asm__ __volatile__("dcbf 0,%0" :: "r"(memp)); 830 memp += 32/sizeof(*memp); 831 } 832 833 memp = (volatile uint32_t *)0xfff00000; 834 x = 0xfe; 835 836 for (; x != 0xff;) { 837 mtspr(SPR_LDSTCR, x); 838 for (i = 0; i < 128; i++) { 839 temp = *memp; 840 __asm__ __volatile__("dcbf 0,%0" :: "r"(memp)); 841 memp += 32/sizeof(*memp); 842 } 843 x = ((x << 1) | 1) & 0xff; 844 } 845 mtspr(SPR_LDSTCR, 0); 846 847 cache_reg = mfspr(SPR_L2CR); 848 if (cache_reg & L2CR_L2E) { 849 cache_reg &= ~(L2CR_L2IO_7450 | L2CR_L2DO_7450); 850 mtspr(SPR_L2CR, cache_reg); 851 powerpc_sync(); 852 mtspr(SPR_L2CR, cache_reg | L2CR_L2HWF); 853 while (mfspr(SPR_L2CR) & L2CR_L2HWF) 854 ; /* Busy wait for cache to flush */ 855 powerpc_sync(); 856 cache_reg &= ~L2CR_L2E; 857 mtspr(SPR_L2CR, cache_reg); 858 powerpc_sync(); 859 mtspr(SPR_L2CR, cache_reg | L2CR_L2I); 860 powerpc_sync(); 861 while (mfspr(SPR_L2CR) & L2CR_L2I) 862 ; /* Busy wait for L2 cache invalidate */ 863 powerpc_sync(); 864 } 865 866 cache_reg = mfspr(SPR_L3CR); 867 if (cache_reg & L3CR_L3E) { 868 cache_reg &= ~(L3CR_L3IO | L3CR_L3DO); 869 mtspr(SPR_L3CR, cache_reg); 870 powerpc_sync(); 871 mtspr(SPR_L3CR, cache_reg | L3CR_L3HWF); 872 while (mfspr(SPR_L3CR) & L3CR_L3HWF) 873 ; /* Busy wait for cache to flush */ 874 powerpc_sync(); 875 cache_reg &= ~L3CR_L3E; 876 mtspr(SPR_L3CR, cache_reg); 877 powerpc_sync(); 878 mtspr(SPR_L3CR, cache_reg | L3CR_L3I); 879 powerpc_sync(); 880 while (mfspr(SPR_L3CR) & L3CR_L3I) 881 ; /* Busy wait for L3 cache invalidate */ 882 powerpc_sync(); 883 } 884 885 mtspr(SPR_HID0, mfspr(SPR_HID0) & ~HID0_DCE); 886 powerpc_sync(); 887 isync(); 888 889 mtmsr(msr); 890} 891 892void 893cpu_sleep() 894{ 895 static u_quad_t timebase = 0; 896 static register_t sprgs[4]; 897 static register_t srrs[2]; 898 899 jmp_buf resetjb; 900 struct thread *fputd; 901 struct thread *vectd; 902 register_t hid0; 903 register_t msr; 904 register_t saved_msr; 905 906 ap_pcpu = pcpup; 907 908 PCPU_SET(restore, &resetjb); 909 910 saved_msr = mfmsr(); 911 fputd = PCPU_GET(fputhread); 912 vectd = PCPU_GET(vecthread); 913 if (fputd != NULL) 914 save_fpu(fputd); 915 if (vectd != NULL) 916 save_vec(vectd); 917 if (setjmp(resetjb) == 0) { 918 sprgs[0] = mfspr(SPR_SPRG0); 919 sprgs[1] = mfspr(SPR_SPRG1); 920 sprgs[2] = mfspr(SPR_SPRG2); 921 sprgs[3] = mfspr(SPR_SPRG3); 922 srrs[0] = mfspr(SPR_SRR0); 923 srrs[1] = mfspr(SPR_SRR1); 924 timebase = mftb(); 925 powerpc_sync(); 926 flush_disable_caches(); 927 hid0 = mfspr(SPR_HID0); 928 hid0 = (hid0 & ~(HID0_DOZE | HID0_NAP)) | HID0_SLEEP; 929 powerpc_sync(); 930 isync(); 931 msr = mfmsr() | PSL_POW; 932 mtspr(SPR_HID0, hid0); 933 powerpc_sync(); 934 935 while (1) 936 mtmsr(msr); 937 } 938 mttb(timebase); 939 PCPU_SET(curthread, curthread); 940 PCPU_SET(curpcb, curthread->td_pcb); 941 pmap_activate(curthread); 942 powerpc_sync(); 943 mtspr(SPR_SPRG0, sprgs[0]); 944 mtspr(SPR_SPRG1, sprgs[1]); 945 mtspr(SPR_SPRG2, sprgs[2]); 946 mtspr(SPR_SPRG3, sprgs[3]); 947 mtspr(SPR_SRR0, srrs[0]); 948 mtspr(SPR_SRR1, srrs[1]); 949 mtmsr(saved_msr); 950 if (fputd == curthread) 951 enable_fpu(curthread); 952 if (vectd == curthread) 953 enable_vec(curthread); 954 powerpc_sync(); 955} |
|