mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 23:03:57 -04:00
Merge drm/drm-next into drm-intel-gt-next
Need to pull in commit from drm-next (earlier in drm-intel-next):
1eca0778f4 ("drm/i915: add struct i915_dsm to wrap dsm members together")
In order to merge following patch to drm-intel-gt-next:
https://patchwork.freedesktop.org/patch/530942/?series=114925&rev=6
Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
This commit is contained in:
@@ -181,7 +181,7 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
|
||||
* important and we should probably use that space with FBC or other
|
||||
* features.
|
||||
*/
|
||||
if (size * 2 < dev_priv->stolen_usable_size)
|
||||
if (size * 2 < dev_priv->dsm.usable_size)
|
||||
obj = i915_gem_object_create_stolen(dev_priv, size);
|
||||
if (IS_ERR(obj))
|
||||
obj = i915_gem_object_create_shmem(dev_priv, size);
|
||||
@@ -220,6 +220,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
|
||||
bool prealloc = false;
|
||||
void __iomem *vaddr;
|
||||
struct drm_i915_gem_object *obj;
|
||||
struct i915_gem_ww_ctx ww;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&ifbdev->hpd_lock);
|
||||
@@ -277,36 +278,40 @@ static int intelfb_create(struct drm_fb_helper *helper,
|
||||
|
||||
info->fbops = &intelfb_ops;
|
||||
|
||||
/* setup aperture base/size for vesafb takeover */
|
||||
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->io_size;
|
||||
|
||||
/* 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 + i915_ggtt_offset(vma));
|
||||
info->fix.smem_len = vma->size;
|
||||
}
|
||||
|
||||
vaddr = i915_vma_pin_iomap(vma);
|
||||
if (IS_ERR(vaddr)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"Failed to remap framebuffer into virtual memory (%pe)\n", vaddr);
|
||||
ret = PTR_ERR(vaddr);
|
||||
goto out_unpin;
|
||||
for_i915_gem_ww(&ww, ret, false) {
|
||||
ret = i915_gem_object_lock(vma->obj, &ww);
|
||||
|
||||
if (ret)
|
||||
continue;
|
||||
|
||||
vaddr = i915_vma_pin_iomap(vma);
|
||||
if (IS_ERR(vaddr)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"Failed to remap framebuffer into virtual memory (%pe)\n", vaddr);
|
||||
ret = PTR_ERR(vaddr);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret)
|
||||
goto out_unpin;
|
||||
|
||||
info->screen_base = vaddr;
|
||||
info->screen_size = vma->size;
|
||||
|
||||
@@ -338,8 +343,20 @@ out_unlock:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int intelfb_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *clip)
|
||||
{
|
||||
if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
|
||||
return 0;
|
||||
|
||||
if (helper->fb->funcs->dirty)
|
||||
return helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
|
||||
.fb_probe = intelfb_create,
|
||||
.fb_dirty = intelfb_dirty,
|
||||
};
|
||||
|
||||
static void intel_fbdev_destroy(struct intel_fbdev *ifbdev)
|
||||
@@ -357,6 +374,7 @@ static void intel_fbdev_destroy(struct intel_fbdev *ifbdev)
|
||||
if (ifbdev->fb)
|
||||
drm_framebuffer_remove(&ifbdev->fb->base);
|
||||
|
||||
drm_fb_helper_unprepare(&ifbdev->helper);
|
||||
kfree(ifbdev);
|
||||
}
|
||||
|
||||
@@ -537,10 +555,12 @@ int intel_fbdev_init(struct drm_device *dev)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_init(&ifbdev->hpd_lock);
|
||||
drm_fb_helper_prepare(dev, &ifbdev->helper, &intel_fb_helper_funcs);
|
||||
drm_fb_helper_prepare(dev, &ifbdev->helper, 32, &intel_fb_helper_funcs);
|
||||
|
||||
if (!intel_fbdev_init_bios(dev, ifbdev))
|
||||
ifbdev->preferred_bpp = 32;
|
||||
if (intel_fbdev_init_bios(dev, ifbdev))
|
||||
ifbdev->helper.preferred_bpp = ifbdev->preferred_bpp;
|
||||
else
|
||||
ifbdev->preferred_bpp = ifbdev->helper.preferred_bpp;
|
||||
|
||||
ret = drm_fb_helper_init(dev, &ifbdev->helper);
|
||||
if (ret) {
|
||||
@@ -559,14 +579,13 @@ static void intel_fbdev_initial_config(void *data, async_cookie_t cookie)
|
||||
struct intel_fbdev *ifbdev = data;
|
||||
|
||||
/* Due to peculiar init order wrt to hpd handling this is separate. */
|
||||
if (drm_fb_helper_initial_config(&ifbdev->helper,
|
||||
ifbdev->preferred_bpp))
|
||||
if (drm_fb_helper_initial_config(&ifbdev->helper))
|
||||
intel_fbdev_unregister(to_i915(ifbdev->helper.dev));
|
||||
}
|
||||
|
||||
void intel_fbdev_initial_config_async(struct drm_device *dev)
|
||||
void intel_fbdev_initial_config_async(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct intel_fbdev *ifbdev = to_i915(dev)->display.fbdev.fbdev;
|
||||
struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
|
||||
|
||||
if (!ifbdev)
|
||||
return;
|
||||
@@ -636,7 +655,13 @@ void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous
|
||||
struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
|
||||
struct fb_info *info;
|
||||
|
||||
if (!ifbdev || !ifbdev->vma)
|
||||
if (!ifbdev)
|
||||
return;
|
||||
|
||||
if (drm_WARN_ON(&dev_priv->drm, !HAS_DISPLAY(dev_priv)))
|
||||
return;
|
||||
|
||||
if (!ifbdev->vma)
|
||||
goto set_suspend;
|
||||
|
||||
info = ifbdev->helper.info;
|
||||
@@ -703,9 +728,9 @@ void intel_fbdev_output_poll_changed(struct drm_device *dev)
|
||||
drm_fb_helper_hotplug_event(&ifbdev->helper);
|
||||
}
|
||||
|
||||
void intel_fbdev_restore_mode(struct drm_device *dev)
|
||||
void intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct intel_fbdev *ifbdev = to_i915(dev)->display.fbdev.fbdev;
|
||||
struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
|
||||
|
||||
if (!ifbdev)
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user