diff options
| author | Dave Airlie <airlied@redhat.com> | 2021-06-02 14:04:29 +1000 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2021-06-02 14:15:54 +1000 | 
| commit | ccd1950c2f7e38ae45aeefb99a08b39407cd6c63 (patch) | |
| tree | 1fe82742fce2934ec5720e7bc265dabc8c015656 /drivers/gpu/drm/i915/display | |
| parent | 43ed3c6c786d996a264fcde68dbb36df6f03b965 (diff) | |
| parent | 5b26d57fdb499c2363f3d895ef008e73ec02eb9b (diff) | |
Merge tag 'drm-intel-gt-next-2021-05-28' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
UAPI Changes:
- Add reworked uAPI for DG1 behind CONFIG_BROKEN (Matt A, Abdiel)
Driver Changes:
- Fix for Gitlab issues #3293 and #3450:
  Avoid kernel crash on older L-shape memory machines
- Add Wa_14010733141 (VDBox SFC reset) for Gen11+ (Aditya)
- Fix crash in auto_retire active retire callback due to
  misalignment (Stephane)
- Fix overlay active retire callback alignment (Tvrtko)
- Eliminate need to align active retire callbacks (Matt A, Ville,
  Daniel)
- Program FF_MODE2 tuning value for all Gen12 platforms (Caz)
- Add Wa_14011060649 for TGL,RKL,DG1 and ADLS (Swathi)
- Create stolen memory region from local memory on DG1 (CQ)
- Place PD in LMEM on dGFX (Matt A)
- Use WC when default state object is allocated in LMEM (Venkata)
- Determine the coherent map type based on object location (Venkata)
- Use lmem physical addresses for fb_mmap() on discrete (Mohammed)
- Bypass aperture on fbdev when LMEM is available (Anusha)
- Return error value when displayable BO not in LMEM for dGFX (Mohammed)
- Do release kernel context if breadcrumb measure fails (Janusz)
- Hide modparams for compiled-out features (Tvrtko)
- Apply Wa_22010271021 for all Gen11 platforms (Caz)
- Fix unlikely ref count race in arming the watchdog timer (Tvrtko)
- Check actual RC6 enable status in PMU (Tvrtko)
- Fix a double free in gen8_preallocate_top_level_pdp (Lv)
- Use trylock in shrinker for GGTT on BSW VT-d and BXT (Maarten)
- Remove erroneous i915_is_ggtt check for
  I915_GEM_OBJECT_UNBIND_VM_TRYLOCK (Maarten)
