dss: Add new script to dump DPLLs clocks and muxes
[glsdk/util-scripts.git] / debug / dss_clockdumps.sh
1 #!/bin/bash
2 #Author:- Nikhil Devshatwar
3 #This script is used for debugging issues with DSS and LCD panels.
4 #It dumps all the clocks and muxes.
5 #For any queries, contact http://e2e.ti.com/support/omap/f/885
7 check_field() {
8 val=$1
9 shift=$2
10 mask=$3
11         fld=`printf "0x%08x" $(( $val >> $shift ))`
12         fld=$(( $fld & 0x$mask ))
13         if [ $fld = "0" ]; then
14                 echo $4
15         elif [ $fld = "1" ]; then
16                 echo $5
17         elif [ $fld = "2" ]; then
18                 echo $6
19         elif [ $fld = "3" ]; then
20                 echo $7
21         elif [ $fld = "4" ]; then
22                 echo $8
23         elif [ $fld = "5" ]; then
24                 echo $9
25         else
26                 echo "Unknown"
27         fi
28 }
30 get_field() {
31 start=$1
32 offset=$2
33 shift=$3
34 mask=$4
35         addr=`printf "0x%08x" $(( $start + $offset ))`
36         val=0x`omapconf read $addr 2>/dev/null`
37         fld=`printf "0x%08x" $(( $val >> $shift ))`
38         fld=`printf "%d" $(( $fld & $mask ))`
39         echo $fld
40 }
42 dump_dpll() {
43 inst=$1
44         if [ $inst = "video1" ]; then
45                 base=0x58004300
46         elif [ $inst = "video2" ]; then
47                 base=0x58009300
48         elif [ $inst = "hdmi" ]; then
49                 base=0x58040200
50         else
51                 echo "ERROR: Unknown DPLL instance $inst"
52                 exit
53         fi
55         echo "========================================================"
56         end=`printf "0x%08x" $(( $base + 0x20 ))`
57         echo "Register dump for DPLL $inst"
58         omapconf dump $base $end 2>/dev/null
60 #Interprete the regdump
61         
62         addr=`printf "0x%08x" $(( $base + 0x4 ))`
63         val=0x`omapconf read $addr 2>/dev/null`
64         echo "Details for DPLL $inst"
65                 pllstat=`check_field $val  1 1 "inactive" "Locked"`
66                 m4stat=`check_field $val  7 1 "inactive" "Active"`
67                 m5stat=`check_field $val  8 1 "inactive" "Active"`
68                 m6stat=`check_field $val 10 1 "inactive" "Active"`
69                 m7stat=`check_field $val 11 1 "inactive" "Active"`
70         echo "PLL status  : "   $pllstat
71         echo "M4 hsdiv(1) : "   $m4stat
72         echo "M5 hsdiv(2) : "   $m5stat
73         echo "M6 hsdiv(3) : "   $m6stat
74         echo "M7 hsdiv(4) : "   $m7stat
75         echo
77 #Print the multipliers/dividers
78                 regm=`get_field $base 0x0c  9 0xfff`
79                 regn=`get_field $base 0x0c  1 0xff`
80                 m4div=`get_field $base 0x0c 21 0x1f`
81                 m6div=`get_field $base 0x14  0 0x1f`
82                 m7div=`get_field $base 0x14  5 0x1f`
83         echo "PLL_REGM = " $regm
84         echo "PLL_REGN = " $regn
85         echo "M4 DIV   = " $m4div
86         echo "M6 DIV   = " $m6div
87         echo "M7 DIV   = " $m7div
88         echo
90 #Calculate clkouts
91         echo "Clock calculations (DPLL $inst)"
92         dcoclk=$(( sysclk * 2 * $regm / ($regn + 1) ))
93                 if [ $pllstat = "inactive" ]; then dcoclk=0; fi
94         m4clk=$(( $dcoclk / ($m4div + 1)))
95                 if [ $m4stat = "inactive" ]; then m4clk=0; fi
96         m6clk=$(( $dcoclk / ($m6div + 1)))
97                 if [ $m6stat = "inactive" ]; then m6clk=0; fi
98         m7clk=$(( $dcoclk / ($m7div + 1)))
99                 if [ $m7stat = "inactive" ]; then m7clk=0; fi
100         echo "sysclk = $sysclk"
101         echo "DCO clk = sysclk * 2 * REGM / (REGN + 1) = $dcoclk"
102         echo "M4clk (clkcout1) = DCO clk / (M4 DIV + 1) = $m4clk"
103         echo "M6clk (clkcout1) = DCO clk / (M6 DIV + 1) = $m6clk"
104         echo "M7clk (clkcout1) = DCO clk / (M7 DIV + 1) = $m7clk"
105         echo
107         eval "$inst"_pll=$dcoclk;
108         eval "$inst"_m4=$m4clk;
109         eval "$inst"_m6=$m6clk;
110         eval "$inst"_m7=$m7clk;
113 init_dpll_values() {
114 inst=$1
115         eval "$inst"_pll=0
116         eval "$inst"_m4=0
117         eval "$inst"_m6=0
118         eval "$inst"_m7=0
121 dump_dss_clk_mux() {
122         dss_pll=0x4a002538
123         val=0x`omapconf read $dss_pll 2>/dev/null`
124         echo "CTRL_CORE_DSS_PLL_CONTROL ($dss_pll) = $val"
125         echo "video1 PLL : "    `check_field $val 0 1 "Enabled" "Disabled"`
126         echo "video2 PLL : "    `check_field $val 1 1 "Enabled" "Disabled"`
127         echo "HDMI   PLL : "    `check_field $val 2 1 "Enabled" "Disabled"`
128         echo "DSI1_A_CLK mux : "`check_field $val 3 2 "DPLL Video1" "DPLL HDMI"`
129         echo "DSI1_B_CLK mux : "`check_field $val 5 3 "DPLL Video1" "DPLL video2" "DPLL HDMI" "DPLL ABE"`
130         echo "DSI1_C_CLK mux : "`check_field $val 7 2 "DPLL Video2" "DPLL Video1" "DPLL HDMI"`
131         echo
133         dss_ctrl=0x58000040
134         val=0x`omapconf read $dss_ctrl 2>/dev/null`
135         echo "DSS_CTRL ($dss_ctrl) = $val"
136         echo " 2: LCD1 clk switch : "   `check_field $val  0 1 "DSS clk" "DSI1_A_CLK"`
137         echo " 3: LCD2 clk switch : "   `check_field $val 12 1 "DSS clk" "DSI1_B_CLK"`
138         echo "10: LCD3 clk switch : "   `check_field $val 19 1 "DSS clk" "DSI1_C_CLK"`
139         echo " 1: func clk switch : "   `check_field $val  7 3 "DSS clk" "DSI1_A_CLK" "DSI1_B_CLK" "HDMI_CLK" "DSI1_C_CLK"`
140         echo "13: DPI1 output     : "   `check_field $val 16 3 "HDMI" "LCD1" "LCD3" "LCD2"`
141         echo
144 dss_clk_print() {
145         echo "========================================================"
146         echo "Clock O/P of MUXes"
147         dss_clk=`omapconf show dpll | grep -A3 "H12 Output" | grep Speed | head -1 | cut -d '|' -f6`
148         dss_clk=$(( $dss_clk * 1000000 ))
150         dss_pll=0x4a002538
151         val=0x`omapconf read $dss_pll 2>/dev/null`
152                 dsia_clk=`check_field $val 3 2 $video1_m4 $hdmi_pll`
153                 dsib_clk=`check_field $val 5 3 $video1_m6 $video2_m6 $hdmi_pll "DPLL ABE"`
154                 dsic_clk=`check_field $val 7 2 $video2_m4 $video1_m6 $hdmi_pll`
155         echo "DSI1_A_CLK : " $dsia_clk
156         echo "DSI1_B_CLK : " $dsib_clk
157         echo "DSI1_C_CLK : " $dsic_clk
158         echo 
160         dss_ctrl=0x58000040
161         val=0x`omapconf read $dss_ctrl 2>/dev/null`
162                 lcd1_clk=`check_field $val  0 1 $dss_clk $dsia_clk`
163                 lcd2_clk=`check_field $val 12 1 $dss_clk $dsib_clk`
164                 lcd3_clk=`check_field $val 19 1 $dss_clk $dsic_clk`
165                 hdmi_clk=`check_field $val  7 3 $dss_clk $dsia_clk $dsib_clk $hdmi_clk $dsic_clk`
166         echo " 2: LCD1 clk : "  $lcd1_clk
167         echo " 3: LCD2 clk : "  $lcd2_clk
168         echo "10: LCD3 clk : "  $lcd3_clk
169         echo " 1: func clk : "  $hdmi_clk
170         echo 
172                 lcd1=`get_field 0x58001070 0x0 16 0xff`
173                 lcd2=`get_field 0x5800140c 0x0 16 0xff`
174                 lcd3=`get_field 0x58001838 0x0 16 0xff`
175         lcd1_lclk=0; if [ $lcd1_clk != "0" ]; then lcd1_lclk=$(( $lcd1_clk / $lcd1 )); fi
176         lcd2_lclk=0; if [ $lcd2_clk != "0" ]; then lcd2_lclk=$(( $lcd2_clk / $lcd2 )); fi
177         lcd3_lclk=0; if [ $lcd3_clk != "0" ]; then lcd3_lclk=$(( $lcd3_clk / $lcd3 )); fi
178                 pcd1=`get_field 0x58001070 0x0  0 0xff`
179                 pcd2=`get_field 0x5800140c 0x0  0 0xff`
180                 pcd3=`get_field 0x58001838 0x0  0 0xff`
181         lcd1_pclk=0; if [ $lcd1_clk != "0" ]; then lcd1_pclk=$(( $lcd1_lclk / $pcd1 )); fi
182         lcd2_pclk=0; if [ $lcd2_clk != "0" ]; then lcd2_pclk=$(( $lcd2_lclk / $pcd2 )); fi
183         lcd3_pclk=0; if [ $lcd3_clk != "0" ]; then lcd3_pclk=$(( $lcd3_lclk / $pcd3 )); fi
184         echo "LCD1 logic clk(/" $lcd1 ") : " $lcd1_lclk " pix clk(/" $pcd1 ") : " $lcd1_pclk
185         echo "LCD2 logic clk(/" $lcd2 ") : " $lcd2_lclk " pix clk(/" $pcd2 ") : " $lcd2_pclk
186         echo "LCD3 logic clk(/" $lcd3 ") : " $lcd3_lclk " pix clk(/" $pcd3 ") : " $lcd3_pclk
187         echo 
190 echo
191 echo
192 echo "=====================DSS clock script==================="
193 echo  "Dumps internal clocks and muxes of DSS"
194 echo
196 #set -x
197 sysclk=20000000
198 dss_pll=0x4a002538
200 dump_dss_clk_mux
202 init_dpll_values video1
203 init_dpll_values video2
204 init_dpll_values hdmi
206 status=`get_field $dss_pll 0x0  0 0x1`
207 if [ $status = "0" ]; then
208         dump_dpll video1
209 fi
211 status=`get_field $dss_pll 0x0  1 0x1`
212 if [ $status = "0" ]; then
213         dump_dpll video2
214 fi
216 status=`get_field $dss_pll 0x0  2 0x1`
217 if [ $status = "0" ]; then
218         dump_dpll hdmi
219 fi
221 dss_clk_print