upstream rebase
- reorganise the randr/gpu screen patches + backports
This commit is contained in:
		
							parent
							
								
									c2b476eb59
								
							
						
					
					
						commit
						02cbf43d01
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -24,3 +24,4 @@ xorg-server-1.9.1.tar.bz2 | ||||
| /xorg-server-20130109.tar.xz | ||||
| /xorg-server-20130215.tar.xz | ||||
| /xorg-server-1.14.0.tar.bz2 | ||||
| /xorg-server-1.14.1.tar.bz2 | ||||
|  | ||||
| @ -1,69 +0,0 @@ | ||||
| From 8b328d4ee3873bc0a7a34f2cb9d301827244b98c Mon Sep 17 00:00:00 2001 | ||||
| From: Aaron Plattner <aplattner@nvidia.com> | ||||
| Date: Fri, 21 Dec 2012 07:37:33 -0800 | ||||
| Subject: [PATCH 1/2] dix: Make small bitfields that store enums unsigned | ||||
| 
 | ||||
| Commit 31bf81772e146af79b0c456aae2159eba8b0280f changed the clientState field | ||||
| from a signed int to a signed int 2-bit bitfield.  The ClientState enum that is | ||||
| expected to be assigned to this field has four values: ClientStateInitial (0), | ||||
| ClientStateRunning (1), ClientStateRetained (2), and ClientStateGone (3). | ||||
| However, because this bitfield is signed, ClientStateRetained becomes -2 when | ||||
| assigned, and ClientStateGone becomes -1.  This causes warnings: | ||||
| 
 | ||||
|  test.c:54:10: error: case label value exceeds maximum value for type [-Werror] | ||||
|  test.c:55:10: error: case label value exceeds maximum value for type [-Werror] | ||||
| 
 | ||||
| The code here is a switch statement: | ||||
| 
 | ||||
|  53     switch (client->clientState) { | ||||
|  54     case ClientStateGone: | ||||
|  55     case ClientStateRetained: | ||||
|  56         [...] | ||||
|  57         break; | ||||
|  58 | ||||
|  59     default: | ||||
|  60         [...] | ||||
|  61         break; | ||||
|  62     } | ||||
| 
 | ||||
| It also causes bizarre problems like this: | ||||
| 
 | ||||
|  client->clientState = ClientStateGone; | ||||
|  assert(client->clientState == ClientStateGone); // this assert fails | ||||
| 
 | ||||
| Also change the signedness of nearby bitfields to match. | ||||
| 
 | ||||
| Signed-off-by: Aaron Plattner <aplattner@nvidia.com> | ||||
| Reviewed-by: Alex Deucher <alexander.deucher@amd.com> | ||||
| Reviewed-by:  Colin Harrison <colin.harrison at virgin.net> | ||||
| Signed-off-by: Keith Packard <keithp@keithp.com> | ||||
| ---
 | ||||
|  include/dixstruct.h | 12 ++++++------ | ||||
|  1 file changed, 6 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| diff --git a/include/dixstruct.h b/include/dixstruct.h
 | ||||
| index c1236f5..6784819 100644
 | ||||
| --- a/include/dixstruct.h
 | ||||
| +++ b/include/dixstruct.h
 | ||||
| @@ -90,12 +90,12 @@ typedef struct _Client {
 | ||||
|      Mask clientAsMask; | ||||
|      short index; | ||||
|      unsigned char majorOp, minorOp; | ||||
| -    int swapped:1;
 | ||||
| -    int local:1;
 | ||||
| -    int big_requests:1;          /* supports large requests */
 | ||||
| -    int clientGone:1;
 | ||||
| -    int closeDownMode:2;
 | ||||
| -    int clientState:2;
 | ||||
| +    unsigned int swapped:1;
 | ||||
| +    unsigned int local:1;
 | ||||
| +    unsigned int big_requests:1; /* supports large requests */
 | ||||
| +    unsigned int clientGone:1;
 | ||||
| +    unsigned int closeDownMode:2;
 | ||||
| +    unsigned int clientState:2;
 | ||||
|      char smart_priority; | ||||
|      short noClientException;      /* this client died or needs to be killed */ | ||||
|      int priority; | ||||
| -- 
 | ||||
| 1.8.0.2 | ||||
| 
 | ||||
| @ -1,40 +0,0 @@ | ||||
| From 73fc15d94136a87807c1ce69d56fb8a34c09fe4f Mon Sep 17 00:00:00 2001 | ||||
| From: Fedora X Ninjas <x@fedoraproject.org> | ||||
| Date: Tue, 8 Jan 2013 09:41:36 +1000 | ||||
| Subject: [PATCH] dix: allow pixmap dirty helper to be used for non-shared | ||||
|  pixmaps | ||||
| 
 | ||||
| this allows the pixmap dirty helper to be used for reverse optimus | ||||
| ---
 | ||||
|  dix/pixmap.c  | 2 ++ | ||||
|  fb/fbpixmap.c | 1 + | ||||
|  2 files changed, 3 insertions(+) | ||||
| 
 | ||||
| diff --git a/dix/pixmap.c b/dix/pixmap.c
 | ||||
| index 2418812..fe92147 100644
 | ||||
| --- a/dix/pixmap.c
 | ||||
| +++ b/dix/pixmap.c
 | ||||
| @@ -243,6 +243,8 @@ Bool PixmapSyncDirtyHelper(PixmapDirtyUpdatePtr dirty, RegionPtr dirty_region)
 | ||||
|      } | ||||
|   | ||||
|      dst = dirty->slave_dst->master_pixmap; | ||||
| +    if (!dst)
 | ||||
| +        dst = dirty->slave_dst;
 | ||||
|   | ||||
|      RegionTranslate(dirty_region, -dirty->x, -dirty->y); | ||||
|      n = RegionNumRects(dirty_region); | ||||
| diff --git a/fb/fbpixmap.c b/fb/fbpixmap.c
 | ||||
| index fbcdca9..0824b64 100644
 | ||||
| --- a/fb/fbpixmap.c
 | ||||
| +++ b/fb/fbpixmap.c
 | ||||
| @@ -67,6 +67,7 @@ fbCreatePixmapBpp(ScreenPtr pScreen, int width, int height, int depth, int bpp,
 | ||||
|      pPixmap->devKind = paddedWidth; | ||||
|      pPixmap->refcnt = 1; | ||||
|      pPixmap->devPrivate.ptr = (pointer) ((char *) pPixmap + base + adjust); | ||||
| +    pPixmap->master_pixmap = NULL;
 | ||||
|   | ||||
|  #ifdef FB_DEBUG | ||||
|      pPixmap->devPrivate.ptr = | ||||
| -- 
 | ||||
| 1.8.1 | ||||
| 
 | ||||
							
								
								
									
										185
									
								
								0001-gpu-screen-upstream-fixes.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								0001-gpu-screen-upstream-fixes.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,185 @@ | ||||
| From a7bbd0cbf4b7a7331bb441c9c744c148435b5155 Mon Sep 17 00:00:00 2001 | ||||
| From: Dave Airlie <airlied@redhat.com> | ||||
| Date: Wed, 9 Jan 2013 12:51:55 +1000 | ||||
| Subject: [PATCH] gpu screen: upstream fixes | ||||
| 
 | ||||
| dix/gpu: remove asserts for output/offload from same slave | ||||
| xf86crtc: don't use scrn->display for gpu screens | ||||
| dix: allow pixmap dirty helper to be used for non-shared pixmaps | ||||
| gpu: call CreateScreenResources for GPU screens | ||||
| xfree86: don't enable anything in xf86InitialConfiguration for GPU screens | ||||
| 
 | ||||
| Signed-off-by: Dave Airlie <airlied@gmail.com> | ||||
| ---
 | ||||
|  dix/dispatch.c                      |  2 -- | ||||
|  dix/main.c                          |  3 +++ | ||||
|  dix/pixmap.c                        |  2 ++ | ||||
|  fb/fbpixmap.c                       |  1 + | ||||
|  hw/xfree86/common/xf86platformBus.c |  8 ++++++++ | ||||
|  hw/xfree86/modes/xf86Crtc.c         | 34 ++++++++++++++++++++++++---------- | ||||
|  6 files changed, 38 insertions(+), 12 deletions(-) | ||||
| 
 | ||||
| diff --git a/dix/dispatch.c b/dix/dispatch.c
 | ||||
| index 8d61735..90b6c7c 100644
 | ||||
| --- a/dix/dispatch.c
 | ||||
| +++ b/dix/dispatch.c
 | ||||
| @@ -3942,7 +3942,6 @@ void
 | ||||
|  AttachOutputGPU(ScreenPtr pScreen, ScreenPtr new) | ||||
|  { | ||||
|      assert(new->isGPU); | ||||
| -    assert(!new->current_master);
 | ||||
|      xorg_list_add(&new->output_head, &pScreen->output_slave_list); | ||||
|      new->current_master = pScreen; | ||||
|  } | ||||
| @@ -3959,7 +3958,6 @@ void
 | ||||
|  AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr new) | ||||
|  { | ||||
|      assert(new->isGPU); | ||||
| -    assert(!new->current_master);
 | ||||
|      xorg_list_add(&new->offload_head, &pScreen->offload_slave_list); | ||||
|      new->current_master = pScreen; | ||||
|  } | ||||
| diff --git a/dix/main.c b/dix/main.c
 | ||||
