# SPDX-License-Identifier: GPL-2.0
config DTC
	bool

menuconfig OF
	bool "Device Tree and Open Firmware support"
	help
	  This option enables the device tree infrastructure.
	  It is automatically selected by platforms that need it or can
	  be enabled manually for unittests, overlays or
	  compile-coverage.

if OF

config OF_UNITTEST
	bool "Device Tree runtime unit tests"
	depends on OF_EARLY_FLATTREE
	select IRQ_DOMAIN
	select OF_RESOLVE
	help
	  This option builds in test cases for the device tree infrastructure
	  that are executed once at boot time, and the results dumped to the
	  console.

	  This option should only be enabled for a development kernel. The tests
	  will taint the kernel with TAINT_TEST. The tests will cause ERROR and
	  WARNING messages to print on the console. The tests will cause stack
	  traces to print on the console.  It is possible that the tests will
	  leave the devicetree in a corrupted state.

	  The unittest output will be verbose.  Copy the output to a file
	  via capturing the console output or via the dmesg command.  Process
	  this file with scripts/dtc/of_unittest_expect to reduce the
	  verbosity, test whether expected output is present, and to
	  summarize the results.

	  If unsure, say N here. This option is not safe to enable.

config OF_KUNIT_TEST
	tristate "Devicetree KUnit Test" if !KUNIT_ALL_TESTS
	depends on KUNIT
	default KUNIT_ALL_TESTS
	help
	  This option builds KUnit unit tests for device tree infrastructure.

	  If unsure, say N here, but this option is safe to enable.

config OF_ALL_DTBS
	bool "Build all Device Tree Blobs"
	depends on COMPILE_TEST
	select DTC
	help
	  This option builds all possible Device Tree Blobs (DTBs) for the
	  current architecture.

	  If unsure, say N here, but this option is safe to enable.

config OF_FLATTREE
	bool
	select DTC
	select LIBFDT
	select CRC32

config OF_EARLY_FLATTREE
	def_bool OF && !(SPARC || ALPHA || HEXAGON || M68K || PARISC || S390)
	select DMA_DECLARE_COHERENT if HAS_DMA && HAS_IOMEM
	select OF_FLATTREE

config OF_PROMTREE
	bool

config OF_KOBJ
	def_bool SYSFS

# Hardly any platforms need this.  It is safe to select, but only do so if you
# need it.
config OF_DYNAMIC
	bool "Support for dynamic device trees" if OF_UNITTEST
	select OF_KOBJ
	help
	  On some platforms, the device tree can be manipulated at runtime.
	  While this option is selected automatically on such platforms, you
	  can enable it manually to improve device tree unit test coverage.

config OF_ADDRESS
	def_bool y
	depends on !SPARC && (HAS_IOMEM || UML)

config OF_IRQ
	def_bool y
	depends on !SPARC && IRQ_DOMAIN

config OF_RESERVED_MEM
	def_bool OF_EARLY_FLATTREE

config OF_RESOLVE
	bool

config OF_OVERLAY
	bool "Device Tree overlays"
	select OF_DYNAMIC
	select OF_FLATTREE
	select OF_RESOLVE
	help
	  Overlays are a method to dynamically modify part of the kernel's
	  device tree with dynamically loaded data.
	  While this option is selected automatically when needed, you can
	  enable it manually to improve device tree unit test coverage.

config OF_NUMA
	bool

endif # OF
