aim_machdep.c (258696) | aim_machdep.c (261309) |
---|---|
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: head/sys/powerpc/aim/machdep.c 258696 2013-11-27 22:01:09Z nwhitehorn $"); | 58__FBSDID("$FreeBSD: head/sys/powerpc/aim/machdep.c 261309 2014-01-31 03:55:34Z 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 *); --- 77 unchanged lines hidden (view full) --- 230#ifndef __powerpc64__ 231/* Bits for running on 64-bit systems in 32-bit mode. */ 232extern void *testppc64, *testppc64size; 233extern void *restorebridge, *restorebridgesize; 234extern void *rfid_patch, *rfi_patch1, *rfi_patch2; 235extern void *trapcode64; 236#endif 237 | 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 *); --- 77 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 |
238#ifdef SMP | |
239extern void *rstcode, *rstsize; | 240extern void *rstcode, *rstsize; |
240#endif | |
241extern void *trapcode, *trapsize; 242extern void *slbtrap, *slbtrapsize; 243extern void *alitrap, *alisize; 244extern void *dsitrap, *dsisize; 245extern void *decrint, *decrsize; 246extern void *extint, *extsize; 247extern void *dblow, *dbsize; 248extern void *imisstrap, *imisssize; --- 237 unchanged lines hidden (view full) --- 486 generictrap = &trapcode; 487 } 488 489 #else /* powerpc64 */ 490 cpu_features |= PPC_FEATURE_64; 491 generictrap = &trapcode; 492 #endif 493 | 241extern void *trapcode, *trapsize; 242extern void *slbtrap, *slbtrapsize; 243extern void *alitrap, *alisize; 244extern void *dsitrap, *dsisize; 245extern void *decrint, *decrsize; 246extern void *extint, *extsize; 247extern void *dblow, *dbsize; 248extern void *imisstrap, *imisssize; --- 237 unchanged lines hidden (view full) --- 486 generictrap = &trapcode; 487 } 488 489 #else /* powerpc64 */ 490 cpu_features |= PPC_FEATURE_64; 491 generictrap = &trapcode; 492 #endif 493 |
494#ifdef SMP | |
495 bcopy(&rstcode, (void *)(EXC_RST + trap_offset), (size_t)&rstsize); | 494 bcopy(&rstcode, (void *)(EXC_RST + trap_offset), (size_t)&rstsize); |
496#else 497 bcopy(generictrap, (void *)EXC_RST, (size_t)&trapsize); 498#endif | |
499 500#ifdef KDB 501 bcopy(&dblow, (void *)(EXC_MCHK + trap_offset), (size_t)&dbsize); 502 bcopy(&dblow, (void *)(EXC_PGM + trap_offset), (size_t)&dbsize); 503 bcopy(&dblow, (void *)(EXC_TRC + trap_offset), (size_t)&dbsize); 504 bcopy(&dblow, (void *)(EXC_BPT + trap_offset), (size_t)&dbsize); 505#else 506 bcopy(generictrap, (void *)EXC_MCHK, (size_t)&trapsize); --- 274 unchanged lines hidden (view full) --- 781 782vm_offset_t 783pmap_early_io_map(vm_paddr_t pa, vm_size_t size) 784{ 785 786 return (pa); 787} 788 | 495 496#ifdef KDB 497 bcopy(&dblow, (void *)(EXC_MCHK + trap_offset), (size_t)&dbsize); 498 bcopy(&dblow, (void *)(EXC_PGM + trap_offset), (size_t)&dbsize); 499 bcopy(&dblow, (void *)(EXC_TRC + trap_offset), (size_t)&dbsize); 500 bcopy(&dblow, (void *)(EXC_BPT + trap_offset), (size_t)&dbsize); 501#else 502 bcopy(generictrap, (void *)EXC_MCHK, (size_t)&trapsize); --- 274 unchanged lines hidden (view full) --- 777 778vm_offset_t 779pmap_early_io_map(vm_paddr_t pa, vm_size_t size) 780{ 781 782 return (pa); 783} 784 |
785/* From p3-53 of the MPC7450 RISC Microprocessor Family Reference Manual */ 786void 787flush_disable_caches(void) 788{ 789 register_t msr; 790 register_t msscr0; 791 register_t cache_reg; 792 volatile uint32_t *memp; 793 uint32_t temp; 794 int i; 795 int x; 796 797 msr = mfmsr(); 798 powerpc_sync(); 799 mtmsr(msr & ~(PSL_EE | PSL_DR)); 800 msscr0 = mfspr(SPR_MSSCR0); 801 msscr0 &= ~MSSCR0_L2PFE; 802 mtspr(SPR_MSSCR0, msscr0); 803 powerpc_sync(); 804 isync(); 805 __asm__ __volatile__("dssall; sync"); 806 powerpc_sync(); 807 isync(); 808 __asm__ __volatile__("dcbf 0,%0" :: "r"(0)); 809 __asm__ __volatile__("dcbf 0,%0" :: "r"(0)); 810 __asm__ __volatile__("dcbf 0,%0" :: "r"(0)); 811 812 /* Lock the L1 Data cache. */ 813 mtspr(SPR_LDSTCR, mfspr(SPR_LDSTCR) | 0xFF); 814 powerpc_sync(); 815 isync(); 816 817 mtspr(SPR_LDSTCR, 0); 818 819 /* 820 * Perform this in two stages: Flush the cache starting in RAM, then do it 821 * from ROM. 822 */ 823 memp = (volatile uint32_t *)0x00000000; 824 for (i = 0; i < 128 * 1024; i++) { 825 temp = *memp; 826 __asm__ __volatile__("dcbf 0,%0" :: "r"(memp)); 827 memp += 32/sizeof(*memp); 828 } 829 830 memp = (volatile uint32_t *)0xfff00000; 831 x = 0xfe; 832 833 for (; x != 0xff;) { 834 mtspr(SPR_LDSTCR, x); 835 for (i = 0; i < 128; i++) { 836 temp = *memp; 837 __asm__ __volatile__("dcbf 0,%0" :: "r"(memp)); 838 memp += 32/sizeof(*memp); 839 } 840 x = ((x << 1) | 1) & 0xff; 841 } 842 mtspr(SPR_LDSTCR, 0); 843 844 cache_reg = mfspr(SPR_L2CR); 845 if (cache_reg & L2CR_L2E) { 846 cache_reg &= ~(L2CR_L2IO_7450 | L2CR_L2DO_7450); 847 mtspr(SPR_L2CR, cache_reg); 848 powerpc_sync(); 849 mtspr(SPR_L2CR, cache_reg | L2CR_L2HWF); 850 while (mfspr(SPR_L2CR) & L2CR_L2HWF) 851 ; /* Busy wait for cache to flush */ 852 powerpc_sync(); 853 cache_reg &= ~L2CR_L2E; 854 mtspr(SPR_L2CR, cache_reg); 855 powerpc_sync(); 856 mtspr(SPR_L2CR, cache_reg | L2CR_L2I); 857 powerpc_sync(); 858 while (mfspr(SPR_L2CR) & L2CR_L2I) 859 ; /* Busy wait for L2 cache invalidate */ 860 powerpc_sync(); 861 } 862 863 cache_reg = mfspr(SPR_L3CR); 864 if (cache_reg & L3CR_L3E) { 865 cache_reg &= ~(L3CR_L3IO | L3CR_L3DO); 866 mtspr(SPR_L3CR, cache_reg); 867 powerpc_sync(); 868 mtspr(SPR_L3CR, cache_reg | L3CR_L3HWF); 869 while (mfspr(SPR_L3CR) & L3CR_L3HWF) 870 ; /* Busy wait for cache to flush */ 871 powerpc_sync(); 872 cache_reg &= ~L3CR_L3E; 873 mtspr(SPR_L3CR, cache_reg); 874 powerpc_sync(); 875 mtspr(SPR_L3CR, cache_reg | L3CR_L3I); 876 powerpc_sync(); 877 while (mfspr(SPR_L3CR) & L3CR_L3I) 878 ; /* Busy wait for L3 cache invalidate */ 879 powerpc_sync(); 880 } 881 882 mtspr(SPR_HID0, mfspr(SPR_HID0) & ~HID0_DCE); 883 powerpc_sync(); 884 isync(); 885 886 mtmsr(msr); 887} 888 889void 890cpu_sleep() 891{ 892 static u_quad_t timebase = 0; 893 static register_t sprgs[4]; 894 static register_t srrs[2]; 895 896 jmp_buf resetjb; 897 struct thread *fputd; 898 struct thread *vectd; 899 register_t hid0; 900 register_t msr; 901 register_t saved_msr; 902 903 ap_pcpu = pcpup; 904 905 PCPU_SET(restore, &resetjb); 906 907 saved_msr = mfmsr(); 908 fputd = PCPU_GET(fputhread); 909 vectd = PCPU_GET(vecthread); 910 if (fputd != NULL) 911 save_fpu(fputd); 912 if (vectd != NULL) 913 save_vec(vectd); 914 if (setjmp(resetjb) == 0) { 915 sprgs[0] = mfspr(SPR_SPRG0); 916 sprgs[1] = mfspr(SPR_SPRG1); 917 sprgs[2] = mfspr(SPR_SPRG2); 918 sprgs[3] = mfspr(SPR_SPRG3); 919 srrs[0] = mfspr(SPR_SRR0); 920 srrs[1] = mfspr(SPR_SRR1); 921 timebase = mftb(); 922 powerpc_sync(); 923 flush_disable_caches(); 924 hid0 = mfspr(SPR_HID0); 925 hid0 = (hid0 & ~(HID0_DOZE | HID0_NAP)) | HID0_SLEEP; 926 powerpc_sync(); 927 isync(); 928 msr = mfmsr() | PSL_POW; 929 mtspr(SPR_HID0, hid0); 930 powerpc_sync(); 931 932 while (1) 933 mtmsr(msr); 934 } 935 mttb(timebase); 936 PCPU_SET(curthread, curthread); 937 PCPU_SET(curpcb, curthread->td_pcb); 938 pmap_activate(curthread); 939 powerpc_sync(); 940 mtspr(SPR_SPRG0, sprgs[0]); 941 mtspr(SPR_SPRG1, sprgs[1]); 942 mtspr(SPR_SPRG2, sprgs[2]); 943 mtspr(SPR_SPRG3, sprgs[3]); 944 mtspr(SPR_SRR0, srrs[0]); 945 mtspr(SPR_SRR1, srrs[1]); 946 mtmsr(saved_msr); 947 if (fputd == curthread) 948 enable_fpu(curthread); 949 if (vectd == curthread) 950 enable_vec(curthread); 951 powerpc_sync(); 952} |
|