| index fb935c9..e558d70 100644
 | ||||
| --- a/dix/main.c
 | ||||
| +++ b/dix/main.c
 | ||||
| @@ -211,6 +211,9 @@ main(int argc, char *argv[], char *envp[])
 | ||||
|              ScreenPtr pScreen = screenInfo.gpuscreens[i]; | ||||
|              if (!CreateScratchPixmapsForScreen(pScreen)) | ||||
|                  FatalError("failed to create scratch pixmaps"); | ||||
| +            if (pScreen->CreateScreenResources &&
 | ||||
| +                !(*pScreen->CreateScreenResources) (pScreen))
 | ||||
| +                FatalError("failed to create screen resources");
 | ||||
|          } | ||||
|   | ||||
|          for (i = 0; i < screenInfo.numScreens; i++) { | ||||
| diff --git a/dix/pixmap.c b/dix/pixmap.c
 | ||||
| index 2418812..fe92147 100644
 | ||||
| --- a/dix/pixmap.c
 | ||||
| +++ b/dix/pixmap.c
 | ||||
| @@ -243,6 +243,8 @@ Bool PixmapSyncDirtyHelper(PixmapDirtyUpdatePtr dirty, RegionPtr dirty_region)
 | ||||
|      } | ||||
|   | ||||
|      dst = dirty->slave_dst->master_pixmap; | ||||
| +    if (!dst)
 | ||||
| +        dst = dirty->slave_dst;
 | ||||
|   | ||||
|      RegionTranslate(dirty_region, -dirty->x, -dirty->y); | ||||
|      n = RegionNumRects(dirty_region); | ||||
| diff --git a/fb/fbpixmap.c b/fb/fbpixmap.c
 | ||||
| index fbcdca9..0824b64 100644
 | ||||
| --- a/fb/fbpixmap.c
 | ||||
| +++ b/fb/fbpixmap.c
 | ||||
| @@ -67,6 +67,7 @@ fbCreatePixmapBpp(ScreenPtr pScreen, int width, int height, int depth, int bpp,
 | ||||
|      pPixmap->devKind = paddedWidth; | ||||
|      pPixmap->refcnt = 1; | ||||
|      pPixmap->devPrivate.ptr = (pointer) ((char *) pPixmap + base + adjust); | ||||
| +    pPixmap->master_pixmap = NULL;
 | ||||
|   | ||||
|  #ifdef FB_DEBUG | ||||
|      pPixmap->devPrivate.ptr = | ||||
| diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
 | ||||
| index bcb65ff..e368dee 100644
 | ||||
| --- a/hw/xfree86/common/xf86platformBus.c
 | ||||
| +++ b/hw/xfree86/common/xf86platformBus.c
 | ||||
| @@ -455,6 +455,14 @@ xf86platformAddDevice(int index)
 | ||||
|   | ||||
|     CreateScratchPixmapsForScreen(xf86GPUScreens[i]->pScreen); | ||||
|   | ||||
| +   if (xf86GPUScreens[i]->pScreen->CreateScreenResources &&
 | ||||
| +       !(*xf86GPUScreens[i]->pScreen->CreateScreenResources) (xf86GPUScreens[i]->pScreen)) {
 | ||||
| +       RemoveGPUScreen(xf86GPUScreens[i]->pScreen);
 | ||||
| +       xf86DeleteScreen(xf86GPUScreens[i]);
 | ||||
| +       xf86UnclaimPlatformSlot(&xf86_platform_devices[index], NULL);
 | ||||
| +       xf86NumGPUScreens = old_screens;
 | ||||
| +       return -1;
 | ||||
| +   }
 | ||||
|     /* attach unbound to 0 protocol screen */ | ||||
|     AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen); | ||||
|   | ||||
| diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
 | ||||
| index 7d55f60..989595f 100644
 | ||||
| --- a/hw/xfree86/modes/xf86Crtc.c
 | ||||
| +++ b/hw/xfree86/modes/xf86Crtc.c
 | ||||
| @@ -1908,6 +1908,14 @@ xf86CollectEnabledOutputs(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
 | ||||
|      Bool any_enabled = FALSE; | ||||
|      int o; | ||||
|   | ||||
| +    /*
 | ||||
| +     * Don't bother enabling outputs on GPU screens: a client needs to attach
 | ||||
| +     * it to a source provider before setting a mode that scans out a shared
 | ||||
| +     * pixmap.
 | ||||
| +     */
 | ||||
| +    if (scrn->is_gpu)
 | ||||
| +        return FALSE;
 | ||||
| +
 | ||||
|      for (o = 0; o < config->num_output; o++) | ||||
|          any_enabled |= enabled[o] = xf86OutputEnabled(config->output[o], TRUE); | ||||
|   | ||||
| @@ -2360,11 +2368,11 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow)
 | ||||
|      config->debug_modes = xf86ReturnOptValBool(config->options, | ||||
|                                                 OPTION_MODEDEBUG, FALSE); | ||||
|   | ||||
| -    if (scrn->display->virtualX)
 | ||||
| +    if (scrn->display->virtualX && !scrn->is_gpu)
 | ||||
|          width = scrn->display->virtualX; | ||||
|      else | ||||
|          width = config->maxWidth; | ||||
| -    if (scrn->display->virtualY)
 | ||||
| +    if (scrn->display->virtualY && !scrn->is_gpu)
 | ||||
|          height = scrn->display->virtualY; | ||||
|      else | ||||
|          height = config->maxHeight; | ||||
| @@ -2377,9 +2385,11 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow)
 | ||||
|   | ||||
|      ret = xf86CollectEnabledOutputs(scrn, config, enabled); | ||||
|      if (ret == FALSE && canGrow) { | ||||
| -        xf86DrvMsg(i, X_WARNING,
 | ||||
| -                   "Unable to find connected outputs - setting %dx%d initial framebuffer\n",
 | ||||
| -                   NO_OUTPUT_DEFAULT_WIDTH, NO_OUTPUT_DEFAULT_HEIGHT);
 | ||||
| +        if (!scrn->is_gpu)
 | ||||
| +            xf86DrvMsg(i, X_WARNING,
 | ||||
| +		       "Unable to find connected outputs - setting %dx%d "
 | ||||
| +                       "initial framebuffer\n",
 | ||||
| +                       NO_OUTPUT_DEFAULT_WIDTH, NO_OUTPUT_DEFAULT_HEIGHT);
 | ||||
|          have_outputs = FALSE; | ||||
|      } | ||||
|      else { | ||||
| @@ -2428,8 +2438,10 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow)
 | ||||
|   | ||||
|      /* XXX override xf86 common frame computation code */ | ||||
|   | ||||
| -    scrn->display->frameX0 = 0;
 | ||||
| -    scrn->display->frameY0 = 0;
 | ||||
| +    if (!scrn->is_gpu) {
 | ||||
| +        scrn->display->frameX0 = 0;
 | ||||
| +        scrn->display->frameY0 = 0;
 | ||||
| +    }
 | ||||
