1f7ec340bSmacallan/* 2f7ec340bSmacallan * CG14 framebuffer - defines. 3f7ec340bSmacallan * 4f7ec340bSmacallan * Copyright (C) 2000 Jakub Jelinek (jakub@redhat.com) 5f7ec340bSmacallan * 6f7ec340bSmacallan * Permission is hereby granted, free of charge, to any person obtaining a copy 7f7ec340bSmacallan * of this software and associated documentation files (the "Software"), to deal 8f7ec340bSmacallan * in the Software without restriction, including without limitation the rights 9f7ec340bSmacallan * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10f7ec340bSmacallan * copies of the Software, and to permit persons to whom the Software is 11f7ec340bSmacallan * furnished to do so, subject to the following conditions: 12f7ec340bSmacallan * 13f7ec340bSmacallan * The above copyright notice and this permission notice shall be included in 14f7ec340bSmacallan * all copies or substantial portions of the Software. 15f7ec340bSmacallan * 16f7ec340bSmacallan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17f7ec340bSmacallan * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18f7ec340bSmacallan * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19f7ec340bSmacallan * JAKUB JELINEK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 20f7ec340bSmacallan * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21f7ec340bSmacallan * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22f7ec340bSmacallan */ 23f7ec340bSmacallan 24f7ec340bSmacallan#ifndef CG14_H 25f7ec340bSmacallan#define CG14_H 26f7ec340bSmacallan 27f7ec340bSmacallan#include "xf86.h" 28f7ec340bSmacallan#include "xf86_OSproc.h" 29f7ec340bSmacallan#include <X11/Xmd.h> 30f7ec340bSmacallan#include "gcstruct.h" 31f7ec340bSmacallan#include "xf86sbusBus.h" 32698f741cSmrg#include "xf86Cursor.h" 334261fa58Smacallan#include "exa.h" 34c2193d98Smacallan#include <sparc/sxreg.h> 35f7ec340bSmacallan 36f7ec340bSmacallan/* Various offsets in virtual (ie. mmap()) spaces Linux and Solaris support. */ 37f7ec340bSmacallan#define CG14_REGS_VOFF 0x00000000 /* registers */ 38f7ec340bSmacallan#define CG14_XLUT_VOFF 0x00003000 /* X Look Up Table */ 39f7ec340bSmacallan#define CG14_CLUT1_VOFF 0x00004000 /* Color Look Up Table */ 40f7ec340bSmacallan#define CG14_CLUT2_VOFF 0x00005000 /* Color Look Up Table */ 41f7ec340bSmacallan#define CG14_CLUT3_VOFF 0x00006000 /* Color Look Up Table */ 42f7ec340bSmacallan#define CG14_DIRECT_VOFF 0x10000000 43f7ec340bSmacallan#define CG14_CTLREG_VOFF 0x20000000 44f7ec340bSmacallan#define CG14_CURSOR_VOFF 0x30000000 45f7ec340bSmacallan#define CG14_SHDW_VRT_VOFF 0x40000000 46f7ec340bSmacallan#define CG14_XBGR_VOFF 0x50000000 47f7ec340bSmacallan#define CG14_BGR_VOFF 0x60000000 48f7ec340bSmacallan#define CG14_X16_VOFF 0x70000000 49f7ec340bSmacallan#define CG14_C16_VOFF 0x80000000 50f7ec340bSmacallan#define CG14_X32_VOFF 0x90000000 51f7ec340bSmacallan#define CG14_B32_VOFF 0xa0000000 52f7ec340bSmacallan#define CG14_G32_VOFF 0xb0000000 53f7ec340bSmacallan#define CG14_R32_VOFF 0xc0000000 54f7ec340bSmacallan 554261fa58Smacallan/* these two are NetBSD specific */ 564261fa58Smacallan#define CG14_SXREG_VOFF 0x00010000 /* SX userspace registers */ 574261fa58Smacallan#define CG14_SXIO_VOFF 0xd0000000 584261fa58Smacallan 594261fa58Smacallan 601a3e96b4Smacallan/* Hardware cursor map */ 611a3e96b4Smacallan#define CG14_CURS_SIZE 32 621a3e96b4Smacallanstruct cg14curs { 631a3e96b4Smacallan volatile uint32_t curs_plane0[CG14_CURS_SIZE]; /* plane 0 */ 641a3e96b4Smacallan volatile uint32_t curs_plane1[CG14_CURS_SIZE]; 651a3e96b4Smacallan volatile uint8_t curs_ctl; /* control register */ 661a3e96b4Smacallan#define CG14_CURS_ENABLE 0x4 671a3e96b4Smacallan#define CG14_CURS_DOUBLEBUFFER 0x2 /* use X-channel for curs */ 681a3e96b4Smacallan volatile uint8_t pad0[3]; 691a3e96b4Smacallan volatile uint16_t curs_x; /* x position */ 701a3e96b4Smacallan volatile uint16_t curs_y; /* y position */ 711a3e96b4Smacallan volatile uint32_t curs_color1; /* color register 1 */ 721a3e96b4Smacallan volatile uint32_t curs_color2; /* color register 2 */ 731a3e96b4Smacallan volatile uint32_t pad[444]; /* pad to 2KB boundary */ 741a3e96b4Smacallan volatile uint32_t curs_plane0incr[CG14_CURS_SIZE]; /* autoincr */ 751a3e96b4Smacallan volatile uint32_t curs_plane1incr[CG14_CURS_SIZE]; /* autoincr */ 761a3e96b4Smacallan}; 771a3e96b4Smacallan 78f7ec340bSmacallantypedef struct { 791a3e96b4Smacallan unsigned char *fb; 80f7ec340bSmacallan unsigned char *x32; 81f7ec340bSmacallan unsigned char *xlut; 821a3e96b4Smacallan struct cg14curs *curs; 83f7ec340bSmacallan int width; 84f7ec340bSmacallan int height; 851a3e96b4Smacallan int use_shadow; 864261fa58Smacallan int memsize; 871a3e96b4Smacallan int HWCursor; 881a3e96b4Smacallan void * shadow; 89f7ec340bSmacallan sbusDevicePtr psdp; 90f7ec340bSmacallan CloseScreenProcPtr CloseScreen; 911a3e96b4Smacallan CreateScreenResourcesProcPtr CreateScreenResources; 92f7ec340bSmacallan OptionInfoPtr Options; 931a3e96b4Smacallan xf86CursorInfoPtr CursorInfoRec; 944261fa58Smacallan /* SX accel stuff */ 954261fa58Smacallan void *sxreg, *sxio; 964261fa58Smacallan int use_accel, use_xrender; 974261fa58Smacallan uint32_t last_mask; 984261fa58Smacallan uint32_t last_rop; 994261fa58Smacallan uint32_t srcoff, srcpitch, mskoff, mskpitch; 1004261fa58Smacallan uint32_t srcformat, dstformat, mskformat; 1014261fa58Smacallan uint32_t fillcolour; 1024261fa58Smacallan int op; 103f7cb851fSmacallan Bool source_is_solid, no_source_pixmap; 104c2193d98Smacallan int xdir, ydir; 105c2193d98Smacallan int queuecount; 1064261fa58Smacallan ExaDriverPtr pExa; 107f7ec340bSmacallan} Cg14Rec, *Cg14Ptr; 108f7ec340bSmacallan 109a3a2ba44Smacallan/* SX stuff */ 110a3a2ba44Smacallan/* write an SX register */ 111a3a2ba44Smacallanstatic inline void 112a3a2ba44Smacallanwrite_sx_reg(Cg14Ptr p, int reg, uint32_t val) 113a3a2ba44Smacallan{ 114a3a2ba44Smacallan *(volatile uint32_t *)(p->sxreg + reg) = val; 115a3a2ba44Smacallan} 116a3a2ba44Smacallan 117a3a2ba44Smacallan/* read an SX register */ 118a3a2ba44Smacallanstatic inline uint32_t 119a3a2ba44Smacallanread_sx_reg(Cg14Ptr p, int reg) 120a3a2ba44Smacallan{ 121a3a2ba44Smacallan return *(volatile uint32_t *)(p->sxreg + reg); 122a3a2ba44Smacallan} 123a3a2ba44Smacallan 124a3a2ba44Smacallan/* write a memory referencing instruction */ 125a3a2ba44Smacallanstatic inline void 126a3a2ba44Smacallanwrite_sx_io(Cg14Ptr p, int reg, uint32_t val) 127a3a2ba44Smacallan{ 128c2193d98Smacallan if (p->queuecount > 6) { 129c2193d98Smacallan /* let the queue drain to avoid stalling the CPU */ 130c2193d98Smacallan do { } while 131c2193d98Smacallan ((read_sx_reg(p, SX_CONTROL_STATUS) & SX_MT) == 0); 132c2193d98Smacallan p->queuecount = 0; 133c2193d98Smacallan } 1345272ebe0Smacallan *(volatile uint32_t *)(p->sxio + (reg & ~7)) = val; 135c2193d98Smacallan p->queuecount++; 136a3a2ba44Smacallan} 137a3a2ba44Smacallan 1380b762603Smacallan/* convenience macros to hide the complexity involved with talking to SX */ 1390b762603Smacallan 1400b762603Smacallan/* 1410b762603Smacallan * issue ALU instruction: 1420b762603Smacallan * sxi(OPCODE, srcA, srcB, dest, count) 1430b762603Smacallan */ 144230e26c7Smacallan#define sxi(inst, a, b, d, cnt) write_sx_reg(p, SX_INSTRUCTIONS, inst((a), (b), (d), (cnt))) 1450b762603Smacallan 1460b762603Smacallan/* 1470b762603Smacallan * issue memory referencing instruction: 1480b762603Smacallan * sxm(OPCODE, address, start register, count) 1490b762603Smacallan */ 15072fd264fSmacallan#define sxm(inst, addr, reg, count) write_sx_io(p, (addr) & ~7, inst((reg), (count), (addr) & 7)) 15172fd264fSmacallan 1520b762603Smacallan/* hw setup stuff */ 1531a3e96b4SmacallanBool CG14SetupCursor(ScreenPtr); 1544261fa58SmacallanBool CG14InitAccel(ScreenPtr); 1551a3e96b4Smacallan 156a3a2ba44Smacallan/* xrender ops */ 157a3a2ba44Smacallanvoid CG14Comp_Over8Solid(Cg14Ptr, uint32_t, uint32_t, uint32_t, uint32_t, 158a3a2ba44Smacallan int, int); 159a3a2ba44Smacallanvoid CG14Comp_Over32Solid(Cg14Ptr, uint32_t, uint32_t, uint32_t, uint32_t, 160a3a2ba44Smacallan int, int); 161a3a2ba44Smacallanvoid CG14Comp_Over32(Cg14Ptr, uint32_t, uint32_t, uint32_t, uint32_t, 162e311bbeeSmacallan int, int, int); 163a3a2ba44Smacallanvoid CG14Comp_Over32Mask(Cg14Ptr, uint32_t, uint32_t, uint32_t, uint32_t, 164e311bbeeSmacallan uint32_t, uint32_t, int, int, int); 1656bdc2ffdSmacallanvoid CG14Comp_Over32Mask_noalpha(Cg14Ptr, uint32_t, uint32_t, uint32_t, 166e311bbeeSmacallan uint32_t, uint32_t, uint32_t, int, int, int); 167fa158432Smacallanvoid CG14Comp_Over32Mask32_noalpha(Cg14Ptr, uint32_t, uint32_t, uint32_t, 168e311bbeeSmacallan uint32_t, uint32_t, uint32_t, int, int, int); 169a3a2ba44Smacallanvoid CG14Comp_Add8(Cg14Ptr, uint32_t, uint32_t, uint32_t, uint32_t, 170a3a2ba44Smacallan int, int); 171d71cb32dSmacallanvoid CG14Comp_Add8_32(Cg14Ptr, uint32_t, uint32_t, uint32_t, uint32_t, 172d71cb32dSmacallan int, int); 173a3a2ba44Smacallanvoid CG14Comp_Add32(Cg14Ptr, uint32_t, uint32_t, uint32_t, uint32_t, 174a3a2ba44Smacallan int, int); 175a3a2ba44Smacallan 176f7ec340bSmacallan#define GET_CG14_FROM_SCRN(p) ((Cg14Ptr)((p)->driverPrivate)) 177f7ec340bSmacallan 178f7ec340bSmacallan/* 179f7ec340bSmacallan * This should match corresponding definition in Solaris's 180f7ec340bSmacallan * '/usr/include/sys/cg14io.h'. 181f7ec340bSmacallan */ 182b73528caSmacallan#ifdef __NetBSD__ 1831bd6d369Smacallan#include <dev/sun/fbio.h> 184b73528caSmacallan#include <sys/ioccom.h> 185b73528caSmacallan#define CG14_SET_PIXELMODE _IOW('M', 3, int) 186b73528caSmacallan#else 187f7ec340bSmacallan#define CG14_SET_PIXELMODE (('M' << 8) | 3) 188b73528caSmacallan#endif 189f7ec340bSmacallan 190f7ec340bSmacallan#endif /* CG14_H */ 191