Annotation of tme/machine/sun3/sun3-impl.h, revision 1.1

1.1     ! root        1: /* $Id: sun3-impl.h,v 1.2 2005/02/18 04:07:52 fredette Exp $ */
        !             2: 
        !             3: /* machine/sun3/sun3-impl.h - implementation header file for Sun 3 emulation: */
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 2003, 2004 Matt Fredette
        !             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 Matt Fredette.
        !            20:  * 4. The name of the author 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 THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        !            25:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
        !            26:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
        !            27:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        !            28:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
        !            29:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            31:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
        !            32:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            33:  * POSSIBILITY OF SUCH DAMAGE.
        !            34:  */
        !            35: 
        !            36: #ifndef _MACHINE_SUN3_IMPL_H
        !            37: #define _MACHINE_SUN3_IMPL_H
        !            38: 
        !            39: #include <tme/common.h>
        !            40: _TME_RCSID("$Id: sun3-impl.h,v 1.2 2005/02/18 04:07:52 fredette Exp $");
        !            41: 
        !            42: /* includes: */
        !            43: #include <tme/generic/bus.h>
        !            44: #include <tme/machine/sun.h>
        !            45: #include <tme/ic/m68k.h>
        !            46: #include <tme/element.h>
        !            47: 
        !            48: /* macros: */
        !            49: 
        !            50: /* real sun3 control space addresses: */
        !            51: #define TME_SUN3_CONTROL_IDPROM                (0x00000000)    /* the IDPROM */
        !            52: #define TME_SUN3_CONTROL_PGMAP         (0x10000000)    /* the page map */
        !            53: #define TME_SUN3_CONTROL_SEGMAP                (0x20000000)    /* the segment map */
        !            54: #define TME_SUN3_CONTROL_CONTEXT       (0x30000000)    /* the context register */
        !            55: #define TME_SUN3_CONTROL_ENABLE                (0x40000000)    /* the enable register */
        !            56: #define TME_SUN3_CONTROL_UDVMA         (0x50000000)    /* the user DVMA enable register */
        !            57: #define TME_SUN3_CONTROL_BUSERR                (0x60000000)    /* the bus error register */
        !            58: #define TME_SUN3_CONTROL_DIAG          (0x70000000)    /* the diagnostic register */
        !            59: #define TME_SUN3_CONTROL_VAC_TAGS      (0x80000000)    /* the VAC tags */
        !            60: #define TME_SUN3_CONTROL_VAC_DATA      (0x90000000)    /* the VAC data */
        !            61: #define TME_SUN3_CONTROL_VAC_FLUSH     (0xa0000000)    /* the VAC flush address */
        !            62: #define TME_SUN3_CONTROL_COPY          (0xb0000000)    /* the block copy hardware */
        !            63:                                        /* 0xc0000000 unused */
        !            64:                                        /* 0xd0000000 unused */
        !            65:                                        /* 0xe0000000 unused */
        !            66: #define TME_SUN3_CONTROL_UART_BYPASS   (0xf0000000)    /* the special UART bypass */
        !            67: 
        !            68: /* this converts a sun3 control space address into the register number: */
        !            69: #define TME_SUN3_CONTROL_REG(address)  ((address) >> 28)
        !            70: 
        !            71: /* this masks a sun3 control space address into a virtual address: */
        !            72: #define TME_SUN3_CONTROL_MASK_ADDRESS  (0x0ffffffc)
        !            73: 
        !            74: /* real sun3 enable register bits: */
        !            75: #define TME_SUN3_ENA_DIAG              (0x01)  /* diagnostic switch (read-only) */
        !            76: #define TME_SUN3_ENA_FPA               (0x02)  /* enable FPA */
        !            77: #define TME_SUN3_ENA_COPY              (0x04)  /* enable copy update mode */
        !            78: #define TME_SUN3_ENA_VIDEO             (0x08)  /* enable video display */
        !            79: #define TME_SUN3_ENA_CACHE             (0x10)  /* enable external cache */
        !            80: #define TME_SUN3_ENA_SDVMA             (0x20)  /* enable system DVMA */
        !            81: #define TME_SUN3_ENA_FPP               (0x40)  /* enable 6888x */
        !            82: #define TME_SUN3_ENA_NOTBOOT           (0x80)  /* non-boot state */
        !            83: 
        !            84: /* real sun3 interrupt register bits: */
        !            85: #define TME_SUN3_IREG_INTS_ENAB                (0x01)  /* enable interrupts */
        !            86: #define TME_SUN3_IREG_SOFT_INT_1       (0x02)  /* enable level 1 soft interrupts */
        !            87: #define TME_SUN3_IREG_SOFT_INT_2       (0x04)  /* enable level 2 soft interrupts */
        !            88: #define TME_SUN3_IREG_SOFT_INT_3       (0x08)  /* enable level 3 soft interrupts */
        !            89: #define TME_SUN3_IREG_VIDEO_ENAB       (0x10)  /* enable video */
        !            90: #define TME_SUN3_IREG_CLOCK_ENAB_5     (0x20)  /* enable clock interrupts */
        !            91:                                        /* 0x40 unused */
        !            92: #define TME_SUN3_IREG_CLOCK_ENAB_7     (0x80)  /* enable clock NMI interrupts */
        !            93: 
        !            94: /* real sun3 memory error register parts: */
        !            95: #define TME_SUN3_MEMERR_REG_CSR                (0)
        !            96: #define TME_SUN3_MEMERR_SIZ_CSR                (sizeof(tme_uint8_t))
        !            97: #define TME_SUN3_MEMERR_REG_VADDR      (4)
        !            98: #define TME_SUN3_MEMERR_SIZ_VADDR      (sizeof(tme_uint32_t))
        !            99: #define TME_SUN3_MEMERR_SIZ_REG                (TME_SUN3_MEMERR_REG_VADDR + TME_SUN3_MEMERR_SIZ_VADDR)
        !           100: 
        !           101: /* real sun3 memory error control register bits: */
        !           102: #define TME_SUN3_MEMERR_X_INT_ACTIVE   (0x80)  /* interrupt is active */
        !           103: #define TME_SUN3_MEMERR_X_ENABLE_INT   (0x40)  /* enable memory error interrupts */
        !           104: #define TME_SUN3_MEMERR_PAR_TEST       (0x20)  /* write inverse parity */
        !           105: #define TME_SUN3_MEMERR_PAR_ENABLE     (0x10)  /* enable parity checking */
        !           106: #define TME_SUN3_MEMERR_PAR_ERR_BL3    (0x08)  /* parity error in D24..D31 */
        !           107: #define TME_SUN3_MEMERR_PAR_ERR_BL2    (0x04)  /* parity error in D16..D23 */
        !           108: #define TME_SUN3_MEMERR_PAR_ERR_BL1    (0x02)  /* parity error in D8..D15 */
        !           109: #define TME_SUN3_MEMERR_PAR_ERR_BL0    (0x01)  /* parity error in D0..D7 */
        !           110: 
        !           111: /* the page size: */
        !           112: #define TME_SUN3_PAGE_SIZE_LOG2                (13)
        !           113: #define TME_SUN3_PAGE_SIZE             (1 << TME_SUN3_PAGE_SIZE_LOG2)
        !           114: 
        !           115: /* the number of PMEGs: */
        !           116: #define TME_SUN3_PMEGS                 (256)
        !           117: 
        !           118: /* the PROM location: */
        !           119: #define TME_SUN3_PROM_BASE             (0x0FEF0000)
        !           120: #define TME_SUN3_PROM_SIZE             (0x00010000)
        !           121: 
        !           122: /* the obio addresses of zs0 and the PROM: */
        !           123: #define TME_SUN3_OBIO_ZS0              (0x00020000)
        !           124: #define TME_SUN3_OBIO_PROM             (0x00100000)
        !           125: 
        !           126: /* identifiers for the different mainbus connections.  the buses are
        !           127:    together at the beginning of the value space: */
        !           128: #define TME_SUN3_CONN_BUS_OBIO         (0)
        !           129: #define TME_SUN3_CONN_BUS_OBMEM                (1)
        !           130: #define TME_SUN3_CONN_BUS_VME          (2)
        !           131: #define  TME_SUN3_CONN_BUS_COUNT       (3)
        !           132: #define TME_SUN3_CONN_OBIO_MASTER      (3)
        !           133: #define TME_SUN3_CONN_REG_MEMERR       (4)
        !           134: #define TME_SUN3_CONN_REG_INTREG       (5)
        !           135: 
        !           136: /* the DVMA sizes: */
        !           137: #define TME_SUN3_DVMA_SIZE_OBIO                (0x01000000)
        !           138: #define TME_SUN3_DVMA_SIZE_VME         (0x00100000)
        !           139: 
        !           140: #define TME_SUN3_LOG_HANDLE(sun3) (&(sun3)->tme_sun3_element->tme_element_log_handle)
        !           141: 
        !           142: /* types: */
        !           143: 
        !           144: /* a sun3 mainbus connection: */
        !           145: struct tme_sun3_bus_connection {
        !           146: 
        !           147:   /* the generic bus connection: */
        !           148:   struct tme_bus_connection tme_sun3_bus_connection;
        !           149: 
        !           150:   /* what kind of connection this is: */
        !           151:   unsigned int tme_sun3_bus_connection_which;
        !           152: };
        !           153: 
        !           154: /* a sun3: */
        !           155: struct tme_sun3 {
        !           156: 
        !           157:   /* backpointer to our element: */
        !           158:   struct tme_element *tme_sun3_element;
        !           159: 
        !           160:   /* the IDPROM: */
        !           161:   tme_uint8_t tme_sun3_idprom_contents[TME_SUN_IDPROM_SIZE];
        !           162: 
        !           163:   /* the MMU: */
        !           164:   void *tme_sun3_mmu;
        !           165: 
        !           166:   /* the CPU: */
        !           167:   struct tme_m68k_bus_connection *tme_sun3_m68k;
        !           168: 
        !           169:   /* the different buses: */
        !           170:   struct tme_bus_connection *tme_sun3_buses[TME_SUN3_CONN_BUS_COUNT];
        !           171: #define tme_sun3_obio tme_sun3_buses[TME_SUN3_CONN_BUS_OBIO]
        !           172: #define tme_sun3_obmem tme_sun3_buses[TME_SUN3_CONN_BUS_OBMEM]
        !           173: #define tme_sun3_vmebus tme_sun3_buses[TME_SUN3_CONN_BUS_VME]
        !           174: 
        !           175:   /* the context register: */
        !           176:   tme_uint8_t tme_sun3_context;
        !           177: 
        !           178:   /* the enable register: */
        !           179:   tme_uint8_t tme_sun3_enable;
        !           180: 
        !           181:   /* the UDVMA register: */
        !           182:   tme_uint8_t tme_sun3_udvma;
        !           183: 
        !           184:   /* the bus error register: */
        !           185:   tme_uint8_t tme_sun3_buserr;
        !           186: 
        !           187:   /* the diagnostic register: */
        !           188:   tme_uint8_t tme_sun3_diag;
        !           189: 
        !           190:   /* the interrupt register: */
        !           191:   tme_uint8_t tme_sun3_ints;
        !           192: 
        !           193:   /* the memory error register: */
        !           194:   tme_uint8_t tme_sun3_memerr_csr;
        !           195:   tme_uint32_t tme_sun3_memerr_vaddr;
        !           196:   unsigned int tme_sun3_memerr_int_asserted;
        !           197:   struct tme_bus_connection *tme_sun3_memerr_bus;
        !           198: 
        !           199:   /* memory error register test state: */
        !           200:   struct tme_bus_tlb *tme_sun3_memerr_tlb;
        !           201:   void *tme_sun3_memerr_cycle_private;
        !           202:   tme_bus_cycle_handler tme_sun3_memerr_cycle;
        !           203:   tme_uint8_t tme_sun3_memerr_pending_csr;
        !           204:   tme_uint32_t tme_sun3_memerr_pending_vaddr;
        !           205: 
        !           206:   /* the interrupt lines that are being asserted: */
        !           207:   tme_uint8_t tme_sun3_int_signals[(TME_M68K_IPL_MAX + 1 + 7) >> 3];
        !           208: 
        !           209:   /* the last ipl we gave to the CPU: */
        !           210:   unsigned int tme_sun3_int_ipl_last;
        !           211: 
        !           212:   /* the last clock interrupt bus signal: */
        !           213:   unsigned int tme_sun3_int_signal_clock_last;
        !           214: 
        !           215:   /* the set of active boot state TLB entries: */
        !           216:   unsigned int tme_sun3_boot_state_tlb_next;
        !           217: #define TME_SUN3_BOOT_STATE_TLBS       (8)
        !           218:   struct tme_bus_tlb *tme_sun3_boot_state_tlbs[TME_SUN3_BOOT_STATE_TLBS];
        !           219: 
        !           220:   /* the set of active SDVMA TLB entries: */
        !           221:   unsigned int tme_sun3_sdvma_tlb_next;
        !           222: #define TME_SUN3_SDVMA_TLBS            (16)
        !           223:   struct tme_bus_tlb *tme_sun3_sdvma_tlbs[TME_SUN3_SDVMA_TLBS];
        !           224: };
        !           225: 
        !           226: /* prototypes: */
        !           227: void _tme_sun3_mmu_new _TME_P((struct tme_sun3 *));
        !           228: int _tme_sun3_m68k_tlb_fill _TME_P((struct tme_m68k_bus_connection *, struct tme_m68k_tlb *,
        !           229:                                    unsigned int, tme_uint32_t, unsigned int));
        !           230: int _tme_sun3_bus_tlb_fill _TME_P((struct tme_bus_connection *, struct tme_bus_tlb *,
        !           231:                                   tme_uint32_t, unsigned int));
        !           232: int _tme_sun3_mmu_tlb_set_allocate _TME_P((struct tme_bus_connection *,
        !           233:                                           unsigned int, unsigned int, 
        !           234:                                           TME_ATOMIC_POINTER_TYPE(struct tme_bus_tlb *)));
        !           235: int _tme_sun3_mmu_pte_get _TME_P((struct tme_sun3 *, tme_uint32_t, tme_uint32_t *));
        !           236: int _tme_sun3_mmu_pte_set _TME_P((struct tme_sun3 *, tme_uint32_t, tme_uint32_t));
        !           237: void _tme_sun3_mmu_sdvma_change _TME_P((struct tme_sun3 *));
        !           238: void _tme_sun3_mmu_context_set _TME_P((struct tme_sun3 *));
        !           239: 
        !           240: int _tme_sun3_control_cycle_handler _TME_P((void *, struct tme_bus_cycle *));
        !           241: int _tme_sun3_intreg_cycle_handler _TME_P((void *, struct tme_bus_cycle *));
        !           242: int _tme_sun3_memerr_cycle_handler _TME_P((void *, struct tme_bus_cycle *));
        !           243: int _tme_sun3_memerr_test_cycle_handler _TME_P((void *, struct tme_bus_cycle *));
        !           244: int _tme_sun3_ipl_check _TME_P((struct tme_sun3 *));
        !           245: 
        !           246: #endif /* !_MACHINE_SUN3_IMPL_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.