Update README
authorMicah Dowty <micah@vmware.com>
Tue, 12 May 2009 23:43:13 +0000 (16:43 -0700)
committerPhilip Langdale <philipl@fido2.homeip.net>
Tue, 12 May 2009 23:43:13 +0000 (16:43 -0700)
Updates the copyright date, and replaces the rather out-of-date
2D documentation with a link to the updated 2D and 3D docs on
Source Forge.

README

diff --git a/README b/README
index 0ddbbac..fee6788 100644 (file)
--- a/README
+++ b/README
-
-Copyright (C) 1999-2002 VMware, Inc.
+Copyright (C) 1999-2009 VMware, Inc.
 All Rights Reserved
 
 The code here may be used/distributed under the terms of the standard
 XFree86 license.
 
+Documentation on the VMware SVGA Device programming model
+has been updated and expanded, and it now lives at:
 
-       VMware SVGA Device Interface and Programming Model
-       --------------------------------------------------
-
-
-Include Files
--------------
-
-svga_reg.h
-    SVGA register definitions, SVGA capabilities, and FIFO command definitions.
-
-svga_limits.h
-    Included by svga_reg.h, defines maximum frame buffer and memory region
-    sizes.
-
-svga_modes.h
-    A list of default display modes that are built into the driver.
-
-svga_overlay.h
-   A list of definitions required for Xv extension support. Included by vmwarevideo.c
-
-svga_escape.h
-   A list of definitions for the SVGA Escape commands.
-
-guest_os.h
-    Values for the GUEST_ID register.
-
-vm_basic_types.h
-    Common type definitions.
-
-vm_device_version.h
-    PCI vendor ID's and related information.
-
-vmwarectrl.h
-vmwarectrlproto.h
-    The definitions of the VMWARECTRL protocol extension.
-
-Programming the VMware SVGA Device
-----------------------------------
-
-1. Reading/writing a register:
-
-    The SVGA registers are addressed by an index/value pair of 32 bit
-    registers in the IO address space.
-    
-    The 0710 VMware SVGA chipset (PCI device ID PCI_DEVICE_ID_VMWARE_SVGA) has
-    its index and value ports hardcoded at:
-    
-       index: SVGA_LEGACY_BASE_PORT + 4 * SVGA_INDEX_PORT
-       value: SVGA_LEGACY_BASE_PORT + 4 * SVGA_VALUE_PORT
-    
-    The 0405 VMware SVGA chipset (PCI device ID PCI_DEVICE_ID_VMWARE_SVGA2)
-    determines its index and value ports as a function of the first base
-    address register in its PCI configuration space as:
-
-       index: <Base Address Register 0> + SVGA_INDEX_PORT
-       value: <Base Address Register 0> + SVGA_VALUE_PORT
-
-    To read a register:
-       Set the index port to the index of the register, using a dword OUT
-       Do a dword IN from the value port
-
-    To write a register:
-       Set the index port to the index of the register, using a dword OUT
-       Do a dword OUT to the value port
-
-    Example, setting the width to 1024:
-
-       mov     eax, SVGA_REG_WIDTH
-       mov     edx, <SVGA Address Port>
-       out     dx, eax
-       mov     eax, 1024
-       mov     edx, <SVGA Value Port>
-       out     dx, eax
-
-2. Initialization
-    Check the version number
-     loop:
-      Write into SVGA_REG_ID the maximum SVGA_ID_* the driver supports.
-      Read from SVGA_REG_ID.
-       Check if it is the value you wrote.
-       If yes, VMware SVGA device supports it
-       If no, decrement SVGA_ID_* and goto loop
-     This algorithm converges.
-
-    Map the frame buffer and the command FIFO
-       Read SVGA_REG_FB_START, SVGA_REG_FB_SIZE, SVGA_REG_MEM_START,
-       SVGA_REG_MEM_SIZE.
-       Map the frame buffer (FB) and the FIFO memory (MEM)
-
-    Get the device capabilities and frame buffer dimensions
-       Read SVGA_REG_CAPABILITIES, SVGA_REG_MAX_WIDTH, SVGA_REG_MAX_HEIGHT,
-       and SVGA_REG_HOST_BITS_PER_PIXEL / SVGA_REG_BITS_PER_PIXEL.
-
-       Note: The capabilities can and do change without the PCI device ID
-       changing or the SVGA_REG_ID changing.  A driver should always check
-       the capabilities register when loading before expecting any
-       capabilities-determined feature to be available.  See below for a list
-       of capabilities as of this writing.
-
-       Note: If SVGA_CAP_8BIT_EMULATION is not set, then it is possible that
-       SVGA_REG_HOST_BITS_PER_PIXEL does not exist and
-       SVGA_REG_BITS_PER_PIXEL should be read instead.
-
-    Report the Guest Operating System
-       Write SVGA_REG_GUEST_ID with the appropriate value from <guest_os.h>.
-       While not required in any way, this is useful information for the
-       virtual machine to have available for reporting and sanity checking
-       purposes.
-
-    SetMode
-       Set SVGA_REG_WIDTH, SVGA_REG_HEIGHT, SVGA_REG_BITS_PER_PIXEL
-       Read SVGA_REG_FB_OFFSET
-       (SVGA_REG_FB_OFFSET is the offset from SVGA_REG_FB_START of the
-        visible portion of the frame buffer)
-       Read SVGA_REG_BYTES_PER_LINE, SVGA_REG_DEPTH, SVGA_REG_PSEUDOCOLOR,
-       SVGA_REG_RED_MASK, SVGA_REG_GREEN_MASK, SVGA_REG_BLUE_MASK
-
-       Note: SVGA_REG_BITS_PER_PIXEL is readonly if
-       SVGA_CAP_8BIT_EMULATION is not set in the capabilities register.  Even
-       if it is set, values other than 8 and SVGA_REG_HOST_BITS_PER_PIXEL
-       will be ignored.
-
-    Enable SVGA
-       Set SVGA_REG_ENABLE to 1
-       (to disable SVGA, set SVGA_REG_ENABLE to 0.  Setting SVGA_REG_ENABLE
-       to 0 also enables VGA.)
-
-    Initialize the command FIFO
-       The FIFO is exclusively dword (32-bit) aligned.  The first four
-       dwords define the portion of the MEM area that is used for the
-       command FIFO.  These are values are all in byte offsets from the
-       start of the MEM area.
-
-       A minimum sized FIFO would have these values:
-           mem[SVGA_FIFO_MIN] = 16;
-           mem[SVGA_FIFO_MAX] = 16 + (10 * 1024);
-           mem[SVGA_FIFO_NEXT_CMD] = 16;
-           mem[SVGA_FIFO_STOP] = 16;
-
-       Set SVGA_REG_CONFIG_DONE to 1 after these values have been set.
-       
-       Note: Setting SVGA_REG_CONFIG_DONE to 0 will stop the device from
-       reading the FIFO until it is reinitialized and SVGA_REG_CONFIG_DONE is
-       set to 1 again.
-
-3. SVGA command FIFO protocol
-    The FIFO is empty when SVGA_FIFO_NEXT_CMD == SVGA_FIFO_STOP.  The
-    driver writes commands to the FIFO starting at the offset specified
-    by SVGA_FIFO_NEXT_CMD, and then increments SVGA_FIFO_NEXT_CMD.
-
-    The FIFO is full when SVGA_FIFO_NEXT_CMD is one word before SVGA_FIFO_STOP.
-
-    When the FIFO becomes full, the FIFO should be sync'd
-
-    To sync the FIFO
-       Write SVGA_REG_SYNC
-       Read SVGA_REG_BUSY
-       Wait for the value in SVGA_REG_BUSY to be 0
-
-    The FIFO should be sync'd before the driver touches the frame buffer, to
-    guarantee that any outstanding BLT's are completed.
-
-4. Cursor
-    When SVGA_CAP_CURSOR is set, hardware cursor support is available.  In
-    practice, SVGA_CAP_CURSOR will only be set when SVGA_CAP_CURSOR_BYPASS is
-    also set and drivers supporting a hardware cursor should only worry about
-    SVGA_CAP_CURSOR_BYPASS and only use the FIFO to define the cursor.  See
-    below for more information.
-
-5. Pseudocolor
-    When the read-only register SVGA_REG_PSEUDOCOLOR is 1, the device is in a
-    colormapped mode whose index width and color width are both SVGA_REG_DEPTH.
-    Thus far, 8 is the only depth at which pseudocolor is ever used.
-
-    In pseudocolor, the colormap is programmed by writing to the SVGA palette
-    registers.  These start at SVGA_PALETTE_BASE and are interpreted as
-    follows:
-
-       SVGA_PALETTE_BASE + 3*n         - The nth red component
-       SVGA_PALETTE_BASE + 3*n + 1     - The nth green component
-       SVGA_PALETTE_BASE + 3*n + 2     - The nth blue component
-    
-    And n ranges from 0 to ((1<<SVGA_REG_DEPTH) - 1).
-    
-
-Drawing to the Screen
----------------------
-
-After initialization, the driver can write directly to the frame buffer.  The
-updated frame buffer is not displayed immediately, but only when an update
-command is sent.  The update command (SVGA_CMD_UPDATE) defines the rectangle
-in the frame buffer that has been modified by the driver, and causes that
-rectangle to be updated on the screen.
-
-A complete driver can be developed this way.  For increased performance,
-additional commands are available to accelerate common operations.  The two
-most useful are SVGA_CMD_RECT_FILL and SVGA_CMD_RECT_COPY.
-
-After issuing an accelerated command, the FIFO should be sync'd, as described
-above, before writing to the frame buffer.
-
-Addendum on 7/11/2000
----------------------
-
-SVGA_REG_FB_OFFSET and SVGA_REG_BYTES_PER_LINE may change after SVGA_REG_WIDTH
-or SVGA_REG_HEIGHT is set.  Also the VGA registers must be written to after
-setting SVGA_REG_ENABLE to 0 to change the display to a VGA mode.
-
-Addendum on 11/29/2001
----------------------
-
-Actually, after changing any of SVGA_REG_WIDTH, SVGA_REG_HEIGHT, and
-SVGA_REG_BITS_PER_PIXEL, all of the registers listed in the 'SetMode'
-initialization section above should be reread.  Additionally, when changing
-modes, it can be convenient to set SVGA_REG_ENABLE to 0, change
-SVGA_REG_WIDTH, SVGA_REG_HEIGHT, and SVGA_REG_BITS_PER_PIXEL (if available),
-and then set SVGA_REG_ENABLE to 1 again.
-
-
-Capabilities
-------------
-
-The capabilities register (SVGA_REG_CAPABILITIES) is an array of bits that
-indicates the capabilities of the SVGA emulation.  A driver should check
-SVGA_REG_CAPABILITIES every time it loads before relying on any feature that
-is only optionally available.
-
-Some of the capabilities determine which FIFO commands are available.  This
-table shows which capability indicates support for which command.
-
-    FIFO Command                       Capability
-    ------------                       ----------
-
-    SVGA_CMD_RECT_FILL                 SVGA_CAP_RECT_FILL
-    SVGA_CMD_RECT_COPY                 SVGA_CAP_RECT_COPY
-    SVGA_CMD_DEFINE_BITMAP             SVGA_CAP_OFFSCREEN
-    SVGA_CMD_DEFINE_BITMAP_SCANLINE    SVGA_CAP_OFFSCREEN
-    SVGA_CMD_DEFINE_PIXMAP             SVGA_CAP_OFFSCREEN
-    SVGA_CMD_DEFINE_PIXMAP_SCANLINE    SVGA_CAP_OFFSCREEN
-    SVGA_CMD_RECT_BITMAP_FILL          SVGA_CAP_RECT_PAT_FILL
-    SVGA_CMD_RECT_PIXMAP_FILL          SVGA_CAP_RECT_PAT_FILL
-    SVGA_CMD_RECT_BITMAP_COPY          SVGA_CAP_RECT_PAT_FILL
-    SVGA_CMD_RECT_PIXMAP_COPY          SVGA_CAP_RECT_PAT_FILL
-    SVGA_CMD_FREE_OBJECT               SVGA_CAP_OFFSCREEN
-    SVGA_CMD_RECT_ROP_FILL             SVGA_CAP_RECT_FILL +
-                                           SVGA_CAP_RASTER_OP
-    SVGA_CMD_RECT_ROP_COPY             SVGA_CAP_RECT_COPY +
-                                           SVGA_CAP_RASTER_OP
-    SVGA_CMD_RECT_ROP_BITMAP_FILL      SVGA_CAP_RECT_PAT_FILL +
-                                           SVGA_CAP_RASTER_OP
-    SVGA_CMD_RECT_ROP_PIXMAP_FILL      SVGA_CAP_RECT_PAT_FILL +
-                                           SVGA_CAP_RASTER_OP
-    SVGA_CMD_RECT_ROP_BITMAP_COPY      SVGA_CAP_RECT_PAT_FILL +
-                                           SVGA_CAP_RASTER_OP
-    SVGA_CMD_RECT_ROP_PIXMAP_COPY      SVGA_CAP_RECT_PAT_FILL +
-                                           SVGA_CAP_RASTER_OP
-    SVGA_CMD_DEFINE_CURSOR             SVGA_CAP_CURSOR
-    SVGA_CMD_DISPLAY_CURSOR            SVGA_CAP_CURSOR
-    SVGA_CMD_MOVE_CURSOR               SVGA_CAP_CURSOR
-    SVGA_CMD_DEFINE_ALPHA_CURSOR       SVGA_CAP_ALPHA_CURSOR
-    SVGA_CMD_DRAW_GLYPH                 SVGA_CAP_GLYPH
-    SVGA_CMD_DRAW_GLYPH_CLIPPED         SVGA_CAP_GLYPH_CLIPPING
-    SVGA_CMD_ESCAPE                     SVGA_FIFO_CAP_ESCAPE
-
-Note:  SVGA_CMD_DISPLAY_CURSOR and SVGA_CMD_MOVE_CURSOR should not be used.
-Drivers wishing hardware cursor support should use cursor bypass (see below).
-
-Other capabilities indicate other functionality as described below:
-
-    SVGA_CAP_CURSOR_BYPASS
-       The hardware cursor can be drawn via SVGA Registers (without requiring
-       the FIFO be synchronized and will be drawn potentially before any
-       outstanding unprocessed FIFO commands).
-
-       Note:  Without SVGA_CAP_CURSOR_BYPASS_2, cursors drawn this way still
-       appear in the guest's framebuffer and need to be turned off before any
-       save under / overlapping drawing and turned back on after.  This can
-       cause very noticeable cursor flicker.
-
-    SVGA_CAP_CURSOR_BYPASS_2
-       Instead of turning the cursor off and back on around any overlapping
-       drawing, the driver can write SVGA_CURSOR_ON_REMOVE_FROM_FB and
-       SVGA_CURSOR_ON_RESTORE_TO_FB to SVGA_REG_CURSOR_ON.  In almost all
-       cases these are NOPs and the cursor will be remain visible without
-       appearing in the guest framebuffer.  In 'direct graphics' modes like
-       Linux host fullscreen local displays, however, the cursor will still
-       be drawn in the framebuffer, still flicker, and be drawn incorrectly
-       if a driver does not use SVGA_CURSOR_ON_REMOVE_FROM_FB / RESTORE_TO_FB.
-
-    SVGA_CAP_8BIT_EMULATION
-       SVGA_REG_BITS_PER_PIXEL is writable and can be set to either 8 or
-       SVGA_REG_HOST_BITS_PER_PIXEL.  Otherwise the only SVGA modes available
-       inside a virtual machine must match the host's bits per pixel.
-       
-       Note: Some versions which lack SVGA_CAP_8BIT_EMULATION also lack the
-       SVGA_REG_HOST_BITS_PER_PIXEL and a driver should assume
-       SVGA_REG_BITS_PER_PIXEL is both read-only and initialized to the only
-       available value if SVGA_CAP_8BIT_EMULATION is not set.
-        
-    SVGA_CAP_OFFSCREEN_1
-        SVGA_CMD_RECT_FILL, SVGA_CMD_RECT_COPY, SVGA_CMD_RECT_ROP_FILL,
-        SVGA_CMD_RECT_ROP_COPY can operate with a source or destination (or
-        both) in offscreen memory. 
-        
-        Usable offscreen memory is a rectangle located below the last scanline
-        of the visible memory:
-        x1 = 0
-        y1 = (SVGA_REG_FB_SIZE + SVGA_REG_BYTES_PER_LINE - 1) / 
-             SVGA_REG_BYTES_PER_LINE
-        x2 = SVGA_REG_BYTES_PER_LINE / SVGA_REG_DEPTH
-        y2 = SVGA_REG_VRAM_SIZE / SVGA_REG_BYTES_PER_LINE
-
-
-Cursor Handling
----------------
-
-Starting with GSX Server Beta 3 (after 11/15/2000), hardware cursor support
-was added.  Actually, both a hardware cursor via the FIFO (SVGA_CAP_CURSOR)
-and a hardware cursor via the SVGA registers (SVGA_CAP_CURSOR_BYPASS) were
-added.  SVGA_CAP_CURSOR was never available without SVGA_CAP_CURSOR_BYPASS and
-the FIFO hardware cursor should never be used and may be removed without
-warning in the future.
-
-Cursor bypass is programmed using the two FIFO commands SVGA_CMD_DEFINE_CURSOR
-and SVGA_CMD_DEFINE_ALPHA_CURSOR in conjunction with the SVGA registers
-SVGA_REG_CURSOR_ID, SVGA_REG_CURSOR_X, SVGA_REG_CURSOR_Y, and
-SVGA_REG_CURSOR_ON.
-
-A driver defines an AND/XOR hardware cursor using SVGA_CMD_DEFINE_CURSOR to
-assign an ID and establish the AND and XOR masks with the hardware.  A driver
-uses SVGA_CMD_DEFINE_ALPHA_CURSOR to define a 32 bit mask whose top 8 bits are
-used to blend the cursor image with the pixels it covers.  Alpha cursor
-support is only available when SVGA_CAP_ALPHA_CURSOR is set.
-
-Once a cursor is defined, a driver can draw it to the screen at any time by
-writing the SVGA_REG_CURSOR_ID register with the ID used when the cursor was
-defined, writing SVGA_REG_CURSOR_X and SVGA_REG_CURSOR_Y with the location of
-the cursor, and SVGA_CURSOR_ON_SHOW to SVGA_REG_CURSOR_ON.  The drawing occurs
-when SVGA_REG_CURSOR_ON is written.
-
-Writing SVGA_CURSOR_ON_HIDE to SVGA_REG_CURSOR_ON will turn the cursor off and
-make it vanish from the display and, if present, from the framebuffer.
-SVGA_CURSOR_ON_REMOVE_FROM_FB will ensure the cursor is not in the
-framebuffer, but will only turn it off if there's no other way to remove it.
-SVGA_CURSOR_ON_RESTORE_TO_FB is the complement to
-SVGA_CURSOR_ON_REMOVE_FROM_FB.  Whenever possible, the device will not put the
-cursor in the framebuffer and Remove From / Restore To will be NOPs.
-
-Note: The cursor must be out of the frame buffer before the driver (or any
-agent in the virtual machine) touches an overlapping portion of the frame
-buffer, because it is actually drawn into the frame buffer memory in the
-case of direct graphics mode (e.g. full screen mode on Linux).  The cursor
-does not have to be touched before issuing an accelerated command via the
-command FIFO, this case is handled by the SVGA device.
-
-Note: If SVGA_CAP_CURSOR_BYPASS2 is not present, the driver must use
-SVGA_CURSOR_ON_HIDE and SVGA_CURSOR_ON_HIDE to be certain the cursor is out of
-the framebuffer.
-
-
-Driver Version Numbers
-----------------------
-
-The SVGA drivers use the following convention for their version numbers:
-
-Version 10.0 - The first version that uses the FIFO
-Version 10.1 - The version that uses the hardware cursor emulation via the FIFO
-Version 10.2 - The version that uses the cursor that bypasses the FIFO
-Version 10.3 - The version that can also support the 0405 chipset
-Version 10.4 - The version that knows about SVGA_CAP_CURSOR_BYPASS2
-Version 10.5 - [Never released or well defined]
-Version 10.6 - The version that knows about SVGA_CAP_8BIT_EMULATION
-Version 10.7 - The version that knows about SVGA_CAP_ALPHA_CURSOR
-Version 10.8 - The version that knows about SVGA_CAP_GLYPH
-Version 10.9 - The version that knows about SVGA_CAP_OFFSCREEN_1
-
-Note that this is merely the convention used by SVGA drivers written and
-maintained by VMware, Inc. and describes the capabilities of the driver, not
-the virtual hardware.  An SVGA driver can only use the intersection of the
-functionality it supports and the functionality available in the virtual SVGA
-hardware.
-
-
-Frequently Asked Questions
---------------------------
-
-1.  My driver doesn't display anything, what's going on?
-
-First check if you are issuing an SVGA_CMD_UPDATE after drawing to
-the screen.  Another check you can do is to run your driver in full
-screen mode on a Linux host.  In this case you are drawing directly
-on the frame buffer, so what you draw to the screen will be immediately
-visible.  If nothing is visible in this case, then most likely your
-driver hasn't mapped the frame buffer correctly.
-
-A discrepancy between what you get in full screen mode and what you
-get in window mode indicates that you have a missing or incorrect
-update command.
-
-
-2.  What's the difference between bitmaps and pixmaps?
-
-Pixmaps have the same depth as the screen, while bitmaps have depth one.
-When a bitmap is drawn, the command also takes two colors, foreground and
-background.  The set bits in the bitmap are replaced with the foreground
-color, and the unset bits are replaced with the background color.
-
-Pixmaps, on the other hand, can be directly copied to the screen.
-
-
-3.  What's the significance of the ROP in the commands SVGA_CMD_RECT_ROP_FILL,
-SVGA_CMD_RECT_ROP_BITMAP_COPY, etc. ?
-
-The ROP in the ...ROP... commands is a raster operation.  It has the same
-significance (and encoding) as it does in X.  The ROP value SVGA_ROP_COPY
-means the source is copied to the destination, which makes these commands the
-same as their non-ROP counterparts.  The most commonly used raster operation
-other than copy is probably SVGA_ROP_XOR, which combines the source and
-destination using exclusive-or.
-
-
-4.  Tell me more about bitmaps and pixmaps.  For example, the macro
-SVGA_CMD_DEFINE_BITMAP has a field <scanlines>.  What should this be
-set to?  Likewise with SVGA_CMD_DEFINE_PIXMAP.  And when should the
-SCANLINE macros be used?
-
-OK, I'll use pixmaps as an example.  First you have to define the pixmap:
-
-#define  SVGA_CMD_DEFINE_PIXMAP                6
-        /* FIFO layout:
-           Pixmap ID, Width, Height, Depth, <scanlines> */
-
-The ID is something you choose, which you subsequently use to refer to
-this pixmap.  It must be an integer between 0 and SVGA_MAX_ID.
-
-The width and height and depth are the dimensions of the pixmap.  For now,
-the depth of the pixmap has to match the depth of the screen.
-
-The scanlines are the pixels that make up the pixmap, arranged one row
-at a time.  Each row is required to be 32-bit aligned.  The macros
-SVGA_PIXMAP_SCANLINE_SIZE and SVGA_PIXMAP_SIZE give the size of a
-single scanline, and the size of the entire pixmap, respectively, in
-32-bit words.
-
-The second step is to use it:
-
-#define  SVGA_CMD_RECT_PIXMAP_FILL     9
-        /* FIFO layout:
-           Pixmap ID, X, Y, Width, Height */
-
-The ID here is the one you chose when defining the pixmap.  X, Y,
-Width, and Height define a rectangle on the screen that is to be filled
-with the pixmap.  The pixmap is screen aligned, which means that the
-coordinates in the pixmap are defined by the screen coordinates modulo
-the pixmap dimensions.
-
-If you want a different alignment between the screen and the pixmap,
-then you can use this command, which allows the pixmap coordinates to
-be defined:
-
-#define  SVGA_CMD_RECT_PIXMAP_COPY     11
-        /* FIFO layout:
-           Pixmap ID, Source X, Source Y, Dest X, Dest Y, Width,
-           Height */
-
-The Source X and Source Y are pixmap coordinates, and the Dest X and
-Dest Y are screen coordinates.
-
-
-5.  OK, now it works briefly, then stops displaying anything.  Also,
-my log file is filled with lines like:
-  Unknown Command 0xff in SVGA command FIFO
-What's happening?
-
-The most common problem at this point is that the FIFO gets out
-of sync.  This can happen if the amount of data in the FIFO doesn't
-match what the VMware SVGA device expects.  To track this down, try
-to isolate the particular command which causes the problem.
-
-Another way this can happen is if the wraparound in the FIFO isn't
-done correctly.  Here is some example code for writing to the FIFO
-(mem is an array of 32-bit integers that points to the FIFO memory
-region):
-
-while (TRUE) {
-    fifo_min = mem[SVGA_FIFO_MIN] / 4;
-    fifo_max = mem[SVGA_FIFO_MAX] / 4;
-    fifo_next = mem[SVGA_FIFO_NEXT_CMD] / 4;
-    fifo_stop = mem[SVGA_FIFO_STOP] / 4;
-
-    tmp_next = fifo_next+1;
-    if (tmp_next == fifo_max)
-       tmp_next = fifo_min;    // Wraparound
-
-    if (tmp_next == fifo_stop) {
-       sync_fifo();            // FIFO full
-       continue;               // retry
-    }
-
-    mem[fifo_next] = item;
-    mem[SVGA_FIFO_NEXT_CMD] = tmp_next * 4;
-    break;
-}
-
-This isn't the most efficient code, but it should work.  It's important
-to do the increment with wraparound before the FIFO full check, and to
-check FIFO full before updating the next command pointer.
-
-
-6. My driver tries to switch modes and either nothing happens or the
-display becomes completely garbled.  What's going on?
-
-When you change modes, make very sure you reread all of the registers listed
-above under SetMode.  Getting the pitch (SVGA_REG_BYTES_PER_LINE) incorrect
-will cause a heavily garbled display.  Also, if you change
-SVGA_REG_BITS_PER_PIXEL, make certain that SVGA_CAP_8BIT_EMULATION is present
-in the SVGA_REG_CAPABILITIES register.  Also, even with 8 bit emulation, the
-driver must still use either 8 bpp or SVGA_REG_HOST_BITS_PER_PIXEL bpp,
-nothing else.
-
-
-7. Why does my driver's hardware cursor work when my virtual machine is in
-window mode, but draw/erase incorrectly or in garbled locations in fullscreen
-mode?
-
-You need to make sure you use SVGA_CURSOR_ON_REMOVE_FROM_FB and
-SVGA_CURSOR_ON_RESTORE_TO_FB _every_ time your driver or the virtual machine
-touches a region of the framebuffer that overlaps the cursor.  If you forget
-to remove it then it can show up when doing save-under operations or get mixed
-in with other drawing.  If you forget to restore it then can disappear.  You
-also need to make sure SVGA_CAP_CURSOR_BYPASS2 is available, or else you will
-have to use SVGA_CURSOR_ON_SHOW and SVGA_CURSOR_ON_HIDE (which will flicker,
-even in window mode), or else a software cursor.  Newer version of the virtual
-SVGA hardware will never put the hardware cursor in the framebuffer while in
-window mode, so everything will appear to work correctly there.
-
-
-8. Why do my accelerated glyphs look funny?  OR  Why does the fifo complain
-about invalid commands when I draw accelerated glyphs?
-
-The bitmap data passed to SVGA_CMD_DRAW_GLYPH_* must not have any per-scanline
-alignment.  If there are any remaining bits left in the last byte of a scanline,
-the first bits of the next scanline should use them.  
-
-The bitmap data as a whole must be 4 byte aligned.
+http://vmware-svga.sourceforge.net/
 
-$XFree86: xc/programs/Xserver/hw/xfree86/drivers/vmware/README,v 1.5 2002/10/16 22:12:53 alanh Exp $
+--