blob: 5c8b73703bfb7546a7eab93af2802fbf49c26c12 [file] [log] [blame]
Luca Ceresoli84a2c832019-05-24 15:40:02 +02001#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0+
Michal Simek174d72842023-07-10 14:35:49 +02003# Copyright (C) 2018 Michal Simek <michal.simek@amd.com>
Luca Ceresoli84a2c832019-05-24 15:40:02 +02004# Copyright (C) 2019 Luca Ceresoli <luca@lucaceresoli.net>
Stefan Herbrechtsmeier2f799b42022-06-20 18:36:47 +02005# Copyright (C) 2022 Weidmüller Interface GmbH & Co. KG
6# Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
Luca Ceresoli84a2c832019-05-24 15:40:02 +02007
8usage()
9{
10 cat <<EOF
11
12Transform a pair of psu_init_gpl.c and .h files produced by the Xilinx
13Vivado tool for ZynqMP into a smaller psu_init_gpl.c file that is almost
14checkpatch compliant. Minor coding style might still be needed. Must be
15run from the top-level U-Boot source directory.
16
17Usage: zynqmp_psu_init_minimize.sh INPUT_DIR OUTPUT_DIR
18Example: zynqmp_psu_init_minimize.sh \\
19 /path/to/original/psu_init_gpl_c_and_h/ \\
20 board/xilinx/zynqmp/<my_board>/
21
22Notes: INPUT_DIR must contain both .c and .h files.
23 If INPUT_DIR and OUTPUT_DIR are the same directory,
24 psu_init_gpl.c will be overwritten.
25
26EOF
27}
28
29set -o errexit -o errtrace
30set -o nounset
31
32if [ $# -ne 2 ]
33then
34 usage >&2
35 exit 1
36fi
37
38IN="${1}/psu_init_gpl.c"
39OUT="${2}/psu_init_gpl.c"
40TMP=$(mktemp /tmp/psu_init_gpl.XXXXXX)
41trap "rm ${TMP}" ERR
42
43# Step through a temp file to allow both $IN!=$OUT and $IN==$OUT
44sed -e '/sleep.h/d' \
45 -e '/xil_io.h/d' \
46 ${IN} >${TMP}
47cp ${TMP} ${OUT}
48
49# preprocess to expand defines, then remove cpp lines starting with '#'
50gcc -I${1} -E ${OUT} -o ${TMP}
51sed '/^#/d' ${TMP} >${OUT}
52
53# Remove trivial code before psu_pll_init_data()
54sed -ni '/psu_pll_init_data/,$p' ${OUT}
55
56# Functions are lowercase in U-Boot, rename them
57sed -i 's/PSU_Mask_Write/psu_mask_write/g' ${OUT}
58sed -i 's/mask_pollOnValue/mask_pollonvalue/g' ${OUT}
59sed -i 's/RegValue/regvalue/g' ${OUT}
60sed -i 's/MaskStatus/maskstatus/g' ${OUT}
61
62sed -i '/&= psu_peripherals_powerdwn_data()/d' ${OUT}
63
64FUNCS_TO_REMOVE="psu_protection
65psu_..._protection
66psu_init_xppu_aper_ram
67mask_delay(u32
68mask_read(u32
Luca Ceresoli84a2c832019-05-24 15:40:02 +020069mask_poll(u32
70mask_pollonvalue(u32
71psu_ps_pl_reset_config_data
72psu_ps_pl_isolation_removal_data
73psu_apply_master_tz
74psu_post_config_data
75psu_post_config_data
76psu_peripherals_powerdwn_data
77psu_init_ddr_self_refresh
78xmpu
79xppu
80"
81for i in $FUNCS_TO_REMOVE; do
82sed -i "/$i/,/^}$/d" ${OUT}
83done
84
85scripts/Lindent ${OUT}
86
87# Prepend 'static' to internal functions
88sed -i 's/^.*data(void)$/static &/g' ${OUT}
89sed -i 's/^.*psu_afi_config(void)$/static &/g' ${OUT}
90sed -i 's/^void init_peripheral/static &/g' ${OUT}
91sed -i 's/^int serdes/static &/g' ${OUT}
92sed -i 's/^int init_serdes/static &/g' ${OUT}
93sed -i 's/^unsigned long /static &/g' ${OUT}
94
95sed -i 's/()$/(void)/g' ${OUT}
96sed -i 's/0X/0x/g' ${OUT}
97
Luca Ceresoli7f492f32019-06-11 18:39:40 +020098# return (0) -> return 0
99sed -ri 's/return \(([0-9]+)\)/return \1/g' ${OUT}
100
Luca Ceresoli84a2c832019-05-24 15:40:02 +0200101# Add header
102cat << EOF >${TMP}
103// SPDX-License-Identifier: GPL-2.0+
104/*
105 * (c) Copyright 2015 Xilinx, Inc. All rights reserved.
106 */
107
108#include <asm/arch/psu_init_gpl.h>
109#include <xil_io.h>
110
111EOF
112
113cat ${OUT} >>${TMP}
114cp ${TMP} ${OUT}
115
116# Temporarily convert newlines to do some mangling across lines
117tr "\n" "\r" <${OUT} >${TMP}
118
119# Cleanup empty loops. E.g.:
120# |while (e) {|
121# | | ==> |while (e)|
122# | } | | ; |
123# | |
Stefan Herbrechtsmeier4d8f2bb2022-06-20 18:36:48 +0200124sed -i -r 's| \{\r+(\t*)\}\r\r|\r\1\t;\r|g' ${TMP}
Luca Ceresoli84a2c832019-05-24 15:40:02 +0200125
126# Remove empty line between variable declaration
127sed -i -r 's|\r(\r\t(unsigned )?int )|\1|g' ${TMP}
128
129# Remove empty lines at function beginning/end
130sed -i -e 's|\r{\r\r|\r{\r|g' ${TMP}
131sed -i -e 's|\r\r}\r|\r}\r|g' ${TMP}
132
133# Remove empty lines after '{' line
134sed -i -e 's| {\r\r| {\r|g' ${TMP}
135
136# Remove braces {} around single statement blocks. E.g.:
137# | while (e) { | | while (e) |
138# | stg(); | => | stg();|
139# | } |
140sed -i -r 's| \{(\r[^\r]*;)\r\t*\}|\1|g' ${TMP}
141
142# Remove Unnecessary parentheses around 'n_code <= 0x3C' and similar. E.g.:
143# if ((p_code >= 0x26) && ...) -> if (p_code >= 0x26 && ...)
144sed -i -r 's|\((._code .= [x[:xdigit:]]+)\)|\1|g' ${TMP}
145
Stefan Herbrechtsmeierd2162542022-06-20 18:36:49 +0200146# Move helper functions below header includes
147TARGET="#include <xil_io.h>"
148START="static int serdes_rst_seq"
149END="static int serdes_enb_coarse_saturation"
150
151sed -i -e "s|\(${TARGET}\r\r\)\(.*\)\(${START}(.*\)\(${END}(\)|\1\3\2\4|g" \
152 ${TMP}
153
Luca Ceresoli84a2c832019-05-24 15:40:02 +0200154# Convert back newlines
155tr "\r" "\n" <${TMP} >${OUT}
156
Stefan Herbrechtsmeier2f799b42022-06-20 18:36:47 +0200157# Remove unnecessary settings
158# - Low level UART
159SETTINGS_TO_REMOVE="0xFF000000
1600xFF000004
1610xFF000018
1620xFF000034
1630xFF010000
1640xFF010004
1650xFF010018
1660xFF010034
167"
168for i in $SETTINGS_TO_REMOVE; do
169sed -i "/^\tpsu_mask_write($i,.*$/d" ${OUT}
170done
171
Luca Ceresoli84a2c832019-05-24 15:40:02 +0200172rm ${TMP}