pc: update intel display driver

Fixes #4450
This commit is contained in:
Alexander Boettcher 2022-01-21 11:07:28 +01:00 committed by Christian Helmuth
parent 7813fca946
commit c0560ab0cb
30 changed files with 6134 additions and 15 deletions

View File

@ -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 {
<any-service> <parent/> <any-child/> </any-service>
</default-route>
<default caps="100"/>
<report init_ram="yes" child_ram="yes" delay_ms="10000"/>
<report init_ram="yes" child_ram="yes" delay_ms="10000"/>}
append_if $use_top config {
<start name="top">
<resource name="RAM" quantum="2M"/>
<config period_ms="40000"/>
</start>
</start>}
append config {
<start name="report_rom" priority="-1">
<resource name="RAM" quantum="2M"/>
<provides> <service name="Report" /> <service name="ROM" /> </provides>
@ -124,12 +132,42 @@ append config {
<service name="File_system"> <child name="config_fs" /> </service>
<any-service> <parent/> <any-child/> </any-service>
</route>
</start>
</start>}
<start name="intel_fb_drv" caps="1000">
<binary name="legacy_intel_fb_drv"/>
<resource name="RAM" quantum="60M"/>
append_if $use_gpu config {
<start name="intel_gpu_drv" caps="2000">
<resource name="RAM" quantum="40M"/>
<provides>
<service name="Gpu"/>
<service name="Platform"/>
</provides>
<config>
<device vendor="0x8086" device="0x1606" generation="8" platform="broadwell" description="HD Graphics (BDW GT1 ULT)"/>
<device vendor="0x8086" device="0x1616" generation="8" platform="broadwell" description="HD Graphics 5500 (BDW GT2 ULT)"/>
<device vendor="0x8086" device="0x1622" generation="8" platform="broadwell" description="Iris Pro Graphics 6200 (BDW GT3e)"/>
<device vendor="0x8086" device="0x1916" generation="9" platform="skylake" description="HD Graphics 520 (Skylake, Gen9)"/>
<device vendor="0x8086" device="0x191b" generation="9" platform="skylake" description="HD Graphics 530 (Skylake, Gen9)"/>
<device vendor="0x8086" device="0x5916" generation="9" platform="kabylake" description="HD Graphics 620 (Kaby Lake, Gen9p5)"/>
<device vendor="0x8086" device="0x5917" generation="9" platform="kabylake" description="UHD Graphics 620 (Kaby Lake, Gen9p5)"/>
<device vendor="0x8086" device="0x591b" generation="9" platform="kabylake" description="HD Graphics 630 (Kaby Lake, Gen9p5)"/>
<device vendor="0x8086" device="0x3ea0" generation="9" platform="whiskeylake" description="UHD Graphics 620 (Whiskey Lake, Gen9p5)"/>
</config>
<route>
<service name="Platform"> <parent/> </service>
<any-service> <parent /> <any-child/> </any-service>
</route>
</start>}
append config {
<start name="intel_fb_drv" caps="1000">
<binary name="pc_intel_fb_drv"/>
<resource name="RAM" quantum="60M"/>
<route>}
append_if $use_gpu config {
<service name="Platform"> <child name="intel_gpu_drv"/> </service>}
append config {
<service name="ROM" label="config">
<child name="config_rom" label="fb_drv.config"/> </service>
<service name="Report"> <child name="report_rom"/> </service>
@ -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

View File

@ -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

View File

@ -1,5 +1,5 @@
<config width="1024" height="768" buffered="yes">
<config width="1024" height="768">
<report connectors="yes"/>
<connector name="eDP-36" width="1920" height="1080" enabled="true"/>
<!-- <connector name="HDMI-A-56" width="1024" height="768" hz="75" enabled="true"/> -->
<!-- <connector name="eDP-1" width="1920" height="1080" enabled="true" brightness="75"/> -->
<!-- <connector name="HDMI-A-1" width="1024" height="768" hz="75" enabled="true"/> -->
</config>

View File

@ -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", [&] () { });

View File

@ -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 $@

View File

@ -0,0 +1 @@
2022-03-18-b f8a33eb3aa079a798959ed3b6f5920239729933c

View File

@ -0,0 +1,9 @@
base
os
platform_session
timer_session
report_session
capture_session
blit
genode_c_api
pc_linux

View File

@ -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:
! <config>
! <connector name="LVDS-11" width="1280" height="800" hz="60" brightness="75" enabled="true"/>
! </config>
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:
! <config force_width="1024" force_height="768">
! </config>
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:
! <config>
! <report connectors="yes"/>
! </config>
The exported report has the following format:
! <connectors>
! <connector name="LVDS-11" connected="1" brightness="50">
! <mode width="1280" height="800" hz="60"/>
! ...
! </connector>
! <connector name="HDMI-A-1" connected="false"/>
! <connector name="DP-1" connected="false"/>
! </connectors>
The brightness attribute is reported only if the hardware supports it.

View File

@ -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

View File

@ -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 <lx_emul/debug.h>
#include <linux/math64.h>
#include "i915_drv.h"
#include <acpi/acpixf.h>
#include <acpi/video.h>
#include <linux/clocksource.h>
#include <linux/cpuhotplug.h>
#include <linux/kernel_stat.h>
#include <linux/kernfs.h>
#include <linux/kobject.h>
#include <linux/nls.h>
#include <linux/property.h>
#include <linux/random.h>
#include <linux/rcupdate.h>
#include <linux/sched/loadavg.h>
#include <linux/sched/signal.h>
#include <linux/syscore_ops.h>
#include <linux/timekeeper_internal.h>
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__);
}

