blob: 3b87eee73757d0fdee19d60d7cc09f4d8de93b86 [file] [log] [blame]
Patrick Georgi5d7ab392015-12-12 00:23:15 +01001#!/bin/bash
2# converts a depthcharge fmap.dts into an fmaptool compatible .fmd format
3# requires fdt utilities (dtc, fdtget)
4#
5# $1 dts file name
6# result on stdout
7set -e
8
9if [ $# -lt 1 ]; then
10 echo "usage: $0 dts-file"
11 exit 1
12fi
13
14DTS=$1
15DTB=`mktemp`
16
17# $1 node
18# $2 start variable name
19# $3 size variable name
20get_reg() {
21 local t=`fdtget -t x $DTB $1 reg 2>/dev/null`
22 if [ -n "$t" ]; then
23 export $2=0x`echo $t|cut -d' ' -f1`
24 export $3=0x`echo $t|cut -d' ' -f2`
25 else
26 export $3=0x`fdtget -t x $DTB $1 size`
27 fi
28}
29
30dtc -O dtb -o $DTB $DTS
31get_reg /flash ROM_START ROM_SIZE
32printf "FLASH@${ROM_START} ${ROM_SIZE} {"
33
34PREFIX="\t"
35REGION_START=-1
36REGION_SIZE=0
37CONTAINER_END=$(( ${ROM_SIZE} ))
38CONTAINER_END_STACK=${CONTAINER_END}
39CONTAINER_OFFSET=0
40CONTAINER_OFFSET_STACK=0
41
42FMAP_REGIONS=`fdtget -l $DTB /flash`
43for region in $FMAP_REGIONS; do
44 OLD_REGION_START=$REGION_START
45 OLD_REGION_SIZE=$REGION_SIZE
46 get_reg /flash/$region REGION_START REGION_SIZE
47
48 # determine if we're past an existing container
49 while [ $(( ${REGION_START} )) -ge ${CONTAINER_END} ]; do
50 PREFIX=`printf "${PREFIX}" | cut -c2-`
51 printf "\n${PREFIX}}"
52 CONTAINER_END_STACK=`printf "${CONTAINER_END_STACK}" | cut -d' ' -f2-`
53 CONTAINER_OFFSET_STACK=`printf "${CONTAINER_OFFSET_STACK}" | cut -d' ' -f2-`
54 CONTAINER_END=`printf ${CONTAINER_END_STACK} | cut -d' ' -f1`
55 CONTAINER_OFFSET=`printf ${CONTAINER_OFFSET_STACK} | cut -d' ' -f1`
56 done
57
58 # determine if we're inside a new container region now
59 if [ $(( ${OLD_REGION_START} + ${OLD_REGION_SIZE} )) -gt $(( ${REGION_START} )) ]; then
60 PREFIX="\t${PREFIX}"
61 CONTAINER_END=$(( ${OLD_REGION_START} + ${OLD_REGION_SIZE} ))
62 CONTAINER_OFFSET=$(( ${OLD_REGION_START} ))
63 CONTAINER_END_STACK="${CONTAINER_END} ${CONTAINER_END_STACK}"
64 CONTAINER_OFFSET_STACK="${CONTAINER_OFFSET} ${CONTAINER_OFFSET_STACK}"
65 printf " {"
66 fi
67
68 LOCAL_REGION_START=$(( ${REGION_START} - ${CONTAINER_OFFSET} ))
69 LOCAL_REGION_START=`printf "0x%x" ${LOCAL_REGION_START}`
70
71 REGION_NAME=`fdtget $DTB /flash/$region label | tr '[a-z]-' '[A-Z]_'`
72 REGION_TYPE=`fdtget $DTB /flash/$region type 2>/dev/null | cut -d'/' -f1`
73
74 # a CBFS region? if so, mark as such
75 if [ "${REGION_TYPE}" = "blob cbfs" ]; then
76 IS_CBFS="(CBFS)"
77 else
78 IS_CBFS=""
79 fi
80
81 # special handling: rename BOOT_STUB to COREBOOT, mark them as CBFS
82 if [ "${REGION_NAME}" = "BOOT_STUB" ]; then
83 REGION_NAME="COREBOOT"
84 fi
85 if [ "${REGION_NAME}" = "COREBOOT" ]; then
86 IS_CBFS="(CBFS)"
87 fi
88
89 # special handling: COREBOOT region at 0, inject a 128K bootblock
90 # The size may need changes to accomodate the chipsets,
91 # but should work for now.
92 if [ "${REGION_NAME}" = "COREBOOT" -a \
93 $(( ${REGION_START} )) -eq 0 ]; then
94 printf "\n${PREFIX}BOOTBLOCK@0 128K"
95 LOCAL_REGION_START=$(( ${LOCAL_REGION_START} + 128*1024 ))
96 LOCAL_REGION_START=`printf 0x%x ${LOCAL_REGION_START}`
97 REGION_SIZE=$(( ${REGION_SIZE} - 128*1024 ))
98 REGION_SIZE=`printf 0x%x ${REGION_SIZE}`
99 fi
100
101 printf "\n${PREFIX}${REGION_NAME}${IS_CBFS}@${LOCAL_REGION_START} ${REGION_SIZE}"
102done
103
104while [ -n "${PREFIX}" ]; do
105 PREFIX=`printf "${PREFIX}" | cut -c2-`
106 printf "\n${PREFIX}}"
107done
108printf "\n"
109
110rm -f $DTB