root/dev/sbus/cgsixreg.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: cgsixreg.h,v 1.9 2006/06/02 20:00:56 miod Exp $       */
    2 
    3 /*
    4  * Copyright (c) 2002 Jason L. Wright (jason@thought.net)
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   19  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
   20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   22  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   24  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
   25  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   26  * POSSIBILITY OF SUCH DAMAGE.
   27  */
   28 
   29 union bt_cmap {
   30         u_int8_t cm_map[256][3];        /* 256 r/b/g entries */
   31         u_int32_t cm_chip[256 * 3 / 4]; /* the way the chip is loaded */
   32 };
   33 
   34 #define BT_ADDR         0x00            /* map address register */
   35 #define BT_CMAP         0x04            /* colormap data register */
   36 #define BT_CTRL         0x08            /* control register */
   37 #define BT_OMAP         0x0c            /* overlay (cursor) map register */
   38 
   39 #define BT_D4M3(x)      ((((x) >> 2) << 1) + ((x) >> 2)) /* (x / 4) * 3 */
   40 #define BT_D4M4(x)      ((x) & ~3)                       /* (x / 4) * 4 */
   41 
   42 #define CGSIX_ROM_OFFSET        0x000000
   43 #define CGSIX_BT_OFFSET         0x200000
   44 #define CGSIX_BT_SIZE           (sizeof(u_int32_t) * 4)
   45 #define CGSIX_DHC_OFFSET        0x240000
   46 #define CGSIX_ALT_OFFSET        0x280000
   47 #define CGSIX_FHC_OFFSET        0x300000
   48 #define CGSIX_FHC_SIZE          (sizeof(u_int32_t) * 1)
   49 #define CGSIX_THC_OFFSET        0x301000
   50 #define CGSIX_THC_SIZE          (sizeof(u_int32_t) * 640)
   51 #define CGSIX_FBC_OFFSET        0x700000
   52 #define CGSIX_FBC_SIZE          0x1000
   53 #define CGSIX_TEC_OFFSET        0x701000
   54 #define CGSIX_TEC_SIZE          (sizeof(u_int32_t) * 3)
   55 #define CGSIX_VID_OFFSET        0x800000
   56 #define CGSIX_VID_SIZE          (1024 * 1024)
   57 
   58 #define CG6_FHC                 0x0             /* fhc register */
   59 
   60 #define FHC_FBID_MASK           0xff000000      /* frame buffer id */
   61 #define FHC_FBID_SHIFT          24
   62 #define FHC_REV_MASK            0x00f00000      /* revision */
   63 #define FHC_REV_SHIFT           20
   64 #define FHC_FROP_DISABLE        0x00080000      /* disable fast rasterop */
   65 #define FHC_ROW_DISABLE         0x00040000      /* ??? */
   66 #define FHC_SRC_DISABLE         0x00020000      /* ??? */
   67 #define FHC_DST_DISABLE         0x00010000      /* disable dst cache */
   68 #define FHC_RESET               0x00008000      /* ??? */
   69 #define FHC_LEBO                0x00002000      /* set little endian order */
   70 #define FHC_RES_MASK            0x00001800      /* resolution: */
   71 #define FHC_RES_1024            0x00000000      /*  1024x768 */
   72 #define FHC_RES_1152            0x00000800      /*  1152x900 */
   73 #define FHC_RES_1280            0x00001000      /*  1280x1024 */
   74 #define FHC_RES_1600            0x00001800      /*  1600x1200 */
   75 #define FHC_CPU_MASK            0x00000600      /* cpu type: */
   76 #define FHC_CPU_SPARC           0x00000000      /*  sparc */
   77 #define FHC_CPU_68020           0x00000200      /*  68020 */
   78 #define FHC_CPU_386             0x00000400      /*  i386 */
   79 #define FHC_TEST                0x00000100      /* test window */
   80 #define FHC_TESTX_MASK          0x000000f0      /* test window X */
   81 #define FHC_TESTX_SHIFT         4
   82 #define FHC_TESTY_MASK          0x0000000f      /* test window Y */
   83 #define FHC_TESTY_SHIFT         0
   84 
   85 #define CG6_FBC_MODE            0x004           /* mode setting */
   86 #define CG6_FBC_CLIP            0x008           /* ??? */
   87 #define CG6_FBC_S               0x010           /* global status */
   88 #define CG6_FBC_DRAW            0x014           /* drawing pipeline status */
   89 #define CG6_FBC_BLIT            0x018           /* blitter status */
   90 #define CG6_FBC_FONT            0x01c           /* font */
   91 #define CG6_FBC_X0              0x080           /* blitter, src llx */
   92 #define CG6_FBC_Y0              0x084           /* blitter, src lly */
   93 #define CG6_FBC_Z0              0x088           /* blitter, src llz */
   94 #define CB6_FBC_C0              0x08c           /* blitter, src llcolor */
   95 #define CG6_FBC_X1              0x090           /* blitter, src urx */
   96 #define CG6_FBC_Y1              0x094           /* blitter, src ury */
   97 #define CG6_FBC_Z1              0x098           /* blitter, src urz */
   98 #define CB6_FBC_C1              0x09c           /* blitter, src urcolor */
   99 #define CG6_FBC_X2              0x0a0           /* blitter, dst llx */
  100 #define CG6_FBC_Y2              0x0a4           /* blitter, dst lly */
  101 #define CG6_FBC_Z2              0x0a8           /* blitter, dst llz */
  102 #define CB6_FBC_C2              0x0ac           /* blitter, dst llcolor */
  103 #define CG6_FBC_X3              0x0b0           /* blitter, dst urx */
  104 #define CG6_FBC_Y3              0x0b4           /* blitter, dst ury */
  105 #define CG6_FBC_Z3              0x0b8           /* blitter, dst urz */
  106 #define CB6_FBC_C3              0x0bc           /* blitter, dst urcolor */
  107 #define CG6_FBC_OFFX            0x0c0           /* x offset for drawing */
  108 #define CG6_FBC_OFFY            0x0c4           /* y offset for drawing */
  109 #define CG6_FBC_INCX            0x0d0           /* x increment */
  110 #define CG6_FBC_INCY            0x0d4           /* y increment */
  111 #define CG6_FBC_CLIPMINX        0x0e0           /* clip rectangle llx */
  112 #define CG6_FBC_CLIPMINY        0x0e4           /* clip rectangle lly */
  113 #define CG6_FBC_CLIPMAXX        0x0f0           /* clip rectangle urx */
  114 #define CG6_FBC_CLIPMAXY        0x0f4           /* clip rectangle ury */
  115 #define CG6_FBC_FG              0x100           /* fg value for rop */
  116 #define CG6_FBC_BG              0x104           /* bg value for rop */
  117 #define CG6_FBC_ALU             0x108           /* operation */
  118 #define CG6_FBC_PM              0x10c           /* */
  119 #define CG6_FBC_PIXELM          0x110           /* */
  120 #define CG6_FBC_PATALIGN        0x11c           /* */
  121 #define CG6_FBC_PATTERN         0x120           /* 8 u_int32_t pattern */
  122 #define CG6_FBC_APOINTX         0x800           /* */
  123 #define CG6_FBC_APOINTY         0x804           /* */
  124 #define CG6_FBC_APOINTZ         0x808           /* */
  125 #define CG6_FBC_RPOINTX         0x810           /* */
  126 #define CG6_FBC_RPOINTY         0x814           /* */
  127 #define CG6_FBC_RPOINTZ         0x818           /* */
  128 #define CG6_FBC_POINTR          0x830           /* */
  129 #define CG6_FBC_POINTG          0x834           /* */
  130 #define CG6_FBC_POINTB          0x838           /* */
  131 #define CG6_FBC_POINTA          0x83c           /* */
  132 #define CG6_FBC_ALINEX          0x840           /* */
  133 #define CG6_FBC_ALINEY          0x844           /* */
  134 #define CG6_FBC_ALINEZ          0x848           /* */
  135 #define CG6_FBC_RLINEX          0x850           /* */
  136 #define CG6_FBC_RLINEY          0x854           /* */
  137 #define CG6_FBC_RLINEZ          0x858           /* */
  138 #define CG6_FBC_LINER           0x870           /* */
  139 #define CG6_FBC_LINEG           0x874           /* */
  140 #define CG6_FBC_LINEB           0x878           /* */
  141 #define CG6_FBC_LINEA           0x87c           /* */
  142 #define CG6_FBC_ATRIX           0x880           /* */
  143 #define CG6_FBC_ATRIY           0x884           /* */
  144 #define CG6_FBC_ATRIZ           0x888           /* */
  145 #define CG6_FBC_RTRIX           0x890           /* */
  146 #define CG6_FBC_RTRIY           0x894           /* */
  147 #define CG6_FBC_RTRIZ           0x898           /* */
  148 #define CG6_FBC_TRIR            0x8b0           /* */
  149 #define CG6_FBC_TRIG            0x8b4           /* */
  150 #define CG6_FBC_TRIB            0x8b8           /* */
  151 #define CG6_FBC_TRIA            0x8bc           /* */
  152 #define CG6_FBC_AQUADX          0x8c0           /* */
  153 #define CG6_FBC_AQUADY          0x8c4           /* */
  154 #define CG6_FBC_AQUADZ          0x8c8           /* */
  155 #define CG6_FBC_RQUADX          0x8d0           /* */
  156 #define CG6_FBC_RQUADY          0x8d4           /* */
  157 #define CG6_FBC_RQUADZ          0x8d8           /* */
  158 #define CG6_FBC_QUADR           0x8f0           /* */
  159 #define CG6_FBC_QUADG           0x8f4           /* */
  160 #define CG6_FBC_QUADB           0x8f8           /* */
  161 #define CG6_FBC_QUADA           0x8fc           /* */
  162 #define CG6_FBC_ARECTX          0x900           /* rectangle drawing, x coord */
  163 #define CG6_FBC_ARECTY          0x904           /* rectangle drawing, y coord */
  164 #define CG6_FBC_ARECTZ          0x908           /* rectangle drawing, z coord */
  165 #define CG6_FBC_RRECTX          0x910           /* */
  166 #define CG6_FBC_RRECTY          0x914           /* */
  167 #define CG6_FBC_RRECTZ          0x918           /* */
  168 #define CG6_FBC_RRECTR          0x930           /* */
  169 #define CG6_FBC_RRECTG          0x934           /* */
  170 #define CG6_FBC_RRECTB          0x938           /* */
  171 #define CG6_FBC_RRECTA          0x938           /* */
  172 
  173 #define FBC_MODE_VAL    (                                               \
  174           0x00200000 /* GX_BLIT_SRC */                                  \
  175         | 0x00020000 /* GX_MODE_COLOR8 */                               \
  176         | 0x00008000 /* GX_DRAW_RENDER */                               \
  177         | 0x00002000 /* GX_BWRITE0_ENABLE */                            \
  178         | 0x00001000 /* GX_BWRITE1_DISABLE */                           \
  179         | 0x00000200 /* GX_BREAD_0 */                                   \
  180         | 0x00000080 /* GX_BDISP_0 */                                   \
  181 )
  182 #define FBC_MODE_MASK   (                                               \
  183           0x00300000 /* GX_BLIT_ALL */                                  \
  184         | 0x00060000 /* GX_MODE_ALL */                                  \
  185         | 0x00018000 /* GX_DRAW_ALL */                                  \
  186         | 0x00006000 /* GX_BWRITE0_ALL */                               \
  187         | 0x00001800 /* GX_BWRITE1_ALL */                               \
  188         | 0x00000600 /* GX_BREAD_ALL */                                 \
  189         | 0x00000180 /* GX_BDISP_ALL */                                 \
  190 )
  191 
  192 #define FBC_S_GXINPROGRESS      0x10000000      /* drawing in progress */
  193 
  194 #define FBC_BLIT_UNKNOWN        0x80000000      /* ??? */
  195 #define FBC_BLIT_GXFULL         0x20000000      /* queue is full */
  196 
  197 #define FBC_DRAW_UNKNOWN        0x80000000      /* ??? */
  198 #define FBC_DRAW_GXFULL         0x20000000
  199 
  200 /* Value for the alu register for screen-to-screen copies */
  201 #define FBC_ALU_COPY    (                                               \
  202           0x80000000 /* GX_PLANE_ONES (ignore planemask register) */    \
  203         | 0x20000000 /* GX_PIXEL_ONES (ignore pixelmask register) */    \
  204         | 0x00800000 /* GX_ATTR_SUPP (function unknown) */              \
  205         | 0x00000000 /* GX_RAST_BOOL (function unknown) */              \
  206         | 0x00000000 /* GX_PLOT_PLOT (function unknown) */              \
  207         | 0x08000000 /* GX_PATTERN_ONES (ignore pattern) */             \
  208         | 0x01000000 /* GX_POLYG_OVERLAP (unsure - handle overlap?) */  \
  209         | 0x0000cccc /* ALU = src */                                    \
  210 )
  211 
  212 /* Value for the alu register for region fills */
  213 #define FBC_ALU_FILL    (                                               \
  214           0x80000000 /* GX_PLANE_ONES (ignore planemask register) */    \
  215         | 0x20000000 /* GX_PIXEL_ONES (ignore pixelmask register) */    \
  216         | 0x00800000 /* GX_ATTR_SUPP (function unknown) */              \
  217         | 0x00000000 /* GX_RAST_BOOL (function unknown) */              \
  218         | 0x00000000 /* GX_PLOT_PLOT (function unknown) */              \
  219         | 0x08000000 /* GX_PATTERN_ONES (ignore pattern) */             \
  220         | 0x01000000 /* GX_POLYG_OVERLAP (unsure - handle overlap?) */  \
  221         | 0x0000ff00 /* ALU = fg color */                               \
  222 )
  223 
  224 /* Value for the alu register for toggling an area */
  225 #define FBC_ALU_FLIP    (                                               \
  226           0x80000000 /* GX_PLANE_ONES (ignore planemask register) */    \
  227         | 0x20000000 /* GX_PIXEL_ONES (ignore pixelmask register) */    \
  228         | 0x00800000 /* GX_ATTR_SUPP (function unknown) */              \
  229         | 0x00000000 /* GX_RAST_BOOL (function unknown) */              \
  230         | 0x00000000 /* GX_PLOT_PLOT (function unknown) */              \
  231         | 0x08000000 /* GX_PATTERN_ONES (ignore pattern) */             \
  232         | 0x01000000 /* GX_POLYG_OVERLAP (unsure - handle overlap?) */  \
  233         | 0x00005555 /* ALU = ~dst */                                   \
  234 )
  235 
  236 #define CG6_TEC_MV              0x0             /* matrix stuff */
  237 #define CG6_TEC_CLIP            0x4             /* clipping stuff */
  238 #define CG6_TEC_VDC             0x8             /* ??? */
  239 
  240 #define CG6_THC_HSYNC1          0x800           /* horizontal sync timing */
  241 #define CG6_THC_HSYNC2          0x804           /* more hsync timing */
  242 #define CG6_THC_HSYNC3          0x808           /* yet more hsync timing */
  243 #define CG6_THC_VSYNC1          0x80c           /* vertical sync timing */
  244 #define CG6_THC_VSYNC2          0x810           /* only two of these */
  245 #define CG6_THC_REFRESH         0x814           /* refresh counter */
  246 #define CG6_THC_MISC            0x818           /* misc control/status */
  247 #define CG6_THC_CURSXY          0x8fc           /* cursor x/y, 16 bit each */
  248 #define CG6_THC_CURSMASK        0x900           /* cursor mask bits */
  249 #define CG6_THC_CURSBITS        0x980           /* cursor bits */
  250 
  251 /* cursor x/y position for 'off' */
  252 #define THC_CURSOFF             ((65536-32) | ((65536-32) << 16))
  253 
  254 #define THC_MISC_REV_M          0x000f0000      /* chip revision */
  255 #define THC_MISC_REV_S          16
  256 #define THC_MISC_RESET          0x00001000      /* reset */
  257 #define THC_MISC_VIDEN          0x00000400      /* video enable */
  258 #define THC_MISC_SYNC           0x00000200      /* not sure what ... */
  259 #define THC_MISC_VSYNC          0x00000100      /* ... these really are */
  260 #define THC_MISC_SYNCEN         0x00000080      /* sync enable */
  261 #define THC_MISC_CURSRES        0x00000040      /* cursor resolution */
  262 #define THC_MISC_INTEN          0x00000020      /* v.retrace intr enable */
  263 #define THC_MISC_INTR           0x00000010      /* intr pending/ack */
  264 #define THC_MISC_CYCLS          0x0000000f      /* cycles before transfer */
  265 
  266 struct cgsix_softc {
  267         struct sunfb sc_sunfb;
  268         bus_space_tag_t sc_bustag;
  269         bus_addr_t sc_paddr;
  270         bus_space_handle_t sc_bt_regs;
  271         bus_space_handle_t sc_fhc_regs;
  272         bus_space_handle_t sc_thc_regs;
  273         bus_space_handle_t sc_tec_regs;
  274         bus_space_handle_t sc_vid_regs;
  275         bus_space_handle_t sc_fbc_regs;
  276         int sc_nscreens;
  277         union bt_cmap sc_cmap;
  278         void *sc_ih;
  279         u_int sc_mode;
  280         u_int sc_curs_enabled, sc_curs_fg, sc_curs_bg;
  281         struct wsdisplay_curpos sc_curs_pos, sc_curs_hot, sc_curs_size;
  282         u_char sc_curs_image[128], sc_curs_mask[128];
  283 };
  284 
  285 #define CG6_USER_FBC    0x70000000
  286 #define CG6_USER_TEC    0x70001000
  287 #define CG6_USER_BTREGS 0x70002000
  288 #define CG6_USER_FHC    0x70004000
  289 #define CG6_USER_THC    0x70005000
  290 #define CG6_USER_ROM    0x70006000
  291 #define CG6_USER_RAM    0x70016000
  292 #define CG6_USER_DHC    0x80000000
  293 
  294 #define THC_READ(sc,r) \
  295     bus_space_read_4((sc)->sc_bustag, (sc)->sc_thc_regs, (r))
  296 #define THC_WRITE(sc,r,v) \
  297     bus_space_write_4((sc)->sc_bustag, (sc)->sc_thc_regs, (r), (v))
  298 
  299 #define TEC_READ(sc,r) \
  300     bus_space_read_4((sc)->sc_bustag, (sc)->sc_tec_regs, (r))
  301 #define TEC_WRITE(sc,r,v) \
  302     bus_space_write_4((sc)->sc_bustag, (sc)->sc_tec_regs, (r), (v))
  303 
  304 #define FHC_READ(sc) \
  305     bus_space_read_4((sc)->sc_bustag, (sc)->sc_fhc_regs, CG6_FHC)
  306 #define FHC_WRITE(sc,v) \
  307     bus_space_write_4((sc)->sc_bustag, (sc)->sc_fhc_regs, CG6_FHC, (v))
  308 
  309 #define FBC_READ(sc,r) \
  310     bus_space_read_4((sc)->sc_bustag, (sc)->sc_fbc_regs, (r))
  311 #define FBC_WRITE(sc,r,v) \
  312     bus_space_write_4((sc)->sc_bustag, (sc)->sc_fbc_regs, (r), (v))
  313 
  314 #define BT_WRITE(sc, reg, val) \
  315     bus_space_write_4((sc)->sc_bustag, (sc)->sc_bt_regs, (reg), (val))
  316 #define BT_READ(sc, reg) \
  317     bus_space_read_4((sc)->sc_bustag, (sc)->sc_bt_regs, (reg))
  318 #define BT_BARRIER(sc,reg,flags) \
  319     bus_space_barrier((sc)->sc_bustag, (sc)->sc_bt_regs, (reg), \
  320         sizeof(u_int32_t), (flags))
  321 
  322 #define CG6_BLIT_WAIT(sc)                                       \
  323         while ((FBC_READ(sc, CG6_FBC_BLIT) &                    \
  324             (FBC_BLIT_UNKNOWN|FBC_BLIT_GXFULL)) ==              \
  325             (FBC_BLIT_UNKNOWN|FBC_BLIT_GXFULL))
  326 #define CG6_DRAW_WAIT(sc)                                       \
  327         while ((FBC_READ(sc, CG6_FBC_DRAW) &                    \
  328             (FBC_DRAW_UNKNOWN|FBC_DRAW_GXFULL)) ==              \
  329             (FBC_DRAW_UNKNOWN|FBC_DRAW_GXFULL))
  330 #define CG6_DRAIN(sc)                                           \
  331         while (FBC_READ(sc, CG6_FBC_S) & FBC_S_GXINPROGRESS)
  332 
  333 #define CG6_MAX_CURSOR          32
  334 
  335 #define CG6_CFFLAG_NOACCEL      0x1     /* disable console acceleration */

/* [<][>][^][v][top][bottom][index][help] */