Annotation of tme/ic/stp22xx/stp222x-impl.h, revision 1.1.1.1

1.1       root        1: /* $Id: stp222x-impl.h,v 1.4 2009/11/08 16:45:14 fredette Exp $ */
                      2: 
                      3: /* ic/stp22xx/stp222x-impl.h - implementation header file for STP2220
                      4:    and STP2222 emulation: */
                      5: 
                      6: /*
                      7:  * Copyright (c) 2009 Matt Fredette
                      8:  * All rights reserved.
                      9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  * 3. All advertising materials mentioning features or use of this software
                     19:  *    must display the following acknowledgement:
                     20:  *      This product includes software developed by Matt Fredette.
                     21:  * 4. The name of the author may not be used to endorse or promote products
                     22:  *    derived from this software without specific prior written permission.
                     23:  *
                     24:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     25:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     26:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
                     27:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
                     28:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     29:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     30:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     31:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     32:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
                     33:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     34:  * POSSIBILITY OF SUCH DAMAGE.
                     35:  */
                     36: 
                     37: #ifndef _STP222X_IMPL_H
                     38: #define _STP222X_IMPL_H
                     39: 
                     40: #include <tme/common.h>
                     41: _TME_RCSID("$Id: stp222x-impl.h,v 1.4 2009/11/08 16:45:14 fredette Exp $");
                     42: 
                     43: /* includes: */
                     44: #include "stp22xx-impl.h"
                     45: 
                     46: /* macros: */
                     47: 
                     48: /* common interrupt diagnostic register indices: */
                     49: #define TME_STP222X_IDI0_OBIO                  (0x20)
                     50: #define TME_STP222X_IDI_SCSI                   (TME_STP222X_IDI0_OBIO + 0x00)
                     51: #define TME_STP222X_IDI_ETHER                  (TME_STP222X_IDI0_OBIO + 0x01)
                     52: #define TME_STP222X_IDI_BPP                    (TME_STP222X_IDI0_OBIO + 0x02)
                     53: #define TME_STP222X_IDI_NULL                   (0x40)
                     54: 
                     55: /* the common register size: */
                     56: #define TME_STP222X_REG_SIZE                   (sizeof(tme_uint64_t))
                     57: 
                     58: /* common timer register offsets: */
                     59: #define TME_STP222X_TIMER_COUNT                        (0x00)
                     60: #define TME_STP222X_TIMER_LIMIT                        (0x08)
                     61: #define TME_STP222X_TIMER_SIZE                 (0x10)
                     62: 
                     63: /* the maximum count of interrupt dispatch buffers: */
                     64: #define TME_STP222X_MDU_BUFFER_COUNT           (2)
                     65: 
                     66: /* the number of IOMMU TLB entries: */
                     67: #define TME_STP222X_IOMMU_TLB_SIZE             (16)
                     68: 
                     69: /* the maximum count of streaming caches: */
                     70: #define TME_STP222X_STC_COUNT                  (2)
                     71: 
                     72: /* stp2220-specific slots: */
                     73: #define TME_STP2220_SLOTS_CARD                 (4)
                     74: #define TME_STP2220_SLOTS_OBIO                 (3)
                     75: #define TME_STP2220_SLOT_CARD(n)               (n)
                     76: #define TME_STP2220_SLOT_OBIO(n)               (13 + (n))
                     77: #define TME_STP2220_SLOT_AUDIO                 TME_STP2220_SLOT_OBIO(0)
                     78: #define TME_STP2220_SLOT_MACIO                 TME_STP2220_SLOT_OBIO(1)
                     79: #define TME_STP2220_SLOT_SLAVIO                        TME_STP2220_SLOT_OBIO(2)
                     80: 
                     81: /* stp2220-specific interrupt diagnostic register indices: */
                     82: #define TME_STP2220_IDI_CARD(slot, intn)       ((TME_SBUS_SLOT_INTS * (slot)) + (intn))
                     83: #define TME_STP2220_IDI_AUDIO                  (TME_STP222X_IDI0_OBIO + 0x03)
                     84: #define TME_STP2220_IDI_POWER                  (TME_STP222X_IDI0_OBIO + 0x04)
                     85: #define TME_STP2220_IDI_ZS0_ZS1                        (TME_STP222X_IDI0_OBIO + 0x05)
                     86: #define TME_STP2220_IDI_FD                     (TME_STP222X_IDI0_OBIO + 0x06)
                     87: #define TME_STP2220_IDI_THERM                  (TME_STP222X_IDI0_OBIO + 0x07)
                     88: #define TME_STP2220_IDI_KBD                    (TME_STP222X_IDI0_OBIO + 0x08)
                     89: #define TME_STP2220_IDI_MOUSE                  (TME_STP222X_IDI0_OBIO + 0x09)
                     90: #define TME_STP2220_IDI_SERIAL                 (TME_STP222X_IDI0_OBIO + 0x0a)
                     91: #define TME_STP2220_IDI_TIMER(n)               (TME_STP222X_IDI0_OBIO + 0x0b + (n))
                     92: #define TME_STP2220_IDI_UE                     (TME_STP222X_IDI0_OBIO + 0x0d)
                     93: #define TME_STP2220_IDI_CE                     (TME_STP222X_IDI0_OBIO + 0x0e)
                     94: #define TME_STP2220_IDI_SBUS_ASYNC             (TME_STP222X_IDI0_OBIO + 0x0f)
                     95: #define TME_STP2220_IDI_POWER_MANAGE           (TME_STP222X_IDI0_OBIO + 0x10)
                     96: #define TME_STP2220_IDI_UPA                    (TME_STP222X_IDI0_OBIO + 0x11)
                     97: #define TME_STP2220_IDI_RESERVED               (TME_STP222X_IDI0_OBIO + 0x12)
                     98: 
                     99: /* stp2222-specific IDIs: */
                    100: #define TME_STP2222_IDI_CARD(bus, slot, intn)  ((TME_PCI_SLOT_INTS * (((bus) * 4) + (slot))) + (intn))
                    101: #define TME_STP2222_IDI_AUDIO_RECORD           (TME_STP222X_IDI0_OBIO + 0x03)
                    102: #define TME_STP2222_IDI_AUDIO_PLAYBACK         (TME_STP222X_IDI0_OBIO + 0x04)
                    103: #define TME_STP2222_IDI_TIMER(n)               (TME_STP222X_IDI0_OBIO + 0x0c + (n))
                    104: #define TME_STP2222_IDI_UE                     (TME_STP222X_IDI0_OBIO + 0x0e)
                    105: #define TME_STP2222_IDI_CE                     (TME_STP222X_IDI0_OBIO + 0x0f)
                    106: #define TME_STP2222_IDI_POWER_MANAGE           (TME_STP222X_IDI0_OBIO + 0x12)
                    107: #define TME_STP2222_IDI_FFB0                   (TME_STP222X_IDI0_OBIO + 0x13)
                    108: #define TME_STP2222_IDI_FFB1                   (TME_STP222X_IDI0_OBIO + 0x14)
                    109: 
                    110: /* the STP2222 BOOT_BUS: */
                    111: #define TME_STP2222_BOOT_BUS(stp222x)          (0 && (stp222x))
                    112: 
                    113: /* a register group covers 256 addresses: */
                    114: #define TME_STP222X_REGGROUP_WHICH(x)          ((x) / 256)
                    115: #define TME_STP222X_REGGROUP_INDEX(x)          ((((tme_uint32_t) (x)) / TME_STP222X_REG_SIZE) % (256 / TME_STP222X_REG_SIZE))
                    116: 
                    117: /* XXX FIXME - these should be in bus-specific headers: */
                    118: #define TME_SBUS_SLOT_INTS                     (8)
                    119: #define TME_PCI_SLOT_INTS                      (4)
                    120: 
                    121: /* connections: */
                    122: #define TME_STP222X_CONN_SLAVE0                        (sizeof(((struct tme_stp222x *) 0)->tme_stp222x_io_brs) * 8)
                    123: #define TME_STP222X_CONN_NULL                  (64)
                    124: #define TME_STP222X_CONN_UPA                   (TME_STP222X_CONN_NULL + 1)
                    125: #define TME_STP222X_CONN_COUNT                 (TME_STP222X_CONN_UPA + 1)
                    126: 
                    127: /* the number of TLB tokens in a list: */
                    128: #define TME_STP222X_TLB_LIST_TOKENS_COUNT      (4)
                    129: 
                    130: /* connection identifiers: */
                    131: /* NB: connection identifiers are complicated because we want to be
                    132:    able to quickly map identifiers for connections that can interrupt
                    133:    into an IDI, and quickly map identifiers for masters into
                    134:    connection indices, but the connection identifier often has to
                    135:    carry addressing information for the connection too.
                    136: 
                    137:    obio connections use one type of identifier.  known obio
                    138:    connections (that we need to get IDIs and connection indices for
                    139:    quickly) have a short form, that contains the IDI and connection
                    140:    index directly.  unknown obio connections use a long form that
                    141:    captures the slot and offset only.
                    142: 
                    143:    card connections use another type of identifier.  these identifiers
                    144:    always contain the addressing information for the connection, which
                    145:    can always be quickly mapped into a base IDI.  card identifiers for
                    146:    masters can usually be mapped quickly into a connection index: */
                    147: #define TME_STP222X_CONNID_TYPE                        (0x1 << 0)
                    148: #define  TME_STP222X_CONNID_TYPE_OBIO           (0x1 << 0)
                    149: #define  TME_STP222X_CONNID_TYPE_CARD           (0x0 << 0)
                    150: #define TME_STP222X_CONNID_OBIO_TYPE           (0x1 << 1)
                    151: #define  TME_STP222X_CONNID_OBIO_TYPE_SHORT     (0x1 << 1)
                    152: #define  TME_STP222X_CONNID_OBIO_TYPE_LONG      (0x0 << 1)
                    153: #if (TME_STP222X_IDI_NULL & (TME_STP222X_IDI_NULL - 1))
                    154: #error "TME_STP222X_IDI_NULL must be a power of two"
                    155: #endif
                    156: #define TME_STP222X_CONNID_OBIO_SHORT_IDI      ((TME_STP222X_IDI_NULL - 1) << 2)
                    157: #define TME_STP222X_CONNID_OBIO_SHORT_CONN_WHICH \
                    158:   (~ (tme_uint32_t)                            \
                    159:    (TME_STP222X_CONNID_TYPE                    \
                    160:     | TME_STP222X_CONNID_OBIO_TYPE             \
                    161:     | TME_STP222X_CONNID_OBIO_SHORT_IDI))
                    162: #define TME_STP222X_CONNID_OBIO_LONG_WHICH     (0x3 << 2)
                    163: #define TME_STP222X_CONNID_OBIO_LONG_OFFSET    ((TME_STP2220_SLOT_SIZE - 1) << 4)
                    164: #define TME_STP2220_CONNID_CARD_WHICH          (0x3 << 1)
                    165: #define TME_STP2220_CONNID_CARD_ALTERNATE      (0x1 << 3)
                    166: #define TME_STP2220_CONNID_CARD_OFFSET         ((TME_STP2220_SLOT_SIZE - 1) << 4)
                    167: #define TME_STP2222_CONNID_DEVICE_WHICH                (0x3 << 1)
                    168: #define TME_STP2222_CONNID_BUS_WHICH           (0x4 << 1)
                    169: 
                    170: /* address spaces: */
                    171: #define TME_STP2220_ASPACE_SBUS                        (0)
                    172: #define TME_STP2222_ASPACE_PCI_MEMORY(bus)     (1 + (bus))
                    173: #define TME_STP2222_ASPACE_PCI_IO(bus)         (3 + (bus))
                    174: #define TME_STP2222_ASPACE_PCI_CONFIGURATION   (5)
                    175: #define TME_STP222X_ASPACE_NULL                        (6)
                    176: 
                    177: /* address searches: */
                    178: #define TME_STP222X_ASEARCH_MISS               (((tme_uint32_t) 1) << 31)
                    179: 
                    180: /* predicates: */
                    181: #define TME_STP222X_IS_2220(stp222x)           ((stp222x)->tme_stp222x_is_2220)
                    182: 
                    183: /* miscellaneous: */
                    184: #define TME_STP222X_LOG_HANDLE(stp222x)                (&(stp222x)->tme_stp222x.tme_stp22xx_element->tme_element_log_handle)
                    185: 
                    186: /* these busy a bus connection: */
                    187: #define tme_stp222x_busy_bus(stp222x, conn_index) \
                    188:   tme_stp22xx_busy_bus(&(stp222x)->tme_stp222x, conn_index)
                    189: #define tme_stp222x_busy_upa(stp222x) \
                    190:   ((struct tme_upa_bus_connection *) tme_stp222x_busy_bus(stp222x, TME_STP222X_CONN_UPA))
                    191: 
                    192: /* this unbusies a generic bus connection: */
                    193: #define tme_stp222x_unbusy_bus(stp222x, conn_bus) \
                    194:   tme_stp22xx_unbusy_bus(&(stp222x)->tme_stp222x, conn_bus)
                    195: 
                    196: /* this busies a slave generic bus connection: */
                    197: #define tme_stp222x_slave_busy_bus(stp222x, conn_index) \
                    198:   tme_stp22xx_slave_busy_bus(&(stp222x)->tme_stp222x, conn_index)
                    199: 
                    200: /* this unbusies a slave generic bus connection: */
                    201: #define tme_stp222x_slave_unbusy(stp222x) \
                    202:   tme_stp22xx_slave_unbusy(&(stp222x)->tme_stp222x)
                    203: 
                    204: /* this enters an stp222x: */
                    205: #define tme_stp222x_enter_bus(conn_bus) \
                    206:   ((struct tme_stp222x *) tme_stp22xx_enter((struct tme_stp22xx *) (conn_bus)->tme_bus_connection.tme_connection_element->tme_element_private))
                    207: 
                    208: /* this enters an stp222x as the bus master: */
                    209: #define tme_stp222x_enter_master_bus(master_conn_bus) \
                    210:   ((struct tme_stp222x *) tme_stp22xx_enter_master(master_conn_bus))
                    211: 
                    212: /* this leaves an stp222x: */
                    213: #define tme_stp222x_leave(stp222x) \
                    214:   tme_stp22xx_leave(&(stp222x)->tme_stp222x)
                    215: 
                    216: /* this validates a completion: */
                    217: /* NB: completion may be NULL: */
                    218: #define tme_stp222x_completion_validate(stp222x, completion) \
                    219:   tme_stp22xx_completion_validate(&(stp222x)->tme_stp222x, completion)
                    220: 
                    221: /* this allocates a completion: */
                    222: #define tme_stp222x_completion_alloc(stp222x, handler, arg) \
                    223:   tme_stp22xx_completion_alloc(&(stp222x)->tme_stp222x, handler, arg)
                    224: 
                    225: /* types: */
                    226: 
                    227: /* a timer: */
                    228: struct tme_stp222x_timer {
                    229: 
                    230:   /* a backpointer to the stp222x: */
                    231:   struct tme_stp222x *tme_stp222x_timer_stp222x;
                    232: 
                    233:   /* the real limit register value: */
                    234:   tme_uint32_t tme_stp222x_timer_limit;
                    235: 
                    236:   /* the current period of this timer: */
                    237:   struct timeval tme_stp222x_timer_period;
                    238: 
                    239:   /* when the timer reaches its next limit: */
                    240:   struct timeval tme_stp222x_timer_limit_next;
                    241: 
                    242:   /* a condition for waking up the thread for this timer: */
                    243:   struct tme_stp22xx_cond tme_stp222x_timer_cond;
                    244: 
                    245:   /* these are used to track the interrupt rate for this timer: */
                    246:   tme_uint32_t tme_stp222x_timer_track_ints;
                    247:   struct timeval tme_stp222x_timer_track_sample;
                    248: 
                    249:   /* the IDI for this timer: */
                    250:   tme_uint8_t tme_stp222x_timer_idi;
                    251: };
                    252: 
                    253: /* a TLB list: */
                    254: struct tme_stp222x_tlb_list {
                    255: 
                    256:   /* the head of the list: */
                    257:   unsigned int tme_stp222x_tlb_list_head;
                    258: 
                    259:   /* the tokens for the TLBs in the list: */
                    260:   struct tme_token *tme_stp222x_tlb_list_tokens[TME_STP222X_TLB_LIST_TOKENS_COUNT];
                    261: };
                    262: 
                    263: /* a streaming cache: */
                    264: struct tme_stp222x_stc {
                    265: 
                    266:   /* the STC control register: */
                    267:   tme_uint32_t tme_stp222x_stc_cr;
                    268: 
                    269:   /* if this is nonzero, a flush is active: */
                    270:   int tme_stp222x_stc_pgflush;
                    271: 
                    272:   /* the STC FLUSHSYNC register: */
                    273:   tme_uint64_t tme_stp222x_stc_flushsync;
                    274: 
                    275:   /* the TLB entry for the flushsync range: */
                    276:   struct tme_bus_tlb tme_stp222x_stc_flushsync_tlb;
                    277:   struct tme_token tme_stp222x_stc_flushsync_tlb_token;
                    278: };
                    279: 
                    280: /* an address range: */
                    281: struct tme_stp222x_arange {
                    282: 
                    283:   /* the first address in the address range: */
                    284:   tme_bus_addr64_t tme_stp222x_arange_first;
                    285: 
                    286:   /* the size minus one of the address range: */
                    287:   tme_bus_addr64_t tme_stp222x_arange_size_m1;
                    288: 
                    289:   /* the key for this address range: */
                    290:   tme_uint32_t tme_stp222x_arange_key;
                    291: };
                    292: 
                    293: /* an address space: */
                    294: struct tme_stp222x_aspace {
                    295: 
                    296:   /* all address ranges claimed in this space: */
                    297:   struct tme_stp222x_arange *tme_stp222x_aspace_aranges;
                    298:   tme_uint32_t tme_stp222x_aspace_arange_count;
                    299: 
                    300:   /* the count of 32-bit address ranges claimed in this space: */
                    301:   tme_uint32_t tme_stp222x_aspace_arange32_count;
                    302: 
                    303:   /* the offset in this address space for each connection index: */
                    304:   tme_bus_addr32_t tme_stp222x_aspace_conn_offset[TME_STP222X_CONN_NULL];
                    305: };
                    306: 
                    307: /* a set of IDIs: */
                    308: typedef tme_uint32_t tme_stp222x_idis_t;
                    309: 
                    310: /* a register access: */
                    311: struct tme_stp222x_reg {
                    312: 
                    313:   /* the register value: */
                    314:   tme_uint64_t tme_stp222x_reg_value;
                    315: 
                    316:   /* the register address: */
                    317:   tme_uint16_t tme_stp222x_reg_address;
                    318: 
                    319:   /* if nonzero, this is a write: */
                    320:   tme_uint8_t tme_stp222x_reg_write;
                    321: 
                    322:   /* if nonzero, the access was completed: */
                    323:   tme_uint8_t tme_stp222x_reg_completed;
                    324: };
                    325: 
                    326: /* the device: */
                    327: struct tme_stp222x {
                    328: 
                    329:   /* the common structure, and space for the connections: */
                    330:   struct tme_stp22xx tme_stp222x;
                    331: #define tme_stp222x_master_conn_index_pending tme_stp222x.tme_stp22xx_master_conn_index_pending
                    332: #define tme_stp222x_master_conn_index tme_stp222x.tme_stp22xx_master_conn_index
                    333: #define tme_stp222x_master_completion tme_stp222x.tme_stp22xx_master_completion
                    334:   union tme_stp22xx_conn __tme_stp222x_conns[TME_STP222X_CONN_COUNT];
                    335: 
                    336:   /* this is nonzero if this is an STP2220: */
                    337:   int tme_stp222x_is_2220;
                    338: 
                    339:   /* the next slave connection index: */
                    340:   tme_uint32_t tme_stp222x_slave_conn_index_next;
                    341: 
                    342:   /* this is nonzero if we are asserting bus request on the UPA bus: */
                    343:   tme_uint8_t tme_stp222x_br;
                    344: 
                    345:   /* this is nonzero if we have been granted the UPA bus: */
                    346:   tme_uint8_t tme_stp222x_bg;
                    347: 
                    348:   /* the UPA port configuration register: */
                    349:   tme_uint8_t tme_stp222x_upa_port_config;
                    350: 
                    351:   /* the ECC control register: */
                    352:   tme_uint8_t tme_stp222x_ecc_control;
                    353: 
                    354:   /* the CSR: */
                    355:   tme_uint64_t tme_stp222x_csr;
                    356: 
                    357:   /* the wired-together state of the zs0 and zs1 IDIs: */
                    358:   tme_uint8_t tme_stp2220_mdu_idi_zs0_zs1_active;
                    359: 
                    360:   /* the active IDIs: */
                    361:   tme_stp222x_idis_t tme_stp222x_mdu_idis_active[TME_STP222X_IDI_NULL / (sizeof(tme_stp222x_idis_t) * 8)];
                    362: 
                    363:   /* the received IDIs: */
                    364:   tme_stp222x_idis_t tme_stp222x_mdu_idis_received[TME_STP222X_IDI_NULL / (sizeof(tme_stp222x_idis_t) * 8)];
                    365: 
                    366:   /* the IMRs: */
                    367:   tme_uint32_t tme_stp222x_mdu_imrs[TME_STP222X_IDI_NULL];
                    368: 
                    369:   /* the pending IDIs: */
                    370:   tme_stp222x_idis_t tme_stp222x_mdu_idis_pending[TME_STP222X_IDI_NULL / (sizeof(tme_stp222x_idis_t) * 8)];
                    371: 
                    372:   /* the interrupt dispatch buffers: */
                    373:   tme_uint32_t tme_stp222x_mdu_dispatch_imr[TME_STP222X_MDU_BUFFER_COUNT];
                    374:   tme_uint8_t tme_stp222x_mdu_dispatch_idi[TME_STP222X_MDU_BUFFER_COUNT];
                    375:   tme_uint8_t tme_stp222x_mdu_dispatch_state[TME_STP222X_MDU_BUFFER_COUNT];
                    376: 
                    377:   /* the next interrupt dispatch buffer: */
                    378:   unsigned int tme_stp222x_mdu_dispatch_buffer;
                    379: 
                    380:   /* the interrupt retry period and condition: */
                    381:   tme_uint32_t tme_stp222x_mdu_retry;
                    382:   struct timeval tme_stp222x_mdu_retry_sleep;
                    383:   struct tme_stp22xx_cond tme_stp222x_mdu_retry_cond;
                    384: 
                    385:   /* the UPA bus reset level: */
                    386:   unsigned int tme_stp222x_reset_level;
                    387: 
                    388:   /* the reset state: */
                    389:   tme_uint32_t tme_stp222x_reset_state;
                    390: 
                    391:   /* the mask of I/O connection indices requesting the bus: */
                    392:   tme_uint32_t tme_stp222x_io_brs;
                    393: 
                    394:   /* the address spaces: */
                    395:   struct tme_stp222x_aspace tme_stp222x_aspaces[TME_STP222X_ASPACE_NULL];
                    396: 
                    397:   /* the STP2220 SBus registers: */
                    398:   tme_uint64_t tme_stp2220_sbus_csr;
                    399:   tme_uint64_t tme_stp2220_sbus_config_card[TME_STP2220_SLOTS_CARD + TME_STP2220_SLOTS_OBIO];
                    400: 
                    401:   /* the SBus offset for each connection index: */
                    402:   tme_bus_addr32_t tme_stp2220_conn_offset[TME_STP222X_CONN_NULL];
                    403: 
                    404:   /* the timers: */
                    405:   struct tme_stp222x_timer tme_stp222x_timers[2];
                    406: 
                    407:   /* the IOMMU control register: */
                    408:   tme_uint32_t tme_stp222x_iommu_cr;
                    409: 
                    410:   /* the most recently used IOMMU TLB entry: */
                    411:   unsigned int tme_stp222x_iommu_tlb_i_mru;
                    412: 
                    413:   /* the IOMMU TLB LRU queue: */
                    414:   tme_uint8_t tme_stp222x_iommu_lru[TME_STP222X_IOMMU_TLB_SIZE][2];
                    415: #define tme_stp222x_iommu_lru_prev(x) tme_stp222x_iommu_lru[x][0]
                    416: #define tme_stp222x_iommu_lru_next(x) tme_stp222x_iommu_lru[x][1]
                    417: 
                    418:   /* the IOMMU TLB entry tags: */
                    419:   tme_uint32_t tme_stp222x_iommu_tlb_tags[TME_STP222X_IOMMU_TLB_SIZE];
                    420: 
                    421:   /* the IOMMU TLB entry data: */
                    422:   tme_uint32_t tme_stp222x_iommu_tlb_data[TME_STP222X_IOMMU_TLB_SIZE];
                    423: 
                    424:   /* the TSB address: */
                    425:   tme_uint64_t tme_stp222x_iommu_tsb;
                    426: 
                    427:   /* the TSB TLB: */
                    428:   struct tme_bus_tlb tme_stp222x_iommu_tsb_tlb;
                    429:   struct tme_token tme_stp222x_iommu_tsb_tlb_token;
                    430: 
                    431:   /* the TLB lists for the IOMMU: */
                    432:   struct tme_stp222x_tlb_list tme_stp222x_iommu_tlb_list_fixed;
                    433:   struct tme_stp222x_tlb_list tme_stp222x_iommu_tlb_list[TME_STP222X_IOMMU_TLB_SIZE];
                    434: 
                    435:   /* the IOMMU VA and compare registers: */
                    436:   tme_uint32_t tme_stp222x_iommu_va;
                    437:   tme_uint32_t tme_stp222x_iommu_compare;
                    438: 
                    439: #if TME_STP22XX_BUS_TRANSITION
                    440:   /* the token for a TLB entry that missed the IOMMU TLB: */
                    441:   struct tme_token *tme_stp222x_iommu_tlb_missed_token;
                    442: #endif /* TME_STP22XX_BUS_TRANSITION */
                    443: 
                    444:   /* the streaming caches: */
                    445:   struct tme_stp222x_stc tme_stp222x_stcs[TME_STP222X_STC_COUNT];
                    446: };
                    447: 
                    448: /* prototypes: */
                    449: 
                    450: /* the timer register handler: */
                    451: void tme_stp222x_timer_regs _TME_P((struct tme_stp222x *, struct tme_stp222x_reg *));
                    452: 
                    453: /* this initializes an stp222x timer: */
                    454: void tme_stp222x_timer_init _TME_P((struct tme_stp222x *, struct tme_stp222x_timer *));
                    455: 
                    456: /* this updates the interrupt concentrator: */
                    457: void tme_stp222x_mdu_intcon _TME_P((struct tme_stp222x *, tme_uint32_t, tme_uint32_t));
                    458: 
                    459: /* this receives an interrupt: */
                    460: void tme_stp222x_mdu_receive _TME_P((struct tme_stp222x *, tme_uint32_t));
                    461: 
                    462: /* this dispatches an interrupt: */
                    463: int tme_stp222x_mdu_dispatch _TME_P((struct tme_stp222x *));
                    464: 
                    465: /* the MDU IMR and retry register handler: */
                    466: void tme_stp222x_mdu_regs_imr_retry _TME_P((struct tme_stp222x *, struct tme_stp222x_reg *));
                    467: 
                    468: /* the MDU clear register handler: */
                    469: void tme_stp222x_mdu_regs_clear _TME_P((struct tme_stp222x *, struct tme_stp222x_reg *));
                    470: 
                    471: /* the MDU diagnostic register handler: */
                    472: void tme_stp222x_mdu_regs_diag _TME_P((struct tme_stp222x *, struct tme_stp222x_reg *));
                    473: 
                    474: /* this updates the IGN for the partial IMRs: */
                    475: void tme_stp222x_mdu_ign_update _TME_P((struct tme_stp222x *, tme_uint32_t));
                    476: 
                    477: /* this initializes the MDU: */
                    478: void tme_stp222x_mdu_init _TME_P((struct tme_stp222x *));
                    479: 
                    480: /* this handles an IOMMU bus cycle: */
                    481: void tme_stp222x_iommu_cycle _TME_P((struct tme_bus_connection *, struct tme_bus_cycle *, tme_uint32_t *, struct tme_completion *));
                    482: 
                    483: /* this fills a TLB entry from the IOMMU: */
                    484: void tme_stp222x_iommu_tlb_fill _TME_P((struct tme_bus_connection *, struct tme_bus_tlb *, tme_bus_addr_t, unsigned int));
                    485: 
                    486: /* the IOMMU register handler: */
                    487: void tme_stp222x_iommu_regs _TME_P((struct tme_stp222x *, struct tme_stp222x_reg *));
                    488: 
                    489: /* the IOMMU diagnostic register handler: */
                    490: void tme_stp222x_iommu_regs_diag _TME_P((struct tme_stp222x *, struct tme_stp222x_reg *));
                    491: 
                    492: /* this initializes the IOMMU: */
                    493: void tme_stp222x_iommu_init _TME_P((struct tme_stp222x *));
                    494: 
                    495: /* this flushes a streaming cache: */
                    496: int tme_stp222x_stc_flush _TME_P((struct tme_stp222x *));
                    497: 
                    498: /* the STC register handler: */
                    499: void tme_stp222x_stc_regs _TME_P((struct tme_stp222x *, unsigned long, struct tme_stp222x_reg *));
                    500: 
                    501: /* the STC diagnostic register handler: */
                    502: void tme_stp222x_stc_regs_diag _TME_P((struct tme_stp222x *, unsigned long, struct tme_stp222x_reg *));
                    503: 
                    504: /* this initializes a streaming cache: */
                    505: void tme_stp222x_stc_init _TME_P((struct tme_stp222x_stc *));
                    506: 
                    507: /* these search address ranges for an address: */
                    508: tme_uint32_t tme_stp222x_asearch32 _TME_P((const struct tme_stp222x_arange *, tme_uint32_t, tme_bus_addr32_t));
                    509: tme_uint32_t tme_stp222x_asearch64 _TME_P((const struct tme_stp222x_arange *, tme_uint32_t, tme_bus_addr64_t));
                    510: 
                    511: /* this searches an address space: */
                    512: tme_uint32_t tme_stp222x_aspace_search _TME_P((const struct tme_stp222x_aspace *, tme_bus_addr64_t));
                    513: 
                    514: /* this rebuilds the address spaces: */
                    515: int tme_stp222x_aspaces_rebuild _TME_P((struct tme_stp222x *));
                    516: 
                    517: /* this looks up the slave connection for an address in a space, and
                    518:    adjusts the address to be slave-relative: */
                    519: tme_uint32_t tme_stp222x_aspace_lookup _TME_P((const struct tme_stp222x *, unsigned int, tme_bus_addr64_t *));
                    520: 
                    521: #endif /* !_STP222X_IMPL_H */

unix.superglobalmegacorp.com

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