pci: add readme to pci_drv, adjust acpi_drv README

This commit is contained in:
Alexander Boettcher 2015-05-15 13:15:41 +02:00 committed by Christian Helmuth
parent 51b79d7da6
commit dd7ddae0e9
2 changed files with 139 additions and 17 deletions

View File

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

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