View File

@ -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 <lx_kit/env.h>
/* 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<void *>(buffer.virt_addr());
}
void emul_free_shmem_file_buffer(void *addr)
{
Lx_kit::env().memory.free_buffer(addr);
}

View File

@ -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 <linux/kernel.h>
#include <linux/slab.h>
#include <linux/fb.h>
#include <lx_emul/fb.h>
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;
}

View File

@ -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 <lx_emul.h>
#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;
}

File diff suppressed because it is too large Load Diff

View File

@ -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 <lx_emul.h>
#include <lx_emul/io_mem.h>
#include <linux/dma-fence.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/proc_fs.h>
#include "i915_drv.h"
#include <drm/drm_managed.h>
/* 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 <linux/shmem_fs.h>
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 <linux/swiotlb.h>
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(&gt->irq_lock);
INIT_LIST_HEAD(&gt->closed_vma);
spin_lock_init(&gt->closed_lock);
init_llist_head(&gt->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);
}

View File

@ -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 <lx_emul/debug.h>
#ifdef __cplusplus
extern "C" {
#endif
/* fix for wait_for_completion_timeout where the __sched include is missing */
#include <linux/sched/debug.h>
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

View File

@ -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_ */

View File

@ -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"
};

View File

@ -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"
};

View File

@ -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_ */

View File

@ -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 <linux/sched/task.h>
#include <drm/drm_fb_helper.h>
#include <drm/drm_print.h>
#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__);
}

View File

@ -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 <base/attached_rom_dataspace.h>
#include <base/component.h>
#include <timer_session/connection.h>
#include <capture_session/connection.h>
#include <os/pixel_rgb888.h>
#include <os/reporter.h>
#include <util/reconstructible.h>
/* emulation includes */
#include <lx_emul/init.h>
#include <lx_emul/fb.h>
#include <lx_emul/task.h>
#include <lx_kit/env.h>
#include <lx_kit/init.h>
/* 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<Driver> config_handler { env.ep(), *this,
&Driver::config_update };
Signal_handler<Driver> 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<Pixel> 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> 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::Reporter::Xml_generator *>(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::Reporter::Xml_generator *>(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();
}

View File

@ -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 <os/backtrace.h>
extern "C" void lx_backtrace(void)
{
Genode::backtrace();
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,3 @@
include $(REP_DIR)/src/drivers/framebuffer/intel/pc/target.inc
REQUIRES += 64bit

View File

@ -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
#

View File

@ -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 <base/log.h>
#include <lx_kit/env.h>
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)) { ; }
}

View File

@ -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