mirror of
https://github.com/genodelabs/genode.git
synced 2025-01-18 18:56:29 +00:00
pci: add readme to pci_drv, adjust acpi_drv README
This commit is contained in:
parent
51b79d7da6
commit
dd7ddae0e9
@ -3,12 +3,12 @@ This directory contains an implementation of a simple ACPI parser
|
||||
Behavior
|
||||
--------
|
||||
|
||||
This server should be used when using a kernel (like Fiasco.OC or Nova) that
|
||||
takes advantage of x86's APIC. The server traverses the ACPI tables and sets the
|
||||
interrupt line of devices within the PCI config space to the GSIs found in the
|
||||
ACPI tables. The 'MADT' table is parsed by the server as well, enabling clients
|
||||
to use the correct IRQ when 'Interrupt Override' structures are found wihtin the
|
||||
table.
|
||||
This server should be used when using a kernel (like Fiasco.OC, Nova,
|
||||
base_hw x86_64) that takes advantage of x86's APIC. The server traverses the
|
||||
ACPI tables and sets the interrupt line of devices within the PCI config space
|
||||
to the GSIs found in the ACPI tables. The 'MADT' table is parsed by the server
|
||||
as well, enabling clients to use the correct IRQ when 'Interrupt Override'
|
||||
structures are found wihtin the table.
|
||||
|
||||
Usage
|
||||
-----
|
||||
@ -20,15 +20,18 @@ since this will be used as a slave of the 'acpi_drv'. You still must load the
|
||||
Configuration snipped (please note that IRQ service requests of the 'timer' are
|
||||
routed to the ACPI-driver):
|
||||
|
||||
!<start name="acpi">
|
||||
! <resource name="RAM" quantum="2M"/>
|
||||
! <binary name="acpi_drv"/>
|
||||
!<start name="acpi_drv">
|
||||
! <resource name="RAM" quantum="2M" constrain_phys="yes"/>
|
||||
! <provides>
|
||||
! <service name="PCI"/>
|
||||
! <service name="IRQ" />
|
||||
! </provides>
|
||||
! <config>
|
||||
! <policy label="acpi_drv">
|
||||
! <pci class="ALL"/>
|
||||
! </policy>
|
||||
! </config>
|
||||
! <route>
|
||||
! <service name="PCI"> <any-child /> </service>
|
||||
! <any-service> <parent/> <any-child /> </any-service>
|
||||
! </route>
|
||||
!</start>
|
||||
@ -37,14 +40,15 @@ routed to the ACPI-driver):
|
||||
! <resource name="RAM" quantum="1M"/>
|
||||
! <provides><service name="Timer"/></provides>
|
||||
! <route>
|
||||
! <service name="IRQ"><child name="acpi" /></service>
|
||||
! <service name="IRQ"><child name="acpi_drv" /></service>
|
||||
! <any-service> <parent /> <any-child /></any-service>
|
||||
! </route>
|
||||
!</start>
|
||||
|
||||
Limitations and known issues
|
||||
----------------------------
|
||||
|
||||
Currently there is no interface to set the interrupt mode for Irq_sessions
|
||||
(e.g., level or edge triggered). This is required by Fiasco.OCs kernel
|
||||
interface. We regard this as future work.
|
||||
The 'config' node on the 'acpi_drv' requires an policy entry that permits the
|
||||
'acpi_drv' to iterate over all pci devices in order to rewrite the
|
||||
interrupt numbers according to the 'MADT' table. Furthermore the whole 'config'
|
||||
node will be passed on to the 'pci_drv' which obtains from it the required
|
||||
policy for each client. Additionally the constrain_phys attribute is a
|
||||
feature of init, which applies to the pci_drv. Please read the 'pci_drv'
|
||||
README for more details.
|
||||
|
118
repos/os/src/drivers/pci/README
Normal file
118
repos/os/src/drivers/pci/README
Normal file
@ -0,0 +1,118 @@
|
||||
This directory contains the implementation of Genode's PCI driver.
|
||||
|
||||
Behavior
|
||||
--------
|
||||
|
||||
On startup the driver scans the PCI bus hierarchy and stores the found devices.
|
||||
Per client a policy must be configured that states which client can
|
||||
access certain devices to form a virtual pci bus per client. The client may
|
||||
iterate through the virtual pci bus using the 'first' and 'next' methods of
|
||||
the pci_session interface to discover all available devices of the virtual bus.
|
||||
Non PCI devices may be discovered by using 'device' of the pci_session
|
||||
interface. As a result of the discovery a client obtains a device capability.
|
||||
|
||||
With the device capability the resources of the devices can be obtained, e.g.
|
||||
io_port, io_mem and irq of the pci_device interface.
|
||||
|
||||
Policy usage
|
||||
------------
|
||||
|
||||
A policy may contain several nodes describing several devices. The entries of
|
||||
a policy may describe PCI devices as non PCI devices. A PCI device is
|
||||
explicitly configured by the triple 'bus', 'device', 'function':
|
||||
|
||||
!<start name="pci_drv">
|
||||
! <resource name="RAM" quantum="8M" constrain_phys="yes"/>
|
||||
! ...
|
||||
! <config>
|
||||
! <policy label="usb_drv">
|
||||
! <pci bus="0" device="19" function="0"/>
|
||||
! <pci bus="0" device="18" function="3"/>
|
||||
! </policy>
|
||||
! </config>
|
||||
!</start>
|
||||
|
||||
or more fuzzy by a device class alias:
|
||||
|
||||
!<start name="pci_drv">
|
||||
! <resource name="RAM" quantum="8M" constrain_phys="yes"/>
|
||||
! ...
|
||||
! <config>
|
||||
! <policy label="usb_drv">
|
||||
! <pci class="USB"/>
|
||||
! </policy>
|
||||
! </config>
|
||||
!</start>
|
||||
|
||||
|
||||
Non PCI devices, as the PS2 controller are named by a "device" node in the policy:
|
||||
|
||||
!<start name="pci_drv">
|
||||
! <resource name="RAM" quantum="8M" constrain_phys="yes"/>
|
||||
! <config>
|
||||
! <policy label="ps_drv">
|
||||
! <device name="PS2/>
|
||||
! </policy>
|
||||
! </config>
|
||||
!</start>
|
||||
|
||||
|
||||
The first entry ('pci' or 'dev') of the policy node that matches will grant
|
||||
access of a device or device class to the client. Subsequent entries will not
|
||||
be checked. If a 'bus', 'device', 'function' triple was specified in one of the
|
||||
policies and in another policy a fuzzy pci class alias which would include
|
||||
the device specified by the triple, the device will not appear during device
|
||||
discovery by the client with the fuzzy pci class policy.
|
||||
|
||||
|
||||
By default the driver will try to use MSIs if the device and the used kernel
|
||||
supports it. This behaviour can be overwritten:
|
||||
|
||||
!<start name="pci_drv">
|
||||
! <resource name="RAM" quantum="8M" constrain_phys="yes"/>
|
||||
! <config>
|
||||
! <policy label="nic_drv" irq_mode="nomsi">
|
||||
! ...
|
||||
! </policy>
|
||||
! </config>
|
||||
!</start>
|
||||
|
||||
The constrain_phys attribute is evaluated by init. If set to "yes" it
|
||||
permits a component, the pci driver, to restrict the allocation of memory to
|
||||
specific physical RAM ranges. The PCI driver uses this feature to ensure that
|
||||
the allocation of DMA capable memory consider several restrictions. For
|
||||
example, some drivers, as the UHCI controller, requires a
|
||||
physical memory address below 4G. Another example is that on 32bit hosts
|
||||
physical to virtual identical mappings of DMA memory for the device_pd
|
||||
(required when IOMMU is used) must be below the kernel memory boundary (3G).
|
||||
|
||||
Supported PCI class aliases
|
||||
---------------------------
|
||||
|
||||
The following class names are supported which corresponds to the
|
||||
specified PCI class(C), subclass(S) and programming interface(P):
|
||||
|
||||
alias C S P
|
||||
*********************
|
||||
ALL 0x0 0x00 0x0
|
||||
AHCI 0x1 0x06 0x0
|
||||
AUDIO 0x4 0x00 0x0
|
||||
ETHERNET 0x2 0x00 0x0
|
||||
USB 0xc 0x03 0x0
|
||||
VGA 0x3 0x00 0x0
|
||||
WIFI 0x2 0x80 0x0
|
||||
|
||||
|
||||
Supported non PCI devices
|
||||
-------------------------
|
||||
|
||||
The driver provides for the PS2 controller the IO_PORT and IRQ resources.
|
||||
|
||||
!<start name="pci_drv">
|
||||
! <resource name="RAM" quantum="8M" constrain_phys="yes"/>
|
||||
! <config>
|
||||
! <policy label="ps_drv">
|
||||
! <dev name="PS2/>
|
||||
! </policy>
|
||||
! </config>
|
||||
!</start>
|
Loading…
Reference in New Issue
Block a user