Message ID | 1397175876-3216-1-git-send-email-matthew.d.roper@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Now that the DRM core supports universal planes, we should update intel-gpu-tools to exercise this new functionality. The first patch here reworks some of the igt_kms library internals to handle primary and cursor planes coming from the DRM plane list. This breaks a few invariants that i-g-t previously relied upon (primary plane must be first in the plane list, cursor plane must be last), so the second patch here updates the existing kms_plane test to allow it to continue working with these changes (that's the only test I noticed that made assumptions about plane order). Finally, the third patch adds a new test for Intel-specific primary plane handling via the universal plane API. Note that this new test depends on i915 patch "drm/i915: Intel-specific primary plane handling" to allow the primary plane to be disabled independently of the CRTC. This test will fail if the DRM's primary plane helper is used rather than the Intel-specific support from that patch. Matt Roper (3): kms: Add universal plane support kms_plane: Update for universal plane changes kms_universal_plane: Universal plane testing lib/igt_kms.c | 132 ++++++++++++++++++++------- lib/igt_kms.h | 5 ++ tests/Makefile.sources | 1 + tests/kms_plane.c | 11 ++- tests/kms_universal_plane.c | 211 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 327 insertions(+), 33 deletions(-) create mode 100644 tests/kms_universal_plane.c
On Thu, Apr 10, 2014 at 05:24:36PM -0700, Matt Roper wrote: > Intel hardware allows the primary plane to be disabled independently of > the CRTC. Provide custom primary plane handling to allow this. > > v2: > - Unpin fb properly on primary plane disable > - Provide an Intel-specific set of primary plane formats > - Additional sanity checks on setplane (in line with the checks > currently being done by the DRM core primary plane helper) > > Signed-off-by: Matt Roper <matthew.d.roper@intel.com> > --- > > This patch was previously part of my universal plane series on dri-devel > (http://lists.freedesktop.org/archives/dri-devel/2014-March/055852.html) but I > dropped it in v4 and v5 of that series to focus on the DRM core changes. Now > that universal planes have been merged, we can start building on that framework > to provide i915-specific functionality. > > Some i-g-t changes to test this will be sent shortly. > > > Matt > > > drivers/gpu/drm/i915/intel_display.c | 165 ++++++++++++++++++++++++++++++++++- > drivers/gpu/drm/i915/intel_drv.h | 1 + > 2 files changed, 164 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index 1af1d14..a0bc251 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -39,8 +39,24 @@ > #include "i915_trace.h" > #include <drm/drm_dp_helper.h> > #include <drm/drm_crtc_helper.h> > +#include <drm/drm_rect.h> > #include <linux/dma_remapping.h> > > +const static uint32_t intel_primary_formats[] = { > + DRM_FORMAT_C8, > + DRM_FORMAT_XRGB1555, > + DRM_FORMAT_ARGB1555, > + DRM_FORMAT_RGB565, > + DRM_FORMAT_XRGB8888, > + DRM_FORMAT_ARGB8888, > + DRM_FORMAT_XBGR8888, > + DRM_FORMAT_ABGR8888, > + DRM_FORMAT_XRGB2101010, > + DRM_FORMAT_ARGB2101010, > + DRM_FORMAT_XBGR2101010, > + DRM_FORMAT_ABGR2101010, > +}; I think going the extra step and having correct per-gen format lists would be good. See intel_framebuffer_init for which platfrom can do what. Unfortunately we can't yet change those checks to WARNs since the core doesn't yet check the primary plane format against this list ... And we can't do that yet since not all drivers are converted yet to have at least an explicit format list :( > + > static void intel_increase_pllclock(struct drm_crtc *crtc); > static void intel_crtc_update_cursor(struct drm_crtc *crtc, bool on); > > @@ -10553,17 +10569,162 @@ static void intel_shared_dpll_init(struct drm_device *dev) > BUG_ON(dev_priv->num_shared_dpll > I915_NUM_PLLS); > } > > +static int > +intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc, > + struct drm_framebuffer *fb, int crtc_x, int crtc_y, > + unsigned int crtc_w, unsigned int crtc_h, > + uint32_t src_x, uint32_t src_y, > + uint32_t src_w, uint32_t src_h) > +{ > + struct drm_device *dev = crtc->dev; > + struct drm_i915_private *dev_priv = dev->dev_private; > + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); > + struct drm_framebuffer *tmpfb; > + struct drm_rect dest = { > + .x1 = crtc_x, > + .y1 = crtc_y, > + .x2 = crtc_x + crtc_w, > + .y2 = crtc_y + crtc_h, > + }; > + struct drm_rect clip = { > + .x2 = crtc->mode.hdisplay, > + .y2 = crtc->mode.vdisplay, > + }; > + int ret; > + > + /* setplane API takes shifted source rectangle values; unshift them */ > + src_x >>= 16; > + src_y >>= 16; > + src_w >>= 16; > + src_h >>= 16; > + > + /* > + * Current hardware can't reposition the primary plane or scale it > + * (although this could change in the future). > + */ > + drm_rect_intersect(&dest, &clip); > + if (dest.x1 != 0 || dest.y1 != 0 || > + dest.x2 != crtc->mode.hdisplay || dest.y2 != crtc->mode.vdisplay) { > + DRM_DEBUG_KMS("Primary plane must cover entire CRTC\n"); > + return -EINVAL; > + } > + > + if (crtc_w != src_w || crtc_h != src_h) { > + DRM_DEBUG_KMS("Can't scale primary plane\n"); > + return -EINVAL; > + } Subpixel check seems to be missing. And can't we extract all these checks both here and from the primary plane helper? I guess there'll be other hw which doesn't have scaling primary planes, but which wants to allow primary plane enable/disable. > + > + /* Primary planes are locked to their owning CRTC */ > + if (plane->possible_crtcs != drm_crtc_mask(crtc)) { > + DRM_DEBUG_KMS("Cannot change primary plane CRTC\n"); > + return -EINVAL; > + } > + > + /* Framebuffer must be big enough to cover entire plane */ > + ret = drm_crtc_check_viewport(crtc, crtc_x, crtc_y, &crtc->mode, fb); > + if (ret) > + return ret; > + > + /* > + * pipe_set_base() adjusts crtc->primary->fb; however the DRM setplane > + * code that called us expects to handle the framebuffer update and > + * reference counting; save and restore the current fb before > + * calling it. > + */ > + tmpfb = plane->fb; > + ret = intel_pipe_set_base(crtc, src_x, src_y, fb); > + if (ret) > + return ret; > + plane->fb = tmpfb; > + > + if (!intel_crtc->primary_enabled) > + intel_enable_primary_hw_plane(dev_priv, intel_crtc->plane, > + intel_crtc->pipe); Hm, I've thought we could do a simple if (intel_crtc->primary_enabled) call_primary_plane_helper else enable_the_hw_plane But we need to do all the arg checking for the !primary_enabled case :( Anyway more code sharing make me happier. Cheers, Daniel > + > + return 0; > +} > + > +static int > +intel_primary_plane_disable(struct drm_plane *plane) > +{ > + struct drm_device *dev = plane->dev; > + struct drm_i915_private *dev_priv = dev->dev_private; > + struct intel_plane *intel_plane = to_intel_plane(plane); > + struct intel_crtc *intel_crtc; > + > + if (!plane->fb) > + return 0; > + > + if (WARN_ON(!plane->crtc)) > + return -EINVAL; > + > + intel_crtc = to_intel_crtc(plane->crtc); > + if (intel_crtc->primary_enabled) > + intel_disable_primary_hw_plane(dev_priv, intel_plane->plane, > + intel_plane->pipe); > + > + /* > + * N.B. The DRM setplane code will update the plane->fb pointer after > + * we finish here. > + */ > + intel_unpin_fb_obj(to_intel_framebuffer(plane->fb)->obj); > + > + return 0; > +} > + > +static void intel_primary_plane_destroy(struct drm_plane *plane) > +{ > + struct intel_plane *intel_plane = to_intel_plane(plane); > + intel_primary_plane_disable(plane); > + drm_plane_cleanup(plane); > + kfree(intel_plane); > +} > + > +static const struct drm_plane_funcs intel_primary_plane_funcs = { > + .update_plane = intel_primary_plane_setplane, > + .disable_plane = intel_primary_plane_disable, > + .destroy = intel_primary_plane_destroy, > +}; > + > +static struct drm_plane *intel_primary_plane_create(struct drm_device *dev, > + int pipe) > +{ > + struct intel_plane *primary; > + > + primary = kzalloc(sizeof(*primary), GFP_KERNEL); > + if (primary == NULL) > + return NULL; > + > + primary->can_scale = false; > + primary->pipe = pipe; > + primary->plane = pipe; > + > + drm_plane_init(dev, &primary->base, 0, > + &intel_primary_plane_funcs, intel_primary_formats, > + ARRAY_SIZE(intel_primary_formats), > + DRM_PLANE_TYPE_PRIMARY); > + return &primary->base; > +} > + > static void intel_crtc_init(struct drm_device *dev, int pipe) > { > struct drm_i915_private *dev_priv = dev->dev_private; > struct intel_crtc *intel_crtc; > - int i; > + struct drm_plane *primary; > + int i, ret; > > intel_crtc = kzalloc(sizeof(*intel_crtc), GFP_KERNEL); > if (intel_crtc == NULL) > return; > > - drm_crtc_init(dev, &intel_crtc->base, &intel_crtc_funcs); > + primary = intel_primary_plane_create(dev, pipe); > + ret = drm_crtc_init_with_planes(dev, &intel_crtc->base, primary, > + NULL, &intel_crtc_funcs); > + if (ret) { > + drm_crtc_cleanup(&intel_crtc->base); > + kfree(intel_crtc); > + return; > + } > > drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256); > for (i = 0; i < 256; i++) { > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > index c551472..2ce9cc3 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -363,6 +363,7 @@ struct intel_crtc { > bool active; > unsigned long enabled_power_domains; > bool eld_vld; > + struct intel_plane *primary_plane; > bool primary_enabled; /* is the primary plane (partially) visible? */ > bool lowfreq_avail; > struct intel_overlay *overlay; > -- > 1.8.5.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
On Fri, Apr 11, 2014 at 11:34:36AM +0200, Daniel Vetter wrote: > On Thu, Apr 10, 2014 at 05:24:36PM -0700, Matt Roper wrote: ... > > + /* setplane API takes shifted source rectangle values; unshift them */ > > + src_x >>= 16; > > + src_y >>= 16; > > + src_w >>= 16; > > + src_h >>= 16; > > + > > + /* > > + * Current hardware can't reposition the primary plane or scale it > > + * (although this could change in the future). > > + */ > > + drm_rect_intersect(&dest, &clip); > > + if (dest.x1 != 0 || dest.y1 != 0 || > > + dest.x2 != crtc->mode.hdisplay || dest.y2 != crtc->mode.vdisplay) { > > + DRM_DEBUG_KMS("Primary plane must cover entire CRTC\n"); > > + return -EINVAL; > > + } > > + > > + if (crtc_w != src_w || crtc_h != src_h) { > > + DRM_DEBUG_KMS("Can't scale primary plane\n"); > > + return -EINVAL; > > + } > > Subpixel check seems to be missing. And can't we extract all these checks > both here and from the primary plane helper? I guess there'll be other hw > which doesn't have scaling primary planes, but which wants to allow > primary plane enable/disable. I was a bit unsure about this. At first I thought I needed to check the subpixel part, but the DocBook reference indicates Devices that don't support subpixel plane coordinates can ignore the fractional part. which sounds to me like we're supposed to just silently ignore the subpixel bits on i915 and other devices that don't support it. Which would probably also mean that I should remove the (subpixel bits == 0) test from the primary helper... Matt
On Fri, Apr 11, 2014 at 07:17:41AM -0700, Matt Roper wrote: > On Fri, Apr 11, 2014 at 11:34:36AM +0200, Daniel Vetter wrote: > > On Thu, Apr 10, 2014 at 05:24:36PM -0700, Matt Roper wrote: > ... > > > + /* setplane API takes shifted source rectangle values; unshift them */ > > > + src_x >>= 16; > > > + src_y >>= 16; > > > + src_w >>= 16; > > > + src_h >>= 16; > > > + > > > + /* > > > + * Current hardware can't reposition the primary plane or scale it > > > + * (although this could change in the future). > > > + */ > > > + drm_rect_intersect(&dest, &clip); > > > + if (dest.x1 != 0 || dest.y1 != 0 || > > > + dest.x2 != crtc->mode.hdisplay || dest.y2 != crtc->mode.vdisplay) { > > > + DRM_DEBUG_KMS("Primary plane must cover entire CRTC\n"); > > > + return -EINVAL; > > > + } > > > + > > > + if (crtc_w != src_w || crtc_h != src_h) { > > > + DRM_DEBUG_KMS("Can't scale primary plane\n"); > > > + return -EINVAL; > > > + } > > > > Subpixel check seems to be missing. And can't we extract all these checks > > both here and from the primary plane helper? I guess there'll be other hw > > which doesn't have scaling primary planes, but which wants to allow > > primary plane enable/disable. > > I was a bit unsure about this. At first I thought I needed to check the > subpixel part, but the DocBook reference indicates > > Devices that don't support subpixel plane coordinates can ignore > the fractional part. > > which sounds to me like we're supposed to just silently ignore the > subpixel bits on i915 and other devices that don't support it. Which > would probably also mean that I should remove the (subpixel bits == 0) > test from the primary helper... Hm ... yeah I guess you're right. For now it probably won't matter too much. -Daniel
On Fri, Apr 11, 2014 at 11:34:36AM +0200, Daniel Vetter wrote: > On Thu, Apr 10, 2014 at 05:24:36PM -0700, Matt Roper wrote: ... > > Hm, I've thought we could do a simple > > if (intel_crtc->primary_enabled) > call_primary_plane_helper > else > enable_the_hw_plane > > But we need to do all the arg checking for the !primary_enabled case :( > Anyway more code sharing make me happier. > > Cheers, Daniel I think the problem here is that the helper has a bunch of tests targetted at the lowest common denominator hardware. Some of the things it rejects are things that our hardware may begin to allow at some point in the future (e.g., primary plane scaling, partial CRTC coverage of primary plane, etc.). We can probably call into the helper today and get the behavior we want, but I'd expect that some of those restrictions will need to be relaxed in the future and then we'll have to switch the code back at that point. Given that we still need to do all this checking in the 'if (!enabled)' case, I don't think it's worth trying to call through the helper for the 'if (enabled)' case (especially since the actual "work" here after we're done testing is just a couple lines of code)? Matt
On Fri, Apr 11, 2014 at 10:41:56AM -0700, Matt Roper wrote: > On Fri, Apr 11, 2014 at 11:34:36AM +0200, Daniel Vetter wrote: > > On Thu, Apr 10, 2014 at 05:24:36PM -0700, Matt Roper wrote: > ... > > > > Hm, I've thought we could do a simple > > > > if (intel_crtc->primary_enabled) > > call_primary_plane_helper > > else > > enable_the_hw_plane > > > > But we need to do all the arg checking for the !primary_enabled case :( > > Anyway more code sharing make me happier. > > > > Cheers, Daniel > > I think the problem here is that the helper has a bunch of tests > targetted at the lowest common denominator hardware. Some of the things > it rejects are things that our hardware may begin to allow at some point > in the future (e.g., primary plane scaling, partial CRTC coverage of > primary plane, etc.). We can probably call into the helper today and > get the behavior we want, but I'd expect that some of those restrictions > will need to be relaxed in the future and then we'll have to switch the > code back at that point. Given that we still need to do all this > checking in the 'if (!enabled)' case, I don't think it's worth trying to > call through the helper for the 'if (enabled)' case (especially since > the actual "work" here after we're done testing is just a couple lines > of code)? Well for that future I simply expect that we'll get a completely new update_plane function. I agree that reusing the helper completely doesn't work really, but sharing the tests would be nice imo. -Daniel
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 1af1d14..a0bc251 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -39,8 +39,24 @@ #include "i915_trace.h" #include <drm/drm_dp_helper.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_rect.h> #include <linux/dma_remapping.h> +const static uint32_t intel_primary_formats[] = { + DRM_FORMAT_C8, + DRM_FORMAT_XRGB1555, + DRM_FORMAT_ARGB1555, + DRM_FORMAT_RGB565, + DRM_FORMAT_XRGB8888, + DRM_FORMAT_ARGB8888, + DRM_FORMAT_XBGR8888, + DRM_FORMAT_ABGR8888, + DRM_FORMAT_XRGB2101010, + DRM_FORMAT_ARGB2101010, + DRM_FORMAT_XBGR2101010, + DRM_FORMAT_ABGR2101010, +}; + static void intel_increase_pllclock(struct drm_crtc *crtc); static void intel_crtc_update_cursor(struct drm_crtc *crtc, bool on); @@ -10553,17 +10569,162 @@ static void intel_shared_dpll_init(struct drm_device *dev) BUG_ON(dev_priv->num_shared_dpll > I915_NUM_PLLS); } +static int +intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc, + struct drm_framebuffer *fb, int crtc_x, int crtc_y, + unsigned int crtc_w, unsigned int crtc_h, + uint32_t src_x, uint32_t src_y, + uint32_t src_w, uint32_t src_h) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct drm_framebuffer *tmpfb; + struct drm_rect dest = { + .x1 = crtc_x, + .y1 = crtc_y, + .x2 = crtc_x + crtc_w, + .y2 = crtc_y + crtc_h, + }; + struct drm_rect clip = { + .x2 = crtc->mode.hdisplay, + .y2 = crtc->mode.vdisplay, + }; + int ret; + + /* setplane API takes shifted source rectangle values; unshift them */ + src_x >>= 16; + src_y >>= 16; + src_w >>= 16; + src_h >>= 16; + + /* + * Current hardware can't reposition the primary plane or scale it + * (although this could change in the future). + */ + drm_rect_intersect(&dest, &clip); + if (dest.x1 != 0 || dest.y1 != 0 || + dest.x2 != crtc->mode.hdisplay || dest.y2 != crtc->mode.vdisplay) { + DRM_DEBUG_KMS("Primary plane must cover entire CRTC\n"); + return -EINVAL; + } + + if (crtc_w != src_w || crtc_h != src_h) { + DRM_DEBUG_KMS("Can't scale primary plane\n"); + return -EINVAL; + } + + /* Primary planes are locked to their owning CRTC */ + if (plane->possible_crtcs != drm_crtc_mask(crtc)) { + DRM_DEBUG_KMS("Cannot change primary plane CRTC\n"); + return -EINVAL; + } + + /* Framebuffer must be big enough to cover entire plane */ + ret = drm_crtc_check_viewport(crtc, crtc_x, crtc_y, &crtc->mode, fb); + if (ret) + return ret; + + /* + * pipe_set_base() adjusts crtc->primary->fb; however the DRM setplane + * code that called us expects to handle the framebuffer update and + * reference counting; save and restore the current fb before + * calling it. + */ + tmpfb = plane->fb; + ret = intel_pipe_set_base(crtc, src_x, src_y, fb); + if (ret) + return ret; + plane->fb = tmpfb; + + if (!intel_crtc->primary_enabled) + intel_enable_primary_hw_plane(dev_priv, intel_crtc->plane, + intel_crtc->pipe); + + return 0; +} + +static int +intel_primary_plane_disable(struct drm_plane *plane) +{ + struct drm_device *dev = plane->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_plane *intel_plane = to_intel_plane(plane); + struct intel_crtc *intel_crtc; + + if (!plane->fb) + return 0; + + if (WARN_ON(!plane->crtc)) + return -EINVAL; + + intel_crtc = to_intel_crtc(plane->crtc); + if (intel_crtc->primary_enabled) + intel_disable_primary_hw_plane(dev_priv, intel_plane->plane, + intel_plane->pipe); + + /* + * N.B. The DRM setplane code will update the plane->fb pointer after + * we finish here. + */ + intel_unpin_fb_obj(to_intel_framebuffer(plane->fb)->obj); + + return 0; +} + +static void intel_primary_plane_destroy(struct drm_plane *plane) +{ + struct intel_plane *intel_plane = to_intel_plane(plane); + intel_primary_plane_disable(plane); + drm_plane_cleanup(plane); + kfree(intel_plane); +} + +static const struct drm_plane_funcs intel_primary_plane_funcs = { + .update_plane = intel_primary_plane_setplane, + .disable_plane = intel_primary_plane_disable, + .destroy = intel_primary_plane_destroy, +}; + +static struct drm_plane *intel_primary_plane_create(struct drm_device *dev, + int pipe) +{ + struct intel_plane *primary; + + primary = kzalloc(sizeof(*primary), GFP_KERNEL); + if (primary == NULL) + return NULL; + + primary->can_scale = false; + primary->pipe = pipe; + primary->plane = pipe; + + drm_plane_init(dev, &primary->base, 0, + &intel_primary_plane_funcs, intel_primary_formats, + ARRAY_SIZE(intel_primary_formats), + DRM_PLANE_TYPE_PRIMARY); + return &primary->base; +} + static void intel_crtc_init(struct drm_device *dev, int pipe) { struct drm_i915_private *dev_priv = dev->dev_private; struct intel_crtc *intel_crtc; - int i; + struct drm_plane *primary; + int i, ret; intel_crtc = kzalloc(sizeof(*intel_crtc), GFP_KERNEL); if (intel_crtc == NULL) return; - drm_crtc_init(dev, &intel_crtc->base, &intel_crtc_funcs); + primary = intel_primary_plane_create(dev, pipe); + ret = drm_crtc_init_with_planes(dev, &intel_crtc->base, primary, + NULL, &intel_crtc_funcs); + if (ret) { + drm_crtc_cleanup(&intel_crtc->base); + kfree(intel_crtc); + return; + } drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256); for (i = 0; i < 256; i++) { diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index c551472..2ce9cc3 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -363,6 +363,7 @@ struct intel_crtc { bool active; unsigned long enabled_power_domains; bool eld_vld; + struct intel_plane *primary_plane; bool primary_enabled; /* is the primary plane (partially) visible? */ bool lowfreq_avail; struct intel_overlay *overlay;
Intel hardware allows the primary plane to be disabled independently of the CRTC. Provide custom primary plane handling to allow this. v2: - Unpin fb properly on primary plane disable - Provide an Intel-specific set of primary plane formats - Additional sanity checks on setplane (in line with the checks currently being done by the DRM core primary plane helper) Signed-off-by: Matt Roper <matthew.d.roper@intel.com> --- This patch was previously part of my universal plane series on dri-devel (http://lists.freedesktop.org/archives/dri-devel/2014-March/055852.html) but I dropped it in v4 and v5 of that series to focus on the DRM core changes. Now that universal planes have been merged, we can start building on that framework to provide i915-specific functionality. Some i-g-t changes to test this will be sent shortly. Matt drivers/gpu/drm/i915/intel_display.c | 165 ++++++++++++++++++++++++++++++++++- drivers/gpu/drm/i915/intel_drv.h | 1 + 2 files changed, 164 insertions(+), 2 deletions(-)