aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Rutland <mark.rutland@arm.com>2014-04-15 14:31:44 +0100
committerMark Rutland <mark.rutland@arm.com>2014-04-15 16:08:14 +0100
commit000a66b55f725918f55d40515bae5c400a969cad (patch)
tree23f1d6993b94ba36c7d948b5dcfd2ab862959294
parent0cb95d9d55b99b4b08f19b2349b2d5d1575b17a8 (diff)
downloadboot-wrapper-aarch64-000a66b55f725918f55d40515bae5c400a969cad.tar.gz
Discover device base addresses from the DTB
The base addresses of various components can differ from one model to another. As these addresses are currently hard-coded in the bootwrapper, it is necessary to manually alter the bootwrapper for each variation. This patch adds scripting to extract the (absolute / CPU) addresses of various system components. With this change the bootwrapper build system will automatically discover the addresses that need to be used. Signed-off-by: Mark Rutland <mark.rutland@arm.com>
-rw-r--r--Makefile.am8
-rwxr-xr-xfindbase.pl42
2 files changed, 46 insertions, 4 deletions
diff --git a/Makefile.am b/Makefile.am
index c911e51..41adf14 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,10 +9,10 @@
# VE
PHYS_OFFSET := 0x80000000
-UART_BASE := 0x1c090000
-SYSREGS_BASE := 0x1c010000
-GIC_DIST_BASE := 0x2c001000
-GIC_CPU_BASE := 0x2c002000
+UART_BASE := $(shell $(top_srcdir)/findbase.pl $(KERNEL_DTB) 0 'arm,pl011')
+SYSREGS_BASE := $(shell $(top_srcdir)/findbase.pl $(KERNEL_DTB) 0 'arm,vexpress-sysreg')
+GIC_DIST_BASE := $(shell $(top_srcdir)/findbase.pl $(KERNEL_DTB) 0 'arm,cortex-a15-gic')
+GIC_CPU_BASE := $(shell $(top_srcdir)/findbase.pl $(KERNEL_DTB) 1 'arm,cortex-a15-gic')
CNTFRQ := 0x01800000 # 24Mhz
DEFINES = -DCNTFRQ=$(CNTFRQ)
diff --git a/findbase.pl b/findbase.pl
new file mode 100755
index 0000000..1b6b93e
--- /dev/null
+++ b/findbase.pl
@@ -0,0 +1,42 @@
+#!/usr/bin/perl -w
+# Find device register base addresses.
+#
+# Usage: ./$0 <DTB> <index> <compatible ...>
+#
+# Copyright (C) 2014 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.
+
+use warnings;
+use strict;
+
+use FDT;
+
+my $filename = shift;
+die("No filename provided") unless defined($filename);
+
+my $idx = shift;
+die("no reg index provided") unless defined($idx);
+
+my @compats = shift;
+
+open (my $fh, "<:raw", $filename) or die("Unable to open file '$filename'");
+
+my $fdt = FDT->parse($fh) or die("Unable to parse DTB");
+
+my $root = $fdt->get_root();
+
+my @devs = ();
+for my $compat (@compats) {
+ push @devs, $root->find_compatible($compat);
+}
+
+# We only care about finding the first matching device
+my $dev = shift @devs;
+die("No matching devices found") if (not defined($dev));
+
+my ($addr, $size) = $dev->get_translated_reg($idx);
+die("Cannot find reg entry $idx") if (not defined($addr) or not defined($size));
+
+printf("0x%016x\n", $addr);