|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.