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

1.1     ! root        1: /* $Id: stp22xx-impl.h,v 1.2 2009/08/29 21:17:06 fredette Exp $ */
        !             2: 
        !             3: /* ic/stp22xx/stp22xx-impl.h - implementation header file for STP2200,
        !             4:    STP2202, STP2220, 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 _STP22XX_IMPL_H
        !            38: #define _STP22XX_IMPL_H
        !            39: 
        !            40: #include <tme/common.h>
        !            41: _TME_RCSID("$Id: stp22xx-impl.h,v 1.2 2009/08/29 21:17:06 fredette Exp $");
        !            42: 
        !            43: /* includes: */
        !            44: #include <tme/completion.h>
        !            45: #include <tme/bus/upa.h>
        !            46: 
        !            47: /* macros: */
        !            48: 
        !            49: /* this macro wraps code used during the transition to the new bus
        !            50:    interface.  the new bus interface will remove everything from
        !            51:    struct tme_bus_tlb starting with the tme_bus_tlb_cycles_ok member
        !            52:    until the end.  this will remove all slow cycle information from a
        !            53:    TLB, so TLB filling will only give fast read and write information.
        !            54: 
        !            55:    every bus connection will then have a slow cycle function.  when a
        !            56:    master needs to do a slow cycle, through its bus connection it will
        !            57:    arbitrate for the bus and then start its cycle.  the bus
        !            58:    implementation will steer the cycle towards the slave, which may be
        !            59:    across a bridge and over another bus, etc.  slow bus cycles will
        !            60:    then follow the actual path from master to slave, with bus
        !            61:    implementations ordering bus access and cycles as needed.
        !            62: 
        !            63:    this seems better than the old interface, where masters called
        !            64:    directly into slaves through function pointers in a TLB.  in the
        !            65:    old interface, buses couldn't enforce any ordering, because they
        !            66:    weren't involved.  this created the risk that a master in the
        !            67:    middle of running a bus cycle could be called as a slave over the
        !            68:    same bus connection.  real devices never have to face that, and
        !            69:    without eliminating that here, turning on preemptive threading
        !            70:    seems impossible.
        !            71: 
        !            72:    the new cycle function in a bus connection will take the bus
        !            73:    connection, the struct tme_bus_cycle *, a struct tme_completion *,
        !            74:    and a pointer to a mask of cycle types that can be done fast.  as
        !            75:    the slow bus cycle makes its way from master to slave, if any point
        !            76:    along that path can't allow fast reads or writes, those bits are
        !            77:    cleared from the mask.  when the slow cycle completes, if the
        !            78:    master finds that any cycles can be done fast again, it may choose
        !            79:    to fill a TLB entry again to get the new fast cycle information.
        !            80:    this frees slaves from having to track filled TLBs that weren't
        !            81:    filled with any fast cycle information, just so they can be
        !            82:    invalidated when addresses become fast-capable to make sure that
        !            83:    masters refill them.
        !            84: 
        !            85:    eventually, all of the code wrapped by this macro will be
        !            86:    removed: */
        !            87: #define TME_STP22XX_BUS_TRANSITION             (TRUE)
        !            88: 
        !            89: /* the maximum number of completions: */
        !            90: #define TME_STP22XX_COMPLETIONS_MAX            (2)
        !            91: 
        !            92: /* the maximum number of delayed completions: */
        !            93: #define TME_STP22XX_COMPLETIONS_DELAYED_MAX    (2)
        !            94: 
        !            95: /* condition states: */
        !            96: #define TME_STP22XX_COND_STATE_IDLE            (0)
        !            97: #define TME_STP22XX_COND_STATE_RUNNING         (1)
        !            98: #define TME_STP22XX_COND_STATE_WAITING         (2)
        !            99: #define TME_STP22XX_COND_STATE_NOTIFIED                (3)
        !           100: 
        !           101: /* types: */
        !           102: struct tme_stp22xx;
        !           103: 
        !           104: /* a completion handler: */
        !           105: typedef void (*_tme_stp22xx_completion_handler_t) _TME_P((struct tme_stp22xx *, struct tme_completion *, void *));
        !           106: 
        !           107: /* a condition: */
        !           108: struct tme_stp22xx_cond {
        !           109:   int tme_stp22xx_cond_state;
        !           110:   tme_cond_t tme_stp22xx_cond_cond;
        !           111: };
        !           112: 
        !           113: /* a connection: */
        !           114: union tme_stp22xx_conn {
        !           115:   struct tme_bus_connection *tme_stp22xx_conn_bus;
        !           116:   struct tme_upa_bus_connection *tme_stp22xx_conn_upa;
        !           117: };
        !           118: 
        !           119: /* the device: */
        !           120: struct tme_stp22xx {
        !           121:   
        !           122:   /* backpointer to the device's element: */
        !           123:   struct tme_element *tme_stp22xx_element;
        !           124: 
        !           125:   /* the mutex protecting the device: */
        !           126:   tme_mutex_t tme_stp22xx_mutex;
        !           127: 
        !           128:   /* the size of the part-specific structure: */
        !           129:   unsigned long tme_stp22xx_sizeof;
        !           130: 
        !           131:   /* this is nonzero if the run function is running: */
        !           132:   int tme_stp22xx_running;
        !           133: 
        !           134:   /* the run function: */
        !           135:   void (*tme_stp22xx_run) _TME_P((struct tme_stp22xx *));
        !           136: 
        !           137:   /* our completions: */
        !           138:   struct tme_completion tme_stp22xx_completions[TME_STP22XX_COMPLETIONS_MAX];
        !           139:   _tme_stp22xx_completion_handler_t tme_stp22xx_completion_handlers[TME_STP22XX_COMPLETIONS_MAX];
        !           140:   void * tme_stp22xx_completion_args[TME_STP22XX_COMPLETIONS_MAX];
        !           141: 
        !           142:   /* any delayed completions: */
        !           143:   /* NB: this array is always NULL-terminated: */
        !           144:   struct tme_completion *tme_stp22xx_completions_delayed[TME_STP22XX_COMPLETIONS_DELAYED_MAX + 1];
        !           145: 
        !           146:   /* the undefined connection index: */
        !           147:   tme_uint32_t tme_stp22xx_conn_index_null;
        !           148: 
        !           149:   /* any pending master connection index: */
        !           150:   tme_uint32_t tme_stp22xx_master_conn_index_pending;
        !           151: 
        !           152:   /* any current master connection index and its completion: */
        !           153:   tme_uint32_t tme_stp22xx_master_conn_index;
        !           154:   struct tme_completion **tme_stp22xx_master_completion;
        !           155: 
        !           156: #if TME_STP22XX_BUS_TRANSITION
        !           157:   /* the token for filling TLB entries for slave cycles: */
        !           158:   struct tme_token tme_stp22xx_slave_cycle_tlb_token;
        !           159: #endif /* TME_STP22XX_BUS_TRANSITION */
        !           160: 
        !           161:   /* any current slave connection: */
        !           162:   struct tme_bus_connection *tme_stp22xx_slave_conn_bus;
        !           163: 
        !           164:   /* the connections: */
        !           165:   /* NB: this must be the last member of this structure; the
        !           166:      part-specific structure allocates enough space for its real
        !           167:      size: */
        !           168:   union tme_stp22xx_conn tme_stp22xx_conns[1];
        !           169: };
        !           170: 
        !           171: /* prototypes: */
        !           172: 
        !           173: /* this busies a generic bus connection: */
        !           174: struct tme_bus_connection *tme_stp22xx_busy_bus _TME_P((struct tme_stp22xx *, tme_uint32_t));
        !           175: 
        !           176: /* this unbusies a generic bus connection: */
        !           177: void tme_stp22xx_unbusy_bus _TME_P((struct tme_stp22xx *, struct tme_bus_connection *));
        !           178: 
        !           179: /* this busies a slave generic bus connection: */
        !           180: struct tme_bus_connection *tme_stp22xx_slave_busy_bus _TME_P((struct tme_stp22xx *, tme_uint32_t));
        !           181: 
        !           182: /* this unbusies a slave generic bus connection: */
        !           183: void tme_stp22xx_slave_unbusy _TME_P((struct tme_stp22xx *));
        !           184: 
        !           185: /* this enters: */
        !           186: struct tme_stp22xx *tme_stp22xx_enter _TME_P((struct tme_stp22xx *));
        !           187: 
        !           188: /* this enters as the bus master: */
        !           189: struct tme_stp22xx *tme_stp22xx_enter_master _TME_P((struct tme_bus_connection *));
        !           190: 
        !           191: /* this leaves: */
        !           192: void tme_stp22xx_leave _TME_P((struct tme_stp22xx *));
        !           193: 
        !           194: /* this waits on a condition, with an optional sleep time: */
        !           195: void tme_stp22xx_cond_sleep_yield _TME_P((struct tme_stp22xx *, struct tme_stp22xx_cond *, const struct timeval *));
        !           196: 
        !           197: /* this validates a completion: */
        !           198: void tme_stp22xx_completion_validate _TME_P((struct tme_stp22xx *, struct tme_completion *));
        !           199: 
        !           200: /* this allocates a completion: */
        !           201: struct tme_completion *tme_stp22xx_completion_alloc _TME_P((struct tme_stp22xx *, _tme_stp22xx_completion_handler_t, void *));
        !           202: 
        !           203: /* this calls out a bus signal to a connection: */
        !           204: void tme_stp22xx_callout_signal _TME_P((struct tme_stp22xx *, tme_uint32_t, unsigned int, _tme_stp22xx_completion_handler_t));
        !           205: 
        !           206: /* this completes a bus grant: */
        !           207: void tme_stp22xx_complete_bg _TME_P((struct tme_stp22xx *, struct tme_completion *, void *));
        !           208: 
        !           209: /* this completes a bus operation between master and slave: */
        !           210: void tme_stp22xx_complete_master _TME_P((struct tme_stp22xx *, struct tme_completion *, void *));
        !           211: 
        !           212: /* this is a no-op completion: */
        !           213: void tme_stp22xx_complete_nop _TME_P((struct tme_stp22xx *, struct tme_completion *, void *));
        !           214: 
        !           215: /* this runs a slave bus cycle: */
        !           216: void tme_stp22xx_slave_cycle _TME_P((struct tme_bus_connection *, tme_uint32_t, struct tme_bus_cycle *,        tme_uint32_t *, struct tme_completion **));
        !           217: 
        !           218: /* this fills a TLB entry: */
        !           219: void tme_stp22xx_tlb_fill _TME_P((struct tme_bus_connection *, struct tme_bus_tlb *, tme_uint32_t, tme_bus_addr64_t, unsigned int));
        !           220: 
        !           221: /* this adds a TLB set: */
        !           222: void tme_stp22xx_tlb_set_add _TME_P((struct tme_bus_connection *, struct tme_bus_tlb_set_info *, struct tme_completion *));
        !           223: 
        !           224: #if TME_STP22XX_BUS_TRANSITION
        !           225: 
        !           226: /* this is the bus TLB set add transition glue: */
        !           227: int tme_stp22xx_tlb_set_add_transition _TME_P((struct tme_bus_connection *, struct tme_bus_tlb_set_info *));
        !           228: #define tme_stp22xx_tlb_set_add tme_stp22xx_tlb_set_add_transition
        !           229: 
        !           230: #endif /* TME_STP22XX_BUS_TRANSITION */
        !           231: 
        !           232: /* this notifies a condition: */
        !           233: void tme_stp22xx_cond_notify _TME_P((struct tme_stp22xx_cond *));
        !           234: 
        !           235: /* this initializes a condition: */
        !           236: void tme_stp22xx_cond_init _TME_P((struct tme_stp22xx_cond *));
        !           237: 
        !           238: /* this initializes an stp22xx: */
        !           239: void tme_stp22xx_init _TME_P((struct tme_stp22xx *, unsigned long, tme_uint32_t));
        !           240: 
        !           241: #endif /* !_STP22XX_IMPL_H */

unix.superglobalmegacorp.com

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