aboutsummaryrefslogtreecommitdiffstats
path: root/Makefile.am
blob: af694b743045b76b95e5d6c71a335698fcd6c6a5 (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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#
# Makefile.am - build a kernel+filesystem image for stand-alone Linux
# booting
#
# Copyright (C) 2012 ARM Limited. All rights reserved.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE.txt file.

# VE
PHYS_OFFSET	:= $(shell perl -I $(top_srcdir) $(top_srcdir)/findmem.pl $(KERNEL_DTB))
UART_BASE	:= $(shell perl -I $(top_srcdir) $(top_srcdir)/findbase.pl $(KERNEL_DTB) 0 'arm,pl011')
SYSREGS_BASE	:= $(shell perl -I $(top_srcdir) $(top_srcdir)/findbase.pl $(KERNEL_DTB) 0 'arm,vexpress-sysreg')
CNTFRQ		:= 0x01800000	# 24Mhz

CPU_IDS		:= $(shell perl -I $(top_srcdir) $(top_srcdir)/findcpuids.pl $(KERNEL_DTB))
NR_CPUS         := $(shell echo $(CPU_IDS) | tr ',' ' ' | wc -w)

DEFINES		= -DCNTFRQ=$(CNTFRQ)
DEFINES		+= -DCPU_IDS=$(CPU_IDS)
DEFINES		+= -DNR_CPUS=$(NR_CPUS)
DEFINES		+= -DSYSREGS_BASE=$(SYSREGS_BASE)
DEFINES		+= -DUART_BASE=$(UART_BASE)
DEFINES		+= -DSTACK_SIZE=256

if KERNEL_32
DEFINES		+= -DKERNEL_32
PSCI_CPU_ON	:= 0x84000003
else
PSCI_CPU_ON	:= 0xc4000003
endif
PSCI_CPU_OFF	:= 0x84000002

OFILES		=

if BOOTWRAPPER_32
CPPFLAGS	+= -DBOOTWRAPPER_32
CFLAGS		+= -marm -mno-unaligned-access
ARCH_SRC	:= arch/aarch32/
else
CFLAGS		+= -mgeneral-regs-only -mstrict-align
ARCH_SRC	:= arch/aarch64/
endif

if PSCI
BOOTMETHOD	:= psci.o
OFILES		+= psci.o
PSCI_NODE	:= psci {				\
			compatible = \"arm,psci\";	\
			method = \"smc\";		\
			cpu_on = <$(PSCI_CPU_ON)>;	\
			cpu_off = <$(PSCI_CPU_OFF)>;	\
		   };
CPU_NODES	:= $(shell perl -I $(top_srcdir) $(top_srcdir)/addpsci.pl $(KERNEL_DTB))
else
BOOTMETHOD	:= spin.o
PSCI_NODE	:=
CPU_NODES	:=
endif

if GICV3
GIC_DIST_BASE	:= $(shell perl -I $(top_srcdir) $(top_srcdir)/findbase.pl $(KERNEL_DTB) 0 'arm,gic-v3')
GIC_RDIST_BASE	:= $(shell perl -I $(top_srcdir) $(top_srcdir)/findbase.pl $(KERNEL_DTB) 1 'arm,gic-v3')
DEFINES		+= -DGIC_DIST_BASE=$(GIC_DIST_BASE)
DEFINES		+= -DGIC_RDIST_BASE=$(GIC_RDIST_BASE)
GIC		:= gic-v3.o
else
GIC_DIST_BASE	:= $(shell perl -I $(top_srcdir) $(top_srcdir)/findbase.pl $(KERNEL_DTB) 0 'arm,cortex-a15-gic')
GIC_CPU_BASE	:= $(shell perl -I $(top_srcdir) $(top_srcdir)/findbase.pl $(KERNEL_DTB) 1 'arm,cortex-a15-gic')
DEFINES		+= -DGIC_CPU_BASE=$(GIC_CPU_BASE)
DEFINES		+= -DGIC_DIST_BASE=$(GIC_DIST_BASE)
GIC		:= gic.o
endif

if KERNEL_32
MBOX_OFFSET	:= 0x7ff8
KERNEL_OFFSET	:= 0x8000
TEXT_LIMIT	:= 0x3000
else
MBOX_OFFSET	:= 0xfff8
KERNEL_OFFSET	:= 0x80000
TEXT_LIMIT	:= 0x80000
endif

LD_SCRIPT	:= model.lds.S

FS_OFFSET	:= 0x10000000
FILESYSTEM_START:= $(shell echo $$(($(PHYS_OFFSET) + $(FS_OFFSET))))
FILESYSTEM_SIZE	:= $(shell stat -Lc %s $(FILESYSTEM) 2>/dev/null || echo 0)
FILESYSTEM_END	:= $(shell echo $$(($(FILESYSTEM_START) + $(FILESYSTEM_SIZE))))

FDT_OFFSET	:= 0x08000000

if XEN
XEN		:= -DXEN=$(XEN_IMAGE)
XEN_OFFSET	:= 0x08200000
KERNEL_SIZE	:= $(shell stat -Lc %s $(KERNEL_IMAGE) 2>/dev/null || echo 0)
DOM0_OFFSET	:= $(shell echo $$(($(PHYS_OFFSET) + $(KERNEL_OFFSET))))
XEN_CHOSEN	:= xen,xen-bootargs = \"$(XEN_CMDLINE)\";		\
		   \#address-cells = <2>;				\
		   \#size-cells = <2>;					\
		   module@1 {						\
			compatible = \"xen,linux-zimage\", \"xen,multiboot-module\"; \
			reg = <0x0 $(DOM0_OFFSET) 0x0 $(KERNEL_SIZE)>;	\
		   };
endif

if INITRD
INITRD_FLAGS	:= -DUSE_INITRD
INITRD_CHOSEN   := linux,initrd-start = <$(FILESYSTEM_START)>;	\
		   linux,initrd-end = <$(FILESYSTEM_END)>;
endif

CHOSEN_NODE	:= chosen {						\
			bootargs = \"$(CMDLINE)\";			\
			$(INITRD_CHOSEN)				\
			$(XEN_CHOSEN)					\
		   };

CPPFLAGS	+= $(INITRD_FLAGS)
CFLAGS		+= -I$(top_srcdir)/include/ -I$(top_srcdir)/$(ARCH_SRC)/include/
CFLAGS		+= -Wall -fomit-frame-pointer
CFLAGS		+= -ffunction-sections -fdata-sections
LDFLAGS		+= --gc-sections

OFILES		+= boot_common.o bakery_lock.o platform.o $(GIC) cache.o lib.o
OFILES		+= $(addprefix $(ARCH_SRC),boot.o stack.o $(BOOTMETHOD) utils.o)

# Don't lookup all prerequisites in $(top_srcdir), only the source files. When
# building outside the source tree $(ARCH_SRC) needs to be created.
VPATH		=
vpath %.c $(top_srcdir)
vpath %.S $(top_srcdir)

all: $(IMAGE)

CLEANFILES = $(IMAGE) linux-system.axf xen-system.axf $(OFILES) model.lds fdt.dtb

$(IMAGE): $(OFILES) model.lds fdt.dtb $(KERNEL_IMAGE) $(FILESYSTEM) $(XEN_IMAGE)
	$(LD) $(LDFLAGS) $(OFILES) -o $@ --script=model.lds

$(ARCH_SRC):
	$(MKDIR_P) $@

%.o: %.S Makefile | $(ARCH_SRC)
	$(CC) $(CPPFLAGS) -D__ASSEMBLY__ $(CFLAGS) $(DEFINES) -c -o $@ $<

%.o: %.c Makefile
	$(CC) $(CPPFLAGS) $(CFLAGS) $(DEFINES) -c -o $@ $<

model.lds: $(LD_SCRIPT) Makefile
	$(CPP) $(CPPFLAGS) -ansi -DPHYS_OFFSET=$(PHYS_OFFSET) -DMBOX_OFFSET=$(MBOX_OFFSET) -DKERNEL_OFFSET=$(KERNEL_OFFSET) -DFDT_OFFSET=$(FDT_OFFSET) -DFS_OFFSET=$(FS_OFFSET) $(XEN) -DXEN_OFFSET=$(XEN_OFFSET) -DKERNEL=$(KERNEL_IMAGE) -DFILESYSTEM=$(FILESYSTEM) -DTEXT_LIMIT=$(TEXT_LIMIT) -P -C -o $@ $<

fdt.dtb: $(KERNEL_DTB) Makefile
	( $(DTC) -O dts -I dtb $(KERNEL_DTB) ; echo "/ { $(CHOSEN_NODE) $(PSCI_NODE) }; $(CPU_NODES)" ) | $(DTC) -O dtb -o $@ -

# The filesystem archive might not exist if INITRD is not being used
.PHONY: all clean $(FILESYSTEM)

MAINTAINERCLEANFILES = aclocal.m4 compile config.* configure install-sh \
	Makefile.in missing