rjw | 6c1fd8f | 2022-11-30 14:33:01 +0800 | [diff] [blame] | 1 | #!/usr/bin/perl |
| 2 | # |
| 3 | # Copyright Statement: |
| 4 | # -------------------- |
| 5 | # This software is protected by Copyright and the information contained |
| 6 | # herein is confidential. The software may not be copied and the information |
| 7 | # contained herein may not be used or disclosed except with the written |
| 8 | # permission of MediaTek Inc. (C) 2006 |
| 9 | # |
| 10 | # BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES |
| 11 | # THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") |
| 12 | # RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON |
| 13 | # AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, |
| 14 | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF |
| 15 | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. |
| 16 | # NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE |
| 17 | # SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR |
| 18 | # SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH |
| 19 | # THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO |
| 20 | # NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S |
| 21 | # SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. |
| 22 | # |
| 23 | # BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE |
| 24 | # LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, |
| 25 | # AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, |
| 26 | # OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO |
| 27 | # MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. |
| 28 | # |
| 29 | # THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE |
| 30 | # WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF |
| 31 | # LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND |
| 32 | # RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER |
| 33 | # THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). |
| 34 | # |
| 35 | #***************************************************************************** |
| 36 | #* |
| 37 | #* Filename: |
| 38 | #* --------- |
| 39 | #* BasicInfoQuery.pm |
| 40 | #* |
| 41 | #* Project: |
| 42 | #* -------- |
| 43 | #* |
| 44 | #* |
| 45 | #* Description: |
| 46 | #* ------------ |
| 47 | #* This perl module is used to get system basic information |
| 48 | #* |
| 49 | #* |
| 50 | #* Author: |
| 51 | #* ------- |
| 52 | #* Carl Kao (mtk08237) |
| 53 | #* |
| 54 | #****************************************************************************/ |
| 55 | |
| 56 | BEGIN { push @INC, '../', './tools/', './tools/MemoryUtility/' } # add additional library path |
| 57 | |
| 58 | use strict; |
| 59 | use POSIX qw(floor ceil); |
| 60 | use systemInfo; |
| 61 | use LinkerOutputParser; |
| 62 | use FileInfoParser; |
| 63 | use CommonUtility; |
| 64 | |
| 65 | package FILEOPTION; |
| 66 | use constant LIS => 1; |
| 67 | use constant MAP => 2; |
| 68 | use constant SYM => 3; |
| 69 | use constant MAKEFILE => 4; |
| 70 | use constant INFOMAKE => 5; |
| 71 | |
| 72 | package BasicMemInfo; |
| 73 | |
| 74 | #**************************************************************************** |
| 75 | # Constants |
| 76 | #**************************************************************************** |
| 77 | my $VERNO = " v0.01"; |
| 78 | # v0.01 , 2018/10/17, Updated CMD_GetRAMUsage for 512MB memory |
| 79 | # e0.01 , 2018/08/06, Updated CMD_GetRAMUsage |
| 80 | # a0.06 , 2018/05/14, Limited memory padding count to 8 in CMD_GetRAMUsage |
| 81 | # a0.05 , 2017/11/28, Provide DRDI usage info in CMD_GetRAMUsage |
| 82 | # a0.04 , 2017/07/04, Fixed CMD_GetRAMUsage when calculating overlay section size |
| 83 | # a0.03 , 2017/07/04, Refactored CMD_GetRAMUsage due DRDI |
| 84 | # a0.02 , 2017/01/28, Fixed CMD_GetRAMUsage when using 64KB MPU granularity |
| 85 | # a0.01 , 2017/01/24, Fixed GetTotalRAMUsageFromLDS function |
| 86 | # u0.06 , 2016/11/02, Sort execution regions with start address in GetERsInRAM |
| 87 | # u0.05 , 2016/09/07, RAM margin info modified to CMD_GetRAMUsage |
| 88 | # u0.04 , 2016/09/06, Free RAM and RAM margin info modified to CMD_GetRAMUsage |
| 89 | # u0.03 , 2016/03/03, Memory Utility Refinement (Add shared region info to CMD_GetRAMUsage) |
| 90 | # u0.02 , 2015/01/20, Memory Utility Refinement (Add shared region info to CMD_GetRAMUsage) |
| 91 | # u0.01 , 2015/01/14, Memory Utility Refinement |
| 92 | # m0.06 , 2014/02/20, Correct GetTotalRAMUsageFromLDS's base address |
| 93 | # m0.05 , 2013/12/25, Fix LoadView which can't count in .bss |
| 94 | # m0.04 , 2013/10/20, Support Secure region |
| 95 | # m0.03 , 2013/06/25, Support CMD_GetROMSize() for filtering out COPRO section |
| 96 | # m0.02 , 2013/03/21, Support GetMBAlignment() |
| 97 | # m0.01 , 2013/01/08, Initial revision |
| 98 | |
| 99 | #**************************************************************************** |
| 100 | # Global variable |
| 101 | #**************************************************************************** |
| 102 | my $g_bParseSYM = 0; |
| 103 | my $g_bParseMAP = 0; |
| 104 | my $g_bParseMAKEFILE = 0; |
| 105 | my %g_MAKEFILE_OPTIONS; |
| 106 | |
| 107 | #**************************************************************************** |
| 108 | # Subroutine: BasicInfoQuery_verno - to query this package's version number |
| 109 | # Parameters: x |
| 110 | # Returns: version number string |
| 111 | #**************************************************************************** |
| 112 | sub BasicInfoQuery_verno |
| 113 | { |
| 114 | return $VERNO; |
| 115 | } |
| 116 | |
| 117 | #**************************************************************************** |
| 118 | # oo >>> Finished |
| 119 | #**************************************************************************** |
| 120 | return 1; |
| 121 | |
| 122 | sub DispatchCommand |
| 123 | { |
| 124 | my ($cmd, $MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) = @_; |
| 125 | |
| 126 | # force the Parse to be called in DispatchCommand in order to make sure the only entry function of this file is DispatchCommand |
| 127 | sub Parse |
| 128 | { |
| 129 | my ($nOption, $PATH) = @_; |
| 130 | if($nOption == FILEOPTION::MAP and !$g_bParseMAP) |
| 131 | { |
| 132 | basicinfo_die("$PATH doesn't exist!") if(!-e $PATH); |
| 133 | &LinkerOutputParser::FileParse($PATH); |
| 134 | $g_bParseMAP = 1; |
| 135 | } |
| 136 | elsif($nOption == FILEOPTION::SYM and !$g_bParseSYM) |
| 137 | { |
| 138 | basicinfo_die("$PATH doesn't exist!") if(!-e $PATH); |
| 139 | &LinkerOutputParser::FileParse($PATH); |
| 140 | $g_bParseSYM = 1; |
| 141 | } |
| 142 | elsif($nOption == FILEOPTION::MAKEFILE and !$g_bParseMAKEFILE) |
| 143 | { |
| 144 | basicinfo_die("$PATH doesn't exist!") if(!-e $PATH); |
| 145 | &FileInfo::Parse_MAKEFILE($PATH, \%g_MAKEFILE_OPTIONS); |
| 146 | $g_bParseMAKEFILE = 1; |
| 147 | } |
| 148 | } |
| 149 | Parse(FILEOPTION::SYM, $SYM_PATH); |
| 150 | Parse(FILEOPTION::MAKEFILE, $MAKEFILE_PATH, \%g_MAKEFILE_OPTIONS); |
| 151 | $cmd = "help" if($cmd eq "-h" or $cmd eq "--help"); |
| 152 | my ($pack_name, $file, $line_no) = caller; |
| 153 | no strict 'refs'; |
| 154 | &{$cmd}($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) if (exists &{$cmd}) |
| 155 | or basicinfo_die("$cmd() doesn't exists!", $file, $line_no); |
| 156 | } |
| 157 | |
| 158 | # It HAS L1core and Secure region ! |
| 159 | sub CMD_GetLoadViewSize |
| 160 | { |
| 161 | my ($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) = @_; |
| 162 | my $ERs_aref = &LinkerOutputParser::ListAllExeRegion(1); |
| 163 | my $strLastRegion; |
| 164 | my $nLoadViewSize; |
| 165 | |
| 166 | for (my $i = $#{$ERs_aref};$i >= 0; $i--) |
| 167 | { |
| 168 | $strLastRegion = $ERs_aref->[$i]; |
| 169 | $nLoadViewSize = hex(&LinkerOutputParser::GetExeRegionInfo($strLastRegion, Region::LMA)); |
| 170 | last if (LinkerOutputParser::GetExeRegionInfo($strLastRegion, Region::Attr) =~ /LOAD/); |
| 171 | } |
| 172 | my $strUROM_Base = sysInfo::GetMemoryInfo("UROM", 1, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS); |
| 173 | my $strROM_Length = sysInfo::GetMemoryInfo("ROM", 2, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS); |
| 174 | |
| 175 | PrintLog($PrintFunc, "Load Information:\n"); |
| 176 | PrintLog($PrintFunc, "ROM Base Address in LDS = $strUROM_Base\n"); |
| 177 | PrintLog($PrintFunc, "ROM Length in LDS = $strROM_Length\n"); |
| 178 | PrintLog($PrintFunc, "Last Region in load = $strLastRegion\n"); |
| 179 | |
| 180 | if($strLastRegion !~/zi|bss/i) |
| 181 | { |
| 182 | my $nLastRegionSize = hex(&LinkerOutputParser::GetExeRegionInfo($strLastRegion, Region::Size)); |
| 183 | PrintLog($PrintFunc, "Last Region Size in Load = ". CommonUtil::Dec2Hex($nLastRegionSize) . " = $nLastRegionSize(Bytes) \n"); |
| 184 | $nLoadViewSize += $nLastRegionSize; |
| 185 | } |
| 186 | else |
| 187 | { |
| 188 | PrintLog($PrintFunc, "Last Region Size in load = 0 (Bytes) \n"); |
| 189 | } |
| 190 | PrintLog($PrintFunc, "End address of last Region LMA in load = ". CommonUtil::Dec2Hex($nLoadViewSize) . "\n"); |
| 191 | PrintLog($PrintFunc, "-------------------------------------------------------------------\n"); |
| 192 | $nLoadViewSize -= hex($strUROM_Base); |
| 193 | PrintLog($PrintFunc, "Total Load Size (ROM) = ". CommonUtil::Dec2Hex($nLoadViewSize) . " = $nLoadViewSize(Bytes) \n"); |
| 194 | return $nLoadViewSize; |
| 195 | } |
| 196 | |
| 197 | # NO L1core and Secure region ! |
| 198 | sub CMD_GetROMSize |
| 199 | { |
| 200 | my ($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) = @_; |
| 201 | my $strUROM_Base = sysInfo::GetMemoryInfo("UROM", 1, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS); |
| 202 | my $strROM_Length = sysInfo::GetMemoryInfo("ROM", 2, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS); |
| 203 | |
| 204 | PrintLog($PrintFunc, "ROM Information:\n"); |
| 205 | PrintLog($PrintFunc, "ROM Base Address in LDS = $strUROM_Base\n"); |
| 206 | PrintLog($PrintFunc, "ROM Length in LDS = $strROM_Length\n"); |
| 207 | |
| 208 | my $ERs_aref = &LinkerOutputParser::ListAllExeRegion(1); |
| 209 | $ERs_aref = sysInfo::FilterOutCoproReservedRegion($ERs_aref); |
| 210 | $ERs_aref = sysInfo::FilterOutSecureRegion($ERs_aref);# if(FileInfo::is_BuiltWithCopro());; |
| 211 | my $strLastRegion; |
| 212 | my $nLoadViewSize; |
| 213 | |
| 214 | for (my $i = $#{$ERs_aref};$i >= 0; $i--) |
| 215 | { |
| 216 | $strLastRegion = $ERs_aref->[$i]; |
| 217 | $nLoadViewSize = hex(&LinkerOutputParser::GetExeRegionInfo($strLastRegion, Region::LMA)); |
| 218 | last if (LinkerOutputParser::GetExeRegionInfo($strLastRegion, Region::Attr) =~ /LOAD/); |
| 219 | } |
| 220 | |
| 221 | my $nROMBase = hex($strUROM_Base); |
| 222 | my $nROMSize = ($nLoadViewSize&0x0fffffff) - ($nROMBase&0x0fffffff); |
| 223 | PrintLog($PrintFunc, "Last Load Region in ROM = $strLastRegion\n"); |
| 224 | if($strLastRegion !~/zi|bss/i) |
| 225 | { |
| 226 | my $nLastRegionSize = hex(&LinkerOutputParser::GetExeRegionInfo($strLastRegion, Region::Size)); |
| 227 | PrintLog($PrintFunc, "Last Load Region Size in ROM = ". CommonUtil::Dec2Hex($nLastRegionSize) ." = $nLastRegionSize(Bytes) \n"); |
| 228 | $nROMSize += $nLastRegionSize; |
| 229 | } |
| 230 | else |
| 231 | { |
| 232 | PrintLog($PrintFunc, "Last Load Region Size in ROM = 0 (Bytes) \n"); |
| 233 | } |
| 234 | |
| 235 | my $strROMSize = CommonUtil::Dec2Hex($nROMSize); # $nROMSize = $nROMendAddress for pcore since $nROMBase=0 |
| 236 | my $nROMendAddress = $nROMBase + $nROMSize; |
| 237 | PrintLog($PrintFunc, "End address of last Region LMA = ". CommonUtil::Dec2Hex($nROMendAddress) ."\n"); |
| 238 | PrintLog($PrintFunc, "-------------------------------------------------------------------\n"); |
| 239 | PrintLog($PrintFunc, "Total ROM Size (Code + RO Data + RW Data) = $strROMSize = $nROMSize(Bytes) \n"); |
| 240 | return $nROMSize; |
| 241 | } |
| 242 | |
| 243 | sub CMD_GetNonSharedRAMUsage |
| 244 | { |
| 245 | |
| 246 | my ($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) = @_; |
| 247 | |
| 248 | my $ERinRAM_aref = GetERsInRAM($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc); |
| 249 | my ($nNonSharedRAMUsage, $nRAMMargin) = (0, 0, 0); |
| 250 | if(scalar(@$ERinRAM_aref)>0) |
| 251 | { |
| 252 | my $EndRegion = @$ERinRAM_aref[scalar(@$ERinRAM_aref)-1]; |
| 253 | |
| 254 | # 1. calculate current RAM usage by "end of last section - base of first section " |
| 255 | #my $nFirstERInRAMVMA = hex(&LinkerOutputParser::GetExeRegionInfo($ERinRAM_aref->[0], Region::VMA)); |
| 256 | |
| 257 | my $nFirstNonSharedERInRAMVMAinBank0 = hex(&LinkerOutputParser::GetExeRegionInfo('CACHED_EXTSRAM', Region::VMA)) & 0x0FFFFFFF; |
| 258 | my $nEndRegionVMA = hex(&LinkerOutputParser::GetExeRegionInfo($EndRegion, Region::VMA)); |
| 259 | my $nEndRegionSize = hex(&LinkerOutputParser::GetExeRegionInfo($EndRegion, Region::Size)); |
| 260 | $nNonSharedRAMUsage = $nEndRegionVMA + $nEndRegionSize - $nFirstNonSharedERInRAMVMAinBank0; |
| 261 | |
| 262 | |
| 263 | # 2. get RAM Margin, 1:base, 2:length |
| 264 | my $nRAM_Base = hex(sysInfo::GetMemoryInfo("RAM", 1, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS)); |
| 265 | my $nRAM_Length = hex(sysInfo::GetMemoryInfo("RAM", 2, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS)); |
| 266 | my $nVRAM_Base = sysInfo::GetMemoryInfo("VRAM", 1, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS); |
| 267 | $nRAMMargin = ($nRAM_Base + $nRAM_Length) - ($nEndRegionVMA + $nEndRegionSize); |
| 268 | |
| 269 | |
| 270 | # 3. no need to get the space of dsp tx/rx since there is no region in the end of RAM |
| 271 | # $nReservedSize = GetReservedSize($IMAGELAYOUT_PATH, $SYM_PATH, $MAKEFILE_PATH); |
| 272 | |
| 273 | } |
| 274 | return ($nNonSharedRAMUsage, $nRAMMargin); |
| 275 | } |
| 276 | |
| 277 | sub CMD_GetRAMUsage |
| 278 | { |
| 279 | my ($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc, $nRAM_Base) = @_; |
| 280 | $nRAM_Base = hex(sysInfo::GetMemoryInfo("RAM", 1, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS)) if(!defined $nRAM_Base); |
| 281 | my $ERinRAM_aref = GetERsInRAM($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc); |
| 282 | my $nRAMUsage = 0; |
| 283 | my @RAMMargins; |
| 284 | return $nRAMUsage if (!@$ERinRAM_aref); |
| 285 | |
| 286 | my $strRAM_Base = sysInfo::GetMemoryInfo("RAM", 1, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS); |
| 287 | my $strVRAM_Base = sysInfo::GetMemoryInfo("VRAM", 1, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS); |
| 288 | my $strRAM_Length = sysInfo::GetMemoryInfo("RAM", 2, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS); |
| 289 | my $nDummyEndBase = hex(&LinkerOutputParser::Get_DUMMY_END_Base()); |
| 290 | my $ER = $ERinRAM_aref->[-1]; |
| 291 | my $nEndRegionVMA = hex(&LinkerOutputParser::GetExeRegionInfo($ER, Region::VMA)); |
| 292 | my $nEndRegionSize = hex(&LinkerOutputParser::GetExeRegionInfo($ER, Region::Size)); |
| 293 | my $strEndRegionEndVMA = CommonUtil::Dec2Hex($nEndRegionVMA+$nEndRegionSize); |
| 294 | my $nFirstERInRAMVMA = hex(&LinkerOutputParser::GetExeRegionInfo($ERinRAM_aref->[0], Region::VMA)); |
| 295 | my $strFirstERInRAMVMA = CommonUtil::Dec2Hex($nFirstERInRAMVMA); |
| 296 | |
| 297 | PrintLog($PrintFunc, "RAM Information:\n"); |
| 298 | PrintLog($PrintFunc, "RAM Base Address in LDS = $strRAM_Base\n"); |
| 299 | PrintLog($PrintFunc, "VRAM Base Address in LDS = $strVRAM_Base\n"); |
| 300 | PrintLog($PrintFunc, "1st Region in RAM: ".$ERinRAM_aref->[0].", VMA=$strFirstERInRAMVMA\n"); |
| 301 | PrintLog($PrintFunc, "RegionBeforeDummyEnd: $ER, VMA=".CommonUtil::Dec2Hex($nEndRegionVMA). |
| 302 | ", Size=".CommonUtil::Dec2Hex($nEndRegionSize).", End address=$strEndRegionEndVMA\n"); |
| 303 | PrintLog($PrintFunc, "DummyEndBase = ".CommonUtil::Dec2Hex($nDummyEndBase)." (the end address of total MD memory)\n"); |
| 304 | PrintLog($PrintFunc, "-------------------------------------------------------------------\n"); |
| 305 | |
| 306 | my $nERend = CMD_GetROMSize(($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH)); |
| 307 | my @FreeRAMAreas; |
| 308 | my @UsedRAMAreas; |
| 309 | my $drdi_start = 0; |
| 310 | my $drdi_load_start = 0; |
| 311 | my $drdi_end = 0; |
| 312 | my $drdi_load_end = 0; |
| 313 | my $drdi_found = 0; |
| 314 | |
| 315 | foreach $ER (@$ERinRAM_aref) #Go through all regions in ram |
| 316 | { |
| 317 | my $strERsize = LinkerOutputParser::GetExeRegionInfo($ER, Region::Size); |
| 318 | my $nERaddr = get_physical_address(hex(&LinkerOutputParser::GetExeRegionInfo($ER, Region::VMA))); |
| 319 | if (hex($strERsize)) |
| 320 | { |
| 321 | my $ERsize = hex($strERsize); |
| 322 | my $append = 0; |
| 323 | my $note = undef; |
| 324 | foreach my $used (@UsedRAMAreas) |
| 325 | { |
| 326 | |
| 327 | if(($used->[0]<=$nERaddr) and (($used->[0]+$used->[1])>=$nERaddr)) |
| 328 | { |
| 329 | if (($used->[0]+$used->[1])<=($nERaddr+$ERsize)) |
| 330 | { |
| 331 | $used->[1]= ($nERaddr+$ERsize)-$used->[0]; |
| 332 | } |
| 333 | $append = 1; |
| 334 | } |
| 335 | elsif(($used->[0]<=($nERaddr+$ERsize)) and (($used->[0]+$used->[1])>=($nERaddr+$ERsize))) |
| 336 | { |
| 337 | if ($used->[0] < $nERaddr) |
| 338 | { |
| 339 | $used->[1] += $nERaddr-$used->[0]; |
| 340 | $used->[0] = $nERaddr; |
| 341 | $append = 1; |
| 342 | } |
| 343 | } |
| 344 | if($ER =~ /DRDI/) |
| 345 | { |
| 346 | if($drdi_found == 0) |
| 347 | { |
| 348 | $drdi_start = $nERaddr; |
| 349 | $drdi_load_start = hex(&LinkerOutputParser::GetExeRegionInfo($ER, Region::LMA)); |
| 350 | $drdi_end = $nERaddr + $ERsize; |
| 351 | $drdi_load_end = $drdi_load_start + $ERsize; |
| 352 | $drdi_found = 1; |
| 353 | } |
| 354 | else |
| 355 | { |
| 356 | $drdi_end = $nERaddr+$ERsize if($drdi_end <= ($nERaddr+$ERsize)); |
| 357 | $drdi_load_end = hex(&LinkerOutputParser::GetExeRegionInfo($ER, Region::LMA))+$ERsize; |
| 358 | } |
| 359 | } |
| 360 | if ($append == 1) |
| 361 | { |
| 362 | $used->[2] = $note if($note ne undef); |
| 363 | } |
| 364 | } |
| 365 | |
| 366 | if ($append == 1) |
| 367 | { |
| 368 | $append = 0; |
| 369 | } |
| 370 | else |
| 371 | { |
| 372 | push @UsedRAMAreas, [$nERaddr, $ERsize, $note] |
| 373 | } |
| 374 | } |
| 375 | } |
| 376 | |
| 377 | @UsedRAMAreas = sort {$a->[0]<=>$b->[0]} @UsedRAMAreas; |
| 378 | |
| 379 | if($nERend < $UsedRAMAreas[0][0]) |
| 380 | { |
| 381 | push @FreeRAMAreas, [$nERend,$UsedRAMAreas[0][0]-$nERend]; |
| 382 | } |
| 383 | |
| 384 | for( my $i = 0;$i < $#UsedRAMAreas;$i+=1) |
| 385 | { |
| 386 | my $freeStart =$UsedRAMAreas[$i][0]+$UsedRAMAreas[$i][1]; |
| 387 | my $freeSize =$UsedRAMAreas[$i+1][0]-$freeStart; |
| 388 | push @FreeRAMAreas, [$freeStart,$freeSize] if ($freeSize > 0); |
| 389 | } |
| 390 | |
| 391 | my $FRindex = 0; |
| 392 | my $totalRAM = 0; |
| 393 | foreach my $refUsed (@UsedRAMAreas) |
| 394 | { |
| 395 | $FRindex +=1; |
| 396 | $totalRAM += $refUsed->[1]; |
| 397 | PrintLog($PrintFunc, "RAM Usage $FRindex ".CommonUtil::Dec2Hex($refUsed->[1])." = " .GetSizeFromBytes($refUsed->[1])."\tfrom ". CommonUtil::Dec2Hex($refUsed->[0])." to ".CommonUtil::Dec2Hex($refUsed->[0]+$refUsed->[1])." ".$refUsed->[2]."\n"); |
| 398 | } |
| 399 | PrintLog($PrintFunc,"Total allocated (used) RAM: ".CommonUtil::Dec2Hex($totalRAM)." = ".GetSizeFromBytes($totalRAM)."\n\n"); |
| 400 | |
| 401 | $nRAMUsage = $totalRAM; |
| 402 | $FRindex = 0; |
| 403 | $totalRAM = 0; |
| 404 | foreach my $refUsed (@FreeRAMAreas) |
| 405 | { |
| 406 | $FRindex +=1; |
| 407 | $totalRAM += $refUsed->[1]; |
| 408 | PrintLog($PrintFunc, "RAM unused $FRindex ".CommonUtil::Dec2Hex($refUsed->[1])." = " .GetSizeFromBytes($refUsed->[1])."\tfrom ". CommonUtil::Dec2Hex($refUsed->[0])." to ".CommonUtil::Dec2Hex($refUsed->[0]+$refUsed->[1])."\n"); |
| 409 | } |
| 410 | |
| 411 | PrintLog($PrintFunc,"Total unallocated (free) RAM: ".CommonUtil::Dec2Hex($totalRAM)." = ".GetSizeFromBytes($totalRAM)."\n\n"); |
| 412 | PrintLog($PrintFunc, "RAM Usage consist of\n"); |
| 413 | PrintLog($PrintFunc, " 1) RW + ZI : ".((hex($strEndRegionEndVMA)& 0x3fffffff)- get_physical_address($nFirstERInRAMVMA))."(Bytes) \tfrom $strFirstERInRAMVMA to $strEndRegionEndVMA\n"); |
| 414 | PrintLog($PrintFunc, "Total used RAM Size (RW + ZI Data) = ". CommonUtil::Dec2Hex($nRAMUsage) . " = $nRAMUsage (Bytes) \n"); |
| 415 | PrintLog($PrintFunc, "-------------------------------------------------------------------\n"); |
| 416 | PrintLog($PrintFunc,"Top RAM Margins:\n"); |
| 417 | |
| 418 | @FreeRAMAreas =sort {$b->[1] <=> $a->[1]} @FreeRAMAreas; |
| 419 | $FRindex =1; |
| 420 | my $AP_RAM = 0; |
| 421 | |
| 422 | foreach my $refUsed (@FreeRAMAreas) |
| 423 | { |
| 424 | my $MarginStart = ($refUsed->[0]+ 0xffff) & 0xffff0000; |
| 425 | my $MarginLength = (($refUsed->[0] + $refUsed->[1]) & 0xffff0000)- $MarginStart; |
| 426 | next if($MarginLength<0x10000); |
| 427 | $AP_RAM += $MarginLength; |
| 428 | if($g_MAKEFILE_OPTIONS{PLATFORM} =~ /MT6297/) |
| 429 | { |
| 430 | my $sib_area_start = hex(LinkerOutputParser::GetLinkerSymbolAddress("SIB_AREA", LinkerSymPostfix::Base,LinkerSymPrefix::Image)); |
| 431 | my $sib_area_end = hex(LinkerOutputParser::GetLinkerSymbolAddress("SIB_AREA", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image)); |
| 432 | if((($MarginStart <= $sib_area_start) && (($MarginStart+$MarginLength) >= $sib_area_start)) || (($MarginStart <= $sib_area_end) && (($MarginStart+$MarginLength) >= $sib_area_end))) |
| 433 | { |
| 434 | PrintLog($PrintFunc, "RAM Margin $FRindex ".CommonUtil::Dec2Hex($MarginLength)." = " .GetSizeFromBytes($MarginLength)."\tfrom ". CommonUtil::Dec2Hex($MarginStart)." to ".CommonUtil::Dec2Hex($MarginStart+$MarginLength)." Used for SIB area\n"); |
| 435 | $FRindex +=1; |
| 436 | next; |
| 437 | } |
| 438 | } |
| 439 | PrintLog($PrintFunc, "RAM Margin $FRindex ".CommonUtil::Dec2Hex($MarginLength)." = " .GetSizeFromBytes($MarginLength)."\tfrom ". CommonUtil::Dec2Hex($MarginStart)." to ".CommonUtil::Dec2Hex($MarginStart+$MarginLength)."\n"); |
| 440 | $FRindex +=1; |
| 441 | |
| 442 | push @RAMMargins, [$MarginStart,$MarginLength]; |
| 443 | } |
| 444 | PrintLog($PrintFunc,"Total recycle free RAM: ".CommonUtil::Dec2Hex($AP_RAM). " = ". GetSizeFromBytes($AP_RAM)."\n\n"); |
| 445 | |
| 446 | for (my $item_count = $#RAMMargins+1; $item_count < 8; $item_count+=1) |
| 447 | { |
| 448 | push @RAMMargins, [0,0]; |
| 449 | } |
| 450 | @RAMMargins = sort {$b->[1] <=> $a->[1]} @RAMMargins; |
| 451 | splice @RAMMargins, 8; |
| 452 | if ($drdi_found == 1) |
| 453 | { |
| 454 | PrintLog($PrintFunc, "-------------------------------------------------------------------\n"); |
| 455 | PrintLog($PrintFunc, "DRDI area\n"); |
| 456 | PrintLog($PrintFunc, "Size : ".(($drdi_end& 0x0fffffff)- ($drdi_start& 0x0fffffff))." (Bytes) \tfrom ".CommonUtil::Dec2Hex($drdi_start& 0x0fffffff)." to ".CommonUtil::Dec2Hex($drdi_end& 0x0fffffff)."\n"); |
| 457 | PrintLog($PrintFunc, "Load size: ".(($drdi_load_end& 0x0fffffff)- ($drdi_load_start& 0x0fffffff))." (Bytes) \tfrom ".CommonUtil::Dec2Hex($drdi_load_start& 0x0fffffff)." to ".CommonUtil::Dec2Hex($drdi_load_end& 0x0fffffff)."\n"); |
| 458 | } |
| 459 | |
| 460 | return ($nRAMUsage, (@RAMMargins)); # add $strRAMMarin1 as return value, the 3rd return value is different than l1core |
| 461 | } |
| 462 | |
| 463 | sub GetSizeFromBytes |
| 464 | { |
| 465 | my ($given_size) = @_; |
| 466 | return sprintf("%5.1f",$given_size)."(B)" if ($given_size < 1024); |
| 467 | if (($given_size/1024) < 1024) |
| 468 | { |
| 469 | return sprintf("%5.1f",($given_size/1024))."(KB)" ; |
| 470 | } |
| 471 | return sprintf("%5.1f",($given_size/(1024*1024)))."(MB)"; |
| 472 | |
| 473 | } |
| 474 | |
| 475 | sub GetERsInRAM |
| 476 | { |
| 477 | my ($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) = @_; |
| 478 | my $ERs_aref = &LinkerOutputParser::ListAllExeRegion(1); |
| 479 | my $ERinRAM_aref = &sysInfo::FilterOutRegionInRAM($ERs_aref, \%g_MAKEFILE_OPTIONS); |
| 480 | my @regions; |
| 481 | my @sorted_regions; |
| 482 | foreach my $ER (@$ERinRAM_aref) |
| 483 | { |
| 484 | my $ER_size = hex(&LinkerOutputParser::GetExeRegionInfo($ER, Region::VMA)); |
| 485 | my $bank = $ER_size >> 28; |
| 486 | if($bank == 1 || $bank == 7) |
| 487 | { |
| 488 | $ER_size = $ER_size & 0x1FFFFFFF; |
| 489 | } |
| 490 | else |
| 491 | { |
| 492 | $ER_size = $ER_size & 0x0FFFFFFF; |
| 493 | } |
| 494 | push @regions, [$ER, $ER_size]; |
| 495 | } |
| 496 | |
| 497 | @regions = sort { $a->[1] <=> $b->[1] } @regions; |
| 498 | |
| 499 | foreach my $ER (@regions) |
| 500 | { |
| 501 | push @sorted_regions, $ER->[0]; |
| 502 | } |
| 503 | return \@sorted_regions; |
| 504 | } |
| 505 | |
| 506 | sub GetNonSharedMemoryERsInRAM |
| 507 | { |
| 508 | my ($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) = @_; |
| 509 | my $ERinRAM_aref = GetERsInRAM($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc); |
| 510 | my $ERinRAMnoShared_aref = &sysInfo::FilterOutSharedRegion($ERinRAM_aref, \%g_MAKEFILE_OPTIONS); |
| 511 | return $ERinRAMnoShared_aref; |
| 512 | } |
| 513 | |
| 514 | sub GetExpectedLoadViewSize |
| 515 | { |
| 516 | basicinfo_die("not support GetExpectedLoadViewSize"); |
| 517 | |
| 518 | my ($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) = @_; |
| 519 | my $nActualROMSize = CMD_GetLoadViewSize($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc); |
| 520 | PrintLog($PrintFunc, "ActualROMSize = ".CommonUtil::Dec2Hex($nActualROMSize)." = $nActualROMSize(Bytes)\n"); |
| 521 | my $nExpectedROMSize = &CommonUtil::GetMBAligned($nActualROMSize, 1); |
| 522 | PrintLog($PrintFunc, "ExpectedROMSize = ".CommonUtil::Dec2Hex($nExpectedROMSize)." = $nExpectedROMSize(Bytes)\n"); |
| 523 | return $nExpectedROMSize; |
| 524 | } |
| 525 | |
| 526 | sub GetExpectedROMSize |
| 527 | { |
| 528 | my ($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) = @_; |
| 529 | my $nActualROMSize = CMD_GetROMSize($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc); |
| 530 | PrintLog($PrintFunc, "ActualROMSize = ".CommonUtil::Dec2Hex($nActualROMSize)." = $nActualROMSize(Bytes)\n"); |
| 531 | my $nExpectedROMSize = $nActualROMSize; |
| 532 | #$nExpectedROMSize = 0x80000 if ($nActualROMSize < hex(0x80000)) ; |
| 533 | PrintLog($PrintFunc, "ExpectedROMSize = ".CommonUtil::Dec2Hex($nExpectedROMSize)." = $nExpectedROMSize(Bytes)\n"); |
| 534 | #PrintLog($PrintFunc, "(The space from ".CommonUtil::Dec2Hex($nActualROMSize)." to 0x80000 is reserved for l1core TCM space)\n") if ($nActualROMSize < hex(0x80000)); |
| 535 | PrintLog($PrintFunc, "-------------------------------------------------------------------\n"); |
| 536 | return $nExpectedROMSize; |
| 537 | } |
| 538 | |
| 539 | sub GetExpectedRAMSize |
| 540 | { |
| 541 | my ($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) = @_; |
| 542 | my ($nRAMUsage, @RAMMargins) = |
| 543 | CMD_GetRAMUsage($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc); |
| 544 | my $nActualRAMSize = $nRAMUsage; |
| 545 | my $i = 0; |
| 546 | PrintLog($PrintFunc, "ActualRAMSize = ".CommonUtil::Dec2Hex($nActualRAMSize)." = $nActualRAMSize(Bytes)\n"); |
| 547 | my $nExpectedRAMSize = $nRAMUsage ; #+ $nRAMMargin + $nRAMMargin1; |
| 548 | |
| 549 | foreach my $nRAMMargin (@RAMMargins) |
| 550 | { |
| 551 | $i += 1; |
| 552 | PrintLog($PrintFunc, "RAM Margin $i ".CommonUtil::Dec2Hex($nRAMMargin)." = $nRAMMargin(Bytes)\n"); |
| 553 | } |
| 554 | PrintLog($PrintFunc, "ExpectedRAMSize = ".CommonUtil::Dec2Hex($nExpectedRAMSize)." = $nExpectedRAMSize(Bytes)\n"); |
| 555 | return $nExpectedRAMSize; |
| 556 | } |
| 557 | |
| 558 | sub GetTotalRAMUsageFromLDS |
| 559 | { |
| 560 | my ($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) = @_; |
| 561 | my $strRAM_Length = LinkerOutputParser::Get_DUMMY_END_Base(); |
| 562 | return hex($strRAM_Length); |
| 563 | } |
| 564 | |
| 565 | sub CMD_GetPhysicalRAMUsage |
| 566 | { |
| 567 | my ($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, $PrintFunc) = @_; |
| 568 | my $nExepectedROMSize = GetExpectedROMSize($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, undef); |
| 569 | my $nExpectedRAMSize = GetExpectedRAMSize($MAKEFILE_PATH, $IMAGELAYOUT_PATH, $MAP_PATH, $SYM_PATH, undef); |
| 570 | my $nPRAMUsage = $nExepectedROMSize + $nExpectedRAMSize; |
| 571 | PrintLog($PrintFunc, "Total Physical RAMUsage(ROM + RAM) = ".CommonUtil::Dec2Hex($nExepectedROMSize)." + ". |
| 572 | CommonUtil::Dec2Hex($nExpectedRAMSize)." = ". CommonUtil::Dec2Hex($nPRAMUsage) ."\n"); |
| 573 | return $nPRAMUsage ; |
| 574 | } |
| 575 | |
| 576 | sub wait_for_reuse |
| 577 | #sub GetReservedSize |
| 578 | { |
| 579 | my ($IMAGELAYOUT_PATH, $SYM_PATH, $MAKEFILE_PATH) = @_; |
| 580 | my @ERinRAM; |
| 581 | my $BB_PATH = dirname($IMAGELAYOUT_PATH); |
| 582 | sysInfo::GetRAMregion($BB_PATH, $IMAGELAYOUT_PATH, \@ERinRAM, \%g_MAKEFILE_OPTIONS); |
| 583 | my $FixedER_aref = &sysInfo::FilterOutFixedRegion(\@ERinRAM, \%g_MAKEFILE_OPTIONS); |
| 584 | |
| 585 | ####################### |
| 586 | # FIX_ME, what is the reserve size? |
| 587 | ####################### |
| 588 | |
| 589 | # my $nReservedSize = 0; |
| 590 | # foreach my $ER (@$FixedER_aref) |
| 591 | # { |
| 592 | # my $strSize = sysInfo::GetRegionInfo($ER, Region::MaxSize, $IMAGELAYOUT_PATH, \%g_MAKEFILE_OPTIONS); |
| 593 | # $nReservedSize += hex($strSize); |
| 594 | # } |
| 595 | # return $nReservedSize; |
| 596 | } |
| 597 | |
| 598 | |
| 599 | sub PrintLog |
| 600 | { |
| 601 | my ($LogFunc, $strLog) = @_; |
| 602 | &{$LogFunc}($strLog) if(exists &{$LogFunc}); |
| 603 | } |
| 604 | #**************************************************************************** |
| 605 | # Subroutine: basicinfo_die |
| 606 | # Parameters: 1. string error message, 2. __FILE__ 3. __LINE__ |
| 607 | # Returns: x |
| 608 | #**************************************************************************** |
| 609 | sub basicinfo_die |
| 610 | { |
| 611 | my ($error_msg, $file, $line_no) = @_; |
| 612 | my $pack_name = undef; |
| 613 | if(!defined $file or !defined $line_no) |
| 614 | { |
| 615 | ($pack_name, $file, $line_no) = caller; |
| 616 | } |
| 617 | &CommonUtil::error_handler($error_msg, $file, $line_no, 'BasicMemInfoPcore'); |
| 618 | } |
| 619 | |
| 620 | sub get_physical_address |
| 621 | { |
| 622 | my ($address) = @_; |
| 623 | my $addr_mask = 0x0fffffff; |
| 624 | my $bank = $address>>28; |
| 625 | if (($bank == 1) || ($bank == 7)) |
| 626 | { |
| 627 | $addr_mask = 0x1fffffff; |
| 628 | } |
| 629 | return ($address & $addr_mask); |
| 630 | } |