diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/dummies.c b/repos/pc/src/drivers/framebuffer/intel/pc/dummies.c index ebc603ac65..0b6603d66a 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/dummies.c +++ b/repos/pc/src/drivers/framebuffer/intel/pc/dummies.c @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2021-2022 Genode Labs GmbH + * Copyright (C) 2021-2024 Genode Labs GmbH * * This file is distributed under the terms of the GNU General Public License * version 2. @@ -820,3 +820,27 @@ void devm_pinctrl_put(struct pinctrl * p) { lx_emul_trace(__func__); } + + +void check_move_unevictable_pages(struct pagevec * pvec) +{ + lx_emul_trace(__func__); +} + + +void intel_gt_flush_ggtt_writes(struct intel_gt * gt) +{ + lx_emul_trace(__func__); +} + + +void intel_gt_invalidate_tlb(struct intel_gt * gt,u32 seqno) +{ + lx_emul_trace(__func__); +} + + +void mark_page_accessed(struct page * page) +{ + lx_emul_trace(__func__); +} diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/generated_dummies.c b/repos/pc/src/drivers/framebuffer/intel/pc/generated_dummies.c index ba67e0729b..c201d26c0b 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/generated_dummies.c +++ b/repos/pc/src/drivers/framebuffer/intel/pc/generated_dummies.c @@ -236,14 +236,6 @@ void bust_spinlocks(int yes) } -#include - -void check_move_unevictable_pages(struct pagevec * pvec) -{ - lx_emul_trace_and_stop(__func__); -} - - #include bool clear_page_dirty_for_io(struct page * page) @@ -1224,20 +1216,6 @@ void intel_gt_driver_unregister(struct intel_gt * gt) } -extern void intel_gt_flush_ggtt_writes(struct intel_gt * gt); -void intel_gt_flush_ggtt_writes(struct intel_gt * gt) -{ - lx_emul_trace_and_stop(__func__); -} - - -extern void intel_gt_invalidate_tlb(struct intel_gt * gt,u32 seqno); -void intel_gt_invalidate_tlb(struct intel_gt * gt,u32 seqno) -{ - lx_emul_trace_and_stop(__func__); -} - - extern u32 intel_gt_mcr_read_any(struct intel_gt * gt,i915_reg_t reg); u32 intel_gt_mcr_read_any(struct intel_gt * gt,i915_reg_t reg) { @@ -1586,14 +1564,6 @@ void kmsg_dump(enum kmsg_dump_reason reason) } -#include - -void mark_page_accessed(struct page * page) -{ - lx_emul_trace_and_stop(__func__); -} - - #include void memunmap(void * addr) diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/lx_user.c b/repos/pc/src/drivers/framebuffer/intel/pc/lx_user.c index 3f725ff23f..78b4a810e8 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/lx_user.c +++ b/repos/pc/src/drivers/framebuffer/intel/pc/lx_user.c @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2022-2023 Genode Labs GmbH + * Copyright (C) 2022-2024 Genode Labs GmbH * * This file is distributed under the terms of the GNU General Public License * version 2. @@ -602,13 +602,16 @@ static int fb_client_hotplug(struct drm_client_dev *client) if (result) { printk("%s: error on modeset commit %d%s\n", __func__, result, - (result == -ENOSPC) ? " - insufficient amount of RAM for framebuffer" : ""); + (result == -ENOSPC) ? " - ENOSPC" : " - unknown error"); } } /* notify Genode side */ lx_emul_i915_hotplug_connector(client); + if (fb) + drm_framebuffer_put(fb); + return result; } @@ -694,8 +697,8 @@ static int user_register_fb(struct drm_client_dev const * const dev, int result = -EINVAL; struct i915_gtt_view const view = { .type = I915_GTT_VIEW_NORMAL }; - unsigned long flags = 0; - struct i915_vma *vma = NULL; + static struct i915_vma *vma = NULL; + static unsigned long flags = 0; void __iomem *vaddr = NULL; struct drm_i915_private *dev_priv = to_i915(dev->dev); struct drm_framebuffer *fb = drm_framebuffer_lookup(dev->dev, @@ -709,6 +712,13 @@ static int user_register_fb(struct drm_client_dev const * const dev, wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm); + if (vma) { + intel_unpin_fb_vma(vma, flags); + + vma = NULL; + flags = 0; + } + /* Pin the GGTT vma for our access via info->screen_base. * This also validates that any existing fb inherited from the * BIOS is suitable for own access. @@ -744,6 +754,9 @@ static int user_register_fb(struct drm_client_dev const * const dev, register_framebuffer(info); + if (fb) + drm_framebuffer_put(fb); + return 0; } @@ -762,13 +775,18 @@ static int check_resize_fb(struct drm_client_dev * const dev, /* if requested size is smaller, free up current dumb buffer */ if (gem_dumb->width && gem_dumb->height && - gem_dumb->width * gem_dumb->height < width * height) { + (gem_dumb->width < width || gem_dumb->height < height)) { + + result = drm_mode_rmfb(dev->dev, dumb_fb->fb_id, dev->file); + if (result) { + drm_err(dev->dev, "%s: failed to remove framebufer %d\n", + __func__, result); + } result = drm_mode_destroy_dumb(dev->dev, gem_dumb->handle, dev->file); if (result) { drm_err(dev->dev, "%s: failed to destroy framebuffer %d\n", __func__, result); - return result; } memset(gem_dumb, 0, sizeof(*gem_dumb)); @@ -792,7 +810,7 @@ static int check_resize_fb(struct drm_client_dev * const dev, } } - /* bind framwbuffer(GEM object) to drm client */ + /* bind framebuffer(GEM object) to drm client */ if (!dumb_fb->width && !dumb_fb->height) { /* .fb_id <- written by kernel */ dumb_fb->width = gem_dumb->width,