xref: /rkbin/tools/pcie_idb_config.sh (revision 80d21b102fa09a8e09dbca1e6131da5f20939da3)
190d8781dSJon Lin#!/bin/bash
290d8781dSJon Lin
390d8781dSJon Linsoc=$1
490d8781dSJon Lingen=$2
590d8781dSJon Linlanes=$3
690d8781dSJon Linbaundary=$4
790d8781dSJon Lininput=$9
890d8781dSJon Lin
990d8781dSJon Linmagic0=70
1090d8781dSJon Linmagic1=63
1190d8781dSJon Linmagic2=69
1290d8781dSJon Linmagic3=65
1390d8781dSJon Lincode0=00
1490d8781dSJon Lincode1=43
1590d8781dSJon Lincode2=00
1690d8781dSJon Lincode3=00
1790d8781dSJon Lin# case: vid=0x1d87 did=0x356a
1890d8781dSJon Linvid_l=$5
1990d8781dSJon Linvid_h=$6
2090d8781dSJon Lindid_l=$7
2190d8781dSJon Lindid_h=$8
2290d8781dSJon Lin
2390d8781dSJon Linfunction usage()
2490d8781dSJon Lin{
2590d8781dSJon Lin	echo "./pcie_idb_config.sh <soc> <gen> <lanes> <uart_baundary> <vid_l> <vid_h> <did_l> <did_h> <input>"
2690d8781dSJon Lin	echo "like following:"
2790d8781dSJon Lin	echo "./pcie_idb_config.sh RK3588 3 4 1500000 87 1d 6a 35 bin/rk35/rk3588_pcie_v*.bin"
2890d8781dSJon Lin	echo "./pcie_idb_config.sh RK3588 3 2 1500000 87 1d 6a 35 bin/rk35/rk3588_pcie_v*.bin"
2990d8781dSJon Lin	echo "./pcie_idb_config.sh RK3588 3 4 115200  87 1d 6a 35 bin/rk35/rk3568_pcie_v*.bin"
3090d8781dSJon Lin	echo "./pcie_idb_config.sh RK3568 3 2 1500000 87 1d 6a 35 bin/rk35/rk3588_pcie_v*.bin"
3190d8781dSJon Lin}
3290d8781dSJon Lin
3390d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_SHIFT       0
3490d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_MASK        3
3590d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_AGGREGATION PHY_MODE_PCIE_AGGREGATION /**< 4 PCIE3x4 */
3690d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NANBNB      PHY_MODE_PCIE_NANBNB      /**< 0 P1:PCIE3x2  +  P0:PCIE3x2 */
3790d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NANBBI      PHY_MODE_PCIE_NANBBI      /**< 1 P1:PCIE3x2  +  P0:PCIE3x1*2 */
3890d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NABINB      PHY_MODE_PCIE_NABINB      /**< 2 P1:PCIE3x1*2 + P0:PCIE3x2 */
3990d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NABIBI      PHY_MODE_PCIE_NABIBI      /**< 3 P1:PCIE3x1*2 + P0:PCIE3x1*2 */
4090d8781dSJon Lin#define PCIE_IDB_CFG_GEN_SHIFT            8
4190d8781dSJon Lin#define PCIE_IDB_CFG_GEN_MASK             3
4290d8781dSJon Lin#define PCIE_IDB_CFG_LANE_SHIFT           12
4390d8781dSJon Lin#define PCIE_IDB_CFG_LANE_MASK            3
4490d8781dSJon Lin#define PCIE_IDB_CFG_UART_ID_SHIFT        16
4590d8781dSJon Lin#define PCIE_IDB_CFG_UART_ID_MASK         3
4690d8781dSJon Lin#define PCIE_IDB_CFG_UART_MUX_SHIFT       20
4790d8781dSJon Lin#define PCIE_IDB_CFG_UART_MUX_MASK        3
4890d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_SHIFT      24
4990d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_MASK       2
5090d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_DEFAULT    0
5190d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_15000000   1
5290d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_1152000    2
5390d8781dSJon Lin
5490d8781dSJon Linif [[ $soc != RK3588 && $soc != RK3568 ]]; then
5590d8781dSJon Lin	echo "input param soc=$soc invalid, support RK3588/RK3568"
5690d8781dSJon Lin	usage
5790d8781dSJon Lin	exit
5890d8781dSJon Linfi
5990d8781dSJon Lin
6090d8781dSJon Linif [[ $soc == RK3588 ]]; then
6190d8781dSJon Lin	if [[ $gen != 3 ]]; then
6290d8781dSJon Lin		echo "input param gen=$gen invalid, support 3"
6390d8781dSJon Lin		usage
6490d8781dSJon Lin		exit
6590d8781dSJon Lin	fi
6690d8781dSJon Lin
67*80d21b10SJon Lin	if [[ $lanes != 4 && $lanes != 2 && $lanes != 1 ]]; then
68*80d21b10SJon Lin		echo "input param lanes=$lanes invalid, support 4/2/1"
6990d8781dSJon Lin		usage
7090d8781dSJon Lin		exit
7190d8781dSJon Lin	fi
7290d8781dSJon Lin
7390d8781dSJon Lin	if [[ $baundary != 1500000 && $baundary != 115200 ]]; then
7490d8781dSJon Lin		echo "input param baundary=$baundary invalid, support 1500000/115200"
7590d8781dSJon Lin		usage
7690d8781dSJon Lin		exit
7790d8781dSJon Lin	fi
7890d8781dSJon Linfi
7990d8781dSJon Lin
8090d8781dSJon Linif [[ $soc == RK3568 ]]; then
8190d8781dSJon Lin	if [[ $gen != 3 ]]; then
8290d8781dSJon Lin		echo "input param gen=$gen invalid, support 3"
8390d8781dSJon Lin		usage
8490d8781dSJon Lin		exit
8590d8781dSJon Lin	fi
8690d8781dSJon Lin
8790d8781dSJon Lin	if [[ $lanes != 2 ]]; then
8890d8781dSJon Lin		echo "input param lanes=$lanes invalid, support 2"
8990d8781dSJon Lin		usage
9090d8781dSJon Lin		exit
9190d8781dSJon Lin	fi
9290d8781dSJon Lin
9390d8781dSJon Lin	if [[ $baundary != 1500000 ]]; then
9490d8781dSJon Lin		echo "input param baundary=$baundary invalid, support 1500000"
9590d8781dSJon Lin		usage
9690d8781dSJon Lin		exit
9790d8781dSJon Lin	fi
9890d8781dSJon Linfi
9990d8781dSJon Lin
10090d8781dSJon Linif [ -f "$input" ]; then
10190d8781dSJon Lin	echo "input param file=$input"
10290d8781dSJon Linelse
10390d8781dSJon Lin	echo "input param file=$input invalid"
10490d8781dSJon Lin	exit
10590d8781dSJon Linfi
10690d8781dSJon Lin
10790d8781dSJon Linif [[ $lanes == 4 ]]; then
108*80d21b10SJon Lin	code1=43
10990d8781dSJon Lin	if [[ $soc == RK3588 ]]; then
11090d8781dSJon Lin		code0=04
11190d8781dSJon Lin	fi
11290d8781dSJon Linelif [[ $lanes == 2 ]]; then
11390d8781dSJon Lin	code1=23
114*80d21b10SJon Lin	if [[ $soc == RK3588 ]]; then
115*80d21b10SJon Lin		code0=01
116*80d21b10SJon Lin	fi
117*80d21b10SJon Linelif [[ $lanes == 1 ]]; then
118*80d21b10SJon Lin	code1=13
119*80d21b10SJon Lin	if [[ $soc == RK3588 ]]; then
120*80d21b10SJon Lin		code0=03
121*80d21b10SJon Lin	fi
12290d8781dSJon Linfi
12390d8781dSJon Lin
12490d8781dSJon Linif [[ $baundary == 1500000 ]]; then
12590d8781dSJon Lin	code3=01
12690d8781dSJon Linfi
12790d8781dSJon Lin
12890d8781dSJon Linif [[ $baundary == 115200 ]]; then
12990d8781dSJon Lin	code3=02
13090d8781dSJon Lin
13190d8781dSJon Linfi
13290d8781dSJon Lin
13390d8781dSJon Linif [[ $baundary == 115200 ]]; then
13490d8781dSJon Lin	code3=02
13590d8781dSJon Lin
13690d8781dSJon Linfi
13790d8781dSJon Lin
13890d8781dSJon Linecho "code0=$code0"
13990d8781dSJon Linecho "code1=$code1"
14090d8781dSJon Linecho "code2=$code2"
14190d8781dSJon Linecho "code3=$code3"
14290d8781dSJon Linecho "vid=0x${vid_h}${vid_l} did=0x${did_h}${did_l}"
14390d8781dSJon Lin
14490d8781dSJon Linecho -e -n "\x${magic0}\x${magic1}\x${magic2}\x${magic3}" > .pcie_idb_cfg.bak
14590d8781dSJon Linecho -e -n "\x${code0}\x${code1}\x${code2}\x${code3}\x${vid_l}\x${vid_h}\x${did_l}\x${did_h}" >> .pcie_idb_cfg.bak
14690d8781dSJon Lindd if=$input of=.temp bs=1 count=4 > /dev/null
14790d8781dSJon Lindd if=.pcie_idb_cfg.bak of=$input bs=1 seek=4 conv=notrunc > /dev/null
14890d8781dSJon Lin
149