13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**********************************************************
23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 1998-2009 VMware, Inc.  All rights reserved.
33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person
53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation
63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without
73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy,
83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies
93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is
103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions:
113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be
133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software.
143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE.
233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/
253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * svga_reg.h --
283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Virtual hardware definitions for the VMware SVGA II device.
303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#ifndef _SVGA_REG_H_
333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define _SVGA_REG_H_
343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * PCI device IDs.
373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define PCI_VENDOR_ID_VMWARE            0x15AD
393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define PCI_DEVICE_ID_VMWARE_SVGA2      0x0405
403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Legal values for the SVGA_REG_CURSOR_ON register in old-fashioned
433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * cursor bypass mode. This is still supported, but no new guest
443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * drivers should use it.
453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CURSOR_ON_HIDE            0x0   /* Must be 0 to maintain backward compatibility */
473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CURSOR_ON_SHOW            0x1   /* Must be 1 to maintain backward compatibility */
483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CURSOR_ON_REMOVE_FROM_FB  0x2   /* Remove the cursor from the framebuffer because we need to see what's under it */
493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CURSOR_ON_RESTORE_TO_FB   0x3   /* Put the cursor back in the framebuffer so the user can see it */
503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The maximum framebuffer size that can traced for e.g. guests in VESA mode.
533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The changeMap in the monitor is proportional to this number. Therefore, we'd
543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * like to keep it as small as possible to reduce monitor overhead (using
553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_VRAM_MAX_SIZE for this increases the size of the shared area by over
563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 4k!).
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NB: For compatibility reasons, this value must be greater than 0xff0000.
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     See bug 335072.
603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FB_MAX_TRACEABLE_SIZE      0x1000000
623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_MAX_PSEUDOCOLOR_DEPTH      8
643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_MAX_PSEUDOCOLORS           (1 << SVGA_MAX_PSEUDOCOLOR_DEPTH)
653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_NUM_PALETTE_REGS           (3 * SVGA_MAX_PSEUDOCOLORS)
663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_MAGIC         0x900000UL
683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_MAKE_ID(ver)  (SVGA_MAGIC << 8 | (ver))
693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Version 2 let the address of the frame buffer be unsigned on Win32 */
713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_VERSION_2     2
723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_ID_2          SVGA_MAKE_ID(SVGA_VERSION_2)
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Version 1 has new registers starting with SVGA_REG_CAPABILITIES so
753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   PALETTE_BASE has moved */
763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_VERSION_1     1
773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_ID_1          SVGA_MAKE_ID(SVGA_VERSION_1)
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Version 0 is the initial version */
803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_VERSION_0     0
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_ID_0          SVGA_MAKE_ID(SVGA_VERSION_0)
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* "Invalid" value for all SVGA IDs. (Version ID, screen object ID, surface ID...) */
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_ID_INVALID    0xFFFFFFFF
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Port offsets, relative to BAR0 */
873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_INDEX_PORT         0x0
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_VALUE_PORT         0x1
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_BIOS_PORT          0x2
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_IRQSTATUS_PORT     0x8
913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Interrupt source flags for IRQSTATUS_PORT and IRQMASK.
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Interrupts are only supported when the
963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CAP_IRQMASK capability is present.
973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_IRQFLAG_ANY_FENCE            0x1    /* Any fence was passed */
993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_IRQFLAG_FIFO_PROGRESS        0x2    /* Made forward progress in the FIFO */
1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_IRQFLAG_FENCE_GOAL           0x4    /* SVGA_FIFO_FENCE_GOAL reached */
1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Registers
1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum {
1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_ID = 0,
1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_ENABLE = 1,
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_WIDTH = 2,
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_HEIGHT = 3,
1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_MAX_WIDTH = 4,
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_MAX_HEIGHT = 5,
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DEPTH = 6,
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_BITS_PER_PIXEL = 7,       /* Current bpp in the guest */
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_PSEUDOCOLOR = 8,
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_RED_MASK = 9,
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GREEN_MASK = 10,
1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_BLUE_MASK = 11,
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_BYTES_PER_LINE = 12,
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_FB_START = 13,            /* (Deprecated) */
1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_FB_OFFSET = 14,
1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_VRAM_SIZE = 15,
1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_FB_SIZE = 16,
1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* ID 0 implementation only had the above registers, then the palette */
1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CAPABILITIES = 17,
1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_MEM_START = 18,           /* (Deprecated) */
1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_MEM_SIZE = 19,
1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CONFIG_DONE = 20,         /* Set when memory area configured */
1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_SYNC = 21,                /* See "FIFO Synchronization Registers" */
1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_BUSY = 22,                /* See "FIFO Synchronization Registers" */
1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GUEST_ID = 23,            /* Set guest OS identifier */
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CURSOR_ID = 24,           /* (Deprecated) */
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CURSOR_X = 25,            /* (Deprecated) */
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CURSOR_Y = 26,            /* (Deprecated) */
1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CURSOR_ON = 27,           /* (Deprecated) */
1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_HOST_BITS_PER_PIXEL = 28, /* (Deprecated) */
1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_SCRATCH_SIZE = 29,        /* Number of scratch registers */
1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_MEM_REGS = 30,            /* Number of FIFO registers */
1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_NUM_DISPLAYS = 31,        /* (Deprecated) */
1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_PITCHLOCK = 32,           /* Fixed pitch for all modes */
1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_IRQMASK = 33,             /* Interrupt mask */
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Legacy multi-monitor support */
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_NUM_GUEST_DISPLAYS = 34,/* Number of guest displays in X/Y direction */
1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_ID = 35,        /* Display ID for the following display attributes */
1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_IS_PRIMARY = 36,/* Whether this is a primary display */
1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_POSITION_X = 37,/* The display position x */
1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_POSITION_Y = 38,/* The display position y */
1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_WIDTH = 39,     /* The display's width */
1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_HEIGHT = 40,    /* The display's height */
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* See "Guest memory regions" below. */
1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GMR_ID = 41,
1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GMR_DESCRIPTOR = 42,
1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GMR_MAX_IDS = 43,
1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GMR_MAX_DESCRIPTOR_LENGTH = 44,
1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_TRACES = 45,            /* Enable trace-based updates even when FIFO is on */
1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_TOP = 46,               /* Must be 1 more than the last register */
1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_PALETTE_BASE = 1024,        /* Base of SVGA color map */
1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Next 768 (== 256*3) registers exist for colormap */
1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_SCRATCH_BASE = SVGA_PALETTE_BASE + SVGA_NUM_PALETTE_REGS
1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                    /* Base of scratch registers */
1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Next reg[SVGA_REG_SCRATCH_SIZE] registers exist for scratch usage:
1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      First 4 are reserved for VESA BIOS Extension; any remaining are for
1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      the use of the current SVGA driver. */
1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Guest memory regions (GMRs):
1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * This is a new memory mapping feature available in SVGA devices
1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * which have the SVGA_CAP_GMR bit set. Previously, there were two
1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * fixed memory regions available with which to share data between the
1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * device and the driver: the FIFO ('MEM') and the framebuffer. GMRs
1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * are our name for an extensible way of providing arbitrary DMA
1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * buffers for use between the driver and the SVGA device. They are a
1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * new alternative to framebuffer memory, usable for both 2D and 3D
1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * graphics operations.
1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Since GMR mapping must be done synchronously with guest CPU
1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * execution, we use a new pair of SVGA registers:
1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   SVGA_REG_GMR_ID --
1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     Read/write.
1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     This register holds the 32-bit ID (a small positive integer)
1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     of a GMR to create, delete, or redefine. Writing this register
1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     has no side-effects.
1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   SVGA_REG_GMR_DESCRIPTOR --
1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     Write-only.
1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     Writing this register will create, delete, or redefine the GMR
2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     specified by the above ID register. If this register is zero,
2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     the GMR is deleted. Any pointers into this GMR (including those
2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     currently being processed by FIFO commands) will be
2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     synchronously invalidated.
2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     If this register is nonzero, it must be the physical page
2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     number (PPN) of a data structure which describes the physical
2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     layout of the memory region this GMR should describe. The
2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     descriptor structure will be read synchronously by the SVGA
2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     device when this register is written. The descriptor need not
2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     remain allocated for the lifetime of the GMR.
2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     The guest driver should write SVGA_REG_GMR_ID first, then
2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     SVGA_REG_GMR_DESCRIPTOR.
2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   SVGA_REG_GMR_MAX_IDS --
2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     Read-only.
2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     The SVGA device may choose to support a maximum number of
2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     user-defined GMR IDs. This register holds the number of supported
2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     IDs. (The maximum supported ID plus 1)
2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   SVGA_REG_GMR_MAX_DESCRIPTOR_LENGTH --
2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     Read-only.
2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     The SVGA device may choose to put a limit on the total number
2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     of SVGAGuestMemDescriptor structures it will read when defining
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     a single GMR.
2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The descriptor structure is an array of SVGAGuestMemDescriptor
2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * structures. Each structure may do one of three things:
2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   - Terminate the GMR descriptor list.
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     (ppn==0, numPages==0)
2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   - Add a PPN or range of PPNs to the GMR's virtual address space.
2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     (ppn != 0, numPages != 0)
2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   - Provide the PPN of the next SVGAGuestMemDescriptor, in order to
2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     support multi-page GMR descriptor tables without forcing the
2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     driver to allocate physically contiguous memory.
2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     (ppn != 0, numPages == 0)
2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Note that each physical page of SVGAGuestMemDescriptor structures
2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * can describe at least 2MB of guest memory. If the driver needs to
2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * use more than one page of descriptor structures, it must use one of
2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * its SVGAGuestMemDescriptors to point to an additional page.  The
2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * device will never automatically cross a page boundary.
2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Once the driver has described a GMR, it is immediately available
2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * for use via any FIFO command that uses an SVGAGuestPtr structure.
2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * These pointers include a GMR identifier plus an offset into that
2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * GMR.
2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The driver must check the SVGA_CAP_GMR bit before using the GMR
2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * registers.
2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Special GMR IDs, allowing SVGAGuestPtrs to point to framebuffer
2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * memory as well.  In the future, these IDs could even be used to
2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * allow legacy memory regions to be redefined by the guest as GMRs.
2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Using the guest framebuffer (GFB) at BAR1 for general purpose DMA
2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * is being phased out. Please try to use user-defined GMRs whenever
2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * possible.
2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
2673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_GMR_NULL         ((uint32) -1)
2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_GMR_FRAMEBUFFER  ((uint32) -2)  // Guest Framebuffer (GFB)
2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct SVGAGuestMemDescriptor {
2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 ppn;
2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 numPages;
2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAGuestMemDescriptor;
2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct SVGAGuestPtr {
2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 gmrId;
2793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 offset;
2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAGuestPtr;
2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGAGMRImageFormat --
2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a packed representation of the source 2D image format
2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    for a GMR-to-screen blit. Currently it is defined as an encoding
2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    of the screen's color depth and bits-per-pixel, however, 16 bits
2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    are reserved for future use to identify other encodings (such as
2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    RGBA or higher-precision images).
2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Currently supported formats:
2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       bpp depth  Format Name
2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       --- -----  -----------
2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *        32    24  32-bit BGRX
2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *        24    24  24-bit BGR
2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *        16    16  RGB 5-6-5
2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *        16    15  RGB 5-5-5
3003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
3023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
3043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct SVGAGMRImageFormat {
3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   union {
3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      struct {
3073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 bitsPerPixel : 8;
3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 colorDepth   : 8;
3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 reserved     : 16;  // Must be zero
3103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      };
3113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      uint32 value;
3133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   };
3143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAGMRImageFormat;
3153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
3173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGAColorBGRX --
3183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    A 24-bit color format (BGRX), which does not depend on the
3203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    format of the legacy guest framebuffer (GFB) or the current
3213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    GMRFB state.
3223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
3233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
3253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct SVGAColorBGRX {
3263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   union {
3273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      struct {
3283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 b : 8;
3293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 g : 8;
3303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 r : 8;
3313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 x : 8;  // Unused
3323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      };
3333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      uint32 value;
3353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   };
3363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAColorBGRX;
3373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
3403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGASignedRect --
3413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGASignedPoint --
3423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Signed rectangle and point primitives. These are used by the new
3443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    2D primitives for drawing to Screen Objects, which can occupy a
3453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    signed virtual coordinate space.
3463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGASignedRect specifies a half-open interval: the (left, top)
3483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    pixel is part of the rectangle, but the (right, bottom) pixel is
3493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    not.
3503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
3513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
3533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct SVGASignedRect {
3543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  left;
3553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  top;
3563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  right;
3573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  bottom;
3583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGASignedRect;
3593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
3613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct SVGASignedPoint {
3623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  x;
3633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  y;
3643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGASignedPoint;
3653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
3683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  Capabilities
3693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  Note the holes in the bitfield. Missing bits have been deprecated,
3713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  and must not be reused. Those capabilities will never be reported
3723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  by new versions of the SVGA device.
3733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
3743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_NONE               0x00000000
3763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_RECT_COPY          0x00000002
3773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_CURSOR             0x00000020
3783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_CURSOR_BYPASS      0x00000040   // Legacy (Use Cursor Bypass 3 instead)
3793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_CURSOR_BYPASS_2    0x00000080   // Legacy (Use Cursor Bypass 3 instead)
3803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_8BIT_EMULATION     0x00000100
3813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_ALPHA_CURSOR       0x00000200
3823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_3D                 0x00004000
3833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_EXTENDED_FIFO      0x00008000
3843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_MULTIMON           0x00010000   // Legacy multi-monitor support
3853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_PITCHLOCK          0x00020000
3863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_IRQMASK            0x00040000
3873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_DISPLAY_TOPOLOGY   0x00080000   // Legacy multi-monitor support
3883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_GMR                0x00100000
3893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_TRACES             0x00200000
3903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
3933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFO register indices.
3943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The FIFO is a chunk of device memory mapped into guest physmem.  It
3963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * is always treated as 32-bit words.
3973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The guest driver gets to decide how to partition it between
3993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * - FIFO registers (there are always at least 4, specifying where the
4003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   following data area is and how much data it contains; there may be
4013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   more registers following these, depending on the FIFO protocol
4023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   version in use)
4033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * - FIFO data, written by the guest and slurped out by the VMX.
4043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * These indices are 32-bit word offsets into the FIFO.
4053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
4063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum {
4083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
4093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Block 1 (basic registers): The originally defined FIFO registers.
4103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * These exist and are valid for all versions of the FIFO protocol.
4113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
4123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_MIN = 0,
4143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_MAX,       /* The distance from MIN to MAX must be at least 10K */
4153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_NEXT_CMD,
4163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_STOP,
4173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
4193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Block 2 (extended registers): Mandatory registers for the extended
4203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * FIFO.  These exist if the SVGA caps register includes
4213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * SVGA_CAP_EXTENDED_FIFO; some of them are valid only if their
4223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * associated capability bit is enabled.
4233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    *
4243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Note that when originally defined, SVGA_CAP_EXTENDED_FIFO implied
4253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * support only for (FIFO registers) CAPABILITIES, FLAGS, and FENCE.
4263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * This means that the guest has to test individually (in most cases
4273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * using FIFO caps) for the presence of registers after this; the VMX
4283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * can define "extended FIFO" to mean whatever it wants, and currently
4293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * won't enable it unless there's room for that set and much more.
4303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
4313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CAPABILITIES = 4,
4333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_FLAGS,
4343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   // Valid with SVGA_FIFO_CAP_FENCE:
4353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_FENCE,
4363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
4383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Block 3a (optional extended registers): Additional registers for the
4393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * extended FIFO, whose presence isn't actually implied by
4403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * SVGA_CAP_EXTENDED_FIFO; these exist if SVGA_FIFO_MIN is high enough to
4413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * leave room for them.
4423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    *
4433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * These in block 3a, the VMX currently considers mandatory for the
4443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * extended FIFO.
4453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
4463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   // Valid if exists (i.e. if extended FIFO enabled):
4483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_3D_HWVERSION,       /* See SVGA3dHardwareVersion in svga3d_reg.h */
4493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   // Valid with SVGA_FIFO_CAP_PITCHLOCK:
4503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_PITCHLOCK,
4513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   // Valid with SVGA_FIFO_CAP_CURSOR_BYPASS_3:
4533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_ON,          /* Cursor bypass 3 show/hide register */
4543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_X,           /* Cursor bypass 3 x register */
4553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_Y,           /* Cursor bypass 3 y register */
4563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_COUNT,       /* Incremented when any of the other 3 change */
4573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_LAST_UPDATED,/* Last time the host updated the cursor */
4583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   // Valid with SVGA_FIFO_CAP_RESERVE:
4603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_RESERVED,           /* Bytes past NEXT_CMD with real contents */
4613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
4633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Valid with SVGA_FIFO_CAP_SCREEN_OBJECT:
4643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    *
4653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * By default this is SVGA_ID_INVALID, to indicate that the cursor
4663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * coordinates are specified relative to the virtual root. If this
4673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * is set to a specific screen ID, cursor position is reinterpreted
4683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * as a signed offset relative to that screen's origin. This is the
4693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * only way to place the cursor on a non-rooted screen.
4703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
4713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_SCREEN_ID,
4723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
4743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * XXX: The gap here, up until SVGA_FIFO_3D_CAPS, can be used for new
4753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * registers, but this must be done carefully and with judicious use of
4763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * capability bits, since comparisons based on SVGA_FIFO_MIN aren't
4773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * enough to tell you whether the register exists: we've shipped drivers
4783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * and products that used SVGA_FIFO_3D_CAPS but didn't know about some of
4793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * the earlier ones.  The actual order of introduction was:
4803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * - PITCHLOCK
4813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * - 3D_CAPS
4823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * - CURSOR_* (cursor bypass 3)
4833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * - RESERVED
4843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * So, code that wants to know whether it can use any of the
4853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * aforementioned registers, or anything else added after PITCHLOCK and
4863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * before 3D_CAPS, needs to reason about something other than
4873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * SVGA_FIFO_MIN.
4883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
4893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
4913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * 3D caps block space; valid with 3D hardware version >=
4923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * SVGA3D_HWVERSION_WS6_B1.
4933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
4943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_3D_CAPS      = 32,
4953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_3D_CAPS_LAST = 32 + 255,
4963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
4983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * End of VMX's current definition of "extended-FIFO registers".
4993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Registers before here are always enabled/disabled as a block; either
5003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * the extended FIFO is enabled and includes all preceding registers, or
5013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * it's disabled entirely.
5023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    *
5033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Block 3b (truly optional extended registers): Additional registers for
5043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * the extended FIFO, which the VMX already knows how to enable and
5053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * disable with correct granularity.
5063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    *
5073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Registers after here exist if and only if the guest SVGA driver
5083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * sets SVGA_FIFO_MIN high enough to leave room for them.
5093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
5103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   // Valid if register exists:
5123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_GUEST_3D_HWVERSION, /* Guest driver's 3D version */
5133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_FENCE_GOAL,         /* Matching target for SVGA_IRQFLAG_FENCE_GOAL */
5143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_BUSY,               /* See "FIFO Synchronization Registers" */
5153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
5173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Always keep this last.  This defines the maximum number of
5183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * registers we know about.  At power-on, this value is placed in
5193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * the SVGA_REG_MEM_REGS register, and we expect the guest driver
5203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * to allocate this much space in FIFO memory for registers.
5213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
5223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    SVGA_FIFO_NUM_REGS
5233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
5243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
5273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Definition of registers included in extended FIFO support.
5283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The guest SVGA driver gets to allocate the FIFO between registers
5303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * and data.  It must always allocate at least 4 registers, but old
5313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * drivers stopped there.
5323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The VMX will enable extended FIFO support if and only if the guest
5343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * left enough room for all registers defined as part of the mandatory
5353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * set for the extended FIFO.
5363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Note that the guest drivers typically allocate the FIFO only at
5383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * initialization time, not at mode switches, so it's likely that the
5393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * number of FIFO registers won't change without a reboot.
5403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * All registers less than this value are guaranteed to be present if
5423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * svgaUser->fifo.extended is set. Any later registers must be tested
5433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * individually for compatibility at each use (in the VMX).
5443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * This value is used only by the VMX, so it can change without
5463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * affecting driver compatibility; keep it that way?
5473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
5483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_EXTENDED_MANDATORY_REGS  (SVGA_FIFO_3D_CAPS_LAST + 1)
5493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
5523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFO Synchronization Registers
5533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  This explains the relationship between the various FIFO
5553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  sync-related registers in IOSpace and in FIFO space.
5563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  SVGA_REG_SYNC --
5583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       The SYNC register can be used in two different ways by the guest:
5603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         1. If the guest wishes to fully sync (drain) the FIFO,
5623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            it will write once to SYNC then poll on the BUSY
5633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            register. The FIFO is sync'ed once BUSY is zero.
5643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         2. If the guest wants to asynchronously wake up the host,
5663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            it will write once to SYNC without polling on BUSY.
5673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            Ideally it will do this after some new commands have
5683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            been placed in the FIFO, and after reading a zero
5693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            from SVGA_FIFO_BUSY.
5703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       (1) is the original behaviour that SYNC was designed to
5723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       support.  Originally, a write to SYNC would implicitly
5733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       trigger a read from BUSY. This causes us to synchronously
5743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       process the FIFO.
5753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       This behaviour has since been changed so that writing SYNC
5773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       will *not* implicitly cause a read from BUSY. Instead, it
5783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       makes a channel call which asynchronously wakes up the MKS
5793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       thread.
5803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       New guests can use this new behaviour to implement (2)
5823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       efficiently. This lets guests get the host's attention
5833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       without waiting for the MKS to poll, which gives us much
5843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       better CPU utilization on SMP hosts and on UP hosts while
5853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       we're blocked on the host GPU.
5863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       Old guests shouldn't notice the behaviour change. SYNC was
5883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       never guaranteed to process the entire FIFO, since it was
5893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       bounded to a particular number of CPU cycles. Old guests will
5903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       still loop on the BUSY register until the FIFO is empty.
5913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       Writing to SYNC currently has the following side-effects:
5933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         - Sets SVGA_REG_BUSY to TRUE (in the monitor)
5953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         - Asynchronously wakes up the MKS thread for FIFO processing
5963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         - The value written to SYNC is recorded as a "reason", for
5973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *           stats purposes.
5983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       If SVGA_FIFO_BUSY is available, drivers are advised to only
6003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       write to SYNC if SVGA_FIFO_BUSY is FALSE. Drivers should set
6013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       SVGA_FIFO_BUSY to TRUE after writing to SYNC. The MKS will
6023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       eventually set SVGA_FIFO_BUSY on its own, but this approach
6033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       lets the driver avoid sending multiple asynchronous wakeup
6043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       messages to the MKS thread.
6053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  SVGA_REG_BUSY --
6073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       This register is set to TRUE when SVGA_REG_SYNC is written,
6093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       and it reads as FALSE when the FIFO has been completely
6103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       drained.
6113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       Every read from this register causes us to synchronously
6133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       process FIFO commands. There is no guarantee as to how many
6143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       commands each read will process.
6153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       CPU time spent processing FIFO commands will be billed to
6173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       the guest.
6183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       New drivers should avoid using this register unless they
6203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       need to guarantee that the FIFO is completely drained. It
6213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       is overkill for performing a sync-to-fence. Older drivers
6223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       will use this register for any type of synchronization.
6233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  SVGA_FIFO_BUSY --
6253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       This register is a fast way for the guest driver to check
6273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       whether the FIFO is already being processed. It reads and
6283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       writes at normal RAM speeds, with no monitor intervention.
6293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       If this register reads as TRUE, the host is guaranteeing that
6313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       any new commands written into the FIFO will be noticed before
6323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       the MKS goes back to sleep.
6333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       If this register reads as FALSE, no such guarantee can be
6353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       made.
6363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       The guest should use this register to quickly determine
6383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       whether or not it needs to wake up the host. If the guest
6393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       just wrote a command or group of commands that it would like
6403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       the host to begin processing, it should:
6413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         1. Read SVGA_FIFO_BUSY. If it reads as TRUE, no further
6433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            action is necessary.
6443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         2. Write TRUE to SVGA_FIFO_BUSY. This informs future guest
6463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            code that we've already sent a SYNC to the host and we
6473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            don't need to send a duplicate.
6483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         3. Write a reason to SVGA_REG_SYNC. This will send an
6503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            asynchronous wakeup to the MKS thread.
6513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
6523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
6553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFO Capabilities
6563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Fence -- Fence register and command are supported
6583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Accel Front -- Front buffer only commands are supported
6593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Pitch Lock -- Pitch lock register is supported
6603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Video -- SVGA Video overlay units are supported
6613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Escape -- Escape command is supported
6623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * XXX: Add longer descriptions for each capability, including a list
6643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      of the new features that each capability provides.
6653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_FIFO_CAP_SCREEN_OBJECT --
6673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Provides dynamic multi-screen rendering, for improved Unity and
6693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    multi-monitor modes. With Screen Object, the guest can
6703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    dynamically create and destroy 'screens', which can represent
6713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Unity windows or virtual monitors. Screen Object also provides
6723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    strong guarantees that DMA operations happen only when
6733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    guest-initiated. Screen Object deprecates the BAR1 guest
6743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    framebuffer (GFB) and all commands that work only with the GFB.
6753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    New registers:
6773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       FIFO_CURSOR_SCREEN_ID, VIDEO_DATA_GMRID, VIDEO_DST_SCREEN_ID
6783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    New 2D commands:
6803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       DEFINE_SCREEN, DESTROY_SCREEN, DEFINE_GMRFB, BLIT_GMRFB_TO_SCREEN,
6813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       BLIT_SCREEN_TO_GMRFB, ANNOTATION_FILL, ANNOTATION_COPY
6823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    New 3D commands:
6843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       BLIT_SURFACE_TO_SCREEN
6853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    New guarantees:
6873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       - The host will not read or write guest memory, including the GFB,
6893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         except when explicitly initiated by a DMA command.
6903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       - All DMA, including legacy DMA like UPDATE and PRESENT_READBACK,
6923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         is guaranteed to complete before any subsequent FENCEs.
6933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       - All legacy commands which affect a Screen (UPDATE, PRESENT,
6953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         PRESENT_READBACK) as well as new Screen blit commands will
6963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         all behave consistently as blits, and memory will be read
6973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         or written in FIFO order.
6983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         For example, if you PRESENT from one SVGA3D surface to multiple
7003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         places on the screen, the data copied will always be from the
7013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         SVGA3D surface at the time the PRESENT was issued in the FIFO.
7023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         This was not necessarily true on devices without Screen Object.
7033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
7043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         This means that on devices that support Screen Object, the
7053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         PRESENT_READBACK command should not be necessary unless you
7063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         actually want to read back the results of 3D rendering into
7073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         system memory. (And for that, the BLIT_SCREEN_TO_GMRFB
7083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         command provides a strict superset of functionality.)
7093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
7103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       - When a screen is resized, either using Screen Object commands or
7113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         legacy multimon registers, its contents are preserved.
7123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
7133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_NONE                  0
7153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_FENCE             (1<<0)
7163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_ACCELFRONT        (1<<1)
7173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_PITCHLOCK         (1<<2)
7183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_VIDEO             (1<<3)
7193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_CURSOR_BYPASS_3   (1<<4)
7203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_ESCAPE            (1<<5)
7213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_RESERVE           (1<<6)
7223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_SCREEN_OBJECT     (1<<7)
7233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
7263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFO Flags
7273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
7283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Accel Front -- Driver should use front buffer only commands
7293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
7303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_FLAG_NONE                 0
7323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_FLAG_ACCELFRONT       (1<<0)
7333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_FLAG_RESERVED        (1<<31) // Internal use only
7343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
7363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFO reservation sentinel value
7373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
7383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_RESERVED_UNKNOWN      0xffffffff
7403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
7433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Video overlay support
7443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
7453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_NUM_OVERLAY_UNITS 32
7473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
7503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Video capabilities that the guest is currently using
7513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
7523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_VIDEO_FLAG_COLORKEY        0x0001
7543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
7573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Offsets for the video overlay registers
7583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
7593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum {
7613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_ENABLED = 0,
7623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_FLAGS,
7633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_DATA_OFFSET,
7643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_FORMAT,
7653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_COLORKEY,
7663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_SIZE,          // Deprecated
7673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_WIDTH,
7683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_HEIGHT,
7693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_SRC_X,
7703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_SRC_Y,
7713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_SRC_WIDTH,
7723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_SRC_HEIGHT,
7733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_DST_X,         // Signed int32
7743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_DST_Y,         // Signed int32
7753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_DST_WIDTH,
7763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_DST_HEIGHT,
7773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_PITCH_1,
7783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_PITCH_2,
7793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_PITCH_3,
7803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_DATA_GMRID,    // Optional, defaults to SVGA_GMR_FRAMEBUFFER
7813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_DST_SCREEN_ID, // Optional, defaults to virtual coords (SVGA_ID_INVALID)
7823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_NUM_REGS
7833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
7843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
7873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA Overlay Units
7883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
7893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      width and height relate to the entire source video frame.
7903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      srcX, srcY, srcWidth and srcHeight represent subset of the source
7913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      video frame to be displayed.
7923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
7933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef struct SVGAOverlayUnit {
7953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 enabled;
7963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 flags;
7973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 dataOffset;
7983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 format;
7993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 colorKey;
8003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 size;
8013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
8023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
8033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcX;
8043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcY;
8053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcWidth;
8063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcHeight;
8073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  dstX;
8083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  dstY;
8093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 dstWidth;
8103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 dstHeight;
8113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 pitches[3];
8123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 dataGMRId;
8133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 dstScreenId;
8143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAOverlayUnit;
8153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
8183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGAScreenObject --
8193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a new way to represent a guest's multi-monitor screen or
8213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Unity window. Screen objects are only supported if the
8223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_SCREEN_OBJECT capability bit is set.
8233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    If Screen Objects are supported, they can be used to fully
8253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    replace the functionality provided by the framebuffer registers
8263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    (SVGA_REG_WIDTH, HEIGHT, etc.) and by SVGA_CAP_DISPLAY_TOPOLOGY.
8273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The screen object is a struct with guaranteed binary
8293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    compatibility. New flags can be added, and the struct may grow,
8303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    but existing fields must retain their meaning.
8313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
8333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_SCREEN_HAS_ROOT    (1 << 0)  // Screen is present in the virtual coord space
8353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_SCREEN_IS_PRIMARY  (1 << 1)  // Guest considers this screen to be 'primary'
8363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_SCREEN_FULLSCREEN_HINT (1 << 2)   // Guest is running a fullscreen app here
8373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
8393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct SVGAScreenObject {
8403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 structSize;   // sizeof(SVGAScreenObject)
8413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 id;
8423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 flags;
8433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct {
8443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      uint32 width;
8453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      uint32 height;
8463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   } size;
8473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct {
8483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      int32 x;
8493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      int32 y;
8503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   } root;              // Only used if SVGA_SCREEN_HAS_ROOT is set.
8513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAScreenObject;
8523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
8553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  Commands in the command FIFO:
8563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  Command IDs defined below are used for the traditional 2D FIFO
8583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  communication (not all commands are available for all versions of the
8593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  SVGA FIFO protocol).
8603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  Note the holes in the command ID numbers: These commands have been
8623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  deprecated, and the old IDs must not be reused.
8633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  Command IDs from 1000 to 1999 are reserved for use by the SVGA3D
8653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  protocol.
8663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  Each command's parameters are described by the comments and
8683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  structs below.
8693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
8703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef enum {
8723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_INVALID_CMD           = 0,
8733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_UPDATE                = 1,
8743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_RECT_COPY             = 3,
8753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_DEFINE_CURSOR         = 19,
8763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_DEFINE_ALPHA_CURSOR   = 22,
8773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_UPDATE_VERBOSE        = 25,
8783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_FRONT_ROP_FILL        = 29,
8793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_FENCE                 = 30,
8803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_ESCAPE                = 33,
8813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_DEFINE_SCREEN         = 34,
8823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_DESTROY_SCREEN        = 35,
8833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_DEFINE_GMRFB          = 36,
8843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_BLIT_GMRFB_TO_SCREEN  = 37,
8853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_BLIT_SCREEN_TO_GMRFB  = 38,
8863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_ANNOTATION_FILL       = 39,
8873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_ANNOTATION_COPY       = 40,
8883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_MAX
8893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdId;
8903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CMD_MAX_ARGS           64
8923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
8953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_UPDATE --
8963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a DMA transfer which copies from the Guest Framebuffer
8983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    (GFB) at BAR1 + SVGA_REG_FB_OFFSET to any screens which
8993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    intersect with the provided virtual rectangle.
9003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command does not support using arbitrary guest memory as a
9023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    data source- it only works with the pre-defined GFB memory.
9033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command also does not support signed virtual coordinates.
9043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    If you have defined screens (using SVGA_CMD_DEFINE_SCREEN) with
9053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    negative root x/y coordinates, the negative portion of those
9063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    screens will not be reachable by this command.
9073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command is not necessary when using framebuffer
9093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    traces. Traces are automatically enabled if the SVGA FIFO is
9103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    disabled, and you may explicitly enable/disable traces using
9113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_REG_TRACES. With traces enabled, any write to the GFB will
9123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    automatically act as if a subsequent SVGA_CMD_UPDATE was issued.
9133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Traces and SVGA_CMD_UPDATE are the only supported ways to render
9153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    pseudocolor screen updates. The newer Screen Object commands
9163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    only support true color formats.
9173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
9193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Always available.
9203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
9213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
9233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
9243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 x;
9253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 y;
9263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
9273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
9283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdUpdate;
9293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
9323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_RECT_COPY --
9333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Perform a rectangular DMA transfer from one area of the GFB to
9353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    another, and copy the result to any screens which intersect it.
9363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
9383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CAP_RECT_COPY
9393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
9403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
9423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
9433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcX;
9443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcY;
9453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 destX;
9463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 destY;
9473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
9483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
9493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdRectCopy;
9503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
9533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_DEFINE_CURSOR --
9543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Provide a new cursor image, as an AND/XOR mask.
9563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The recommended way to position the cursor overlay is by using
9583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    the SVGA_FIFO_CURSOR_* registers, supported by the
9593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_CURSOR_BYPASS_3 capability.
9603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
9623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CAP_CURSOR
9633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
9643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
9663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
9673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 id;             // Reserved, must be zero.
9683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 hotspotX;
9693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 hotspotY;
9703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
9713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
9723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 andMaskDepth;   // Value must be 1 or equal to BITS_PER_PIXEL
9733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 xorMaskDepth;   // Value must be 1 or equal to BITS_PER_PIXEL
9743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
9753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Followed by scanline data for AND mask, then XOR mask.
9763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Each scanline is padded to a 32-bit boundary.
9773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   */
9783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdDefineCursor;
9793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
9823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_DEFINE_ALPHA_CURSOR --
9833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Provide a new cursor image, in 32-bit BGRA format.
9853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The recommended way to position the cursor overlay is by using
9873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    the SVGA_FIFO_CURSOR_* registers, supported by the
9883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_CURSOR_BYPASS_3 capability.
9893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
9913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CAP_ALPHA_CURSOR
9923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
9933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
9953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
9963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 id;             // Reserved, must be zero.
9973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 hotspotX;
9983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 hotspotY;
9993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
10003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
10013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Followed by scanline data */
10023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdDefineAlphaCursor;
10033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_UPDATE_VERBOSE --
10073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Just like SVGA_CMD_UPDATE, but also provide a per-rectangle
10093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    'reason' value, an opaque cookie which is used by internal
10103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    debugging tools. Third party drivers should not use this
10113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    command.
10123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
10143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CAP_EXTENDED_FIFO
10153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
10183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
10193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 x;
10203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 y;
10213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
10223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
10233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 reason;
10243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdUpdateVerbose;
10253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_FRONT_ROP_FILL --
10293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a hint which tells the SVGA device that the driver has
10313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    just filled a rectangular region of the GFB with a solid
10323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    color. Instead of reading these pixels from the GFB, the device
10333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    can assume that they all equal 'color'. This is primarily used
10343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    for remote desktop protocols.
10353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
10373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_ACCELFRONT
10383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define  SVGA_ROP_COPY                    0x03
10413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
10433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
10443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 color;     // In the same format as the GFB
10453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 x;
10463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 y;
10473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
10483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
10493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 rop;       // Must be SVGA_ROP_COPY
10503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdFrontRopFill;
10513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_FENCE --
10553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Insert a synchronization fence.  When the SVGA device reaches
10573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    this command, it will copy the 'fence' value into the
10583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_FENCE register. It will also compare the fence against
10593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_FENCE_GOAL. If the fence matches the goal and the
10603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_IRQFLAG_FENCE_GOAL interrupt is enabled, the device will
10613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    raise this interrupt.
10623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
10643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_FENCE for this command,
10653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CAP_IRQMASK for SVGA_FIFO_FENCE_GOAL.
10663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
10693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
10703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 fence;
10713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdFence;
10723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_ESCAPE --
10763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Send an extended or vendor-specific variable length command.
10783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is used for video overlay, third party plugins, and
10793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    internal debugging tools. See svga_escape.h
10803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
10823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_ESCAPE
10833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
10863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
10873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 nsid;
10883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 size;
10893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* followed by 'size' bytes of data */
10903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdEscape;
10913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_DEFINE_SCREEN --
10953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Define or redefine an SVGAScreenObject. See the description of
10973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGAScreenObject above.  The video driver is responsible for
10983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    generating new screen IDs. They should be small positive
10993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    integers. The virtual device will have an implementation
11003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    specific upper limit on the number of screen IDs
11013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    supported. Drivers are responsible for recycling IDs. The first
11023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    valid ID is zero.
11033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    - Interaction with other registers:
11053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    For backwards compatibility, when the GFB mode registers (WIDTH,
11073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    HEIGHT, PITCHLOCK, BITS_PER_PIXEL) are modified, the SVGA device
11083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    deletes all screens other than screen #0, and redefines screen
11093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    #0 according to the specified mode. Drivers that use
11103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CMD_DEFINE_SCREEN should destroy or redefine screen #0.
11113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    If you use screen objects, do not use the legacy multi-mon
11133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    registers (SVGA_REG_NUM_GUEST_DISPLAYS, SVGA_REG_DISPLAY_*).
11143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
11163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_SCREEN_OBJECT
11173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
11183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
11203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
11213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGAScreenObject screen;   // Variable-length according to version
11223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdDefineScreen;
11233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
11263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_DESTROY_SCREEN --
11273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Destroy an SVGAScreenObject. Its ID is immediately available for
11293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    re-use.
11303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
11323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_SCREEN_OBJECT
11333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
11343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
11363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
11373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 screenId;
11383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdDestroyScreen;
11393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
11423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_DEFINE_GMRFB --
11433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command sets a piece of SVGA device state called the
11453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Guest Memory Region Framebuffer, or GMRFB. The GMRFB is a
11463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    piece of light-weight state which identifies the location and
11473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    format of an image in guest memory or in BAR1. The GMRFB has
11483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    an arbitrary size, and it doesn't need to match the geometry
11493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    of the GFB or any screen object.
11503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The GMRFB can be redefined as often as you like. You could
11523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    always use the same GMRFB, you could redefine it before
11533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    rendering from a different guest screen, or you could even
11543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    redefine it before every blit.
11553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    There are multiple ways to use this command. The simplest way is
11573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    to use it to move the framebuffer either to elsewhere in the GFB
11583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    (BAR1) memory region, or to a user-defined GMR. This lets a
11593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    driver use a framebuffer allocated entirely out of normal system
11603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    memory, which we encourage.
11613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Another way to use this command is to set up a ring buffer of
11633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    updates in GFB memory. If a driver wants to ensure that no
11643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    frames are skipped by the SVGA device, it is important that the
11653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    driver not modify the source data for a blit until the device is
11663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    done processing the command. One efficient way to accomplish
11673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    this is to use a ring of small DMA buffers. Each buffer is used
11683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    for one blit, then we move on to the next buffer in the
11693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    ring. The FENCE mechanism is used to protect each buffer from
11703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    re-use until the device is finished with that buffer's
11713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    corresponding blit.
11723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command does not affect the meaning of SVGA_CMD_UPDATE.
11743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    UPDATEs always occur from the legacy GFB memory area. This
11753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    command has no support for pseudocolor GMRFBs. Currently only
11763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    true-color 15, 16, and 24-bit depths are supported. Future
11773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    devices may expose capabilities for additional framebuffer
11783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    formats.
11793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The default GMRFB value is undefined. Drivers must always send
11813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    this command at least once before performing any blit from the
11823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    GMRFB.
11833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
11853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_SCREEN_OBJECT
11863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
11873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
11893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
11903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGAGuestPtr        ptr;
11913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32              bytesPerLine;
11923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGAGMRImageFormat  format;
11933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdDefineGMRFB;
11943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
11973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_BLIT_GMRFB_TO_SCREEN --
11983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a guest-to-host blit. It performs a DMA operation to
12003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    copy a rectangular region of pixels from the current GMRFB to
12013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    one or more Screen Objects.
12023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The destination coordinate may be specified relative to a
12043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    screen's origin (if a screen ID is specified) or relative to the
12053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    virtual coordinate system's origin (if the screen ID is
12063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_ID_INVALID). The actual destination may span zero or more
12073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    screens, in the case of a virtual destination rect or a rect
12083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    which extends off the edge of the specified screen.
12093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command writes to the screen's "base layer": the underlying
12113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    framebuffer which exists below any cursor or video overlays. No
12123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    action is necessary to explicitly hide or update any overlays
12133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    which exist on top of the updated region.
12143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The SVGA device is guaranteed to finish reading from the GMRFB
12163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    by the time any subsequent FENCE commands are reached.
12173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command consumes an annotation. See the
12193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CMD_ANNOTATION_* commands for details.
12203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
12223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_SCREEN_OBJECT
12233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
12243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
12263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
12273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGASignedPoint  srcOrigin;
12283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGASignedRect   destRect;
12293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32           destScreenId;
12303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdBlitGMRFBToScreen;
12313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
12343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_BLIT_SCREEN_TO_GMRFB --
12353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a host-to-guest blit. It performs a DMA operation to
12373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    copy a rectangular region of pixels from a single Screen Object
12383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    back to the current GMRFB.
12393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Usage note: This command should be used rarely. It will
12413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    typically be inefficient, but it is necessary for some types of
12423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    synchronization between 3D (GPU) and 2D (CPU) rendering into
12433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    overlapping areas of a screen.
12443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The source coordinate is specified relative to a screen's
12463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    origin. The provided screen ID must be valid. If any parameters
12473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    are invalid, the resulting pixel values are undefined.
12483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command reads the screen's "base layer". Overlays like
12503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    video and cursor are not included, but any data which was sent
12513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    using a blit-to-screen primitive will be available, no matter
12523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    whether the data's original source was the GMRFB or the 3D
12533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    acceleration hardware.
12543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Note that our guest-to-host blits and host-to-guest blits aren't
12563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    symmetric in their current implementation. While the parameters
12573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    are identical, host-to-guest blits are a lot less featureful.
12583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    They do not support clipping: If the source parameters don't
12593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    fully fit within a screen, the blit fails. They must originate
12603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    from exactly one screen. Virtual coordinates are not directly
12613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    supported.
12623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Host-to-guest blits do support the same set of GMRFB formats
12643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    offered by guest-to-host blits.
12653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The SVGA device is guaranteed to finish writing to the GMRFB by
12673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    the time any subsequent FENCE commands are reached.
12683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
12703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_SCREEN_OBJECT
12713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
12723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
12743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
12753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGASignedPoint  destOrigin;
12763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGASignedRect   srcRect;
12773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32           srcScreenId;
12783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdBlitScreenToGMRFB;
12793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
12823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_ANNOTATION_FILL --
12833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a blit annotation. This command stores a small piece of
12853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    device state which is consumed by the next blit-to-screen
12863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    command. The state is only cleared by commands which are
12873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    specifically documented as consuming an annotation. Other
12883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    commands (such as ESCAPEs for debugging) may intervene between
12893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    the annotation and its associated blit.
12903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This annotation is a promise about the contents of the next
12923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    blit: The video driver is guaranteeing that all pixels in that
12933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    blit will have the same value, specified here as a color in
12943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGAColorBGRX format.
12953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The SVGA device can still render the blit correctly even if it
12973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    ignores this annotation, but the annotation may allow it to
12983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    perform the blit more efficiently, for example by ignoring the
12993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    source data and performing a fill in hardware.
13003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This annotation is most important for performance when the
13023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    user's display is being remoted over a network connection.
13033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
13053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_SCREEN_OBJECT
13063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
13073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
13093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
13103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGAColorBGRX  color;
13113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdAnnotationFill;
13123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
13153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_ANNOTATION_COPY --
13163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a blit annotation. See SVGA_CMD_ANNOTATION_FILL for more
13183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    information about annotations.
13193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This annotation is a promise about the contents of the next
13213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    blit: The video driver is guaranteeing that all pixels in that
13223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    blit will have the same value as those which already exist at an
13233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    identically-sized region on the same or a different screen.
13243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Note that the source pixels for the COPY in this annotation are
13263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    sampled before applying the anqnotation's associated blit. They
13273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    are allowed to overlap with the blit's destination pixels.
13283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The copy source rectangle is specified the same way as the blit
13303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    destination: it can be a rectangle which spans zero or more
13313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    screens, specified relative to either a screen or to the virtual
13323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    coordinate system's origin. If the source rectangle includes
13333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    pixels which are not from exactly one screen, the results are
13343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    undefined.
13353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
13373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_SCREEN_OBJECT
13383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
13393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
13413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
13423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGASignedPoint  srcOrigin;
13433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32           srcScreenId;
13443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdAnnotationCopy;
13453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif
1347