|   | ||||
|      for (c = 0; c < config->num_crtc; c++) { | ||||
|          xf86CrtcPtr crtc = config->crtc[c]; | ||||
| @@ -2477,7 +2489,7 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow)
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
| -    if (scrn->display->virtualX == 0) {
 | ||||
| +    if (scrn->display->virtualX == 0 || scrn->is_gpu) {
 | ||||
|          /* | ||||
|           * Expand virtual size to cover the current config and potential mode | ||||
|           * switches, if the driver can't enlarge the screen later. | ||||
| @@ -2492,8 +2504,10 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow)
 | ||||
|              } | ||||
|          } | ||||
|   | ||||
| -        scrn->display->virtualX = width;
 | ||||
| -        scrn->display->virtualY = height;
 | ||||
| +	if (!scrn->is_gpu) {
 | ||||
| +            scrn->display->virtualX = width;
 | ||||
| +            scrn->display->virtualY = height;
 | ||||
| +	}
 | ||||
|      } | ||||
|   | ||||
|      if (width > scrn->virtualX) | ||||
| -- 
 | ||||
| 1.8.2 | ||||
| 
 | ||||
| @ -0,0 +1,60 @@ | ||||
| From c760fb0154848d47438908ba8b3da2fffc68a460 Mon Sep 17 00:00:00 2001 | ||||
| From: Chris Wilson <chris@chris-wilson.co.uk> | ||||
| Date: Thu, 10 Jan 2013 03:26:33 +0000 | ||||
| Subject: [PATCH] hw/xfree86: Only report SetDesiredModes() failed if at least | ||||
|  one modeset fails | ||||
| 
 | ||||
| commit 6703a7c7cf1a349c137e247a0c8eb462ff7b07be | ||||
| Author: Keith Packard <keithp@keithp.com> | ||||
| Date:   Tue Jan 8 20:24:32 2013 -0800 | ||||
| 
 | ||||
|     hw/xfree86: Require only one working CRTC to start the server. | ||||
| 
 | ||||
| changed the logic to try to set the mode on all connected outputs rather | ||||
| than abort upon the first failure. The return error code was then | ||||
| tweaked such that it reported success if it set a mode on any crtc. | ||||
| However, this confuses the headless case where we never enable any crtcs | ||||
| and also, importantly, never fail to set a crtc. | ||||
| 
 | ||||
| Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=59190 | ||||
| 
 | ||||
| Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> | ||||
| Also-written-by: Maarten Lankhorst <maarten.lankhorst@canonical.com> | ||||
| Reviewed-by: Keith Packard <keithp@keithp.com> | ||||
| Signed-off-by: Keith Packard <keithp@keithp.com> | ||||
| (cherry picked from commit 451ba4bd41b82acd4aec6236ba121e00cfeb311b) | ||||
| ---
 | ||||
|  hw/xfree86/modes/xf86Crtc.c | 5 +++-- | ||||
|  1 file changed, 3 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
 | ||||
| index f9ae465..7d55f60 100644
 | ||||
| --- a/hw/xfree86/modes/xf86Crtc.c
 | ||||
| +++ b/hw/xfree86/modes/xf86Crtc.c
 | ||||
| @@ -2598,8 +2598,8 @@ xf86SetDesiredModes(ScrnInfoPtr scrn)
 | ||||
|  { | ||||
|      xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); | ||||
|      xf86CrtcPtr crtc = config->crtc[0]; | ||||
| +    int enabled = 0, failed = 0;
 | ||||
|      int c; | ||||
| -    int enabled = 0;
 | ||||
|   | ||||
|      /* A driver with this hook will take care of this */ | ||||
|      if (!crtc->funcs->set_mode_major) { | ||||
| @@ -2659,11 +2659,12 @@ xf86SetDesiredModes(ScrnInfoPtr scrn)
 | ||||
|                  if (config->output[o]->crtc == crtc) | ||||
|                      config->output[o]->crtc = NULL; | ||||
|              crtc->enabled = FALSE; | ||||
| +            ++failed;
 | ||||
|  	} | ||||
|      } | ||||
|   | ||||
|      xf86DisableUnusedFunctions(scrn); | ||||
| -    return enabled != 0;
 | ||||
| +    return enabled != 0 || failed == 0;
 | ||||
|  } | ||||
|   | ||||
|  /** | ||||
| -- 
 | ||||
| 1.8.2 | ||||
| 
 | ||||
| @ -1,110 +0,0 @@ | ||||
| From 42ca69172c897713295f7c2b471f0e5d072c920b Mon Sep 17 00:00:00 2001 | ||||
| From: Dave Airlie <airlied@redhat.com> | ||||
| Date: Wed, 9 Jan 2013 14:32:47 +1000 | ||||
| Subject: [PATCH] randr: don't directly set changed bits in randr screen | ||||
| 
 | ||||
| Introduce a wrapper interface so we can fix things up for multi-gpu | ||||
| situations later. | ||||
| 
 | ||||
| This just introduces the API for now. | ||||
| 
 | ||||
| Signed-off-by: Dave Airlie <airlied@redhat.com> | ||||
| Signed-off-by: Fedora X Ninjas <x@fedoraproject.org> | ||||
| ---
 | ||||
|  randr/randr.c    | 8 ++++++++ | ||||
|  randr/randrstr.h | 4 ++++ | ||||
|  randr/rrcrtc.c   | 2 +- | ||||
|  randr/rrinfo.c   | 2 +- | ||||
|  randr/rroutput.c | 2 +- | ||||
|  randr/rrscreen.c | 2 +- | ||||
|  6 files changed, 16 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| diff --git a/randr/randr.c b/randr/randr.c
 | ||||
| index f0decfc..11f88b2 100644
 | ||||
| --- a/randr/randr.c
 | ||||
| +++ b/randr/randr.c
 | ||||
| @@ -464,6 +464,14 @@ TellChanged(WindowPtr pWin, pointer value)
 | ||||
|      return WT_WALKCHILDREN; | ||||
|  } | ||||
|   | ||||
| +void
 | ||||
| +RRSetChanged(ScreenPtr pScreen)
 | ||||
| +{
 | ||||
| +    rrScrPriv(pScreen);
 | ||||
| +
 | ||||
| +    pScrPriv->changed = TRUE;
 | ||||
| +}
 | ||||
| +
 | ||||
|  /* | ||||
|   * Something changed; send events and adjust pointer position | ||||
|   */ | ||||
| diff --git a/randr/randrstr.h b/randr/randrstr.h
 | ||||
| index 2517479..2babfed 100644
 | ||||
| --- a/randr/randrstr.h
 | ||||
| +++ b/randr/randrstr.h
 | ||||
| @@ -486,6 +486,10 @@ extern _X_EXPORT void
 | ||||
|   RRDeliverScreenEvent(ClientPtr client, WindowPtr pWin, ScreenPtr pScreen); | ||||
|   | ||||
|  /* randr.c */ | ||||
| +/* set a screen change on the primary screen */
 | ||||
| +extern _X_EXPORT void
 | ||||
| +RRSetChanged(ScreenPtr pScreen);
 | ||||
| +
 | ||||
|  /* | ||||
|   * Send all pending events | ||||
|   */ | ||||
| diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
 | ||||
| index 6e2eca5..b3fb5bd 100644
 | ||||
| --- a/randr/rrcrtc.c
 | ||||
| +++ b/randr/rrcrtc.c
 | ||||
| @@ -39,7 +39,7 @@ RRCrtcChanged(RRCrtcPtr crtc, Bool layoutChanged)
 | ||||
