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