- Convert uAPI headers to real kerneldoc (Matt A)
- Clean up kerneldoc warnings headers (Matt A, Maarten)
- Fail driver if LMEM training failed (Matt R)
- Avoid div-by-zero on Gen2 (Ville)
- Read C0DRB3/C1DRB3 as 16 bits again and add _BW suffix (Ville)
- Remove reference to struct drm_device.pdev (Thomas)
- Increase separation between GuC and execlists code (Chris, Matt B)
- Use might_alloc() (Bernard)
- Split DGFX_FEATURES from GEN12_FEATURES (Lucas)
- Deduplicate Wa_22010271021 programming on (Jose)
- Drop duplicate WaDisable4x2SubspanOptimization:hsw (Tvrtko)
- Selftest improvements (Chris, Hsin-Yi, Tvrtko)
- Shuffle around init_memory_region for stolen (Matt)
- Typo fixes (wengjianfeng)
[airlied: fix conflict with fixes in i915_active.c]
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/YLCbBR22BsQ/dpJB@jlahtine-mobl.ger.corp.intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/display')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_display.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_fbdev.c | 51 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_frontbuffer.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_overlay.c | 5 | 
4 files changed, 51 insertions, 18 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 384ff0bb6e19..422b59ebf6dc 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -11660,11 +11660,20 @@ intel_user_framebuffer_create(struct drm_device *dev,  	struct drm_framebuffer *fb;  	struct drm_i915_gem_object *obj;  	struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd; +	struct drm_i915_private *i915;  	obj = i915_gem_object_lookup(filp, mode_cmd.handles[0]);  	if (!obj)  		return ERR_PTR(-ENOENT); +	/* object is backed with LMEM for discrete */ +	i915 = to_i915(obj->base.dev); +	if (HAS_LMEM(i915) && !i915_gem_object_is_lmem(obj)) { +		/* object is "remote", not in local memory */ +		i915_gem_object_put(obj); +		return ERR_PTR(-EREMOTE); +	} +  	fb = intel_framebuffer_create(obj, &mode_cmd);  	i915_gem_object_put(obj); diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c index ccd00e65a5fe..4af40229f5ec 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c @@ -41,6 +41,8 @@  #include <drm/drm_fb_helper.h>  #include <drm/drm_fourcc.h> +#include "gem/i915_gem_lmem.h" +  #include "i915_drv.h"  #include "intel_display_types.h"  #include "intel_fbdev.h" @@ -137,14 +139,22 @@ static int intelfb_alloc(struct drm_fb_helper *helper,  	size = mode_cmd.pitches[0] * mode_cmd.height;  	size = PAGE_ALIGN(size); -	/* If the FB is too big, just don't use it since fbdev is not very -	 * important and we should probably use that space with FBC or other -	 * features. */  	obj = ERR_PTR(-ENODEV); -	if (size * 2 < dev_priv->stolen_usable_size) -		obj = i915_gem_object_create_stolen(dev_priv, size); -	if (IS_ERR(obj)) -		obj = i915_gem_object_create_shmem(dev_priv, size); +	if (HAS_LMEM(dev_priv)) { +		obj = i915_gem_object_create_lmem(dev_priv, size, +						  I915_BO_ALLOC_CONTIGUOUS); +	} else { +		/* +		 * If the FB is too big, just don't use it since fbdev is not very +		 * important and we should probably use that space with FBC or other +		 * features. +		 */ +		if (size * 2 < dev_priv->stolen_usable_size) +			obj = i915_gem_object_create_stolen(dev_priv, size); +		if (IS_ERR(obj)) +			obj = i915_gem_object_create_shmem(dev_priv, size); +	} +  	if (IS_ERR(obj)) {  		drm_err(&dev_priv->drm, "failed to allocate framebuffer\n");  		return PTR_ERR(obj); @@ -178,6 +188,7 @@ static int intelfb_create(struct drm_fb_helper *helper,  	unsigned long flags = 0;  	bool prealloc = false;  	void __iomem *vaddr; +	struct drm_i915_gem_object *obj;  	int ret;  	if (intel_fb && @@ -232,13 +243,27 @@ static int intelfb_create(struct drm_fb_helper *helper,  	info->fbops = &intelfb_ops;  	/* setup aperture base/size for vesafb takeover */ -	info->apertures->ranges[0].base = ggtt->gmadr.start; -	info->apertures->ranges[0].size = ggtt->mappable_end; +	obj = intel_fb_obj(&intel_fb->base); +	if (i915_gem_object_is_lmem(obj)) { +		struct intel_memory_region *mem = obj->mm.region; + +		info->apertures->ranges[0].base = mem->io_start; +		info->apertures->ranges[0].size = mem->total; + +		/* Use fbdev's framebuffer from lmem for discrete */ +		info->fix.smem_start = +			(unsigned long)(mem->io_start + +					i915_gem_object_get_dma_address(obj, 0)); +		info->fix.smem_len = obj->base.size; +	} else { +		info->apertures->ranges[0].base = ggtt->gmadr.start; +		info->apertures->ranges[0].size = ggtt->mappable_end; -	/* Our framebuffer is the entirety of fbdev's system memory */ -	info->fix.smem_start = -		(unsigned long)(ggtt->gmadr.start + vma->node.start); -	info->fix.smem_len = vma->node.size; +		/* Our framebuffer is the entirety of fbdev's system memory */ +		info->fix.smem_start = +			(unsigned long)(ggtt->gmadr.start + vma->node.start); +		info->fix.smem_len = vma->node.size; +	}  	vaddr = i915_vma_pin_iomap(vma);  	if (IS_ERR(vaddr)) { diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c index 8161d49e78ba..8e75debcce1a 100644 --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c @@ -211,7 +211,6 @@ static int frontbuffer_active(struct i915_active *ref)  	return 0;  } -__i915_active_call  static void frontbuffer_retire(struct i915_active *ref)  {  	struct intel_frontbuffer *front = @@ -266,7 +265,8 @@ intel_frontbuffer_get(struct drm_i915_gem_object *obj)  	atomic_set(&front->bits, 0);  	i915_active_init(&front->write,  			 frontbuffer_active, -			 i915_active_may_sleep(frontbuffer_retire)); +			 frontbuffer_retire, +			 I915_ACTIVE_RETIRE_SLEEPS);  	spin_lock(&i915->fb_tracking.lock);  	if (rcu_access_pointer(obj->frontbuffer)) { diff --git a/drivers/gpu/drm/i915/display/intel_overlay.c b/drivers/gpu/drm/i915/display/intel_overlay.c index 46cba12be888..7e3f5c6ca484 100644 --- a/drivers/gpu/drm/i915/display/intel_overlay.c +++ b/drivers/gpu/drm/i915/display/intel_overlay.c @@ -384,8 +384,7 @@ static void intel_overlay_off_tail(struct intel_overlay *overlay)  		i830_overlay_clock_gating(dev_priv, true);  } -__i915_active_call static void -intel_overlay_last_flip_retire(struct i915_active *active) +static void intel_overlay_last_flip_retire(struct i915_active *active)  {  	struct intel_overlay *overlay =  		container_of(active, typeof(*overlay), last_flip); @@ -1402,7 +1401,7 @@ void intel_overlay_setup(struct drm_i915_private *dev_priv)  	overlay->saturation = 146;  	i915_active_init(&overlay->last_flip, -			 NULL, intel_overlay_last_flip_retire); +			 NULL, intel_overlay_last_flip_retire, 0);  	ret = get_registers(overlay, OVERLAY_NEEDS_PHYSICAL(dev_priv));  	if (ret) | 
