1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2012 Robert N. M. Watson 5 * All rights reserved. 6 * 7 * This software was developed by SRI International and the University of 8 * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237) 9 * ("CTSRD"), as part of the DARPA CRASH research programme. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 */ 32 33 #ifndef _DEV_TERASIC_MTL_H_ 34 #define _DEV_TERASIC_MTL_H_ 35 36 #include "opt_syscons.h" 37 38 struct terasic_mtl_softc { 39 #if defined(DEV_SC) 40 /* 41 * syscons requires that its video_adapter_t be at the front of the 42 * softc, so place syscons fields first, which we otherwise would 43 * probably not do. 44 */ 45 video_adapter_t mtl_va; 46 #endif 47 48 /* 49 * Bus-related fields. 50 */ 51 device_t mtl_dev; 52 int mtl_unit; 53 54 /* 55 * The MTL driver doesn't require a lot of synchronisation; however, 56 * the lock is used to protect read-modify-write operations on MTL 57 * registers. 58 */ 59 struct mtx mtl_lock; 60 61 /* 62 * Control register device -- mappable from userspace. 63 */ 64 struct cdev *mtl_reg_cdev; 65 struct resource *mtl_reg_res; 66 int mtl_reg_rid; 67 68 /* 69 * Graphics frame buffer device -- mappable from userspace, and used 70 * by the vt framebuffer interface. 71 */ 72 struct cdev *mtl_pixel_cdev; 73 struct resource *mtl_pixel_res; 74 int mtl_pixel_rid; 75 76 /* 77 * Text frame buffer device -- mappable from userspace, and syscons 78 * hookup. 79 */ 80 struct cdev *mtl_text_cdev; 81 struct resource *mtl_text_res; 82 int mtl_text_rid; 83 uint16_t *mtl_text_soft; 84 85 /* 86 * Framebuffer hookup for vt(4). 87 */ 88 struct fb_info mtl_fb_info; 89 }; 90 91 #define TERASIC_MTL_LOCK(sc) mtx_lock(&(sc)->mtl_lock) 92 #define TERASIC_MTL_LOCK_ASSERT(sc) mtx_assert(&(sc)->mtl_lock, MA_OWNED) 93 #define TERASIC_MTL_LOCK_DESTROY(sc) mtx_destroy(&(sc)->mtl_lock) 94 #define TERASIC_MTL_LOCK_INIT(sc) mtx_init(&(sc)->mtl_lock, \ 95 "terasic_mtl", NULL, MTX_DEF) 96 #define TERASIC_MTL_UNLOCK(sc) mtx_unlock(&(sc)->mtl_lock) 97 98 /* 99 * Constant properties of the MTL text frame buffer. 100 */ 101 #define TERASIC_MTL_COLS 100 102 #define TERASIC_MTL_ROWS 40 103 104 /* 105 * MTL control register offsets. 106 */ 107 #define TERASIC_MTL_OFF_BLEND 0 108 #define TERASIC_MTL_OFF_TEXTCURSOR 4 109 #define TERASIC_MTL_OFF_TEXTFRAMEBUFADDR 8 110 #define TERASIC_MTL_OFF_TOUCHPOINT_X1 12 111 #define TERASIC_MTL_OFF_TOUCHPOINT_Y1 16 112 #define TERASIC_MTL_OFF_TOUCHPOINT_X2 20 113 #define TERASIC_MTL_OFF_TOUCHPOINT_Y2 24 114 #define TERASIC_MTL_OFF_TOUCHGESTURE 28 115 116 /* 117 * Constants to help interpret various control registers. 118 */ 119 #define TERASIC_MTL_BLEND_PIXEL_ENDIAN_SWAP 0x10000000 120 #define TERASIC_MTL_BLEND_DEFAULT_MASK 0x0f000000 121 #define TERASIC_MTL_BLEND_DEFAULT_SHIFT 24 122 #define TERASIC_MTL_BLEND_PIXEL_MASK 0x00ff0000 123 #define TERASIC_MTL_BLEND_PIXEL_SHIFT 16 124 #define TERASIC_MTL_BLEND_TEXTFG_MASK 0x0000ff00 125 #define TERASIC_MTL_BLEND_TEXTFG_SHIFT 8 126 #define TERASIC_MTL_BLEND_TEXTBG_MASK 0x000000ff 127 #define TERASIC_MTL_BLEND_TEXTBG_SHIFT 0 128 #define TERASIC_MTL_TEXTCURSOR_COL_MASK 0xff00 129 #define TERASIC_MTL_TEXTCURSOR_COL_SHIFT 8 130 #define TERASIC_MTL_TEXTCURSOR_ROW_MASK 0xff 131 132 /* 133 * Colours used both by VGA-like text rendering, and for the default display 134 * colour. 135 */ 136 #define TERASIC_MTL_COLOR_BLACK 0 137 #define TERASIC_MTL_COLOR_DARKBLUE 1 138 #define TERASIC_MTL_COLOR_DARKGREEN 2 139 #define TERASIC_MTL_COLOR_DARKCYAN 3 140 #define TERASIC_MTL_COLOR_DARKRED 4 141 #define TERASIC_MTL_COLOR_DARKMAGENTA 5 142 #define TERASIC_MTL_COLOR_BROWN 6 143 #define TERASIC_MTL_COLOR_LIGHTGREY 7 144 #define TERASIC_MTL_COLOR_DARKGREY 8 145 #define TERASIC_MTL_COLOR_LIGHTBLUE 9 146 #define TERASIC_MTL_COLOR_LIGHTGREEN 10 147 #define TERASIC_MTL_COLOR_LIGHTCYAN 11 148 #define TERASIC_MTL_COLOR_LIGHTRED 12 149 #define TERASIC_MTL_COLOR_LIGHTMAGENTA 13 150 #define TERASIC_MTL_COLOR_LIGHTYELLOW 14 151 #define TERASIC_MTL_COLOR_WHITE 15 152 #define TERASIC_MTL_COLORMASK_BLINK 0x80 153 154 /* 155 * Constants to help interpret the text frame buffer. 156 */ 157 #define TERASIC_MTL_TEXTFRAMEBUF_EXPECTED_ADDR 0x0177000 158 #define TERASIC_MTL_TEXTFRAMEBUF_CHAR_SHIFT 0 159 #define TERASIC_MTL_TEXTFRAMEBUF_ATTR_SHIFT 8 160 161 /* 162 * Framebuffer constants. 163 */ 164 #define TERASIC_MTL_FB_WIDTH 800 165 #define TERASIC_MTL_FB_HEIGHT 640 166 167 /* 168 * Alpha-blending constants. 169 */ 170 #define TERASIC_MTL_ALPHA_TRANSPARENT 0 171 #define TERASIC_MTL_ALPHA_OPAQUE 255 172 173 /* 174 * Driver setup routines from the bus attachment/teardown. 175 */ 176 int terasic_mtl_attach(struct terasic_mtl_softc *sc); 177 void terasic_mtl_detach(struct terasic_mtl_softc *sc); 178 179 extern devclass_t terasic_mtl_devclass; 180 181 /* 182 * Sub-driver setup routines. 183 */ 184 int terasic_mtl_fbd_attach(struct terasic_mtl_softc *sc); 185 void terasic_mtl_fbd_detach(struct terasic_mtl_softc *sc); 186 int terasic_mtl_pixel_attach(struct terasic_mtl_softc *sc); 187 void terasic_mtl_pixel_detach(struct terasic_mtl_softc *sc); 188 int terasic_mtl_reg_attach(struct terasic_mtl_softc *sc); 189 void terasic_mtl_reg_detach(struct terasic_mtl_softc *sc); 190 int terasic_mtl_syscons_attach(struct terasic_mtl_softc *sc); 191 void terasic_mtl_syscons_detach(struct terasic_mtl_softc *sc); 192 int terasic_mtl_text_attach(struct terasic_mtl_softc *sc); 193 void terasic_mtl_text_detach(struct terasic_mtl_softc *sc); 194 195 /* 196 * Control register I/O routines. 197 */ 198 void terasic_mtl_reg_blank(struct terasic_mtl_softc *sc); 199 200 void terasic_mtl_reg_blend_get(struct terasic_mtl_softc *sc, 201 uint32_t *blendp); 202 void terasic_mtl_reg_blend_set(struct terasic_mtl_softc *sc, 203 uint32_t blend); 204 void terasic_mtl_reg_textcursor_get(struct terasic_mtl_softc *sc, 205 uint8_t *colp, uint8_t *rowp); 206 void terasic_mtl_reg_textcursor_set(struct terasic_mtl_softc *sc, 207 uint8_t col, uint8_t row); 208 void terasic_mtl_reg_textframebufaddr_get(struct terasic_mtl_softc *sc, 209 uint32_t *addrp); 210 void terasic_mtl_reg_textframebufaddr_set(struct terasic_mtl_softc *sc, 211 uint32_t addr); 212 213 /* 214 * Read-modify-write updates of sub-bytes of the blend register. 215 */ 216 void terasic_mtl_blend_default_set(struct terasic_mtl_softc *sc, 217 uint8_t colour); 218 void terasic_mtl_blend_pixel_set(struct terasic_mtl_softc *sc, 219 uint8_t alpha); 220 void terasic_mtl_blend_textfg_set(struct terasic_mtl_softc *sc, 221 uint8_t alpha); 222 void terasic_mtl_blend_textbg_set(struct terasic_mtl_softc *sc, 223 uint8_t alpha); 224 void terasic_mtl_reg_pixel_endian_set(struct terasic_mtl_softc *sc, 225 int endian_swap); 226 227 /* 228 * Text frame buffer I/O routines. 229 */ 230 void terasic_mtl_text_putc(struct terasic_mtl_softc *sc, u_int x, u_int y, 231 uint8_t c, uint8_t a); 232 233 #endif /* _DEV_TERASIC_MTL_H_ */ 234