blob: 065d6f35e1822ba91a63f45cd64e7e85852ae8f4 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001#!/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
56BEGIN { push @INC, '../', './tools/', './tools/MemoryUtility/' } # add additional library path
57
58use strict;
59use POSIX qw(floor ceil);
60use systemInfo;
61use LinkerOutputParser;
62use FileInfoParser;
63use CommonUtility;
64
65package FILEOPTION;
66use constant LIS => 1;
67use constant MAP => 2;
68use constant SYM => 3;
69use constant MAKEFILE => 4;
70use constant INFOMAKE => 5;
71
72package BasicMemInfo;
73
74#****************************************************************************
75# Constants
76#****************************************************************************
77my $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#****************************************************************************
102my $g_bParseSYM = 0;
103my $g_bParseMAP = 0;
104my $g_bParseMAKEFILE = 0;
105my %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#****************************************************************************
112sub BasicInfoQuery_verno
113{
114 return $VERNO;
115}
116
117#****************************************************************************
118# oo >>> Finished
119#****************************************************************************
120return 1;
121
122sub 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 !
159sub 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 !
198sub 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
243sub 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
277sub 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
463sub 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
475sub 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
506sub 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
514sub 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
526sub 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
539sub 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
558sub 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
565sub 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
576sub 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
599sub 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#****************************************************************************
609sub 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
620sub 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 }