[BACK]Return to cache.h CVS log [TXT][DIR] Up to [local] / sys / arch / sparc / sparc

Annotation of sys/arch/sparc/sparc/cache.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: cache.h,v 1.10 2007/01/22 19:39:33 miod Exp $ */
        !             2: /*     $NetBSD: cache.h,v 1.16 1997/07/06 21:15:14 pk Exp $ */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1996
        !             6:  *     The President and Fellows of Harvard College. All rights reserved.
        !             7:  * Copyright (c) 1992, 1993
        !             8:  *     The Regents of the University of California.  All rights reserved.
        !             9:  *
        !            10:  * This software was developed by the Computer Systems Engineering group
        !            11:  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
        !            12:  * contributed to Berkeley.
        !            13:  *
        !            14:  * Redistribution and use in source and binary forms, with or without
        !            15:  * modification, are permitted provided that the following conditions
        !            16:  * are met:
        !            17:  * 1. Redistributions of source code must retain the above copyright
        !            18:  *    notice, this list of conditions and the following disclaimer.
        !            19:  * 2. Redistributions in binary form must reproduce the above copyright
        !            20:  *    notice, this list of conditions and the following disclaimer in the
        !            21:  *    documentation and/or other materials provided with the distribution.
        !            22:  * 3. All advertising materials mentioning features or use of this software
        !            23:  *    must display the following acknowledgement:
        !            24:  *     This product includes software developed by Aaron Brown and
        !            25:  *     Harvard University.
        !            26:  *     This product includes software developed by the University of
        !            27:  *     California, Berkeley and its contributors.
        !            28:  * 4. Neither the name of the University nor the names of its contributors
        !            29:  *    may be used to endorse or promote products derived from this software
        !            30:  *    without specific prior written permission.
        !            31:  *
        !            32:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            33:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            34:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            35:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            36:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            37:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            38:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            39:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            40:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            41:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            42:  * SUCH DAMAGE.
        !            43:  *
        !            44:  *     @(#)cache.h     8.1 (Berkeley) 6/11/93
        !            45:  */
        !            46:
        !            47: #ifndef SPARC_CACHE_H
        !            48: #define SPARC_CACHE_H
        !            49:
        !            50: /*
        !            51:  * Sun-4 and Sun-4c virtual address cache.
        !            52:  *
        !            53:  * Sun-4 virtual caches come in two flavors, write-through (Sun-4c)
        !            54:  * and write-back (Sun-4).  The write-back caches are much faster
        !            55:  * but require a bit more care.
        !            56:  *
        !            57:  */
        !            58: enum vactype { VAC_UNKNOWN, VAC_NONE, VAC_WRITETHROUGH, VAC_WRITEBACK };
        !            59:
        !            60: /*
        !            61:  * Cache tags can be written in control space, and must be set to 0
        !            62:  * (or invalid anyway) before turning on the cache.  The tags are
        !            63:  * addressed as an array of 32-bit structures of the form:
        !            64:  *
        !            65:  *     struct cache_tag {
        !            66:  *             u_int   :7,             (unused; must be zero)
        !            67:  *                     ct_cid:3,       (context ID)
        !            68:  *                     ct_w:1,         (write flag from PTE)
        !            69:  *                     ct_s:1,         (supervisor flag from PTE)
        !            70:  *                     ct_v:1,         (set => cache entry is valid)
        !            71:  *                     :3,             (unused; must be zero)
        !            72:  *                     ct_tid:14,      (cache tag ID)
        !            73:  *                     :2;             (unused; must be zero)
        !            74:  *     };
        !            75:  *
        !            76:  * The SPARCstation 1 cache sees virtual addresses as:
        !            77:  *
        !            78:  *     struct cache_va {
        !            79:  *             u_int   :2,             (unused; probably copies of va_tid<13>)
        !            80:  *                     cva_tid:14,     (tag ID)
        !            81:  *                     cva_line:12,    (cache line number)
        !            82:  *                     cva_byte:4;     (byte in cache line)
        !            83:  *     };
        !            84:  *
        !            85:  * (The SS2 cache is similar but has half as many lines, each twice as long.)
        !            86:  *
        !            87:  * Note that, because the 12-bit line ID is `wider' than the page offset,
        !            88:  * it is possible to have one page map to two different cache lines.
        !            89:  * This can happen whenever two different physical pages have the same bits
        !            90:  * in the part of the virtual address that overlaps the cache line ID, i.e.,
        !            91:  * bits <15:12>.  In order to prevent cache duplication, we have to
        !            92:  * make sure that no one page has more than one virtual address where
        !            93:  * (va1 & 0xf000) != (va2 & 0xf000).  (The cache hardware turns off ct_v
        !            94:  * when a cache miss occurs on a write, i.e., if va1 is in the cache and
        !            95:  * va2 is not, and you write to va2, va1 goes out of the cache.  If va1
        !            96:  * is in the cache and va2 is not, reading va2 also causes va1 to become
        !            97:  * uncached, and the [same] data is then read from main memory into the
        !            98:  * cache.)
        !            99:  *
        !           100:  * The other alternative, of course, is to disable caching of aliased
        !           101:  * pages.  (In a few cases this might be faster anyway, but we do it
        !           102:  * only when forced.)
        !           103:  *
        !           104:  * The Sun4, since it has an 8K pagesize instead of 4K, needs to check
        !           105:  * bits that are one position higher.
        !           106:  */
        !           107:
        !           108: /* Some more well-known values: */
        !           109:
        !           110: #define        CACHE_ALIAS_DIST_SUN4   0x20000
        !           111: #define        CACHE_ALIAS_DIST_SUN4C  0x10000
        !           112:
        !           113: #define        CACHE_ALIAS_BITS_SUN4   0x1e000
        !           114: #define        CACHE_ALIAS_BITS_SUN4C  0xf000
        !           115:
        !           116: #define CACHE_ALIAS_DIST_HS128k                0x20000
        !           117: #define CACHE_ALIAS_BITS_HS128k                0x1f000
        !           118: #define CACHE_ALIAS_DIST_HS256k                0x40000
        !           119: #define CACHE_ALIAS_BITS_HS256k                0x3f000
        !           120:
        !           121: extern int cache_alias_dist;
        !           122: extern int cache_alias_bits;
        !           123:
        !           124: /* Optimize cache alias macros on single architecture kernels */
        !           125: #if defined(SUN4) && !defined(SUN4C) && !defined(SUN4M)
        !           126: #define        CACHE_ALIAS_DIST        CACHE_ALIAS_DIST_SUN4
        !           127: #define        CACHE_ALIAS_BITS        CACHE_ALIAS_BITS_SUN4
        !           128: #elif !defined(SUN4) && defined(SUN4C) && !defined(SUN4M)
        !           129: #define        CACHE_ALIAS_DIST        CACHE_ALIAS_DIST_SUN4C
        !           130: #define        CACHE_ALIAS_BITS        CACHE_ALIAS_BITS_SUN4C
        !           131: #else
        !           132: #define        CACHE_ALIAS_DIST        cache_alias_dist
        !           133: #define        CACHE_ALIAS_BITS        cache_alias_bits
        !           134: #endif
        !           135:
        !           136: /*
        !           137:  * True iff a1 and a2 are `bad' aliases (will cause cache duplication).
        !           138:  */
        !           139: #define        BADALIAS(a1, a2) (((int)(a1) ^ (int)(a2)) & CACHE_ALIAS_BITS)
        !           140:
        !           141: /*
        !           142:  * Routines for dealing with the cache.
        !           143:  */
        !           144: void   sun4_cache_enable(void);                /* turn it on */
        !           145: void   ms1_cache_enable(void);                 /* turn it on */
        !           146: void   viking_cache_enable(void);              /* turn it on */
        !           147: void   hypersparc_cache_enable(void);          /* turn it on */
        !           148: void   swift_cache_enable(void);               /* turn it on */
        !           149: void   cypress_cache_enable(void);             /* turn it on */
        !           150: void   turbosparc_cache_enable(void);          /* turn it on */
        !           151: void   kap_cache_enable(void);                 /* turn it on */
        !           152:
        !           153: void   sun4_vcache_flush_context(void);        /* flush current context */
        !           154: void   sun4_vcache_flush_region(int);          /* flush region in cur ctx */
        !           155: void   sun4_vcache_flush_segment(int, int);    /* flush seg in cur ctx */
        !           156: void   sun4_vcache_flush_page(int va);         /* flush page in cur ctx */
        !           157: void   sun4_cache_flush(caddr_t, u_int);       /* flush region */
        !           158:
        !           159: void   srmmu_vcache_flush_context(void);       /* flush current context */
        !           160: void   srmmu_vcache_flush_region(int);         /* flush region in cur ctx */
        !           161: void   srmmu_vcache_flush_segment(int, int);   /* flush seg in cur ctx */
        !           162: void   srmmu_vcache_flush_page(int va);        /* flush page in cur ctx */
        !           163: void   srmmu_cache_flush(caddr_t, u_int);      /* flush region */
        !           164: void   hypersparc_pure_vcache_flush(void);
        !           165:
        !           166: void   ms1_cache_flush_all(void);
        !           167: void   srmmu_cache_flush_all(void);
        !           168: void   cypress_cache_flush_all(void);
        !           169: void   hypersparc_cache_flush_all(void);
        !           170:
        !           171: void   ms1_cache_flush(caddr_t, u_int);
        !           172: void   viking_cache_flush(caddr_t, u_int);
        !           173: void   viking_pcache_flush_line(int, int);
        !           174: void   srmmu_pcache_flush_line(int, int);
        !           175:
        !           176: void   kap_vcache_flush_context(void);         /* flush current context */
        !           177: void   kap_vcache_flush_page(int va);          /* flush page in cur ctx */
        !           178: void   kap_cache_flush(caddr_t, u_int);        /* flush region */
        !           179:
        !           180: extern void sparc_noop(void);
        !           181:
        !           182: #define noop_vcache_flush_context \
        !           183:        (void (*)(void)) sparc_noop
        !           184: #define noop_vcache_flush_region \
        !           185:        (void (*)(int)) sparc_noop
        !           186: #define noop_vcache_flush_segment \
        !           187:        (void (*)(int,int)) sparc_noop
        !           188: #define noop_vcache_flush_page \
        !           189:        (void (*)(int)) sparc_noop
        !           190: #define noop_cache_flush \
        !           191:        (void (*)(caddr_t, u_int)) sparc_noop
        !           192: #define noop_pcache_flush_line \
        !           193:        (void (*)(int, int)) sparc_noop
        !           194: #define noop_pure_vcache_flush \
        !           195:        (void (*)(void)) sparc_noop
        !           196: #define noop_cache_flush_all \
        !           197:        (void (*)(void)) sparc_noop
        !           198:
        !           199: #define cache_flush_page(va)           cpuinfo.vcache_flush_page(va)
        !           200: #define cache_flush_segment(vr,vs)     cpuinfo.vcache_flush_segment(vr,vs)
        !           201: #define cache_flush_region(vr)         cpuinfo.vcache_flush_region(vr)
        !           202: #define cache_flush_context()          cpuinfo.vcache_flush_context()
        !           203:
        !           204: /*
        !           205:  * Cache control information.
        !           206:  */
        !           207: struct cacheinfo {
        !           208:        int     c_totalsize;            /* total size, in bytes */
        !           209:                                        /* if split, MAX(icache,dcache) */
        !           210:        int     c_enabled;              /* true => cache is enabled */
        !           211:        int     c_hwflush;              /* true => have hardware flush */
        !           212:        int     c_linesize;             /* line size, in bytes */
        !           213:        int     c_l2linesize;           /* log2(linesize) */
        !           214:        int     c_nlines;               /* number of cache lines */
        !           215:        int     c_physical;             /* true => cache has physical
        !           216:                                                   address tags */
        !           217:        int     c_associativity;        /* # of "buckets" in cache line */
        !           218:        int     c_split;                /* true => cache is split */
        !           219:
        !           220:        int     ic_totalsize;           /* instruction cache */
        !           221:        int     ic_enabled;
        !           222:        int     ic_linesize;
        !           223:        int     ic_l2linesize;
        !           224:        int     ic_nlines;
        !           225:        int     ic_associativity;
        !           226:
        !           227:        int     dc_totalsize;           /* data cache */
        !           228:        int     dc_enabled;
        !           229:        int     dc_linesize;
        !           230:        int     dc_l2linesize;
        !           231:        int     dc_nlines;
        !           232:        int     dc_associativity;
        !           233:
        !           234:        int     ec_totalsize;           /* external cache info */
        !           235:        int     ec_enabled;
        !           236:        int     ec_linesize;
        !           237:        int     ec_l2linesize;
        !           238:        int     ec_nlines;
        !           239:        int     ec_associativity;
        !           240:
        !           241:        enum vactype    c_vactype;
        !           242: };
        !           243:
        !           244: #define CACHEINFO cpuinfo.cacheinfo
        !           245:
        !           246: /*
        !           247:  * Cache control statistics.
        !           248:  */
        !           249: struct cachestats {
        !           250:        int     cs_npgflush;            /* # page flushes */
        !           251:        int     cs_nsgflush;            /* # seg flushes */
        !           252:        int     cs_nrgflush;            /* # seg flushes */
        !           253:        int     cs_ncxflush;            /* # context flushes */
        !           254:        int     cs_nraflush;            /* # range flushes */
        !           255: #ifdef notyet
        !           256:        int     cs_ra[65];              /* pages/range */
        !           257: #endif
        !           258: };
        !           259: #endif /* SPARC_CACHE_H */

CVSweb