Home | History | Annotate | Line # | Download | only in src
      1 /*
      2  * Copyright 2008 Red Hat, Inc.
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * on the rights to use, copy, modify, merge, publish, distribute, sub
      8  * license, and/or sell copies of the Software, and to permit persons to whom
      9  * the Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
     19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     21  */
     22 
     23 #ifndef QXL_H
     24 #define QXL_H
     25 
     26 #include <stdint.h>
     27 
     28 #include <spice/qxl_dev.h>
     29 #ifdef XSPICE
     30 #include <spice.h>
     31 #endif
     32 
     33 #include "compiler.h"
     34 #include "xf86.h"
     35 #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
     36 #include "xf86Resources.h"
     37 #endif
     38 #include "xf86Cursor.h"
     39 #include "xf86_OSproc.h"
     40 #ifdef XV
     41 #include "xf86xv.h"
     42 #endif
     43 #include "xf86Crtc.h"
     44 #include "shadow.h"
     45 #include "micmap.h"
     46 #include "uxa/uxa.h"
     47 
     48 #include "list.h"
     49 #ifndef XSPICE
     50 #ifdef XSERVER_PCIACCESS
     51 #include "pciaccess.h"
     52 #endif
     53 #ifdef XSERVER_PLATFORM_BUS
     54 #include "xf86platformBus.h"
     55 #endif
     56 #include "fb.h"
     57 #include "vgaHW.h"
     58 #endif /* XSPICE */
     59 
     60 #include "qxl_drmmode.h"
     61 
     62 #if (XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 11, 99, 903, 0))
     63 typedef struct list xorg_list_t;
     64 #define xorg_list_init              list_init
     65 #define xorg_list_add               list_add
     66 #define xorg_list_del               list_del
     67 #define xorg_list_for_each_entry    list_for_each_entry
     68 #else
     69 typedef struct xorg_list xorg_list_t;
     70 #endif
     71 
     72 struct xf86_platform_device;
     73 
     74 #include "compat-api.h"
     75 #define hidden _X_HIDDEN
     76 
     77 #ifdef XSPICE
     78 #define QXL_NAME		"spiceqxl"
     79 #define QXL_DRIVER_NAME		"spiceqxl"
     80 #else
     81 #define QXL_NAME		"qxl"
     82 #define QXL_DRIVER_NAME		"qxl"
     83 #endif
     84 #define PCI_VENDOR_RED_HAT	0x1b36
     85 
     86 #define PCI_CHIP_QXL_0100	0x0100
     87 #define PCI_CHIP_QXL_01FF	0x01ff
     88 
     89 #pragma pack(push,1)
     90 
     91 struct qxl_ring_header {
     92     uint32_t num_items;
     93     uint32_t prod;
     94     uint32_t notify_on_prod;
     95     uint32_t cons;
     96     uint32_t notify_on_cons;
     97 };
     98 
     99 #pragma pack(pop)
    100 typedef struct surface_cache_t surface_cache_t;
    101 
    102 typedef struct _qxl_screen_t qxl_screen_t;
    103 
    104 typedef struct
    105 {
    106     uint8_t	generation;
    107     uint64_t	start_phys_addr;
    108     uint64_t	end_phys_addr;
    109     uint64_t	start_virt_addr;
    110     uint64_t	end_virt_addr;
    111     uint64_t	high_bits;
    112 } qxl_memslot_t;
    113 
    114 typedef struct qxl_surface_t qxl_surface_t;
    115 
    116 /*
    117  * Config Options
    118  */
    119 
    120 enum {
    121     OPTION_ENABLE_IMAGE_CACHE = 0,
    122     OPTION_ENABLE_FALLBACK_CACHE,
    123     OPTION_ENABLE_SURFACES,
    124     OPTION_DEBUG_RENDER_FALLBACKS,
    125     OPTION_NUM_HEADS,
    126     OPTION_SPICE_DEFERRED_FPS,
    127 #ifdef XSPICE
    128     OPTION_SPICE_PORT,
    129     OPTION_SPICE_TLS_PORT,
    130     OPTION_SPICE_ADDR,
    131     OPTION_SPICE_X509_DIR,
    132     OPTION_SPICE_SASL,
    133     OPTION_SPICE_AGENT_MOUSE,
    134     OPTION_SPICE_DISABLE_TICKETING,
    135     OPTION_SPICE_PASSWORD,
    136     OPTION_SPICE_X509_KEY_FILE,
    137     OPTION_SPICE_STREAMING_VIDEO,
    138     OPTION_SPICE_PLAYBACK_COMPRESSION,
    139     OPTION_SPICE_ZLIB_GLZ_WAN_COMPRESSION,
    140     OPTION_SPICE_JPEG_WAN_COMPRESSION,
    141     OPTION_SPICE_IMAGE_COMPRESSION,
    142     OPTION_SPICE_DISABLE_COPY_PASTE,
    143     OPTION_SPICE_IPV4_ONLY,
    144     OPTION_SPICE_IPV6_ONLY,
    145     OPTION_SPICE_X509_CERT_FILE,
    146     OPTION_SPICE_X509_KEY_PASSWORD,
    147     OPTION_SPICE_TLS_CIPHERS,
    148     OPTION_SPICE_CACERT_FILE,
    149     OPTION_SPICE_DH_FILE,
    150     OPTION_SPICE_EXIT_ON_DISCONNECT,
    151     OPTION_SPICE_PLAYBACK_FIFO_DIR,
    152     OPTION_SPICE_VDAGENT_ENABLED,
    153     OPTION_SPICE_VDAGENT_VIRTIO_PATH,
    154     OPTION_SPICE_VDAGENT_UINPUT_PATH,
    155     OPTION_SPICE_VDAGENT_UID,
    156     OPTION_SPICE_VDAGENT_GID,
    157     OPTION_FRAME_BUFFER_SIZE,
    158     OPTION_SURFACE_BUFFER_SIZE,
    159     OPTION_COMMAND_BUFFER_SIZE,
    160     OPTION_SPICE_SMARTCARD_FILE,
    161     OPTION_SPICE_VIDEO_CODECS,
    162 #endif
    163     OPTION_COUNT,
    164 };
    165 
    166 enum {
    167     QXL_DEVICE_PRIMARY_UNDEFINED,
    168     QXL_DEVICE_PRIMARY_NONE,
    169     QXL_DEVICE_PRIMARY_CREATED,
    170 };
    171 
    172 struct qxl_bo;
    173 /*
    174  * for relocations
    175  * dst_bo + dst_offset are the bo and offset into which the reloc is being written,
    176  * src_bo is the bo who's offset is being relocated.
    177  */
    178 struct qxl_bo_funcs {
    179     struct qxl_bo *(*bo_alloc)(qxl_screen_t *qxl, unsigned long size, const char *name);
    180     struct qxl_bo *(*cmd_alloc)(qxl_screen_t *qxl, unsigned long size, const char *name);
    181     void *(*bo_map)(struct qxl_bo *bo);
    182     void (*bo_unmap)(struct qxl_bo *bo);
    183     void (*bo_decref)(qxl_screen_t *qxl, struct qxl_bo *bo);
    184     void (*bo_incref)(qxl_screen_t *qxl, struct qxl_bo *bo);
    185     void (*bo_output_bo_reloc)(qxl_screen_t *qxl, uint32_t dst_offset,
    186 			       struct qxl_bo *dst_bo, struct qxl_bo *src_bo);
    187     void (*write_command)(qxl_screen_t *qxl, uint32_t type, struct qxl_bo *bo);
    188     void (*update_area)(qxl_surface_t *surf, int x1, int y1, int x2, int y2);
    189     struct qxl_bo *(*create_primary)(qxl_screen_t *qxl, uint32_t width, uint32_t height, int32_t stride, uint32_t format);
    190     void (*destroy_primary)(qxl_screen_t *qxl, struct qxl_bo *primary_bo);
    191 
    192     qxl_surface_t *(*create_surface)(qxl_screen_t *qxl, int width,
    193 				     int height, int bpp);
    194     void (*destroy_surface)(qxl_surface_t *surf);
    195 
    196     void (*bo_output_surf_reloc)(qxl_screen_t *qxl, uint32_t dst_offset,
    197 				 struct qxl_bo *dst_bo,
    198 				 qxl_surface_t *surf);
    199   /* surface create / destroy */
    200 };
    201 
    202 void qxl_ums_setup_funcs(qxl_screen_t *qxl);
    203 void qxl_kms_setup_funcs(qxl_screen_t *qxl);
    204 
    205 /* ums specific functions */
    206 struct qxl_bo *qxl_ums_surf_mem_alloc(qxl_screen_t *qxl, uint32_t size);
    207 struct qxl_bo *qxl_ums_lookup_phy_addr(qxl_screen_t *qxl, uint64_t phy_addr);
    208 
    209 typedef struct FrameTimer FrameTimer;
    210 typedef void (*FrameTimerFunc)(void *opaque);
    211 
    212 #ifdef XF86DRM_MODE
    213 #define MAX_RELOCS 96
    214 #include "qxl_drm.h"
    215 
    216 struct qxl_cmd_stream {
    217   struct qxl_bo *reloc_bo[MAX_RELOCS];
    218   int n_reloc_bos;
    219   struct drm_qxl_reloc relocs[MAX_RELOCS];
    220   int n_relocs;
    221 };
    222 #endif
    223 
    224 struct _qxl_screen_t
    225 {
    226     /* These are the names QXL uses */
    227     void *			ram;	/* Command RAM */
    228     void *			ram_physical;
    229     void *			vram;	/* Surface RAM */
    230     void *			vram_physical;
    231     struct QXLRom *		rom;    /* Parameter RAM */
    232 
    233     struct qxl_ring *		command_ring;
    234     struct qxl_ring *		cursor_ring;
    235     struct qxl_ring *		release_ring;
    236 
    237     Bool                        screen_resources_created;
    238     int                         device_primary;
    239     struct qxl_bo *             primary_bo;
    240     int				num_modes;
    241     struct QXLMode *		modes;
    242     int				io_base;
    243     void *			surface0_area;
    244     long			surface0_size;
    245     long			vram_size;
    246     long			ram_size;
    247 
    248     DisplayModePtr              x_modes;
    249 
    250     int				virtual_x;
    251     int				virtual_y;
    252 
    253     /* not the same as the heads mode for #head > 1 or virtual != head size */
    254     struct QXLMode 		primary_mode;
    255     qxl_surface_t *		primary;
    256 
    257     struct QXLMonitorsConfig   *monitors_config;
    258     int                         monitors_config_size;
    259     int                         mem_size;
    260 
    261     int				bytes_per_pixel;
    262 
    263     /* Commands */
    264     struct qxl_mem *		mem;   /* Context for qxl_alloc/free */
    265 
    266     /* Surfaces */
    267     struct qxl_mem *		surf_mem;  /* Context for qxl_surf_alloc/free */
    268 
    269     EntityInfoPtr		entity;
    270 
    271     int                         num_heads;
    272     xf86CrtcPtr *               crtcs;
    273     xf86OutputPtr *             outputs;
    274 
    275 #ifndef XSPICE
    276 #ifdef XSERVER_LIBPCIACCESS
    277     struct pci_device *		pci;
    278     struct pci_io_handle *	io;
    279 #else
    280     pciVideoPtr			pci;
    281     PCITAG			pci_tag;
    282 #endif
    283     struct xf86_platform_device *platform_dev;
    284     vgaRegRec                   vgaRegs;
    285 #endif /* XSPICE */
    286 
    287     uxa_driver_t *		uxa;
    288 
    289     CreateScreenResourcesProcPtr create_screen_resources;
    290     CloseScreenProcPtr		close_screen;
    291     CreateGCProcPtr		create_gc;
    292     CopyWindowProcPtr		copy_window;
    293 
    294     int16_t			cur_x;
    295     int16_t			cur_y;
    296     int16_t			hot_x;
    297     int16_t			hot_y;
    298 
    299     ScrnInfoPtr			pScrn;
    300 
    301     qxl_memslot_t *		mem_slots;
    302     uint8_t			n_mem_slots;
    303 
    304     uint8_t			main_mem_slot;
    305     uint8_t			slot_id_bits;
    306     uint8_t			slot_gen_bits;
    307     uint64_t			va_slot_mask;
    308 
    309     uint8_t			vram_mem_slot;
    310 
    311     surface_cache_t *		surface_cache;
    312 
    313     /* Evacuated surfaces are stored here during VT switches */
    314     void *			vt_surfaces;
    315 
    316     OptionInfoRec	options[OPTION_COUNT + 1];
    317 
    318     int				enable_image_cache;
    319     int				enable_fallback_cache;
    320     int				enable_surfaces;
    321     int                         debug_render_fallbacks;
    322 
    323     FrameTimer *        frames_timer;
    324 
    325 #ifdef XSPICE
    326     /* XSpice specific */
    327     struct QXLRom		shadow_rom;    /* Parameter RAM */
    328     SpiceServer *       spice_server;
    329     SpiceCoreInterface *core;
    330 
    331     QXLWorker *         worker;
    332     int                 worker_running;
    333     QXLInstance         display_sin;
    334     SpicePlaybackInstance playback_sin;
    335     /* XSpice specific, dragged from the Device */
    336     QXLReleaseInfo     *last_release;
    337 
    338     uint32_t           cmdflags;
    339     uint32_t           oom_running;
    340     uint32_t           num_free_res; /* is having a release ring effective
    341                                         for Xspice? */
    342     /* This is only touched from red worker thread - do not access
    343      * from Xorg threads. */
    344     struct guest_primary {
    345         QXLSurfaceCreate surface;
    346         uint32_t       commands;
    347         uint32_t       resized;
    348         int32_t        stride;
    349         uint32_t       bits_pp;
    350         uint32_t       bytes_pp;
    351         uint8_t        *data, *flipped;
    352     } guest_primary;
    353 
    354     char playback_fifo_dir[PATH_MAX];
    355     void *playback_opaque;
    356     char smartcard_file[PATH_MAX];
    357 #endif /* XSPICE */
    358 
    359     uint32_t deferred_fps;
    360     xorg_list_t ums_bos;
    361     struct qxl_bo_funcs *bo_funcs;
    362 
    363     Bool kms_enabled;
    364 #ifdef XF86DRM_MODE
    365     drmmode_rec drmmode;
    366     int drm_fd;
    367     struct qxl_cmd_stream cmds;
    368 #endif
    369 
    370 };
    371 
    372 typedef struct qxl_output_private {
    373     qxl_screen_t *qxl;
    374     int           head;
    375     xf86OutputStatus status;
    376 } qxl_output_private;
    377 
    378 typedef struct qxl_crtc_private {
    379     qxl_screen_t *qxl;
    380     int           head;
    381     xf86OutputPtr output;
    382 } qxl_crtc_private;
    383 
    384 static inline uint64_t
    385 physical_address (qxl_screen_t *qxl, void *virtual, uint8_t slot_id)
    386 {
    387     qxl_memslot_t *p_slot = &(qxl->mem_slots[slot_id]);
    388 
    389     return p_slot->high_bits | ((unsigned long)virtual - p_slot->start_virt_addr);
    390 }
    391 
    392 static inline void *
    393 virtual_address (qxl_screen_t *qxl, void *physical, uint8_t slot_id)
    394 {
    395     qxl_memslot_t *p_slot = &(qxl->mem_slots[slot_id]);
    396     unsigned long virt;
    397 
    398     virt = ((unsigned long)physical) & qxl->va_slot_mask;
    399     virt += p_slot->start_virt_addr;
    400 
    401     return (void *)virt;
    402 }
    403 
    404 static inline void *
    405 u64_to_pointer (uint64_t u)
    406 {
    407     return (void *)(unsigned long)u;
    408 }
    409 
    410 static inline uint64_t
    411 pointer_to_u64 (void *p)
    412 {
    413     return (uint64_t)(unsigned long)p;
    414 }
    415 
    416 struct qxl_ring;
    417 
    418 /*
    419  * HW cursor
    420  */
    421 void              qxl_cursor_init        (ScreenPtr               pScreen);
    422 
    423 
    424 
    425 /*
    426  * Rings
    427  */
    428 struct qxl_ring * qxl_ring_create      (struct qxl_ring_header *header,
    429 					int                     element_size,
    430 					int                     n_elements,
    431 					int                     prod_notify,
    432 					qxl_screen_t            *qxl);
    433 void              qxl_ring_push        (struct qxl_ring        *ring,
    434 					const void             *element);
    435 Bool              qxl_ring_pop         (struct qxl_ring        *ring,
    436 					void                   *element);
    437 void              qxl_ring_wait_idle   (struct qxl_ring        *ring);
    438 
    439 void              qxl_ring_request_notify (struct qxl_ring *ring);
    440 
    441 int               qxl_ring_prod        (struct qxl_ring        *ring);
    442 int               qxl_ring_cons        (struct qxl_ring        *ring);
    443 
    444 /*
    445  * Surface
    446  */
    447 surface_cache_t *   qxl_surface_cache_create (qxl_screen_t *qxl);
    448 qxl_surface_t *	    qxl_surface_cache_create_primary (qxl_screen_t *qxl,
    449 						struct QXLMode *mode);
    450 void *              qxl_surface_get_host_bits(qxl_surface_t *surface);
    451 qxl_surface_t *	    qxl_surface_create (qxl_screen_t *qxl,
    452 					int	      width,
    453 					int	      height,
    454 					int	      bpp);
    455 void
    456 qxl_surface_cache_sanity_check (surface_cache_t *qxl);
    457 void *
    458 qxl_surface_cache_evacuate_all (surface_cache_t *qxl);
    459 void
    460 qxl_surface_cache_replace_all (surface_cache_t *qxl, void *data);
    461 
    462 void		    qxl_surface_set_pixmap (qxl_surface_t *surface,
    463 					    PixmapPtr      pixmap);
    464 /* Call this to indicate that the server is done with the surface */
    465 void		    qxl_surface_kill (qxl_surface_t *surface);
    466 /* Call this when a notification comes back from the device
    467  * that the surface has been destroyed
    468  */
    469 void		    qxl_surface_recycle (surface_cache_t *cache, uint32_t id);
    470 
    471 /* send anything pending to the other side */
    472 void		    qxl_surface_flush (qxl_surface_t *surface);
    473 
    474 /* access */
    475 Bool		    qxl_surface_prepare_access (qxl_surface_t *surface,
    476 						PixmapPtr      pixmap,
    477 						RegionPtr      region,
    478 						uxa_access_t   access);
    479 void		    qxl_surface_finish_access (qxl_surface_t *surface,
    480 					       PixmapPtr      pixmap);
    481 
    482 /* solid */
    483 Bool		    qxl_surface_prepare_solid (qxl_surface_t *destination,
    484 					       Pixel	      fg);
    485 void		    qxl_surface_solid         (qxl_surface_t *destination,
    486 					       int	      x1,
    487 					       int	      y1,
    488 					       int	      x2,
    489 					       int	      y2);
    490 
    491 /* copy */
    492 Bool		    qxl_surface_prepare_copy (qxl_surface_t *source,
    493 					      qxl_surface_t *dest);
    494 void		    qxl_surface_copy	     (qxl_surface_t *dest,
    495 					      int  src_x1, int src_y1,
    496 					      int  dest_x1, int dest_y1,
    497 					      int width, int height);
    498 Bool		    qxl_surface_put_image    (qxl_surface_t *dest,
    499 					      int x, int y, int width, int height,
    500 					      const char *src, int src_pitch);
    501 void		    qxl_surface_unref        (surface_cache_t *cache,
    502 					      uint32_t surface_id);
    503 
    504 /* composite */
    505 Bool		    qxl_surface_prepare_composite (int op,
    506 						   PicturePtr	src_picture,
    507 						   PicturePtr	mask_picture,
    508 						   PicturePtr   dst_picture,
    509 						   qxl_surface_t *src,
    510 						   qxl_surface_t *mask,
    511 						   qxl_surface_t *dest);
    512 void		   qxl_surface_composite (qxl_surface_t *dest,
    513 					  int src_x, int src_y,
    514 					  int mask_x, int mask_y,
    515 					  int dst_x, int dst_y,
    516 					  int width, int height);
    517 
    518 /* UXA */
    519 #if HAS_DEVPRIVATEKEYREC
    520 extern DevPrivateKeyRec uxa_pixmap_index;
    521 #else
    522 extern int uxa_pixmap_index;
    523 #endif
    524 Bool
    525 qxl_uxa_init (qxl_screen_t *qxl, ScreenPtr screen);
    526 
    527 static inline qxl_surface_t *get_surface (PixmapPtr pixmap)
    528 {
    529 #if HAS_DEVPRIVATEKEYREC
    530     return dixGetPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
    531 #else
    532     return dixLookupPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
    533 #endif
    534 }
    535 
    536 static inline void set_surface (PixmapPtr pixmap, qxl_surface_t *surface)
    537 {
    538     dixSetPrivate(&pixmap->devPrivates, &uxa_pixmap_index, surface);
    539 }
    540 
    541 static inline struct QXLRam *
    542 get_ram_header (qxl_screen_t *qxl)
    543 {
    544     return (struct QXLRam *)
    545 	((uint8_t *)qxl->ram + qxl->rom->ram_header_offset);
    546 }
    547 
    548 void qxl_surface_upload_primary_regions(qxl_screen_t *qxl, PixmapPtr pixmap, RegionRec *r);
    549 
    550 /* ums randr code */
    551 void qxl_init_randr (ScrnInfoPtr pScrn, qxl_screen_t *qxl);
    552 void qxl_initialize_x_modes (qxl_screen_t *qxl, ScrnInfoPtr pScrn,
    553                         unsigned int *max_x, unsigned int *max_y);
    554 void qxl_update_edid (qxl_screen_t *qxl);
    555 Bool qxl_create_desired_modes (qxl_screen_t *qxl);
    556 
    557 Bool qxl_resize_primary (qxl_screen_t *qxl, uint32_t width, uint32_t height);
    558 void qxl_io_monitors_config_async (qxl_screen_t *qxl);
    559 void qxl_allocate_monitors_config (qxl_screen_t *qxl);
    560 /*
    561  * Images
    562  */
    563 struct qxl_bo *qxl_image_create     (qxl_screen_t           *qxl,
    564 				       const uint8_t          *data,
    565 				       int                     x,
    566 				       int                     y,
    567 				       int                     width,
    568 				       int                     height,
    569 				       int                     stride,
    570 				       int                     Bpp,
    571 				       Bool		       fallback);
    572 void              qxl_image_destroy    (qxl_screen_t           *qxl,
    573 				        struct qxl_bo *bo);
    574 
    575 /*
    576  * Malloc
    577  */
    578 void              qxl_mem_init(void);
    579 int		  qxl_handle_oom (qxl_screen_t *qxl);
    580 struct qxl_mem *  qxl_mem_create       (void                   *base,
    581 					unsigned long           n_bytes);
    582 void              qxl_mem_dump_stats   (struct qxl_mem         *mem,
    583 					const char             *header);
    584 void              qxl_mem_free_all     (struct qxl_mem         *mem);
    585 int		   qxl_garbage_collect (qxl_screen_t *qxl);
    586 
    587 void qxl_reset_and_create_mem_slots (qxl_screen_t *qxl);
    588 void qxl_mark_mem_unverifiable (qxl_screen_t *qxl);
    589 #ifdef DEBUG_QXL_MEM
    590 void qxl_mem_unverifiable(struct qxl_mem *mem);
    591 #else
    592 static inline void qxl_mem_unverifiable(struct qxl_mem *mem) {}
    593 #endif
    594 
    595 /*
    596  * I/O port commands
    597  */
    598 void qxl_update_area(qxl_screen_t *qxl);
    599 void qxl_io_memslot_add(qxl_screen_t *qxl, uint8_t id);
    600 void qxl_io_create_primary(qxl_screen_t *qxl);
    601 void qxl_io_destroy_primary(qxl_screen_t *qxl);
    602 void qxl_io_notify_oom(qxl_screen_t *qxl);
    603 void qxl_io_flush_surfaces(qxl_screen_t *qxl);
    604 void qxl_io_destroy_all_surfaces (qxl_screen_t *qxl);
    605 
    606 #ifdef QXLDRV_RESIZABLE_SURFACE0
    607 void qxl_io_flush_release (qxl_screen_t *qxl);
    608 #endif
    609 
    610 Bool qxl_pre_init_common(ScrnInfoPtr pScrn);
    611 Bool qxl_fb_init (qxl_screen_t *qxl, ScreenPtr pScreen);
    612 Bool qxl_screen_init_kms(SCREEN_INIT_ARGS_DECL);
    613 Bool qxl_enter_vt_kms (VT_FUNC_ARGS_DECL);
    614 void qxl_leave_vt_kms (VT_FUNC_ARGS_DECL);
    615 void qxl_set_screen_pixmap_header (ScreenPtr pScreen);
    616 Bool qxl_resize_primary_to_virtual (qxl_screen_t *qxl);
    617 void qxl_get_formats (int bpp, SpiceSurfaceFmt *format, pixman_format_code_t *pformat);
    618 
    619 #ifdef XF86DRM_MODE
    620 Bool qxl_pre_init_kms(ScrnInfoPtr pScrn, int flags);
    621 Bool qxl_kms_check_cap(qxl_screen_t *qxl, int cap);
    622 uint32_t qxl_kms_bo_get_handle(struct qxl_bo *_bo);
    623 #else
    624 static inline Bool qxl_pre_init_kms(ScrnInfoPtr pScrn, int flags) { return FALSE; }
    625 static inline Bool qxl_kms_check_cap(qxl_screen_t *qxl, int cap) { return FALSE; }
    626 #endif
    627 
    628 #ifdef XSPICE
    629 /* device to spice-server, now xspice to spice-server */
    630 void ioport_write(qxl_screen_t *qxl, uint32_t io_port, uint32_t val);
    631 #else
    632 static inline void ioport_write(qxl_screen_t *qxl, int port, int val)
    633 {
    634     pci_io_write8(qxl->io, port, val);
    635 }
    636 #endif
    637 
    638 #ifdef XSPICE
    639 
    640 #define MEMSLOT_GROUP 0
    641 #define NUM_MEMSLOTS_GROUPS 1
    642 
    643 // Taken from qemu's qxl.c, not sure the values make sense? we
    644 // only have a single slot, and it is never changed after being added,
    645 // so not a problem?
    646 #define NUM_MEMSLOTS 8
    647 #define MEMSLOT_GENERATION_BITS 8
    648 #define MEMSLOT_SLOT_BITS 1
    649 
    650 // qemu/cpu-all.h
    651 #define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS)
    652 // qemu/target-i386/cpu.h
    653 #define TARGET_PAGE_BITS 12
    654 
    655 #define NUM_SURFACES 1024
    656 
    657 /* initializes if required and returns the server singleton */
    658 SpiceServer *xspice_get_spice_server(void);
    659 
    660 #endif /* XSPICE */
    661 
    662 #ifdef WITH_CHECK_POINT
    663 #define CHECK_POINT() ErrorF ("%s: %d  (%s)\n", __FILE__, __LINE__, __FUNCTION__);
    664 #else
    665 #define CHECK_POINT()
    666 #endif
    667 
    668 
    669 #endif // QXL_H
    670