Signed-off-by: Marshall Dawson <marshalldawson3rd@gmail.com> Change-Id: I08057576c23cef0343816c3b14c48db77b8dc416 Reviewed-on: https://review.coreboot.org/c/coreboot/+/75695 Reviewed-by: Matt DeVillier <matt.devillier@amd.corp-partner.google.com> Reviewed-by: Fred Reitberger <reitbergerfred@gmail.com> Reviewed-by: Martin Roth <martin.roth@amd.corp-partner.google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Felix Singer <service+coreboot-gerrit@felixsinger.de>
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# Adding new devices to a device tree
 | 
						|
 | 
						|
## Introduction
 | 
						|
 | 
						|
ACPI exposes a platform-independent interface for operating systems to perform
 | 
						|
power management and other platform-level functions.  Some operating systems
 | 
						|
also use ACPI to enumerate devices that are not immediately discoverable, such
 | 
						|
as those behind I2C or SPI buses (in contrast to PCI).  This document discusses
 | 
						|
the way that coreboot uses the concept of a "device tree" to generate ACPI
 | 
						|
tables for usage by the operating system.
 | 
						|
 | 
						|
## Devicetree and overridetree (if applicable)
 | 
						|
 | 
						|
For mainboards that are organized around a "reference board" or "baseboard"
 | 
						|
model (see ``src/mainboard/google/octopus`` or ``hatch`` for examples), there is
 | 
						|
typically a devicetree.cb file that all boards share, and any differences for a
 | 
						|
specific board ("variant") are captured in the overridetree.cb file.  Any
 | 
						|
settings changed in the overridetree take precedence over those in the main
 | 
						|
devicetree.  Note, not all mainboards will have the devicetree/overridetree
 | 
						|
distinction, and may only have a devicetree.cb file.  Or you can always just
 | 
						|
write the ASL (ACPI Source Language) code yourself.
 | 
						|
 | 
						|
### Naming and referencing devices
 | 
						|
 | 
						|
When declaring a device, it can optionally be given an alias that can be
 | 
						|
referred to elsewhere. This is particularly useful to declare a device in one
 | 
						|
device tree while allowing its configuration to be more easily changed in an
 | 
						|
overlay. For instance, the AMD Picasso SoC definition
 | 
						|
(`soc/amd/picasso/chipset.cb`) declares an IOMMU on a PCI bus that is disabled
 | 
						|
by default:
 | 
						|
 | 
						|
```
 | 
						|
chip soc/amd/picasso
 | 
						|
	device domain 0 on
 | 
						|
		...
 | 
						|
		device pci 00.2 alias iommu off end
 | 
						|
		...
 | 
						|
	end
 | 
						|
end
 | 
						|
```
 | 
						|
 | 
						|
A device based on this SoC can override the configuration for the IOMMU without
 | 
						|
duplicating addresses, as in
 | 
						|
`mainboard/google/zork/variants/baseboard/devicetree_trembyle.cb`:
 | 
						|
 | 
						|
```
 | 
						|
chip soc/amd/picasso
 | 
						|
	device domain 0
 | 
						|
		...
 | 
						|
		device ref iommu on end
 | 
						|
		...
 | 
						|
	end
 | 
						|
end
 | 
						|
```
 | 
						|
 | 
						|
In this example the override simply enables the IOMMU, but it could also
 | 
						|
set additional properties (or even add child devices) inside the IOMMU `device`
 | 
						|
block.
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
It is important to note that devices that use `device ref` syntax to override
 | 
						|
previous definitions of a device by alias must be placed at **exactly the same
 | 
						|
location in the device tree** as the original declaration. If not, this will
 | 
						|
actually create another device rather than overriding the properties of the
 | 
						|
existing one. For instance, if the above snippet from `devicetree_trembyle.cb`
 | 
						|
were written as follows:
 | 
						|
 | 
						|
```
 | 
						|
chip soc/amd/picasso
 | 
						|
	# NOTE: not inside domain 0!
 | 
						|
	device ref iommu on end
 | 
						|
end
 | 
						|
```
 | 
						|
 | 
						|
Then this would leave the SoC's IOMMU disabled, and instead create a new device
 | 
						|
with no properties as a direct child of the SoC.
 | 
						|
 | 
						|
## Device drivers
 | 
						|
 | 
						|
Platform independent device drivers are hooked up via entries in a devicetree.
 | 
						|
See [Driver Devicetree Entries](../drivers/dt_entries.md) for more info.
 | 
						|
 | 
						|
## Notes
 | 
						|
 | 
						|
 - **All fields that are left unspecified in the devicetree are initialized to
 | 
						|
   zero.**
 |