xref: /rkbin/tools/pcie_idb_config.sh (revision 90d8781dba5694008fe5febdcc3683d4b8c4504b)
1*90d8781dSJon Lin#!/bin/bash
2*90d8781dSJon Lin
3*90d8781dSJon Linsoc=$1
4*90d8781dSJon Lingen=$2
5*90d8781dSJon Linlanes=$3
6*90d8781dSJon Linbaundary=$4
7*90d8781dSJon Lininput=$9
8*90d8781dSJon Lin
9*90d8781dSJon Linmagic0=70
10*90d8781dSJon Linmagic1=63
11*90d8781dSJon Linmagic2=69
12*90d8781dSJon Linmagic3=65
13*90d8781dSJon Lincode0=00
14*90d8781dSJon Lincode1=43
15*90d8781dSJon Lincode2=00
16*90d8781dSJon Lincode3=00
17*90d8781dSJon Lin# case: vid=0x1d87 did=0x356a
18*90d8781dSJon Linvid_l=$5
19*90d8781dSJon Linvid_h=$6
20*90d8781dSJon Lindid_l=$7
21*90d8781dSJon Lindid_h=$8
22*90d8781dSJon Lin
23*90d8781dSJon Linfunction usage()
24*90d8781dSJon Lin{
25*90d8781dSJon Lin	echo "./pcie_idb_config.sh <soc> <gen> <lanes> <uart_baundary> <vid_l> <vid_h> <did_l> <did_h> <input>"
26*90d8781dSJon Lin	echo "like following:"
27*90d8781dSJon Lin	echo "./pcie_idb_config.sh RK3588 3 4 1500000 87 1d 6a 35 bin/rk35/rk3588_pcie_v*.bin"
28*90d8781dSJon Lin	echo "./pcie_idb_config.sh RK3588 3 2 1500000 87 1d 6a 35 bin/rk35/rk3588_pcie_v*.bin"
29*90d8781dSJon Lin	echo "./pcie_idb_config.sh RK3588 3 4 115200  87 1d 6a 35 bin/rk35/rk3568_pcie_v*.bin"
30*90d8781dSJon Lin	echo "./pcie_idb_config.sh RK3568 3 2 1500000 87 1d 6a 35 bin/rk35/rk3588_pcie_v*.bin"
31*90d8781dSJon Lin}
32*90d8781dSJon Lin
33*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_SHIFT       0
34*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_MASK        3
35*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_AGGREGATION PHY_MODE_PCIE_AGGREGATION /**< 4 PCIE3x4 */
36*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NANBNB      PHY_MODE_PCIE_NANBNB      /**< 0 P1:PCIE3x2  +  P0:PCIE3x2 */
37*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NANBBI      PHY_MODE_PCIE_NANBBI      /**< 1 P1:PCIE3x2  +  P0:PCIE3x1*2 */
38*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NABINB      PHY_MODE_PCIE_NABINB      /**< 2 P1:PCIE3x1*2 + P0:PCIE3x2 */
39*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NABIBI      PHY_MODE_PCIE_NABIBI      /**< 3 P1:PCIE3x1*2 + P0:PCIE3x1*2 */
40*90d8781dSJon Lin#define PCIE_IDB_CFG_GEN_SHIFT            8
41*90d8781dSJon Lin#define PCIE_IDB_CFG_GEN_MASK             3
42*90d8781dSJon Lin#define PCIE_IDB_CFG_LANE_SHIFT           12
43*90d8781dSJon Lin#define PCIE_IDB_CFG_LANE_MASK            3
44*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_ID_SHIFT        16
45*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_ID_MASK         3
46*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_MUX_SHIFT       20
47*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_MUX_MASK        3
48*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_SHIFT      24
49*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_MASK       2
50*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_DEFAULT    0
51*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_15000000   1
52*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_1152000    2
53*90d8781dSJon Lin
54*90d8781dSJon Linif [[ $soc != RK3588 && $soc != RK3568 ]]; then
55*90d8781dSJon Lin	echo "input param soc=$soc invalid, support RK3588/RK3568"
56*90d8781dSJon Lin	usage
57*90d8781dSJon Lin	exit
58*90d8781dSJon Linfi
59*90d8781dSJon Lin
60*90d8781dSJon Linif [[ $soc == RK3588 ]]; then
61*90d8781dSJon Lin	if [[ $gen != 3 ]]; then
62*90d8781dSJon Lin		echo "input param gen=$gen invalid, support 3"
63*90d8781dSJon Lin		usage
64*90d8781dSJon Lin		exit
65*90d8781dSJon Lin	fi
66*90d8781dSJon Lin
67*90d8781dSJon Lin	if [[ $lanes != 4 && $lanes != 2 ]]; then
68*90d8781dSJon Lin		echo "input param lanes=$lanes invalid, support 4/2"
69*90d8781dSJon Lin		usage
70*90d8781dSJon Lin		exit
71*90d8781dSJon Lin	fi
72*90d8781dSJon Lin
73*90d8781dSJon Lin	if [[ $baundary != 1500000 && $baundary != 115200 ]]; then
74*90d8781dSJon Lin		echo "input param baundary=$baundary invalid, support 1500000/115200"
75*90d8781dSJon Lin		usage
76*90d8781dSJon Lin		exit
77*90d8781dSJon Lin	fi
78*90d8781dSJon Linfi
79*90d8781dSJon Lin
80*90d8781dSJon Linif [[ $soc == RK3568 ]]; then
81*90d8781dSJon Lin	if [[ $gen != 3 ]]; then
82*90d8781dSJon Lin		echo "input param gen=$gen invalid, support 3"
83*90d8781dSJon Lin		usage
84*90d8781dSJon Lin		exit
85*90d8781dSJon Lin	fi
86*90d8781dSJon Lin
87*90d8781dSJon Lin	if [[ $lanes != 2 ]]; then
88*90d8781dSJon Lin		echo "input param lanes=$lanes invalid, support 2"
89*90d8781dSJon Lin		usage
90*90d8781dSJon Lin		exit
91*90d8781dSJon Lin	fi
92*90d8781dSJon Lin
93*90d8781dSJon Lin	if [[ $baundary != 1500000 ]]; then
94*90d8781dSJon Lin		echo "input param baundary=$baundary invalid, support 1500000"
95*90d8781dSJon Lin		usage
96*90d8781dSJon Lin		exit
97*90d8781dSJon Lin	fi
98*90d8781dSJon Linfi
99*90d8781dSJon Lin
100*90d8781dSJon Linif [ -f "$input" ]; then
101*90d8781dSJon Lin	echo "input param file=$input"
102*90d8781dSJon Linelse
103*90d8781dSJon Lin	echo "input param file=$input invalid"
104*90d8781dSJon Lin	exit
105*90d8781dSJon Linfi
106*90d8781dSJon Lin
107*90d8781dSJon Linif [[ $lanes == 4 ]]; then
108*90d8781dSJon Lin	if [[ $soc == RK3588 ]]; then
109*90d8781dSJon Lin		code0=04
110*90d8781dSJon Lin	fi
111*90d8781dSJon Linelif [[ $lanes == 2 ]]; then
112*90d8781dSJon Lin	code1=23
113*90d8781dSJon Linfi
114*90d8781dSJon Lin
115*90d8781dSJon Linif [[ $baundary == 1500000 ]]; then
116*90d8781dSJon Lin	code3=01
117*90d8781dSJon Linfi
118*90d8781dSJon Lin
119*90d8781dSJon Linif [[ $baundary == 115200 ]]; then
120*90d8781dSJon Lin	code3=02
121*90d8781dSJon Lin
122*90d8781dSJon Linfi
123*90d8781dSJon Lin
124*90d8781dSJon Linif [[ $baundary == 115200 ]]; then
125*90d8781dSJon Lin	code3=02
126*90d8781dSJon Lin
127*90d8781dSJon Linfi
128*90d8781dSJon Lin
129*90d8781dSJon Linecho "code0=$code0"
130*90d8781dSJon Linecho "code1=$code1"
131*90d8781dSJon Linecho "code2=$code2"
132*90d8781dSJon Linecho "code3=$code3"
133*90d8781dSJon Linecho "vid=0x${vid_h}${vid_l} did=0x${did_h}${did_l}"
134*90d8781dSJon Lin
135*90d8781dSJon Linecho -e -n "\x${magic0}\x${magic1}\x${magic2}\x${magic3}" > .pcie_idb_cfg.bak
136*90d8781dSJon 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
137*90d8781dSJon Lindd if=$input of=.temp bs=1 count=4 > /dev/null
138*90d8781dSJon Lindd if=.pcie_idb_cfg.bak of=$input bs=1 seek=4 conv=notrunc > /dev/null
139*90d8781dSJon Lin
140