diff --git a/repos/dde_linux/run/intel_fb.run b/repos/dde_linux/run/intel_fb.run
index 5fd4361da6..0ae21947d4 100644
--- a/repos/dde_linux/run/intel_fb.run
+++ b/repos/dde_linux/run/intel_fb.run
@@ -2,17 +2,23 @@
# Build
#
+set use_gpu 1
+set use_top 0
+
set build_components {
core init timer
- drivers/framebuffer/intel
+ drivers/framebuffer/intel/pc
test/framebuffer
server/report_rom
server/vfs
server/fs_rom
- app/top
lib/vfs/import
}
+
+append_if $use_gpu build_components { drivers/gpu/intel }
+append_if $use_top build_components { app/top }
+
source ${genode_dir}/repos/base/run/platform_drv.inc
append_platform_drv_build_components
@@ -81,13 +87,15 @@ append config {
-
+ }
+append_if $use_top config {
-
+ }
+append config {
@@ -124,12 +132,42 @@ append config {
-
+ }
-
-
-
+append_if $use_gpu config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+
+append config {
+
+
+
+ }
+
+append_if $use_gpu config {
+ }
+
+append config {
@@ -166,11 +204,13 @@ install_config $config
# generic modules
set boot_modules {
- core ld.lib.so init timer legacy_intel_fb_drv intel_fb_controller
+ core ld.lib.so init timer pc_intel_fb_drv intel_fb_controller
test-framebuffer report_rom fs_rom vfs vfs.lib.so vfs_import.lib.so
- top
}
+append_if $use_gpu boot_modules { intel_gpu_drv }
+append_if $use_top boot_modules { top }
+
append_platform_drv_boot_modules
build_boot_image $boot_modules
diff --git a/repos/gems/recipes/pkg/drivers_managed-pc/archives b/repos/gems/recipes/pkg/drivers_managed-pc/archives
index 12776a0544..fb21a714eb 100644
--- a/repos/gems/recipes/pkg/drivers_managed-pc/archives
+++ b/repos/gems/recipes/pkg/drivers_managed-pc/archives
@@ -5,7 +5,7 @@ _/src/pc_usb_host_drv
_/src/usb_hid_drv
_/src/usb_block_drv
_/src/vesa_drv
-_/src/legacy_intel_fb_drv
+_/src/pc_intel_fb_drv
_/src/intel_gpu_drv
_/src/boot_fb_drv
_/src/ahci_drv
diff --git a/repos/gems/sculpt/fb_drv/default b/repos/gems/sculpt/fb_drv/default
index 02376cfac6..d93fa209a7 100644
--- a/repos/gems/sculpt/fb_drv/default
+++ b/repos/gems/sculpt/fb_drv/default
@@ -1,5 +1,5 @@
-
+
-
-
+
+
diff --git a/repos/gems/src/app/driver_manager/main.cc b/repos/gems/src/app/driver_manager/main.cc
index 131a465f6a..fbac4c859c 100644
--- a/repos/gems/src/app/driver_manager/main.cc
+++ b/repos/gems/src/app/driver_manager/main.cc
@@ -164,7 +164,7 @@ struct Driver_manager::Intel_fb_driver : Device_driver
intel_gpu_driver.generate_start_node(xml);
xml.node("start", [&] () {
- _gen_common_start_node_content(xml, "intel_fb_drv", "legacy_intel_fb_drv",
+ _gen_common_start_node_content(xml, "intel_fb_drv", "pc_intel_fb_drv",
Ram_quota{42*1024*1024}, Cap_quota{800},
Priority{0}, version);
xml.node("heartbeat", [&] () { });
diff --git a/repos/pc/recipes/src/pc_intel_fb_drv/content.mk b/repos/pc/recipes/src/pc_intel_fb_drv/content.mk
new file mode 100644
index 0000000000..0d63f4a1c0
--- /dev/null
+++ b/repos/pc/recipes/src/pc_intel_fb_drv/content.mk
@@ -0,0 +1,13 @@
+MIRROR_FROM_REP_DIR := src/drivers/framebuffer/intel/pc \
+ src/lib/pc/lx_emul
+
+content: $(MIRROR_FROM_REP_DIR)
+
+PORT_DIR := $(call port_dir,$(GENODE_DIR)/repos/dde_linux/ports/linux)
+
+$(MIRROR_FROM_REP_DIR):
+ $(mirror_from_rep_dir)
+
+content: LICENSE
+LICENSE:
+ cp $(PORT_DIR)/src/linux/COPYING $@
diff --git a/repos/pc/recipes/src/pc_intel_fb_drv/hash b/repos/pc/recipes/src/pc_intel_fb_drv/hash
new file mode 100644
index 0000000000..52a256cb1b
--- /dev/null
+++ b/repos/pc/recipes/src/pc_intel_fb_drv/hash
@@ -0,0 +1 @@
+2022-03-18-b f8a33eb3aa079a798959ed3b6f5920239729933c
diff --git a/repos/pc/recipes/src/pc_intel_fb_drv/used_apis b/repos/pc/recipes/src/pc_intel_fb_drv/used_apis
new file mode 100644
index 0000000000..ba755919c7
--- /dev/null
+++ b/repos/pc/recipes/src/pc_intel_fb_drv/used_apis
@@ -0,0 +1,9 @@
+base
+os
+platform_session
+timer_session
+report_session
+capture_session
+blit
+genode_c_api
+pc_linux
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/README b/repos/pc/src/drivers/framebuffer/intel/pc/README
new file mode 100644
index 0000000000..0a6212b01f
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/README
@@ -0,0 +1,59 @@
+This driver is for Intel i915 compatible graphic cards.
+
+Default behaviour
+~~~~~~~~~~~~~~~~~
+
+When no configuration is provided to the driver, it will switch on all devices
+connected to the graphics card. It will use the best resolution as
+provided by the BIOS or EDID information from the display devices for each
+connector. The virtual resolution delivered to the client is the maximum in
+width and height of the different connectors. The framebuffer memory is
+directly exported to the client of the driver. When newly connected devices are
+detected by the hardware, the new connectors are enabled, probed, and again the
+'best' resolution will be chosen for the device. Nevertheless, it won't have an
+effect on the virtual resolution.
+
+Configuration
+~~~~~~~~~~~~~
+
+Each of the connectors can be configured explicitly in terms of resolution and
+whether it should be enabled or not. This looks like the following:
+
+!
+!
+!
+
+When the configuration changes during runtime, the driver will adapt to it. In
+this case, it will also change the current virtual resolution to the maximum of
+the configured resolutions in width and height, and it will inform its client
+about the change in resolution.
+
+The brightness value is in percent and takes effect only if supported by
+the hardware.
+
+The virtual resolution can be enforced by:
+
+!
+!
+
+To present all available connectors and their possible resolutions to the user,
+the driver is able to deliver a corresponding report, which can be enabled
+in the configuration as follows:
+
+!
+!
+!
+
+The exported report has the following format:
+
+!
+!
+!
+! ...
+!
+!
+!
+!
+
+The brightness attribute is reported only if the hardware supports it.
+
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/dep.list b/repos/pc/src/drivers/framebuffer/intel/pc/dep.list
new file mode 100644
index 0000000000..e42875d27f
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/dep.list
@@ -0,0 +1,567 @@
+arch/x86/include/asm/agp.h
+arch/x86/include/asm/desc.h
+arch/x86/include/asm/dma.h
+arch/x86/include/asm/e820/api.h
+arch/x86/include/asm/e820/types.h
+arch/x86/include/asm/exec.h
+arch/x86/include/asm/fb.h
+arch/x86/include/asm/hypervisor.h
+arch/x86/include/asm/intel-mid.h
+arch/x86/include/asm/invpcid.h
+arch/x86/include/asm/io_apic.h
+arch/x86/include/asm/io.h
+arch/x86/include/asm/iomap.h
+arch/x86/include/asm/iommu.h
+arch/x86/include/asm/iosf_mbi.h
+arch/x86/include/asm/jailhouse_para.h
+arch/x86/include/asm/kvm_para.h
+arch/x86/include/asm/memtype.h
+arch/x86/include/asm/mmu_context.h
+arch/x86/include/asm/nmi.h
+arch/x86/include/asm/mwait.h
+arch/x86/include/asm/paravirt.h
+arch/x86/include/asm/pci.h
+arch/x86/include/asm/pti.h
+arch/x86/include/asm/set_memory.h
+arch/x86/include/asm/special_insns.h
+arch/x86/include/asm/timer.h
+arch/x86/include/asm/tlbflush.h
+arch/x86/include/asm/tlb.h
+arch/x86/include/asm/vga.h
+arch/x86/include/uapi/asm/kvm_para.h
+arch/x86/include/uapi/asm/mman.h
+drivers/acpi/internal.h
+drivers/base/base.h
+drivers/base/power/power.h
+drivers/base/trace.h
+drivers/char/agp/agp.h
+drivers/char/agp/intel-agp.h
+drivers/gpu/drm/drm_crtc_helper_internal.h
+drivers/gpu/drm/drm_crtc_internal.h
+drivers/gpu/drm/drm_dp_mst_topology_internal.h
+drivers/gpu/drm/drm_internal.h
+drivers/gpu/drm/drm_legacy.h
+drivers/gpu/drm/drm_trace.h
+drivers/gpu/drm/i915/display/g4x_dp.h
+drivers/gpu/drm/i915/display/g4x_hdmi.h
+drivers/gpu/drm/i915/display/i9xx_plane.h
+drivers/gpu/drm/i915/display/intel_acpi.h
+drivers/gpu/drm/i915/display/intel_atomic.h
+drivers/gpu/drm/i915/display/intel_atomic_plane.h
+drivers/gpu/drm/i915/display/intel_audio.h
+drivers/gpu/drm/i915/display/intel_bios.h
+drivers/gpu/drm/i915/display/intel_bw.h
+drivers/gpu/drm/i915/display/intel_cdclk.h
+drivers/gpu/drm/i915/display/intel_color.h
+drivers/gpu/drm/i915/display/intel_combo_phy.h
+drivers/gpu/drm/i915/display/intel_connector.h
+drivers/gpu/drm/i915/display/intel_crtc.h
+drivers/gpu/drm/i915/display/intel_crt.h
+drivers/gpu/drm/i915/display/intel_cursor.h
+drivers/gpu/drm/i915/display/intel_ddi_buf_trans.h
+drivers/gpu/drm/i915/display/intel_ddi.h
+drivers/gpu/drm/i915/display/intel_de.h
+drivers/gpu/drm/i915/display/intel_display_debugfs.h
+drivers/gpu/drm/i915/display/intel_display.h
+drivers/gpu/drm/i915/display/intel_display_power.h
+drivers/gpu/drm/i915/display/intel_display_types.h
+drivers/gpu/drm/i915/display/intel_dmc.h
+drivers/gpu/drm/i915/display/intel_dp_aux_backlight.h
+drivers/gpu/drm/i915/display/intel_dp_aux.h
+drivers/gpu/drm/i915/display/intel_dp.h
+drivers/gpu/drm/i915/display/intel_dp_hdcp.h
+drivers/gpu/drm/i915/display/intel_dpio_phy.h
+drivers/gpu/drm/i915/display/intel_dp_link_training.h
+drivers/gpu/drm/i915/display/intel_dpll.h
+drivers/gpu/drm/i915/display/intel_dpll_mgr.h
+drivers/gpu/drm/i915/display/intel_dp_mst.h
+drivers/gpu/drm/i915/display/intel_dsb.h
+drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.h
+drivers/gpu/drm/i915/display/intel_dsi.h
+drivers/gpu/drm/i915/display/intel_dvo.h
+drivers/gpu/drm/i915/display/intel_fbc.h
+drivers/gpu/drm/i915/display/intel_fbdev.h
+drivers/gpu/drm/i915/display/intel_fb.h
+drivers/gpu/drm/i915/display/intel_fdi.h
+drivers/gpu/drm/i915/display/intel_fifo_underrun.h
+drivers/gpu/drm/i915/display/intel_frontbuffer.h
+drivers/gpu/drm/i915/display/intel_global_state.h
+drivers/gpu/drm/i915/display/intel_gmbus.h
+drivers/gpu/drm/i915/display/intel_hdcp.h
+drivers/gpu/drm/i915/display/intel_hdmi.h
+drivers/gpu/drm/i915/display/intel_hotplug.h
+drivers/gpu/drm/i915/display/intel_lpe_audio.h
+drivers/gpu/drm/i915/display/intel_lspcon.h
+drivers/gpu/drm/i915/display/intel_lvds.h
+drivers/gpu/drm/i915/display/intel_opregion.h
+drivers/gpu/drm/i915/display/intel_overlay.h
+drivers/gpu/drm/i915/display/intel_panel.h
+drivers/gpu/drm/i915/display/intel_pipe_crc.h
+drivers/gpu/drm/i915/display/intel_pps.h
+drivers/gpu/drm/i915/display/intel_psr.h
+drivers/gpu/drm/i915/display/intel_qp_tables.h
+drivers/gpu/drm/i915/display/intel_quirks.h
+drivers/gpu/drm/i915/display/intel_sdvo.h
+drivers/gpu/drm/i915/display/intel_sdvo_regs.h
+drivers/gpu/drm/i915/display/intel_sprite.h
+drivers/gpu/drm/i915/display/intel_tc.h
+drivers/gpu/drm/i915/display/intel_tv.h
+drivers/gpu/drm/i915/display/intel_vbt_defs.h
+drivers/gpu/drm/i915/display/intel_vdsc.h
+drivers/gpu/drm/i915/display/intel_vga.h
+drivers/gpu/drm/i915/display/intel_vrr.h
+drivers/gpu/drm/i915/display/skl_scaler.h
+drivers/gpu/drm/i915/display/skl_universal_plane.h
+drivers/gpu/drm/i915/dma_resv_utils.h
+drivers/gpu/drm/i915/gem/i915_gem_clflush.h
+drivers/gpu/drm/i915/gem/i915_gem_context.h
+drivers/gpu/drm/i915/gem/i915_gem_context_types.h
+drivers/gpu/drm/i915/gem/i915_gemfs.h
+drivers/gpu/drm/i915/gem/i915_gem_ioctls.h
+drivers/gpu/drm/i915/gem/i915_gem_lmem.h
+drivers/gpu/drm/i915/gem/i915_gem_mman.h
+drivers/gpu/drm/i915/gem/i915_gem_object.h
+drivers/gpu/drm/i915/gem/i915_gem_object_types.h
+drivers/gpu/drm/i915/gem/i915_gem_pm.h
+drivers/gpu/drm/i915/gem/i915_gem_region.h
+drivers/gpu/drm/i915/gem/i915_gem_shrinker.h
+drivers/gpu/drm/i915/gem/i915_gem_stolen.h
+drivers/gpu/drm/i915/gt/debugfs_gt.h
+drivers/gpu/drm/i915/gt/gen8_ppgtt.h
+drivers/gpu/drm/i915/gt/intel_breadcrumbs.h
+drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
+drivers/gpu/drm/i915/gt/intel_context.h
+drivers/gpu/drm/i915/gt/intel_context_types.h
+drivers/gpu/drm/i915/gt/intel_engine.h
+drivers/gpu/drm/i915/gt/intel_engine_heartbeat.h
+drivers/gpu/drm/i915/gt/intel_engine_pm.h
+drivers/gpu/drm/i915/gt/intel_engine_types.h
+drivers/gpu/drm/i915/gt/intel_engine_user.h
+drivers/gpu/drm/i915/gt/intel_execlists_submission.h
+drivers/gpu/drm/i915/gt/intel_ggtt_fencing.h
+drivers/gpu/drm/i915/gt/intel_gpu_commands.h
+drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.h
+drivers/gpu/drm/i915/gt/intel_gt_buffer_pool_types.h
+drivers/gpu/drm/i915/gt/intel_gt_clock_utils.h
+drivers/gpu/drm/i915/gt/intel_gt.h
+drivers/gpu/drm/i915/gt/intel_gt_irq.h
+drivers/gpu/drm/i915/gt/intel_gt_pm.h
+drivers/gpu/drm/i915/gt/intel_gt_pm_irq.h
+drivers/gpu/drm/i915/gt/intel_gt_requests.h
+drivers/gpu/drm/i915/gt/intel_gtt.h
+drivers/gpu/drm/i915/gt/intel_gt_types.h
+drivers/gpu/drm/i915/gt/intel_llc.h
+drivers/gpu/drm/i915/gt/intel_llc_types.h
+drivers/gpu/drm/i915/gt/intel_mocs.h
+drivers/gpu/drm/i915/gt/intel_rc6.h
+drivers/gpu/drm/i915/gt/intel_rc6_types.h
+drivers/gpu/drm/i915/gt/intel_region_lmem.h
+drivers/gpu/drm/i915/gt/intel_renderstate.h
+drivers/gpu/drm/i915/gt/intel_reset.h
+drivers/gpu/drm/i915/gt/intel_reset_types.h
+drivers/gpu/drm/i915/gt/intel_ring.h
+drivers/gpu/drm/i915/gt/intel_ring_types.h
+drivers/gpu/drm/i915/gt/intel_rps.h
+drivers/gpu/drm/i915/gt/intel_rps_types.h
+drivers/gpu/drm/i915/gt/intel_sseu.h
+drivers/gpu/drm/i915/gt/intel_timeline.h
+drivers/gpu/drm/i915/gt/intel_timeline_types.h
+drivers/gpu/drm/i915/gt/intel_workarounds.h
+drivers/gpu/drm/i915/gt/intel_workarounds_types.h
+drivers/gpu/drm/i915/gt/shmem_utils.h
+drivers/gpu/drm/i915/gt/sysfs_engines.h
+drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h
+drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h
+drivers/gpu/drm/i915/gt/uc/abi/guc_communication_mmio_abi.h
+drivers/gpu/drm/i915/gt/uc/abi/guc_errors_abi.h
+drivers/gpu/drm/i915/gt/uc/abi/guc_messages_abi.h
+drivers/gpu/drm/i915/gt/uc/intel_guc_ct.h
+drivers/gpu/drm/i915/gt/uc/intel_guc_fw.h
+drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h
+drivers/gpu/drm/i915/gt/uc/intel_guc.h
+drivers/gpu/drm/i915/gt/uc/intel_guc_log.h
+drivers/gpu/drm/i915/gt/uc/intel_guc_reg.h
+drivers/gpu/drm/i915/gt/uc/intel_guc_submission.h
+drivers/gpu/drm/i915/gt/uc/intel_huc_fw.h
+drivers/gpu/drm/i915/gt/uc/intel_huc.h
+drivers/gpu/drm/i915/gt/uc/intel_uc_fw_abi.h
+drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h
+drivers/gpu/drm/i915/gt/uc/intel_uc.h
+drivers/gpu/drm/i915/i915_active.h
+drivers/gpu/drm/i915/i915_active_types.h
+drivers/gpu/drm/i915/i915_debugfs.h
+drivers/gpu/drm/i915/i915_drv.h
+drivers/gpu/drm/i915/i915_fixed.h
+drivers/gpu/drm/i915/i915_gem_gtt.h
+drivers/gpu/drm/i915/i915_gem.h
+drivers/gpu/drm/i915/i915_globals.h
+drivers/gpu/drm/i915/i915_gpu_error.h
+drivers/gpu/drm/i915/i915_ioc32.h
+drivers/gpu/drm/i915/i915_irq.h
+drivers/gpu/drm/i915/i915_memcpy.h
+drivers/gpu/drm/i915/i915_mitigations.h
+drivers/gpu/drm/i915/i915_params.h
+drivers/gpu/drm/i915/i915_perf.h
+drivers/gpu/drm/i915/i915_perf_types.h
+drivers/gpu/drm/i915/i915_pmu.h
+drivers/gpu/drm/i915/i915_priolist_types.h
+drivers/gpu/drm/i915/i915_pvinfo.h
+drivers/gpu/drm/i915/i915_query.h
+drivers/gpu/drm/i915/i915_reg.h
+drivers/gpu/drm/i915/i915_request.h
+drivers/gpu/drm/i915/i915_scatterlist.h
+drivers/gpu/drm/i915/i915_scheduler.h
+drivers/gpu/drm/i915/i915_scheduler_types.h
+drivers/gpu/drm/i915/i915_selftest.h
+drivers/gpu/drm/i915/i915_suspend.h
+drivers/gpu/drm/i915/i915_sw_fence.h
+drivers/gpu/drm/i915/i915_sw_fence_work.h
+drivers/gpu/drm/i915/i915_switcheroo.h
+drivers/gpu/drm/i915/i915_syncmap.h
+drivers/gpu/drm/i915/i915_sysfs.h
+drivers/gpu/drm/i915/i915_trace.h
+drivers/gpu/drm/i915/i915_utils.h
+drivers/gpu/drm/i915/i915_vgpu.h
+drivers/gpu/drm/i915/i915_vma.h
+drivers/gpu/drm/i915/i915_vma_types.h
+drivers/gpu/drm/i915/intel_device_info.h
+drivers/gpu/drm/i915/intel_dram.h
+drivers/gpu/drm/i915/intel_gvt.h
+drivers/gpu/drm/i915/intel_memory_region.h
+drivers/gpu/drm/i915/intel_pch.h
+drivers/gpu/drm/i915/intel_pm.h
+drivers/gpu/drm/i915/intel_region_ttm.h
+drivers/gpu/drm/i915/intel_runtime_pm.h
+drivers/gpu/drm/i915/intel_sideband.h
+drivers/gpu/drm/i915/intel_step.h
+drivers/gpu/drm/i915/intel_uncore.h
+drivers/gpu/drm/i915/intel_wakeref.h
+drivers/gpu/drm/i915/intel_wopcm.h
+drivers/gpu/drm/i915/vlv_suspend.h
+drivers/gpu/drm/ttm/ttm_module.h
+drivers/i2c/i2c-core.h
+drivers/pci/pcie/portdrv.h
+drivers/pci/pci.h
+drivers/platform/x86/intel_ips.h
+include/acpi/button.h
+include/acpi/video.h
+include/asm-generic/mmu_context.h
+include/asm-generic/pci.h
+include/asm-generic/set_memory.h
+include/asm-generic/tlb.h
+include/asm-generic/unaligned.h
+include/drm/drm_aperture.h
+include/drm/drm_atomic.h
+include/drm/drm_atomic_helper.h
+include/drm/drm_atomic_state_helper.h
+include/drm/drm_atomic_uapi.h
+include/drm/drm_audio_component.h
+include/drm/drm_auth.h
+include/drm/drm_blend.h
+include/drm/drm_bridge.h
+include/drm/drm_cache.h
+include/drm/drm_client.h
+include/drm/drm_color_mgmt.h
+include/drm/drm_connector.h
+include/drm/drm_crtc.h
+include/drm/drm_crtc_helper.h
+include/drm/drm_damage_helper.h
+include/drm/drm_debugfs_crc.h
+include/drm/drm_debugfs.h
+include/drm/drm_device.h
+include/drm/drm_displayid.h
+include/drm/drm_dp_dual_mode_helper.h
+include/drm/drm_dp_helper.h
+include/drm/drm_dp_mst_helper.h
+include/drm/drm_drv.h
+include/drm/drm_dsc.h
+include/drm/drm_edid.h
+include/drm/drm_encoder.h
+include/drm/drm_fb_helper.h
+include/drm/drm_file.h
+include/drm/drm_fourcc.h
+include/drm/drm_framebuffer.h
+include/drm/drm_gem.h
+include/drm/drm_hashtab.h
+include/drm/drm_hdcp.h
+include/drm/drm_ioctl.h
+include/drm/drm_lease.h
+include/drm/drm_legacy.h
+include/drm/drm_managed.h
+include/drm/drm_mipi_dsi.h
+include/drm/drm_mm.h
+include/drm/drm_mode_config.h
+include/drm/drm_mode_object.h
+include/drm/drm_modeset_helper.h
+include/drm/drm_modeset_helper_vtables.h
+include/drm/drm_modeset_lock.h
+include/drm/drm_modes.h
+include/drm/drm_plane.h
+include/drm/drm_plane_helper.h
+include/drm/drm_prime.h
+include/drm/drm_print.h
+include/drm/drm_probe_helper.h
+include/drm/drm_property.h
+include/drm/drm_rect.h
+include/drm/drm_scdc_helper.h
+include/drm/drm_self_refresh_helper.h
+include/drm/drm_syncobj.h
+include/drm/drm_sysfs.h
+include/drm/drm_util.h
+include/drm/drm_utils.h
+include/drm/drm_vblank.h
+include/drm/drm_vblank_work.h
+include/drm/drm_vma_manager.h
+include/drm/drm_writeback.h
+include/drm/i915_component.h
+include/drm/i915_drm.h
+include/drm/i915_mei_hdcp_interface.h
+include/drm/i915_pciids.h
+include/drm/intel-gtt.h
+include/drm/intel_lpe_audio.h
+include/drm/ttm/ttm_bo_api.h
+include/drm/ttm/ttm_bo_driver.h
+include/drm/ttm/ttm_caching.h
+include/drm/ttm/ttm_device.h
+include/drm/ttm/ttm_kmap_iter.h
+include/drm/ttm/ttm_placement.h
+include/drm/ttm/ttm_pool.h
+include/drm/ttm/ttm_range_manager.h
+include/drm/ttm/ttm_resource.h
+include/drm/ttm/ttm_tt.h
+include/dt-bindings/i2c/i2c.h
+include/linux/acpi_iort.h
+include/linux/aer.h
+include/linux/agp_backend.h
+include/linux/anon_inodes.h
+include/linux/audit.h
+include/linux/average.h
+include/linux/backlight.h
+include/linux/binfmts.h
+include/linux/bitfield.h
+include/linux/bitrev.h
+include/linux/circ_buf.h
+include/linux/clk/clk-conf.h
+include/linux/component.h
+include/linux/consolemap.h
+include/linux/console_struct.h
+include/linux/context_tracking.h
+include/linux/cpuidle.h
+include/linux/cpuset.h
+include/linux/crc32.h
+include/linux/delayacct.h
+include/linux/dma-buf.h
+include/linux/dma-buf-map.h
+include/linux/dma-fence-array.h
+include/linux/dma-fence-chain.h
+include/linux/dma-fence.h
+include/linux/dma-map-ops.h
+include/linux/dmapool.h
+include/linux/dma-resv.h
+include/linux/dmar.h
+include/linux/dmi.h
+include/linux/dynamic_queue_limits.h
+include/linux/efi.h
+include/linux/etherdevice.h
+include/linux/ethtool.h
+include/linux/fault-inject.h
+include/linux/fbcon.h
+include/linux/fb.h
+include/linux/firmware.h
+include/linux/fs_parser.h
+include/linux/genetlink.h
+include/linux/gpio/machine.h
+include/linux/hdmi.h
+include/linux/hugetlb.h
+include/linux/hypervisor.h
+include/linux/i2c-algo-bit.h
+include/linux/i2c.h
+include/linux/i2c-smbus.h
+include/linux/if_ether.h
+include/linux/if_link.h
+include/linux/init_task.h
+include/linux/input.h
+include/linux/intel-iommu.h
+include/linux/interval_tree_generic.h
+include/linux/io-64-nonatomic-lo-hi.h
+include/linux/ioasid.h
+include/linux/io-mapping.h
+include/linux/iommu.h
+include/linux/iopoll.h
+include/linux/iova.h
+include/linux/jhash.h
+include/linux/kfifo.h
+include/linux/kmemleak.h
+include/linux/kvm_para.h
+include/linux/linkmode.h
+include/linux/linux_logo.h
+include/linux/list_sort.h
+include/linux/livepatch.h
+include/linux/mdio.h
+include/linux/memblock.h
+include/linux/mfd/intel_soc_pmic.h
+include/linux/migrate.h
+include/linux/mii.h
+include/linux/mii_timestamper.h
+include/linux/mman.h
+include/linux/mmu_context.h
+include/linux/netdevice.h
+include/linux/netlink.h
+include/linux/nls.h
+include/linux/nmi.h
+include/linux/nvme.h
+include/linux/of_device.h
+include/linux/of_graph.h
+include/linux/of_pci.h
+include/linux/of_platform.h
+include/linux/oom.h
+include/linux/pagevec.h
+include/linux/panic_notifier.h
+include/linux/pci-acpi.h
+include/linux/pci-dma-compat.h
+include/linux/pci.h
+include/linux/pci_hotplug.h
+include/linux/pci_ids.h
+include/linux/phy.h
+include/linux/pinctrl/consumer.h
+include/linux/pinctrl/devinfo.h
+include/linux/pinctrl/machine.h
+include/linux/pinctrl/pinctrl-state.h
+include/linux/pkeys.h
+include/linux/platform_data/x86/apple.h
+include/linux/platform_device.h
+include/linux/pm_domain.h
+include/linux/pm_wakeirq.h
+include/linux/pnp.h
+include/linux/psi.h
+include/linux/pstore.h
+include/linux/pvclock_gtod.h
+include/linux/pwm.h
+include/linux/rbtree_augmented.h
+include/linux/rcupdate_wait.h
+include/linux/regmap.h
+include/linux/regulator/consumer.h
+include/linux/relay.h
+include/linux/ring_buffer.h
+include/linux/rtmutex.h
+include/linux/sched/autogroup.h
+include/linux/sched_clock.h
+include/linux/sched/cputime.h
+include/linux/sched/deadline.h
+include/linux/sched/debug.h
+include/linux/sched/hotplug.h
+include/linux/sched/init.h
+include/linux/sched/loadavg.h
+include/linux/sched/nohz.h
+include/linux/sched/numa_balancing.h
+include/linux/sched/smt.h
+include/linux/sched/stat.h
+include/linux/sched/sysctl.h
+include/linux/sched/wake_q.h
+include/linux/sched/xacct.h
+include/linux/securebits.h
+include/linux/seq_buf.h
+include/linux/shmem_fs.h
+include/linux/smpboot.h
+include/linux/sort.h
+include/linux/swiotlb.h
+include/linux/switchtec.h
+include/linux/sync_file.h
+include/linux/syscalls.h
+include/linux/syscore_ops.h
+include/linux/timecounter.h
+include/linux/timekeeper_internal.h
+include/linux/trace_events.h
+include/linux/trace_seq.h
+include/linux/tsacct_kern.h
+include/linux/userfaultfd_k.h
+include/linux/utsname.h
+include/linux/vgaarb.h
+include/linux/vga_switcheroo.h
+include/linux/vt_kern.h
+include/linux/xattr.h
+include/media/cec.h
+include/media/cec-notifier.h
+include/media/rc-core.h
+include/media/rc-map.h
+include/net/genetlink.h
+include/net/netlink.h
+include/net/netprio_cgroup.h
+include/net/scm.h
+include/net/xdp.h
+include/trace/events/dma_fence.h
+include/trace/events/i2c.h
+include/trace/events/irq.h
+include/trace/events/power.h
+include/trace/events/sched.h
+include/trace/events/timer.h
+include/trace/events/tlb.h
+include/trace/events/workqueue.h
+include/trace/syscall.h
+include/uapi/asm-generic/mman-common.h
+include/uapi/asm-generic/mman.h
+include/uapi/drm/drm_fourcc.h
+include/uapi/drm/drm.h
+include/uapi/drm/drm_mode.h
+include/uapi/drm/i915_drm.h
+include/uapi/linux/audit.h
+include/uapi/linux/binfmts.h
+include/uapi/linux/cec-funcs.h
+include/uapi/linux/cec.h
+include/uapi/linux/ethtool.h
+include/uapi/linux/fb.h
+include/uapi/linux/genetlink.h
+include/uapi/linux/i2c.h
+include/uapi/linux/if_bonding.h
+include/uapi/linux/if_link.h
+include/uapi/linux/input-event-codes.h
+include/uapi/linux/input.h
+include/uapi/linux/iommu.h
+include/uapi/linux/kd.h
+include/uapi/linux/kvm_para.h
+include/uapi/linux/lirc.h
+include/uapi/linux/mdio.h
+include/uapi/linux/media-bus-format.h
+include/uapi/linux/membarrier.h
+include/uapi/linux/mii.h
+include/uapi/linux/mman.h
+include/uapi/linux/neighbour.h
+include/uapi/linux/netdevice.h
+include/uapi/linux/netfilter/nf_tables.h
+include/uapi/linux/netlink.h
+include/uapi/linux/oom.h
+include/uapi/linux/pci.h
+include/uapi/linux/pci_regs.h
+include/uapi/linux/pkt_cls.h
+include/uapi/linux/pkt_sched.h
+include/uapi/linux/securebits.h
+include/uapi/linux/utsname.h
+include/uapi/linux/xattr.h
+include/video/display_timing.h
+include/video/of_videomode.h
+include/video/mipi_display.h
+include/video/vga.h
+include/video/videomode.h
+include/xen/balloon.h
+include/xen/interface/hvm/start_info.h
+include/xen/xen.h
+kernel/irq/debug.h
+kernel/irq/internals.h
+kernel/irq/settings.h
+kernel/locking/lock_events.h
+kernel/locking/lock_events_list.h
+kernel/locking/mutex.h
+kernel/locking/rtmutex_common.h
+kernel/sched/autogroup.h
+kernel/sched/cpudeadline.h
+kernel/sched/cpupri.h
+kernel/sched/features.h
+kernel/sched/sched.h
+kernel/sched/stats.h
+kernel/smpboot.h
+kernel/time/ntp_internal.h
+kernel/time/tick-internal.h
+kernel/time/tick-sched.h
+kernel/time/timekeeping.h
+kernel/time/timekeeping_internal.h
+kernel/workqueue_internal.h
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/dummies.c b/repos/pc/src/drivers/framebuffer/intel/pc/dummies.c
new file mode 100644
index 0000000000..f1badb057a
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/dummies.c
@@ -0,0 +1,713 @@
+/*
+ * \brief Dummy definitions of Linux Kernel functions - handled manually
+ * \author Alexander Boettcher
+ * \date 2022-01-21
+ */
+
+/*
+ * Copyright (C) 2021-2022 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+#include
+
+#include "i915_drv.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+
+unsigned long init_stack[THREAD_SIZE / sizeof(unsigned long)];
+unsigned long lpj_fine = 0;
+
+
+const guid_t pci_acpi_dsm_guid =
+ GUID_INIT(0xe5c937d0, 0x3553, 0x4d7a,
+ 0x91, 0x17, 0xea, 0x4d, 0x19, 0xc3, 0x43, 0x4d);
+
+
+void rcu_barrier(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+int __cpuhp_setup_state(enum cpuhp_state state,const char * name,bool invoke,int (* startup)(unsigned int cpu),int (* teardown)(unsigned int cpu),bool multi_instance)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void update_vsyscall(struct timekeeper * tk)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void clocksource_arch_init(struct clocksource * cs)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void ignore_signals(struct task_struct * t)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void calc_global_load(void)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void account_process_tick(struct task_struct * p,int user_tick)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void rcu_sched_clock_irq(int user)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void kernfs_get(struct kernfs_node * kn)
+{
+ lx_emul_trace(__func__);
+}
+
+
+int software_node_notify(struct device * dev,unsigned long action)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void get_random_bytes(void * buf,int nbytes)
+{
+ lx_emul_trace(__func__);
+}
+
+
+int __must_check get_random_bytes_arch(void * buf,int nbytes)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int add_random_ready_callback(struct random_ready_callback * rdy)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void add_interrupt_randomness(int irq,int irq_flags)
+{
+ lx_emul_trace(__func__);
+}
+
+
+int sysfs_create_files(struct kobject * kobj,const struct attribute * const * ptr)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int sysfs_create_bin_file(struct kobject * kobj,const struct bin_attribute * attr)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void sysfs_remove_file_ns(struct kobject * kobj,const struct attribute * attr,const void * ns)
+{
+ lx_emul_trace(__func__);
+}
+
+
+int sysfs_create_dir_ns(struct kobject * kobj,const void * ns)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int sysfs_create_file_ns(struct kobject * kobj,const struct attribute * attr,const void * ns)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int sysfs_create_link(struct kobject * kobj,struct kobject * target,const char * name)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int sysfs_create_groups(struct kobject * kobj,const struct attribute_group ** groups)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void intel_engines_add_sysfs(struct drm_i915_private * i915)
+{
+ lx_emul_trace(__func__);
+}
+
+
+
+void register_syscore_ops(struct syscore_ops * ops)
+{
+ wait_bit_init();
+ lx_emul_trace(__func__);
+}
+
+
+void pci_allocate_vc_save_buffers(struct pci_dev * dev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void pci_vpd_init(struct pci_dev * dev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+int pci_proc_attach_device(struct pci_dev * dev)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void i915_pmu_init(void)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void i915_pmu_register(struct drm_i915_private * i915)
+{
+ lx_emul_trace(__func__);
+}
+
+
+bool parse_option_str(const char *str, const char *option)
+{
+ lx_emul_trace(__func__);
+ return false;
+}
+
+
+int __register_chrdev(unsigned int major,unsigned int baseminor,unsigned int count,const char * name,const struct file_operations * fops)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void intel_gt_driver_late_release(struct intel_gt * gt)
+{
+ lx_emul_trace(__func__);
+}
+
+
+bool intel_vgpu_active(struct drm_i915_private * dev_priv)
+{
+ lx_emul_trace(__func__);
+ return false;
+}
+
+
+void unregister_shrinker(struct shrinker * shrinker)
+{
+ lx_emul_trace(__func__);
+}
+
+
+int register_shrinker(struct shrinker * shrinker)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int intel_gt_init_mmio(struct intel_gt * gt)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int __intel_gt_reset(struct intel_gt * gt, intel_engine_mask_t engine_mask)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void i915_perf_init(struct drm_i915_private * i915)
+{
+ lx_emul_trace(__func__);
+}
+
+
+int drm_aperture_remove_conflicting_pci_framebuffers(struct pci_dev * pdev,
+ const char * name)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void intel_gt_init_hw_early(struct intel_gt * gt, struct i915_ggtt * ggtt)
+{
+ lx_emul_trace(__func__);
+}
+
+
+int intel_gt_probe_lmem(struct intel_gt * gt)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void intel_gt_init_workarounds(struct drm_i915_private * i915)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void sched_set_fifo(struct task_struct * p)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void gen8_gt_irq_handler(struct intel_gt * gt,u32 master_ctl)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void gen11_gt_irq_reset(struct intel_gt * gt)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void gen11_gt_irq_handler(struct intel_gt * gt, const u32 master_ctl)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void gen11_gt_irq_postinstall(struct intel_gt * gt)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void gen8_gt_irq_reset(struct intel_gt * gt)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void gen8_gt_irq_postinstall(struct intel_gt * gt)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void gen5_gt_irq_reset(struct intel_gt * gt)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void gen5_gt_irq_postinstall(struct intel_gt * gt)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void register_irq_proc(unsigned int irq,struct irq_desc * desc)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void register_handler_proc(unsigned int irq,struct irqaction * action)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void unregister_handler_proc(unsigned int irq,struct irqaction * action)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void intel_vgpu_register(struct drm_i915_private * i915)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void i915_perf_register(struct drm_i915_private * i915)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void intel_gt_driver_register(struct intel_gt * gt)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void i915_perf_sysctl_register(void)
+{
+ lx_emul_trace(__func__);
+}
+
+
+int acpi_platform_notify(struct device *dev, enum kobject_action action)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+bool acpi_driver_match_device(struct device *dev, const struct device_driver *drv)
+{
+ lx_emul_trace(__func__);
+ return false;
+}
+
+
+bool is_acpi_device_node(const struct fwnode_handle *fwnode)
+{
+ lx_emul_trace(__func__);
+ return false;
+}
+
+
+enum dev_dma_attr acpi_get_dma_attr(struct acpi_device *adev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+int acpi_dma_configure_id(struct device *dev, enum dev_dma_attr attr, const u32 *input_id)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+int acpi_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *event)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+int acpi_device_modalias(struct device *device, char * x, int y)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+void acpi_video_unregister(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+bool acpi_check_dsm(acpi_handle handle, const guid_t *guid, u64 rev, u64 funcs)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+union acpi_object *acpi_evaluate_dsm(acpi_handle handle, const guid_t *guid,
+ u64 rev, u64 func, union acpi_object *argv4)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+acpi_status acpi_remove_address_space_handler(acpi_handle device,
+ acpi_adr_space_type space_id,
+ acpi_adr_space_handler handler)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+acpi_status acpi_buffer_to_resource(u8 * aml_buffer,u16 aml_buffer_length,
+ struct acpi_resource ** resource_ptr)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+acpi_status acpi_install_address_space_handler(acpi_handle device,
+ acpi_adr_space_type space_id,
+ acpi_adr_space_handler handler,
+ acpi_adr_space_setup setup,
+ void * context)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+int acpi_video_register(void)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+acpi_status acpi_get_name(acpi_handle object, u32 name_type,
+ struct acpi_buffer *ret_path_ptr)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+acpi_status acpi_get_table(acpi_string signature, u32 instance, struct acpi_table_header **out_table)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+void acpi_put_table(struct acpi_table_header *table)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+void cpu_latency_qos_add_request(struct pm_qos_request *req, s32 value)
+{
+ lx_emul_trace(__func__);
+}
+
+
+void cpu_latency_qos_update_request(struct pm_qos_request *req, s32 new_value)
+{
+ lx_emul_trace(__func__);
+}
+
+
+bool cpu_latency_qos_request_active(struct pm_qos_request *req)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+void cpu_latency_qos_remove_request(struct pm_qos_request *req)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+enum acpi_backlight_type acpi_video_get_backlight_type(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+bool pciehp_is_native(struct pci_dev *bridge)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+struct irq_domain *pci_host_bridge_acpi_msi_domain(struct pci_bus *bus)
+{
+ lx_emul_trace(__func__);
+ return NULL;
+}
+
+
+int pci_acpi_program_hp_params(struct pci_dev *dev)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int pnp_range_reserved(resource_size_t start, resource_size_t end)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+int utf16s_to_utf8s(const wchar_t *pwcs, int len, enum utf16_endian endian,
+ u8 *s, int maxlen)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+int __get_user_nocheck_1(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+unsigned long
+raw_copy_to_user(void __user *to, const void *from, unsigned long n)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+unsigned long
+raw_copy_from_user(void *to, const void __user * from, unsigned long n)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+int i915_gemfs_init(struct drm_i915_private * i915)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int __init i915_global_context_init(void)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int __init i915_global_gem_context_init(void)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int __init i915_global_request_init(void)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int __init i915_global_scheduler_init(void)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void pci_fixup_device(enum pci_fixup_pass pass,struct pci_dev * dev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+int pci_dev_specific_reset(struct pci_dev * dev,int probe)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+
+int register_acpi_notifier(struct notifier_block * nb)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int unregister_acpi_notifier(struct notifier_block * nb)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int acpi_reconfig_notifier_register(struct notifier_block * nb)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+int intel_vgt_balloon(struct i915_ggtt * ggtt)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void intel_gt_info_print(const struct intel_gt_info * info,struct drm_printer * p)
+{
+ lx_emul_trace(__func__);
+}
+
+
+int set_pages_uc(struct page * page,int numpages)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+bool irq_work_queue(struct irq_work * work)
+{
+ lx_emul_trace(__func__);
+ return false;
+}
+
+
+void iomap_free(resource_size_t base, unsigned long size)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+void i915_gem_object_release_mmap_offset(struct drm_i915_gem_object * obj)
+{
+ lx_emul_trace(__func__);
+}
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/emul.cc b/repos/pc/src/drivers/framebuffer/intel/pc/emul.cc
new file mode 100644
index 0000000000..243f0a6501
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/emul.cc
@@ -0,0 +1,31 @@
+/*
+ * \brief Linux emulation backend functions
+ * \author Josef Soentgen
+ * \date 2021-03-22
+ */
+
+/*
+ * Copyright (C) 2021-2022 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+/* lx emulation includes */
+#include
+
+/* local includes */
+#include "lx_emul.h"
+
+
+void *emul_alloc_shmem_file_buffer(unsigned long size)
+{
+ auto &buffer = Lx_kit::env().memory.alloc_buffer(size);
+ return reinterpret_cast(buffer.virt_addr());
+}
+
+
+void emul_free_shmem_file_buffer(void *addr)
+{
+ Lx_kit::env().memory.free_buffer(addr);
+}
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/fb.c b/repos/pc/src/drivers/framebuffer/intel/pc/fb.c
new file mode 100644
index 0000000000..848ba3635b
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/fb.c
@@ -0,0 +1,61 @@
+/*
+ * \brief Linux kernel framebuffer device support
+ * \author Stefan Kalkowski
+ * \date 2021-05-03
+ */
+
+/*
+ * Copyright (C) 2021 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+#include
+#include
+#include
+
+struct fb_info * framebuffer_alloc(size_t size,struct device * dev)
+{
+#define BYTES_PER_LONG (BITS_PER_LONG/8)
+#define PADDING (BYTES_PER_LONG - (sizeof(struct fb_info) % BYTES_PER_LONG))
+ int fb_info_size = sizeof(struct fb_info);
+ struct fb_info *info;
+ char *p;
+
+ if (size) {
+ fb_info_size += PADDING;
+ }
+
+ p = kzalloc(fb_info_size + size, GFP_KERNEL);
+
+ if (!p)
+ return NULL;
+
+ info = (struct fb_info *) p;
+
+ if (size)
+ info->par = p + fb_info_size;
+
+ info->device = dev;
+ info->fbcon_rotate_hint = -1;
+
+#if IS_ENABLED(CONFIG_FB_BACKLIGHT)
+ mutex_init(&info->bl_curve_mutex);
+#endif
+
+ return info;
+#undef PADDING
+#undef BYTES_PER_LONG
+}
+
+
+int register_framebuffer(struct fb_info * fb_info)
+{
+ lx_emul_framebuffer_ready(fb_info->screen_base, fb_info->screen_size,
+ fb_info->var.xres_virtual, fb_info->var.yres_virtual,
+ fb_info->fix.line_length /
+ (fb_info->var.bits_per_pixel / 8), fb_info->var.yres);
+ return 0;
+}
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/gem.c b/repos/pc/src/drivers/framebuffer/intel/pc/gem.c
new file mode 100644
index 0000000000..7e7ad9646d
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/gem.c
@@ -0,0 +1,387 @@
+/*
+ * \brief Shadow of drivers/gpu/drm/i915/i915_gem.c
+ * \author Alexander Boettcher
+ * \date 2022-02-03
+ */
+
+/*
+ * Copyright © 2008-2015 Intel Corporation
+ *
+ * Copyright (C) 2022 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+#include "i915_drv.h"
+
+#include "intel_pm.h"
+
+
+int i915_gem_object_unbind(struct drm_i915_gem_object *obj,
+ unsigned long flags)
+{
+ struct intel_runtime_pm *rpm = &to_i915(obj->base.dev)->runtime_pm;
+ LIST_HEAD(still_in_list);
+ intel_wakeref_t wakeref;
+ struct i915_vma *vma;
+ int ret;
+
+ if (list_empty(&obj->vma.list))
+ return 0;
+
+ /*
+ * As some machines use ACPI to handle runtime-resume callbacks, and
+ * ACPI is quite kmalloc happy, we cannot resume beneath the vm->mutex
+ * as they are required by the shrinker. Ergo, we wake the device up
+ * first just in case.
+ */
+ wakeref = intel_runtime_pm_get(rpm);
+
+try_again:
+ ret = 0;
+ spin_lock(&obj->vma.lock);
+ while (!ret && (vma = list_first_entry_or_null(&obj->vma.list,
+ struct i915_vma,
+ obj_link))) {
+ struct i915_address_space *vm = vma->vm;
+
+ list_move_tail(&vma->obj_link, &still_in_list);
+ if (!i915_vma_is_bound(vma, I915_VMA_BIND_MASK))
+ continue;
+
+ if (flags & I915_GEM_OBJECT_UNBIND_TEST) {
+ ret = -EBUSY;
+ break;
+ }
+
+ ret = -EAGAIN;
+ if (!i915_vm_tryopen(vm))
+ break;
+
+ /* Prevent vma being freed by i915_vma_parked as we unbind */
+ vma = __i915_vma_get(vma);
+ spin_unlock(&obj->vma.lock);
+
+ if (vma) {
+ ret = -EBUSY;
+ if (flags & I915_GEM_OBJECT_UNBIND_ACTIVE ||
+ !i915_vma_is_active(vma)) {
+ if (flags & I915_GEM_OBJECT_UNBIND_VM_TRYLOCK) {
+ if (mutex_trylock(&vma->vm->mutex)) {
+ ret = __i915_vma_unbind(vma);
+ mutex_unlock(&vma->vm->mutex);
+ } else {
+ ret = -EBUSY;
+ }
+ } else {
+ ret = i915_vma_unbind(vma);
+ }
+ }
+
+ __i915_vma_put(vma);
+ }
+
+ i915_vm_close(vm);
+ spin_lock(&obj->vma.lock);
+ }
+ list_splice_init(&still_in_list, &obj->vma.list);
+ spin_unlock(&obj->vma.lock);
+
+ if (ret == -EAGAIN && flags & I915_GEM_OBJECT_UNBIND_BARRIER) {
+ rcu_barrier(); /* flush the i915_vm_release() */
+ goto try_again;
+ }
+
+ intel_runtime_pm_put(rpm, wakeref);
+
+ return ret;
+}
+
+static void discard_ggtt_vma(struct i915_vma *vma)
+{
+ struct drm_i915_gem_object *obj = vma->obj;
+
+ spin_lock(&obj->vma.lock);
+ if (!RB_EMPTY_NODE(&vma->obj_node)) {
+ rb_erase(&vma->obj_node, &obj->vma.tree);
+ RB_CLEAR_NODE(&vma->obj_node);
+ }
+ spin_unlock(&obj->vma.lock);
+}
+
+struct i915_vma *
+i915_gem_object_ggtt_pin_ww(struct drm_i915_gem_object *obj,
+ struct i915_gem_ww_ctx *ww,
+ const struct i915_ggtt_view *view,
+ u64 size, u64 alignment, u64 flags)
+{
+ struct drm_i915_private *i915 = to_i915(obj->base.dev);
+ struct i915_ggtt *ggtt = &i915->ggtt;
+ struct i915_vma *vma;
+ int ret;
+
+ if (flags & PIN_MAPPABLE &&
+ (!view || view->type == I915_GGTT_VIEW_NORMAL)) {
+ /*
+ * If the required space is larger than the available
+ * aperture, we will not able to find a slot for the
+ * object and unbinding the object now will be in
+ * vain. Worse, doing so may cause us to ping-pong
+ * the object in and out of the Global GTT and
+ * waste a lot of cycles under the mutex.
+ */
+ if (obj->base.size > ggtt->mappable_end)
+ return ERR_PTR(-E2BIG);
+
+ /*
+ * If NONBLOCK is set the caller is optimistically
+ * trying to cache the full object within the mappable
+ * aperture, and *must* have a fallback in place for
+ * situations where we cannot bind the object. We
+ * can be a little more lax here and use the fallback
+ * more often to avoid costly migrations of ourselves
+ * and other objects within the aperture.
+ *
+ * Half-the-aperture is used as a simple heuristic.
+ * More interesting would to do search for a free
+ * block prior to making the commitment to unbind.
+ * That caters for the self-harm case, and with a
+ * little more heuristics (e.g. NOFAULT, NOEVICT)
+ * we could try to minimise harm to others.
+ */
+ if (flags & PIN_NONBLOCK &&
+ obj->base.size > ggtt->mappable_end / 2)
+ return ERR_PTR(-ENOSPC);
+ }
+
+new_vma:
+ vma = i915_vma_instance(obj, &ggtt->vm, view);
+ if (IS_ERR(vma))
+ return vma;
+
+ if (i915_vma_misplaced(vma, size, alignment, flags)) {
+ if (flags & PIN_NONBLOCK) {
+ if (i915_vma_is_pinned(vma) || i915_vma_is_active(vma))
+ return ERR_PTR(-ENOSPC);
+
+ if (flags & PIN_MAPPABLE &&
+ vma->fence_size > ggtt->mappable_end / 2)
+ return ERR_PTR(-ENOSPC);
+ }
+
+ if (i915_vma_is_pinned(vma) || i915_vma_is_active(vma)) {
+ discard_ggtt_vma(vma);
+ goto new_vma;
+ }
+
+ ret = i915_vma_unbind(vma);
+ if (ret)
+ return ERR_PTR(ret);
+ }
+
+ if (ww)
+ ret = i915_vma_pin_ww(vma, ww, size, alignment, flags | PIN_GLOBAL);
+ else
+ ret = i915_vma_pin(vma, size, alignment, flags | PIN_GLOBAL);
+
+ if (ret)
+ return ERR_PTR(ret);
+
+ if (vma->fence && !i915_gem_object_is_tiled(obj)) {
+ mutex_lock(&ggtt->vm.mutex);
+ i915_vma_revoke_fence(vma);
+ mutex_unlock(&ggtt->vm.mutex);
+ }
+
+ ret = i915_vma_wait_for_bind(vma);
+ if (ret) {
+ i915_vma_unpin(vma);
+ return ERR_PTR(ret);
+ }
+
+ return vma;
+}
+
+void i915_gem_ww_ctx_init(struct i915_gem_ww_ctx *ww, bool intr)
+{
+ ww_acquire_init(&ww->ctx, &reservation_ww_class);
+ INIT_LIST_HEAD(&ww->obj_list);
+ ww->intr = intr;
+ ww->contended = NULL;
+}
+
+static void i915_gem_ww_ctx_unlock_all(struct i915_gem_ww_ctx *ww)
+{
+ struct drm_i915_gem_object *obj;
+
+ while ((obj = list_first_entry_or_null(&ww->obj_list, struct drm_i915_gem_object, obj_link))) {
+ list_del(&obj->obj_link);
+ i915_gem_object_unlock(obj);
+ }
+}
+
+void i915_gem_ww_ctx_fini(struct i915_gem_ww_ctx *ww)
+{
+ i915_gem_ww_ctx_unlock_all(ww);
+ WARN_ON(ww->contended);
+ ww_acquire_fini(&ww->ctx);
+}
+
+static void i915_gem_init__mm(struct drm_i915_private *i915)
+{
+ spin_lock_init(&i915->mm.obj_lock);
+
+ init_llist_head(&i915->mm.free_list);
+
+ INIT_LIST_HEAD(&i915->mm.purge_list);
+ INIT_LIST_HEAD(&i915->mm.shrink_list);
+
+ i915_gem_init__objects(i915);
+}
+
+
+int i915_gem_init(struct drm_i915_private *dev_priv)
+{
+ int ret;
+
+ /* We need to fallback to 4K pages if host doesn't support huge gtt. */
+/*
+ if (intel_vgpu_active(dev_priv) && !intel_vgpu_has_huge_gtt(dev_priv))
+ mkwrite_device_info(dev_priv)->page_sizes =
+ I915_GTT_PAGE_SIZE_4K;
+*/
+
+ ret = i915_gem_init_userptr(dev_priv);
+ if (ret)
+ return ret;
+
+/*
+ intel_uc_fetch_firmwares(&dev_priv->gt.uc);
+ intel_wopcm_init(&dev_priv->wopcm);
+*/
+ ret = i915_init_ggtt(dev_priv);
+ if (ret) {
+ GEM_BUG_ON(ret == -EIO);
+ goto err_unlock;
+ }
+
+ /*
+ * Despite its name intel_init_clock_gating applies both display
+ * clock gating workarounds; GT mmio workarounds and the occasional
+ * GT power context workaround. Worse, sometimes it includes a context
+ * register workaround which we need to apply before we record the
+ * default HW state for all contexts.
+ *
+ * FIXME: break up the workarounds and apply them at the right time!
+ */
+
+ intel_init_clock_gating(dev_priv);
+
+/*
+ ret = intel_gt_init(&dev_priv->gt);
+ if (ret)
+ goto err_unlock;
+*/
+ return 0;
+
+ /*
+ * Unwinding is complicated by that we want to handle -EIO to mean
+ * disable GPU submission but keep KMS alive. We want to mark the
+ * HW as irrevisibly wedged, but keep enough state around that the
+ * driver doesn't explode during runtime.
+ */
+err_unlock:
+ i915_gem_drain_workqueue(dev_priv);
+
+/*
+ if (ret != -EIO)
+ intel_uc_cleanup_firmwares(&dev_priv->gt.uc);
+*/
+
+ if (ret == -EIO) {
+ /*
+ * Allow engines or uC initialisation to fail by marking the GPU
+ * as wedged. But we only want to do this when the GPU is angry,
+ * for all other failure, such as an allocation failure, bail.
+ */
+/*
+ if (!intel_gt_is_wedged(&dev_priv->gt)) {
+ i915_probe_error(dev_priv,
+ "Failed to initialize GPU, declaring it wedged!\n");
+ intel_gt_set_wedged(&dev_priv->gt);
+ }
+*/
+ /* Minimal basic recovery for KMS */
+ ret = i915_ggtt_enable_hw(dev_priv);
+ i915_ggtt_resume(&dev_priv->ggtt);
+
+ intel_init_clock_gating(dev_priv);
+ }
+
+ i915_gem_drain_freed_objects(dev_priv);
+
+ return ret;
+}
+
+void i915_gem_driver_register(struct drm_i915_private * i915)
+{
+ lx_emul_trace(__func__);
+}
+
+
+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);
+*/
+
+ lx_emul_trace(__func__);
+
+ spin_lock_init(&dev_priv->fb_tracking.lock);
+
+ totalram_pages_add(ram_pages);
+}
+
+
+int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file)
+{
+ struct drm_i915_file_private *file_priv;
+
+ DRM_DEBUG("\n");
+
+ file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL);
+ if (!file_priv)
+ return -ENOMEM;
+
+ file->driver_priv = file_priv;
+ file_priv->dev_priv = i915;
+ file_priv->file = file;
+
+ file_priv->bsd_engine = -1;
+ file_priv->hang_timestamp = jiffies;
+
+/*
+ ret = i915_gem_context_open(i915, file);
+ if (ret)
+ kfree(file_priv);
+
+ return ret;
+*/
+ return 0;
+}
+
+
+int i915_gem_init_userptr(struct drm_i915_private *dev_priv)
+{
+#ifdef CONFIG_MMU_NOTIFIER
+ spin_lock_init(&dev_priv->mm.notifier_lock);
+#endif
+
+ return 0;
+}
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/generated_dummies.c b/repos/pc/src/drivers/framebuffer/intel/pc/generated_dummies.c
new file mode 100644
index 0000000000..03c4ad5ab3
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/generated_dummies.c
@@ -0,0 +1,2122 @@
+/*
+ * \brief Dummy definitions of Linux Kernel functions
+ * \author Automatically generated file - do no edit
+ * \date 2022-03-04
+ */
+
+#include
+
+
+#include "i915_drv.h"
+
+
+#include
+
+void * PDE_DATA(const struct inode * inode)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int ___ratelimit(struct ratelimit_state * rs,const char * func)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+const char * __clk_get_name(const struct clk * clk)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int __cond_resched_lock(spinlock_t * lock)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void __i915_gpu_coredump_free(struct kref * error_ref);
+void __i915_gpu_coredump_free(struct kref * error_ref)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __pagevec_release(struct pagevec * pvec)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __put_page(struct page * page)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __put_task_struct(struct task_struct * tsk)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __srcu_read_unlock(struct srcu_struct * ssp,int idx)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __tasklet_schedule(struct tasklet_struct * t)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __unregister_chrdev(unsigned int major,unsigned int baseminor,unsigned int count,const char * name)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void * __vmalloc_node(unsigned long size,unsigned long align,gfp_t gfp_mask,int node,const void * caller)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+unsigned long _copy_to_user(void __user * to,const void * from,unsigned long n)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool _drm_lease_held(struct drm_file * file_priv,int id)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+atomic_long_t _totalram_pages;
+
+
+#include
+
+int acpi_bus_attach_private_data(acpi_handle handle,void * data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void acpi_bus_detach_private_data(acpi_handle handle)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int acpi_bus_get_device(acpi_handle handle,struct acpi_device ** device)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int acpi_bus_get_private_data(acpi_handle handle,void ** data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int acpi_bus_get_status(struct acpi_device * device)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void acpi_dev_clear_dependencies(struct acpi_device * supplier)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void acpi_dev_free_resource_list(struct list_head * list)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int acpi_dev_get_resources(struct acpi_device * adev,struct list_head * list,int (* preproc)(struct acpi_resource *,void *),void * preproc_data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool acpi_dev_resource_interrupt(struct acpi_resource * ares,int index,struct resource * res)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern acpi_status acpi_get_handle(acpi_handle parent,acpi_string pathname,acpi_handle * ret_handle);
+acpi_status acpi_get_handle(acpi_handle parent,acpi_string pathname,acpi_handle * ret_handle)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int acpi_match_device_ids(struct acpi_device * device,const struct acpi_device_id * ids)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void acpi_set_modalias(struct acpi_device * adev,const char * default_id,char * modalias,size_t len)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern acpi_status acpi_walk_namespace(acpi_object_type type,acpi_handle start_object,u32 max_depth,acpi_walk_callback descending_callback,acpi_walk_callback ascending_callback,void * context,void ** return_value);
+acpi_status acpi_walk_namespace(acpi_object_type type,acpi_handle start_object,u32 max_depth,acpi_walk_callback descending_callback,acpi_walk_callback ascending_callback,void * context,void ** return_value)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void bust_spinlocks(int yes)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void cfb_copyarea(struct fb_info * p,const struct fb_copyarea * area)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void cfb_fillrect(struct fb_info * p,const struct fb_fillrect * rect)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void cfb_imageblit(struct fb_info * p,const struct fb_image * image)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void check_move_unevictable_pages(struct pagevec * pvec)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int clear_page_dirty_for_io(struct page * page)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void console_flush_on_panic(enum con_flush_mode mode)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void console_lock(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int console_printk[] = {};
+
+
+#include
+
+int console_trylock(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void console_unblank(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void console_unlock(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int device_add_software_node(struct device * dev,const struct software_node * node)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void device_remove_software_node(struct device * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct dma_buf_attachment * dma_buf_attach(struct dma_buf * dmabuf,struct device * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void dma_buf_detach(struct dma_buf * dmabuf,struct dma_buf_attachment * attach)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct dma_buf * dma_buf_export(const struct dma_buf_export_info * exp_info)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int dma_buf_fd(struct dma_buf * dmabuf,int flags)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct dma_buf * dma_buf_get(int fd)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct sg_table * dma_buf_map_attachment(struct dma_buf_attachment * attach,enum dma_data_direction direction)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void dma_buf_put(struct dma_buf * dmabuf)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void dma_buf_unmap_attachment(struct dma_buf_attachment * attach,struct sg_table * sg_table,enum dma_data_direction direction)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+dma_addr_t dma_map_page_attrs(struct device * dev,struct page * page,size_t offset,size_t size,enum dma_data_direction dir,unsigned long attrs)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void dma_resv_prune(struct dma_resv * resv);
+void dma_resv_prune(struct dma_resv * resv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void dma_unmap_page_attrs(struct device * dev,dma_addr_t addr,size_t size,enum dma_data_direction dir,unsigned long attrs)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int drm_invalid_op(struct drm_device * dev,void * data,struct drm_file * file_priv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+long drm_ioctl(struct file * filp,unsigned int cmd,unsigned long arg)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void drm_lease_destroy(struct drm_master * master)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct drm_master * drm_lease_owner(struct drm_master * master)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void drm_lease_revoke(struct drm_master * top)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int drm_noop(struct drm_device * dev,void * data,struct drm_file * file_priv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+ssize_t drm_scdc_read(struct i2c_adapter * adapter,u8 offset,void * buffer,size_t size)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool drm_scdc_set_high_tmds_clock_ratio(struct i2c_adapter * adapter,bool set)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool drm_scdc_set_scrambling(struct i2c_adapter * adapter,bool enable)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void drm_writeback_cleanup_job(struct drm_writeback_job * job)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int drm_writeback_prepare_job(struct drm_writeback_job * job)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct irq_chip dummy_irq_chip;
+
+
+#include
+
+asmlinkage __visible void dump_stack(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void emergency_restart(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void fb_set_suspend(struct fb_info * info,int state)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool file_ns_capable(const struct file * file,struct user_namespace * ns,int cap)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void fput(struct file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void framebuffer_release(struct fb_info * info)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct fwnode_handle * fwnode_create_software_node(const struct property_entry * properties,const struct fwnode_handle * parent)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void fwnode_remove_software_node(struct fwnode_handle * fwnode)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void gen5_gt_enable_irq(struct intel_gt * gt,u32 mask);
+void gen5_gt_enable_irq(struct intel_gt * gt,u32 mask)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void gen5_gt_irq_handler(struct intel_gt * gt,u32 gt_iir);
+void gen5_gt_irq_handler(struct intel_gt * gt,u32 gt_iir)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void gen5_rps_irq_handler(struct intel_rps * rps);
+void gen5_rps_irq_handler(struct intel_rps * rps)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void gen6_gt_irq_handler(struct intel_gt * gt,u32 gt_iir);
+void gen6_gt_irq_handler(struct intel_gt * gt,u32 gt_iir)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void gen6_rps_irq_handler(struct intel_rps * rps,u32 pm_iir);
+void gen6_rps_irq_handler(struct intel_rps * rps,u32 pm_iir)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int get_option(char ** str,int * pint)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+u32 get_random_u32(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+u64 get_random_u64(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+s32 i2c_smbus_read_block_data(const struct i2c_client * client,u8 command,u8 * values)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+s32 i2c_smbus_read_byte(const struct i2c_client * client)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+s32 i2c_smbus_read_byte_data(const struct i2c_client * client,u8 command)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+s32 i2c_smbus_read_word_data(const struct i2c_client * client,u8 command)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+s32 i2c_smbus_write_block_data(const struct i2c_client * client,u8 command,u8 length,const u8 * values)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+s32 i2c_smbus_write_byte(const struct i2c_client * client,u8 value)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+s32 i2c_smbus_write_byte_data(const struct i2c_client * client,u8 command,u8 value)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+s32 i2c_smbus_write_word_data(const struct i2c_client * client,u8 command,u16 value)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+s32 i2c_smbus_xfer(struct i2c_adapter * adapter,u16 addr,unsigned short flags,char read_write,u8 command,int protocol,union i2c_smbus_data * data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_cmd_parser_get_version(struct drm_i915_private * dev_priv);
+int i915_cmd_parser_get_version(struct drm_i915_private * dev_priv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern struct i915_gpu_coredump * i915_first_error_state(struct drm_i915_private * i915);
+struct i915_gpu_coredump * i915_first_error_state(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_busy_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_busy_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_cleanup_early(struct drm_i915_private * dev_priv);
+void i915_gem_cleanup_early(struct drm_i915_private * dev_priv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_context_close(struct drm_file * file);
+void i915_gem_context_close(struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_context_create_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_context_create_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_context_destroy_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_context_destroy_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_context_getparam_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_context_getparam_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_context_release(struct kref * ref);
+void i915_gem_context_release(struct kref * ref)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_context_reset_stats_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_context_reset_stats_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_context_setparam_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_context_setparam_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_create_ext_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_create_ext_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_create_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_create_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_driver_release(struct drm_i915_private * dev_priv);
+void i915_gem_driver_release(struct drm_i915_private * dev_priv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_driver_remove(struct drm_i915_private * dev_priv);
+void i915_gem_driver_remove(struct drm_i915_private * dev_priv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_driver_unregister(struct drm_i915_private * i915);
+void i915_gem_driver_unregister(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_dumb_create(struct drm_file * file,struct drm_device * dev,struct drm_mode_create_dumb * args);
+int i915_gem_dumb_create(struct drm_file * file,struct drm_device * dev,struct drm_mode_create_dumb * args)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_dumb_mmap_offset(struct drm_file * file,struct drm_device * dev,u32 handle,u64 * offset);
+int i915_gem_dumb_mmap_offset(struct drm_file * file,struct drm_device * dev,u32 handle,u64 * offset)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_evict_for_node(struct i915_address_space * vm,struct drm_mm_node * target,unsigned int flags);
+int i915_gem_evict_for_node(struct i915_address_space * vm,struct drm_mm_node * target,unsigned int flags)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_evict_something(struct i915_address_space * vm,u64 min_size,u64 alignment,unsigned long color,u64 start,u64 end,unsigned flags);
+int i915_gem_evict_something(struct i915_address_space * vm,u64 min_size,u64 alignment,unsigned long color,u64 start,u64 end,unsigned flags)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_evict_vm(struct i915_address_space * vm);
+int i915_gem_evict_vm(struct i915_address_space * vm)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_execbuffer2_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_execbuffer2_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_freeze(struct drm_i915_private * i915);
+int i915_gem_freeze(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_freeze_late(struct drm_i915_private * i915);
+int i915_gem_freeze_late(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_get_aperture_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_get_aperture_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_madvise_ioctl(struct drm_device * dev,void * data,struct drm_file * file_priv);
+int i915_gem_madvise_ioctl(struct drm_device * dev,void * data,struct drm_file * file_priv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_mmap(struct file * filp,struct vm_area_struct * vma);
+int i915_gem_mmap(struct file * filp,struct vm_area_struct * vma)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_mmap_gtt_version(void);
+int i915_gem_mmap_gtt_version(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_mmap_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_mmap_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_mmap_offset_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_mmap_offset_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_object_attach_phys(struct drm_i915_gem_object * obj,int align);
+int i915_gem_object_attach_phys(struct drm_i915_gem_object * obj,int align)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_object_pread_phys(struct drm_i915_gem_object * obj,const struct drm_i915_gem_pread * args);
+int i915_gem_object_pread_phys(struct drm_i915_gem_object * obj,const struct drm_i915_gem_pread * args)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_object_put_pages_phys(struct drm_i915_gem_object * obj,struct sg_table * pages);
+void i915_gem_object_put_pages_phys(struct drm_i915_gem_object * obj,struct sg_table * pages)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_object_pwrite_phys(struct drm_i915_gem_object * obj,const struct drm_i915_gem_pwrite * args);
+int i915_gem_object_pwrite_phys(struct drm_i915_gem_object * obj,const struct drm_i915_gem_pwrite * args)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_object_release_mmap_gtt(struct drm_i915_gem_object * obj);
+void i915_gem_object_release_mmap_gtt(struct drm_i915_gem_object * obj)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_object_userptr_validate(struct drm_i915_gem_object * obj);
+int i915_gem_object_userptr_validate(struct drm_i915_gem_object * obj)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_pread_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_pread_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern struct dma_buf * i915_gem_prime_export(struct drm_gem_object * gem_obj,int flags);
+struct dma_buf * i915_gem_prime_export(struct drm_gem_object * gem_obj,int flags)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern struct drm_gem_object * i915_gem_prime_import(struct drm_device * dev,struct dma_buf * dma_buf);
+struct drm_gem_object * i915_gem_prime_import(struct drm_device * dev,struct dma_buf * dma_buf)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_pwrite_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_pwrite_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_resume(struct drm_i915_private * i915);
+void i915_gem_resume(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_runtime_suspend(struct drm_i915_private * i915);
+void i915_gem_runtime_suspend(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_suspend(struct drm_i915_private * i915);
+void i915_gem_suspend(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gem_suspend_late(struct drm_i915_private * i915);
+void i915_gem_suspend_late(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_sw_finish_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_sw_finish_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_throttle_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_throttle_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_userptr_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_userptr_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_vm_create_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_vm_create_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_gem_vm_destroy_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_gem_vm_destroy_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int __must_check i915_gem_ww_ctx_backoff(struct i915_gem_ww_ctx * ww);
+int __must_check i915_gem_ww_ctx_backoff(struct i915_gem_ww_ctx * ww)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_gemfs_fini(struct drm_i915_private * i915);
+void i915_gemfs_fini(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern ssize_t i915_gpu_coredump_copy_to_buffer(struct i915_gpu_coredump * error,char * buf,loff_t off,size_t rem);
+ssize_t i915_gpu_coredump_copy_to_buffer(struct i915_gpu_coredump * error,char * buf,loff_t off,size_t rem)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_lut_handle_free(struct i915_lut_handle * lut);
+void i915_lut_handle_free(struct i915_lut_handle * lut)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_perf_add_config_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_perf_add_config_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_perf_fini(struct drm_i915_private * i915);
+void i915_perf_fini(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_perf_ioctl_version(void);
+int i915_perf_ioctl_version(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_perf_open_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_perf_open_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_perf_remove_config_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_perf_remove_config_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_perf_unregister(struct drm_i915_private * i915);
+void i915_perf_unregister(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_pmu_exit(void);
+void i915_pmu_exit(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_pmu_unregister(struct drm_i915_private * i915);
+void i915_pmu_unregister(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern struct i915_ppgtt * i915_ppgtt_create(struct intel_gt * gt);
+struct i915_ppgtt * i915_ppgtt_create(struct intel_gt * gt)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_query_ioctl(struct drm_device * dev,void * data,struct drm_file * file);
+int i915_query_ioctl(struct drm_device * dev,void * data,struct drm_file * file)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_request_add(struct i915_request * rq);
+void i915_request_add(struct i915_request * rq)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern struct i915_request * i915_request_create(struct intel_context * ce);
+struct i915_request * i915_request_create(struct intel_context * ce)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern long i915_request_wait(struct i915_request * rq,unsigned int flags,long timeout);
+long i915_request_wait(struct i915_request * rq,unsigned int flags,long timeout)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_reset_error_state(struct drm_i915_private * i915);
+void i915_reset_error_state(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_vm_alloc_pt_stash(struct i915_address_space * vm,struct i915_vm_pt_stash * stash,u64 size);
+int i915_vm_alloc_pt_stash(struct i915_address_space * vm,struct i915_vm_pt_stash * stash,u64 size)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void i915_vm_free_pt_stash(struct i915_address_space * vm,struct i915_vm_pt_stash * stash);
+void i915_vm_free_pt_stash(struct i915_address_space * vm,struct i915_vm_pt_stash * stash)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int i915_vm_map_pt_stash(struct i915_address_space * vm,struct i915_vm_pt_stash * stash);
+int i915_vm_map_pt_stash(struct i915_address_space * vm,struct i915_vm_pt_stash * stash)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct pseudo_fs_context * init_pseudo(struct fs_context * fc,unsigned long magic)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct user_namespace init_user_ns;
+
+
+#include
+
+bool initcall_debug;
+
+
+extern int intel_dsi_dcs_init_backlight_funcs(struct intel_connector * intel_connector);
+int intel_dsi_dcs_init_backlight_funcs(struct intel_connector * intel_connector)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void intel_dvo_init(struct drm_i915_private * dev_priv);
+void intel_dvo_init(struct drm_i915_private * dev_priv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int intel_engine_flush_barriers(struct intel_engine_cs * engine);
+int intel_engine_flush_barriers(struct intel_engine_cs * engine)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern struct intel_engine_cs * intel_engine_lookup_user(struct drm_i915_private * i915,u8 class,u8 instance);
+struct intel_engine_cs * intel_engine_lookup_user(struct drm_i915_private * i915,u8 class,u8 instance)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern unsigned int intel_engines_has_context_isolation(struct drm_i915_private * i915);
+unsigned int intel_engines_has_context_isolation(struct drm_i915_private * i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int intel_freq_opcode(struct intel_rps * rps,int val);
+int intel_freq_opcode(struct intel_rps * rps,int val)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int intel_gpu_freq(struct intel_rps * rps,int val);
+int intel_gpu_freq(struct intel_rps * rps,int val)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct resource intel_graphics_stolen_res;
+
+
+extern void intel_gt_check_and_clear_faults(struct intel_gt * gt);
+void intel_gt_check_and_clear_faults(struct intel_gt * gt)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void intel_gt_driver_unregister(struct intel_gt * gt);
+void intel_gt_driver_unregister(struct intel_gt * gt)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+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 long intel_gt_retire_requests_timeout(struct intel_gt * gt,long timeout);
+long intel_gt_retire_requests_timeout(struct intel_gt * gt,long timeout)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int intel_gt_runtime_resume(struct intel_gt * gt);
+int intel_gt_runtime_resume(struct intel_gt * gt)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void intel_gt_runtime_suspend(struct intel_gt * gt);
+void intel_gt_runtime_suspend(struct intel_gt * gt)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int intel_gt_wait_for_idle(struct intel_gt * gt,long timeout);
+int intel_gt_wait_for_idle(struct intel_gt * gt,long timeout)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern bool intel_has_gpu_reset(const struct intel_gt * gt);
+bool intel_has_gpu_reset(const struct intel_gt * gt)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern bool intel_has_reset_engine(const struct intel_gt * gt);
+bool intel_has_reset_engine(const struct intel_gt * gt)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int intel_huc_check_status(struct intel_huc * huc);
+int intel_huc_check_status(struct intel_huc * huc)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern u8 intel_lookup_range_max_qp(int bpc,int buf_i,int bpp_i);
+u8 intel_lookup_range_max_qp(int bpc,int buf_i,int bpp_i)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern u8 intel_lookup_range_min_qp(int bpc,int buf_i,int bpp_i);
+u8 intel_lookup_range_min_qp(int bpc,int buf_i,int bpp_i)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern u32 * intel_ring_begin(struct i915_request * rq,unsigned int num_dwords);
+u32 * intel_ring_begin(struct i915_request * rq,unsigned int num_dwords)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void intel_rps_boost(struct i915_request * rq);
+void intel_rps_boost(struct i915_request * rq)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern u32 intel_rps_read_actual_frequency(struct intel_rps * rps);
+u32 intel_rps_read_actual_frequency(struct intel_rps * rps)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int intel_rps_set(struct intel_rps * rps,u8 val);
+int intel_rps_set(struct intel_rps * rps,u8 val)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern unsigned int intel_sseu_subslice_total(const struct sseu_dev_info * sseu);
+unsigned int intel_sseu_subslice_total(const struct sseu_dev_info * sseu)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void intel_tv_init(struct drm_i915_private * dev_priv);
+void intel_tv_init(struct drm_i915_private * dev_priv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern bool intel_vgpu_has_full_ppgtt(struct drm_i915_private * dev_priv);
+bool intel_vgpu_has_full_ppgtt(struct drm_i915_private * dev_priv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern bool intel_vgpu_has_hwsp_emulation(struct drm_i915_private * dev_priv);
+bool intel_vgpu_has_hwsp_emulation(struct drm_i915_private * dev_priv)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void intel_vgt_deballoon(struct i915_ggtt * ggtt);
+void intel_vgt_deballoon(struct i915_ggtt * ggtt)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void io_schedule_finish(int token)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int io_schedule_prepare(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+long __sched io_schedule_timeout(long timeout)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void iounmap(volatile void __iomem * addr)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void iput(struct inode * inode)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern bool irq_wait_for_poll(struct irq_desc * desc);
+bool irq_wait_for_poll(struct irq_desc * desc)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_work_tick(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool is_software_node(const struct fwnode_handle * fwnode)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void kernel_fpu_begin_mask(unsigned int kfpu_mask);
+void kernel_fpu_begin_mask(unsigned int kfpu_mask)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void kernel_fpu_end(void);
+void kernel_fpu_end(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct kobject *kernel_kobj;
+
+
+#include
+
+void kernfs_put(struct kernfs_node * kn)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void kill_anon_super(struct super_block * sb)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void kmem_cache_destroy(struct kmem_cache * s)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int kmem_cache_shrink(struct kmem_cache * cachep)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void kmsg_dump(enum kmsg_dump_reason reason)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void mark_page_accessed(struct page * page)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+unsigned long long memparse(const char * ptr,char ** retptr)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void memunmap(void * addr)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct irq_chip no_irq_chip;
+
+
+#include
+
+loff_t noop_llseek(struct file * file,loff_t offset,int whence)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void note_interrupt(struct irq_desc * desc,irqreturn_t action_ret)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void on_each_cpu_cond_mask(smp_cond_func_t cond_func,smp_call_func_t func,void * info,bool wait,const struct cpumask * mask)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int oops_in_progress; /* If set, an oops, panic(), BUG() or die() is in progress */
+
+
+#include
+
+struct page * pagecache_get_page(struct address_space * mapping,pgoff_t index,int fgp_flags,gfp_t gfp_mask)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int pagecache_write_begin(struct file * file,struct address_space * mapping,loff_t pos,unsigned len,unsigned flags,struct page ** pagep,void ** fsdata)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int pagecache_write_end(struct file * file,struct address_space * mapping,loff_t pos,unsigned len,unsigned copied,struct page * page,void * fsdata)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+enum reboot_mode panic_reboot_mode;
+
+
+#include
+
+void pci_assign_unassigned_bridge_resources(struct pci_dev * bridge)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void pci_assign_unassigned_bus_resources(struct pci_bus * bus)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern unsigned long pci_cardbus_resource_alignment(struct resource * res);
+unsigned long pci_cardbus_resource_alignment(struct resource * res)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int pci_dev_specific_acs_enabled(struct pci_dev * dev,u16 acs_flags);
+int pci_dev_specific_acs_enabled(struct pci_dev * dev,u16 acs_flags)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int pci_dev_specific_disable_acs_redir(struct pci_dev * dev);
+int pci_dev_specific_disable_acs_redir(struct pci_dev * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int pci_dev_specific_enable_acs(struct pci_dev * dev);
+int pci_dev_specific_enable_acs(struct pci_dev * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+unsigned int pci_flags;
+
+
+extern int pci_idt_bus_quirk(struct pci_bus * bus,int devfn,u32 * l,int timeout);
+int pci_idt_bus_quirk(struct pci_bus * bus,int devfn,u32 * l,int timeout)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int pci_mmap_resource_range(struct pci_dev * pdev,int bar,struct vm_area_struct * vma,enum pci_mmap_state mmap_state,int write_combine)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void __init pci_realloc_get_opt(char * str);
+void __init pci_realloc_get_opt(char * str)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void pci_restore_vc_state(struct pci_dev * dev);
+void pci_restore_vc_state(struct pci_dev * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int pci_save_vc_state(struct pci_dev * dev);
+int pci_save_vc_state(struct pci_dev * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void pci_stop_and_remove_bus_device_locked(struct pci_dev * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void pci_vpd_release(struct pci_dev * dev);
+void pci_vpd_release(struct pci_dev * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern unsigned int pcibios_assign_all_busses(void);
+unsigned int pcibios_assign_all_busses(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void pcie_aspm_init_link_state(struct pci_dev * pdev);
+void pcie_aspm_init_link_state(struct pci_dev * pdev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void pcie_aspm_pm_state_change(struct pci_dev * pdev);
+void pcie_aspm_pm_state_change(struct pci_dev * pdev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void pcie_aspm_powersave_config_link(struct pci_dev * pdev);
+void pcie_aspm_powersave_config_link(struct pci_dev * pdev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void ppgtt_bind_vma(struct i915_address_space * vm,struct i915_vm_pt_stash * stash,struct i915_vma * vma,enum i915_cache_level cache_level,u32 flags);
+void ppgtt_bind_vma(struct i915_address_space * vm,struct i915_vm_pt_stash * stash,struct i915_vma * vma,enum i915_cache_level cache_level,u32 flags)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void ppgtt_unbind_vma(struct i915_address_space * vm,struct i915_vma * vma);
+void ppgtt_unbind_vma(struct i915_address_space * vm,struct i915_vma * vma)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int printk_deferred(const char * fmt,...)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void printk_safe_flush_on_panic(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void put_pid(struct pid * pid)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int raw_pci_read(unsigned int domain,unsigned int bus,unsigned int devfn,int reg,int len,u32 * val)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+enum reboot_mode reboot_mode;
+
+
+#include
+
+void rt_mutex_setprio(struct task_struct * p,struct task_struct * pi_task)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void seq_printf(struct seq_file * m,const char * f,...)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void seq_puts(struct seq_file * m,const char * s)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void seq_vprintf(struct seq_file * m,const char * f,va_list args)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int set_page_dirty(struct page * page)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int set_pages_wb(struct page * page,int numpages);
+int set_pages_wb(struct page * page,int numpages)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct file * shmem_file_setup_with_mnt(struct vfsmount * mnt,const char * name,loff_t size,unsigned long flags)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void shmem_truncate_range(struct inode * inode,loff_t lstart,loff_t lend)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void show_mem(unsigned int filter,nodemask_t * nodemask)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void show_state_filter(unsigned int state_filter)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void simple_release_fs(struct vfsmount ** mount,int * count)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int smp_call_function_single(int cpu,void (* func)(void * info),void * info,int wait)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void srcu_drive_gp(struct work_struct * wp)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool static_key_initialized;
+
+
+#include
+
+int string_escape_mem(const char * src,size_t isz,char * dst,size_t osz,unsigned int flags,const char * only)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int suppress_printk;
+
+
+#include
+
+void synchronize_rcu(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void synchronize_srcu(struct srcu_struct * ssp)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void sysfs_delete_link(struct kobject * kobj,struct kobject * targ,const char * name)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int sysfs_emit(char * buf,const char * fmt,...)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int sysfs_emit_at(char * buf,int at,const char * fmt,...)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void sysfs_notify(struct kobject * kobj,const char * dir,const char * attr)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void sysfs_remove_bin_file(struct kobject * kobj,const struct bin_attribute * attr)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void sysfs_remove_dir(struct kobject * kobj)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool sysfs_remove_file_self(struct kobject * kobj,const struct attribute * attr)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void sysfs_remove_files(struct kobject * kobj,const struct attribute * const * ptr)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void sysfs_remove_groups(struct kobject * kobj,const struct attribute_group ** groups)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void sysfs_remove_link(struct kobject * kobj,const char * name)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int task_work_add(struct task_struct * task,struct callback_head * work,enum task_work_notify_mode notify)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct callback_head * task_work_cancel(struct task_struct * task,task_work_func_t func)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void ttm_mem_io_free(struct ttm_device * bdev,struct ttm_resource * mem)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void unblank_screen(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void unlock_page(struct page * page)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void unmap_mapping_range(struct address_space * mapping,loff_t const holebegin,loff_t const holelen,int even_cows)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void unregister_framebuffer(struct fb_info * fb_info)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void unregister_irq_proc(unsigned int irq,struct irq_desc * desc);
+void unregister_irq_proc(unsigned int irq,struct irq_desc * desc)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void vfree(const void * addr)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void * vmap(struct page ** pages,unsigned int count,unsigned long flags,pgprot_t prot)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void vunmap(const void * addr)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void wake_q_add_safe(struct wake_q_head * head,struct task_struct * task)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.c b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.c
new file mode 100644
index 0000000000..c20eac9578
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.c
@@ -0,0 +1,381 @@
+/*
+ * \brief Linux emulation environment specific to this driver
+ * \author Alexander Boettcher
+ * \date 2022-01-21
+ */
+
+/*
+ * Copyright (C) 2021-2022 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#include "i915_drv.h"
+#include
+
+
+/* support for arch/x86/lib/delay.c, normally defined in init/main.c */
+unsigned long loops_per_jiffy = (1<<12);
+
+
+struct dma_fence_ops const i915_fence_ops;
+
+/* early_identify_cpu() in linux sets this up normally, used by drm_cache */
+struct cpuinfo_x86 boot_cpu_data =
+{
+ .x86_clflush_size = (sizeof(void*) == 8) ? 64 : 32,
+ .x86_cache_alignment = (sizeof(void*) == 8) ? 64 : 32,
+ .x86_phys_bits = (sizeof(void*) == 8) ? 36 : 32,
+ .x86_virt_bits = (sizeof(void*) == 8) ? 48 : 32
+};
+
+/* Bits allowed in normal kernel mappings: */
+pteval_t __default_kernel_pte_mask __read_mostly = ~0;
+
+
+int acpi_disabled = 0;
+
+
+void intel_wopcm_init_early(struct intel_wopcm * wopcm)
+{
+ wait_bit_init();
+ lx_emul_trace(__func__);
+}
+
+
+void * kmalloc_order(size_t size,gfp_t flags, unsigned int order)
+{
+ lx_emul_trace(__func__);
+ return kmalloc(size, flags);
+}
+
+
+int simple_pin_fs(struct file_system_type *type, struct vfsmount ** mount, int * count)
+{
+ lx_emul_trace(__func__);
+
+ if (!mount)
+ return -EFAULT;
+
+ if (!*mount)
+ *mount = kzalloc(sizeof(struct vfsmount), GFP_KERNEL);
+
+ if (!*mount)
+ return -ENOMEM;
+
+ if (count)
+ ++*count;
+
+ return 0;
+}
+
+
+struct inode * alloc_anon_inode(struct super_block * s)
+{
+ lx_emul_trace(__func__);
+
+ return kzalloc(sizeof(struct inode), GFP_KERNEL);
+}
+
+
+struct proc_dir_entry { char dummy [512]; };
+
+struct proc_dir_entry * proc_create_seq_private(const char * name,umode_t mode,struct proc_dir_entry * parent,const struct seq_operations * ops,unsigned int state_size,void * data)
+{
+ static struct proc_dir_entry ret;
+
+ lx_emul_trace(__func__);
+ return &ret;
+}
+
+
+void si_meminfo(struct sysinfo * val)
+{
+ /* 4M, ttm actually use only half - more or configurable XXX ? */
+ unsigned const ram_pages = 1024;
+
+ /* used by drivers/gpu/drm/ttm/ttm_device.c */
+
+ lx_emul_trace(__func__);
+
+ val->totalram = ram_pages;
+ val->sharedram = 0;
+ val->freeram = ram_pages;
+ val->bufferram = 0;
+ val->totalhigh = 0;
+ val->freehigh = 0;
+ val->mem_unit = PAGE_SIZE;
+}
+
+
+
+void __iomem * ioremap(resource_size_t phys_addr, unsigned long size)
+{
+ return lx_emul_io_mem_map(phys_addr, size);
+}
+
+
+int dma_supported(struct device * dev, u64 mask)
+{
+ lx_emul_trace(__func__);
+ return 1;
+}
+
+
+void yield()
+{
+ lx_emul_task_schedule(false /* no block */);
+}
+
+
+int fb_get_options(const char * name,char ** option)
+{
+ lx_emul_trace(__func__);
+
+ if (!option)
+ return 1;
+
+ *option = "";
+
+ return 0;
+}
+
+
+void ack_bad_irq(unsigned int irq)
+{
+ lx_emul_trace(__func__);
+}
+
+
+bool pat_enabled(void)
+{
+ lx_emul_trace(__func__);
+ return true;
+}
+
+
+pgprot_t pgprot_writecombine(pgprot_t prot)
+{
+ pgprot_t p = { .pgprot = 0 };
+ lx_emul_trace(__func__);
+ return p;
+}
+
+
+/*
+ * shmem handling as done by Josef etnaviv
+ */
+#include
+
+struct shmem_file_buffer
+{
+ void *addr;
+ struct page *pages;
+};
+
+
+struct file *shmem_file_setup(char const *name, loff_t size,
+ unsigned long flags)
+{
+ struct file *f;
+ struct inode *inode;
+ struct address_space *mapping;
+ struct shmem_file_buffer *private_data;
+ loff_t const nrpages = (size / PAGE_SIZE) + ((size % (PAGE_SIZE)) ? 1 : 0);
+
+ f = kzalloc(sizeof (struct file), 0);
+ if (!f) {
+ return (struct file*)ERR_PTR(-ENOMEM);
+ }
+
+ inode = kzalloc(sizeof (struct inode), 0);
+ if (!inode) {
+ goto err_inode;
+ }
+
+ mapping = kzalloc(sizeof (struct address_space), 0);
+ if (!mapping) {
+ goto err_mapping;
+ }
+
+ private_data = kzalloc(sizeof (struct shmem_file_buffer), 0);
+ if (!private_data) {
+ goto err_private_data;
+ }
+
+ private_data->addr = emul_alloc_shmem_file_buffer(nrpages * PAGE_SIZE);
+ if (!private_data->addr)
+ goto err_private_data_addr;
+
+ /*
+ * We call virt_to_pages eagerly here, to get continuous page
+ * objects registered in case one wants to use them immediately.
+ */
+ private_data->pages =
+ lx_emul_virt_to_pages(private_data->addr, nrpages);
+
+ mapping->private_data = private_data;
+ mapping->nrpages = nrpages;
+
+ inode->i_mapping = mapping;
+
+ atomic_long_set(&f->f_count, 1);
+ f->f_inode = inode;
+ f->f_mapping = mapping;
+ f->f_flags = flags;
+ f->f_mode = OPEN_FMODE(flags);
+ f->f_mode |= FMODE_OPENED;
+
+ return f;
+
+err_private_data_addr:
+ kfree(private_data);
+err_private_data:
+ kfree(mapping);
+err_mapping:
+ kfree(inode);
+err_inode:
+ kfree(f);
+ return (struct file*)ERR_PTR(-ENOMEM);
+}
+
+
+struct page *shmem_read_mapping_page_gfp(struct address_space *mapping,
+ pgoff_t index, gfp_t gfp)
+{
+ struct page *p;
+ struct shmem_file_buffer *private_data;
+
+ if (index > mapping->nrpages)
+ return NULL;
+
+ private_data = mapping->private_data;
+
+ p = private_data->pages;
+ return (p + index);
+}
+
+
+#ifdef CONFIG_SWIOTLB
+
+#include
+
+unsigned int swiotlb_max_segment(void)
+{
+ lx_emul_trace(__func__);
+ return PAGE_SIZE * 512;
+}
+
+
+bool is_swiotlb_active(void)
+{
+ lx_emul_trace(__func__);
+ return false;
+}
+
+#endif
+
+
+/* linux/mm/page_alloc.c */
+unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
+{
+ struct page *page = alloc_pages(gfp_mask & ~__GFP_HIGHMEM, order);
+
+ if (!page)
+ return 0;
+
+ return (unsigned long) page_address(page);
+}
+
+
+/* linux/mm/page_alloc.c */
+void free_pages(unsigned long addr, unsigned int order)
+{
+ if (addr != 0) {
+ __free_pages(virt_to_page((void *)addr), order);
+ }
+}
+
+
+void intel_gt_init_early(struct intel_gt * gt, struct drm_i915_private * i915)
+{
+ gt->i915 = i915;
+ gt->uncore = &i915->uncore;
+
+ spin_lock_init(>->irq_lock);
+
+ INIT_LIST_HEAD(>->closed_vma);
+ spin_lock_init(>->closed_lock);
+
+ init_llist_head(>->watchdog.list);
+
+ lx_emul_trace(__func__);
+}
+
+
+void __iomem * ioremap_wc(resource_size_t phys_addr, unsigned long size)
+{
+ lx_emul_trace(__func__);
+ return lx_emul_io_mem_map(phys_addr, size);
+}
+
+
+int iomap_create_wc(resource_size_t base, unsigned long size, pgprot_t *prot)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+void intel_rps_mark_interactive(struct intel_rps * rps, bool interactive)
+{
+ lx_emul_trace(__func__);
+}
+
+
+bool is_vmalloc_addr(const void * addr)
+{
+ lx_emul_trace(__func__);
+ return false;
+}
+
+
+void * memremap(resource_size_t offset, size_t size, unsigned long flags)
+{
+ lx_emul_trace(__func__);
+
+ return NULL;
+}
+
+
+void intel_vgpu_detect(struct drm_i915_private * dev_priv)
+{
+ /*
+ * We don't want to use the GPU in this display driver.
+ * By setting the ppgtt support to NONE, code paths in early driver
+ * probe/boot up are not trigged (INTEL_PPGTT_ALIASING, Lenovo T420)
+ */
+
+ struct intel_device_info *info = mkwrite_device_info(dev_priv);
+ info->ppgtt_type = INTEL_PPGTT_NONE;
+
+ printk("disabling PPGTT to avoid GPU code paths\n");
+}
+
+
+void call_rcu(struct rcu_head * head, rcu_callback_t func)
+{
+ lx_emul_trace(__func__);
+
+ func(head);
+}
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.h b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.h
new file mode 100644
index 0000000000..b6444c51c0
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul.h
@@ -0,0 +1,47 @@
+/**
+ * \brief Dummy definitions of Linux Kernel functions
+ * \author Stefan Kalkowski
+ * \date 2021-03-16
+ */
+
+/*
+ * Copyright (C) 2021 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+
+/* Needed to trace and stop */
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* fix for wait_for_completion_timeout where the __sched include is missing */
+#include
+
+struct dma_fence_work;
+struct dma_fence_work_ops;
+
+void lx_emul_time_udelay(unsigned long usec);
+
+/* shadow/asm/io.h */
+void lx_emul_io_port_outb(unsigned char value, unsigned short port);
+void lx_emul_io_port_outw(unsigned short value, unsigned short port);
+void lx_emul_io_port_outl(unsigned int value, unsigned short port);
+
+unsigned char lx_emul_io_port_inb(unsigned short port);
+unsigned short lx_emul_io_port_inw(unsigned short port);
+unsigned int lx_emul_io_port_inl(unsigned short port);
+
+void *emul_alloc_shmem_file_buffer(unsigned long);
+
+
+#include "lx_i915.h"
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul/fb.h b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul/fb.h
new file mode 100644
index 0000000000..438c52bc41
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul/fb.h
@@ -0,0 +1,29 @@
+/**
+ * \brief Lx_emul support to register Linux kernel framebuffer
+ * \author Stefan Kalkowski
+ * \date 2021-05-17
+ */
+
+/*
+ * Copyright (C) 2021 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#ifndef _LX_EMUL__FB_H_
+#define _LX_EMUL__FB_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void lx_emul_framebuffer_ready(void * base, unsigned long size,
+ unsigned xres, unsigned yres,
+ unsigned virtual_width, unsigned virtual_height);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LX_EMUL__FB_H_ */
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul/initcall_order.h b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul/initcall_order.h
new file mode 100644
index 0000000000..0185e38ae4
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul/initcall_order.h
@@ -0,0 +1,193 @@
+/*
+ * \brief Array defining order of Linux Kernel initcalls
+ * \author Automatically generated file - do no edit
+ * \date 2022-02-02
+ */
+
+#pragma once
+
+static const char * lx_emul_initcall_order[] = {
+ "__initcall_init_hw_perf_eventsearly",
+ "__initcall_start",
+ "__initcall_init_real_modeearly",
+ "__initcall_validate_x2apicearly",
+ "__initcall_register_nmi_cpu_backtrace_handlerearly",
+ "__initcall_spawn_ksoftirqdearly",
+ "__initcall_static_call_initearly",
+ "__initcall_init_zero_pfnearly",
+ "__initcall_initialize_ptr_randomearly",
+ "__initcall_init_mmap_min_addr0",
+ "__initcall_pci_realloc_setup_params0",
+ "__initcall_e820__register_nvs_regions1",
+ "__initcall_reboot_init1",
+ "__initcall_wq_sysfs_init1",
+ "__initcall_ksysfs_init1",
+ "__initcall_rcu_set_runtime_mode1",
+ "__initcall_init_jiffies_clocksource1",
+ "__initcall_init_script_binfmt1",
+ "__initcall_init_elf_binfmt1",
+ "__initcall_prandom_init_early1",
+ "__initcall_cpuidle_init1",
+ "__initcall_irq_sysfs_init2",
+ "__initcall_bdi_class_init2",
+ "__initcall_mm_sysfs_init2",
+ "__initcall_init_per_zone_wmark_min2",
+ "__initcall_pcibus_class_init2",
+ "__initcall_pci_driver_init2",
+ "__initcall_backlight_class_init2",
+ "__initcall_tty_class_init2",
+ "__initcall_vtconsole_class_init2",
+ "__initcall_mipi_dsi_bus_init2",
+ "__initcall_devlink_class_init2",
+ "__initcall_software_node_init2",
+ "__initcall_i2c_init2",
+ "__initcall_thermal_init2",
+ "__initcall_init_ladder2",
+ "__initcall_amd_postcore_init2",
+ "__initcall_bts_init3",
+ "__initcall_pt_init3",
+ "__initcall_boot_params_ksysfs_init3",
+ "__initcall_sbf_init3",
+ "__initcall_arch_kdebugfs_init3",
+ "__initcall_intel_pconfig_init3",
+ "__initcall_ffh_cstate_init3",
+ "__initcall_kcmp_cookies_init3",
+ "__initcall_acpi_pci_init3",
+ "__initcall_pci_arch_init3",
+ "__initcall_init_vdso4",
+ "__initcall_fixup_ht_bug4",
+ "__initcall_topology_init4",
+ "__initcall_uid_cache_init4",
+ "__initcall_param_sysfs_init4",
+ "__initcall_user_namespace_sysctl_init4",
+ "__initcall_oom_init4",
+ "__initcall_default_bdi_init4",
+ "__initcall_percpu_enable_async4",
+ "__initcall_init_user_reserve4",
+ "__initcall_init_admin_reserve4",
+ "__initcall_init_reserve_notifier4",
+ "__initcall_pci_slot_init4",
+ "__initcall_fbmem_init4",
+ "__initcall_acpi_init4",
+ "__initcall_pnp_init4",
+ "__initcall_misc_init4",
+ "__initcall_dma_buf_init4",
+ "__initcall_serio_init4",
+ "__initcall_input_init4",
+ "__initcall_power_supply_class_init4",
+ "__initcall_pci_subsys_init4",
+ "__initcall_nmi_warning_debugfs5",
+ "__initcall_hpet_late_init5",
+ "__initcall_init_amd_nbs5",
+ "__initcall_iomem_init_inode5",
+ "__initcall_clocksource_done_booting5",
+ "__initcall_init_pipe_fs5",
+ "__initcall_anon_inode_init5",
+ "__initcall_proc_cmdline_init5",
+ "__initcall_proc_consoles_init5",
+ "__initcall_proc_cpuinfo_init5",
+ "__initcall_proc_devices_init5",
+ "__initcall_proc_interrupts_init5",
+ "__initcall_proc_loadavg_init5",
+ "__initcall_proc_meminfo_init5",
+ "__initcall_proc_stat_init5",
+ "__initcall_proc_uptime_init5",
+ "__initcall_proc_version_init5",
+ "__initcall_proc_softirqs_init5",
+ "__initcall_proc_kmsg_init5",
+ "__initcall_proc_page_init5",
+ "__initcall_init_ramfs_fs5",
+ "__initcall_acpi_event_init5",
+ "__initcall_pnp_system_init5",
+ "__initcall_pnpacpi_init5",
+ "__initcall_chr_dev_init5",
+ "__initcall_init_acpi_pm_clocksource5",
+ "__initcall_pcibios_assign_resources5",
+ "__initcall_pci_apply_final_quirks5s",
+ "__initcall_acpi_reserve_resources5s",
+ "__initcall_populate_rootfsrootfs",
+ "__initcall_pci_iommu_initrootfs",
+ "__initcall_rapl_pmu_init6",
+ "__initcall_amd_uncore_init6",
+ "__initcall_amd_ibs_init6",
+ "__initcall_msr_init6",
+ "__initcall_intel_uncore_init6",
+ "__initcall_cstate_pmu_init6",
+ "__initcall_register_kernel_offset_dumper6",
+ "__initcall_i8259A_init_ops6",
+ "__initcall_init_tsc_clocksource6",
+ "__initcall_add_rtc_cmos6",
+ "__initcall_umwait_init6",
+ "__initcall_ioapic_init_ops6",
+ "__initcall_sysfb_init6",
+ "__initcall_iosf_mbi_init6",
+ "__initcall_proc_execdomains_init6",
+ "__initcall_ioresources_init6",
+ "__initcall_timekeeping_init_ops6",
+ "__initcall_init_clocksource_sysfs6",
+ "__initcall_init_timer_list_procfs6",
+ "__initcall_alarmtimer_init6",
+ "__initcall_clockevents_init_sysfs6",
+ "__initcall_utsname_sysctl_init6",
+ "__initcall_perf_event_sysfs_init6",
+ "__initcall_kswapd_init6",
+ "__initcall_workingset_init6",
+ "__initcall_proc_vmalloc_init6",
+ "__initcall_fcntl_init6",
+ "__initcall_proc_filesystems_init6",
+ "__initcall_start_dirtytime_writeback6",
+ "__initcall_init_devpts_fs6",
+ "__initcall_pci_proc_init6",
+ "__initcall_ged_driver_init6",
+ "__initcall_acpi_ac_init6",
+ "__initcall_acpi_button_driver_init6",
+ "__initcall_acpi_fan_driver_init6",
+ "__initcall_acpi_video_init6",
+ "__initcall_acpi_processor_driver_init6",
+ "__initcall_acpi_thermal_init6",
+ "__initcall_acpi_battery_init6",
+ "__initcall_gpio_clk_driver_init6",
+ "__initcall_plt_clk_driver_init6",
+ "__initcall_n_null_init6",
+ "__initcall_pty_init6",
+ "__initcall_serial8250_init6",
+ "__initcall_serial_pci_driver_init6",
+ "__initcall_exar_pci_driver_init6",
+ "__initcall_lpss8250_pci_driver_init6",
+ "__initcall_mid8250_pci_driver_init6",
+ "__initcall_drm_kms_helper_init6",
+ "__initcall_drm_core_init6",
+ "__initcall_i915_init6",
+ "__initcall_topology_sysfs_init6",
+ "__initcall_cacheinfo_sysfs_init6",
+ "__initcall_i8042_init6",
+ "__initcall_serport_init6",
+ "__initcall_atkbd_init6",
+ "__initcall_psmouse_init6",
+ "__initcall_pkg_temp_thermal_init6",
+ "__initcall_thermal_throttle_init_device6",
+ "__initcall_pmc_atom_init6",
+ "__initcall_hpet_insert_resource7",
+ "__initcall_update_mp_table7",
+ "__initcall_lapic_insert_resource7",
+ "__initcall_print_ICs7",
+ "__initcall_create_tlb_single_page_flush_ceiling7",
+ "__initcall_init_oops_id7",
+ "__initcall_reboot_ksysfs_init7",
+ "__initcall_sched_clock_init_late7",
+ "__initcall_sched_init_debug7",
+ "__initcall_cpu_latency_qos_init7",
+ "__initcall_printk_late_init7",
+ "__initcall_check_early_ioremap_leak7",
+ "__initcall_prandom_init_late7",
+ "__initcall_pci_resource_alignment_sysfs_init7",
+ "__initcall_pci_sysfs_init7",
+ "__initcall_sync_state_resume_initcall7",
+ "__initcall_deferred_probe_initcall7",
+ "__initcall_pci_mmcfg_late_insert_resources7",
+ "__initcall_clk_disable_unused7s",
+ "__initcall_con_initcon",
+ "__initcall_end",
+ "__initcall_univ8250_console_initcon",
+ "END_OF_INITCALL_ORDER_ARRAY_DUMMY_ENTRY"
+};
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul/pci_fixups.h b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul/pci_fixups.h
new file mode 100644
index 0000000000..22a98ff709
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/lx_emul/pci_fixups.h
@@ -0,0 +1,18 @@
+/*
+ * \brief PCI fixups
+ * \author Josef Soentgen
+ * \date 2022-01-20
+ */
+
+/*
+ * Copyright (C) 2022 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#pragma once
+
+static const char * lx_emul_pci_final_fixups[] = {
+ "END_OF_PCI_FIXUPS"
+};
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/lx_i915.h b/repos/pc/src/drivers/framebuffer/intel/pc/lx_i915.h
new file mode 100644
index 0000000000..0c3fe858d2
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/lx_i915.h
@@ -0,0 +1,37 @@
+/**
+ * \brief Interface used between Genode config/report (C++) and lx_user (C)
+ * \author Alexander Boettcher
+ * \date 2022-02-17
+ */
+
+/*
+ * Copyright (C) 2022 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#ifndef _LX_I915_H_
+#define _LX_I915_H_
+
+struct genode_mode {
+ unsigned width;
+ unsigned height;
+ unsigned hz;
+ unsigned brightness;
+ unsigned enabled;
+ unsigned preferred;
+ unsigned id;
+ char name[32];
+};
+
+void lx_emul_i915_report(void * lx_data, void * genode_xml);
+void lx_emul_i915_hotplug_connector(void * lx_data);
+void lx_emul_i915_report_connector(void * lx_data, void * genode_xml,
+ char const *name, char connected,
+ unsigned brightness);
+void lx_emul_i915_iterate_modes(void *lx_data, void * genode_data);
+void lx_emul_i915_report_modes(void * genode_xml, struct genode_mode *);
+void lx_emul_i915_connector_config(char * name, struct genode_mode *);
+
+#endif /* _LX_I915_H_ */
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/lx_user.c b/repos/pc/src/drivers/framebuffer/intel/pc/lx_user.c
new file mode 100644
index 0000000000..416d313039
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/lx_user.c
@@ -0,0 +1,457 @@
+/*
+ * \brief Post kernel activity
+ * \author Alexander Boettcher
+ * \date 2022-03-08
+ */
+
+/*
+ * Copyright (C) 2022 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+
+#include
+#include
+
+#include "i915_drv.h"
+#include "display/intel_display_types.h"
+#include "display/intel_opregion.h"
+#include "display/intel_panel.h"
+
+#include "lx_emul.h"
+
+
+enum { MAX_BRIGHTNESS = 100, INVALID_BRIGHTNESS = MAX_BRIGHTNESS + 1 };
+
+struct task_struct * lx_user_task = NULL;
+
+static struct drm_i915_private *i915 = NULL;
+
+static struct drm_fb_helper * i915_fb(void) { return &i915->fbdev->helper; }
+
+
+/*
+ * Heuristic to calculate max resolution across all connectors
+ */
+static void preferred_mode(struct drm_display_mode *prefer)
+{
+ struct drm_connector *connector = NULL;
+ struct drm_display_mode *mode = NULL;
+ struct drm_connector_list_iter conn_iter;
+
+ /* read Genode's config per connector */
+ drm_connector_list_iter_begin(i915_fb()->dev, &conn_iter);
+ drm_client_for_each_connector_iter(connector, &conn_iter) {
+ struct genode_mode conf_mode = { .enabled = 1 };
+
+ /* check for connector configuration on Genode side */
+ lx_emul_i915_connector_config(connector->name, &conf_mode);
+
+ if (!conf_mode.enabled || !conf_mode.width || !conf_mode.height)
+ continue;
+
+ if (conf_mode.width * conf_mode.height > prefer->hdisplay * prefer->vdisplay) {
+ prefer->hdisplay = conf_mode.width;
+ prefer->vdisplay = conf_mode.height;
+ }
+ }
+ drm_connector_list_iter_end(&conn_iter);
+
+ /* if nothing was configured by Genode's config, apply heuristic */
+ if (!prefer->hdisplay || !prefer->vdisplay) {
+ drm_connector_list_iter_begin(i915_fb()->dev, &conn_iter);
+ drm_client_for_each_connector_iter(connector, &conn_iter) {
+ list_for_each_entry(mode, &connector->modes, head) {
+ if (!mode)
+ continue;
+
+ if (mode->hdisplay * mode->vdisplay > prefer->hdisplay * prefer->vdisplay) {
+ prefer->hdisplay = mode->hdisplay;
+ prefer->vdisplay = mode->vdisplay;
+ }
+ }
+ }
+ drm_connector_list_iter_end(&conn_iter);
+ }
+}
+
+
+static void set_brightness(unsigned brightness, struct drm_connector * connector)
+{
+ struct intel_connector * intel_c = to_intel_connector(connector);
+ if (intel_c)
+ intel_panel_set_backlight_acpi(intel_c->base.state, brightness, MAX_BRIGHTNESS);
+}
+
+
+static unsigned get_brightness(struct drm_connector * const connector,
+ unsigned const brightness_error)
+{
+ struct intel_connector * intel_c = NULL;
+ struct intel_panel * panel = NULL;
+ unsigned ret;
+
+ if (!connector)
+ return brightness_error;
+
+ intel_c = to_intel_connector(connector);
+ if (!intel_c)
+ return brightness_error;
+
+ panel = &intel_c->panel;
+
+ if (!panel || !panel->backlight.device || !panel->backlight.device->ops ||
+ !panel->backlight.device->ops->get_brightness)
+ return brightness_error;
+
+ ret = panel->backlight.device->ops->get_brightness(panel->backlight.device);
+
+ /* in percentage */
+ return ret * MAX_BRIGHTNESS / panel->backlight.device->props.max_brightness;
+}
+
+
+static bool reconfigure(void * data)
+{
+ struct drm_display_mode *mode = NULL;
+ struct drm_display_mode mode_preferred = {};
+ struct drm_mode_set *mode_set = NULL;
+ struct fb_info report_fb_info = {};
+ bool report_fb = false;
+ bool retry = false;
+
+ if (!i915_fb())
+ return retry;
+
+ BUG_ON(!i915_fb()->funcs);
+ BUG_ON(!i915_fb()->funcs->fb_probe);
+
+ preferred_mode(&mode_preferred);
+
+ if (mode_preferred.hdisplay && mode_preferred.vdisplay) {
+ unsigned err = 0;
+ struct drm_fb_helper_surface_size sizes = {};
+
+ sizes.surface_depth = 32;
+ sizes.surface_bpp = 32;
+ sizes.fb_width = mode_preferred.hdisplay;
+ sizes.fb_height = mode_preferred.vdisplay;
+ sizes.surface_width = sizes.fb_width;
+ sizes.surface_height = sizes.fb_height;
+
+ err = (*i915_fb()->funcs->fb_probe)(i915_fb(), &sizes);
+ /* i915_fb()->fb contains adjusted drm_frambuffer object */
+
+ if (err || !i915_fb()->fbdev)
+ printk("setting up framebuffer failed - error=%d\n", err);
+ }
+
+ if (!i915_fb()->fb)
+ return retry;
+
+ /* data is adjusted if virtual resolution is not same size as physical fb */
+ report_fb_info = *i915_fb()->fbdev;
+
+ drm_client_for_each_modeset(mode_set, &(i915_fb()->client)) {
+ struct drm_display_mode *mode_match = NULL;
+ unsigned mode_id = 0;
+ struct drm_connector *connector = NULL;
+
+ struct genode_mode conf_mode = { .enabled = 1,
+ .brightness = INVALID_BRIGHTNESS };
+
+ if (!mode_set->connectors || !*mode_set->connectors)
+ continue;
+
+ BUG_ON(!mode_set->crtc);
+
+ /* set connector */
+ connector = *mode_set->connectors;
+
+ /* read configuration of connector */
+ lx_emul_i915_connector_config(connector->name, &conf_mode);
+
+ /* heuristics to find matching mode */
+ list_for_each_entry(mode, &connector->modes, head) {
+ mode_id ++;
+
+ if (!mode)
+ continue;
+
+ /* use mode id if configured and matches exactly */
+ if (conf_mode.id && (conf_mode.id == mode_id)) {
+ mode_match = mode;
+ break;
+ }
+
+ /* if invalid, mode is configured in second loop below */
+ if (conf_mode.width == 0 || conf_mode.height == 0) {
+ break;
+ }
+
+ /* no exact match by mode id -> try matching by size */
+ if ((mode->hdisplay != conf_mode.width) ||
+ (mode->vdisplay != conf_mode.height))
+ continue;
+
+ /* take as default any mode with matching resolution */
+ if (!mode_match) {
+ mode_match = mode;
+ continue;
+ }
+
+ /* replace matching mode iif hz matches exactly */
+ if ((conf_mode.hz != drm_mode_vrefresh(mode_match)) &&
+ (conf_mode.hz == drm_mode_vrefresh(mode)))
+ mode_match = mode;
+ }
+
+ /* apply new mode */
+ mode_id = 0;
+ list_for_each_entry(mode, &connector->modes, head) {
+ struct drm_mode_set set;
+ int err = -1;
+ bool no_match = false;
+
+ mode_id ++;
+
+ if (!mode)
+ continue;
+
+ /* no matching mode ? */
+ if (!mode_match) {
+ /* use first mode */
+ mode_match = mode;
+ /* set up preferred resolution as virtual, if nothing is enforced */
+ if (!conf_mode.preferred &&
+ mode_preferred.hdisplay &&
+ mode_preferred.vdisplay) {
+ conf_mode.preferred = 1;
+ conf_mode.width = mode_preferred.hdisplay;
+ conf_mode.height = mode_preferred.vdisplay;
+ }
+ no_match = mode->hdisplay != conf_mode.width ||
+ mode->vdisplay != conf_mode.height;
+ }
+
+ if (mode_match != mode)
+ continue;
+
+ set.crtc = mode_set->crtc;
+ set.x = 0;
+ set.y = 0;
+ set.mode = conf_mode.enabled ? mode : NULL;
+ set.connectors = &connector;
+ set.num_connectors = conf_mode.enabled ? 1 : 0;
+ set.fb = conf_mode.enabled ? i915_fb()->fb : NULL;
+
+ if (set.crtc->funcs && set.crtc->funcs->set_config &&
+ drm_drv_uses_atomic_modeset(i915_fb()->dev)) {
+
+ struct drm_modeset_acquire_ctx ctx;
+
+ DRM_MODESET_LOCK_ALL_BEGIN(i915_fb()->dev, ctx,
+ DRM_MODESET_ACQUIRE_INTERRUPTIBLE,
+ err);
+ err = set.crtc->funcs->set_config(&set, &ctx);
+
+ if (!err && conf_mode.enabled && conf_mode.brightness <= MAX_BRIGHTNESS)
+ set_brightness(conf_mode.brightness, connector);
+
+ DRM_MODESET_LOCK_ALL_END(i915_fb()->dev, ctx, err);
+
+ if (err)
+ retry = true;
+ else {
+ report_fb = true;
+
+ /* report forced resolution */
+ if (conf_mode.preferred) {
+ report_fb_info.var.xres_virtual = conf_mode.width;
+ report_fb_info.var.yres_virtual = conf_mode.height;
+ }
+ }
+ }
+
+ printk("%s: %s name='%s' id=%u %ux%u@%u%s",
+ connector->name ? connector->name : "unnamed",
+ conf_mode.enabled ? " enable" : "disable",
+ mode->name ? mode->name : "noname",
+ mode_id, mode->hdisplay,
+ mode->vdisplay, drm_mode_vrefresh(mode),
+ (err || no_match) ? "" : "\n");
+
+ if (no_match)
+ printk(" - no mode match: %ux%u\n",
+ conf_mode.width,
+ conf_mode.height);
+ if (err)
+ printk(" - failed, error=%d\n", err);
+
+ break;
+ }
+ }
+
+ if (report_fb)
+ register_framebuffer(&report_fb_info);
+
+ return retry;
+}
+
+
+static int configure_connectors(void * data)
+{
+ unsigned retry_count = 0;
+
+ while (true) {
+ bool retry = reconfigure(data);
+
+ if (retry && retry_count < 3) {
+ retry_count ++;
+
+ printk("retry applying configuration in 1s\n");
+ msleep(1000);
+ continue;
+ }
+
+ retry_count = 0;
+
+ lx_emul_task_schedule(true);
+ }
+
+ return 0;
+}
+
+
+void lx_user_init(void)
+{
+ int pid = kernel_thread(configure_connectors, NULL, CLONE_FS | CLONE_FILES);
+ lx_user_task = find_task_by_pid_ns(pid, NULL);;
+}
+
+
+static int genode_fb_client_hotplug(struct drm_client_dev *client)
+{
+ lx_emul_i915_hotplug_connector(client);
+ return 0;
+}
+
+
+void lx_emul_i915_report(void * lx_data, void * genode_data)
+{
+ struct drm_client_dev *client = lx_data;
+
+ struct drm_connector_list_iter conn_iter;
+
+ struct drm_device const *dev = client->dev;
+ struct drm_connector *connector = NULL;
+
+ drm_connector_list_iter_begin(dev, &conn_iter);
+ drm_client_for_each_connector_iter(connector, &conn_iter) {
+ lx_emul_i915_report_connector(connector, genode_data,
+ connector->name,
+ !!connector->encoder /* connected */,
+ get_brightness(connector, INVALID_BRIGHTNESS));
+ }
+ drm_connector_list_iter_end(&conn_iter);
+}
+
+
+void lx_emul_i915_iterate_modes(void * lx_data, void * genode_data)
+{
+ struct drm_connector *connector = lx_data;
+ struct drm_display_mode *mode = NULL;
+ struct drm_display_mode *prev_mode = NULL;
+ unsigned mode_id = 0;
+
+ list_for_each_entry(mode, &connector->modes, head) {
+ bool skip = false;
+
+ mode_id ++;
+
+ if (!mode)
+ continue;
+
+ /* skip duplicates - actually not really, some parameters varies ?! */
+ if (prev_mode) {
+ skip = (mode->hdisplay == prev_mode->hdisplay) &&
+ (mode->vdisplay == prev_mode->vdisplay) &&
+ (drm_mode_vrefresh(mode) == drm_mode_vrefresh(prev_mode)) &&
+ !strncmp(mode->name, prev_mode->name, DRM_DISPLAY_MODE_LEN);
+ }
+
+ if (!skip) {
+ struct genode_mode conf_mode = { .width = mode->hdisplay,
+ .height = mode->vdisplay,
+ .preferred = mode->type & (DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DEFAULT),
+ .hz = drm_mode_vrefresh(mode),
+ .id = mode_id
+ };
+
+ static_assert(sizeof(conf_mode.name) == DRM_DISPLAY_MODE_LEN);
+ memcpy(conf_mode.name, mode->name, sizeof(conf_mode.name));
+
+ lx_emul_i915_report_modes(genode_data, &conf_mode);
+ }
+
+ prev_mode = mode;
+ }
+}
+
+
+static const struct drm_client_funcs drm_fbdev_client_funcs = {
+ .owner = THIS_MODULE,
+ .hotplug = genode_fb_client_hotplug,
+};
+
+
+static void hotplug_setup(struct drm_device *dev)
+{
+ struct drm_fb_helper *hotplug_helper;
+ int ret;
+
+ hotplug_helper = kzalloc(sizeof(*hotplug_helper), GFP_KERNEL);
+ if (!hotplug_helper) {
+ drm_err(dev, "Failed to allocate fb_helper\n");
+ return;
+ }
+
+ ret = drm_client_init(dev, &hotplug_helper->client, "fbdev",
+ &drm_fbdev_client_funcs);
+ if (ret) {
+ kfree(hotplug_helper);
+ drm_err(dev, "Failed to register client: %d\n", ret);
+ return;
+ }
+
+ hotplug_helper->preferred_bpp = 32;
+
+ ret = genode_fb_client_hotplug(&hotplug_helper->client);
+ if (ret)
+ drm_dbg_kms(dev, "client hotplug ret=%d\n", ret);
+
+ drm_client_register(&hotplug_helper->client);
+
+ hotplug_helper->dev = dev;
+}
+
+
+int i915_switcheroo_register(struct drm_i915_private *i915_private)
+{
+ /* get hold of the function pointers we need for mode setting */
+ i915 = i915_private;
+
+ /* register dummy fb_helper to get notifications about hotplug events */
+ hotplug_setup(&i915_private->drm);
+
+ return 0;
+}
+
+
+void i915_switcheroo_unregister(struct drm_i915_private *i915)
+{
+ lx_emul_trace_and_stop(__func__);
+}
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/main.cc b/repos/pc/src/drivers/framebuffer/intel/pc/main.cc
new file mode 100644
index 0000000000..c0528d87a0
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/main.cc
@@ -0,0 +1,310 @@
+/*
+ * \brief Linux Intel framebuffer driver port
+ * \author Alexander Boettcher
+ * \date 2022-03-08
+ */
+
+/*
+ * Copyright (C) 2022 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+/* emulation includes */
+#include
+#include
+#include
+#include
+#include
+
+/* local includes */
+extern "C" {
+#include "lx_i915.h"
+}
+
+
+extern struct task_struct * lx_user_task;
+
+
+namespace Framebuffer {
+ using namespace Genode;
+ struct Driver;
+}
+
+
+struct Framebuffer::Driver
+{
+ Env &env;
+ Timer::Connection timer { env };
+ Attached_rom_dataspace config { env, "config" };
+ Reporter reporter { env, "connectors" };
+
+ Signal_handler config_handler { env.ep(), *this,
+ &Driver::config_update };
+ Signal_handler timer_handler { env.ep(), *this,
+ &Driver::handle_timer };
+
+ class Fb
+ {
+ private:
+
+ Capture::Connection _capture;
+ Capture::Area const _size;
+ Capture::Area const _size_phys;
+ Capture::Connection::Screen _captured_screen;
+ void * _base;
+
+ /*
+ * Non_copyable
+ */
+ Fb(const Fb&);
+ Fb & operator=(const Fb&);
+
+ public:
+
+ void paint()
+ {
+ using Pixel = Capture::Pixel;
+ Surface surface((Pixel*)_base, _size_phys);
+ _captured_screen.apply_to_surface(surface);
+ }
+
+ Fb(Env & env, void * base, Capture::Area size,
+ Capture::Area size_phys)
+ :
+ _capture(env),
+ _size(size),
+ _size_phys(size_phys),
+ _captured_screen(_capture, env.rm(), _size),
+ _base(base) {}
+
+ bool same_setup(void * base, Capture::Area &size,
+ Capture::Area &size_phys)
+ {
+ return ((base == _base) && (size == _size) &&
+ (size_phys == _size_phys));
+ }
+ };
+
+ Constructible fb {};
+
+ void config_update();
+ void generate_report(void *);
+ void lookup_config(char const *, struct genode_mode &mode);
+
+ void handle_timer()
+ {
+ if (fb.constructed()) { fb->paint(); }
+ }
+
+ Driver(Env &env) : env(env)
+ {
+ Lx_kit::initialize(env);
+
+ config.sigh(config_handler);
+ }
+
+ void start()
+ {
+ log("--- Intel framebuffer driver started ---");
+
+ lx_emul_start_kernel(nullptr);
+
+ timer.sigh(timer_handler);
+ timer.trigger_periodic(20*1000);
+ }
+};
+
+
+enum { MAX_BRIGHTNESS = 100u };
+
+
+void Framebuffer::Driver::config_update()
+{
+ config.update();
+
+ if (!config.valid() || !lx_user_task)
+ return;
+
+ lx_emul_task_unblock(lx_user_task);
+ Lx_kit::env().scheduler.schedule();
+}
+
+
+static Framebuffer::Driver & driver(Genode::Env & env)
+{
+ static Framebuffer::Driver driver(env);
+ return driver;
+}
+
+
+void Framebuffer::Driver::generate_report(void *lx_data)
+{
+ /* check for report configuration option */
+ try {
+ reporter.enabled(config.xml().sub_node("report")
+ .attribute_value(reporter.name().string(), false));
+ } catch (...) {
+ Genode::warning("Failed to enable report");
+ reporter.enabled(false);
+ }
+
+ if (!reporter.enabled()) return;
+
+ try {
+ Genode::Reporter::Xml_generator xml(reporter, [&] ()
+ {
+ lx_emul_i915_report(lx_data, &xml);
+ });
+ } catch (...) {
+ Genode::warning("Failed to generate report");
+ }
+}
+
+
+void Framebuffer::Driver::lookup_config(char const * const name,
+ struct genode_mode &mode)
+{
+ if (!config.valid())
+ return;
+
+ unsigned force_width = config.xml().attribute_value("force_width", 0u);
+ unsigned force_height = config.xml().attribute_value("force_height", 0u);
+
+ /* iterate independently of force* ever to get brightness and hz */
+ config.xml().for_each_sub_node("connector", [&] (Xml_node &node) {
+ typedef String<32> Name;
+ Name const con_policy = node.attribute_value("name", Name());
+ if (con_policy != name)
+ return;
+
+ mode.enabled = node.attribute_value("enabled", true);
+ if (!mode.enabled)
+ return;
+
+ mode.brightness = node.attribute_value("brightness",
+ unsigned(MAX_BRIGHTNESS + 1));
+
+ mode.width = node.attribute_value("width", 0U);
+ mode.height = node.attribute_value("height", 0U);
+ mode.hz = node.attribute_value("hz", 0U);
+ mode.id = node.attribute_value("mode_id", 0U);
+ });
+
+ /* enforce forced width/height if configured */
+ mode.preferred = force_width && force_height;
+ if (mode.preferred) {
+ mode.width = force_width;
+ mode.height = force_height;
+ mode.id = 0;
+ }
+}
+
+
+/**
+ * Can be called already as side-effect of `lx_emul_start_kernel`,
+ * that's why the Driver object needs to be constructed already here.
+ */
+extern "C" void lx_emul_framebuffer_ready(void * base, unsigned long,
+ unsigned xres, unsigned yres,
+ unsigned phys_width,
+ unsigned phys_height)
+{
+ auto &env = Lx_kit::env().env;
+ auto &drv = driver(env);
+ auto &fb = drv.fb;
+
+ Capture::Area area(xres, yres);
+ Capture::Area area_phys(phys_width, phys_height);
+
+ if (fb.constructed()) {
+ if (fb->same_setup(base, area, area_phys))
+ return;
+
+ fb.destruct();
+ }
+
+ /* clear artefacts */
+ if (area != area_phys)
+ Genode::memset(base, 0, area_phys.count() * 4);
+
+ fb.construct(env, base, area, area_phys);
+
+ Genode::log("framebuffer reconstructed - virtual=", xres, "x", yres,
+ " physical=", phys_width, "x", phys_height);
+}
+
+
+extern "C" void lx_emul_i915_hotplug_connector(void *data)
+{
+ Genode::Env &env = Lx_kit::env().env;
+ driver(env).generate_report(data);
+}
+
+
+void lx_emul_i915_report_connector(void * lx_data, void * genode_xml,
+ char const *name, char const connected,
+ unsigned brightness)
+{
+ auto &xml = *reinterpret_cast(genode_xml);
+
+ xml.node("connector", [&] ()
+ {
+ xml.attribute("name", name);
+ xml.attribute("connected", !!connected);
+
+ /* insane values means no brightness support - we use percentage */
+ if (brightness <= MAX_BRIGHTNESS)
+ xml.attribute("brightness", brightness);
+
+ lx_emul_i915_iterate_modes(lx_data, &xml);
+ });
+
+ /* re-read config on connector change */
+ Genode::Signal_transmitter(driver(Lx_kit::env().env).config_handler).submit();
+}
+
+
+void lx_emul_i915_report_modes(void * genode_xml, struct genode_mode *mode)
+{
+ if (!genode_xml || !mode)
+ return;
+
+ auto &xml = *reinterpret_cast(genode_xml);
+
+ xml.node("mode", [&] ()
+ {
+ xml.attribute("width", mode->width);
+ xml.attribute("height", mode->height);
+ xml.attribute("hz", mode->hz);
+ xml.attribute("mode_id", mode->id);
+ xml.attribute("mode_name", mode->name);
+ if (mode->preferred)
+ xml.attribute("preferred", true);
+ });
+}
+
+
+void lx_emul_i915_connector_config(char * name, struct genode_mode * mode)
+{
+ if (!mode || !name)
+ return;
+
+ Genode::Env &env = Lx_kit::env().env;
+ driver(env).lookup_config(name, *mode);
+}
+
+
+void Component::construct(Genode::Env &env)
+{
+ driver(env).start();
+}
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/misc.cc b/repos/pc/src/drivers/framebuffer/intel/pc/misc.cc
new file mode 100644
index 0000000000..73f6e67174
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/misc.cc
@@ -0,0 +1,20 @@
+/*
+ * \brief Misc
+ * \author Josef Soentgen
+ * \date 2022-01-20
+ */
+
+/*
+ * Copyright (C) 2022 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+/* Genode includes */
+#include
+
+extern "C" void lx_backtrace(void)
+{
+ Genode::backtrace();
+}
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_32/source.list b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_32/source.list
new file mode 100644
index 0000000000..5c6d42989c
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_32/source.list
@@ -0,0 +1,271 @@
+arch/x86/lib/delay.c
+arch/x86/lib/hweight.S
+arch/x86/pci/legacy.c
+arch/x86/platform/intel/iosf_mbi.c
+drivers/base/bus.c
+drivers/base/class.c
+drivers/base/component.c
+drivers/base/core.c
+drivers/base/dd.c
+drivers/base/devres.c
+drivers/base/driver.c
+drivers/base/platform.c
+drivers/base/property.c
+drivers/char/agp/intel-gtt.c
+drivers/clk/clk-devres.c
+drivers/dma-buf/dma-fence-array.c
+drivers/dma-buf/dma-fence.c
+drivers/dma-buf/dma-fence-chain.c
+drivers/dma-buf/dma-resv.c
+drivers/gpu/drm/drm_atomic.c
+drivers/gpu/drm/drm_atomic_helper.c
+drivers/gpu/drm/drm_atomic_state_helper.c
+drivers/gpu/drm/drm_atomic_uapi.c
+drivers/gpu/drm/drm_auth.c
+drivers/gpu/drm/drm_blend.c
+drivers/gpu/drm/drm_bridge.c
+drivers/gpu/drm/drm_cache.c
+drivers/gpu/drm/drm_client.c
+drivers/gpu/drm/drm_client_modeset.c
+drivers/gpu/drm/drm_color_mgmt.c
+drivers/gpu/drm/drm_connector.c
+drivers/gpu/drm/drm_crtc.c
+drivers/gpu/drm/drm_crtc_helper.c
+drivers/gpu/drm/drm_damage_helper.c
+drivers/gpu/drm/drm_displayid.c
+drivers/gpu/drm/drm_dp_dual_mode_helper.c
+drivers/gpu/drm/drm_dp_helper.c
+drivers/gpu/drm/drm_dp_mst_topology.c
+drivers/gpu/drm/drm_drv.c
+drivers/gpu/drm/drm_dsc.c
+drivers/gpu/drm/drm_edid.c
+drivers/gpu/drm/drm_encoder.c
+drivers/gpu/drm/drm_fb_helper.c
+drivers/gpu/drm/drm_file.c
+drivers/gpu/drm/drm_fourcc.c
+drivers/gpu/drm/drm_framebuffer.c
+drivers/gpu/drm/drm_gem.c
+drivers/gpu/drm/drm_hdcp.c
+drivers/gpu/drm/drm_managed.c
+drivers/gpu/drm/drm_mipi_dsi.c
+drivers/gpu/drm/drm_mm.c
+drivers/gpu/drm/drm_mode_config.c
+drivers/gpu/drm/drm_mode_object.c
+drivers/gpu/drm/drm_modes.c
+drivers/gpu/drm/drm_modeset_helper.c
+drivers/gpu/drm/drm_modeset_lock.c
+drivers/gpu/drm/drm_panel_orientation_quirks.c
+drivers/gpu/drm/drm_plane.c
+drivers/gpu/drm/drm_prime.c
+drivers/gpu/drm/drm_print.c
+drivers/gpu/drm/drm_probe_helper.c
+drivers/gpu/drm/drm_property.c
+drivers/gpu/drm/drm_rect.c
+drivers/gpu/drm/drm_syncobj.c
+drivers/gpu/drm/drm_sysfs.c
+drivers/gpu/drm/drm_vblank.c
+drivers/gpu/drm/drm_vblank_work.c
+drivers/gpu/drm/drm_vma_manager.c
+drivers/gpu/drm/i915/display/g4x_dp.c
+drivers/gpu/drm/i915/display/g4x_hdmi.c
+drivers/gpu/drm/i915/display/i9xx_plane.c
+drivers/gpu/drm/i915/display/icl_dsi.c
+drivers/gpu/drm/i915/display/intel_acpi.c
+drivers/gpu/drm/i915/display/intel_atomic.c
+drivers/gpu/drm/i915/display/intel_atomic_plane.c
+drivers/gpu/drm/i915/display/intel_audio.c
+drivers/gpu/drm/i915/display/intel_bios.c
+drivers/gpu/drm/i915/display/intel_bw.c
+drivers/gpu/drm/i915/display/intel_cdclk.c
+drivers/gpu/drm/i915/display/intel_color.c
+drivers/gpu/drm/i915/display/intel_combo_phy.c
+drivers/gpu/drm/i915/display/intel_connector.c
+drivers/gpu/drm/i915/display/intel_crt.c
+drivers/gpu/drm/i915/display/intel_crtc.c
+drivers/gpu/drm/i915/display/intel_cursor.c
+drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
+drivers/gpu/drm/i915/display/intel_ddi.c
+drivers/gpu/drm/i915/display/intel_display.c
+drivers/gpu/drm/i915/display/intel_display_power.c
+drivers/gpu/drm/i915/display/intel_dmc.c
+drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
+drivers/gpu/drm/i915/display/intel_dp_aux.c
+drivers/gpu/drm/i915/display/intel_dp.c
+drivers/gpu/drm/i915/display/intel_dp_hdcp.c
+drivers/gpu/drm/i915/display/intel_dpio_phy.c
+drivers/gpu/drm/i915/display/intel_dp_link_training.c
+drivers/gpu/drm/i915/display/intel_dpll.c
+drivers/gpu/drm/i915/display/intel_dpll_mgr.c
+drivers/gpu/drm/i915/display/intel_dp_mst.c
+drivers/gpu/drm/i915/display/intel_dsb.c
+drivers/gpu/drm/i915/display/intel_dsi.c
+drivers/gpu/drm/i915/display/intel_dsi_vbt.c
+drivers/gpu/drm/i915/display/intel_fb.c
+drivers/gpu/drm/i915/display/intel_fbc.c
+drivers/gpu/drm/i915/display/intel_fbdev.c
+drivers/gpu/drm/i915/display/intel_fdi.c
+drivers/gpu/drm/i915/display/intel_fifo_underrun.c
+drivers/gpu/drm/i915/display/intel_frontbuffer.c
+drivers/gpu/drm/i915/display/intel_global_state.c
+drivers/gpu/drm/i915/display/intel_gmbus.c
+drivers/gpu/drm/i915/display/intel_hdcp.c
+drivers/gpu/drm/i915/display/intel_hdmi.c
+drivers/gpu/drm/i915/display/intel_hotplug.c
+drivers/gpu/drm/i915/display/intel_lpe_audio.c
+drivers/gpu/drm/i915/display/intel_lspcon.c
+drivers/gpu/drm/i915/display/intel_lvds.c
+drivers/gpu/drm/i915/display/intel_opregion.c
+drivers/gpu/drm/i915/display/intel_overlay.c
+drivers/gpu/drm/i915/display/intel_panel.c
+drivers/gpu/drm/i915/display/intel_pps.c
+drivers/gpu/drm/i915/display/intel_psr.c
+drivers/gpu/drm/i915/display/intel_quirks.c
+drivers/gpu/drm/i915/display/intel_sdvo.c
+drivers/gpu/drm/i915/display/intel_sprite.c
+drivers/gpu/drm/i915/display/intel_tc.c
+drivers/gpu/drm/i915/display/intel_vdsc.c
+drivers/gpu/drm/i915/display/intel_vga.c
+drivers/gpu/drm/i915/display/intel_vrr.c
+drivers/gpu/drm/i915/display/skl_scaler.c
+drivers/gpu/drm/i915/display/skl_universal_plane.c
+drivers/gpu/drm/i915/display/vlv_dsi.c
+drivers/gpu/drm/i915/display/vlv_dsi_pll.c
+drivers/gpu/drm/i915/gem/i915_gem_clflush.c
+drivers/gpu/drm/i915/gem/i915_gem_domain.c
+drivers/gpu/drm/i915/gem/i915_gem_internal.c
+drivers/gpu/drm/i915/gem/i915_gem_lmem.c
+drivers/gpu/drm/i915/gem/i915_gem_object.c
+drivers/gpu/drm/i915/gem/i915_gem_pages.c
+drivers/gpu/drm/i915/gem/i915_gem_region.c
+drivers/gpu/drm/i915/gem/i915_gem_shmem.c
+drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
+drivers/gpu/drm/i915/gem/i915_gem_stolen.c
+drivers/gpu/drm/i915/gem/i915_gem_tiling.c
+drivers/gpu/drm/i915/gem/i915_gem_wait.c
+drivers/gpu/drm/i915/gt/intel_ggtt.c
+drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
+drivers/gpu/drm/i915/gt/intel_gtt.c
+drivers/gpu/drm/i915/i915_active.c
+drivers/gpu/drm/i915/i915_config.c
+drivers/gpu/drm/i915/i915_drv.c
+drivers/gpu/drm/i915/i915_gem_gtt.c
+drivers/gpu/drm/i915/i915_getparam.c
+drivers/gpu/drm/i915/i915_globals.c
+drivers/gpu/drm/i915/i915_irq.c
+drivers/gpu/drm/i915/i915_memcpy.c
+drivers/gpu/drm/i915/i915_mitigations.c
+drivers/gpu/drm/i915/i915_params.c
+drivers/gpu/drm/i915/i915_pci.c
+drivers/gpu/drm/i915/i915_scatterlist.c
+drivers/gpu/drm/i915/i915_suspend.c
+drivers/gpu/drm/i915/i915_sw_fence.c
+drivers/gpu/drm/i915/i915_sw_fence_work.c
+drivers/gpu/drm/i915/i915_sysfs.c
+drivers/gpu/drm/i915/i915_utils.c
+drivers/gpu/drm/i915/i915_vma.c
+drivers/gpu/drm/i915/intel_device_info.c
+drivers/gpu/drm/i915/intel_dram.c
+drivers/gpu/drm/i915/intel_memory_region.c
+drivers/gpu/drm/i915/intel_pch.c
+drivers/gpu/drm/i915/intel_pm.c
+drivers/gpu/drm/i915/intel_region_ttm.c
+drivers/gpu/drm/i915/intel_runtime_pm.c
+drivers/gpu/drm/i915/intel_sideband.c
+drivers/gpu/drm/i915/intel_step.c
+drivers/gpu/drm/i915/intel_uncore.c
+drivers/gpu/drm/i915/intel_wakeref.c
+drivers/gpu/drm/i915/vlv_suspend.c
+drivers/gpu/drm/ttm/ttm_bo.c
+drivers/gpu/drm/ttm/ttm_device.c
+drivers/gpu/drm/ttm/ttm_pool.c
+drivers/gpu/drm/ttm/ttm_resource.c
+drivers/gpu/drm/ttm/ttm_sys_manager.c
+drivers/gpu/drm/ttm/ttm_tt.c
+drivers/i2c/algos/i2c-algo-bit.c
+drivers/i2c/i2c-boardinfo.c
+drivers/i2c/i2c-core-acpi.c
+drivers/i2c/i2c-core-base.c
+drivers/pci/access.c
+drivers/pci/bus.c
+drivers/pci/host-bridge.c
+drivers/pci/msi.c
+drivers/pci/pci.c
+drivers/pci/pci-driver.c
+drivers/pci/pci-label.c
+drivers/pci/pci-sysfs.c
+drivers/pci/probe.c
+drivers/pci/rom.c
+drivers/pci/search.c
+drivers/pci/setup-res.c
+drivers/pci/slot.c
+drivers/video/backlight/backlight.c
+drivers/video/fbdev/core/fbcmap.c
+drivers/video/fbdev/core/fb_notify.c
+drivers/video/hdmi.c
+kernel/async.c
+kernel/irq/chip.c
+kernel/irq/devres.c
+kernel/irq/handle.c
+kernel/irq/irqdesc.c
+kernel/irq/irqdomain.c
+kernel/irq/manage.c
+kernel/irq/resend.c
+kernel/kthread.c
+kernel/locking/mutex.c
+kernel/locking/osq_lock.c
+kernel/locking/rtmutex.c
+kernel/locking/rwsem.c
+kernel/notifier.c
+kernel/panic.c
+kernel/resource.c
+kernel/sched/clock.c
+kernel/sched/completion.c
+kernel/sched/swait.c
+kernel/sched/wait_bit.c
+kernel/sched/wait.c
+kernel/smpboot.c
+kernel/time/clockevents.c
+kernel/time/clocksource.c
+kernel/time/hrtimer.c
+kernel/time/jiffies.c
+kernel/time/ntp.c
+kernel/time/tick-common.c
+kernel/time/time.c
+kernel/time/timeconv.c
+kernel/time/timecounter.c
+kernel/time/timekeeping.c
+kernel/time/timer.c
+kernel/time/timer_list.c
+kernel/workqueue.c
+lib/bitmap.c
+lib/crc32.c
+lib/ctype.c
+lib/debug_locks.c
+lib/dec_and_lock.c
+lib/find_bit.c
+lib/hexdump.c
+lib/idr.c
+lib/iomap.c
+lib/irq_regs.c
+lib/kasprintf.c
+lib/klist.c
+lib/kobject.c
+lib/kobject_uevent.c
+lib/kstrtox.c
+lib/list_sort.c
+lib/llist.c
+lib/math/div64.c
+lib/pci_iomap.c
+lib/radix-tree.c
+lib/rbtree.c
+lib/refcount.c
+lib/scatterlist.c
+lib/siphash.c
+lib/sort.c
+lib/string.c
+lib/timerqueue.c
+lib/uuid.c
+lib/vsprintf.c
+lib/xarray.c
+mm/mempool.c
+mm/util.c
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_32/target.mk b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_32/target.mk
new file mode 100644
index 0000000000..6b20840600
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_32/target.mk
@@ -0,0 +1,4 @@
+include $(REP_DIR)/src/drivers/framebuffer/intel/pc/target.inc
+
+REQUIRES += 32bit
+SRC_C += lx_emul/spec/x86_32/atomic64_32.c
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_64/source.list b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_64/source.list
new file mode 100644
index 0000000000..f289270d61
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_64/source.list
@@ -0,0 +1,274 @@
+arch/x86/lib/delay.c
+arch/x86/lib/hweight.S
+arch/x86/lib/memcpy_64.S
+arch/x86/lib/memmove_64.S
+arch/x86/lib/memset_64.S
+arch/x86/pci/legacy.c
+arch/x86/platform/intel/iosf_mbi.c
+drivers/base/bus.c
+drivers/base/class.c
+drivers/base/component.c
+drivers/base/core.c
+drivers/base/dd.c
+drivers/base/devres.c
+drivers/base/driver.c
+drivers/base/platform.c
+drivers/base/property.c
+drivers/char/agp/intel-gtt.c
+drivers/clk/clk-devres.c
+drivers/dma-buf/dma-fence-array.c
+drivers/dma-buf/dma-fence.c
+drivers/dma-buf/dma-fence-chain.c
+drivers/dma-buf/dma-resv.c
+drivers/gpu/drm/drm_atomic.c
+drivers/gpu/drm/drm_atomic_helper.c
+drivers/gpu/drm/drm_atomic_state_helper.c
+drivers/gpu/drm/drm_atomic_uapi.c
+drivers/gpu/drm/drm_auth.c
+drivers/gpu/drm/drm_blend.c
+drivers/gpu/drm/drm_bridge.c
+drivers/gpu/drm/drm_cache.c
+drivers/gpu/drm/drm_client.c
+drivers/gpu/drm/drm_client_modeset.c
+drivers/gpu/drm/drm_color_mgmt.c
+drivers/gpu/drm/drm_connector.c
+drivers/gpu/drm/drm_crtc.c
+drivers/gpu/drm/drm_crtc_helper.c
+drivers/gpu/drm/drm_damage_helper.c
+drivers/gpu/drm/drm_displayid.c
+drivers/gpu/drm/drm_dp_dual_mode_helper.c
+drivers/gpu/drm/drm_dp_helper.c
+drivers/gpu/drm/drm_dp_mst_topology.c
+drivers/gpu/drm/drm_drv.c
+drivers/gpu/drm/drm_dsc.c
+drivers/gpu/drm/drm_edid.c
+drivers/gpu/drm/drm_encoder.c
+drivers/gpu/drm/drm_fb_helper.c
+drivers/gpu/drm/drm_file.c
+drivers/gpu/drm/drm_fourcc.c
+drivers/gpu/drm/drm_framebuffer.c
+drivers/gpu/drm/drm_gem.c
+drivers/gpu/drm/drm_hdcp.c
+drivers/gpu/drm/drm_managed.c
+drivers/gpu/drm/drm_mipi_dsi.c
+drivers/gpu/drm/drm_mm.c
+drivers/gpu/drm/drm_mode_config.c
+drivers/gpu/drm/drm_mode_object.c
+drivers/gpu/drm/drm_modes.c
+drivers/gpu/drm/drm_modeset_helper.c
+drivers/gpu/drm/drm_modeset_lock.c
+drivers/gpu/drm/drm_panel_orientation_quirks.c
+drivers/gpu/drm/drm_plane.c
+drivers/gpu/drm/drm_prime.c
+drivers/gpu/drm/drm_print.c
+drivers/gpu/drm/drm_probe_helper.c
+drivers/gpu/drm/drm_property.c
+drivers/gpu/drm/drm_rect.c
+drivers/gpu/drm/drm_syncobj.c
+drivers/gpu/drm/drm_sysfs.c
+drivers/gpu/drm/drm_vblank.c
+drivers/gpu/drm/drm_vblank_work.c
+drivers/gpu/drm/drm_vma_manager.c
+drivers/gpu/drm/i915/display/g4x_dp.c
+drivers/gpu/drm/i915/display/g4x_hdmi.c
+drivers/gpu/drm/i915/display/i9xx_plane.c
+drivers/gpu/drm/i915/display/icl_dsi.c
+drivers/gpu/drm/i915/display/intel_acpi.c
+drivers/gpu/drm/i915/display/intel_atomic.c
+drivers/gpu/drm/i915/display/intel_atomic_plane.c
+drivers/gpu/drm/i915/display/intel_audio.c
+drivers/gpu/drm/i915/display/intel_bios.c
+drivers/gpu/drm/i915/display/intel_bw.c
+drivers/gpu/drm/i915/display/intel_cdclk.c
+drivers/gpu/drm/i915/display/intel_color.c
+drivers/gpu/drm/i915/display/intel_combo_phy.c
+drivers/gpu/drm/i915/display/intel_connector.c
+drivers/gpu/drm/i915/display/intel_crt.c
+drivers/gpu/drm/i915/display/intel_crtc.c
+drivers/gpu/drm/i915/display/intel_cursor.c
+drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
+drivers/gpu/drm/i915/display/intel_ddi.c
+drivers/gpu/drm/i915/display/intel_display.c
+drivers/gpu/drm/i915/display/intel_display_power.c
+drivers/gpu/drm/i915/display/intel_dmc.c
+drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
+drivers/gpu/drm/i915/display/intel_dp_aux.c
+drivers/gpu/drm/i915/display/intel_dp.c
+drivers/gpu/drm/i915/display/intel_dp_hdcp.c
+drivers/gpu/drm/i915/display/intel_dpio_phy.c
+drivers/gpu/drm/i915/display/intel_dp_link_training.c
+drivers/gpu/drm/i915/display/intel_dpll.c
+drivers/gpu/drm/i915/display/intel_dpll_mgr.c
+drivers/gpu/drm/i915/display/intel_dp_mst.c
+drivers/gpu/drm/i915/display/intel_dsb.c
+drivers/gpu/drm/i915/display/intel_dsi.c
+drivers/gpu/drm/i915/display/intel_dsi_vbt.c
+drivers/gpu/drm/i915/display/intel_fb.c
+drivers/gpu/drm/i915/display/intel_fbc.c
+drivers/gpu/drm/i915/display/intel_fbdev.c
+drivers/gpu/drm/i915/display/intel_fdi.c
+drivers/gpu/drm/i915/display/intel_fifo_underrun.c
+drivers/gpu/drm/i915/display/intel_frontbuffer.c
+drivers/gpu/drm/i915/display/intel_global_state.c
+drivers/gpu/drm/i915/display/intel_gmbus.c
+drivers/gpu/drm/i915/display/intel_hdcp.c
+drivers/gpu/drm/i915/display/intel_hdmi.c
+drivers/gpu/drm/i915/display/intel_hotplug.c
+drivers/gpu/drm/i915/display/intel_lpe_audio.c
+drivers/gpu/drm/i915/display/intel_lspcon.c
+drivers/gpu/drm/i915/display/intel_lvds.c
+drivers/gpu/drm/i915/display/intel_opregion.c
+drivers/gpu/drm/i915/display/intel_overlay.c
+drivers/gpu/drm/i915/display/intel_panel.c
+drivers/gpu/drm/i915/display/intel_pps.c
+drivers/gpu/drm/i915/display/intel_psr.c
+drivers/gpu/drm/i915/display/intel_quirks.c
+drivers/gpu/drm/i915/display/intel_sdvo.c
+drivers/gpu/drm/i915/display/intel_sprite.c
+drivers/gpu/drm/i915/display/intel_tc.c
+drivers/gpu/drm/i915/display/intel_vdsc.c
+drivers/gpu/drm/i915/display/intel_vga.c
+drivers/gpu/drm/i915/display/intel_vrr.c
+drivers/gpu/drm/i915/display/skl_scaler.c
+drivers/gpu/drm/i915/display/skl_universal_plane.c
+drivers/gpu/drm/i915/display/vlv_dsi.c
+drivers/gpu/drm/i915/display/vlv_dsi_pll.c
+drivers/gpu/drm/i915/gem/i915_gem_clflush.c
+drivers/gpu/drm/i915/gem/i915_gem_domain.c
+drivers/gpu/drm/i915/gem/i915_gem_internal.c
+drivers/gpu/drm/i915/gem/i915_gem_lmem.c
+drivers/gpu/drm/i915/gem/i915_gem_object.c
+drivers/gpu/drm/i915/gem/i915_gem_pages.c
+drivers/gpu/drm/i915/gem/i915_gem_region.c
+drivers/gpu/drm/i915/gem/i915_gem_shmem.c
+drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
+drivers/gpu/drm/i915/gem/i915_gem_stolen.c
+drivers/gpu/drm/i915/gem/i915_gem_tiling.c
+drivers/gpu/drm/i915/gem/i915_gem_wait.c
+drivers/gpu/drm/i915/gt/intel_ggtt.c
+drivers/gpu/drm/i915/gt/intel_gtt.c
+drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
+drivers/gpu/drm/i915/i915_active.c
+drivers/gpu/drm/i915/i915_config.c
+drivers/gpu/drm/i915/i915_drv.c
+drivers/gpu/drm/i915/i915_gem_gtt.c
+drivers/gpu/drm/i915/i915_getparam.c
+drivers/gpu/drm/i915/i915_globals.c
+drivers/gpu/drm/i915/i915_irq.c
+drivers/gpu/drm/i915/i915_memcpy.c
+drivers/gpu/drm/i915/i915_mitigations.c
+drivers/gpu/drm/i915/i915_params.c
+drivers/gpu/drm/i915/i915_pci.c
+drivers/gpu/drm/i915/i915_scatterlist.c
+drivers/gpu/drm/i915/i915_suspend.c
+drivers/gpu/drm/i915/i915_sw_fence.c
+drivers/gpu/drm/i915/i915_sw_fence_work.c
+drivers/gpu/drm/i915/i915_sysfs.c
+drivers/gpu/drm/i915/i915_utils.c
+drivers/gpu/drm/i915/i915_vma.c
+drivers/gpu/drm/i915/intel_device_info.c
+drivers/gpu/drm/i915/intel_dram.c
+drivers/gpu/drm/i915/intel_memory_region.c
+drivers/gpu/drm/i915/intel_pch.c
+drivers/gpu/drm/i915/intel_pm.c
+drivers/gpu/drm/i915/intel_region_ttm.c
+drivers/gpu/drm/i915/intel_runtime_pm.c
+drivers/gpu/drm/i915/intel_sideband.c
+drivers/gpu/drm/i915/intel_step.c
+drivers/gpu/drm/i915/intel_uncore.c
+drivers/gpu/drm/i915/intel_wakeref.c
+drivers/gpu/drm/i915/vlv_suspend.c
+drivers/gpu/drm/ttm/ttm_bo.c
+drivers/gpu/drm/ttm/ttm_device.c
+drivers/gpu/drm/ttm/ttm_pool.c
+drivers/gpu/drm/ttm/ttm_resource.c
+drivers/gpu/drm/ttm/ttm_sys_manager.c
+drivers/gpu/drm/ttm/ttm_tt.c
+drivers/i2c/algos/i2c-algo-bit.c
+drivers/i2c/i2c-boardinfo.c
+drivers/i2c/i2c-core-acpi.c
+drivers/i2c/i2c-core-base.c
+drivers/pci/access.c
+drivers/pci/bus.c
+drivers/pci/host-bridge.c
+drivers/pci/msi.c
+drivers/pci/pci.c
+drivers/pci/pci-driver.c
+drivers/pci/pci-label.c
+drivers/pci/pci-sysfs.c
+drivers/pci/probe.c
+drivers/pci/rom.c
+drivers/pci/search.c
+drivers/pci/setup-res.c
+drivers/pci/slot.c
+drivers/video/backlight/backlight.c
+drivers/video/fbdev/core/fbcmap.c
+drivers/video/fbdev/core/fb_notify.c
+drivers/video/hdmi.c
+kernel/async.c
+kernel/irq/chip.c
+kernel/irq/devres.c
+kernel/irq/handle.c
+kernel/irq/irqdesc.c
+kernel/irq/irqdomain.c
+kernel/irq/manage.c
+kernel/irq/resend.c
+kernel/kthread.c
+kernel/locking/mutex.c
+kernel/locking/osq_lock.c
+kernel/locking/rtmutex.c
+kernel/locking/rwsem.c
+kernel/notifier.c
+kernel/panic.c
+kernel/resource.c
+kernel/sched/clock.c
+kernel/sched/completion.c
+kernel/sched/swait.c
+kernel/sched/wait_bit.c
+kernel/sched/wait.c
+kernel/smpboot.c
+kernel/time/clockevents.c
+kernel/time/clocksource.c
+kernel/time/hrtimer.c
+kernel/time/jiffies.c
+kernel/time/ntp.c
+kernel/time/tick-broadcast.c
+kernel/time/tick-common.c
+kernel/time/time.c
+kernel/time/timeconv.c
+kernel/time/timecounter.c
+kernel/time/timekeeping.c
+kernel/time/timer.c
+kernel/time/timer_list.c
+kernel/workqueue.c
+lib/bitmap.c
+lib/crc32.c
+lib/ctype.c
+lib/debug_locks.c
+lib/dec_and_lock.c
+lib/find_bit.c
+lib/hexdump.c
+lib/idr.c
+lib/iomap.c
+lib/irq_regs.c
+lib/kasprintf.c
+lib/klist.c
+lib/kobject.c
+lib/kobject_uevent.c
+lib/kstrtox.c
+lib/list_sort.c
+lib/llist.c
+lib/pci_iomap.c
+lib/radix-tree.c
+lib/rbtree.c
+lib/refcount.c
+lib/scatterlist.c
+lib/siphash.c
+lib/sort.c
+lib/string.c
+lib/timerqueue.c
+lib/uuid.c
+lib/vsprintf.c
+lib/xarray.c
+mm/mempool.c
+mm/util.c
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_64/target.mk b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_64/target.mk
new file mode 100644
index 0000000000..2504ab6cf0
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_64/target.mk
@@ -0,0 +1,3 @@
+include $(REP_DIR)/src/drivers/framebuffer/intel/pc/target.inc
+
+REQUIRES += 64bit
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/target.inc b/repos/pc/src/drivers/framebuffer/intel/pc/target.inc
new file mode 100644
index 0000000000..2a42f703cc
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/target.inc
@@ -0,0 +1,41 @@
+REQUIRES := x86
+
+REL_PRG_DIR := $(PRG_DIR)/../..
+
+TARGET := pc_intel_fb_drv
+LIBS := base pc_lx_emul blit
+
+INC_DIR += $(REL_PRG_DIR)
+SRC_CC += main.cc
+SRC_CC += misc.cc
+SRC_CC += time.cc
+SRC_CC += emul.cc
+SRC_C += dummies.c
+SRC_C += lx_emul.c
+SRC_C += $(notdir $(wildcard $(REL_PRG_DIR)/generated_dummies.c))
+SRC_C += fb.c
+SRC_C += lx_user.c
+SRC_C += gem.c
+SRC_C += common_dummies.c
+SRC_C += lx_emul/spec/x86/pci.c
+SRC_C += lx_emul/shadow/mm/page_alloc.c
+
+vpath %.c $(REL_PRG_DIR)
+vpath %.cc $(REL_PRG_DIR)
+vpath common_dummies.c $(REP_DIR)/src/lib/pc/lx_emul
+
+LX_SRC_DIR := $(call select_from_ports,linux)/src/linux
+ifeq ($(wildcard $(LX_SRC_DIR)),)
+LX_SRC_DIR := $(call select_from_repositories,src/linux)
+endif
+ifeq ($(wildcard $(LX_SRC_DIR)),)
+fail
+endif
+
+INC_DIR += $(LX_SRC_DIR)/drivers/gpu/drm/i915
+
+CC_C_OPT += -Wno-unused-label
+
+#
+# Genode C-API backends
+#
diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/time.cc b/repos/pc/src/drivers/framebuffer/intel/pc/time.cc
new file mode 100644
index 0000000000..a4fc28cd2d
--- /dev/null
+++ b/repos/pc/src/drivers/framebuffer/intel/pc/time.cc
@@ -0,0 +1,25 @@
+/*
+ * \brief Lx_emul udelay function for very short delays
+ * \author Stefan Kalkowski
+ * \date 2021-07-10
+ */
+
+/*
+ * Copyright (C) 2021 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+#include
+
+extern "C" void lx_emul_time_udelay(unsigned long usec);
+extern "C" void lx_emul_time_udelay(unsigned long usec)
+{
+ if (usec > 100)
+ Genode::error("Cannot delay that long ", usec, " microseconds");
+
+ auto start = Lx_kit::env().timer.curr_time().trunc_to_plain_us().value;
+ while (Lx_kit::env().timer.curr_time().trunc_to_plain_us().value < (start + usec)) { ; }
+}
diff --git a/repos/pc/src/pc_linux/target.inc b/repos/pc/src/pc_linux/target.inc
index b8b8de3824..73dffe1992 100644
--- a/repos/pc/src/pc_linux/target.inc
+++ b/repos/pc/src/pc_linux/target.inc
@@ -21,6 +21,12 @@ LX_ENABLE += ACPI
LX_ENABLE += USB_SUPPORT USB USB_ARCH_HAS_HCD USB_XHCI_HCD USB_EHCI_HCD USB_OHCI_HCD
LX_ENABLE += USB_PCI USB_UHCI_HCD
+# Intel framebuffer
+LX_ENABLE += DRM DRM_I915
+
+# to automatically set up screen mode at boot time
+LX_ENABLE += FB
+
# mandatory fs support
LX_ENABLE += PROC_FS SYSFS