From 72217a6771a3a1401743194d9d9430e65f6b3a0a Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Wed, 2 Nov 2022 16:00:57 +0100 Subject: [PATCH] intel_fb: support larger resolutions Increase "assumed" internal kernel memory size based on available memory to support allocation of framebuffer larger than 16M, which was before hardcoded. Issue #4659 --- repos/pc/run/intel_fb.run | 4 ++-- repos/pc/src/drivers/framebuffer/intel/pc/emul.cc | 6 ++++++ repos/pc/src/drivers/framebuffer/intel/pc/gem.c | 13 +++++++++---- repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.c | 8 +++----- repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.h | 2 ++ 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/repos/pc/run/intel_fb.run b/repos/pc/run/intel_fb.run index 4689dc1d61..7a9f58f57b 100644 --- a/repos/pc/run/intel_fb.run +++ b/repos/pc/run/intel_fb.run @@ -216,7 +216,7 @@ append config { append_if $use_gpu config { - + @@ -241,7 +241,7 @@ append_if $use_gpu config { append config { - + } append_if $use_gpu config { diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/emul.cc b/repos/pc/src/drivers/framebuffer/intel/pc/emul.cc index 0baedcea44..76d1084a91 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/emul.cc +++ b/repos/pc/src/drivers/framebuffer/intel/pc/emul.cc @@ -48,3 +48,9 @@ unsigned short emul_intel_gmch_control_reg() return ret; } + + +unsigned long long emul_avail_ram() +{ + return Lx_kit::env().env.pd().avail_ram().value; +} diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/gem.c b/repos/pc/src/drivers/framebuffer/intel/pc/gem.c index 7e7ad9646d..5729c9bf8a 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/gem.c +++ b/repos/pc/src/drivers/framebuffer/intel/pc/gem.c @@ -333,9 +333,6 @@ void i915_gem_driver_register(struct drm_i915_private * i915) void i915_gem_init_early(struct drm_i915_private *dev_priv) { - /* 4 * 4M XXX */ - unsigned const ram_pages = 4 * 1024; - i915_gem_init__mm(dev_priv); /* i915_gem_init__contexts(dev_priv); @@ -345,7 +342,15 @@ void i915_gem_init_early(struct drm_i915_private *dev_priv) spin_lock_init(&dev_priv->fb_tracking.lock); - totalram_pages_add(ram_pages); + /* + * Used by resource_size() check in shmem_get_pages in + * drivers/gpu/drm/i915/gem/i915_gem_shmem.c and initialized in + * i915_gem_shmem_setup() using totalram_pages() + * + * The memory is managed by Genode, so we have just to provide a + * value which is "big" enough truncated by the max available memory. + */ + totalram_pages_add(emul_avail_ram() / 4096); } diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.c b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.c index e24a50d9d6..aaf96dafde 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.c +++ b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.c @@ -44,13 +44,9 @@ void intel_wopcm_init_early(struct intel_wopcm * wopcm) void si_meminfo(struct sysinfo * val) { - /* 4M, ttm actually use only half - more or configurable XXX ? */ - unsigned const ram_pages = 1024; + unsigned long long const ram_pages = emul_avail_ram() / PAGE_SIZE; /* used by drivers/gpu/drm/ttm/ttm_device.c */ - - lx_emul_trace(__func__); - val->totalram = ram_pages; val->sharedram = 0; val->freeram = ram_pages; @@ -58,6 +54,8 @@ void si_meminfo(struct sysinfo * val) val->totalhigh = 0; val->freehigh = 0; val->mem_unit = PAGE_SIZE; + + lx_emul_trace(__func__); } diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.h b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.h index aa6eb2c74e..7956705a14 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.h +++ b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.h @@ -38,6 +38,8 @@ unsigned short emul_intel_gmch_control_reg(void); enum { OPREGION_PSEUDO_PHYS_ADDR = 0xffffefff }; +unsigned long long emul_avail_ram(void); + #ifdef __cplusplus } #endif