|      if (pScreen) { | ||||
|          rrScrPriv(pScreen); | ||||
|   | ||||
| -        pScrPriv->changed = TRUE;
 | ||||
| +        RRSetChanged(pScreen);
 | ||||
|          /* | ||||
|           * Send ConfigureNotify on any layout change | ||||
|           */ | ||||
| diff --git a/randr/rrinfo.c b/randr/rrinfo.c
 | ||||
| index 1408d6f..fc57bd4 100644
 | ||||
| --- a/randr/rrinfo.c
 | ||||
| +++ b/randr/rrinfo.c
 | ||||
| @@ -225,7 +225,7 @@ RRScreenSetSizeRange(ScreenPtr pScreen,
 | ||||
|      pScrPriv->minHeight = minHeight; | ||||
|      pScrPriv->maxWidth = maxWidth; | ||||
|      pScrPriv->maxHeight = maxHeight; | ||||
| -    pScrPriv->changed = TRUE;
 | ||||
| +    RRSetChanged(pScreen);
 | ||||
|      pScrPriv->configChanged = TRUE; | ||||
|  } | ||||
|   | ||||
| diff --git a/randr/rroutput.c b/randr/rroutput.c
 | ||||
| index 88781ba..922d61f 100644
 | ||||
| --- a/randr/rroutput.c
 | ||||
| +++ b/randr/rroutput.c
 | ||||
| @@ -36,7 +36,7 @@ RROutputChanged(RROutputPtr output, Bool configChanged)
 | ||||
|      output->changed = TRUE; | ||||
|      if (pScreen) { | ||||
|          rrScrPriv(pScreen); | ||||
| -        pScrPriv->changed = TRUE;
 | ||||
| +        RRSetChanged(pScreen);
 | ||||
|          if (configChanged) | ||||
|              pScrPriv->configChanged = TRUE; | ||||
|      } | ||||
| diff --git a/randr/rrscreen.c b/randr/rrscreen.c
 | ||||
| index 39340cc..36179ae 100644
 | ||||
| --- a/randr/rrscreen.c
 | ||||
| +++ b/randr/rrscreen.c
 | ||||
| @@ -143,7 +143,7 @@ RRScreenSizeNotify(ScreenPtr pScreen)
 | ||||
|      pScrPriv->height = pScreen->height; | ||||
|      pScrPriv->mmWidth = pScreen->mmWidth; | ||||
|      pScrPriv->mmHeight = pScreen->mmHeight; | ||||
| -    pScrPriv->changed = TRUE;
 | ||||
| +    RRSetChanged(pScreen);
 | ||||
|  /*    pScrPriv->sizeChanged = TRUE; */ | ||||
|   | ||||
|      RRTellChanged(pScreen); | ||||
| -- 
 | ||||
| 1.8.1.4 | ||||
| 
 | ||||
| @ -1,47 +0,0 @@ | ||||
| From 48ea188cac83f2c03913457e1049cc30c27cd395 Mon Sep 17 00:00:00 2001 | ||||
| From: Dave Airlie <airlied@redhat.com> | ||||
| Date: Wed, 9 Jan 2013 14:32:48 +1000 | ||||
| Subject: [PATCH] randr: make SetChanged modify the main protocol screen not | ||||
|  the gpu screen | ||||
| 
 | ||||
| When SetChanged is called we now modify the main protocol screen, | ||||
| not the the gpu screen. Since changed stuff should work at the protocol level. | ||||
| 
 | ||||
| Signed-off-by: Dave Airlie <airlied@redhat.com> | ||||
| Signed-off-by: Fedora X Ninjas <x@fedoraproject.org> | ||||
| ---
 | ||||
|  randr/randr.c | 16 +++++++++++++++- | ||||
|  1 file changed, 15 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/randr/randr.c b/randr/randr.c
 | ||||
| index 11f88b2..fb0895d 100644
 | ||||
| --- a/randr/randr.c
 | ||||
| +++ b/randr/randr.c
 | ||||
| @@ -467,9 +467,23 @@ TellChanged(WindowPtr pWin, pointer value)
 | ||||
|  void | ||||
|  RRSetChanged(ScreenPtr pScreen) | ||||
|  { | ||||
| +    /* set changed bits on the master screen only */
 | ||||
| +    ScreenPtr master;
 | ||||
|      rrScrPriv(pScreen); | ||||
| +    rrScrPrivPtr mastersp;
 | ||||
| +
 | ||||
| +    if (pScreen->isGPU) {
 | ||||
| +        master = pScreen->current_master;
 | ||||
| +        if (!master)
 | ||||
| +            return;
 | ||||
| +        mastersp = rrGetScrPriv(master);
 | ||||
| +    }
 | ||||
| +    else {
 | ||||
| +        master = pScreen;
 | ||||
| +        mastersp = pScrPriv;
 | ||||
| +    }
 | ||||
|   | ||||
| -    pScrPriv->changed = TRUE;
 | ||||
| +    mastersp->changed = TRUE;
 | ||||
|  } | ||||
|   | ||||
|  /* | ||||
| -- 
 | ||||
| 1.8.1.4 | ||||
| 
 | ||||
| @ -1,31 +0,0 @@ | ||||
| From 2d05af5ee4844354810cdfcc76eda255a9f6beec Mon Sep 17 00:00:00 2001 | ||||
| From: Dave Airlie <airlied@redhat.com> | ||||
| Date: Wed, 9 Jan 2013 14:32:49 +1000 | ||||
| Subject: [PATCH] randr: only respected changed on the protocol screen | ||||
| 
 | ||||
| We don't want to know about changes on the non-protocol screen, | ||||
| we will fix up setchanged to make sure non-protocol screens update | ||||
| the protocol screens when they have a change. | ||||
| 
 | ||||
| Signed-off-by: Dave Airlie <airlied@redhat.com> | ||||
| Signed-off-by: Fedora X Ninjas <x@fedoraproject.org> | ||||
| ---
 | ||||
|  randr/randr.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/randr/randr.c b/randr/randr.c
 | ||||
| index fb0895d..cb6fce7 100644
 | ||||
| --- a/randr/randr.c
 | ||||
| +++ b/randr/randr.c
 | ||||
| @@ -506,7 +506,7 @@ RRTellChanged(ScreenPtr pScreen)
 | ||||
|          mastersp = pScrPriv; | ||||
|      } | ||||
|   | ||||
| -    if (pScrPriv->changed) {
 | ||||
| +    if (mastersp->changed) {
 | ||||
|          UpdateCurrentTimeIf(); | ||||
|          if (mastersp->configChanged) { | ||||
|              mastersp->lastConfigTime = currentTime; | ||||
| -- 
 | ||||
| 1.8.1.4 | ||||
| 
 | ||||
| @ -1,71 +0,0 @@ | ||||
| From 3adc5f9a82ea9aeb2fa5eb2337fb9dd0502082df Mon Sep 17 00:00:00 2001 | ||||
| From: Dave Airlie <airlied@redhat.com> | ||||
| Date: Wed, 9 Jan 2013 14:32:50 +1000 | ||||
| Subject: [PATCH] randr: report changes when we disconnect a GPU slave | ||||
| 
 | ||||
| When we disconnect an output/offload slave set the changed bits, | ||||
| so a later TellChanged can do something. | ||||
| 
 | ||||
| Then when we remove a GPU slave device, sent change notification | ||||
| to the protocol screen. | ||||
| 
 | ||||
| This allows hot unplugged USB devices to disappear in clients. | ||||
| 
 | ||||
| Signed-off-by: Dave Airlie <airlied@redhat.com> | ||||
| Signed-off-by: Fedora X Ninjas <x@fedoraproject.org> | ||||
| ---
 | ||||
|  hw/xfree86/common/xf86platformBus.c | 3 ++- | ||||
|  hw/xfree86/modes/xf86RandR12.c      | 9 +++++++-- | ||||
|  2 files changed, 9 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
 | ||||
| index 2b02e79..4ccb005 100644
 | ||||
| --- a/hw/xfree86/common/xf86platformBus.c
 | ||||
| +++ b/hw/xfree86/common/xf86platformBus.c
 | ||||
| @@ -47,6 +47,7 @@
 | ||||
|  #include "Pci.h" | ||||
|  #include "xf86platformBus.h" | ||||
|   | ||||
| +#include "randrstr.h"
 | ||||
|  int platformSlotClaimed; | ||||
|   | ||||
|  int xf86_num_platform_devices; | ||||
| @@ -497,7 +498,7 @@ xf86platformRemoveDevice(int index)
 | ||||
|      xf86UnclaimPlatformSlot(&xf86_platform_devices[index], NULL); | ||||
|   | ||||
|      xf86_remove_platform_device(index); | ||||
| -
 | ||||
| +    RRTellChanged(xf86Screens[0]->pScreen);
 | ||||
|   out: | ||||
|      return; | ||||
|  } | ||||
| diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
 | ||||
| index 01fc9c5..f259730 100644
 | ||||
| --- a/hw/xfree86/modes/xf86RandR12.c
 | ||||
| +++ b/hw/xfree86/modes/xf86RandR12.c
 | ||||
| @@ -1892,15 +1892,20 @@ xf86RandR14ProviderDestroy(ScreenPtr screen, RRProviderPtr provider)
 | ||||
|      xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); | ||||
|       | ||||
|      if (config->randr_provider == provider) { | ||||
| +        Bool detached = FALSE;
 | ||||
|          if (config->randr_provider->offload_sink) { | ||||
|              DetachOffloadGPU(screen); | ||||
|              config->randr_provider->offload_sink = NULL; | ||||
| +            RRSetChanged(screen);
 | ||||
| +            detached = TRUE;
 | ||||
|          } | ||||
| -        else if (config->randr_provider->output_source) {
 | ||||
| +        if (config->randr_provider->output_source) {
 | ||||
|              DetachOutputGPU(screen); | ||||
|              config->randr_provider->output_source = NULL; | ||||
| +            RRSetChanged(screen);
 | ||||
| +            detached = TRUE;
 | ||||
|          } | ||||
| -        else if (screen->current_master)
 | ||||
| +        if (!detached && screen->current_master)
 | ||||
|              DetachUnboundGPU(screen); | ||||
|      } | ||||
|      config->randr_provider = NULL; | ||||
| -- 
 | ||||
| 1.8.2 | ||||
| 
 | ||||
							
								
								
									
										167
									
								
								0001-randr-upstream-set-changed-fixes.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								0001-randr-upstream-set-changed-fixes.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,167 @@ | ||||
| From ce3de2dcb1b3bd99a693c828278a416c245acc37 Mon Sep 17 00:00:00 2001 | ||||
| From: Dave Airlie <airlied@redhat.com> | ||||
| Date: Wed, 9 Jan 2013 14:23:57 +1000 | ||||
| Subject: [PATCH] randr upstream set changed fixes | ||||
| 
 | ||||
| Signed-off-by: Dave Airlie <airlied@redhat.com> | ||||
| ---
 | ||||
|  hw/xfree86/common/xf86platformBus.c |  3 ++- | ||||
|  hw/xfree86/modes/xf86RandR12.c      |  2 ++ | ||||
|  randr/randr.c                       | 24 +++++++++++++++++++++++- | ||||
|  randr/randrstr.h                    |  4 ++++ | ||||
|  randr/rrcrtc.c                      |  2 +- | ||||
|  randr/rrinfo.c                      |  2 +- | ||||
|  randr/rroutput.c                    |  2 +- | ||||
|  randr/rrscreen.c                    |  2 +- | ||||
|  8 files changed, 35 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
 | ||||
| index 9034dad..bcb65ff 100644
 | ||||
| --- a/hw/xfree86/common/xf86platformBus.c
 | ||||
| +++ b/hw/xfree86/common/xf86platformBus.c
 | ||||
| @@ -47,6 +47,7 @@
 | ||||
|  #include "Pci.h" | ||||
|  #include "xf86platformBus.h" | ||||
|   | ||||
| +#include "randrstr.h"
 | ||||
|  int platformSlotClaimed; | ||||
|   | ||||
|  int xf86_num_platform_devices; | ||||
| @@ -499,7 +500,7 @@ xf86platformRemoveDevice(int index)
 | ||||
|      xf86UnclaimPlatformSlot(&xf86_platform_devices[index], NULL); | ||||
|   | ||||
|      xf86_remove_platform_device(index); | ||||
| -
 | ||||
| +    RRTellChanged(xf86Screens[0]->pScreen);
 | ||||
|   out: | ||||
|      return; | ||||
|  } | ||||
| diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
 | ||||
| index 01fc9c5..7f570cf 100644
 | ||||
| --- a/hw/xfree86/modes/xf86RandR12.c
 | ||||
| +++ b/hw/xfree86/modes/xf86RandR12.c
 | ||||
| @@ -1895,10 +1895,12 @@ xf86RandR14ProviderDestroy(ScreenPtr screen, RRProviderPtr provider)
 | ||||
|          if (config->randr_provider->offload_sink) { | ||||
|              DetachOffloadGPU(screen); | ||||
|              config->randr_provider->offload_sink = NULL; | ||||
| +            RRSetChanged(screen);
 | ||||
|          } | ||||
|          else if (config->randr_provider->output_source) { | ||||
|              DetachOutputGPU(screen); | ||||
|              config->randr_provider->output_source = NULL; | ||||
| +            RRSetChanged(screen);
 | ||||
|          } | ||||
|          else if (screen->current_master) | ||||
|              DetachUnboundGPU(screen); | ||||
| diff --git a/randr/randr.c b/randr/randr.c
 | ||||
| index f0decfc..cb6fce7 100644
 | ||||
| --- a/randr/randr.c
 | ||||
| +++ b/randr/randr.c
 | ||||
| @@ -464,6 +464,28 @@ TellChanged(WindowPtr pWin, pointer value)
 | ||||
|      return WT_WALKCHILDREN; | ||||
|  } | ||||
|   | ||||
| +void
 | ||||
| +RRSetChanged(ScreenPtr pScreen)
 | ||||
| +{
 | ||||
| +    /* set changed bits on the master screen only */
 | ||||
| +    ScreenPtr master;
 | ||||
| +    rrScrPriv(pScreen);
 | ||||
| +    rrScrPrivPtr mastersp;
 | ||||
| +
 | ||||
| +    if (pScreen->isGPU) {
 | ||||
| +        master = pScreen->current_master;
 | ||||
| +        if (!master)
 | ||||
| +            return;
 | ||||
| +        mastersp = rrGetScrPriv(master);
 | ||||
| +    }
 | ||||
| +    else {
 | ||||
| +        master = pScreen;
 | ||||
| +        mastersp = pScrPriv;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    mastersp->changed = TRUE;
 | ||||
| +}
 | ||||
| +
 | ||||
|  /* | ||||
|   * Something changed; send events and adjust pointer position | ||||
|   */ | ||||
| @@ -484,7 +506,7 @@ RRTellChanged(ScreenPtr pScreen)
 | ||||
|          mastersp = pScrPriv; | ||||
|      } | ||||
|   | ||||
| -    if (pScrPriv->changed) {
 | ||||
| +    if (mastersp->changed) {
 | ||||
|          UpdateCurrentTimeIf(); | ||||
|          if (mastersp->configChanged) { | ||||
|              mastersp->lastConfigTime = currentTime; | ||||
| diff --git a/randr/randrstr.h b/randr/randrstr.h
 | ||||
| index 2517479..2babfed 100644
 | ||||
| --- a/randr/randrstr.h
 | ||||
| +++ b/randr/randrstr.h
 | ||||
| @@ -486,6 +486,10 @@ extern _X_EXPORT void
 | ||||
|   RRDeliverScreenEvent(ClientPtr client, WindowPtr pWin, ScreenPtr pScreen); | ||||
|   | ||||
|  /* randr.c */ | ||||
| +/* set a screen change on the primary screen */
 | ||||
| +extern _X_EXPORT void
 | ||||
| +RRSetChanged(ScreenPtr pScreen);
 | ||||
| +
 | ||||
|  /* | ||||
|   * Send all pending events | ||||
|   */ | ||||
| diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
 | ||||
| index 6e2eca5..b3fb5bd 100644
 | ||||
| --- a/randr/rrcrtc.c
 | ||||
| +++ b/randr/rrcrtc.c
 | ||||
| @@ -39,7 +39,7 @@ RRCrtcChanged(RRCrtcPtr crtc, Bool layoutChanged)
 | ||||
|      if (pScreen) { | ||||
|          rrScrPriv(pScreen); | ||||
|   | ||||
| -        pScrPriv->changed = TRUE;
 | ||||
| +        RRSetChanged(pScreen);
 | ||||
|          /* | ||||
|           * Send ConfigureNotify on any layout change | ||||
|           */ | ||||
| diff --git a/randr/rrinfo.c b/randr/rrinfo.c
 | ||||
| index 1408d6f..fc57bd4 100644
 | ||||
| --- a/randr/rrinfo.c
 | ||||
| +++ b/randr/rrinfo.c
 | ||||
| @@ -225,7 +225,7 @@ RRScreenSetSizeRange(ScreenPtr pScreen,
 | ||||
|      pScrPriv->minHeight = minHeight; | ||||
|      pScrPriv->maxWidth = maxWidth; | ||||
|      pScrPriv->maxHeight = maxHeight; | ||||
| -    pScrPriv->changed = TRUE;
 | ||||
| +    RRSetChanged(pScreen);
 | ||||
|      pScrPriv->configChanged = TRUE; | ||||
|  } | ||||
|   | ||||
| diff --git a/randr/rroutput.c b/randr/rroutput.c
 | ||||
| index 88781ba..922d61f 100644
 | ||||
| --- a/randr/rroutput.c
 | ||||
| +++ b/randr/rroutput.c
 | ||||
| @@ -36,7 +36,7 @@ RROutputChanged(RROutputPtr output, Bool configChanged)
 | ||||
|      output->changed = TRUE; | ||||
|      if (pScreen) { | ||||
|          rrScrPriv(pScreen); | ||||
| -        pScrPriv->changed = TRUE;
 | ||||
| +        RRSetChanged(pScreen);
 | ||||
|          if (configChanged) | ||||
|              pScrPriv->configChanged = TRUE; | ||||
|      } | ||||
| diff --git a/randr/rrscreen.c b/randr/rrscreen.c
 | ||||
| index 39340cc..36179ae 100644
 | ||||
| --- a/randr/rrscreen.c
 | ||||
| +++ b/randr/rrscreen.c
 | ||||
| @@ -143,7 +143,7 @@ RRScreenSizeNotify(ScreenPtr pScreen)
 | ||||
|      pScrPriv->height = pScreen->height; | ||||
|      pScrPriv->mmWidth = pScreen->mmWidth; | ||||
|      pScrPriv->mmHeight = pScreen->mmHeight; | ||||
| -    pScrPriv->changed = TRUE;
 | ||||
| +    RRSetChanged(pScreen);
 | ||||
|  /*    pScrPriv->sizeChanged = TRUE; */ | ||||
|   | ||||
|      RRTellChanged(pScreen); | ||||
| -- 
 | ||||
| 1.8.2 | ||||
| 
 | ||||
| @ -1,37 +0,0 @@ | ||||
| From 8647ee8f422e1ea9212d84ae14ef2163793bcdc8 Mon Sep 17 00:00:00 2001 | ||||
| From: Dave Airlie <airlied@gmail.com> | ||||
| Date: Wed, 10 Apr 2013 16:09:01 +1000 | ||||
| Subject: [PATCH] xf86: fix flush input to work with Linux evdev devices. | ||||
| 
 | ||||
| So when we VT switch back and attempt to flush the input devices, | ||||
| we don't succeed because evdev won't return part of an event, | ||||
| since we were only asking for 4 bytes, we'd only get -EINVAL back. | ||||
| 
 | ||||
| This could later cause events to be flushed that we shouldn't have | ||||
| gotten. | ||||
| 
 | ||||
| This is a fix for CVE-2013-1940. | ||||
| 
 | ||||
| Signed-off-by: Dave Airlie <airlied@redhat.com> | ||||
| Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> | ||||
| Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> | ||||
| ---
 | ||||
|  hw/xfree86/os-support/shared/posix_tty.c | 3 ++- | ||||
|  1 file changed, 2 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/hw/xfree86/os-support/shared/posix_tty.c b/hw/xfree86/os-support/shared/posix_tty.c
 | ||||
| index ab3757a..4d08c1e 100644
 | ||||
| --- a/hw/xfree86/os-support/shared/posix_tty.c
 | ||||
| +++ b/hw/xfree86/os-support/shared/posix_tty.c
 | ||||
| @@ -421,7 +421,8 @@ xf86FlushInput(int fd)
 | ||||
|  { | ||||
|      fd_set fds; | ||||
|      struct timeval timeout; | ||||
| -    char c[4];
 | ||||
| +    /* this needs to be big enough to flush an evdev event. */
 | ||||
| +    char c[256];
 | ||||
| 
 | ||||
|      DebugF("FlushingSerial\n"); | ||||
|      if (tcflush(fd, TCIFLUSH) == 0) | ||||
| --
 | ||||
| 1.8.1.4 | ||||
| @ -1,65 +0,0 @@ | ||||
| From 2bd6a8491ad3dbd42db66be7ae48f4b6e9c698f2 Mon Sep 17 00:00:00 2001 | ||||
| From: Fedora X Ninjas <x@fedoraproject.org> | ||||
| Date: Wed, 12 Dec 2012 14:02:54 +1000 | ||||
| Subject: [PATCH] xf86crtc: don't use display for vx/vy for gpu screens | ||||
| 
 | ||||
| ---
 | ||||
|  hw/xfree86/modes/xf86Crtc.c | 18 +++++++++++------- | ||||
|  1 file changed, 11 insertions(+), 7 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
 | ||||
| index 6975d2f..2828ee0 100644
 | ||||
| --- a/hw/xfree86/modes/xf86Crtc.c
 | ||||
| +++ b/hw/xfree86/modes/xf86Crtc.c
 | ||||
| @@ -2425,11 +2425,11 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow)
 | ||||
|      config->debug_modes = xf86ReturnOptValBool(config->options, | ||||
|                                                 OPTION_MODEDEBUG, FALSE); | ||||
|   | ||||
| -    if (scrn->display->virtualX)
 | ||||
| +    if (scrn->display->virtualX && !scrn->is_gpu)
 | ||||
|          width = scrn->display->virtualX; | ||||
|      else | ||||
|          width = config->maxWidth; | ||||
| -    if (scrn->display->virtualY)
 | ||||
| +    if (scrn->display->virtualY && !scrn->is_gpu)
 | ||||
|          height = scrn->display->virtualY; | ||||
|      else | ||||
|          height = config->maxHeight; | ||||
| @@ -2497,8 +2497,10 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow)
 | ||||
|   | ||||
|      /* XXX override xf86 common frame computation code */ | ||||
|   | ||||
| -    scrn->display->frameX0 = 0;
 | ||||
| -    scrn->display->frameY0 = 0;
 | ||||
| +    if (!scrn->is_gpu) {
 | ||||
| +        scrn->display->frameX0 = 0;
 | ||||
| +        scrn->display->frameY0 = 0;
 | ||||
| +    }
 | ||||
|   | ||||
|      for (c = 0; c < config->num_crtc; c++) { | ||||
|          xf86CrtcPtr crtc = config->crtc[c]; | ||||
| @@ -2546,7 +2548,7 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow)
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
| -    if (scrn->display->virtualX == 0) {
 | ||||
| +    if (scrn->display->virtualX == 0 || scrn->is_gpu) {
 | ||||
|          /* | ||||
|           * Expand virtual size to cover the current config and potential mode | ||||
|           * switches, if the driver can't enlarge the screen later. | ||||
| @@ -2561,8 +2563,10 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow)
 | ||||
|              } | ||||
|          } | ||||
|   | ||||
| -        scrn->display->virtualX = width;
 | ||||
| -        scrn->display->virtualY = height;
 | ||||
| +	if (!scrn->is_gpu) {
 | ||||
| +            scrn->display->virtualX = width;
 | ||||
| +            scrn->display->virtualY = height;
 | ||||
| +	}
 | ||||
|      } | ||||
|   | ||||
|      if (width > scrn->virtualX) | ||||
| -- 
 | ||||
| 1.8.1 | ||||
| 
 | ||||
| @ -1,46 +0,0 @@ | ||||
| From 6aa11e40ec75fb31d0c611f9d578427941379c0d Mon Sep 17 00:00:00 2001 | ||||
| From: Fedora X Ninjas <x@fedoraproject.org> | ||||
| Date: Tue, 8 Jan 2013 09:42:44 +1000 | ||||
| Subject: [PATCH] xserver: call CSR for gpus | ||||
| 
 | ||||
| ---
 | ||||
|  dix/main.c                          | 3 +++ | ||||
|  hw/xfree86/common/xf86platformBus.c | 8 ++++++++ | ||||
|  2 files changed, 11 insertions(+) | ||||
| 
 | ||||
| diff --git a/dix/main.c b/dix/main.c
 | ||||
| index fb935c9..e558d70 100644
 | ||||
| --- a/dix/main.c
 | ||||
| +++ b/dix/main.c
 | ||||
| @@ -211,6 +211,9 @@ main(int argc, char *argv[], char *envp[])
 | ||||
|              ScreenPtr pScreen = screenInfo.gpuscreens[i]; | ||||
|              if (!CreateScratchPixmapsForScreen(pScreen)) | ||||
|                  FatalError("failed to create scratch pixmaps"); | ||||
| +            if (pScreen->CreateScreenResources &&
 | ||||
| +                !(*pScreen->CreateScreenResources) (pScreen))
 | ||||
| +                FatalError("failed to create screen resources");
 | ||||
|          } | ||||
|   | ||||
|          for (i = 0; i < screenInfo.numScreens; i++) { | ||||
| diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
 | ||||
| index 67d03eb..8f73c3a 100644
 | ||||
| --- a/hw/xfree86/common/xf86platformBus.c
 | ||||
| +++ b/hw/xfree86/common/xf86platformBus.c
 | ||||
| @@ -452,6 +452,14 @@ xf86platformAddDevice(int index)
 | ||||
|   | ||||
|     CreateScratchPixmapsForScreen(xf86GPUScreens[i]->pScreen); | ||||
|   | ||||
| +   if (xf86GPUScreens[i]->pScreen->CreateScreenResources &&
 | ||||
| +       !(*xf86GPUScreens[i]->pScreen->CreateScreenResources) (xf86GPUScreens[i]->pScreen)) {
 | ||||
| +       RemoveGPUScreen(xf86GPUScreens[i]->pScreen);
 | ||||
| +       xf86DeleteScreen(xf86GPUScreens[i]);
 | ||||
| +       xf86UnclaimPlatformSlot(&xf86_platform_devices[index], NULL);
 | ||||
| +       xf86NumGPUScreens = old_screens;
 | ||||
| +       return -1;
 | ||||
| +   }
 | ||||
|     /* attach unbound to 0 protocol screen */ | ||||
|     AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen); | ||||
|     xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]); | ||||
| -- 
 | ||||
| 1.8.1 | ||||
| 
 | ||||
| @ -1,56 +0,0 @@ | ||||
| From 6703a7c7cf1a349c137e247a0c8eb462ff7b07be Mon Sep 17 00:00:00 2001 | ||||
| From: Keith Packard <keithp@keithp.com> | ||||
| Date: Tue, 8 Jan 2013 20:24:32 -0800 | ||||
| Subject: [PATCH 2/2] hw/xfree86: Require only one working CRTC to start the | ||||
|  server. | ||||
| 
 | ||||
| Instead of requiring every mode set to complete successfully, start up | ||||
| as long as at least one CRTC is working. This avoids failures when one | ||||
| or more CRTCs can't start due to mode setting conflicts. | ||||
| 
 | ||||
| Signed-off-by: Keith Packard <keithp@keithp.com> | ||||
| Reviewed-by: Dave Airlie <airlied@redhat.com> | ||||
| ---
 | ||||
|  hw/xfree86/modes/xf86Crtc.c | 15 +++++++++++---- | ||||
|  1 file changed, 11 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
 | ||||
| index 13251cf..b3ded5a 100644
 | ||||
| --- a/hw/xfree86/modes/xf86Crtc.c
 | ||||
| +++ b/hw/xfree86/modes/xf86Crtc.c
 | ||||
| @@ -2605,6 +2605,7 @@ xf86SetDesiredModes(ScrnInfoPtr scrn)
 | ||||
|      xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); | ||||
|      xf86CrtcPtr crtc = config->crtc[0]; | ||||
|      int c; | ||||
| +    int enabled = 0;
 | ||||
|   | ||||
|      /* A driver with this hook will take care of this */ | ||||
|      if (!crtc->funcs->set_mode_major) { | ||||
| @@ -2655,14 +2656,20 @@ xf86SetDesiredModes(ScrnInfoPtr scrn)
 | ||||
|              transform = &crtc->desiredTransform; | ||||
|          else | ||||
|              transform = NULL; | ||||
| -        if (!xf86CrtcSetModeTransform
 | ||||
| +        if (xf86CrtcSetModeTransform
 | ||||
|              (crtc, &crtc->desiredMode, crtc->desiredRotation, transform, | ||||
| -             crtc->desiredX, crtc->desiredY))
 | ||||
| -            return FALSE;
 | ||||
| +             crtc->desiredX, crtc->desiredY)) {
 | ||||
| +            ++enabled;
 | ||||
| +        } else {
 | ||||
| +            for (o = 0; o < config->num_output; o++)
 | ||||
| +                if (config->output[o]->crtc == crtc)
 | ||||
| +                    config->output[o]->crtc = NULL;
 | ||||
| +            crtc->enabled = FALSE;
 | ||||
| +	}
 | ||||
|      } | ||||
|   | ||||
|      xf86DisableUnusedFunctions(scrn); | ||||
| -    return TRUE;
 | ||||
