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