[BACK]Return to cpu.h CVS log [TXT][DIR] Up to [local] / sys / arch / powerpc / include

Annotation of sys/arch/powerpc/include/cpu.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: cpu.h,v 1.31 2007/03/23 21:06:05 miod Exp $   */
                      2: /*     $NetBSD: cpu.h,v 1.1 1996/09/30 16:34:21 ws Exp $       */
                      3:
                      4: /*
                      5:  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
                      6:  * Copyright (C) 1995, 1996 TooLs GmbH.
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  * 3. All advertising materials mentioning features or use of this software
                     18:  *    must display the following acknowledgement:
                     19:  *     This product includes software developed by TooLs GmbH.
                     20:  * 4. The name of TooLs GmbH may not be used to endorse or promote products
                     21:  *    derived from this software without specific prior written permission.
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
                     24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     25:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     26:  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
                     27:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
                     28:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
                     29:  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
                     30:  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
                     31:  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
                     32:  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     33:  */
                     34: #ifndef        _POWERPC_CPU_H_
                     35: #define        _POWERPC_CPU_H_
                     36:
                     37: #include <machine/frame.h>
                     38:
                     39: #include <sys/device.h>
                     40: #include <sys/lock.h>
                     41: #include <sys/sched.h>
                     42:
                     43: struct cpu_info {
                     44:        struct device *ci_dev;          /* our device */
                     45:        struct schedstate_percpu ci_schedstate; /* scheduler state */
                     46:
                     47:        struct proc *ci_curproc;
                     48:
                     49:        struct pcb *ci_curpcb;
                     50:        struct pmap *ci_curpm;
                     51:        struct proc *ci_fpuproc;
                     52:        struct proc *ci_vecproc;
                     53:        struct pcb *ci_idle_pcb;        /* PA of our idle pcb */
                     54:        int ci_cpuid;
                     55:
                     56:        volatile int ci_astpending;
                     57:        volatile int ci_want_resched;
                     58:        volatile int ci_cpl;
                     59:        volatile int ci_iactive;
                     60:        volatile int ci_ipending;
                     61:        int ci_intrdepth;
                     62:        char *ci_intstk;
                     63: #define CPUSAVE_LEN    8
                     64:        register_t ci_tempsave[CPUSAVE_LEN];
                     65:        register_t ci_ddbsave[CPUSAVE_LEN];
                     66: #define DISISAVE_LEN   4
                     67:        register_t ci_disisave[DISISAVE_LEN];
                     68: };
                     69:
                     70: static __inline struct cpu_info *
                     71: curcpu(void)
                     72: {
                     73:        struct cpu_info *ci;
                     74:
                     75:        __asm volatile ("mfsprg %0,0" : "=r"(ci));
                     76:        return ci;
                     77: }
                     78:
                     79: #define        curpcb                  (curcpu()->ci_curpcb)
                     80: #define        curpm                   (curcpu()->ci_curpm)
                     81:
                     82: #define CPU_INFO_UNIT(ci)      ((ci)->ci_dev->dv_unit)
                     83:
                     84: #ifdef MULTIPROCESSOR
                     85:
                     86: #define PPC_MAXPROCS           4
                     87:
                     88: static __inline int
                     89: cpu_number(void)
                     90: {
                     91:        int pir;
                     92:
                     93:        __asm ("mfspr %0,1023" : "=r"(pir));
                     94:        return pir;
                     95: }
                     96:
                     97: void   cpu_boot_secondary_processors(void);
                     98:
                     99: #define CPU_IS_PRIMARY(ci)     ((ci)->ci_cpuid == 0)
                    100: #define CPU_INFO_ITERATOR              int
                    101: #define CPU_INFO_FOREACH(cii, ci)                                      \
                    102:        for (cii = 0, ci = &cpu_info[0]; cii < PPC_MAXPROCS; cii++, ci++)
                    103:
                    104: #else
                    105:
                    106: #define PPC_MAXPROCS           1
                    107:
                    108: #define cpu_number()           0
                    109:
                    110: #define CPU_IS_PRIMARY(ci)     1
                    111: #define CPU_INFO_ITERATOR              int
                    112: #define CPU_INFO_FOREACH(cii, ci)                                      \
                    113:        for (cii = 0, ci = curcpu(); ci != NULL; ci = NULL)
                    114:
                    115: #endif
                    116:
                    117: extern struct cpu_info cpu_info[PPC_MAXPROCS];
                    118:
                    119: #define        CLKF_USERMODE(frame)    (((frame)->srr1 & PSL_PR) != 0)
                    120: #define        CLKF_PC(frame)          ((frame)->srr0)
                    121: #define        CLKF_INTR(frame)        ((frame)->depth != 0)
                    122:
                    123: /*
                    124:  * This is used during profiling to integrate system time.
                    125:  */
                    126: #define        PROC_PC(p)              (trapframe(p)->srr0)
                    127:
                    128: #define        cpu_wait(p)             do { /* nothing */ } while (0)
                    129:
                    130: void   delay(unsigned);
                    131: #define        DELAY(n)                delay(n)
                    132:
                    133: #define        need_resched(ci)        (ci->ci_want_resched = 1, ci->ci_astpending = 1)
                    134: #define        need_proftick(p)        do { curcpu()->ci_astpending = 1; } while (0)
                    135: #define        signotify(p)            (curcpu()->ci_astpending = 1)
                    136:
                    137: extern char *bootpath;
                    138:
                    139: #ifndef        CACHELINESIZE
                    140: #define        CACHELINESIZE   32                      /* For now              XXX */
                    141: #endif
                    142:
                    143: static __inline void
                    144: syncicache(void *from, int len)
                    145: {
                    146:        int l;
                    147:        char *p = from;
                    148:
                    149:        len = len + (((u_int32_t) from) & (CACHELINESIZE - 1));
                    150:        l = len;
                    151:
                    152:        do {
                    153:                __asm __volatile ("dcbst 0,%0" :: "r"(p));
                    154:                p += CACHELINESIZE;
                    155:        } while ((l -= CACHELINESIZE) > 0);
                    156:        __asm __volatile ("sync");
                    157:        p = from;
                    158:        l = len;
                    159:        do {
                    160:                __asm __volatile ("icbi 0,%0" :: "r"(p));
                    161:                p += CACHELINESIZE;
                    162:        } while ((l -= CACHELINESIZE) > 0);
                    163:        __asm __volatile ("isync");
                    164: }
                    165:
                    166: static __inline void
                    167: invdcache(void *from, int len)
                    168: {
                    169:        int l;
                    170:        char *p = from;
                    171:
                    172:        len = len + (((u_int32_t) from) & (CACHELINESIZE - 1));
                    173:        l = len;
                    174:
                    175:        do {
                    176:                __asm __volatile ("dcbi 0,%0" :: "r"(p));
                    177:                p += CACHELINESIZE;
                    178:        } while ((l -= CACHELINESIZE) > 0);
                    179:        __asm __volatile ("sync");
                    180: }
                    181:
                    182: #define FUNC_SPR(n, name) \
                    183: static __inline u_int32_t ppc_mf ## name (void)                        \
                    184: {                                                              \
                    185:        u_int32_t ret;                                          \
                    186:        __asm __volatile ("mfspr %0," # n : "=r" (ret));        \
                    187:        return ret;                                             \
                    188: }                                                              \
                    189: static __inline void ppc_mt ## name (u_int32_t val)            \
                    190: {                                                              \
                    191:        __asm __volatile ("mtspr "# n ",%0" :: "r" (val));      \
                    192: }                                                              \
                    193:
                    194: FUNC_SPR(0, mq)
                    195: FUNC_SPR(1, xer)
                    196: FUNC_SPR(4, rtcu)
                    197: FUNC_SPR(5, rtcl)
                    198: FUNC_SPR(8, lr)
                    199: FUNC_SPR(9, ctr)
                    200: FUNC_SPR(18, dsisr)
                    201: FUNC_SPR(19, dar)
                    202: FUNC_SPR(22, dec)
                    203: FUNC_SPR(25, sdr1)
                    204: FUNC_SPR(26, srr0)
                    205: FUNC_SPR(27, srr1)
                    206: FUNC_SPR(256, vrsave)
                    207: FUNC_SPR(272, sprg0)
                    208: FUNC_SPR(273, sprg1)
                    209: FUNC_SPR(274, sprg2)
                    210: FUNC_SPR(275, sprg3)
                    211: FUNC_SPR(280, asr)
                    212: FUNC_SPR(282, ear)
                    213: FUNC_SPR(287, pvr)
                    214: FUNC_SPR(528, ibat0u)
                    215: FUNC_SPR(529, ibat0l)
                    216: FUNC_SPR(530, ibat1u)
                    217: FUNC_SPR(531, ibat1l)
                    218: FUNC_SPR(532, ibat2u)
                    219: FUNC_SPR(533, ibat2l)
                    220: FUNC_SPR(534, ibat3u)
                    221: FUNC_SPR(535, ibat3l)
                    222: FUNC_SPR(536, dbat0u)
                    223: FUNC_SPR(537, dbat0l)
                    224: FUNC_SPR(538, dbat1u)
                    225: FUNC_SPR(539, dbat1l)
                    226: FUNC_SPR(540, dbat2u)
                    227: FUNC_SPR(541, dbat2l)
                    228: FUNC_SPR(542, dbat3u)
                    229: FUNC_SPR(543, dbat3l)
                    230: FUNC_SPR(1008, hid0)
                    231: FUNC_SPR(1009, hid1)
                    232: FUNC_SPR(1010, iabr)
                    233: FUNC_SPR(1017, l2cr)
                    234: FUNC_SPR(1018, l3cr)
                    235: FUNC_SPR(1013, dabr)
                    236: FUNC_SPR(1023, pir)
                    237:
                    238: static __inline u_int32_t
                    239: ppc_mftbl (void)
                    240: {
                    241:        int ret;
                    242:        __asm __volatile ("mftb %0" : "=r" (ret));
                    243:        return ret;
                    244: }
                    245:
                    246: static __inline u_int64_t
                    247: ppc_mftb(void)
                    248: {
                    249:        u_long scratch;
                    250:        u_int64_t tb;
                    251:
                    252:        __asm __volatile ("1: mftbu %0; mftb %0+1; mftbu %1;"
                    253:            " cmpw 0,%0,%1; bne 1b" : "=r"(tb), "=r"(scratch));
                    254:        return tb;
                    255: }
                    256:
                    257: static __inline u_int32_t
                    258: ppc_mfmsr (void)
                    259: {
                    260:        int ret;
                    261:         __asm __volatile ("mfmsr %0" : "=r" (ret));
                    262:        return ret;
                    263: }
                    264:
                    265: static __inline void
                    266: ppc_mtmsr (u_int32_t val)
                    267: {
                    268:         __asm __volatile ("mtmsr %0" :: "r" (val));
                    269: }
                    270:
                    271: static __inline void
                    272: ppc_mtsrin(u_int32_t val, u_int32_t sn_shifted)
                    273: {
                    274:        __asm __volatile ("mtsrin %0,%1" :: "r"(val), "r"(sn_shifted));
                    275: }
                    276:
                    277: u_int64_t ppc64_mfscomc(void);
                    278: void ppc_mtscomc(u_int32_t);
                    279: void ppc64_mtscomc(u_int64_t);
                    280: u_int64_t ppc64_mfscomd(void);
                    281: void ppc_mtscomd(u_int32_t);
                    282:
                    283: #include <machine/psl.h>
                    284:
                    285: /*
                    286:  * General functions to enable and disable interrupts
                    287:  * without having inlined assembly code in many functions.
                    288:  */
                    289: static __inline void
                    290: ppc_intr_enable(int enable)
                    291: {
                    292:        u_int32_t msr;
                    293:        if (enable != 0) {
                    294:                msr = ppc_mfmsr();
                    295:                msr |= PSL_EE;
                    296:                ppc_mtmsr(msr);
                    297:        }
                    298: }
                    299:
                    300: static __inline int
                    301: ppc_intr_disable(void)
                    302: {
                    303:        u_int32_t emsr, dmsr;
                    304:        emsr = ppc_mfmsr();
                    305:        dmsr = emsr & ~PSL_EE;
                    306:        ppc_mtmsr(dmsr);
                    307:        return (emsr & PSL_EE);
                    308: }
                    309:
                    310: int ppc_cpuspeed(int *);
                    311: void ppc_check_procid(void);
                    312: extern int ppc_proc_is_64b;
                    313:
                    314: /*
                    315:  * PowerPC CPU types
                    316:  */
                    317: #define        PPC_CPU_MPC601          1
                    318: #define        PPC_CPU_MPC603          3
                    319: #define        PPC_CPU_MPC604          4
                    320: #define        PPC_CPU_MPC603e         6
                    321: #define        PPC_CPU_MPC603ev        7
                    322: #define        PPC_CPU_MPC750          8
                    323: #define        PPC_CPU_MPC604ev        9
                    324: #define        PPC_CPU_MPC7400         12
                    325: #define        PPC_CPU_IBM970FX        0x003c
                    326: #define        PPC_CPU_IBM970MP        0x0044
                    327: #define        PPC_CPU_IBM750FX        0x7000
                    328: #define        PPC_CPU_MPC7410         0x800c
                    329: #define        PPC_CPU_MPC7447A        0x8003
                    330: #define        PPC_CPU_MPC7448         0x8004
                    331: #define        PPC_CPU_MPC7450         0x8000
                    332: #define        PPC_CPU_MPC7455         0x8001
                    333: #define        PPC_CPU_MPC7457         0x8002
                    334:
                    335: /*
                    336:  * This needs to be included late since it relies on definitions higher
                    337:  * up in this file.
                    338:  */
                    339: #if defined(MULTIPROCESSOR) && defined(_KERNEL)
                    340: #include <sys/mplock.h>
                    341: #endif
                    342:
                    343: #endif /* _POWERPC_CPU_H_ */

CVSweb