| +    return enabled != 0;
 | ||||
|  } | ||||
|   | ||||
|  /** | ||||
| -- 
 | ||||
| 1.8.0.2 | ||||
| 
 | ||||
							
								
								
									
										2
									
								
								sources
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								sources
									
									
									
									
									
								
							| @ -1 +1 @@ | ||||
| 86110278b784e279381b7f6f2295c508  xorg-server-1.14.0.tar.bz2 | ||||
| 6a0f1a1639ada4b9da7e9582bc79252a  xorg-server-1.14.1.tar.bz2 | ||||
|  | ||||
| @ -1,53 +0,0 @@ | ||||
| From patchwork Wed Oct 17 10:06:47 2012 | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| MIME-Version: 1.0 | ||||
| Content-Transfer-Encoding: 7bit | ||||
| Subject: [v2] xf86: Fix non-PCI configuration-less setups | ||||
| Date: Wed, 17 Oct 2012 10:06:47 -0000 | ||||
| From: Thierry Reding <thierry.reding@avionic-design.de> | ||||
| X-Patchwork-Id: 12233 | ||||
| Message-Id: <1350468407-27681-1-git-send-email-thierry.reding@avionic-design.de> | ||||
| To: xorg-devel@lists.x.org | ||||
| Cc: Dave Airlie <airlied@gmail.com> | ||||
| 
 | ||||
| For non-PCI video devices, such as those found on many ARM embedded | ||||
| systems, the X server currently requires the BusID option to specify the | ||||
| full path to the DRM device's sysfs node in order to properly match it | ||||
| against the probed platform devices. | ||||
| 
 | ||||
| In order to allow X to start up properly if either the BusID option was | ||||
| omitted or no configuration is present at all, the first video device is | ||||
| used by default. | ||||
| 
 | ||||
| Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de> | ||||
| 
 | ||||
| ---
 | ||||
| Changes in v2: | ||||
| - Add additional checks for safety (I don't think numDevs will ever be 0
 | ||||
|   since a default will be generated if no configuration is present, but | ||||
|   it doesn't hurt to check anyway). Without these checks there is a | ||||
|   possibility of the X server crashing if no platform devices have been | ||||
|   found. | ||||
| 
 | ||||
|  hw/xfree86/common/xf86platformBus.c | 8 ++++++++ | ||||
|  1 file changed, 8 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
 | ||||
| index 0525e39..599d84a 100644
 | ||||
| --- a/hw/xfree86/common/xf86platformBus.c
 | ||||
| +++ b/hw/xfree86/common/xf86platformBus.c
 | ||||
| @@ -377,6 +377,14 @@ xf86platformProbeDev(DriverPtr drvp)
 | ||||
|              continue; | ||||
|      } | ||||
|   | ||||
| +    /*
 | ||||
| +     * If all of the above fails, which can happen if X was started without
 | ||||
| +     * configuration or if BusID wasn't set for non-PCI devices, use the first
 | ||||
| +     * device by default.
 | ||||
| +     */
 | ||||
