Annotation of 43BSDReno/sys/vaxuba/qd_data.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     @(#)qd_data.c   1.16    (ULTRIX)        7/2/86
        !             3:  */
        !             4: 
        !             5: /************************************************************************
        !             6:  *                                                                     *
        !             7:  *                     Copyright (c) 1985, 1986 by                     *
        !             8:  *             Digital Equipment Corporation, Maynard, MA              *
        !             9:  *                     All rights reserved.                            *
        !            10:  *                                                                     *
        !            11:  *   This software is furnished under a license and may be used and    *
        !            12:  *   copied  only  in accordance with the terms of such license and    *
        !            13:  *   with the  inclusion  of  the  above  copyright  notice.   This    *
        !            14:  *   software  or  any other copies thereof may not be provided or     *
        !            15:  *   otherwise made available to any other person.  No title to and    *
        !            16:  *   ownership of the software is hereby transferred.                  *
        !            17:  *                                                                     *
        !            18:  *   The information in this software is subject to change  without    *
        !            19:  *   notice  and should not be construed as a commitment by Digital    *
        !            20:  *   Equipment Corporation.                                            *
        !            21:  *                                                                     *
        !            22:  *   Digital assumes no responsibility for the use  or reliability     *
        !            23:  *   of its software on equipment which is not supplied by Digital.    *
        !            24:  *                                                                     *
        !            25:  ************************************************************************/
        !            26: 
        !            27: /*
        !            28:  * qd_data.c
        !            29:  *
        !            30:  * Modification history
        !            31:  *
        !            32:  * QDSS data file
        !            33:  *
        !            34:  *  3-Jul-85 - longo
        !            35:  *
        !            36:  *     Created file.
        !            37:  *
        !            38:  * 15-Jul-85 - longo
        !            39:  *
        !            40:  *     Added "qdfont.h" include and moved "mouse_report" struct
        !            41:  *     and definitions in from "qduser.h".
        !            42:  *
        !            43:  * 18-Aug-85 - longo
        !            44:  *
        !            45:  *     Added "duart_imask" entry to qdflags for shadowing.
        !            46:  *
        !            47:  *  4-Sep-85 - longo
        !            48:  *
        !            49:  *     Added storage "QBAreg[]" for DMA support.
        !            50:  *
        !            51:  * 11-Sep-85 - longo
        !            52:  *
        !            53:  *     Added constant for event buffer size (now 1k).
        !            54:  *
        !            55:  * 17-Sep-85 - longo
        !            56:  *
        !            57:  *     Changes for DMA support.
        !            58:  *
        !            59:  * 18-Sep-85 - longo
        !            60:  *
        !            61:  *     Changes for scroll interrupt support.
        !            62:  *
        !            63:  *  2-Oct-85 - longo
        !            64:  *
        !            65:  *     Added color map write buffer shared RAM stuff and adder
        !            66:  *     interrupt enable register shadowing to qdflags.
        !            67:  *
        !            68:  *  4-Oct-85 - longo
        !            69:  *
        !            70:  *     Added kernel loop back state flag to qdflags.
        !            71:  *
        !            72:  * 16-Oct-85 - longo
        !            73:  *
        !            74:  *     Added "pntr_id" entry to qdflags struct.
        !            75:  *
        !            76:  * 22-Oct-85 - longo
        !            77:  *
        !            78:  *     Added buf structures for use by driver strategy routines.
        !            79:  *
        !            80:  * 23-Oct-85 - longo
        !            81:  *
        !            82:  *     Added "user_dma" entry to qdflag structure.
        !            83:  *
        !            84:  *  8-Nov-85 - longo
        !            85:  *
        !            86:  *     Added "selmask" entry to qdflags structure.
        !            87:  *
        !            88:  * 11-Nov-85 - longo
        !            89:  *
        !            90:  *     Changed "_vs_eventqueue" struct references to "qdinput".
        !            91:  *
        !            92:  * 25-Nov-85 - longo
        !            93:  *
        !            94:  *     Added "one_only" lock switch for single process access.
        !            95:  *
        !            96:  * 18-Mar-86 - jaw
        !            97:  *
        !            98:  *     Add routines to cpu switch for nexus/unibus addreses.
        !            99:  *     Also got rid of some globals like nexnum.
        !           100:  *     ka8800 cleanup.
        !           101:  *
        !           102:  * 19-Mar-86 - ricky palmer
        !           103:  *
        !           104:  *     Added "devio.h" to include list. V2.0
        !           105:  *
        !           106:  * 02-Jul-86 -  Brian Stevens
        !           107:  *
        !           108:  *     Added cursor structure for each display
        !           109:  *
        !           110:  */
        !           111: 
        !           112: #include "qd.h"        /* # of QDSS's the system is configured for */
        !           113: 
        !           114: #include "../vax/pte.h"        /* page table values */
        !           115: #include "../vax/mtpr.h"       /* VAX register access stuff */
        !           116: 
        !           117: #include "../sys/param.h"      /* general system params & macros */
        !           118: #include "../sys/conf.h"       /* "linesw" tty driver dispatch */
        !           119: #include "../sys/user.h"       /* user structure (what else?) */
        !           120: #include "qdioctl.h"           /* ioctl call values */
        !           121: #include "../sys/tty.h"
        !           122: #include "../sys/map.h"                /* resource allocation map struct */
        !           123: #include "../sys/buf.h"                /* buf structs */
        !           124: #include "../sys/vm.h"         /* includes 'vm' header files */
        !           125: #include "../sys/clist.h"      /* char list handling structs */
        !           126: #include "../sys/file.h"       /* file I/O definitions */
        !           127: #include "../sys/uio.h"                /* write/read call structs */
        !           128: #include "../sys/kernel.h"     /* clock handling structs */
        !           129: #include "../vax/cpu.h"        /* per cpu (pcpu) struct */
        !           130: 
        !           131: #include "../vaxuba/ubareg.h"  /* uba & 'qba' register structs */
        !           132: #include "../vaxuba/ubavar.h"  /* uba structs & uba map externs */
        !           133: 
        !           134: #include "qduser.h"    /* definitions shared with my client */
        !           135: #include "qdreg.h"     /* QDSS device register structures */
        !           136: 
        !           137: /*-----------------------------------------------------------
        !           138: * QDSS driver status flags for tracking operational state */
        !           139: 
        !           140:        struct qdflags {
        !           141: 
        !           142:            u_int inuse;            /* which minor dev's are in use now */
        !           143:            u_int config;           /* I/O page register content */
        !           144:            u_int mapped;           /* user mapping status word */
        !           145:            u_int kernel_loop;      /* if kernel console is redirected */
        !           146:            u_int user_dma;         /* DMA from user space in progress */
        !           147:            u_short pntr_id;        /* type code of pointing device */
        !           148:            u_short duart_imask;    /* shadowing for duart intrpt mask reg */
        !           149:            u_short adder_ie;       /* shadowing for adder intrpt enbl reg */
        !           150:            u_short curs_acc;       /* cursor acceleration factor */
        !           151:            u_short curs_thr;       /* cursor acceleration threshold level */
        !           152:            u_short tab_res;        /* tablet resolution factor */
        !           153:            u_short selmask;        /* mask for active qd select entries */
        !           154:        };
        !           155: 
        !           156:        /* bit definitions for "inuse" entry  */
        !           157: 
        !           158: #define CONS_DEV       0x01
        !           159: #define ALTCONS_DEV    0x02
        !           160: #define GRAPHIC_DEV    0x04
        !           161: 
        !           162:        /* bit definitions for 'mapped' member of flag structure */
        !           163: 
        !           164: #define MAPDEV         0x01            /* hardware is mapped */
        !           165: #define MAPDMA         0x02            /* DMA buffer mapped */
        !           166: #define MAPEQ          0x04            /* event queue buffer mapped */
        !           167: #define MAPSCR         0x08            /* scroll param area mapped */
        !           168: #define MAPCOLOR       0x10            /* color map writing buffer mapped */
        !           169: 
        !           170:        /* bit definitions for 'selmask' member of qdflag structure */
        !           171: 
        !           172: #define SEL_READ       0x01            /* read select is active */
        !           173: #define SEL_WRITE      0x02            /* write select is active */
        !           174: 
        !           175: /*----------------------------------------------
        !           176: * constants used in shared memory operations */
        !           177: 
        !           178: #define EVENT_BUFSIZE  1024    /* # of bytes per device's event buffer */
        !           179: 
        !           180: #define MAXEVENTS  ( (EVENT_BUFSIZE - sizeof(struct qdinput))   \
        !           181:                     / sizeof(struct _vs_event) )
        !           182: 
        !           183: #define DMA_BUFSIZ     (1024 * 3)
        !           184: 
        !           185: #define COLOR_BUFSIZ  ((sizeof(struct color_buf) + 512) & ~0x01FF)
        !           186: 
        !           187: /*******************************************************************/
        !           188: 
        !           189: #ifdef BINARY
        !           190: 
        !           191:        extern struct uba_device *qdinfo[];  /* array of pntrs to each QDSS */
        !           192:                                             /* uba structure  */
        !           193:        extern struct tty qd_tty[];
        !           194: 
        !           195:        extern struct qd_softc qd_softc[];
        !           196: 
        !           197: /*----------------------------------------------------------
        !           198: * static storage used by multiple functions in this code  */
        !           199: 
        !           200:        extern int Qbus_unmap[];          /* Qbus mapper release key */
        !           201:        extern struct qdflags qdflags[];  /* QDSS device status flags */
        !           202:        extern struct qdmap qdmap[];      /* QDSS register map structure */
        !           203:        extern caddr_t qdbase[];          /* base address of each QDSS unit */
        !           204:        extern struct buf qdbuf[];        /* buf structs used by strategy */
        !           205:        extern char one_only[];           /* lock for single process access */
        !           206: 
        !           207: /*-----------------------------
        !           208: * shared memory allocation  */
        !           209: 
        !           210:        extern char event_shared[];              /* reserve event buf space */
        !           211:        extern struct qdinput *eq_header[];      /* event buf header ptrs */
        !           212: 
        !           213:        extern char DMA_shared[];                 /* reserve DMA buf space */
        !           214:        extern struct DMAreq_header *DMAheader[]; /* DMA buf header ptrs */
        !           215: 
        !           216:        extern char scroll_shared[];    /* reserve space for scroll structs */
        !           217:        extern struct scroll *scroll[]; /* pointers to scroll structures */
        !           218: 
        !           219:        extern char color_shared[];           /* reserve space: color bufs */
        !           220:        extern struct color_buf *color_buf[]; /* pointers to color bufs */
        !           221: 
        !           222: /*--------------------------------
        !           223: * mouse input event structures */
        !           224: 
        !           225:        extern struct mouse_report last_rep[];
        !           226:        extern struct mouse_report current_rep[];
        !           227: 
        !           228: /*----------------------------
        !           229: * input event "select" use */
        !           230: 
        !           231:        extern struct proc *rsel[];     /* process waiting for select */
        !           232: 
        !           233:        extern int DMAbuf_size;
        !           234: 
        !           235: /*----------------------------
        !           236: * console cursor structure */
        !           237: 
        !           238:        struct _vs_cursor cursor[];
        !           239: 
        !           240: 
        !           241: /*********************************************************************/
        !           242: 
        !           243: #else
        !           244: 
        !           245: /*--------------------------------------------------------------------------
        !           246: * reference to an array of "uba_device" structures built by the auto
        !           247: * configuration program.  The uba_device structure decribes the device
        !           248: * sufficiently for the driver to talk to it.  The auto configuration code
        !           249: * fills in the uba_device structures (located in ioconf.c) from user
        !           250: * maintained info.  */
        !           251: 
        !           252:        struct uba_device *qdinfo[NQD];  /* array of pntrs to each QDSS's */
        !           253:                                         /* uba structures  */
        !           254:        struct tty qd_tty[NQD*4];       /* teletype structures for each.. */
        !           255:                                        /* ..possible minor device */
        !           256: 
        !           257:        struct qd_softc qd_softc[NQD];
        !           258: 
        !           259: /*----------------------------------------------------------
        !           260: * static storage used by multiple functions in this code  */
        !           261: 
        !           262:        int Qbus_unmap[NQD];            /* Qbus mapper release code */
        !           263:        struct qdflags qdflags[NQD];    /* QDSS device status flags */
        !           264:        struct qdmap qdmap[NQD];        /* QDSS register map structure */
        !           265:        caddr_t qdbase[NQD];            /* base address of each QDSS unit */
        !           266:        struct buf qdbuf[NQD];          /* buf structs used by strategy */
        !           267:        char one_only[NQD];             /* lock for single process access */
        !           268: 
        !           269: /*------------------------------------------------------------------------
        !           270: * the array "event_shared[]" is made up of a number of event queue buffers
        !           271: * equal to the number of QDSS's configured into the running kernel (NQD).
        !           272: * Each event queue buffer begins with an event queue header (struct qdinput)
        !           273: * followed by a group of event queue entries (struct _vs_event).  The array
        !           274: * "*eq_header[]" is an array of pointers to the start of each event queue
        !           275: * buffer in "event_shared[]".  */
        !           276: 
        !           277: #define EQSIZE ((EVENT_BUFSIZE * NQD) + 512)
        !           278: 
        !           279:        char event_shared[EQSIZE];          /* reserve space for event bufs */
        !           280:        struct qdinput *eq_header[NQD];     /* event queue header pntrs */
        !           281: 
        !           282: /*--------------------------------------------------------------------------
        !           283: * This allocation method reserves enough memory pages for NQD shared DMA I/O
        !           284: * buffers.  Each buffer must consume an integral number of memory pages to
        !           285: * guarantee that a following buffer will begin on a page boundary.  Also,
        !           286: * enough space is allocated so that the FIRST I/O buffer can start at the
        !           287: * 1st page boundary after "&DMA_shared".  Page boundaries are used so that
        !           288: * memory protections can be turned on/off for individual buffers. */
        !           289: 
        !           290: #define IOBUFSIZE  ((DMA_BUFSIZ * NQD) + 512)
        !           291: 
        !           292:        char DMA_shared[IOBUFSIZE];         /* reserve I/O buffer space */
        !           293:        struct DMAreq_header *DMAheader[NQD];  /* DMA buffer header pntrs */
        !           294: 
        !           295: /*-------------------------------------------------------------------------
        !           296: * The driver assists a client in scroll operations by loading dragon
        !           297: * registers from an interrupt service routine. The loading is done using
        !           298: * parameters found in memory shrade between the driver and it's client.
        !           299: * The scroll parameter structures are ALL loacted in the same memory page
        !           300: * for reasons of memory economy.  */
        !           301: 
        !           302:        char scroll_shared[2 * 512];    /* reserve space for scroll structs */
        !           303:        struct scroll *scroll[NQD];     /* pointers to scroll structures */
        !           304: 
        !           305: /*-----------------------------------------------------------------------
        !           306: * the driver is programmable to provide the user with color map write
        !           307: * services at VSYNC interrupt time.  At interrupt time the driver loads
        !           308: * the color map with any user-requested load data found in shared memory */
        !           309: 
        !           310: #define COLOR_SHARED  ((COLOR_BUFSIZ * NQD) + 512)
        !           311: 
        !           312:        char color_shared[COLOR_SHARED];      /* reserve space: color bufs */
        !           313:        struct color_buf *color_buf[NQD];     /* pointers to color bufs */
        !           314: 
        !           315: /*--------------------------------
        !           316: * mouse input event structures */
        !           317: 
        !           318:        struct mouse_report last_rep[NQD];
        !           319:        struct mouse_report current_rep[NQD];
        !           320: 
        !           321: /*----------------------------
        !           322: * input event "select" use */
        !           323: 
        !           324:        struct proc *rsel[NQD];         /* process waiting for select */
        !           325: 
        !           326: /*----------------------------
        !           327: * console cursor structure */
        !           328: 
        !           329:        struct _vs_cursor cursor[NQD];
        !           330: 
        !           331: 
        !           332: /************************************************************************/
        !           333: 
        !           334:        int nNQD = NQD;
        !           335: 
        !           336:        int DMAbuf_size = DMA_BUFSIZ;
        !           337: 
        !           338: #endif
        !           339: 
        !           340: 

unix.superglobalmegacorp.com

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