<config>

	<!--
		This is forked from Genode 24.02's repos/gems/sculpt/drivers/pc file
	-->
	
	<parent-provides>
		<service name="ROM"/>
		<service name="IRQ"/>
		<service name="IO_MEM"/>
		<service name="IO_PORT"/>
		<service name="PD"/>
		<service name="RM"/>
		<service name="CPU"/>
		<service name="LOG"/>
		<service name="Timer"/>
		<service name="Report"/>
		<service name="Capture"/>
		<service name="Event"/>
	</parent-provides>

	<report child_caps="true" child_ram="true" init_caps="true" init_ram="true" delay_ms="5000"/>

	<default-route>
		<any-service> <parent/> <any-child/> </any-service>
	</default-route>

	<default caps="100"/>

	<service name="Block">
		<default-policy> <child name="dynamic"/> </default-policy> </service>
<!--		<default-policy> <child name="ahci"/> </default-policy> </service> -->

	<service name="Usb">
		<default-policy> <child name="usb"/> </default-policy> </service>

	<service name="Platform">
		<default-policy> <child name="platform"/> </default-policy> </service>

	<service name="Gpu">
		<default-policy> <child name="dynamic"/> </default-policy> </service>

<!-- Inbound requests for 'Event': in HoG we also allow accessing event_filter (required by run_depot/vnc_server) -->
	<service name="Event">
		<default-policy> <child name="event_filter"/> </default-policy> </service>

	<start name="report_rom">
		<resource name="RAM" quantum="2M"/>
		<provides> <service name="Report"/> <service name="ROM"/> </provides>
		<config verbose="no">
			<policy label="pci_decode -> system"            report="acpi -> acpi"/>  <!-- was: acpi_drv: acpi -->
			<policy label="platform -> acpi"                report="acpi -> acpi"/>  <!-- was: acpi_drv: acpi -->
			<policy label="platform -> devices"             report="pci_decode -> devices"/>
			<policy label="usb -> config"                   report="driver_manager -> usb.config"/>
			<policy label="dynamic -> config"               report="driver_manager -> init.config"/>
			<policy label="driver_manager -> devices"       report="platform -> devices"/>
			<policy label="driver_manager -> usb_devices"   report="usb -> devices"/>
			<policy label="driver_manager -> dynamic_state" report="dynamic -> state"/>
			<policy label="driver_manager -> ahci_ports"    report="dynamic -> ahci_ports"/>
			<policy label="driver_manager -> nvme_ns"       report="dynamic -> nvme_ns"/>
			<policy label="rom_reporter -> acpi"            report="acpi -> acpi"/>  <!-- was: acpi_drv: acpi -->
			<policy label="rom_reporter -> devices"         report="platform -> devices"/>
			<policy label="rom_reporter -> pci_devices"     report="pci_decode -> devices"/>
			<policy label="rom_reporter -> usb_devices"     report="usb -> devices"/>
			<policy label="rom_reporter -> dynamic_state"   report="dynamic -> state"/>
			<policy label="usb_hid -> report"               report="usb -> devices"/>
			<policy label="dynamic -> intel_fb -> intel_opregion"  report="acpi -> intel_opregion"/>  <!-- was: acpi_drv: acpi -->
	<!--
			<policy label="intel_fb -> intel_opregion" report="acpi -> intel_opregion"/>
			<policy label="intel_fb_controller -> connectors" report="intel_fb -> connectors"/>
	-->
			<policy label="intel_fb_controller -> connectors" report="dynamic -> intel_fb -> connectors"/>
		</config>
	</start>

	<start name="rom_reporter">
		<resource name="RAM" quantum="1M"/>
		<config>
			<rom label="acpi"/>
			<rom label="pci_devices"/>
			<rom label="devices"/>
			<rom label="usb_devices"/>
			<rom label="dynamic_state"/>
		</config>
		<route>
			<service name="ROM"    label="acpi">          <child name="report_rom"/> </service>
			<service name="ROM"    label="pci_devices">   <child name="report_rom"/> </service>
			<service name="ROM"    label="devices">       <child name="report_rom"/> </service>
			<service name="ROM"    label="usb_devices">   <child name="report_rom"/> </service>
			<service name="ROM"    label="dynamic_state"> <child name="report_rom"/> </service>
			<service name="Report" label="acpi">          <parent label="acpi"/>        </service>
			<service name="Report" label="pci_devices">   <parent label="pci_devices"/> </service>
			<service name="Report" label="devices">       <parent label="devices"/>     </service>
			<service name="Report" label="usb_devices">   <parent label="usb_devices"/> </service>
			<service name="Report" label="dynamic_state"> <parent label="dynamic -> state"/> </service>
			<service name="LOG"> <parent/> </service>
			<service name="PD">  <parent/> </service>
			<service name="CPU"> <parent/> </service>
			<service name="ROM"> <parent/> </service>
		</route>
	</start>

	<start name="acpi" caps="350">
		<resource name="RAM" quantum="7M"/>
		<route>
			<service name="Report" label="acpi"> <child name="report_rom"/> </service>
			<service name="Report" label="intel_opregion"> <child name="report_rom"/> </service>
			<service name="Report" label="smbios_table"> <parent label="smbios_table"/> </service>
			<service name="IO_MEM"> <parent/> </service>
			<service name="LOG">    <parent/> </service>
			<service name="PD">     <parent/> </service>
			<service name="RM">     <parent/> </service>
			<service name="CPU">    <parent/> </service>
			<service name="ROM">    <parent/> </service>
		</route>
	</start>

	<start name="pci_decode" caps="350">
		<resource name="RAM" quantum="2M"/>
		<route>
			<service name="Report">             <child name="report_rom"/> </service>
			<service name="ROM" label="system"> <child name="report_rom"/> </service>
			<service name="IO_MEM"> <parent/> </service>
			<service name="LOG">    <parent/> </service>
			<service name="PD">     <parent/> </service>
			<service name="RM">     <parent/> </service>
			<service name="CPU">    <parent/> </service>
			<service name="ROM">    <parent/> </service>
		</route>
	</start>

	<!-- 24.04: pc_platform_drv now needs a sleep_states ROM (we provide a dummy for now) -->
	<start name="rom_filter"> 
		<resource name="RAM" quantum="1M"/> 
		<provides> 
			<service name="ROM"/> 
		</provides> 
		<config buffer="32K">
			<output node="sleep_states">
				<inline> <empty /> </inline>
			</output>
		</config>
	</start> 

	<start name="platform" caps="400" managing_system="yes">
		<binary name="pc_platform"/>
		<resource name="RAM" quantum="6M"/>
		<provides> <service name="Platform"/> </provides>
		<route>
			<!-- 24.04: pc_platform now needs a sleep_states ROM (we provide a dummy for now) -->
			<service name="ROM" label="sleep_states"> <child name="rom_filter" label="sleep_states"/> </service>
			<service name="ROM" label="system">  <parent label="system"/> </service>
			<service name="ROM" label="devices"> <child name="report_rom"/> </service>
			<service name="ROM" label="acpi">    <child name="report_rom"/> </service>
			<service name="Report" label="devices"> <child name="report_rom"/> </service>
			<service name="Report" label="iommu">   <parent label="iommu"/> </service>
			<service name="IRQ">     <parent/> </service>
			<service name="IO_MEM">  <parent/> </service>
			<service name="IO_PORT"> <parent/> </service>
			<service name="ROM">     <parent/> </service>
			<service name="PD">      <parent/> </service>
			<service name="CPU">     <parent/> </service>
			<service name="LOG">     <parent/> </service>
			<service name="Timer">   <parent/> </service>
		</route>
		<config>
			<report devices="yes" iommu="yes"/>
			<policy label_prefix="ps2"> <device name="ps2"/> </policy>  <!-- was: label_prefix ps2_drv -->
			<policy label_prefix="dynamic -> vesa_fb" info="yes"> <pci class="VGA"/> </policy>
		<!--
			<policy label_prefix="vesa_fb" info="yes"> <pci class="VGA"/> </policy>
		-->
			<policy label_prefix="dynamic -> ahci">    <pci class="AHCI"/>  </policy>
			<policy label_prefix="dynamic -> nvme" info="yes"> <pci class="NVME"/>  </policy>
			<policy label_prefix="usb" info="yes">     <pci class="USB"/>   </policy>
			<policy label_prefix="dynamic -> intel_gpu" info="yes">
				<pci class="VGA"/>
				<pci class="ISABRIDGE"/>
			</policy>
		<!--
			<policy label_prefix="intel_gpu" info="yes">
				<pci class="VGA"/>
				<pci class="ISABRIDGE"/>
			</policy>
		-->
			<policy label_suffix="-> wifi" msix="false" info="yes"> <pci class="WIFI"/> </policy>
			<policy label_suffix="-> nic" info="yes">   <pci class="ETHERNET"/> </policy>
			<policy label_suffix="-> audio"> <pci class="AUDIO"/> <pci class="HDAUDIO"/> </policy>
			<policy label="acpica"> <device name="acpi"/> </policy>
		</config>
	</start>

	<start name="usb" caps="200">
		<binary name="pc_usb_host"/>
		<resource name="RAM" quantum="16M"/>
		<provides> <service name="Usb"/> </provides>
		<route>
			<service name="Platform"> <child name="platform"/> </service>
			<service name="ROM" label="config">
				<child name="report_rom"/> </service>
			<service name="Report" label="devices"> <child name="report_rom"/> </service>
			<service name="Report" label="config">  <parent label="usb_active_config"/> </service>
			<service name="ROM">   <parent/> </service>
			<service name="PD">    <parent/> </service>
			<service name="RM">    <parent/> </service>
			<service name="CPU">   <parent/> </service>
			<service name="LOG">   <parent/> </service>
			<service name="Timer"> <parent/> </service>
		</route>
	</start>

	<start name="usb_hid" caps="180">
		<resource name="RAM" quantum="11M"/>
		<config use_report="yes" capslock_led="rom" numlock_led="rom"/>
		<route>
			<service name="ROM" label="report"> <child name="report_rom"/> </service>
			<service name="ROM" label="capslock"> <parent label="capslock"/> </service>
			<service name="ROM" label="numlock">  <parent label="numlock"/> </service>
			<service name="ROM">   <parent/> </service>
			<service name="PD">    <parent/> </service>
			<service name="RM">    <parent/> </service>
			<service name="CPU">   <parent/> </service>
			<service name="LOG">   <parent/> </service>
			<service name="Timer"> <parent/> </service>
			<service name="Event"> <child name="event_filter" label="usb"/> </service>
			<service name="Usb">   <child name="usb"/> </service>
		</route>
	</start>

	<start name="ps2">
		<resource name="RAM" quantum="1M"/>
		<config capslock_led="rom" numlock_led="rom" system="yes"/>
		<route>
			<service name="Platform"> <child name="platform"/> </service>
			<service name="Event"> <child name="event_filter" label="ps2"/> </service>
			<service name="ROM" label="capslock"> <parent label="capslock"/> </service>
			<service name="ROM" label="numlock">  <parent label="numlock"/>  </service>
			<service name="ROM" label="system">   <parent label="system"/>   </service>
			<service name="ROM">   <parent/> </service>
			<service name="PD">    <parent/> </service>
			<service name="CPU">   <parent/> </service>
			<service name="LOG">   <parent/> </service>
			<service name="Timer"> <parent/> </service>
		</route>
	</start>

	<!-- toggle key mappings depending on the numlock state -->
	<start name="numlock_remap_rom">
		<binary name="rom_filter"/>
		<resource name="RAM" quantum="1M"/>
		<provides> <service name="ROM"/> </provides>
		<route>
			<service name="ROM" label="config">  <parent label="numlock_remap.config"/> </service>
			<service name="ROM" label="numlock"> <parent label="numlock"/> </service>
			<any-service> <parent/> </any-service>
		</route>
	</start>

	<start name="event_filter" caps="120">
		<resource name="RAM" quantum="2M"/>
		<provides> <service name="Event"/> </provides>
		<route>
			<service name="ROM" label="config">        <parent label="event_filter.config"/> </service>
			<service name="ROM" label="numlock.remap"> <child name="numlock_remap_rom"/> </service>
			<service name="ROM" label="capslock">      <parent label="capslock"/> </service>
			<service name="ROM">   <parent/> </service>
			<service name="PD">    <parent/> </service>
			<service name="CPU">   <parent/> </service>
			<service name="LOG">   <parent/> </service>
			<service name="Timer"> <parent/> </service>
			<service name="Event"> <parent/> </service>
		</route>
	</start>

	<start name="driver_manager">
		<resource name="RAM" quantum="1M"/>
		<route>
			<service name="Report" label="init.config"> <child name="report_rom"/> </service>
			<service name="Report" label="usb.config"> <child name="report_rom"/> </service>
			<service name="Report" label="block_devices"> <parent label="block_devices"/> </service>
			<service name="ROM" label="usb_devices">   <child name="report_rom"/> </service>
			<service name="ROM" label="devices">       <child name="report_rom"/> </service>
			<service name="ROM" label="ahci_ports">    <child name="report_rom"/> </service>
			<service name="ROM" label="nvme_ns">       <child name="report_rom"/> </service>
			<service name="ROM" label="dynamic_state"> <child name="report_rom"/> </service>
			<service name="LOG"> <parent/> </service>
			<service name="PD">  <parent/> </service>
			<service name="CPU"> <parent/> </service>
			<service name="ROM"> <parent/> </service>
		</route>
	</start>

	<start name="dynamic" caps="2600">
		<binary name="init"/>
		<resource name="RAM" quantum="150M"/>
