run heartbeat provider app for ivi VM
[glsdk/util-scripts.git] / debug / dss_clockdumps.sh
1 #!/bin/bash
2 # Author:- Nikhil Devshatwar
3 # Modified by Venkateswara Rao Mandela for HDMI PLL support
4 # and ADB support
6 #This script is used for debugging issues with DSS and LCD panels.
7 #It dumps all the clocks and muxes.
8 #For any queries, contact http://e2e.ti.com/support/omap/f/885
10 # Modify this string to --force <platname> if platform detection fails
11 FORCE_PLAT=""
13 # Set this variable to 1 when running against an Android Build
14 # The android shell has limited functionality. So this script runs
15 # omapconf via adb and parses the output on the host.
16 USE_ADB=0
18 # Define a function that wraps omapconf calls and removes the usual warning
19 # messages
20 oc_func() {
22         if [ "$USE_ADB" -eq 1 ]; then
23                 OMAPCONF1="adb shell omapconf $FORCE_PLAT"
24         else
25                 OMAPCONF1="omapconf $FORCE_PLAT"
26         fi
27         out_str=$($OMAPCONF1 "$@" 2>&1 | sed -e '/powerdm_deinit/d' -e '/clockdm_deinit/d' -e 's/[[:space:]]*$//')
28         echo "$out_str"
29 }
30 OMAPCONF=oc_func
32 check_field() {
33         val=$1
34         shift=$2
35         mask=$3
36         fld=`printf "0x%08x" $(( $val >> $shift ))`
37         fld=$(( $fld & 0x$mask ))
38         if [ $fld = "0" ]; then
39                 echo $4
40         elif [ $fld = "1" ]; then
41                 echo $5
42         elif [ $fld = "2" ]; then
43                 echo $6
44         elif [ $fld = "3" ]; then
45                 echo $7
46         elif [ $fld = "4" ]; then
47                 echo $8
48         elif [ $fld = "5" ]; then
49                 echo $9
50         else
51                 echo "Unknown"
52         fi
53 }
55 # Dump a register value given the address and the register name
56 # also exports a variable of the given name with the read value
57 dump_reg() {
58         reg=$1
59         regname=$2
60         local __outname=$2
61         val=0x$($OMAPCONF read "$reg")
62         echo "$regname ($reg) = $val"
63         echo
64         eval "$__outname"="'$val'"
65 }
67 get_field() {
68         start=$1
69         offset=$2
70         shift=$3
71         mask=$4
72         addr=`printf "0x%08x" $(( $start + $offset ))`
73         val=0x$($OMAPCONF read "$addr")
74         fld=`printf "0x%08x" $(( $val >> $shift ))`
75         fld=`printf "%d" $(( $fld & $mask ))`
76         echo $fld
77 }
79 dump_dpll() {
80         inst=$1
81         if [ $inst = "video1" ]; then
82                 base=0x58004300
83         elif [ $inst = "video2" ]; then
84                 base=0x58009300
85         elif [ $inst = "hdmi" ]; then
86                 base=0x58040200
87         else
88                 echo "ERROR: Unknown DPLL instance $inst"
89                 exit
90         fi
92         echo "========================================================"
93         end=`printf "0x%08x" $(( $base + 0x20 ))`
94         echo "Register dump for DPLL $inst"
95         $OMAPCONF dump $base $end
97         #Interprete the regdump
99         addr=`printf "0x%08x" $(( $base + 0x4 ))`
100         val=0x$($OMAPCONF read "$addr")
101         echo "Details for DPLL $inst"
102         pllstat=`check_field $val  1 1 "inactive" "Locked"`
103         m4stat=`check_field $val  7 1 "inactive" "Active"`
104         m5stat=`check_field $val  8 1 "inactive" "Active"`
105         m6stat=`check_field $val 10 1 "inactive" "Active"`
106         m7stat=`check_field $val 11 1 "inactive" "Active"`
107         echo "PLL status  : "   $pllstat
108         echo "M4 hsdiv(1) : "   $m4stat
109         echo "M5 hsdiv(2) : "   $m5stat
110         echo "M6 hsdiv(3) : "   $m6stat
111         echo "M7 hsdiv(4) : "   $m7stat
112         echo
114         #Print the multipliers/dividers
115         regm=`get_field $base 0x0c  9 0xfff`
116         regn=`get_field $base 0x0c  1 0xff`
117         m4div=`get_field $base 0x0c 21 0x1f`
118         m6div=`get_field $base 0x14  0 0x1f`
119         m7div=`get_field $base 0x14  5 0x1f`
120         echo "PLL_REGM   = " $regm
121         echo "PLL_REGN   = " $regn
122         echo "M4 DIV     = " $m4div
123         echo "M6 DIV     = " $m6div
124         echo "M7 DIV     = " $m7div
126         if [ $inst = "hdmi" ]; then
127                 regm2=`get_field $base 0x20 18 0x7f`
128                 regm_f=`get_field $base 0x20 0 0x1ffff`
129                 echo "PLL_REGM2  = " $regm2
130                 echo "PLL_REGM_F = " $regm2
132                 pll_sd=`get_field $base 0x14 10 0xff`
133                 echo "PLL_SD  = " $pll_sd
135                 addr=`printf "0x%08x" $(( $base + 0x18 ))`
136                 val=0x$($OMAPCONF read "$addr")
137                 echo "HDMI_SSC_CONFIGURATION1(should be zero) $val"
139                 addr=`printf "0x%08x" $(( $base + 0x1c ))`
140                 val=0x$($OMAPCONF read "$addr")
141                 echo "HDMI_SSC_CONFIGURATION2(should be zero) $val"
143         fi
144         echo
146         #Calculate clkouts
147         echo "Clock calculations (DPLL $inst)"
148         if [ $inst = "hdmi" ]; then
149                 dcoclk=$(( sysclk * $regm / ( ($regn + 1) * ($regm2)) ))
150                 if [ $pllstat = "inactive" ]; then dcoclk=0; fi
151                 echo "sysclk = $sysclk"
152                 echo "CLKOUT = sysclk * REGM / (REGM2 * (REGN + 1)) = $dcoclk"
153                 echo
154                 eval "$inst"_pll=$dcoclk;
155         else
156                 dcoclk=$(( sysclk * 2 * $regm / ($regn + 1) ))
157                 if [ $pllstat = "inactive" ]; then dcoclk=0; fi
158                 m4clk=$(( $dcoclk / ($m4div + 1)))
159                 if [ $m4stat = "inactive" ]; then m4clk=0; fi
160                 m6clk=$(( $dcoclk / ($m6div + 1)))
161                 if [ $m6stat = "inactive" ]; then m6clk=0; fi
162                 m7clk=$(( $dcoclk / ($m7div + 1)))
163                 if [ $m7stat = "inactive" ]; then m7clk=0; fi
164                 echo "sysclk = $sysclk"
165                 echo "DCO clk = sysclk * 2 * REGM / (REGN + 1) = $dcoclk"
166                 echo "M4clk (clkcout1) = DCO clk / (M4 DIV + 1) = $m4clk"
167                 echo "M6clk (clkcout3) = DCO clk / (M6 DIV + 1) = $m6clk"
168                 echo "M7clk (clkcout4) = DCO clk / (M7 DIV + 1) = $m7clk"
169                 echo
171                 eval "$inst"_pll=$dcoclk;
172                 eval "$inst"_m4=$m4clk;
173                 eval "$inst"_m6=$m6clk;
174                 eval "$inst"_m7=$m7clk;
175         fi
178 init_dpll_values() {
179         inst=$1
180         eval "$inst"_pll=0
181         eval "$inst"_m4=0
182         eval "$inst"_m6=0
183         eval "$inst"_m7=0
186 dump_dss_clk_regs() {
188         dump_reg "0x4A009100" "CM_DSS_CLKSTCTRL"
189         dump_reg "0x4A009120" "CM_DSS_DSS_CLKCTRL"
192 dump_dss_clk_mux() {
193         dss_pll=0x4a002538
194         val=0x$($OMAPCONF read "$dss_pll")
195         echo "CTRL_CORE_DSS_PLL_CONTROL ($dss_pll) = $val"
196         echo "video1 PLL : "    `check_field $val 0 1 "Enabled" "Disabled"`
197         echo "video2 PLL : "    `check_field $val 1 1 "Enabled" "Disabled"`
198         echo "HDMI   PLL : "    `check_field $val 2 1 "Enabled" "Disabled"`
199         echo "DSI1_A_CLK mux : "`check_field $val 3 3 "DPLL Video1" "DPLL HDMI"`
200         echo "DSI1_B_CLK mux : "`check_field $val 5 3 "DPLL Video1" "DPLL video2" "DPLL HDMI" "DPLL ABE"`
201         echo "DSI1_C_CLK mux : "`check_field $val 7 3 "DPLL Video2" "DPLL Video1" "DPLL HDMI"`
202         echo
204         dss_ctrl=0x58000040
205         val=0x$($OMAPCONF read "$dss_ctrl")
206         echo "DSS_CTRL ($dss_ctrl) = $val"
207         echo " 2: LCD1 clk switch : "   `check_field $val  0 1 "DSS clk" "DSI1_A_CLK"`
208         echo " 3: LCD2 clk switch : "   `check_field $val 12 1 "DSS clk" "DSI1_B_CLK"`
209         echo "10: LCD3 clk switch : "   `check_field $val 19 1 "DSS clk" "DSI1_C_CLK"`
210         echo " 1: func clk switch : "   `check_field $val  7 3 "DSS clk" "DSI1_A_CLK" "DSI1_B_CLK" "HDMI_CLK" "DSI1_C_CLK"`
211         echo "13: DPI1 output     : "   `check_field $val 16 3 "HDMI" "LCD1" "LCD2" "LCD3"`
212         echo
214         dss_status=0x5800005C
215         val=0x$($OMAPCONF read "$dss_status")
216         echo "DSS_STATUS ($dss_status) = $val"
217         echo
219         dsi_clk_ctrl=0x58004054
220         val=0x$($OMAPCONF read "$dsi_clk_ctrl")
221         echo "DSI_CLK_CTRL ($dsi_clk_ctrl) = $val"
222         echo
225 dss_clk_print() {
226         echo "========================================================"
227         echo "Clock O/P of MUXes"
228         dss_clk=$($OMAPCONF show dpll | grep -A3 "H12 Output" | grep Speed | head -1 | cut -d '|' -f6)
229         dss_clk=$(( $dss_clk * 1000000 ))
230         echo "DPLL PER H12 Output $dss_clk"
231         dump_reg "0x4A00815C" "CM_DIV_H12_DPLL_PER"
233         dss_pll=0x4a002538
234         val=0x$($OMAPCONF read "$dss_pll")
235         dsia_clk=`check_field $val 3 3 $video1_m4 $hdmi_pll`
236         dsib_clk=`check_field $val 5 3 $video1_m6 $video2_m6 $hdmi_pll "DPLL ABE"`
237         dsic_clk=`check_field $val 7 3 $video2_m4 $video1_m6 $hdmi_pll`
238         echo "DSI1_A_CLK : " $dsia_clk
239         echo "DSI1_B_CLK : " $dsib_clk
240         echo "DSI1_C_CLK : " $dsic_clk
241         echo 
243         dss_ctrl=0x58000040
244         val=0x$($OMAPCONF read "$dss_ctrl")
245         lcd1_clk=`check_field $val  0 1 $dss_clk $dsia_clk`
246         lcd2_clk=`check_field $val 12 1 $dss_clk $dsib_clk`
247         lcd3_clk=`check_field $val 19 1 $dss_clk $dsic_clk`
248         hdmi_clk=`check_field $val  7 3 $dss_clk $dsia_clk $dsib_clk $hdmi_clk $dsic_clk`
250         dump_reg "0x58001804" "DISPC_DIVISOR"
252         echo " 2: LCD1 clk : "  $lcd1_clk
253         echo " 3: LCD2 clk : "  $lcd2_clk
254         echo "10: LCD3 clk : "  $lcd3_clk
255         echo " 1: func clk : "  $hdmi_clk
256         echo 
258         lcd1=`get_field 0x58001070 0x0 16 0xff`
259         lcd2=`get_field 0x5800140c 0x0 16 0xff`
260         lcd3=`get_field 0x58001838 0x0 16 0xff`
261         lcd1_lclk=0; if [ $lcd1_clk != "0" ]; then lcd1_lclk=$(( $lcd1_clk / $lcd1 )); fi
262         lcd2_lclk=0; if [ $lcd2_clk != "0" ]; then lcd2_lclk=$(( $lcd2_clk / $lcd2 )); fi
263         lcd3_lclk=0; if [ $lcd3_clk != "0" ]; then lcd3_lclk=$(( $lcd3_clk / $lcd3 )); fi
264         pcd1=`get_field 0x58001070 0x0  0 0xff`
265         pcd2=`get_field 0x5800140c 0x0  0 0xff`
266         pcd3=`get_field 0x58001838 0x0  0 0xff`
267         lcd1_pclk=0; if [ $lcd1_clk != "0" ]; then lcd1_pclk=$(( $lcd1_lclk / $pcd1 )); fi
268         lcd2_pclk=0; if [ $lcd2_clk != "0" ]; then lcd2_pclk=$(( $lcd2_lclk / $pcd2 )); fi
269         lcd3_pclk=0; if [ $lcd3_clk != "0" ]; then lcd3_pclk=$(( $lcd3_lclk / $pcd3 )); fi
270         echo "LCD1 logic clk(/" $lcd1 ") : " $lcd1_lclk " pix clk(/" $pcd1 ") : " $lcd1_pclk
271         echo "LCD2 logic clk(/" $lcd2 ") : " $lcd2_lclk " pix clk(/" $pcd2 ") : " $lcd2_pclk
272         echo "LCD3 logic clk(/" $lcd3 ") : " $lcd3_lclk " pix clk(/" $pcd3 ") : " $lcd3_pclk
273         echo 
276 echo
277 echo
278 echo "=====================DSS clock script==================="
279 echo  "Dumps internal clocks and muxes of DSS"
280 echo
282 #set -x
283 sysclk=20000000
284 dss_pll=0x4a002538
286 dump_dss_clk_mux
288 dump_dss_clk_regs
290 init_dpll_values video1
291 init_dpll_values video2
292 init_dpll_values hdmi
294 status=`get_field $dss_pll 0x0  0 0x1`
295 if [ $status = "0" ]; then
296         dump_dpll video1
297 fi
299 status=`get_field $dss_pll 0x0  1 0x1`
300 if [ $status = "0" ]; then
301         dump_dpll video2
302 fi
304 status=`get_field $dss_pll 0x0  2 0x1`
305 if [ $status = "0" ]; then
306         dump_dpll hdmi
307 fi
309 dss_clk_print