13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**********************************************************
2c191b507cbbc4572c9a58cf019db08def651b265Brian Paul * Copyright 1998-2015 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
352e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#include "svga_types.h"
362e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
372e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
382e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_REG_ENABLE bit definitions.
392e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
402e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef enum {
412e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REG_ENABLE_DISABLE = 0,
422e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REG_ENABLE_ENABLE = (1 << 0),
432e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REG_ENABLE_HIDE = (1 << 1),
442e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SvgaRegEnable;
452e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
46c191b507cbbc4572c9a58cf019db08def651b265Brian Paultypedef uint32 SVGAMobId;
47c191b507cbbc4572c9a58cf019db08def651b265Brian Paul
483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
492e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Arbitrary and meaningless limits. Please ignore these when writing
502e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * new drivers.
513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
522e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_MAX_WIDTH                  2560
532e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_MAX_HEIGHT                 1600
542e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_MAX_BITS_PER_PIXEL         32
552e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_MAX_DEPTH                  24
562e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_MAX_DISPLAYS               10
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Legal values for the SVGA_REG_CURSOR_ON register in old-fashioned
603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * cursor bypass mode. This is still supported, but no new guest
613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * drivers should use it.
623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CURSOR_ON_HIDE            0x0   /* Must be 0 to maintain backward compatibility */
643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CURSOR_ON_SHOW            0x1   /* Must be 1 to maintain backward compatibility */
653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CURSOR_ON_REMOVE_FROM_FB  0x2   /* Remove the cursor from the framebuffer because we need to see what's under it */
663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CURSOR_ON_RESTORE_TO_FB   0x3   /* Put the cursor back in the framebuffer so the user can see it */
673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The maximum framebuffer size that can traced for e.g. guests in VESA mode.
703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The changeMap in the monitor is proportional to this number. Therefore, we'd
713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * like to keep it as small as possible to reduce monitor overhead (using
723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_VRAM_MAX_SIZE for this increases the size of the shared area by over
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 4k!).
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NB: For compatibility reasons, this value must be greater than 0xff0000.
763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     See bug 335072.
773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FB_MAX_TRACEABLE_SIZE      0x1000000
793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_MAX_PSEUDOCOLOR_DEPTH      8
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_MAX_PSEUDOCOLORS           (1 << SVGA_MAX_PSEUDOCOLOR_DEPTH)
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_NUM_PALETTE_REGS           (3 * SVGA_MAX_PSEUDOCOLORS)
833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_MAGIC         0x900000UL
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_MAKE_ID(ver)  (SVGA_MAGIC << 8 | (ver))
863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Version 2 let the address of the frame buffer be unsigned on Win32 */
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_VERSION_2     2
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_ID_2          SVGA_MAKE_ID(SVGA_VERSION_2)
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Version 1 has new registers starting with SVGA_REG_CAPABILITIES so
923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   PALETTE_BASE has moved */
933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_VERSION_1     1
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_ID_1          SVGA_MAKE_ID(SVGA_VERSION_1)
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Version 0 is the initial version */
973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_VERSION_0     0
983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_ID_0          SVGA_MAKE_ID(SVGA_VERSION_0)
993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* "Invalid" value for all SVGA IDs. (Version ID, screen object ID, surface ID...) */
1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_ID_INVALID    0xFFFFFFFF
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Port offsets, relative to BAR0 */
1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_INDEX_PORT         0x0
1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_VALUE_PORT         0x1
1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_BIOS_PORT          0x2
1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_IRQSTATUS_PORT     0x8
1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Interrupt source flags for IRQSTATUS_PORT and IRQMASK.
1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Interrupts are only supported when the
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CAP_IRQMASK capability is present.
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_IRQFLAG_ANY_FENCE            0x1    /* Any fence was passed */
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_IRQFLAG_FIFO_PROGRESS        0x2    /* Made forward progress in the FIFO */
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_IRQFLAG_FENCE_GOAL           0x4    /* SVGA_FIFO_FENCE_GOAL reached */
1182e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_IRQFLAG_COMMAND_BUFFER       0x8    /* Command buffer completed */
1192e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_IRQFLAG_ERROR                0x10   /* Error while processing commands */
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Registers
1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum {
1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_ID = 0,
1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_ENABLE = 1,
1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_WIDTH = 2,
1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_HEIGHT = 3,
1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_MAX_WIDTH = 4,
1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_MAX_HEIGHT = 5,
1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DEPTH = 6,
1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_BITS_PER_PIXEL = 7,       /* Current bpp in the guest */
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_PSEUDOCOLOR = 8,
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_RED_MASK = 9,
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GREEN_MASK = 10,
1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_BLUE_MASK = 11,
1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_BYTES_PER_LINE = 12,
1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_FB_START = 13,            /* (Deprecated) */
1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_FB_OFFSET = 14,
1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_VRAM_SIZE = 15,
1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_FB_SIZE = 16,
1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* ID 0 implementation only had the above registers, then the palette */
1452e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REG_ID_0_TOP = 17,
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CAPABILITIES = 17,
1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_MEM_START = 18,           /* (Deprecated) */
1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_MEM_SIZE = 19,
1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CONFIG_DONE = 20,         /* Set when memory area configured */
1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_SYNC = 21,                /* See "FIFO Synchronization Registers" */
1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_BUSY = 22,                /* See "FIFO Synchronization Registers" */
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GUEST_ID = 23,            /* Set guest OS identifier */
1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CURSOR_ID = 24,           /* (Deprecated) */
1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CURSOR_X = 25,            /* (Deprecated) */
1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CURSOR_Y = 26,            /* (Deprecated) */
1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_CURSOR_ON = 27,           /* (Deprecated) */
1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_HOST_BITS_PER_PIXEL = 28, /* (Deprecated) */
1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_SCRATCH_SIZE = 29,        /* Number of scratch registers */
1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_MEM_REGS = 30,            /* Number of FIFO registers */
1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_NUM_DISPLAYS = 31,        /* (Deprecated) */
1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_PITCHLOCK = 32,           /* Fixed pitch for all modes */
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_IRQMASK = 33,             /* Interrupt mask */
1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Legacy multi-monitor support */
1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_NUM_GUEST_DISPLAYS = 34,/* Number of guest displays in X/Y direction */
1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_ID = 35,        /* Display ID for the following display attributes */
1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_IS_PRIMARY = 36,/* Whether this is a primary display */
1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_POSITION_X = 37,/* The display position x */
1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_POSITION_Y = 38,/* The display position y */
1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_WIDTH = 39,     /* The display's width */
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_DISPLAY_HEIGHT = 40,    /* The display's height */
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* See "Guest memory regions" below. */
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GMR_ID = 41,
1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GMR_DESCRIPTOR = 42,
1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GMR_MAX_IDS = 43,
1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_GMR_MAX_DESCRIPTOR_LENGTH = 44,
1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_REG_TRACES = 45,            /* Enable trace-based updates even when FIFO is on */
1812e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REG_GMRS_MAX_PAGES = 46,    /* Maximum number of 4KB pages for all GMRs */
1822e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REG_MEMORY_SIZE = 47,       /* Total dedicated device memory excluding FIFO */
1832e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REG_COMMAND_LOW = 48,       /* Lower 32 bits and submits commands */
1842e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REG_COMMAND_HIGH = 49,      /* Upper 32 bits of command buffer PA */
1850c065270c0ff063edba03516b22d734023cac912Charmaine Lee   SVGA_REG_MAX_PRIMARY_BOUNDING_BOX_MEM = 50,   /* Max primary memory */
1860c065270c0ff063edba03516b22d734023cac912Charmaine Lee   SVGA_REG_SUGGESTED_GBOBJECT_MEM_SIZE_KB = 51, /* Suggested limit on mob mem */
1870c065270c0ff063edba03516b22d734023cac912Charmaine Lee   SVGA_REG_DEV_CAP = 52,           /* Write dev cap index, read value */
1880c065270c0ff063edba03516b22d734023cac912Charmaine Lee   SVGA_REG_CMD_PREPEND_LOW = 53,
1890c065270c0ff063edba03516b22d734023cac912Charmaine Lee   SVGA_REG_iCMD_PREPEND_HIGH = 54,
1900c065270c0ff063edba03516b22d734023cac912Charmaine Lee   SVGA_REG_SCREENTARGET_MAX_WIDTH = 55,
1910c065270c0ff063edba03516b22d734023cac912Charmaine Lee   SVGA_REG_SCREENTARGET_MAX_HEIGHT = 56,
1920c065270c0ff063edba03516b22d734023cac912Charmaine Lee   SVGA_REG_MOB_MAX_SIZE = 57,
1930c065270c0ff063edba03516b22d734023cac912Charmaine Lee   SVGA_REG_TOP = 58,               /* Must be 1 more than the last register */
1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_PALETTE_BASE = 1024,        /* Base of SVGA color map */
1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Next 768 (== 256*3) registers exist for colormap */
1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_SCRATCH_BASE = SVGA_PALETTE_BASE + SVGA_NUM_PALETTE_REGS
1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                    /* Base of scratch registers */
1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Next reg[SVGA_REG_SCRATCH_SIZE] registers exist for scratch usage:
2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      First 4 are reserved for VESA BIOS Extension; any remaining are for
2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      the use of the current SVGA driver. */
2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Guest memory regions (GMRs):
2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * This is a new memory mapping feature available in SVGA devices
2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * which have the SVGA_CAP_GMR bit set. Previously, there were two
2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * fixed memory regions available with which to share data between the
2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * device and the driver: the FIFO ('MEM') and the framebuffer. GMRs
2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * are our name for an extensible way of providing arbitrary DMA
2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * buffers for use between the driver and the SVGA device. They are a
2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * new alternative to framebuffer memory, usable for both 2D and 3D
2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * graphics operations.
2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Since GMR mapping must be done synchronously with guest CPU
2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * execution, we use a new pair of SVGA registers:
2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   SVGA_REG_GMR_ID --
2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     Read/write.
2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     This register holds the 32-bit ID (a small positive integer)
2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     of a GMR to create, delete, or redefine. Writing this register
2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     has no side-effects.
2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   SVGA_REG_GMR_DESCRIPTOR --
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     Write-only.
2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     Writing this register will create, delete, or redefine the GMR
2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     specified by the above ID register. If this register is zero,
2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     the GMR is deleted. Any pointers into this GMR (including those
2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     currently being processed by FIFO commands) will be
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     synchronously invalidated.
2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     If this register is nonzero, it must be the physical page
2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     number (PPN) of a data structure which describes the physical
2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     layout of the memory region this GMR should describe. The
2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     descriptor structure will be read synchronously by the SVGA
2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     device when this register is written. The descriptor need not
2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     remain allocated for the lifetime of the GMR.
2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     The guest driver should write SVGA_REG_GMR_ID first, then
2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     SVGA_REG_GMR_DESCRIPTOR.
2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   SVGA_REG_GMR_MAX_IDS --
2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     Read-only.
2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     The SVGA device may choose to support a maximum number of
2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     user-defined GMR IDs. This register holds the number of supported
2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     IDs. (The maximum supported ID plus 1)
2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   SVGA_REG_GMR_MAX_DESCRIPTOR_LENGTH --
2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     Read-only.
2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     The SVGA device may choose to put a limit on the total number
2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     of SVGAGuestMemDescriptor structures it will read when defining
2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     a single GMR.
2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The descriptor structure is an array of SVGAGuestMemDescriptor
2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * structures. Each structure may do one of three things:
2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   - Terminate the GMR descriptor list.
2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     (ppn==0, numPages==0)
2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   - Add a PPN or range of PPNs to the GMR's virtual address space.
2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     (ppn != 0, numPages != 0)
2673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   - Provide the PPN of the next SVGAGuestMemDescriptor, in order to
2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     support multi-page GMR descriptor tables without forcing the
2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     driver to allocate physically contiguous memory.
2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *     (ppn != 0, numPages == 0)
2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Note that each physical page of SVGAGuestMemDescriptor structures
2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * can describe at least 2MB of guest memory. If the driver needs to
2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * use more than one page of descriptor structures, it must use one of
2763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * its SVGAGuestMemDescriptors to point to an additional page.  The
2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * device will never automatically cross a page boundary.
2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Once the driver has described a GMR, it is immediately available
2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * for use via any FIFO command that uses an SVGAGuestPtr structure.
2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * These pointers include a GMR identifier plus an offset into that
2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * GMR.
2833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The driver must check the SVGA_CAP_GMR bit before using the GMR
2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * registers.
2863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Special GMR IDs, allowing SVGAGuestPtrs to point to framebuffer
2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * memory as well.  In the future, these IDs could even be used to
2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * allow legacy memory regions to be redefined by the guest as GMRs.
2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Using the guest framebuffer (GFB) at BAR1 for general purpose DMA
2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * is being phased out. Please try to use user-defined GMRs whenever
2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * possible.
2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_GMR_NULL         ((uint32) -1)
2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_GMR_FRAMEBUFFER  ((uint32) -2)  // Guest Framebuffer (GFB)
2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
3013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct SVGAGuestMemDescriptor {
3023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 ppn;
3033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 numPages;
3043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAGuestMemDescriptor;
3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
3073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct SVGAGuestPtr {
3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 gmrId;
3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 offset;
3103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAGuestPtr;
3113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3122e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
3132e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Register based command buffers --
3142e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
3152e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Provide an SVGA device interface that allows the guest to submit
3162e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * command buffers to the SVGA device through an SVGA device register.
3172e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * The metadata for each command buffer is contained in the
3182e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGACBHeader structure along with the return status codes.
3192e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
3202e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * The SVGA device supports command buffers if
3212e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CAP_COMMAND_BUFFERS is set in the device caps register.  The
3222e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * fifo must be enabled for command buffers to be submitted.
3232e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
3242e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Command buffers are submitted when the guest writing the 64 byte
3252e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * aligned physical address into the SVGA_REG_COMMAND_LOW and
3262e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_REG_COMMAND_HIGH.  SVGA_REG_COMMAND_HIGH contains the upper 32
3272e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * bits of the physical address.  SVGA_REG_COMMAND_LOW contains the
3282e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * lower 32 bits of the physical address, since the command buffer
3292e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * headers are required to be 64 byte aligned the lower 6 bits are
3302e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * used for the SVGACBContext value.  Writing to SVGA_REG_COMMAND_LOW
3312e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * submits the command buffer to the device and queues it for
3322e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * execution.  The SVGA device supports at least
3332e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CB_MAX_QUEUED_PER_CONTEXT command buffers that can be queued
3342e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * per context and if that limit is reached the device will write the
3352e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * status SVGA_CB_STATUS_QUEUE_FULL to the status value of the command
3362e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * buffer header synchronously and not raise any IRQs.
3372e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
3382e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * It is invalid to submit a command buffer without a valid physical
3392e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * address and results are undefined.
3402e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
3412e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * The device guarantees that command buffers of size SVGA_CB_MAX_SIZE
3422e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * will be supported.  If a larger command buffer is submitted results
3432e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * are unspecified and the device will either complete the command
3442e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * buffer or return an error.
3452e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
3462e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * The device guarantees that any individual command in a command
3472e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * buffer can be up to SVGA_CB_MAX_COMMAND_SIZE in size which is
3482e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * enough to fit a 64x64 color-cursor definition.  If the command is
3492e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * too large the device is allowed to process the command or return an
3502e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * error.
3512e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
3522e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * The device context is a special SVGACBContext that allows for
3532e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * synchronous register like accesses with the flexibility of
3542e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * commands.  There is a different command set defined by
3552e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGADeviceContextCmdId.  The commands in each command buffer is not
3562e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * allowed to straddle physical pages.
3572e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
3582e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
3592e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_CB_MAX_SIZE (512 * 1024)  // 512 KB
3602e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_CB_MAX_QUEUED_PER_CONTEXT 32
3612e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_CB_MAX_COMMAND_SIZE (32 * 1024) // 32 KB
3622e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
3632e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_CB_CONTEXT_MASK 0x3f
3642e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef enum {
3652e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CB_CONTEXT_DEVICE = 0x3f,
3662e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CB_CONTEXT_0      = 0x0,
3672e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CB_CONTEXT_MAX    = 0x1,
3682e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGACBContext;
3692e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
3702e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
3712e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef enum {
3722e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   /*
3732e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * The guest is supposed to write SVGA_CB_STATUS_NONE to the status
3742e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * field before submitting the command buffer header, the host will
3752e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * change the value when it is done with the command buffer.
3762e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    */
3772e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CB_STATUS_NONE             = 0,
3782e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
3792e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   /*
3802e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Written by the host when a command buffer completes successfully.
3812e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * The device raises an IRQ with SVGA_IRQFLAG_COMMAND_BUFFER unless
3822e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * the SVGA_CB_FLAG_NO_IRQ flag is set.
3832e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    */
3842e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CB_STATUS_COMPLETED        = 1,
3852e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
3862e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   /*
3872e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Written by the host synchronously with the command buffer
3882e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * submission to indicate the command buffer was not submitted.  No
3892e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * IRQ is raised.
3902e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    */
3912e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CB_STATUS_QUEUE_FULL       = 2,
3922e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
3932e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   /*
3942e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Written by the host when an error was detected parsing a command
3952e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * in the command buffer, errorOffset is written to contain the
3962e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * offset to the first byte of the failing command.  The device
3972e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * raises the IRQ with both SVGA_IRQFLAG_ERROR and
3982e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * SVGA_IRQFLAG_COMMAND_BUFFER.  Some of the commands may have been
3992e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * processed.
4002e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    */
4012e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CB_STATUS_COMMAND_ERROR    = 3,
4022e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
4032e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   /*
4042e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Written by the host if there is an error parsing the command
4052e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * buffer header.  The device raises the IRQ with both
4062e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * SVGA_IRQFLAG_ERROR and SVGA_IRQFLAG_COMMAND_BUFFER.  The device
4072e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * did not processes any of the command buffer.
4082e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    */
4092e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CB_STATUS_CB_HEADER_ERROR  = 4,
4102e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
4112e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   /*
4122e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Written by the host if the guest requested the host to preempt
4132e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * the command buffer.  The device will not raise any IRQs and the
4142e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * command buffer was not processed.
4152e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    */
4162e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CB_STATUS_PREEMPTED        = 5,
4172e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGACBStatus;
4182e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
4192e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef enum {
4202e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CB_FLAG_NONE     = 0,
4212e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CB_FLAG_NO_IRQ   = 1 << 0,
4222e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGACBFlags;
4232e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
4242e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef
4252e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paulstruct {
4262e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   volatile SVGACBStatus status;
4272e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   volatile uint32 errorOffset;
4282e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint64 id;
4292e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGACBFlags flags;
4302e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 length;
4312e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   union {
4322e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul      PA pa;
4332e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   } ptr;
4342e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 mustBeZero[8];
4352e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGACBHeader;
4362e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
4372e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef enum {
4382e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_DC_CMD_NOP                   = 0,
4392e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_DC_CMD_START_STOP_CONTEXT    = 1,
4402e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_DC_CMD_PREEMPT               = 2,
4412e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_DC_CMD_MAX                   = 3,
4422e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_DC_CMD_FORCE_UINT            = MAX_UINT32,
4432e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGADeviceContextCmdId;
4442e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
4452e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef struct {
4462e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 enable;
4472e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGACBContext context;
4482e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGADCCmdStartStop;
4492e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
4502e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
4512e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGADCCmdPreempt --
4522e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
4532e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * This command allows the guest to request that all command buffers
4542e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * on the specified context be preempted that can be.  After execution
4552e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * of this command all command buffers that were preempted will
4562e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * already have SVGA_CB_STATUS_PREEMPTED written into the status
4572e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * field.  The device might still be processing a command buffer,
4582e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * assuming execution of it started before the preemption request was
4592e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * received.  Specifying the ignoreIDZero flag to TRUE will cause the
4602e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * device to not preempt command buffers with the id field in the
4612e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * command buffer header set to zero.
4622e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
4632e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
4642e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef struct {
4652e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGACBContext context;
4662e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 ignoreIDZero;
4672e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGADCCmdPreempt;
4682e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
4693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
4713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGAGMRImageFormat --
4723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
4733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a packed representation of the source 2D image format
4743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    for a GMR-to-screen blit. Currently it is defined as an encoding
4753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    of the screen's color depth and bits-per-pixel, however, 16 bits
4763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    are reserved for future use to identify other encodings (such as
4773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    RGBA or higher-precision images).
4783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
4793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Currently supported formats:
4803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
4813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       bpp depth  Format Name
4823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       --- -----  -----------
4833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *        32    24  32-bit BGRX
4843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *        24    24  24-bit BGR
4853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *        16    16  RGB 5-6-5
4863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *        16    15  RGB 5-5-5
4873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
4883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
4893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4902e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef struct SVGAGMRImageFormat {
4913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   union {
4923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      struct {
4933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 bitsPerPixel : 8;
4943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 colorDepth   : 8;
495c191b507cbbc4572c9a58cf019db08def651b265Brian Paul	 uint32 reserved     : 16;  /* Must be zero */
4963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      };
4973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      uint32 value;
4993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   };
5003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAGMRImageFormat;
5013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5022e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef
5032e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paulstruct SVGAGuestImage {
5042e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGAGuestPtr         ptr;
5052e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
5062e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   /*
5072e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * A note on interpretation of pitch: This value of pitch is the
5082e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * number of bytes between vertically adjacent image
5092e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * blocks. Normally this is the number of bytes between the first
5102e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * pixel of two adjacent scanlines. With compressed textures,
5112e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * however, this may represent the number of bytes between
5122e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * compression blocks rather than between rows of pixels.
5132e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    *
5142e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * XXX: Compressed textures currently must be tightly packed in guest memory.
5152e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    *
5162e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * If the image is 1-dimensional, pitch is ignored.
5172e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    *
5182e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * If 'pitch' is zero, the SVGA3D device calculates a pitch value
5192e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * assuming each row of blocks is tightly packed.
5202e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    */
5212e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 pitch;
5222e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGAGuestImage;
5232e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
5243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
5253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGAColorBGRX --
5263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    A 24-bit color format (BGRX), which does not depend on the
5283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    format of the legacy guest framebuffer (GFB) or the current
5293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    GMRFB state.
5303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
5313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5322e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef struct SVGAColorBGRX {
5333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   union {
5343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      struct {
5353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 b : 8;
5363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 g : 8;
5373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         uint32 r : 8;
538c191b507cbbc4572c9a58cf019db08def651b265Brian Paul	     uint32 x : 8;  /* Unused */
5393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      };
5403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      uint32 value;
5423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   };
5433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAColorBGRX;
5443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
5473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGASignedRect --
5483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGASignedPoint --
5493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Signed rectangle and point primitives. These are used by the new
5513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    2D primitives for drawing to Screen Objects, which can occupy a
5523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    signed virtual coordinate space.
5533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGASignedRect specifies a half-open interval: the (left, top)
5553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    pixel is part of the rectangle, but the (right, bottom) pixel is
5563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    not.
5573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
5583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
5602e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paulstruct {
5613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  left;
5623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  top;
5633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  right;
5643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  bottom;
5653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGASignedRect;
5663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
5682e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paulstruct {
5693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  x;
5703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  y;
5713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGASignedPoint;
5723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
5752e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA Device Capabilities
5762e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
5772e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Note the holes in the bitfield. Missing bits have been deprecated,
5782e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * and must not be reused. Those capabilities will never be reported
5792e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * by new versions of the SVGA device.
5802e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
5812e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * XXX: Add longer descriptions for each capability, including a list
5822e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *      of the new features that each capability provides.
5832e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
5842e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CAP_IRQMASK --
5852e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Provides device interrupts.  Adds device register SVGA_REG_IRQMASK
5862e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    to set interrupt mask and direct I/O port SVGA_IRQSTATUS_PORT to
5872e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    set/clear pending interrupts.
5882e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
5892e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CAP_GMR --
5902e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Provides synchronous mapping of guest memory regions (GMR).
5912e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Adds device registers SVGA_REG_GMR_ID, SVGA_REG_GMR_DESCRIPTOR,
5922e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_REG_GMR_MAX_IDS, and SVGA_REG_GMR_MAX_DESCRIPTOR_LENGTH.
5932e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
5942e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CAP_TRACES --
5952e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Allows framebuffer trace-based updates even when FIFO is enabled.
5962e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Adds device register SVGA_REG_TRACES.
5972e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
5982e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CAP_GMR2 --
5992e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Provides asynchronous commands to define and remap guest memory
6002e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    regions.  Adds device registers SVGA_REG_GMRS_MAX_PAGES and
6012e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_REG_MEMORY_SIZE.
6022e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
6032e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CAP_SCREEN_OBJECT_2 --
6042e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Allow screen object support, and require backing stores from the
6052e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    guest for each screen object.
6062e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
6072e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CAP_COMMAND_BUFFERS --
6082e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Enable register based command buffer submission.
6092e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
610c191b507cbbc4572c9a58cf019db08def651b265Brian Paul * SVGA_CAP_DEAD1 --
611c191b507cbbc4572c9a58cf019db08def651b265Brian Paul *    This cap was incorrectly used by old drivers and should not be
612c191b507cbbc4572c9a58cf019db08def651b265Brian Paul *    reused.
613c191b507cbbc4572c9a58cf019db08def651b265Brian Paul *
614c191b507cbbc4572c9a58cf019db08def651b265Brian Paul * SVGA_CAP_CMD_BUFFERS_2 --
615c191b507cbbc4572c9a58cf019db08def651b265Brian Paul *    Enable support for the prepend command buffer submision
616c191b507cbbc4572c9a58cf019db08def651b265Brian Paul *    registers.  SVGA_REG_CMD_PREPEND_LOW and
617c191b507cbbc4572c9a58cf019db08def651b265Brian Paul *    SVGA_REG_CMD_PREPEND_HIGH.
618c191b507cbbc4572c9a58cf019db08def651b265Brian Paul *
6192e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CAP_GBOBJECTS --
6202e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Enable guest-backed objects and surfaces.
6213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
622c191b507cbbc4572c9a58cf019db08def651b265Brian Paul * SVGA_CAP_CMD_BUFFERS_3 --
623c191b507cbbc4572c9a58cf019db08def651b265Brian Paul *    Enable support for command buffers in a mob.
6243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
6253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_NONE               0x00000000
6273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_RECT_COPY          0x00000002
6283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_CURSOR             0x00000020
629c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_CAP_CURSOR_BYPASS      0x00000040
630c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_CAP_CURSOR_BYPASS_2    0x00000080
6313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_8BIT_EMULATION     0x00000100
6323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_ALPHA_CURSOR       0x00000200
6333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_3D                 0x00004000
6343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_EXTENDED_FIFO      0x00008000
635c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_CAP_MULTIMON           0x00010000
6363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_PITCHLOCK          0x00020000
6373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_IRQMASK            0x00040000
638c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_CAP_DISPLAY_TOPOLOGY   0x00080000
6393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_GMR                0x00100000
6403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CAP_TRACES             0x00200000
6412e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_CAP_GMR2               0x00400000
6422e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_CAP_SCREEN_OBJECT_2    0x00800000
6432e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_CAP_COMMAND_BUFFERS    0x01000000
6442e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_CAP_DEAD1              0x02000000
6452e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_CAP_CMD_BUFFERS_2      0x04000000
6462e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_CAP_GBOBJECTS          0x08000000
647c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_CAP_CMD_BUFFERS_3      0x10000000
648c191b507cbbc4572c9a58cf019db08def651b265Brian Paul
649c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_CAP_CMD_RESERVED       0x80000000
6502e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
6512e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
6522e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
6532e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * The Guest can optionally read some SVGA device capabilities through
6542e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * the backdoor with command BDOOR_CMD_GET_SVGA_CAPABILITIES before
6552e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * the SVGA device is initialized.  The type of capability the guest
6562e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * is requesting from the SVGABackdoorCapType enum should be placed in
6572e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * the upper 16 bits of the backdoor command id (ECX).  On success the
6582e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * the value of EBX will be set to BDOOR_MAGIC and EAX will be set to
6592e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * the requested capability.  If the command is not supported then EBX
6602e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * will be left unchanged and EAX will be set to -1.  Because it is
6612e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * possible that -1 is the value of the requested cap the correct way
6622e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * to check if the command was successful is to check if EBX was changed
6632e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * to BDOOR_MAGIC making sure to initialize the register to something
6642e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * else first.
6652e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
6662e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
6672e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef enum {
6682e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGABackdoorCapDeviceCaps = 0,
6692e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGABackdoorCapFifoCaps = 1,
6702e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGABackdoorCap3dHWVersion = 2,
6712e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGABackdoorCapMax = 3,
6722e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGABackdoorCapType;
6733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
6763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFO register indices.
6773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The FIFO is a chunk of device memory mapped into guest physmem.  It
6793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * is always treated as 32-bit words.
6803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The guest driver gets to decide how to partition it between
6823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * - FIFO registers (there are always at least 4, specifying where the
6833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   following data area is and how much data it contains; there may be
6843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   more registers following these, depending on the FIFO protocol
6853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *   version in use)
6863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * - FIFO data, written by the guest and slurped out by the VMX.
6873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * These indices are 32-bit word offsets into the FIFO.
6883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
6893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum {
6913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
6923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Block 1 (basic registers): The originally defined FIFO registers.
6933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * These exist and are valid for all versions of the FIFO protocol.
6943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
6953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_MIN = 0,
6973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_MAX,       /* The distance from MIN to MAX must be at least 10K */
6983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_NEXT_CMD,
6993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_STOP,
7003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
7023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Block 2 (extended registers): Mandatory registers for the extended
7033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * FIFO.  These exist if the SVGA caps register includes
7043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * SVGA_CAP_EXTENDED_FIFO; some of them are valid only if their
7053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * associated capability bit is enabled.
7063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    *
7073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Note that when originally defined, SVGA_CAP_EXTENDED_FIFO implied
7083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * support only for (FIFO registers) CAPABILITIES, FLAGS, and FENCE.
7093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * This means that the guest has to test individually (in most cases
7103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * using FIFO caps) for the presence of registers after this; the VMX
7113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * can define "extended FIFO" to mean whatever it wants, and currently
7123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * won't enable it unless there's room for that set and much more.
7133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
7143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CAPABILITIES = 4,
7163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_FLAGS,
717c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   /* Valid with SVGA_FIFO_CAP_FENCE: */
7183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_FENCE,
7193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
7213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Block 3a (optional extended registers): Additional registers for the
7223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * extended FIFO, whose presence isn't actually implied by
7233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * SVGA_CAP_EXTENDED_FIFO; these exist if SVGA_FIFO_MIN is high enough to
7243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * leave room for them.
7253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    *
7263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * These in block 3a, the VMX currently considers mandatory for the
7273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * extended FIFO.
7283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
729c191b507cbbc4572c9a58cf019db08def651b265Brian Paul
730c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   /* Valid if exists (i.e. if extended FIFO enabled): */
7313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_3D_HWVERSION,       /* See SVGA3dHardwareVersion in svga3d_reg.h */
732c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   /* Valid with SVGA_FIFO_CAP_PITCHLOCK: */
7333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_PITCHLOCK,
7343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
735c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   /* Valid with SVGA_FIFO_CAP_CURSOR_BYPASS_3: */
7363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_ON,          /* Cursor bypass 3 show/hide register */
7373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_X,           /* Cursor bypass 3 x register */
7383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_Y,           /* Cursor bypass 3 y register */
7393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_COUNT,       /* Incremented when any of the other 3 change */
7403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_LAST_UPDATED,/* Last time the host updated the cursor */
7413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
742c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   /* Valid with SVGA_FIFO_CAP_RESERVE: */
7433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_RESERVED,           /* Bytes past NEXT_CMD with real contents */
7443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
7462e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Valid with SVGA_FIFO_CAP_SCREEN_OBJECT or SVGA_FIFO_CAP_SCREEN_OBJECT_2:
7473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    *
7483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * By default this is SVGA_ID_INVALID, to indicate that the cursor
7493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * coordinates are specified relative to the virtual root. If this
7503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * is set to a specific screen ID, cursor position is reinterpreted
7512e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * as a signed offset relative to that screen's origin.
7523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
7533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_CURSOR_SCREEN_ID,
7543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
7562e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Valid with SVGA_FIFO_CAP_DEAD
7572e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    *
7582e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * An arbitrary value written by the host, drivers should not use it.
7592e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    */
7602e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_FIFO_DEAD,
7612e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
7622e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   /*
7632e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Valid with SVGA_FIFO_CAP_3D_HWVERSION_REVISED:
7642e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    *
7652e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Contains 3D HWVERSION (see SVGA3dHardwareVersion in svga3d_reg.h)
7662e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * on platforms that can enforce graphics resource limits.
7672e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    */
7682e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_FIFO_3D_HWVERSION_REVISED,
7692e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
7702e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   /*
7713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * XXX: The gap here, up until SVGA_FIFO_3D_CAPS, can be used for new
7723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * registers, but this must be done carefully and with judicious use of
7733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * capability bits, since comparisons based on SVGA_FIFO_MIN aren't
7743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * enough to tell you whether the register exists: we've shipped drivers
7753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * and products that used SVGA_FIFO_3D_CAPS but didn't know about some of
7763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * the earlier ones.  The actual order of introduction was:
7773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * - PITCHLOCK
7783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * - 3D_CAPS
7793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * - CURSOR_* (cursor bypass 3)
7803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * - RESERVED
7813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * So, code that wants to know whether it can use any of the
7823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * aforementioned registers, or anything else added after PITCHLOCK and
7833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * before 3D_CAPS, needs to reason about something other than
7843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * SVGA_FIFO_MIN.
7853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
7863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
7883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * 3D caps block space; valid with 3D hardware version >=
7893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * SVGA3D_HWVERSION_WS6_B1.
7903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
7913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_3D_CAPS      = 32,
7923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_3D_CAPS_LAST = 32 + 255,
7933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
7953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * End of VMX's current definition of "extended-FIFO registers".
7963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Registers before here are always enabled/disabled as a block; either
7973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * the extended FIFO is enabled and includes all preceding registers, or
7983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * it's disabled entirely.
7993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    *
8003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Block 3b (truly optional extended registers): Additional registers for
8013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * the extended FIFO, which the VMX already knows how to enable and
8023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * disable with correct granularity.
8033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    *
8043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Registers after here exist if and only if the guest SVGA driver
8053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * sets SVGA_FIFO_MIN high enough to leave room for them.
8063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
8073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
808c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   /* Valid if register exists: */
8093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_GUEST_3D_HWVERSION, /* Guest driver's 3D version */
8103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_FENCE_GOAL,         /* Matching target for SVGA_IRQFLAG_FENCE_GOAL */
8113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_FIFO_BUSY,               /* See "FIFO Synchronization Registers" */
8123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
8143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Always keep this last.  This defines the maximum number of
8153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * registers we know about.  At power-on, this value is placed in
8163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * the SVGA_REG_MEM_REGS register, and we expect the guest driver
8173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * to allocate this much space in FIFO memory for registers.
8183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
8193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    SVGA_FIFO_NUM_REGS
8203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
8213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
8243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Definition of registers included in extended FIFO support.
8253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The guest SVGA driver gets to allocate the FIFO between registers
8273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * and data.  It must always allocate at least 4 registers, but old
8283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * drivers stopped there.
8293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The VMX will enable extended FIFO support if and only if the guest
8313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * left enough room for all registers defined as part of the mandatory
8323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * set for the extended FIFO.
8333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Note that the guest drivers typically allocate the FIFO only at
8353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * initialization time, not at mode switches, so it's likely that the
8363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * number of FIFO registers won't change without a reboot.
8373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * All registers less than this value are guaranteed to be present if
8393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * svgaUser->fifo.extended is set. Any later registers must be tested
8403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * individually for compatibility at each use (in the VMX).
8413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * This value is used only by the VMX, so it can change without
8433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * affecting driver compatibility; keep it that way?
8443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
8453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_EXTENDED_MANDATORY_REGS  (SVGA_FIFO_3D_CAPS_LAST + 1)
8463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
8493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFO Synchronization Registers
8503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  This explains the relationship between the various FIFO
8523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  sync-related registers in IOSpace and in FIFO space.
8533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  SVGA_REG_SYNC --
8553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       The SYNC register can be used in two different ways by the guest:
8573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         1. If the guest wishes to fully sync (drain) the FIFO,
8593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            it will write once to SYNC then poll on the BUSY
8603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            register. The FIFO is sync'ed once BUSY is zero.
8613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         2. If the guest wants to asynchronously wake up the host,
8633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            it will write once to SYNC without polling on BUSY.
8643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            Ideally it will do this after some new commands have
8653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            been placed in the FIFO, and after reading a zero
8663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            from SVGA_FIFO_BUSY.
8673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       (1) is the original behaviour that SYNC was designed to
8693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       support.  Originally, a write to SYNC would implicitly
8703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       trigger a read from BUSY. This causes us to synchronously
8713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       process the FIFO.
8723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       This behaviour has since been changed so that writing SYNC
8743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       will *not* implicitly cause a read from BUSY. Instead, it
8753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       makes a channel call which asynchronously wakes up the MKS
8763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       thread.
8773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       New guests can use this new behaviour to implement (2)
8793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       efficiently. This lets guests get the host's attention
8803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       without waiting for the MKS to poll, which gives us much
8813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       better CPU utilization on SMP hosts and on UP hosts while
8823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       we're blocked on the host GPU.
8833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       Old guests shouldn't notice the behaviour change. SYNC was
8853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       never guaranteed to process the entire FIFO, since it was
8863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       bounded to a particular number of CPU cycles. Old guests will
8873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       still loop on the BUSY register until the FIFO is empty.
8883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       Writing to SYNC currently has the following side-effects:
8903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         - Sets SVGA_REG_BUSY to TRUE (in the monitor)
8923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         - Asynchronously wakes up the MKS thread for FIFO processing
8933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         - The value written to SYNC is recorded as a "reason", for
8943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *           stats purposes.
8953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       If SVGA_FIFO_BUSY is available, drivers are advised to only
8973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       write to SYNC if SVGA_FIFO_BUSY is FALSE. Drivers should set
8983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       SVGA_FIFO_BUSY to TRUE after writing to SYNC. The MKS will
8993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       eventually set SVGA_FIFO_BUSY on its own, but this approach
9003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       lets the driver avoid sending multiple asynchronous wakeup
9013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       messages to the MKS thread.
9023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  SVGA_REG_BUSY --
9043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       This register is set to TRUE when SVGA_REG_SYNC is written,
9063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       and it reads as FALSE when the FIFO has been completely
9073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       drained.
9083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       Every read from this register causes us to synchronously
9103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       process FIFO commands. There is no guarantee as to how many
9113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       commands each read will process.
9123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       CPU time spent processing FIFO commands will be billed to
9143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       the guest.
9153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       New drivers should avoid using this register unless they
9173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       need to guarantee that the FIFO is completely drained. It
9183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       is overkill for performing a sync-to-fence. Older drivers
9193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       will use this register for any type of synchronization.
9203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  SVGA_FIFO_BUSY --
9223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       This register is a fast way for the guest driver to check
9243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       whether the FIFO is already being processed. It reads and
9253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       writes at normal RAM speeds, with no monitor intervention.
9263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       If this register reads as TRUE, the host is guaranteeing that
9283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       any new commands written into the FIFO will be noticed before
9293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       the MKS goes back to sleep.
9303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       If this register reads as FALSE, no such guarantee can be
9323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       made.
9333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       The guest should use this register to quickly determine
9353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       whether or not it needs to wake up the host. If the guest
9363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       just wrote a command or group of commands that it would like
9373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       the host to begin processing, it should:
9383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         1. Read SVGA_FIFO_BUSY. If it reads as TRUE, no further
9403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            action is necessary.
9413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         2. Write TRUE to SVGA_FIFO_BUSY. This informs future guest
9433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            code that we've already sent a SYNC to the host and we
9443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            don't need to send a duplicate.
9453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         3. Write a reason to SVGA_REG_SYNC. This will send an
9473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *            asynchronous wakeup to the MKS thread.
9483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
9493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
9523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFO Capabilities
9533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Fence -- Fence register and command are supported
9553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Accel Front -- Front buffer only commands are supported
9563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Pitch Lock -- Pitch lock register is supported
9573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Video -- SVGA Video overlay units are supported
9583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Escape -- Escape command is supported
9593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * XXX: Add longer descriptions for each capability, including a list
9613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      of the new features that each capability provides.
9623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_FIFO_CAP_SCREEN_OBJECT --
9643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Provides dynamic multi-screen rendering, for improved Unity and
9663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    multi-monitor modes. With Screen Object, the guest can
9673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    dynamically create and destroy 'screens', which can represent
9683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Unity windows or virtual monitors. Screen Object also provides
9693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    strong guarantees that DMA operations happen only when
9703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    guest-initiated. Screen Object deprecates the BAR1 guest
9713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    framebuffer (GFB) and all commands that work only with the GFB.
9723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    New registers:
9743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       FIFO_CURSOR_SCREEN_ID, VIDEO_DATA_GMRID, VIDEO_DST_SCREEN_ID
9753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    New 2D commands:
9773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       DEFINE_SCREEN, DESTROY_SCREEN, DEFINE_GMRFB, BLIT_GMRFB_TO_SCREEN,
9783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       BLIT_SCREEN_TO_GMRFB, ANNOTATION_FILL, ANNOTATION_COPY
9793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    New 3D commands:
9813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       BLIT_SURFACE_TO_SCREEN
9823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    New guarantees:
9843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       - The host will not read or write guest memory, including the GFB,
9863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         except when explicitly initiated by a DMA command.
9873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       - All DMA, including legacy DMA like UPDATE and PRESENT_READBACK,
9893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         is guaranteed to complete before any subsequent FENCEs.
9903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       - All legacy commands which affect a Screen (UPDATE, PRESENT,
9923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         PRESENT_READBACK) as well as new Screen blit commands will
9933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         all behave consistently as blits, and memory will be read
9943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         or written in FIFO order.
9953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         For example, if you PRESENT from one SVGA3D surface to multiple
9973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         places on the screen, the data copied will always be from the
9983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         SVGA3D surface at the time the PRESENT was issued in the FIFO.
9993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         This was not necessarily true on devices without Screen Object.
10003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         This means that on devices that support Screen Object, the
10023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         PRESENT_READBACK command should not be necessary unless you
10033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         actually want to read back the results of 3D rendering into
10043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         system memory. (And for that, the BLIT_SCREEN_TO_GMRFB
10053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         command provides a strict superset of functionality.)
10063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *       - When a screen is resized, either using Screen Object commands or
10083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *         legacy multimon registers, its contents are preserved.
10092e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
10102e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_FIFO_CAP_GMR2 --
10112e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
10122e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Provides new commands to define and remap guest memory regions (GMR).
10132e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
10142e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    New 2D commands:
10152e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *       DEFINE_GMR2, REMAP_GMR2.
10162e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
10172e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_FIFO_CAP_3D_HWVERSION_REVISED --
10182e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
10192e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Indicates new register SVGA_FIFO_3D_HWVERSION_REVISED exists.
10202e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    This register may replace SVGA_FIFO_3D_HWVERSION on platforms
10212e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    that enforce graphics resource limits.  This allows the platform
10222e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    to clear SVGA_FIFO_3D_HWVERSION and disable 3D in legacy guest
10232e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    drivers that do not limit their resources.
10242e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
10252e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Note this is an alias to SVGA_FIFO_CAP_GMR2 because these indicators
10262e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    are codependent (and thus we use a single capability bit).
10272e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
10282e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_FIFO_CAP_SCREEN_OBJECT_2 --
10292e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
10302e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Modifies the DEFINE_SCREEN command to include a guest provided
10312e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    backing store in GMR memory and the bytesPerLine for the backing
10322e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    store.  This capability requires the use of a backing store when
10332e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    creating screen objects.  However if SVGA_FIFO_CAP_SCREEN_OBJECT
10342e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    is present then backing stores are optional.
10352e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
10362e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_FIFO_CAP_DEAD --
10372e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
10382e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Drivers should not use this cap bit.  This cap bit can not be
10392e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    reused since some hosts already expose it.
10403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_NONE                  0
10433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_FENCE             (1<<0)
10443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_ACCELFRONT        (1<<1)
10453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_PITCHLOCK         (1<<2)
10463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_VIDEO             (1<<3)
10473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_CURSOR_BYPASS_3   (1<<4)
10483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_ESCAPE            (1<<5)
10493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_RESERVE           (1<<6)
10503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_CAP_SCREEN_OBJECT     (1<<7)
10512e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_FIFO_CAP_GMR2              (1<<8)
10522e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_FIFO_CAP_3D_HWVERSION_REVISED  SVGA_FIFO_CAP_GMR2
10532e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_FIFO_CAP_SCREEN_OBJECT_2   (1<<9)
10542e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_FIFO_CAP_DEAD              (1<<10)
10553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFO Flags
10593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Accel Front -- Driver should use front buffer only commands
10613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_FLAG_NONE                 0
10643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_FLAG_ACCELFRONT       (1<<0)
1065c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_FIFO_FLAG_RESERVED        (1<<31) /* Internal use only */
10663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFO reservation sentinel value
10693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_RESERVED_UNKNOWN      0xffffffff
10723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Video overlay support
10763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_NUM_OVERLAY_UNITS 32
10793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Video capabilities that the guest is currently using
10833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_VIDEO_FLAG_COLORKEY        0x0001
10863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Offsets for the video overlay registers
10903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum {
10933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_ENABLED = 0,
10943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_FLAGS,
10953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_DATA_OFFSET,
10963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_FORMAT,
10973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_COLORKEY,
1098c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   SVGA_VIDEO_SIZE,          /* Deprecated */
10993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_WIDTH,
11003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_HEIGHT,
11013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_SRC_X,
11023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_SRC_Y,
11033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_SRC_WIDTH,
11043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_SRC_HEIGHT,
1105c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   SVGA_VIDEO_DST_X,         /* Signed int32 */
1106c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   SVGA_VIDEO_DST_Y,         /* Signed int32 */
11073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_DST_WIDTH,
11083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_DST_HEIGHT,
11093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_PITCH_1,
11103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_PITCH_2,
11113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_PITCH_3,
1112c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   SVGA_VIDEO_DATA_GMRID,    /* Optional, defaults to SVGA_GMR_FRAMEBUFFER */
1113c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   SVGA_VIDEO_DST_SCREEN_ID, /* Optional, defaults to virtual coords */
1114c191b507cbbc4572c9a58cf019db08def651b265Brian Paul                             /* (SVGA_ID_INVALID) */
11153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_VIDEO_NUM_REGS
11163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
11173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
11203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA Overlay Units
11213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      width and height relate to the entire source video frame.
11233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      srcX, srcY, srcWidth and srcHeight represent subset of the source
11243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      video frame to be displayed.
11253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
11263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef struct SVGAOverlayUnit {
11283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 enabled;
11293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 flags;
11303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 dataOffset;
11313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 format;
11323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 colorKey;
11333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 size;
11343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
11353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
11363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcX;
11373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcY;
11383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcWidth;
11393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcHeight;
11403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  dstX;
11413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int32  dstY;
11423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 dstWidth;
11433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 dstHeight;
11443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 pitches[3];
11453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 dataGMRId;
11463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 dstScreenId;
11473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAOverlayUnit;
11483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
11512e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Guest display topology
11522e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
11532e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * XXX: This structure is not part of the SVGA device's interface, and
11542e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * doesn't really belong here.
11552e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
11562e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_INVALID_DISPLAY_ID ((uint32)-1)
11572e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
11582e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef struct SVGADisplayTopology {
11592e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint16 displayId;
11602e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint16 isPrimary;
11612e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 width;
11622e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 height;
11632e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 positionX;
11642e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 positionY;
11652e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGADisplayTopology;
11662e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
11672e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
11682e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
11693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGAScreenObject --
11703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a new way to represent a guest's multi-monitor screen or
11723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Unity window. Screen objects are only supported if the
11733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_SCREEN_OBJECT capability bit is set.
11743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    If Screen Objects are supported, they can be used to fully
11763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    replace the functionality provided by the framebuffer registers
11773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    (SVGA_REG_WIDTH, HEIGHT, etc.) and by SVGA_CAP_DISPLAY_TOPOLOGY.
11783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The screen object is a struct with guaranteed binary
11803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    compatibility. New flags can be added, and the struct may grow,
11813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    but existing fields must retain their meaning.
11823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11832e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Added with SVGA_FIFO_CAP_SCREEN_OBJECT_2 are required fields of
11842e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    a SVGAGuestPtr that is used to back the screen contents.  This
11852e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    memory must come from the GFB.  The guest is not allowed to
11862e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    access the memory and doing so will have undefined results.  The
11872e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    backing store is required to be page aligned and the size is
11882e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    padded to the next page boundry.  The number of pages is:
11892e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *       (bytesPerLine * size.width * 4 + PAGE_SIZE - 1) / PAGE_SIZE
11902e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
11912e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    The pitch in the backingStore is required to be at least large
11922e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    enough to hold a 32bbp scanline.  It is recommended that the
11932e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    driver pad bytesPerLine for a potential performance win.
11942e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
11952e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    The cloneCount field is treated as a hint from the guest that
11962e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    the user wants this display to be cloned, countCount times.  A
11972e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    value of zero means no cloning should happen.
11983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
11993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1200c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_SCREEN_MUST_BE_SET     (1 << 0)
1201c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_SCREEN_HAS_ROOT SVGA_SCREEN_MUST_BE_SET /* Deprecated */
1202c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_SCREEN_IS_PRIMARY      (1 << 1)
1203c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_SCREEN_FULLSCREEN_HINT (1 << 2)
12042e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
12052e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
12062e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Added with SVGA_FIFO_CAP_SCREEN_OBJECT_2.  When the screen is
12072e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * deactivated the base layer is defined to lose all contents and
12082e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * become black.  When a screen is deactivated the backing store is
12092e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * optional.  When set backingPtr and bytesPerLine will be ignored.
12102e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
12112e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_SCREEN_DEACTIVATE  (1 << 3)
12122e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
12132e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
12142e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Added with SVGA_FIFO_CAP_SCREEN_OBJECT_2.  When this flag is set
12152e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * the screen contents will be outputted as all black to the user
12162e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * though the base layer contents is preserved.  The screen base layer
12172e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * can still be read and written to like normal though the no visible
12182e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * effect will be seen by the user.  When the flag is changed the
12192e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * screen will be blanked or redrawn to the current contents as needed
12202e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * without any extra commands from the driver.  This flag only has an
12212e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * effect when the screen is not deactivated.
12222e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
12232e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_SCREEN_BLANKING (1 << 4)
12243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
12262e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paulstruct {
1227c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   uint32 structSize;   /* sizeof(SVGAScreenObject) */
12283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 id;
12293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 flags;
12303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct {
12313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      uint32 width;
12323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      uint32 height;
12333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   } size;
12343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct {
12353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      int32 x;
12363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      int32 y;
12372e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   } root;
12382e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
12392e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   /*
12402e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Added and required by SVGA_FIFO_CAP_SCREEN_OBJECT_2, optional
12412e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * with SVGA_FIFO_CAP_SCREEN_OBJECT.
12422e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    */
12432e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGAGuestImage backingStore;
1244c191b507cbbc4572c9a58cf019db08def651b265Brian Paul
1245c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   /*
1246c191b507cbbc4572c9a58cf019db08def651b265Brian Paul    * The cloneCount field is treated as a hint from the guest that
1247c191b507cbbc4572c9a58cf019db08def651b265Brian Paul    * the user wants this display to be cloned, cloneCount times.
1248c191b507cbbc4572c9a58cf019db08def651b265Brian Paul    *
1249c191b507cbbc4572c9a58cf019db08def651b265Brian Paul    * A value of zero means no cloning should happen.
1250c191b507cbbc4572c9a58cf019db08def651b265Brian Paul    */
12512e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 cloneCount;
12523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAScreenObject;
12533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
12563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  Commands in the command FIFO:
12573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  Command IDs defined below are used for the traditional 2D FIFO
12593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  communication (not all commands are available for all versions of the
12603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  SVGA FIFO protocol).
12613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  Note the holes in the command ID numbers: These commands have been
12633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  deprecated, and the old IDs must not be reused.
12643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1265c191b507cbbc4572c9a58cf019db08def651b265Brian Paul *  Command IDs from 1000 to 2999 are reserved for use by the SVGA3D
12663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  protocol.
12673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  Each command's parameters are described by the comments and
12693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *  structs below.
12703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
12713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef enum {
12733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_INVALID_CMD           = 0,
12743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_UPDATE                = 1,
12753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_RECT_COPY             = 3,
12762e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CMD_RECT_ROP_COPY         = 14,
12773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_DEFINE_CURSOR         = 19,
12783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_DEFINE_ALPHA_CURSOR   = 22,
12793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_UPDATE_VERBOSE        = 25,
12803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_FRONT_ROP_FILL        = 29,
12813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_FENCE                 = 30,
12823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_ESCAPE                = 33,
12833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_DEFINE_SCREEN         = 34,
12843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_DESTROY_SCREEN        = 35,
12853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_DEFINE_GMRFB          = 36,
12863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_BLIT_GMRFB_TO_SCREEN  = 37,
12873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_BLIT_SCREEN_TO_GMRFB  = 38,
12883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_ANNOTATION_FILL       = 39,
12893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_ANNOTATION_COPY       = 40,
12902e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CMD_DEFINE_GMR2           = 41,
12912e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CMD_REMAP_GMR2            = 42,
12922e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CMD_DEAD                  = 43,
12932e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_CMD_DEAD_2                = 44,
1294c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   SVGA_CMD_NOP                   = 45,
1295c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   SVGA_CMD_NOP_ERROR             = 46,
12963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA_CMD_MAX
12973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdId;
12983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12992e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_CMD_MAX_DATASIZE       (256 * 1024)
13003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_CMD_MAX_ARGS           64
130197fdace6d70b6499d0490cd6ca2a4253284b386dBrian Paul#define SVGA_CB_MAX_COMMAND_SIZE (32 * 1024) // 32 KB
13023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
13053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_UPDATE --
13063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a DMA transfer which copies from the Guest Framebuffer
13083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    (GFB) at BAR1 + SVGA_REG_FB_OFFSET to any screens which
13093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    intersect with the provided virtual rectangle.
13103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command does not support using arbitrary guest memory as a
13123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    data source- it only works with the pre-defined GFB memory.
13133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command also does not support signed virtual coordinates.
13143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    If you have defined screens (using SVGA_CMD_DEFINE_SCREEN) with
13153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    negative root x/y coordinates, the negative portion of those
13163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    screens will not be reachable by this command.
13173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command is not necessary when using framebuffer
13193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    traces. Traces are automatically enabled if the SVGA FIFO is
13203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    disabled, and you may explicitly enable/disable traces using
13213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_REG_TRACES. With traces enabled, any write to the GFB will
13223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    automatically act as if a subsequent SVGA_CMD_UPDATE was issued.
13233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Traces and SVGA_CMD_UPDATE are the only supported ways to render
13253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    pseudocolor screen updates. The newer Screen Object commands
13263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    only support true color formats.
13273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
13293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Always available.
13303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
13313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
13333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
13343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 x;
13353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 y;
13363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
13373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
13383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdUpdate;
13393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
13423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_RECT_COPY --
13433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Perform a rectangular DMA transfer from one area of the GFB to
13453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    another, and copy the result to any screens which intersect it.
13463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
13483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CAP_RECT_COPY
13493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
13503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
13523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
13533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcX;
13543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 srcY;
13553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 destX;
13563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 destY;
13573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
13583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
13593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdRectCopy;
13603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
13632e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CMD_RECT_ROP_COPY --
13642e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
13652e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Perform a rectangular DMA transfer from one area of the GFB to
13662e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    another, and copy the result to any screens which intersect it.
13672e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    The value of ROP may only be SVGA_ROP_COPY, and this command is
13682e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    only supported for backwards compatibility reasons.
13692e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
13702e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Availability:
13712e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_CAP_RECT_COPY
13722e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
13732e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
13742e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef
13752e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paulstruct {
13762e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 srcX;
13772e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 srcY;
13782e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 destX;
13792e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 destY;
13802e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 width;
13812e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 height;
13822e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 rop;
13832e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGAFifoCmdRectRopCopy;
13842e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
13852e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
13862e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
13873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_DEFINE_CURSOR --
13883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Provide a new cursor image, as an AND/XOR mask.
13903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The recommended way to position the cursor overlay is by using
13923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    the SVGA_FIFO_CURSOR_* registers, supported by the
13933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_CURSOR_BYPASS_3 capability.
13943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
13963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CAP_CURSOR
13973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
13983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
14003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
1401c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   uint32 id;             /* Reserved, must be zero. */
14023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 hotspotX;
14033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 hotspotY;
14043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
14053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
1406c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   uint32 andMaskDepth;   /* Value must be 1 or equal to BITS_PER_PIXEL */
1407c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   uint32 xorMaskDepth;   /* Value must be 1 or equal to BITS_PER_PIXEL */
14083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
14093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Followed by scanline data for AND mask, then XOR mask.
14103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Each scanline is padded to a 32-bit boundary.
14113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   */
14123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdDefineCursor;
14133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
14163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_DEFINE_ALPHA_CURSOR --
14173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Provide a new cursor image, in 32-bit BGRA format.
14193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The recommended way to position the cursor overlay is by using
14213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    the SVGA_FIFO_CURSOR_* registers, supported by the
14223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_CURSOR_BYPASS_3 capability.
14233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
14253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CAP_ALPHA_CURSOR
14263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
14273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
14293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
1430c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   uint32 id;             /* Reserved, must be zero. */
14313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 hotspotX;
14323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 hotspotY;
14333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
14343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
14353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Followed by scanline data */
14363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdDefineAlphaCursor;
14373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
14403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_UPDATE_VERBOSE --
14413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Just like SVGA_CMD_UPDATE, but also provide a per-rectangle
14433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    'reason' value, an opaque cookie which is used by internal
14443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    debugging tools. Third party drivers should not use this
14453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    command.
14463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
14483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CAP_EXTENDED_FIFO
14493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
14503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
14523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
14533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 x;
14543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 y;
14553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
14563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
14573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 reason;
14583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdUpdateVerbose;
14593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
14623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_FRONT_ROP_FILL --
14633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a hint which tells the SVGA device that the driver has
14653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    just filled a rectangular region of the GFB with a solid
14663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    color. Instead of reading these pixels from the GFB, the device
14673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    can assume that they all equal 'color'. This is primarily used
14683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    for remote desktop protocols.
14693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
14713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_ACCELFRONT
14723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
14733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define  SVGA_ROP_COPY                    0x03
14753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
14773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
1478c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   uint32 color;     /* In the same format as the GFB */
14793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 x;
14803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 y;
14813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 width;
14823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 height;
1483c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   uint32 rop;       /* Must be SVGA_ROP_COPY */
14843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdFrontRopFill;
14853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
14883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_FENCE --
14893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Insert a synchronization fence.  When the SVGA device reaches
14913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    this command, it will copy the 'fence' value into the
14923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_FENCE register. It will also compare the fence against
14933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_FENCE_GOAL. If the fence matches the goal and the
14943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_IRQFLAG_FENCE_GOAL interrupt is enabled, the device will
14953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    raise this interrupt.
14963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
14983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_FENCE for this command,
14993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CAP_IRQMASK for SVGA_FIFO_FENCE_GOAL.
15003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
15013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
15033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
15043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 fence;
15053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdFence;
15063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
15093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_ESCAPE --
15103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Send an extended or vendor-specific variable length command.
15123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is used for video overlay, third party plugins, and
15133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    internal debugging tools. See svga_escape.h
15143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
15163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_FIFO_CAP_ESCAPE
15173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
15183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
15203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
15213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 nsid;
15223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 size;
15233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* followed by 'size' bytes of data */
15243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdEscape;
15253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
15283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_DEFINE_SCREEN --
15293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Define or redefine an SVGAScreenObject. See the description of
15313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGAScreenObject above.  The video driver is responsible for
15323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    generating new screen IDs. They should be small positive
15333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    integers. The virtual device will have an implementation
15343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    specific upper limit on the number of screen IDs
15353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    supported. Drivers are responsible for recycling IDs. The first
15363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    valid ID is zero.
15373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    - Interaction with other registers:
15393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    For backwards compatibility, when the GFB mode registers (WIDTH,
15413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    HEIGHT, PITCHLOCK, BITS_PER_PIXEL) are modified, the SVGA device
15423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    deletes all screens other than screen #0, and redefines screen
15433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    #0 according to the specified mode. Drivers that use
15443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CMD_DEFINE_SCREEN should destroy or redefine screen #0.
15453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    If you use screen objects, do not use the legacy multi-mon
15473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    registers (SVGA_REG_NUM_GUEST_DISPLAYS, SVGA_REG_DISPLAY_*).
15483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
15502e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_FIFO_CAP_SCREEN_OBJECT or SVGA_FIFO_CAP_SCREEN_OBJECT_2
15513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
15523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
15543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
1555c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   SVGAScreenObject screen;   /* Variable-length according to version */
15563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdDefineScreen;
15573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
15603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_DESTROY_SCREEN --
15613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Destroy an SVGAScreenObject. Its ID is immediately available for
15633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    re-use.
15643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
15662e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_FIFO_CAP_SCREEN_OBJECT or SVGA_FIFO_CAP_SCREEN_OBJECT_2
15673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
15683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
15703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
15713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 screenId;
15723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdDestroyScreen;
15733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
15753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
15763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_DEFINE_GMRFB --
15773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command sets a piece of SVGA device state called the
15793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Guest Memory Region Framebuffer, or GMRFB. The GMRFB is a
15803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    piece of light-weight state which identifies the location and
15813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    format of an image in guest memory or in BAR1. The GMRFB has
15823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    an arbitrary size, and it doesn't need to match the geometry
15833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    of the GFB or any screen object.
15843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The GMRFB can be redefined as often as you like. You could
15863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    always use the same GMRFB, you could redefine it before
15873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    rendering from a different guest screen, or you could even
15883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    redefine it before every blit.
15893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    There are multiple ways to use this command. The simplest way is
15913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    to use it to move the framebuffer either to elsewhere in the GFB
15923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    (BAR1) memory region, or to a user-defined GMR. This lets a
15933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    driver use a framebuffer allocated entirely out of normal system
15943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    memory, which we encourage.
15953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
15963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Another way to use this command is to set up a ring buffer of
15973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    updates in GFB memory. If a driver wants to ensure that no
15983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    frames are skipped by the SVGA device, it is important that the
15993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    driver not modify the source data for a blit until the device is
16003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    done processing the command. One efficient way to accomplish
16013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    this is to use a ring of small DMA buffers. Each buffer is used
16023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    for one blit, then we move on to the next buffer in the
16033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    ring. The FENCE mechanism is used to protect each buffer from
16043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    re-use until the device is finished with that buffer's
16053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    corresponding blit.
16063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command does not affect the meaning of SVGA_CMD_UPDATE.
16083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    UPDATEs always occur from the legacy GFB memory area. This
16093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    command has no support for pseudocolor GMRFBs. Currently only
16103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    true-color 15, 16, and 24-bit depths are supported. Future
16113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    devices may expose capabilities for additional framebuffer
16123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    formats.
16133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The default GMRFB value is undefined. Drivers must always send
16153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    this command at least once before performing any blit from the
16163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    GMRFB.
16173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
16192e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_FIFO_CAP_SCREEN_OBJECT or SVGA_FIFO_CAP_SCREEN_OBJECT_2
16203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
16213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
16223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
16233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
16243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGAGuestPtr        ptr;
16253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32              bytesPerLine;
16263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGAGMRImageFormat  format;
16273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdDefineGMRFB;
16283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
16293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
16303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
16313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_BLIT_GMRFB_TO_SCREEN --
16323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a guest-to-host blit. It performs a DMA operation to
16343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    copy a rectangular region of pixels from the current GMRFB to
16353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    one or more Screen Objects.
16363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The destination coordinate may be specified relative to a
16383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    screen's origin (if a screen ID is specified) or relative to the
16393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    virtual coordinate system's origin (if the screen ID is
16403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_ID_INVALID). The actual destination may span zero or more
16413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    screens, in the case of a virtual destination rect or a rect
16423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    which extends off the edge of the specified screen.
16433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command writes to the screen's "base layer": the underlying
16453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    framebuffer which exists below any cursor or video overlays. No
16463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    action is necessary to explicitly hide or update any overlays
16473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    which exist on top of the updated region.
16483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The SVGA device is guaranteed to finish reading from the GMRFB
16503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    by the time any subsequent FENCE commands are reached.
16513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command consumes an annotation. See the
16533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGA_CMD_ANNOTATION_* commands for details.
16543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
16562e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_FIFO_CAP_SCREEN_OBJECT or SVGA_FIFO_CAP_SCREEN_OBJECT_2
16573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
16583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
16593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
16603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
16613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGASignedPoint  srcOrigin;
16623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGASignedRect   destRect;
16633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32           destScreenId;
16643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdBlitGMRFBToScreen;
16653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
16663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
16673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
16683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_BLIT_SCREEN_TO_GMRFB --
16693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a host-to-guest blit. It performs a DMA operation to
16713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    copy a rectangular region of pixels from a single Screen Object
16723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    back to the current GMRFB.
16733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Usage note: This command should be used rarely. It will
16753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    typically be inefficient, but it is necessary for some types of
16763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    synchronization between 3D (GPU) and 2D (CPU) rendering into
16773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    overlapping areas of a screen.
16783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The source coordinate is specified relative to a screen's
16803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    origin. The provided screen ID must be valid. If any parameters
16813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    are invalid, the resulting pixel values are undefined.
16823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This command reads the screen's "base layer". Overlays like
16843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    video and cursor are not included, but any data which was sent
16853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    using a blit-to-screen primitive will be available, no matter
16863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    whether the data's original source was the GMRFB or the 3D
16873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    acceleration hardware.
16883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Note that our guest-to-host blits and host-to-guest blits aren't
16903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    symmetric in their current implementation. While the parameters
16913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    are identical, host-to-guest blits are a lot less featureful.
16923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    They do not support clipping: If the source parameters don't
16933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    fully fit within a screen, the blit fails. They must originate
16943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    from exactly one screen. Virtual coordinates are not directly
16953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    supported.
16963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
16973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Host-to-guest blits do support the same set of GMRFB formats
16983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    offered by guest-to-host blits.
16993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The SVGA device is guaranteed to finish writing to the GMRFB by
17013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    the time any subsequent FENCE commands are reached.
17023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
17042e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_FIFO_CAP_SCREEN_OBJECT or SVGA_FIFO_CAP_SCREEN_OBJECT_2
17053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
17063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
17073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
17083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
17093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGASignedPoint  destOrigin;
17103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGASignedRect   srcRect;
17113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32           srcScreenId;
17123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdBlitScreenToGMRFB;
17133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
17143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
17153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
17163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_ANNOTATION_FILL --
17173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a blit annotation. This command stores a small piece of
17193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    device state which is consumed by the next blit-to-screen
17203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    command. The state is only cleared by commands which are
17213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    specifically documented as consuming an annotation. Other
17223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    commands (such as ESCAPEs for debugging) may intervene between
17233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    the annotation and its associated blit.
17243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This annotation is a promise about the contents of the next
17263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    blit: The video driver is guaranteeing that all pixels in that
17273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    blit will have the same value, specified here as a color in
17283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    SVGAColorBGRX format.
17293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The SVGA device can still render the blit correctly even if it
17313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    ignores this annotation, but the annotation may allow it to
17323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    perform the blit more efficiently, for example by ignoring the
17333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    source data and performing a fill in hardware.
17343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This annotation is most important for performance when the
17363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    user's display is being remoted over a network connection.
17373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
17392e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_FIFO_CAP_SCREEN_OBJECT or SVGA_FIFO_CAP_SCREEN_OBJECT_2
17403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
17413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
17423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
17433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
17443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGAColorBGRX  color;
17453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdAnnotationFill;
17463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
17473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
17483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
17493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_CMD_ANNOTATION_COPY --
17503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This is a blit annotation. See SVGA_CMD_ANNOTATION_FILL for more
17523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    information about annotations.
17533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    This annotation is a promise about the contents of the next
17553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    blit: The video driver is guaranteeing that all pixels in that
17563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    blit will have the same value as those which already exist at an
17573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    identically-sized region on the same or a different screen.
17583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    Note that the source pixels for the COPY in this annotation are
17603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    sampled before applying the anqnotation's associated blit. They
17613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    are allowed to overlap with the blit's destination pixels.
17623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    The copy source rectangle is specified the same way as the blit
17643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    destination: it can be a rectangle which spans zero or more
17653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    screens, specified relative to either a screen or to the virtual
17663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    coordinate system's origin. If the source rectangle includes
17673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    pixels which are not from exactly one screen, the results are
17683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *    undefined.
17693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
17703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Availability:
17712e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_FIFO_CAP_SCREEN_OBJECT or SVGA_FIFO_CAP_SCREEN_OBJECT_2
17723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
17733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
17743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef
17753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct {
17763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGASignedPoint  srcOrigin;
17773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32           srcScreenId;
17783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGAFifoCmdAnnotationCopy;
17793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
17802e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
17812e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
17822e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CMD_DEFINE_GMR2 --
17832e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
17842e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Define guest memory region v2.  See the description of GMRs above.
17852e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
17862e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Availability:
17872e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_CAP_GMR2
17882e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
17892e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
17902e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef
17912e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paulstruct {
17922e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 gmrId;
17932e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 numPages;
17942e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGAFifoCmdDefineGMR2;
17952e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
17962e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
17972e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
17982e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * SVGA_CMD_REMAP_GMR2 --
17992e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
18002e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Remap guest memory region v2.  See the description of GMRs above.
18012e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
18022e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    This command allows guest to modify a portion of an existing GMR by
18032e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    invalidating it or reassigning it to different guest physical pages.
18042e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    The pages are identified by physical page number (PPN).  The pages
18052e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    are assumed to be pinned and valid for DMA operations.
18062e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
18072e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    Description of command flags:
18082e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
18092e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_REMAP_GMR2_VIA_GMR: If enabled, references a PPN list in a GMR.
18102e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *       The PPN list must not overlap with the remap region (this can be
18112e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *       handled trivially by referencing a separate GMR).  If flag is
18122e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *       disabled, PPN list is appended to SVGARemapGMR command.
18132e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
18142e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_REMAP_GMR2_PPN64: If set, PPN list is in PPN64 format, otherwise
18152e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *       it is in PPN32 format.
18162e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
18172e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_REMAP_GMR2_SINGLE_PPN: If set, PPN list contains a single entry.
18182e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *       A single PPN can be used to invalidate a portion of a GMR or
18192e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *       map it to to a single guest scratch page.
18202e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *
18212e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Availability:
18222e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *    SVGA_CAP_GMR2
18232e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
18242e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
18252e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef enum {
18262e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REMAP_GMR2_PPN32         = 0,
18272e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REMAP_GMR2_VIA_GMR       = (1 << 0),
18282e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REMAP_GMR2_PPN64         = (1 << 1),
18292e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGA_REMAP_GMR2_SINGLE_PPN    = (1 << 2),
18302e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGARemapGMR2Flags;
18312e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
18322e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paultypedef
18332e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paulstruct {
18342e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   uint32 gmrId;
18352e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   SVGARemapGMR2Flags flags;
1836c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   uint32 offsetPages; /* offset in pages to begin remap */
1837c191b507cbbc4572c9a58cf019db08def651b265Brian Paul   uint32 numPages; /* number of pages to remap */
18382e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul   /*
18392e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Followed by additional data depending on SVGARemapGMR2Flags.
18402e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    *
18412e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * If flag SVGA_REMAP_GMR2_VIA_GMR is set, single SVGAGuestPtr follows.
18422e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * Otherwise an array of page descriptors in PPN32 or PPN64 format
18432e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * (according to flag SVGA_REMAP_GMR2_PPN64) follows.  If flag
18442e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    * SVGA_REMAP_GMR2_SINGLE_PPN is set, array contains a single entry.
18452e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul    */
18462e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul} SVGAFifoCmdRemapGMR2;
18472e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
18482e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
18492e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
18502e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * Size of SVGA device memory such as frame buffer and FIFO.
18512e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
1852c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_VRAM_MIN_SIZE             (4 * 640 * 480) /* bytes */
18532e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_VRAM_MIN_SIZE_3D       (16 * 1024 * 1024)
18542e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_VRAM_MAX_SIZE         (128 * 1024 * 1024)
18552e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_MEMORY_SIZE_MAX      (1024 * 1024 * 1024)
18562e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_FIFO_SIZE_MAX           (2 * 1024 * 1024)
18572e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_GRAPHICS_MEMORY_KB_MIN       (32 * 1024)
18582e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_GRAPHICS_MEMORY_KB_MAX       (2 * 1024 * 1024)
18592e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_GRAPHICS_MEMORY_KB_DEFAULT   (256 * 1024)
18602e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
1861c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_VRAM_SIZE_W2K          (64 * 1024 * 1024) /* 64 MB */
18622e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
18632e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul/*
18642e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * To simplify autoDetect display configuration, support a minimum of
18652e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul * two 1920x1200 monitors, 32bpp, side-by-side, optionally rotated:
18662e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *   numDisplays = 2
18672e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *   maxWidth = numDisplay * 1920 = 3840
18682e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *   maxHeight = rotated width of single monitor = 1920
18692e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul *   vramSize = maxWidth * maxHeight * 4 = 29491200
18702e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul */
18712e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_VRAM_SIZE_AUTODETECT   (32 * 1024 * 1024)
18722e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
18732e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#if defined(VMX86_SERVER)
18742e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_VRAM_SIZE               (4 * 1024 * 1024)
18752e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_VRAM_SIZE_3D           (64 * 1024 * 1024)
18762e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_FIFO_SIZE                    (256 * 1024)
1877c191b507cbbc4572c9a58cf019db08def651b265Brian Paul#define SVGA_FIFO_SIZE_3D                 (516 * 1024)
18782e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_MEMORY_SIZE_DEFAULT   (160 * 1024 * 1024)
18792e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_AUTODETECT_DEFAULT                  FALSE
18802e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#else
18812e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_VRAM_SIZE              (16 * 1024 * 1024)
18822e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_VRAM_SIZE_3D           SVGA_VRAM_MAX_SIZE
18832e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_FIFO_SIZE               (2 * 1024 * 1024)
18842e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_FIFO_SIZE_3D               SVGA_FIFO_SIZE
18852e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_MEMORY_SIZE_DEFAULT   (768 * 1024 * 1024)
18862e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#define SVGA_AUTODETECT_DEFAULT                   TRUE
18872e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul#endif
18882e0c90847f16a9cf2a40436beacb65c65535fa4aBrian Paul
18893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif
1890