<!--
	Do not do this, otherwise part_block fails to access us, with this error:
	"unable to transfer session quota (4207821 bytes, 5 caps) of forwarded Block session"
		<resource name="RAM" quantum="1G"/>
-->
		<provides>
			<service name="Framebuffer"/>
			<service name="Block"/>
			<service name="Gpu"/>
		</provides>
		<route>
			<service name="Platform"> <child name="platform"/> </service>
			<service name="Report" label="ahci_ports"> <child name="report_rom"/> </service>
			<service name="Report" label="nvme_ns"> <child name="report_rom"/> </service>
			<service name="Report" label="state"> <child name="report_rom"/> </service>
				<!-- This is needed (at least in 24.04) regardless of config: -->
			<service name="Report" label="intel_fb -> connectors"> <child name="report_rom"/> </service>
			<service name="Report"> <parent/> </service>
			<service name="Usb"> <child name="usb"/> </service>
			<service name="ROM" label="config"> <child name="report_rom"/> </service>
			<service name="ROM" label="intel_fb -> intel_opregion"> <child name="report_rom"/> </service>
			<service name="LOG">     <parent/> </service>
			<service name="PD">      <parent/> </service>
			<service name="RM">      <parent/> </service>
			<service name="CPU">     <parent/> </service>
			<service name="ROM">     <parent/> </service>
			<service name="IO_MEM">  <parent/> </service>
			<service name="IO_PORT"> <parent/> </service>
			<service name="Timer">   <parent/> </service>
			<service name="Capture"> <parent/> </service>
		</route>
	</start>

</config>