| +    if (!foundScreen && xf86_num_platform_devices > 0 && numDevs > 0)
 | ||||
| +        foundScreen = probeSingleDevice(&xf86_platform_devices[0], drvp, devList[0], 0);
 | ||||
| +
 | ||||
|      /* if autoaddgpu devices is enabled then go find a few more and add them as GPU screens */ | ||||
|      if (xf86Info.autoAddGPU && numDevs) { | ||||
|          for (j = 0; j < xf86_num_platform_devices; j++) { | ||||
| @ -41,8 +41,8 @@ | ||||
| 
 | ||||
| Summary:   X.Org X11 X server | ||||
| Name:      xorg-x11-server | ||||
| Version:   1.14.0 | ||||
| Release:   6%{?gitdate:.%{gitdate}}%{dist} | ||||
| Version:   1.14.1 | ||||
| Release:   1%{?gitdate:.%{gitdate}}%{dist} | ||||
| URL:       http://www.x.org | ||||
| License:   MIT | ||||
| Group:     User Interface/X | ||||
| @ -84,6 +84,14 @@ Patch6011: xserver-1.6.0-less-acpi-brokenness.patch | ||||
| Patch6030: xserver-1.6.99-right-of.patch | ||||
| #Patch6044: xserver-1.6.99-hush-prerelease-warning.patch | ||||
| 
 | ||||
| # upstream backports - sent to stable | ||||
| Patch6050: xserver-1.14.0-fix-gpu-hotplug-vt-switch.patch | ||||
| Patch6051: 0001-hw-xfree86-Only-report-SetDesiredModes-failed-if-at-.patch | ||||
| 
 | ||||
| # upstream submitted | ||||
| Patch6052: 0001-randr-upstream-set-changed-fixes.patch | ||||
| Patch6053: 0001-gpu-screen-upstream-fixes.patch | ||||
| 
 | ||||
| # Fix libselinux-triggered build error | ||||
| # RedHat/Fedora-specific patch | ||||
| Patch7013: xserver-1.12-Xext-fix-selinux-build-failure.patch | ||||
| @ -98,38 +106,14 @@ Patch7027: xserver-autobind-hotplug.patch | ||||
| 
 | ||||
| Patch7052: 0001-xf86-return-NULL-for-compat-output-if-no-outputs.patch | ||||
| 
 | ||||
| # Fix non-PCI configuration-less setups - broken | ||||
| #Patch7061:  v2-xf86-Fix-non-PCI-configuration-less-setups.patch | ||||
| 
 | ||||
| # mustard: make the default queue length bigger to calm abrt down | ||||
| Patch7064: 0001-mieq-Bump-default-queue-size-to-512.patch | ||||
| 
 | ||||
| # some hotplug fixes/workaround | ||||
| Patch7066: 0001-xf86crtc-don-t-use-display-for-vx-vy-for-gpu-screens.patch | ||||
| # autoconfig: send events | ||||
| Patch7067: 0001-randr-don-t-directly-set-changed-bits-in-randr-scree.patch | ||||
| Patch7068: 0001-randr-make-SetChanged-modify-the-main-protocol-scree.patch | ||||
| Patch7069: 0001-randr-only-respected-changed-on-the-protocol-screen.patch | ||||
| Patch7070: 0001-randr-report-changes-when-we-disconnect-a-GPU-slave.patch | ||||
| 
 | ||||
| 
 | ||||
| # upstream in -next for 1.15, e21e183059df5975e7086850d1931edb2c1bbd06 | ||||
| %if !0%{?rhel} | ||||
| Patch7071: 0001-os-use-libunwind-to-generate-backtraces.patch | ||||
| %endif | ||||
| 
 | ||||
| # upstream submitted | ||||
| Patch7072: xserver-1.14.0-fix-gpu-hotplug-vt-switch.patch | ||||
| 
 | ||||
| # Bug 950438 - CVE-2013-1940 xorg-x11-server: | ||||
| # Information disclosure due enabling events from hot-plug devices despite | ||||
| # input from the device being momentarily disabled | ||||
| Patch7073: 0001-xf86-fix-flush-input-to-work-with-Linux-evdev-device.patch | ||||
| 
 | ||||
| # on way upstream: fixes for reverse optimus | ||||
| Patch8000: 0001-dix-allow-pixmap-dirty-helper-to-be-used-for-non-sha.patch | ||||
| Patch8001: 0001-xserver-call-CSR-for-gpus.patch | ||||
| 
 | ||||
| %global moduledir	%{_libdir}/xorg/modules | ||||
| %global drimoduledir	%{_libdir}/dri | ||||
| %global sdkdir		%{_includedir}/xorg | ||||
| @ -602,6 +586,10 @@ rm -rf $RPM_BUILD_ROOT | ||||
| %{xserver_source_dir} | ||||
| 
 | ||||
| %changelog | ||||
| * Mon May 06 2013 Dave Airlie <airlied@redhat.com> 1.14.1-1 | ||||
| - upstream rebase | ||||
| - reorganise the randr/gpu screen patches + backports | ||||
| 
 | ||||
| * Wed Apr 17 2013 Peter Hutterer <peter.hutterer@redhat.com> 1.14.0-6 | ||||
| - CVE-2013-1940: Fix xf86FlushInput() to drain evdev events | ||||
|   (#950438, #952949) | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| From 37d51acb3b6a38af1717bfaa7925043c35bfb447 Mon Sep 17 00:00:00 2001 | ||||
| From 05a3edae62a02bbbc3102beb5edd73d78c266ef7 Mon Sep 17 00:00:00 2001 | ||||
| From: Dave Airlie <airlied@redhat.com> | ||||
| Date: Fri, 17 Aug 2012 09:49:24 +1000 | ||||
| Subject: [PATCH] autobind GPUs to the screen, (v3) | ||||
| @ -9,35 +9,16 @@ but until DE support is in GNOME its probably for the best. | ||||
| v2: fix if config or slave config is NULL | ||||
| v3: fix multi useful slaves | ||||
| DO NOT UPSTREAM. | ||||
| 
 | ||||
| Signed-off-by: Dave Airlie <airlied@gmail.com> | ||||
| ---
 | ||||
|  dix/dispatch.c                      |  2 -- | ||||
|  hw/xfree86/common/xf86Init.c        | 12 ++++++++++++ | ||||
|  hw/xfree86/common/xf86platformBus.c |  3 +++ | ||||
|  hw/xfree86/modes/xf86Crtc.c         | 32 ++++++++++++++++++++++++++++++++ | ||||
|  4 files changed, 47 insertions(+), 2 deletions(-) | ||||
|  3 files changed, 47 insertions(+) | ||||
| 
 | ||||
| diff --git a/dix/dispatch.c b/dix/dispatch.c
 | ||||
| index 0ce10c2..c2ab8f9 100644
 | ||||
| --- a/dix/dispatch.c
 | ||||
| +++ b/dix/dispatch.c
 | ||||
| @@ -3933,7 +3933,6 @@ void
 | ||||
|  AttachOutputGPU(ScreenPtr pScreen, ScreenPtr new) | ||||
|  { | ||||
|      assert(new->isGPU); | ||||
| -    assert(!new->current_master);
 | ||||
|      xorg_list_add(&new->output_head, &pScreen->output_slave_list); | ||||
|      new->current_master = pScreen; | ||||
|  } | ||||
| @@ -3950,7 +3949,6 @@ void
 | ||||
|  AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr new) | ||||
|  { | ||||
|      assert(new->isGPU); | ||||
| -    assert(!new->current_master);
 | ||||
|      xorg_list_add(&new->offload_head, &pScreen->offload_slave_list); | ||||
|      new->current_master = pScreen; | ||||
|  } | ||||
| diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
 | ||||
| index d231ced..89629c1 100644
 | ||||
| index 91ec4c8..142ce95 100644
 | ||||
| --- a/hw/xfree86/common/xf86Init.c
 | ||||
| +++ b/hw/xfree86/common/xf86Init.c
 | ||||
| @@ -361,6 +361,16 @@ xf86CreateRootWindow(WindowPtr pWin)
 | ||||
| @ -57,7 +38,7 @@ index d231ced..89629c1 100644 | ||||
|  static void | ||||
|  InstallSignalHandlers(void) | ||||
|  { | ||||
| @@ -926,6 +936,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
 | ||||
| @@ -930,6 +940,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
 | ||||
|      for (i = 0; i < xf86NumGPUScreens; i++) | ||||
|          AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen); | ||||
|   | ||||
| @ -67,10 +48,10 @@ index d231ced..89629c1 100644 | ||||
|      if (sigio_blocked) | ||||
|          OsReleaseSIGIO(); | ||||
| diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
 | ||||
| index 0525e39..82fef32 100644
 | ||||
| index e368dee..1581413 100644
 | ||||
| --- a/hw/xfree86/common/xf86platformBus.c
 | ||||
| +++ b/hw/xfree86/common/xf86platformBus.c
 | ||||
| @@ -387,6 +387,8 @@ xf86platformProbeDev(DriverPtr drvp)
 | ||||
| @@ -393,6 +393,8 @@ xf86platformProbeDev(DriverPtr drvp)
 | ||||
|      return foundScreen; | ||||
|  } | ||||
|   | ||||
| @ -79,8 +60,8 @@ index 0525e39..82fef32 100644 | ||||
|  int | ||||
|  xf86platformAddDevice(int index) | ||||
|  { | ||||
| @@ -446,6 +448,7 @@ xf86platformAddDevice(int index)
 | ||||
|   | ||||
| @@ -465,6 +467,7 @@ xf86platformAddDevice(int index)
 | ||||
|     } | ||||
|     /* attach unbound to 0 protocol screen */ | ||||
|     AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen); | ||||
| +   xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
 | ||||
| @ -88,10 +69,10 @@ index 0525e39..82fef32 100644 | ||||
|     return 0; | ||||
|  } | ||||
| diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
 | ||||
| index 3011f13..34c1848 100644
 | ||||
| index 4a490c6..5453f3a 100644
 | ||||
| --- a/hw/xfree86/modes/xf86Crtc.c
 | ||||
| +++ b/hw/xfree86/modes/xf86Crtc.c
 | ||||
| @@ -3323,3 +3323,35 @@ xf86DetachAllCrtc(ScrnInfoPtr scrn)
 | ||||
| @@ -3358,3 +3358,35 @@ xf86DetachAllCrtc(ScrnInfoPtr scrn)
 | ||||
|              crtc->x = crtc->y = 0; | ||||
|          } | ||||
|  } | ||||
| @ -128,5 +109,5 @@ index 3011f13..34c1848 100644 | ||||
| +    }
 | ||||
| +}
 | ||||
| -- 
 | ||||
| 1.8.1 | ||||
| 1.8.2 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user