summaryrefslogtreecommitdiffstats
path: root/scripts/Makefile.dtbs
blob: 46009d5f14867901202daddd18db7b9d3c8d01db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# SPDX-License-Identifier: GPL-2.0-only

# If CONFIG_OF_ALL_DTBS is enabled, all DT blobs are built
dtb-$(CONFIG_OF_ALL_DTBS) += $(dtb-)

# Composite DTB (i.e. DTB constructed by overlay)
multi-dtb-y := $(call multi-search, $(dtb-y), .dtb, -dtbs)
# Primitive DTB compiled from *.dts
real-dtb-y := $(call real-search, $(dtb-y), .dtb, -dtbs)
# Base DTB that overlay is applied onto
base-dtb-y := $(filter %.dtb, $(call real-search, $(multi-dtb-y), .dtb, -dtbs))

dtb-y           := $(addprefix $(obj)/, $(dtb-y))
multi-dtb-y     := $(addprefix $(obj)/, $(multi-dtb-y))
real-dtb-y      := $(addprefix $(obj)/, $(real-dtb-y))

always-y        += $(dtb-y)
targets         += $(real-dtb-y)

# dtbs-list
# ---------------------------------------------------------------------------

ifdef need-dtbslist
subdir-dtbslist := $(addsuffix /dtbs-list, $(subdir-ym))
dtb-y           += $(subdir-dtbslist)
always-y        += $(obj)/dtbs-list
endif

$(subdir-dtbslist): $(obj)/%/dtbs-list: $(obj)/% ;

$(obj)/dtbs-list: $(dtb-y) FORCE
	$(call if_changed,gen_order)

# Assembly file to wrap dtb(o)
# ---------------------------------------------------------------------------

# Generate an assembly file to wrap the output of the device tree compiler
quiet_cmd_wrap_S_dtb = WRAP    $@
      cmd_wrap_S_dtb = {								\
		symbase=__$(patsubst .%,%,$(suffix $<))_$(subst -,_,$(notdir $*));	\
		echo '\#include <asm-generic/vmlinux.lds.h>';				\
		echo '.section .dtb.init.rodata,"a"';					\
		echo '.balign STRUCT_ALIGNMENT';					\
		echo ".global $${symbase}_begin";					\
		echo "$${symbase}_begin:";						\
		echo '.incbin "$<" ';							\
		echo ".global $${symbase}_end";						\
		echo "$${symbase}_end:";						\
		echo '.balign STRUCT_ALIGNMENT';					\
	} > $@

$(obj)/%.dtb.S: $(obj)/%.dtb FORCE
	$(call if_changed,wrap_S_dtb)

$(obj)/%.dtbo.S: $(obj)/%.dtbo FORCE
	$(call if_changed,wrap_S_dtb)

# Schema check
# ---------------------------------------------------------------------------

ifneq ($(CHECK_DTBS),)
DT_CHECKER ?= dt-validate
DT_CHECKER_FLAGS ?= $(if $(DT_SCHEMA_FILES),-l $(DT_SCHEMA_FILES),-m)
DT_BINDING_DIR := Documentation/devicetree/bindings
DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.json
dtb-check-enabled = $(if $(filter %.dtb, $@),y)
endif

quiet_dtb_check_tag = $(if $(dtb-check-enabled),[C],   )
cmd_dtb_check = $(if $(dtb-check-enabled),; $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ || true)

# Overlay
# ---------------------------------------------------------------------------

# NOTE:
# Do not replace $(filter %.dtb %.dtbo, $^) with $(real-prereqs). When a single
# DTB is turned into a multi-blob DTB, $^ will contain header file dependencies
# recorded in the .*.cmd file.
quiet_cmd_fdtoverlay = OVL $(quiet_dtb_check_tag) $@
      cmd_fdtoverlay = $(objtree)/scripts/dtc/fdtoverlay -o $@ -i $(filter %.dtb %.dtbo, $^) $(cmd_dtb_check)

$(multi-dtb-y): $(DT_TMP_SCHEMA) FORCE
	$(call if_changed,fdtoverlay)
$(call multi_depend, $(multi-dtb-y), .dtb, -dtbs)

# DTC
# ---------------------------------------------------------------------------

DTC ?= $(objtree)/scripts/dtc/dtc
DTC_FLAGS += -Wno-unique_unit_address

# Disable noisy checks by default
ifeq ($(findstring 1,$(KBUILD_EXTRA_WARN)),)
DTC_FLAGS += -Wno-unit_address_vs_reg \
             -Wno-avoid_unnecessary_addr_size \
             -Wno-alias_paths \
             -Wno-graph_child_address \
             -Wno-simple_bus_reg
else
DTC_FLAGS += -Wunique_unit_address_if_enabled
endif

ifneq ($(findstring 2,$(KBUILD_EXTRA_WARN)),)
DTC_FLAGS += -Wnode_name_chars_strict \
             -Wproperty_name_chars_strict \
             -Wunique_unit_address
endif

DTC_FLAGS += $(DTC_FLAGS_$(target-stem))

# Set -@ if the target is a base DTB that overlay is applied onto
DTC_FLAGS += $(if $(filter $(patsubst $(obj)/%,%,$@), $(base-dtb-y)), -@)

DTC_INCLUDE := $(srctree)/scripts/dtc/include-prefixes

dtc_cpp_flags = -Wp,-MMD,$(depfile).pre.tmp -nostdinc -I $(DTC_INCLUDE) -undef -D__DTS__

dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)

quiet_cmd_dtc = DTC $(quiet_dtb_check_tag) $@
      cmd_dtc = \
	$(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
	$(DTC) -o $@ -b 0 $(addprefix -i,$(dir $<) $(DTC_INCLUDE)) \
	       $(DTC_FLAGS) -d $(depfile).dtc.tmp $(dtc-tmp) ; \
	cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile) \
	$(cmd_dtb_check)

$(obj)/%.dtb: $(obj)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
	$(call if_changed_dep,dtc)

$(obj)/%.dtbo: $(src)/%.dtso $(DTC) FORCE
	$(call if_changed_dep,dtc)

# targets
# ---------------------------------------------------------------------------

targets += $(always-y)

# %.dtb.o <- %.dtb.S <- %.dtb <- %.dts
# %.dtbo.o <- %.dtbo.S <- %.dtbo <- %.dtso
targets += $(call intermediate_targets, .dtb.o, .dtb.S .dtb) \
           $(call intermediate_targets, .dtbo.o, .dtbo.S .dtbo)