aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2013-07-02 01:37:13 -0400
committerDave Airlie <airlied@redhat.com>2013-07-04 20:44:10 -0400
commit07f8d9bdb235836d0a255d20f387bc3afa99180f (patch)
tree9b6dea6d50056c83549832e265caf8a39215752c
parent5b8788c1740fae8416e7e045301d99676d20bd64 (diff)
drm/qxl: add support for > 1 output
This adds support for a default of 4 heads, with a command line parameter to change the default number. It also overhauls the modesetting code to handle this case properly, and send the correct things to the hardware at the right time. Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/qxl/qxl_cmd.c8
-rw-r--r--drivers/gpu/drm/qxl/qxl_display.c121
-rw-r--r--drivers/gpu/drm/qxl/qxl_drv.c4
-rw-r--r--drivers/gpu/drm/qxl/qxl_drv.h8
-rw-r--r--drivers/gpu/drm/qxl/qxl_fb.c2
5 files changed, 85 insertions, 58 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c
index f86771481317..92cf1afd60e5 100644
--- a/drivers/gpu/drm/qxl/qxl_cmd.c
+++ b/drivers/gpu/drm/qxl/qxl_cmd.c
@@ -375,8 +375,8 @@ void qxl_io_destroy_primary(struct qxl_device *qdev)
375 wait_for_io_cmd(qdev, 0, QXL_IO_DESTROY_PRIMARY_ASYNC); 375 wait_for_io_cmd(qdev, 0, QXL_IO_DESTROY_PRIMARY_ASYNC);
376} 376}
377 377
378void qxl_io_create_primary(struct qxl_device *qdev, unsigned width, 378void qxl_io_create_primary(struct qxl_device *qdev,
379 unsigned height, unsigned offset, struct qxl_bo *bo) 379 unsigned offset, struct qxl_bo *bo)
380{ 380{
381 struct qxl_surface_create *create; 381 struct qxl_surface_create *create;
382 382
@@ -384,8 +384,8 @@ void qxl_io_create_primary(struct qxl_device *qdev, unsigned width,
384 qdev->ram_header); 384 qdev->ram_header);
385 create = &qdev->ram_header->create_surface; 385 create = &qdev->ram_header->create_surface;
386 create->format = bo->surf.format; 386 create->format = bo->surf.format;
387 create->width = width; 387 create->width = bo->surf.width;
388 create->height = height; 388 create->height = bo->surf.height;
389 create->stride = bo->surf.stride; 389 create->stride = bo->surf.stride;
390 create->mem = qxl_bo_physical_address(qdev, bo, offset); 390 create->mem = qxl_bo_physical_address(qdev, bo, offset);
391 391
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
index df5ca7e72e67..d3b92618246e 100644
--- a/drivers/gpu/drm/qxl/qxl_display.c
+++ b/drivers/gpu/drm/qxl/qxl_display.c
@@ -30,6 +30,11 @@
30#include "qxl_object.h" 30#include "qxl_object.h"
31#include "drm_crtc_helper.h" 31#include "drm_crtc_helper.h"
32 32
33static bool qxl_head_enabled(struct qxl_head *head)
34{
35 return head->width && head->height;
36}
37
33void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count) 38void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count)
34{ 39{
35 if (qdev->client_monitors_config && 40 if (qdev->client_monitors_config &&
@@ -57,7 +62,6 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)
57 int num_monitors; 62 int num_monitors;
58 uint32_t crc; 63 uint32_t crc;
59 64
60 BUG_ON(!qdev->monitors_config);
61 num_monitors = qdev->rom->client_monitors_config.count; 65 num_monitors = qdev->rom->client_monitors_config.count;
62 crc = crc32(0, (const uint8_t *)&qdev->rom->client_monitors_config, 66 crc = crc32(0, (const uint8_t *)&qdev->rom->client_monitors_config,
63 sizeof(qdev->rom->client_monitors_config)); 67 sizeof(qdev->rom->client_monitors_config));
@@ -83,18 +87,15 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)
83 &qdev->rom->client_monitors_config.heads[i]; 87 &qdev->rom->client_monitors_config.heads[i];
84 struct qxl_head *client_head = 88 struct qxl_head *client_head =
85 &qdev->client_monitors_config->heads[i]; 89 &qdev->client_monitors_config->heads[i];
86 struct qxl_head *head = &qdev->monitors_config->heads[i]; 90 client_head->x = c_rect->left;
87 client_head->x = head->x = c_rect->left; 91 client_head->y = c_rect->top;
88 client_head->y = head->y = c_rect->top; 92 client_head->width = c_rect->right - c_rect->left;
89 client_head->width = head->width = 93 client_head->height = c_rect->bottom - c_rect->top;
90 c_rect->right - c_rect->left; 94 client_head->surface_id = 0;
91 client_head->height = head->height = 95 client_head->id = i;
92 c_rect->bottom - c_rect->top; 96 client_head->flags = 0;
93 client_head->surface_id = head->surface_id = 0; 97 DRM_DEBUG_KMS("read %dx%d+%d+%d\n", client_head->width, client_head->height,
94 client_head->id = head->id = i; 98 client_head->x, client_head->y);
95 client_head->flags = head->flags = 0;
96 DRM_DEBUG_KMS("read %dx%d+%d+%d\n", head->width, head->height,
97 head->x, head->y);
98 } 99 }
99 return 0; 100 return 0;
100} 101}
@@ -118,9 +119,9 @@ static int qxl_add_monitors_config_modes(struct drm_connector *connector)
118 struct drm_display_mode *mode = NULL; 119 struct drm_display_mode *mode = NULL;
119 struct qxl_head *head; 120 struct qxl_head *head;
120 121
121 if (!qdev->monitors_config) 122 if (!qdev->client_monitors_config)
122 return 0; 123 return 0;
123 head = &qdev->monitors_config->heads[h]; 124 head = &qdev->client_monitors_config->heads[h];
124 125
125 mode = drm_cvt_mode(dev, head->width, head->height, 60, false, false, 126 mode = drm_cvt_mode(dev, head->width, head->height, 60, false, false,
126 false); 127 false);
@@ -447,7 +448,7 @@ qxl_send_monitors_config(struct qxl_device *qdev)
447 for (i = 0 ; i < qdev->monitors_config->count ; ++i) { 448 for (i = 0 ; i < qdev->monitors_config->count ; ++i) {
448 struct qxl_head *head = &qdev->monitors_config->heads[i]; 449 struct qxl_head *head = &qdev->monitors_config->heads[i];
449 450
450 if (head->y > 8192 || head->y < head->x || 451 if (head->y > 8192 || head->x > 8192 ||
451 head->width > 8192 || head->height > 8192) { 452 head->width > 8192 || head->height > 8192) {
452 DRM_ERROR("head %d wrong: %dx%d+%d+%d\n", 453 DRM_ERROR("head %d wrong: %dx%d+%d+%d\n",
453 i, head->width, head->height, 454 i, head->width, head->height,
@@ -458,16 +459,19 @@ qxl_send_monitors_config(struct qxl_device *qdev)
458 qxl_io_monitors_config(qdev); 459 qxl_io_monitors_config(qdev);
459} 460}
460 461
461static void qxl_monitors_config_set_single(struct qxl_device *qdev, 462static void qxl_monitors_config_set(struct qxl_device *qdev,
462 unsigned x, unsigned y, 463 int index,
463 unsigned width, unsigned height) 464 unsigned x, unsigned y,
465 unsigned width, unsigned height,
466 unsigned surf_id)
464{ 467{
465 DRM_DEBUG("%dx%d+%d+%d\n", width, height, x, y); 468 DRM_DEBUG_KMS("%d:%dx%d+%d+%d\n", index, width, height, x, y);
466 qdev->monitors_config->count = 1; 469 qdev->monitors_config->heads[index].x = x;
467 qdev->monitors_config->heads[0].x = x; 470 qdev->monitors_config->heads[index].y = y;
468 qdev->monitors_config->heads[0].y = y; 471 qdev->monitors_config->heads[index].width = width;
469 qdev->monitors_config->heads[0].width = width; 472 qdev->monitors_config->heads[index].height = height;
470 qdev->monitors_config->heads[0].height = height; 473 qdev->monitors_config->heads[index].surface_id = surf_id;
474
471} 475}
472 476
473static int qxl_crtc_mode_set(struct drm_crtc *crtc, 477static int qxl_crtc_mode_set(struct drm_crtc *crtc,
@@ -481,10 +485,11 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
481 struct qxl_mode *m = (void *)mode->private; 485 struct qxl_mode *m = (void *)mode->private;
482 struct qxl_framebuffer *qfb; 486 struct qxl_framebuffer *qfb;
483 struct qxl_bo *bo, *old_bo = NULL; 487 struct qxl_bo *bo, *old_bo = NULL;
488 struct qxl_crtc *qcrtc = to_qxl_crtc(crtc);
484 uint32_t width, height, base_offset; 489 uint32_t width, height, base_offset;
485 bool recreate_primary = false; 490 bool recreate_primary = false;
486 int ret; 491 int ret;
487 492 int surf_id;
488 if (!crtc->fb) { 493 if (!crtc->fb) {
489 DRM_DEBUG_KMS("No FB bound\n"); 494 DRM_DEBUG_KMS("No FB bound\n");
490 return 0; 495 return 0;
@@ -508,7 +513,8 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
508 adjusted_mode->hdisplay, 513 adjusted_mode->hdisplay,
509 adjusted_mode->vdisplay); 514 adjusted_mode->vdisplay);
510 515
511 recreate_primary = true; 516 if (qcrtc->index == 0)
517 recreate_primary = true;
512 518
513 width = mode->hdisplay; 519 width = mode->hdisplay;
514 height = mode->vdisplay; 520 height = mode->vdisplay;
@@ -529,8 +535,11 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
529 "recreate primary: %dx%d (was %dx%d,%d,%d)\n", 535 "recreate primary: %dx%d (was %dx%d,%d,%d)\n",
530 width, height, bo->surf.width, 536 width, height, bo->surf.width,
531 bo->surf.height, bo->surf.stride, bo->surf.format); 537 bo->surf.height, bo->surf.stride, bo->surf.format);
532 qxl_io_create_primary(qdev, width, height, base_offset, bo); 538 qxl_io_create_primary(qdev, base_offset, bo);
533 bo->is_primary = true; 539 bo->is_primary = true;
540 surf_id = 0;
541 } else {
542 surf_id = bo->surface_id;
534 } 543 }
535 544
536 if (old_bo && old_bo != bo) { 545 if (old_bo && old_bo != bo) {
@@ -540,11 +549,9 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
540 qxl_bo_unreserve(old_bo); 549 qxl_bo_unreserve(old_bo);
541 } 550 }
542 551
543 if (qdev->monitors_config->count == 0) { 552 qxl_monitors_config_set(qdev, qcrtc->index, x, y,
544 qxl_monitors_config_set_single(qdev, x, y, 553 mode->hdisplay,
545 mode->hdisplay, 554 mode->vdisplay, surf_id);
546 mode->vdisplay);
547 }
548 return 0; 555 return 0;
549} 556}
550 557
@@ -560,15 +567,36 @@ static void qxl_crtc_commit(struct drm_crtc *crtc)
560 DRM_DEBUG("\n"); 567 DRM_DEBUG("\n");
561} 568}
562 569
570static void qxl_crtc_disable(struct drm_crtc *crtc)
571{
572 struct qxl_crtc *qcrtc = to_qxl_crtc(crtc);
573 struct drm_device *dev = crtc->dev;
574 struct qxl_device *qdev = dev->dev_private;
575 if (crtc->fb) {
576 struct qxl_framebuffer *qfb = to_qxl_framebuffer(crtc->fb);
577 struct qxl_bo *bo = gem_to_qxl_bo(qfb->obj);
578 int ret;
579 ret = qxl_bo_reserve(bo, false);
580 qxl_bo_unpin(bo);
581 qxl_bo_unreserve(bo);
582 crtc->fb = NULL;
583 }
584
585 qxl_monitors_config_set(qdev, qcrtc->index, 0, 0, 0, 0, 0);
586
587 qxl_send_monitors_config(qdev);
588}
589
563static const struct drm_crtc_helper_funcs qxl_crtc_helper_funcs = { 590static const struct drm_crtc_helper_funcs qxl_crtc_helper_funcs = {
564 .dpms = qxl_crtc_dpms, 591 .dpms = qxl_crtc_dpms,
592 .disable = qxl_crtc_disable,
565 .mode_fixup = qxl_crtc_mode_fixup, 593 .mode_fixup = qxl_crtc_mode_fixup,
566 .mode_set = qxl_crtc_mode_set, 594 .mode_set = qxl_crtc_mode_set,
567 .prepare = qxl_crtc_prepare, 595 .prepare = qxl_crtc_prepare,
568 .commit = qxl_crtc_commit, 596 .commit = qxl_crtc_commit,
569}; 597};
570 598
571static int qdev_crtc_init(struct drm_device *dev, int num_crtc) 599static int qdev_crtc_init(struct drm_device *dev, int crtc_id)
572{ 600{
573 struct qxl_crtc *qxl_crtc; 601 struct qxl_crtc *qxl_crtc;
574 602
@@ -577,7 +605,7 @@ static int qdev_crtc_init(struct drm_device *dev, int num_crtc)
577 return -ENOMEM; 605 return -ENOMEM;
578 606
579 drm_crtc_init(dev, &qxl_crtc->base, &qxl_crtc_funcs); 607 drm_crtc_init(dev, &qxl_crtc->base, &qxl_crtc_funcs);
580 608 qxl_crtc->index = crtc_id;
581 drm_mode_crtc_set_gamma_size(&qxl_crtc->base, 256); 609 drm_mode_crtc_set_gamma_size(&qxl_crtc->base, 256);
582 drm_crtc_helper_add(&qxl_crtc->base, &qxl_crtc_helper_funcs); 610 drm_crtc_helper_add(&qxl_crtc->base, &qxl_crtc_helper_funcs);
583 return 0; 611 return 0;
@@ -605,18 +633,13 @@ static void qxl_write_monitors_config_for_encoder(struct qxl_device *qdev,
605 struct drm_encoder *encoder) 633 struct drm_encoder *encoder)
606{ 634{
607 int i; 635 int i;
636 struct qxl_output *output = drm_encoder_to_qxl_output(encoder);
608 struct qxl_head *head; 637 struct qxl_head *head;
609 struct drm_display_mode *mode; 638 struct drm_display_mode *mode;
610 639
611 BUG_ON(!encoder); 640 BUG_ON(!encoder);
612 /* TODO: ugly, do better */ 641 /* TODO: ugly, do better */
613 for (i = 0 ; (encoder->possible_crtcs != (1 << i)) && i < 32; ++i) 642 i = output->index;
614 ;
615 if (encoder->possible_crtcs != (1 << i)) {
616 DRM_ERROR("encoder has wrong possible_crtcs: %x\n",
617 encoder->possible_crtcs);
618 return;
619 }
620 if (!qdev->monitors_config || 643 if (!qdev->monitors_config ||
621 qdev->monitors_config->max_allowed <= i) { 644 qdev->monitors_config->max_allowed <= i) {
622 DRM_ERROR( 645 DRM_ERROR(
@@ -634,7 +657,6 @@ static void qxl_write_monitors_config_for_encoder(struct qxl_device *qdev,
634 DRM_DEBUG("missing for multiple monitors: no head holes\n"); 657 DRM_DEBUG("missing for multiple monitors: no head holes\n");
635 head = &qdev->monitors_config->heads[i]; 658 head = &qdev->monitors_config->heads[i];
636 head->id = i; 659 head->id = i;
637 head->surface_id = 0;
638 if (encoder->crtc->enabled) { 660 if (encoder->crtc->enabled) {
639 mode = &encoder->crtc->mode; 661 mode = &encoder->crtc->mode;
640 head->width = mode->hdisplay; 662 head->width = mode->hdisplay;
@@ -649,8 +671,8 @@ static void qxl_write_monitors_config_for_encoder(struct qxl_device *qdev,
649 head->x = 0; 671 head->x = 0;
650 head->y = 0; 672 head->y = 0;
651 } 673 }
652 DRM_DEBUG("setting head %d to +%d+%d %dx%d\n", 674 DRM_DEBUG_KMS("setting head %d to +%d+%d %dx%d out of %d\n",
653 i, head->x, head->y, head->width, head->height); 675 i, head->x, head->y, head->width, head->height, qdev->monitors_config->count);
654 head->flags = 0; 676 head->flags = 0;
655 /* TODO - somewhere else to call this for multiple monitors 677 /* TODO - somewhere else to call this for multiple monitors
656 * (config_commit?) */ 678 * (config_commit?) */
@@ -745,8 +767,9 @@ static enum drm_connector_status qxl_conn_detect(
745 767
746 /* The first monitor is always connected */ 768 /* The first monitor is always connected */
747 connected = (output->index == 0) || 769 connected = (output->index == 0) ||
748 (qdev->monitors_config && 770 (qdev->client_monitors_config &&
749 qdev->monitors_config->count > output->index); 771 qdev->client_monitors_config->count > output->index &&
772 qxl_head_enabled(&qdev->client_monitors_config->heads[output->index]));
750 773
751 DRM_DEBUG("\n"); 774 DRM_DEBUG("\n");
752 return connected ? connector_status_connected 775 return connected ? connector_status_connected
@@ -854,7 +877,7 @@ int qxl_modeset_init(struct qxl_device *qdev)
854 int i; 877 int i;
855 int ret; 878 int ret;
856 struct drm_gem_object *gobj; 879 struct drm_gem_object *gobj;
857 int max_allowed = QXL_NUM_OUTPUTS; 880 int max_allowed = qxl_num_crtc;
858 int monitors_config_size = sizeof(struct qxl_monitors_config) + 881 int monitors_config_size = sizeof(struct qxl_monitors_config) +
859 max_allowed * sizeof(struct qxl_head); 882 max_allowed * sizeof(struct qxl_head);
860 883
@@ -884,7 +907,7 @@ int qxl_modeset_init(struct qxl_device *qdev)
884 qdev->ddev->mode_config.max_height = 8192; 907 qdev->ddev->mode_config.max_height = 8192;
885 908
886 qdev->ddev->mode_config.fb_base = qdev->vram_base; 909 qdev->ddev->mode_config.fb_base = qdev->vram_base;
887 for (i = 0 ; i < QXL_NUM_OUTPUTS; ++i) { 910 for (i = 0 ; i < qxl_num_crtc; ++i) {
888 qdev_crtc_init(qdev->ddev, i); 911 qdev_crtc_init(qdev->ddev, i);
889 qdev_output_init(qdev->ddev, i); 912 qdev_output_init(qdev->ddev, i);
890 } 913 }
diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
index aa291d8a98a2..00e57b76f4f5 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.c
+++ b/drivers/gpu/drm/qxl/qxl_drv.c
@@ -47,10 +47,14 @@ static DEFINE_PCI_DEVICE_TABLE(pciidlist) = {
47MODULE_DEVICE_TABLE(pci, pciidlist); 47MODULE_DEVICE_TABLE(pci, pciidlist);
48 48
49static int qxl_modeset = -1; 49static int qxl_modeset = -1;
50int qxl_num_crtc = 4;
50 51
51MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); 52MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");
52module_param_named(modeset, qxl_modeset, int, 0400); 53module_param_named(modeset, qxl_modeset, int, 0400);
53 54
55MODULE_PARM_DESC(num_heads, "Number of virtual crtcs to expose (default 4)");
56module_param_named(num_heads, qxl_num_crtc, int, 0400);
57
54static struct drm_driver qxl_driver; 58static struct drm_driver qxl_driver;
55static struct pci_driver qxl_pci_driver; 59static struct pci_driver qxl_pci_driver;
56 60
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index 43d06ab28a21..42ef0e2b5094 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -55,11 +55,10 @@
55#define DRIVER_MINOR 1 55#define DRIVER_MINOR 1
56#define DRIVER_PATCHLEVEL 0 56#define DRIVER_PATCHLEVEL 0
57 57
58#define QXL_NUM_OUTPUTS 1
59
60#define QXL_DEBUGFS_MAX_COMPONENTS 32 58#define QXL_DEBUGFS_MAX_COMPONENTS 32
61 59
62extern int qxl_log_level; 60extern int qxl_log_level;
61extern int qxl_num_crtc;
63 62
64enum { 63enum {
65 QXL_INFO_LEVEL = 1, 64 QXL_INFO_LEVEL = 1,
@@ -139,6 +138,7 @@ struct qxl_reloc_list {
139 138
140struct qxl_crtc { 139struct qxl_crtc {
141 struct drm_crtc base; 140 struct drm_crtc base;
141 int index;
142 int cur_x; 142 int cur_x;
143 int cur_y; 143 int cur_y;
144}; 144};
@@ -156,7 +156,7 @@ struct qxl_framebuffer {
156 156
157#define to_qxl_crtc(x) container_of(x, struct qxl_crtc, base) 157#define to_qxl_crtc(x) container_of(x, struct qxl_crtc, base)
158#define drm_connector_to_qxl_output(x) container_of(x, struct qxl_output, base) 158#define drm_connector_to_qxl_output(x) container_of(x, struct qxl_output, base)
159#define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, base) 159#define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, enc)
160#define to_qxl_framebuffer(x) container_of(x, struct qxl_framebuffer, base) 160#define to_qxl_framebuffer(x) container_of(x, struct qxl_framebuffer, base)
161 161
162struct qxl_mman { 162struct qxl_mman {
@@ -435,7 +435,7 @@ void qxl_update_screen(struct qxl_device *qxl);
435/* qxl io operations (qxl_cmd.c) */ 435/* qxl io operations (qxl_cmd.c) */
436 436
437void qxl_io_create_primary(struct qxl_device *qdev, 437void qxl_io_create_primary(struct qxl_device *qdev,
438 unsigned width, unsigned height, unsigned offset, 438 unsigned offset,
439 struct qxl_bo *bo); 439 struct qxl_bo *bo);
440void qxl_io_destroy_primary(struct qxl_device *qdev); 440void qxl_io_destroy_primary(struct qxl_device *qdev);
441void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id); 441void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id);
diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c
index 4b955b04ce1e..c08e12886d6c 100644
--- a/drivers/gpu/drm/qxl/qxl_fb.c
+++ b/drivers/gpu/drm/qxl/qxl_fb.c
@@ -538,7 +538,7 @@ int qxl_fbdev_init(struct qxl_device *qdev)
538 qfbdev->helper.funcs = &qxl_fb_helper_funcs; 538 qfbdev->helper.funcs = &qxl_fb_helper_funcs;
539 539
540 ret = drm_fb_helper_init(qdev->ddev, &qfbdev->helper, 540 ret = drm_fb_helper_init(qdev->ddev, &qfbdev->helper,
541 1 /* num_crtc - QXL supports just 1 */, 541 qxl_num_crtc /* num_crtc - QXL supports just 1 */,
542 QXLFB_CONN_LIMIT); 542 QXLFB_CONN_LIMIT);
543 if (ret) { 543 if (ret) {
544 kfree(qfbdev); 544 kfree(qfbdev);