| #!/usr/bin/perl | |
| # | |
| # Copyright Statement: | |
| # -------------------- | |
| # This software is protected by Copyright and the information contained | |
| # herein is confidential. The software may not be copied and the information | |
| # contained herein may not be used or disclosed except with the written | |
| # permission of MediaTek Inc. (C) 2006 | |
| # | |
| # BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES | |
| # THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") | |
| # RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON | |
| # AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, | |
| # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF | |
| # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. | |
| # NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE | |
| # SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR | |
| # SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH | |
| # THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO | |
| # NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S | |
| # SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. | |
| # | |
| # BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE | |
| # LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, | |
| # AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, | |
| # OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO | |
| # MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. | |
| # | |
| # THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE | |
| # WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF | |
| # LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND | |
| # RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER | |
| # THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). | |
| # | |
| #***************************************************************************** | |
| #* | |
| #* Filename: | |
| #* --------- | |
| #* vivaConfig.pl | |
| #* | |
| #* Project: | |
| #* -------- | |
| #* Maui_Software | |
| #* | |
| #* Description: | |
| #* ------------ | |
| #* This file implemented the VIVA auto configure process | |
| #* | |
| #* | |
| #* Author: | |
| #* ------- | |
| #* Ke-Ting Chen (mtk03141) | |
| #* | |
| #***************************************************************************** | |
| #**************************************************************************** | |
| # Included Modules | |
| #**************************************************************************** | |
| use strict; | |
| use warnings; | |
| BEGIN { push @INC, "pcore/" , '.\\pcore\\tools\\' } # add additional library path | |
| use auto_adjust_mem; #pm file name without case sensitivity | |
| use File::Copy; | |
| use File::Basename; | |
| use vivaHelper; | |
| #**************************************************************************** | |
| # History | |
| #**************************************************************************** | |
| my $VIVA_CONFIG_VERNO = " v1.03"; | |
| # v1.03: Phase in ZIMAGE_FAVOR_ROM | |
| # v1.02: Phase in BOOT_ZIMAGE | |
| # v1.01: Add AUTOCONFIG_SELF_MODIFY_SUCCESS error code support | |
| # v1.00: Phase in VIVA | |
| #**************************************************************************** | |
| # Constants | |
| #**************************************************************************** | |
| my $DEBUG = 1; | |
| # Path | |
| my $templateFolderPath = "custom\\system\\Template"; | |
| my $objectListGenFolderPath = "scat_config\\FeatureBased\\ObjListGen"; | |
| # Binary | |
| my $bootZImageBinaryName = "BOOT_ZIMAGE_ER"; | |
| my $zImageBinaryName = "ZIMAGE_ER"; | |
| my $dcmcmpBinaryName = "DYNAMIC_COMP_CODE"; | |
| my $aliceBinaryName = "ALICE"; | |
| # Normal scatter | |
| my $objectROM1ListFileName = "objectROM1.list"; | |
| my $objectBootZImageListFileName = "objectBOOT_ZIMAGE.list"; | |
| my $objectZImageListFileName = "objectZIMAGE.list"; | |
| my $objectAliceListFileName = "objectALICE.list"; | |
| # Dummy scatter | |
| my $objectROM1DummyListFileName = "objectROM1_dummy.list"; | |
| my $objectBootZImageDummyListFileName = "objectBOOT_ZIMAGE_dummy.list"; | |
| my $objectZImageDummyListFileName = "objectZIMAGE_dummy.list"; | |
| my $objectAliceDummyListFileName = "objectALICE_dummy.list"; | |
| my $objectAliceForbidDummyListFileName = "objectALICE_FORBID_dummy.list"; | |
| # Alignment | |
| my $bootZImageSizeAlignment = 256; | |
| my $zImageSizeAlignment = 256; | |
| my $dcmcmpSizeAlignment = 256; | |
| my $aliceSizeAlignment = 256; | |
| my $veneerReserveRatio = 0.05; | |
| my $smallestSplitableRAMSize = 10240; | |
| my $separateLine = "============================================================="; | |
| use constant CONFIG_FAIL_INSUFFICIENT_RAM => 0; | |
| use constant CONFIG_FAIL_ZIMAGE_OVERFLOW => 1; | |
| use constant CONFIG_FAIL_FEATURE_NOT_ENABLED => 2; | |
| use constant CONFIG_FAIL_NO_CONFIG_CHANGED => 3; | |
| use constant CONFIG_FAIL_INSUFFICIENT_FLASH_SIZE => 4; | |
| use constant CONFIG_FAIL_INSUFFICIENT_RAM_FOR_BOOT_ZIMAGE => 5; | |
| #**************************************************************************** | |
| # Arguments | |
| #**************************************************************************** | |
| &vivaHelper::ErrorHandler("Insufficient arguments!", __LINE__, __FILE__) | |
| unless scalar(@ARGV) == 7; | |
| my $lisFilePath = $ARGV[0]; | |
| my $dummyBinaryFolder = $ARGV[1]; | |
| my $customFolder = $ARGV[2]; | |
| my $makefilePath = $ARGV[3]; | |
| my $flashConfigFilePath = $ARGV[4]; | |
| my $intermediateFilePath = $ARGV[5]; | |
| my $aapmcLogFilePath = $ARGV[6]; | |
| # To align error message file name format | |
| $lisFilePath =~ s/^.\\|^\\//; | |
| $dummyBinaryFolder =~ s/^.\\|^\\//; | |
| $customFolder =~ s/^.\\|^\\//; | |
| $makefilePath =~ s/^.\\|^\\//; | |
| $flashConfigFilePath =~ s/^.\\|^\\//; | |
| $intermediateFilePath =~ s/^.\\|^\\//; | |
| $aapmcLogFilePath =~ s/^.\\|^\\//; | |
| # Print out the arguments | |
| printLog($separateLine); | |
| printLog("Arguments:"); | |
| printLog("LIS File: $lisFilePath"); | |
| printLog("Dummy Binary Folder: $dummyBinaryFolder"); | |
| printLog("Custom Folder: $customFolder"); | |
| printLog("Makefile: $makefilePath"); | |
| printLog("Flash Config File: $flashConfigFilePath"); | |
| printLog("Intermediate File: $intermediateFilePath"); | |
| printLog(""); | |
| #**************************************************************************** | |
| # Variables | |
| #**************************************************************************** | |
| my $objectListFolder = "$customFolder\\$objectListGenFolderPath"; | |
| my $featureConfigFilePath = "$customFolder\\custom_FeatureConfig.h"; | |
| # Binary | |
| my $bootZImageBinary = "$dummyBinaryFolder\\$bootZImageBinaryName"; | |
| my $zImageBinary = "$dummyBinaryFolder\\$zImageBinaryName"; | |
| my $dcmcmpBinary = "$dummyBinaryFolder\\$dcmcmpBinaryName"; | |
| my $aliceBinary = "$dummyBinaryFolder\\$aliceBinaryName"; | |
| # Normal scatter | |
| my $objectROM1ListFile = "$objectListFolder\\$objectROM1ListFileName"; | |
| my $objectBootZImageListFile = "$objectListFolder\\$objectBootZImageListFileName"; | |
| my $objectZImageListFile = "$objectListFolder\\$objectZImageListFileName"; | |
| my $objectAliceListFile = "$objectListFolder\\$objectAliceListFileName"; | |
| # Dummy scatter | |
| my $objectROM1DummyListFile = "$objectListFolder\\$objectROM1DummyListFileName"; | |
| my $objectBootZImageDummyListFile = "$objectListFolder\\$objectBootZImageDummyListFileName"; | |
| my $objectZImageDummyListFile = "$objectListFolder\\$objectZImageDummyListFileName"; | |
| my $objectAliceDummyListFile = "$objectListFolder\\$objectAliceDummyListFileName"; | |
| my $objectAliceForbidDummyListFile = "$objectListFolder\\$objectAliceForbidDummyListFileName"; | |
| #my $totalLISROMSize; | |
| my %featureConfig; | |
| # Feature switchs | |
| my $bootZImageEnabled = 0; | |
| my $zImageEnabled = 0; | |
| my $dcmcmpEnabled = 0; | |
| my $aliceEnabled = 0; | |
| my $mbaEnabled = 0; | |
| my $zImageFavorROM = 0; | |
| # Output configurations | |
| my $bootZImageMaxCompressedSize = 0; | |
| my $zImageMaxCompressedSize = 0; | |
| my $dcmcmpMaxCompressedSize = 0; | |
| my $dcmcmpUsedROM = 0; | |
| my $dcmcmpUsedRAM = 0; | |
| my $aliceMaxCompressedSize = 0; | |
| # Output object lists | |
| my @rom1List; | |
| my @bootZImageList; | |
| my @zImageList; | |
| my @aliceList; | |
| # Configure changed | |
| my $configChanged = 0; | |
| my $objectListChanged = 0; | |
| #**************************************************************************** | |
| # Initialize | |
| #**************************************************************************** | |
| printLog($separateLine); | |
| printLog("[Start initializing stage]"); | |
| # Initialize VIVA helper for makefile parsing and LIS parsing | |
| &vivaHelper::Initialize(vivaHelper::CONFIG_TYPE, $makefilePath, $lisFilePath); | |
| # Check the feature set | |
| { | |
| printLog("Checking feature set..."); | |
| my $bootZImageOption = &vivaHelper::GetMakefileOption("BOOT_ZIMAGE_SUPPORT"); | |
| my $zImageOption = &vivaHelper::GetMakefileOption("ZIMAGE_SUPPORT"); | |
| my $dcmcmpOption = &vivaHelper::GetMakefileOption("DCM_COMPRESSION_SUPPORT"); | |
| my $aliceOption = &vivaHelper::GetMakefileOption("ALICE_SUPPORT"); | |
| my $mbaOption = &vivaHelper::GetMakefileOption("MULTIPLE_BINARY_FILES"); | |
| my $zImageFavorROMOption = &vivaHelper::GetMakefileOption("ZIMAGE_FAVOR_ROM"); | |
| if (defined $bootZImageOption and $bootZImageOption eq "TRUE") | |
| { | |
| $bootZImageEnabled = 1; | |
| debugLog("BOOT_ZIMAGE is enabled"); | |
| } | |
| if (defined $zImageOption and $zImageOption eq "TRUE") | |
| { | |
| $zImageEnabled = 1; | |
| debugLog("ZIMAGE is enabled"); | |
| } | |
| if (defined $dcmcmpOption and $dcmcmpOption eq "TRUE") | |
| { | |
| $dcmcmpEnabled = 1; | |
| debugLog("DCM with Compression is enabled"); | |
| } | |
| if (defined $aliceOption and $aliceOption eq "TRUE") | |
| { | |
| $aliceEnabled = 1; | |
| debugLog("ALICE is enabled"); | |
| } | |
| if (defined $zImageFavorROMOption and $zImageFavorROMOption eq "TRUE") | |
| { | |
| $zImageFavorROM = 1; | |
| debugLog("ZIMAGE_FAVOR_ROM is enabled"); | |
| } | |
| if (defined $mbaOption and $mbaOption eq "TRUE") | |
| { | |
| $mbaEnabled = 1; | |
| debugLog("MBA is enabled"); | |
| } | |
| &configFail(CONFIG_FAIL_FEATURE_NOT_ENABLED) | |
| unless $zImageEnabled or $bootZImageEnabled or $aliceEnabled or $dcmcmpEnabled; | |
| } | |
| # Parse feature config file | |
| printLog("Parsing feature configuration file"); | |
| &parseFeatureConfigFile(\%featureConfig); | |
| printLog("[End initializing stage]\n"); | |
| #**************************************************************************** | |
| # Configure | |
| #**************************************************************************** | |
| printLog($separateLine); | |
| printLog("[Start configuration stage]"); | |
| # Note DCMCMP should be configured before BOOT_ZIMAGE, ZIMAGE, and ALICE | |
| if($dcmcmpEnabled) | |
| { | |
| $configChanged = &configDcmcmp() || $configChanged; | |
| } | |
| printLog(""); | |
| if ($bootZImageEnabled and $zImageEnabled and $aliceEnabled) | |
| { | |
| my ($configChangedTemp, $objectListChangedTemp); | |
| if ($zImageFavorROM) | |
| { | |
| ($configChangedTemp, $objectListChangedTemp) = configBootZImage_ZImage_Alice_FavorROM(); | |
| } | |
| else | |
| { | |
| ($configChangedTemp, $objectListChangedTemp) = configBootZImage_ZImage_Alice(); | |
| } | |
| $configChanged = $configChangedTemp || $configChanged; | |
| $objectListChanged = $objectListChangedTemp || $objectListChanged; | |
| } | |
| elsif ($zImageEnabled and $aliceEnabled) | |
| { | |
| my ($configChangedTemp, $objectListChangedTemp); | |
| if ($zImageFavorROM) | |
| { | |
| ($configChangedTemp, $objectListChangedTemp) = configZImage_Alice_FavorROM(); | |
| } | |
| else | |
| { | |
| ($configChangedTemp, $objectListChangedTemp) = configZImage_Alice(); | |
| } | |
| $configChanged = $configChangedTemp || $configChanged; | |
| $objectListChanged = $objectListChangedTemp || $objectListChanged; | |
| } | |
| elsif ($zImageEnabled) | |
| { | |
| my ($configChangedTemp, $objectListChangedTemp); | |
| if ($zImageFavorROM) | |
| { | |
| ($configChangedTemp, $objectListChangedTemp) = configZImage_FavorROM(); | |
| } | |
| else | |
| { | |
| ($configChangedTemp, $objectListChangedTemp) = configZImage(); | |
| } | |
| $configChanged = $configChangedTemp || $configChanged; | |
| $objectListChanged = $objectListChangedTemp || $objectListChanged; | |
| } | |
| elsif ($aliceEnabled) | |
| { | |
| $configChanged = &configAlice() || $configChanged; | |
| } | |
| else | |
| { | |
| #&configFail(CONFIG_FAIL_FEATURE_NOT_ENABLED); | |
| } | |
| printLog("[End configuration stage]\n"); | |
| #**************************************************************************** | |
| # Output | |
| #**************************************************************************** | |
| printLog($separateLine); | |
| printLog("[Start output stage]"); | |
| my $outputMessage; | |
| my %changeList; | |
| my $result; | |
| # Get original settings | |
| { | |
| $outputMessage = "[Before auto adjustment]\n"; | |
| if ($zImageEnabled) | |
| { | |
| my $zImageMaxCompressedSizeOriginal = &vivaHelper::DecToHex($featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"}); | |
| $outputMessage .= "CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE=$zImageMaxCompressedSizeOriginal\n"; | |
| } | |
| if ($bootZImageEnabled) | |
| { | |
| my $bootZImageMaxCompressedSizeOriginal = &vivaHelper::DecToHex($featureConfig{"CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE"}); | |
| $outputMessage .= "CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE=$bootZImageMaxCompressedSizeOriginal\n"; | |
| } | |
| if ($dcmcmpEnabled) | |
| { | |
| my $dcmcmpMaxCompressedSizeOriginal = &vivaHelper::DecToHex($featureConfig{"CONFIG_DCMP_MAX_COMPRESSED_SIZE"}); | |
| $outputMessage .= "CONFIG_DCMP_MAX_COMPRESSED_SIZE=$dcmcmpMaxCompressedSizeOriginal\n"; | |
| } | |
| if ($aliceEnabled) | |
| { | |
| my $aliceMaxCompressedSizeOriginal = &vivaHelper::DecToHex($featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"}); | |
| $outputMessage .= "CONFIG_ALICE_MAX_COMPRESSED_SIZE=$aliceMaxCompressedSizeOriginal\n"; | |
| } | |
| } | |
| # Get new settings and change list | |
| { | |
| $outputMessage .= "[After auto adjustment]\n"; | |
| if ($zImageEnabled) | |
| { | |
| my $zImageMaxCompressedSizeHex = &vivaHelper::DecToHex($zImageMaxCompressedSize); | |
| $outputMessage .= "CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE=$zImageMaxCompressedSizeHex\n"; | |
| $changeList{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} = $zImageMaxCompressedSizeHex; | |
| } | |
| if ($bootZImageEnabled) | |
| { | |
| my $bootZImageMaxCompressedSizeHex = &vivaHelper::DecToHex($bootZImageMaxCompressedSize); | |
| $outputMessage .= "CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE=$bootZImageMaxCompressedSizeHex\n"; | |
| $changeList{"CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE"} = $bootZImageMaxCompressedSizeHex; | |
| } | |
| if ($dcmcmpEnabled) | |
| { | |
| my $dcmcmpMaxCompressedSizeHex = &vivaHelper::DecToHex($dcmcmpMaxCompressedSize); | |
| $outputMessage .= "CONFIG_DCMP_MAX_COMPRESSED_SIZE=$dcmcmpMaxCompressedSizeHex\n"; | |
| $changeList{"CONFIG_DCMP_MAX_COMPRESSED_SIZE"} = $dcmcmpMaxCompressedSizeHex; | |
| } | |
| if ($aliceEnabled) | |
| { | |
| my $aliceMaxCompressedSizeHex = &vivaHelper::DecToHex($aliceMaxCompressedSize); | |
| $outputMessage .= "CONFIG_ALICE_MAX_COMPRESSED_SIZE=$aliceMaxCompressedSizeHex\n"; | |
| $changeList{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} = $aliceMaxCompressedSizeHex; | |
| } | |
| } | |
| printLog("Configuration results:"); | |
| printLog($outputMessage); | |
| if (&isAutoConfigEnable()) | |
| { | |
| printLog("Auto adjusting..."); | |
| if ($configChanged) | |
| { | |
| $result = &AAPMCLogParser::Open($aapmcLogFilePath); | |
| if (ERR::AAPMCLOG_SUCCESS != $result) | |
| { | |
| printLog("Cannot open AAPMC log parser!"); | |
| return $result; | |
| } | |
| else | |
| { | |
| my $p4InfoRef = &AUTO_ADJUST::CreateP4InfoTemplate("mtk03141", "", "VIVA auto config", $outputMessage); | |
| my $aapmcResult; | |
| $result = &AAPMCLogParser::AddOneChangeRecord($featureConfigFilePath, \%changeList, \%$p4InfoRef); | |
| if (ERR::AAPMCLOG_SUCCESS == $result) | |
| { | |
| printLog("Modification succeeded!"); | |
| &printIntermediateFile($outputMessage); | |
| } | |
| elsif (ERR::ERR_MODIFYDUPLICATED == $result) | |
| { | |
| printLog("Modification duplicated!"); | |
| } | |
| else | |
| { | |
| printLog("Modification failed!"); | |
| } | |
| $aapmcResult = &AAPMCLogParser::Close($aapmcLogFilePath); | |
| if (ERR::AAPMCLOG_SUCCESS != $aapmcResult) | |
| { | |
| printLog("Cannot close AAPMC log parser!"); | |
| return $aapmcResult; | |
| } | |
| } | |
| } | |
| else | |
| { | |
| # Only object lists are changed | |
| $result = ERR::AUTOCONFIG_SELF_MODIFY_SUCCESS; | |
| &printIntermediateFile($outputMessage); | |
| } | |
| if ($objectListChanged) | |
| { | |
| printLog("Adjusting object list"); | |
| debugLog("Adjust ROM1 object list"); | |
| &backupFile($objectROM1ListFile); | |
| &vivaHelper::SortObjectList(\@rom1List); | |
| &vivaHelper::OutputObjectListToFile($objectROM1ListFile, \@rom1List); | |
| if ($bootZImageEnabled) | |
| { | |
| debugLog("Adjust BOOT_ZIMAGE object list"); | |
| &backupFile($objectBootZImageListFile); | |
| &vivaHelper::SortObjectList(\@bootZImageList); | |
| &vivaHelper::OutputObjectListToFile($objectBootZImageListFile, \@bootZImageList); | |
| } | |
| if ($zImageEnabled) | |
| { | |
| debugLog("Adjust ZIMAGE object list"); | |
| &backupFile($objectZImageListFile); | |
| &vivaHelper::SortObjectList(\@zImageList); | |
| &vivaHelper::OutputObjectListToFile($objectZImageListFile, \@zImageList); | |
| } | |
| if ($aliceEnabled) | |
| { | |
| debugLog("Adjust ALICE object list"); | |
| &backupFile($objectAliceListFile); | |
| &vivaHelper::SortObjectList(\@aliceList); | |
| &vivaHelper::OutputObjectListToFile($objectAliceListFile, \@aliceList); | |
| } | |
| printLog("Adjusting object list done"); | |
| } | |
| } | |
| else | |
| { | |
| &printIntermediateFile($outputMessage); | |
| $result = ERR::NO_MODIFY; | |
| } | |
| printLog("Result: $result"); | |
| printLog("[End output stage]"); | |
| exit $result; | |
| #**************************************************************************** | |
| # subroutine: configDcmcmp | |
| # description: Perform the DCMCMP configuration | |
| # input: None | |
| # output: DCMCMP max compressed size, changed, | |
| # DCMCMP used ROM size, DCMCMP used RAM size | |
| #**************************************************************************** | |
| sub configDcmcmp | |
| { | |
| printLog("Configuring DCMCMP..."); | |
| # Assumption: same category should be put together | |
| my @dcmcmpRegionInfo = ( | |
| # feature name category load region on value | |
| #['BT_AUDIO_VIA_SCO', 'SharePool1', 'DYNAMIC_COMP_RESAMPLE', 'TRUE'], | |
| ['BT_A2DP_PROFILE', 'SharePool1', 'DYNAMIC_COMP_SBC', 'TRUE'], | |
| ['BES_LOUDNESS_SUPPORT', 'SharePool2', 'DYNAMIC_COMP_BESLOUDNESS', 'TRUE'], | |
| ['MP4_DECODE', 'SharePool3', 'DYNAMIC_COMP_MP4DEC', 'SP'], | |
| ['H264_DECODE', 'SharePool3', 'DYNAMIC_COMP_H264DEC', 'TRUE'], | |
| ['MP4_ENCODE', 'SharePool3', 'DYNAMIC_COMP_MP4ENC', 'TRUE'], | |
| ['MP4_DECODE_PROFILE', 'SharePool3', 'DYNAMIC_COMP_MP4ASPDEC', 'ASP'], | |
| ['VP8_DECODE', 'SharePool3', 'DYNAMIC_COMP_VP8DEC', 'TRUE'], | |
| ['VIDEO_PLAYER_RECORDER_W_DCM', 'SharePool4', 'DYNAMIC_COMP_VEENC', 'TRUE'], | |
| ['VIDEO_PLAYER_RECORDER_W_DCM', 'SharePool4', 'DYNAMIC_COMP_VEDEC', 'TRUE'], | |
| ['DAF_DECODE', 'SharePool5', 'DYNAMIC_COMP_DAF', 'TRUE'], | |
| ['MELODY_VER', 'SharePool5', 'DYNAMIC_COMP_WAVETABLE', 'DSP_WT_SYN'], | |
| ); | |
| use constant FEATURE_NAME => 0; | |
| use constant CATEGORY => 1; | |
| use constant LOAD_REGION => 2; | |
| use constant ON_VALUE => 3; | |
| my %regionInfo; | |
| my $currentCategory = $dcmcmpRegionInfo[0][CATEGORY]; | |
| my $categoryMaxRAM = 0; | |
| # Get the actual size | |
| foreach my $region (@dcmcmpRegionInfo) | |
| { | |
| my $option = &vivaHelper::GetMakefileOption($region->[FEATURE_NAME]); | |
| if (defined $option and $option eq $region->[ON_VALUE]) | |
| { | |
| my %regionSize; | |
| &vivaHelper::GetLISLoadRegionInfo($region->[LOAD_REGION], \%regionInfo); | |
| $dcmcmpUsedROM += $regionInfo{"max_size"}; | |
| debugLog("$region->[FEATURE_NAME], $region->[CATEGORY], $region->[LOAD_REGION], $region->[ON_VALUE], $regionInfo{max_size}"); | |
| if ($currentCategory ne $region->[CATEGORY]) | |
| { | |
| $dcmcmpUsedRAM += $categoryMaxRAM; | |
| $categoryMaxRAM = $regionInfo{"max_size"}; | |
| $currentCategory = $region->[CATEGORY]; | |
| } | |
| elsif ($categoryMaxRAM < $regionInfo{"max_size"}) | |
| { | |
| $categoryMaxRAM = $regionInfo{"max_size"}; | |
| } | |
| } | |
| } | |
| # Last category used RAM | |
| $dcmcmpUsedRAM += $categoryMaxRAM; | |
| # Get the compressed size | |
| $dcmcmpMaxCompressedSize = -s $dcmcmpBinary or | |
| &vivaHelper::ErrorHandler("Cannot get file size $dcmcmpBinary: $!", __FILE__, __LINE__); | |
| $dcmcmpMaxCompressedSize = | |
| &vivaHelper::RoundUpToAlignment($dcmcmpMaxCompressedSize, $dcmcmpSizeAlignment); | |
| debugLog("Used ROM: $dcmcmpUsedROM"); | |
| debugLog("Used RAM: $dcmcmpUsedRAM"); | |
| printLog("DCMCMP Max Compressed Size: ".vivaHelper::DecToHex($dcmcmpMaxCompressedSize)); | |
| # Check whether the cofiguration is changed | |
| if ($featureConfig{"CONFIG_DCMP_MAX_COMPRESSED_SIZE"} == $dcmcmpMaxCompressedSize) | |
| { | |
| debugLog("DCMCMP config not changed"); | |
| return 0; | |
| } | |
| else | |
| { | |
| debugLog("DCMCMP config changed"); | |
| return 1; | |
| } | |
| } | |
| sub configBootZImage_ZImage_Alice | |
| { | |
| printLog("Configuring BOOT_ZIMAGE, ZIMAGE, and ALICE..."); | |
| my $rom1RegionSize; | |
| my $bootZImageRegionSize; | |
| my $zImageRegionSize; | |
| my $aliceRegionSize; | |
| my @bootZImageDummyList; | |
| my @aliceForbidDummyList; | |
| my @anyCodeDummyList; | |
| my @anyDataDummyList; | |
| my $bootZImageDummyRegionPadding; | |
| my $aliceForbidDummyRegionPadding; | |
| my $anyCodeDummyRegionPadding; | |
| my $anyDataDummyRegionPadding; | |
| my $rom1DummyRegionSize; | |
| my $bootZImageDummyRegionSize; | |
| my $zImageDummyRegionSize; | |
| my $aliceDummyRegionSize; | |
| my $aliceForbidDummyRegionSize; | |
| my $anyCodeDummyRegionSize; | |
| my $anyDataDummyRegionSize; | |
| my $freeRAMSize; | |
| my $availableRAM; | |
| my %variables = | |
| ( | |
| '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM], | |
| '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio], | |
| '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize], | |
| '$bootZImageRegionSize' => ["BOOT_ZIMAGE Region Size", \$bootZImageRegionSize], | |
| '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize], | |
| '$aliceRegionSize' => ["ALICE Region Size", \$aliceRegionSize], | |
| '$bootZImageDummyRegionPadding' => ["BOOT_ZIMAGE Dummy Region Padding", \$bootZImageDummyRegionPadding], | |
| '$aliceForbidDummyRegionPadding' => ["ALICE_FORBID Dummy Region Padding", \$aliceForbidDummyRegionPadding], | |
| '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding], | |
| '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding], | |
| '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize], | |
| '$bootZImageDummyRegionSize' => ["BOOT_ZIMAGE Dummy Region Size", \$bootZImageDummyRegionSize], | |
| '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize], | |
| '$aliceDummyRegionSize' => ["ALICE Dummy Region Size", \$aliceDummyRegionSize], | |
| '$aliceForbidDummyRegionSize' => ["ALICE_FORBID Dummy Region Size", \$aliceForbidDummyRegionSize], | |
| '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize], | |
| '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize], | |
| '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize], | |
| '$availableRAM' => ["Available RAM", \$availableRAM], | |
| ); | |
| my %objectLists = | |
| ( | |
| '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',], | |
| '@bootZImageList' => ["BOOT_ZIMAGE List", \@bootZImageList, '$bootZImageRegionSize',], | |
| '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',], | |
| '@aliceList' => ["ALICE List", \@aliceList, '$aliceRegionSize',], | |
| '@bootZImageDummyList' => ["BOOT_ZIMAGE Dummy List", \@bootZImageDummyList, '$bootZImageDummyRegionSize', '$bootZImageDummyRegionPadding'], | |
| '@aliceForbidDummyList' => ["ALICE_FORBID Dummy List", \@aliceForbidDummyList, '$aliceForbidDummyRegionSize', '$aliceForbidDummyRegionPadding'], | |
| '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'], | |
| '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding'] | |
| ); | |
| printLog("Get dummy scatter object lists"); | |
| { | |
| # Basic | |
| &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1"); | |
| &_inputObjectListFromFile($objectBootZImageDummyListFile, \@bootZImageList, "BOOT_ZIMAGE"); | |
| &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE"); | |
| &_inputObjectListFromFile($objectAliceDummyListFile, \@aliceList, "ALICE"); | |
| # To be added | |
| $bootZImageDummyRegionPadding = &_inputObjectListFromExecutionRegion("BOOT_ZIMAGE_ER", \@bootZImageDummyList, "+RO", "BOOT_ZIMAGE list"); | |
| $aliceForbidDummyRegionPadding = &_inputObjectListFromExecutionRegion("ALICE_FORBID", \@aliceForbidDummyList, "+RO", "ALICE_FORBID list"); | |
| $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list"); | |
| $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list"); | |
| } | |
| printLog("Get size information"); | |
| { | |
| $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size"); | |
| $bootZImageDummyRegionSize = &_getExecutionRegionInfo("BOOT_ZIMAGE_ER", "actual_size"); | |
| $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size"); | |
| $aliceDummyRegionSize = &_getExecutionRegionInfo("ALICE", "actual_size"); | |
| $aliceForbidDummyRegionSize = &_getExecutionRegionInfo("ALICE_FORBID", "actual_size"); | |
| $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size"); | |
| $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size"); | |
| $rom1RegionSize = $rom1DummyRegionSize; | |
| $bootZImageRegionSize = $bootZImageDummyRegionSize; | |
| $zImageRegionSize = $zImageDummyRegionSize; | |
| $aliceRegionSize = $aliceDummyRegionSize; | |
| $freeRAMSize = &getFreeRAMSize(); | |
| } | |
| # Configure | |
| { | |
| printLog("Compute Available RAM"); | |
| &_evaluateAssignment('$availableRAM = ($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio)', \%variables); | |
| $availableRAM = int($availableRAM); | |
| if ($availableRAM < 0) | |
| { | |
| &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM); | |
| } | |
| elsif ($availableRAM < $anyDataDummyRegionSize + $aliceForbidDummyRegionSize) | |
| { | |
| &configFail(CONFIG_FAIL_INSUFFICIENT_RAM_FOR_BOOT_ZIMAGE, $anyDataDummyRegionSize + $aliceForbidDummyRegionSize - $availableRAM); | |
| } | |
| # When BOOT_ZIMAGE enabled, all ALICE_FORBID and ANY_DATA list should be in ZIMAGE | |
| printLog("Push ALICE_FORBID List and ANY_DATA List to ZIMAGE"); | |
| { | |
| &_pushToObjectList('@zImageList', '@aliceForbidDummyList', \%variables, \%objectLists); | |
| &_pushToObjectList('@zImageList', '@anyDataDummyList', \%variables, \%objectLists); | |
| &_evaluateAssignment('$availableRAM = $availableRAM - ($aliceForbidDummyRegionSize + $anyDataDummyRegionSize)', \%variables); | |
| } | |
| # The rest RAM size is then used by BOOT_ZIMAGE | |
| printLog("Push BOOT_ZIMAGE"); | |
| if ($availableRAM >= $bootZImageDummyRegionSize) | |
| { | |
| debugLog("Available RAM >= BOOT_ZIMAGE_ER size"); | |
| # All BOOT_ZIMAGE region can be put in RAM | |
| # No change of BOOT_ZIMAGE object list | |
| debugLog("BOOT_ZIMAGE list = BOOT_ZIMAGE dummy list"); | |
| debugLog("BOOT_ZIMAGE region size = BOOT_ZIMAGE dummy size = $bootZImageDummyRegionSize"); | |
| &_evaluateAssignment('$availableRAM = $availableRAM - $bootZImageDummyRegionSize', \%variables); | |
| } | |
| else | |
| { | |
| debugLog("Available RAM < BOOT_ZIMAGE_ER size"); | |
| # Should split BOOT_ZIMAGE dummy list | |
| &vivaHelper::ChangeObjectListAttributeListByObjectList(\@bootZImageDummyList, \@bootZImageList); | |
| @bootZImageList = (); | |
| $bootZImageRegionSize = 0; | |
| &_splitObjectListAndPush('@bootZImageDummyList', '@bootZImageList', '@rom1List', | |
| '$availableRAM', \%variables, \%objectLists); | |
| if (0 == scalar(@bootZImageList)) | |
| { | |
| &configFail(CONFIG_FAIL_INSUFFICIENT_RAM_FOR_BOOT_ZIMAGE, $bootZImageDummyList[-1]->{"size"}); | |
| } | |
| $availableRAM = 0; | |
| debugLog("Available RAM = 0"); | |
| } | |
| # Finally, the rest RAM is used by ZIMAGE for ANY_CODE | |
| printLog("Push ANY_CODE to ZIMAGE and ALICE"); | |
| { | |
| &_splitObjectListAndPushByAvailableRAM('@anyCodeDummyList', '@zImageList', '@aliceList', | |
| \%variables, \%objectLists); | |
| } | |
| printLog("Compute the Max Compressed Size"); | |
| { | |
| $bootZImageMaxCompressedSize = &_getRegionMaxCompressedSize("BOOT_ZIMAGE", $bootZImageRegionSize, $bootZImageDummyRegionSize, $bootZImageBinary); | |
| $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary); | |
| $aliceMaxCompressedSize = &_getRegionMaxCompressedSize("ALICE", $aliceRegionSize, $aliceDummyRegionSize, $aliceBinary); | |
| } | |
| $bootZImageMaxCompressedSize = | |
| &vivaHelper::RoundUpToAlignment($bootZImageMaxCompressedSize, $bootZImageSizeAlignment); | |
| $zImageMaxCompressedSize = | |
| &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment); | |
| $aliceMaxCompressedSize = | |
| &vivaHelper::RoundUpToAlignment($aliceMaxCompressedSize, $aliceSizeAlignment); | |
| printLog("BOOT_ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($bootZImageMaxCompressedSize)); | |
| printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize)); | |
| printLog("ALICE Max Compressed Size: ".vivaHelper::DecToHex($aliceMaxCompressedSize)); | |
| } | |
| # Check whether the configurations are changed | |
| { | |
| if ($featureConfig{"CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE"} == $bootZImageMaxCompressedSize and | |
| $featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize and | |
| $featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} == $aliceMaxCompressedSize) | |
| { | |
| debugLog("Config not changed"); | |
| $configChanged = 0; | |
| } | |
| else | |
| { | |
| debugLog("Config changed"); | |
| $configChanged = 1; | |
| } | |
| if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or | |
| &_isObjectListChanged($objectBootZImageListFile, \@bootZImageList) or | |
| &_isObjectListChanged($objectZImageListFile, \@zImageList) or | |
| &_isObjectListChanged($objectAliceListFile, \@aliceList)) | |
| { | |
| debugLog("Object list changed"); | |
| $objectListChanged = 1; | |
| } | |
| else | |
| { | |
| debugLog("Object list not changed"); | |
| $objectListChanged = 0; | |
| } | |
| } | |
| return ($configChanged, $objectListChanged); | |
| } | |
| sub configZImage_Alice | |
| { | |
| printLog("Configuring ZIMAGE and ALICE..."); | |
| my $rom1RegionSize; | |
| my $zImageRegionSize; | |
| my $aliceRegionSize; | |
| my @aliceForbidDummyList; | |
| my @anyCodeDummyList; | |
| my @anyDataDummyList; | |
| my $aliceForbidDummyRegionPadding; | |
| my $anyCodeDummyRegionPadding; | |
| my $anyDataDummyRegionPadding; | |
| my $rom1DummyRegionSize; | |
| my $zImageDummyRegionSize; | |
| my $aliceDummyRegionSize; | |
| my $aliceForbidDummyRegionSize; | |
| my $anyCodeDummyRegionSize; | |
| my $anyDataDummyRegionSize; | |
| my $freeRAMSize; | |
| my $availableRAM; | |
| my %variables = | |
| ( | |
| '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM], | |
| '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio], | |
| '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize], | |
| '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize], | |
| '$aliceRegionSize' => ["ALICE Region Size", \$aliceRegionSize], | |
| '$aliceForbidDummyRegionPadding' => ["ALICE_FORBID Dummy Region Padding", \$aliceForbidDummyRegionPadding], | |
| '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding], | |
| '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding], | |
| '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize], | |
| '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize], | |
| '$aliceDummyRegionSize' => ["ALICE Dummy Region Size", \$aliceDummyRegionSize], | |
| '$aliceForbidDummyRegionSize' => ["ALICE_FORBID Dummy Region Size", \$aliceForbidDummyRegionSize], | |
| '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize], | |
| '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize], | |
| '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize], | |
| '$availableRAM' => ["Available RAM", \$availableRAM], | |
| ); | |
| my %objectLists = | |
| ( | |
| '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',], | |
| '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',], | |
| '@aliceList' => ["ALICE List", \@aliceList, '$aliceRegionSize',], | |
| '@aliceForbidDummyList' => ["ALICE_FORBID Dummy List", \@aliceForbidDummyList, '$aliceForbidDummyRegionSize', '$aliceForbidDummyRegionPadding'], | |
| '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'], | |
| '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding'] | |
| ); | |
| printLog("Get dummy scatter object lists"); | |
| { | |
| # Basic | |
| &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1"); | |
| &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE"); | |
| &_inputObjectListFromFile($objectAliceDummyListFile, \@aliceList, "ALICE"); | |
| # To be added | |
| $aliceForbidDummyRegionPadding = &_inputObjectListFromExecutionRegion("ALICE_FORBID", \@aliceForbidDummyList, "+RO", "ALICE_FORBID list"); | |
| $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list"); | |
| $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list"); | |
| } | |
| printLog("Get size information"); | |
| { | |
| $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size"); | |
| $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size"); | |
| $aliceDummyRegionSize = &_getExecutionRegionInfo("ALICE", "actual_size"); | |
| $aliceForbidDummyRegionSize = &_getExecutionRegionInfo("ALICE_FORBID", "actual_size"); | |
| $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size"); | |
| $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size"); | |
| $rom1RegionSize = $rom1DummyRegionSize; | |
| $zImageRegionSize = $zImageDummyRegionSize; | |
| $aliceRegionSize = $aliceDummyRegionSize; | |
| $freeRAMSize = &getFreeRAMSize(); | |
| } | |
| # Configure | |
| { | |
| printLog("Compute Available RAM"); | |
| &_evaluateAssignment('$availableRAM = ($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio)', \%variables); | |
| $availableRAM = int($availableRAM); | |
| if ($availableRAM < 0) | |
| { | |
| &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM); | |
| } | |
| # The available RAM is first used to compress ALICE_FORBID list | |
| printLog("Push ALICE_FORBID List to ZIMAGE and ROM1"); | |
| { | |
| &_splitObjectListAndPushByAvailableRAM('@aliceForbidDummyList', '@zImageList', '@rom1List', | |
| \%variables, \%objectLists); | |
| } | |
| # The rest RAM size is then used by ANY_DATA | |
| printLog("Push ANY_DATA to ZIMAGE and ROM1"); | |
| { | |
| &_splitObjectListAndPushByAvailableRAM('@anyDataDummyList', '@zImageList', '@rom1List', | |
| \%variables, \%objectLists); | |
| } | |
| # Finally, the rest RAM is used by ZIMAGE for ANY_CODE | |
| printLog("Push ANY_CODE to ZIMAGE or ALICE"); | |
| { | |
| &_splitObjectListAndPushByAvailableRAM('@anyCodeDummyList', '@zImageList', '@aliceList', | |
| \%variables, \%objectLists); | |
| } | |
| printLog("Compute the Max Compressed Size"); | |
| { | |
| $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary); | |
| $aliceMaxCompressedSize = &_getRegionMaxCompressedSize("ALICE", $aliceRegionSize, $aliceDummyRegionSize, $aliceBinary); | |
| } | |
| $zImageMaxCompressedSize = | |
| &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment); | |
| $aliceMaxCompressedSize = | |
| &vivaHelper::RoundUpToAlignment($aliceMaxCompressedSize, $aliceSizeAlignment); | |
| printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize)); | |
| printLog("ALICE Max Compressed Size: ".vivaHelper::DecToHex($aliceMaxCompressedSize)); | |
| } | |
| # Check whether the configurations are changed | |
| { | |
| if ($featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize and | |
| $featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} == $aliceMaxCompressedSize) | |
| { | |
| debugLog("Config not changed"); | |
| $configChanged = 0; | |
| } | |
| else | |
| { | |
| debugLog("Config changed"); | |
| $configChanged = 1; | |
| } | |
| if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or | |
| &_isObjectListChanged($objectZImageListFile, \@zImageList) or | |
| &_isObjectListChanged($objectAliceListFile, \@aliceList)) | |
| { | |
| debugLog("Object list changed"); | |
| $objectListChanged = 1; | |
| } | |
| else | |
| { | |
| debugLog("Object list not changed"); | |
| $objectListChanged = 0; | |
| } | |
| } | |
| return ($configChanged, $objectListChanged); | |
| } | |
| sub configZImage | |
| { | |
| printLog("Configuring ZIMAGE"); | |
| my $rom1RegionSize; | |
| my $zImageRegionSize; | |
| my @anyCodeDummyList; | |
| my @anyDataDummyList; | |
| my $anyCodeDummyRegionPadding; | |
| my $anyDataDummyRegionPadding; | |
| my $rom1DummyRegionSize; | |
| my $zImageDummyRegionSize; | |
| my $anyCodeDummyRegionSize; | |
| my $anyDataDummyRegionSize; | |
| my $freeRAMSize; | |
| my $availableRAM; | |
| my %variables = | |
| ( | |
| '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM], | |
| '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio], | |
| '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize], | |
| '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize], | |
| '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding], | |
| '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding], | |
| '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize], | |
| '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize], | |
| '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize], | |
| '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize], | |
| '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize], | |
| '$availableRAM' => ["Available RAM", \$availableRAM], | |
| ); | |
| my %objectLists = | |
| ( | |
| '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',], | |
| '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',], | |
| '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'], | |
| '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding'] | |
| ); | |
| printLog("Get dummy scatter object lists"); | |
| { | |
| # Basic | |
| &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1"); | |
| &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE"); | |
| # To be added | |
| $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list"); | |
| $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list"); | |
| } | |
| printLog("Get size information"); | |
| { | |
| $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size"); | |
| $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size"); | |
| $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size"); | |
| $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size"); | |
| $rom1RegionSize = $rom1DummyRegionSize; | |
| $zImageRegionSize = $zImageDummyRegionSize; | |
| $freeRAMSize = &getFreeRAMSize(); | |
| } | |
| # Configure | |
| { | |
| printLog("Compute Available RAM"); | |
| &_evaluateAssignment('$availableRAM = int(($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio))', \%variables); | |
| if ($availableRAM < 0) | |
| { | |
| &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM); | |
| } | |
| # The rest RAM size is first used by ANY_DATA | |
| printLog("Push ANY_DATA to ZIMAGE and ROM1"); | |
| { | |
| &_splitObjectListAndPushByAvailableRAM('@anyDataDummyList', '@zImageList', '@rom1List', | |
| \%variables, \%objectLists); | |
| } | |
| # Finally, the rest RAM is used by ZIMAGE for ANY_CODE | |
| printLog("Push ANY_CODE to ZIMAGE or ROM1"); | |
| { | |
| &_splitObjectListAndPushByAvailableRAM('@anyCodeDummyList', '@zImageList', '@rom1List', | |
| \%variables, \%objectLists); | |
| } | |
| printLog("Compute the Max Compressed Size"); | |
| { | |
| $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary); | |
| } | |
| $zImageMaxCompressedSize = | |
| &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment); | |
| printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize)); | |
| } | |
| # Check whether the configurations are changed | |
| { | |
| if ($featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize) | |
| { | |
| debugLog("Config not changed"); | |
| $configChanged = 0; | |
| } | |
| else | |
| { | |
| debugLog("Config changed"); | |
| $configChanged = 1; | |
| } | |
| if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or | |
| &_isObjectListChanged($objectZImageListFile, \@zImageList)) | |
| { | |
| debugLog("Object list changed"); | |
| $objectListChanged = 1; | |
| } | |
| else | |
| { | |
| debugLog("Object list not changed"); | |
| $objectListChanged = 0; | |
| } | |
| } | |
| return ($configChanged, $objectListChanged); | |
| } | |
| sub configAlice | |
| { | |
| printLog("Configuring ZIMAGE"); | |
| my $aliceDummyRegionSize = &_getExecutionRegionInfo("ALICE", "actual_size"); | |
| $aliceMaxCompressedSize = &_getRegionMaxCompressedSize("ALICE", $aliceDummyRegionSize, $aliceDummyRegionSize, $aliceBinary); | |
| if ($mbaEnabled) | |
| { | |
| $aliceMaxCompressedSize = $aliceMaxCompressedSize * (1 + 0.02); | |
| debugLog("MBA is enabled"); | |
| debugLog("Alice Max Compressed Size = Alice Max Compressed Size * (1 + Veneer Reserved Ratio)"); | |
| debugLog(" = $aliceMaxCompressedSize"); | |
| } | |
| $aliceMaxCompressedSize = | |
| &vivaHelper::RoundUpToAlignment($aliceMaxCompressedSize, $aliceSizeAlignment); | |
| printLog("ALICE Max Compressed Size: ".vivaHelper::DecToHex($aliceMaxCompressedSize)); | |
| if ($featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} == $aliceMaxCompressedSize) | |
| { | |
| debugLog("Config not changed"); | |
| $configChanged = 0; | |
| } | |
| else | |
| { | |
| debugLog("Config changed"); | |
| $configChanged = 1; | |
| } | |
| return $configChanged; | |
| } | |
| sub _inputObjectListFromFile | |
| { | |
| my $filename = shift; | |
| my $listRef = shift; | |
| my $listName = shift; | |
| my @filePath = fileparse($filename); | |
| &vivaHelper::InputObjectListFromFile($filename, $listRef); | |
| debugLog("Input $listName list from $filePath[0]"); | |
| } | |
| sub _inputObjectListFromExecutionRegion | |
| { | |
| my $regionName = shift; | |
| my $listRef = shift; | |
| my $defaultAttribute = shift; | |
| my $defaultCategory = shift; | |
| my $padding = 0; | |
| $padding = &vivaHelper::GetLISExecutionRegionObjectList($regionName, $listRef, $defaultAttribute, $defaultCategory); | |
| debugLog("Get $regionName list from LIS execution region, padding = $padding"); | |
| return $padding; | |
| } | |
| sub _getExecutionRegionInfo | |
| { | |
| my $regionName = shift; | |
| my $infoName = shift; | |
| my %regionInfo; | |
| my $result; | |
| &vivaHelper::GetLISExecutionRegionInfo($regionName, \%regionInfo); | |
| $result = $regionInfo{$infoName}; | |
| debugLog("$regionName execution region $infoName = $result"); | |
| return $result; | |
| } | |
| sub _getRegionMaxCompressedSize | |
| { | |
| my $regionName = shift; | |
| my $regionSize = shift; | |
| my $dummyRegionSize = shift; | |
| my $dummyCompressedBinary = shift; | |
| my $dummyCompressedSize = -s $dummyCompressedBinary or | |
| &vivaHelper::ErrorHandler("Cannot get file size $dummyCompressedBinary: $!", __FILE__, __LINE__); | |
| #debugLog("$regionName Dummy Region Size = $dummyRegionSize"); | |
| #debugLog("$regionName Dummy Compressed Binary Size = $dummyCompressedSize"); | |
| my $compressionRatio = $dummyCompressedSize / $dummyRegionSize; | |
| #debugLog("$regionName Compression Ratio = $regionName Dummy Compressed Binary Size / $regionName Dummy Region Size"); | |
| #debugLog(" = $dummyCompressedSize / $dummyRegionSize"); | |
| #debugLog(" = $compressionRatio"); | |
| my $maxCompressedSize = int($regionSize * $compressionRatio + 0.99); | |
| debugLog("$regionName max compressed size = $regionName Region Size * $regionName Compression Ratio"); | |
| debugLog(" = $regionSize * $compressionRatio"); | |
| debugLog(" = $maxCompressedSize"); | |
| return $maxCompressedSize; | |
| } | |
| sub _pushToObjectList | |
| { | |
| my $targetList = shift; | |
| my $sourceList = shift; | |
| my $variables = shift; | |
| my $objectLists = shift; | |
| push @{$objectLists->{$targetList}[1]}, @{$objectLists->{$sourceList}[1]}; | |
| debugLog("$objectLists->{$targetList}[0] += $objectLists->{$sourceList}[0]"); | |
| _evaluateAssignment("$objectLists->{$targetList}[2] = $objectLists->{$targetList}[2] + $objectLists->{$sourceList}[2]", $variables); | |
| } | |
| sub _splitObjectListAndPush | |
| { | |
| my $sourceList = shift; | |
| my $firstList = shift; | |
| my $secondList = shift; | |
| my $splitSize = shift; | |
| my $variables = shift; | |
| my $objectLists = shift; | |
| my $splitSizeWithVeneer; | |
| my $actualSplitSize; | |
| my @list1; | |
| my @list2; | |
| $variables->{'$splitSizeWithVeneer'} = ["Splitted Size with Veneer", \$splitSizeWithVeneer]; | |
| $variables->{'$actualSplitSize'} = ["Actual Splitted Size", \$actualSplitSize]; | |
| #$objectLists->{'@list1'} = ["Splitted List", \@list1, '$actualSplitSize * (1 + $veneerReserveRatio)']; | |
| $objectLists->{'@list1'} = ["Splitted List", \@list1, '$actualSplitSize + '."$objectLists->{$sourceList}[3]"]; | |
| $objectLists->{'@list2'} = ["Rest List", \@list2, "$objectLists->{$sourceList}[2]".' - $actualSplitSize']; | |
| debugLog("Split $objectLists->{$sourceList}[0]"); | |
| #&_evaluateAssignment('$splitSizeWithVeneer = '."$splitSize".' * (1 + $veneerReserveRatio)', $variables); | |
| &_evaluateAssignment('$splitSizeWithVeneer = '."$splitSize", $variables); | |
| $splitSizeWithVeneer = int($splitSizeWithVeneer); | |
| $actualSplitSize = &vivaHelper::SplitObjectListBySize($objectLists->{$sourceList}[1], $splitSizeWithVeneer, | |
| \@list1, \@list2); | |
| debugLog("Actual Splitted Size = $actualSplitSize"); | |
| &_pushToObjectList($firstList, '@list1', $variables, $objectLists); | |
| &_pushToObjectList($secondList, '@list2', $variables, $objectLists); | |
| delete $variables->{'$splitSizeWithVeneer'}; | |
| delete $variables->{'$actualSplitSize'}; | |
| delete $objectLists->{'@list1'}; | |
| delete $objectLists->{'@list2'}; | |
| return $actualSplitSize; | |
| } | |
| sub _splitObjectListAndPushByAvailableRAM | |
| { | |
| my $sourceList = shift; | |
| my $firstList = shift; | |
| my $secondList = shift; | |
| my $variables = shift; | |
| my $objectLists = shift; | |
| if (${$variables->{'$availableRAM'}[1]} < $smallestSplitableRAMSize and ${$variables->{'$availableRAM'}[1]} != 0) | |
| { | |
| debugLog("Available RAM < Smallest Splitable RAM"); | |
| debugLog(" = $smallestSplitableRAMSize"); | |
| ${$variables->{'$availableRAM'}[1]} = 0; | |
| debugLog("Available RAM = 0"); | |
| } | |
| &_splitObjectListAndPush($sourceList, $firstList, $secondList, | |
| '$availableRAM', $variables, $objectLists); | |
| if (${$variables->{'$availableRAM'}[1]} >= ${$variables->{$objectLists->{$sourceList}[2]}[1]}) | |
| { | |
| &_evaluateAssignment('$availableRAM = $availableRAM - '."$objectLists->{$sourceList}[2]", $variables); | |
| } | |
| else | |
| { | |
| ${$variables->{'$availableRAM'}[1]} = 0; | |
| debugLog("Available RAM = 0"); | |
| } | |
| } | |
| sub _evaluateAssignment | |
| { | |
| my $assignmentString = shift; | |
| my $variables = shift; | |
| my @assignment = split(/=/, $assignmentString); | |
| my $symbolString = $assignmentString; | |
| $assignment[0] =~ s/(?:^ +)||(?: +$)//g; | |
| $assignment[1] =~ s/(?:^ +)||(?: +$)//g; | |
| my $evaluationString = $assignment[1]; | |
| while (my ($key, $value)= each %$variables) | |
| { | |
| my $matchSymbol = "\\$key"; | |
| $symbolString =~ s/$matchSymbol/$value->[0]/g; | |
| $evaluationString =~ s/$matchSymbol/${$value->[1]}/g; | |
| } | |
| my $intermediate = eval{$evaluationString}; | |
| my $assigneeRef = $variables->{$assignment[0]}[1]; | |
| $$assigneeRef = eval ($evaluationString); | |
| debugLog($symbolString); | |
| debugLog(" = $intermediate"); | |
| debugLog(" = $$assigneeRef"); | |
| } | |
| sub _isObjectListChanged | |
| { | |
| my $objectListFile = shift; | |
| my $objectListRef = shift; | |
| my @objectListOriginal; | |
| &vivaHelper::InputObjectListFromFile($objectListFile, \@objectListOriginal); | |
| if (&vivaHelper::CompareObjectList(\@objectListOriginal, $objectListRef) == 0) | |
| { | |
| return 0; | |
| } | |
| else | |
| { | |
| return 1; | |
| } | |
| } | |
| sub configBootZImage_ZImage_Alice_FavorROM | |
| { | |
| printLog("Configuring BOOT_ZIMAGE, ZIMAGE, and ALICE favoring ROM..."); | |
| my $rom1RegionSize; | |
| my $bootZImageRegionSize; | |
| my $zImageRegionSize; | |
| my $aliceRegionSize; | |
| my @bootZImageDummyList; | |
| my @aliceForbidDummyList; | |
| my @anyCodeDummyList; | |
| my @anyDataDummyList; | |
| my $bootZImageDummyRegionPadding; | |
| my $aliceForbidDummyRegionPadding; | |
| my $anyCodeDummyRegionPadding; | |
| my $anyDataDummyRegionPadding; | |
| my $rom1DummyRegionSize; | |
| my $bootZImageDummyRegionSize; | |
| my $zImageDummyRegionSize; | |
| my $aliceDummyRegionSize; | |
| my $aliceForbidDummyRegionSize; | |
| my $anyCodeDummyRegionSize; | |
| my $anyDataDummyRegionSize; | |
| my $bootZImageDummyCompressionRatio; | |
| my $zImageDummyCompressionRatio; | |
| my $aliceDummyCompressionRatio; | |
| my $freeRAMSize; | |
| my $availableRAM; | |
| my $exceedROMSize; | |
| my $targetSplitSize; | |
| my %variables = | |
| ( | |
| '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM], | |
| '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio], | |
| '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize], | |
| '$bootZImageRegionSize' => ["BOOT_ZIMAGE Region Size", \$bootZImageRegionSize], | |
| '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize], | |
| '$aliceRegionSize' => ["ALICE Region Size", \$aliceRegionSize], | |
| '$bootZImageDummyRegionPadding' => ["BOOT_ZIMAGE Dummy Region Padding", \$bootZImageDummyRegionPadding], | |
| '$aliceForbidDummyRegionPadding' => ["ALICE_FORBID Dummy Region Padding", \$aliceForbidDummyRegionPadding], | |
| '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding], | |
| '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding], | |
| '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize], | |
| '$bootZImageDummyRegionSize' => ["BOOT_ZIMAGE Dummy Region Size", \$bootZImageDummyRegionSize], | |
| '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize], | |
| '$aliceDummyRegionSize' => ["ALICE Dummy Region Size", \$aliceDummyRegionSize], | |
| '$aliceForbidDummyRegionSize' => ["ALICE_FORBID Dummy Region Size", \$aliceForbidDummyRegionSize], | |
| '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize], | |
| '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize], | |
| '$bootZImageDummyCompressionRatio' => ["BOOT_ZIMAGE Dummy Compression Ratio", \$bootZImageDummyCompressionRatio], | |
| '$zImageDummyCompressionRatio' => ["ZIMAGE Dummy Compression Ratio", \$zImageDummyCompressionRatio], | |
| '$aliceDummyCompressionRatio' => ["ALICE Dummy Compression Ratio", \$aliceDummyCompressionRatio], | |
| '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize], | |
| '$availableRAM' => ["Available RAM", \$availableRAM], | |
| '$exceedROMSize' => ["Exceed ROM Size", \$exceedROMSize], | |
| '$targetSplitSize' => ["Target Split Size", \$targetSplitSize], | |
| ); | |
| my %objectLists = | |
| ( | |
| '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',], | |
| '@bootZImageList' => ["BOOT_ZIMAGE List", \@bootZImageList, '$bootZImageRegionSize',], | |
| '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',], | |
| '@aliceList' => ["ALICE List", \@aliceList, '$aliceRegionSize',], | |
| '@bootZImageDummyList' => ["BOOT_ZIMAGE Dummy List", \@bootZImageDummyList, '$bootZImageDummyRegionSize', '$bootZImageDummyRegionPadding'], | |
| '@aliceForbidDummyList' => ["ALICE_FORBID Dummy List", \@aliceForbidDummyList, '$aliceForbidDummyRegionSize', '$aliceForbidDummyRegionPadding'], | |
| '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'], | |
| '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding'] | |
| ); | |
| printLog("Get dummy scatter object lists"); | |
| { | |
| # Basic | |
| &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1"); | |
| &_inputObjectListFromFile($objectBootZImageDummyListFile, \@bootZImageList, "BOOT_ZIMAGE"); | |
| &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE"); | |
| &_inputObjectListFromFile($objectAliceDummyListFile, \@aliceList, "ALICE"); | |
| # To be added | |
| $bootZImageDummyRegionPadding = &_inputObjectListFromExecutionRegion("BOOT_ZIMAGE_ER", \@bootZImageDummyList, "+RO", "BOOT_ZIMAGE list"); | |
| $aliceForbidDummyRegionPadding = &_inputObjectListFromExecutionRegion("ALICE_FORBID", \@aliceForbidDummyList, "+RO", "ALICE_FORBID list"); | |
| $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list"); | |
| $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list"); | |
| } | |
| printLog("Get size information"); | |
| { | |
| $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size"); | |
| $bootZImageDummyRegionSize = &_getExecutionRegionInfo("BOOT_ZIMAGE_ER", "actual_size"); | |
| $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size"); | |
| $aliceDummyRegionSize = &_getExecutionRegionInfo("ALICE", "actual_size"); | |
| $aliceForbidDummyRegionSize = &_getExecutionRegionInfo("ALICE_FORBID", "actual_size"); | |
| $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size"); | |
| $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size"); | |
| $rom1RegionSize = $rom1DummyRegionSize; | |
| $bootZImageRegionSize = $bootZImageDummyRegionSize; | |
| $zImageRegionSize = $zImageDummyRegionSize; | |
| $aliceRegionSize = $aliceDummyRegionSize; | |
| $freeRAMSize = &getFreeRAMSize(); | |
| $exceedROMSize = &getExceedROMSize(); | |
| } | |
| # Configure | |
| { | |
| printLog("Compute Available RAM"); | |
| &_evaluateAssignment('$availableRAM = ($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio)', \%variables); | |
| $availableRAM = int($availableRAM); | |
| if ($availableRAM < 0) | |
| { | |
| &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM); | |
| } | |
| # Compute the compression ratios | |
| printLog("Compute the compression ratios"); | |
| { | |
| $bootZImageDummyCompressionRatio = &_getCompressionRatio("BOOT_ZIMAGE", $bootZImageDummyRegionSize, $bootZImageBinary); | |
| $zImageDummyCompressionRatio = &_getCompressionRatio("ZIMAGE", $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary); | |
| $aliceDummyCompressionRatio = &_getCompressionRatio("ALICE", $aliceDummyRegionSize, $aliceBinary); | |
| } | |
| # Assume ANY_CODE in ALICE | |
| printLog("Assume ANY_CODE are all in ALICE"); | |
| { | |
| &_evaluateAssignment('$exceedROMSize = int($exceedROMSize - $anyCodeDummyRegionSize * (1 - $aliceDummyCompressionRatio))', \%variables); | |
| if ($exceedROMSize > $availableRAM * (1 - $zImageDummyCompressionRatio)) | |
| { | |
| debugLog("Exceed ROM Size > Available RAM * (1 - ZIMAGE Dummy Compression Ratio)"); | |
| debugLog(" = $availableRAM * (1 - $zImageDummyCompressionRatio)"); | |
| debugLog(" = ".($availableRAM * (1 - $zImageDummyCompressionRatio))); | |
| &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, $exceedROMSize / (1 - $zImageDummyCompressionRatio) - $availableRAM); | |
| } | |
| } | |
| # Push ALICE_FORBID to ZIMAGE or ROM1 | |
| &_splitObjectListAndPushByExceedROM('@aliceForbidDummyList', '@zImageList', '@rom1List', | |
| '$zImageDummyCompressionRatio', \%variables, \%objectLists); | |
| # Push ANY_DATA to ZIMAGE or ROM1 | |
| &_splitObjectListAndPushByExceedROM('@anyDataDummyList', '@zImageList', '@rom1List', | |
| '$zImageDummyCompressionRatio', \%variables, \%objectLists); | |
| # Push BOOT_ZIMAGE Dummy to BOOT_ZIMAGE or ROM1 | |
| &vivaHelper::ChangeObjectListAttributeListByObjectList(\@bootZImageDummyList, \@bootZImageList); | |
| @bootZImageList = pop @bootZImageDummyList; # Push at least one entry to BOOT_ZIMAGE to prevent empty | |
| $bootZImageRegionSize = 0; | |
| &_splitObjectListAndPushByExceedROM('@bootZImageDummyList', '@bootZImageList', '@rom1List', | |
| '$bootZImageDummyCompressionRatio', \%variables, \%objectLists); | |
| # Push ANY_CODE to ZIMAGE or ALICE | |
| &_splitObjectListAndPushByExceedROM('@anyCodeDummyList', '@zImageList', '@aliceList', | |
| '$aliceDummyCompressionRatio - $zImageDummyCompressionRatio', \%variables, \%objectLists); | |
| #if ($exceedROMSize > 0) | |
| #{ | |
| # &configFail(CONFIG_FAIL_INSUFFICIENT_FLASH_SIZE, $exceedROMSize); | |
| #} | |
| printLog("Compute the Max Compressed Size"); | |
| { | |
| $bootZImageMaxCompressedSize = &_getRegionMaxCompressedSize("BOOT_ZIMAGE", $bootZImageRegionSize, $bootZImageDummyRegionSize, $bootZImageBinary); | |
| $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary); | |
| $aliceMaxCompressedSize = &_getRegionMaxCompressedSize("ALICE", $aliceRegionSize, $aliceDummyRegionSize, $aliceBinary); | |
| } | |
| $bootZImageMaxCompressedSize = | |
| &vivaHelper::RoundUpToAlignment($bootZImageMaxCompressedSize, $bootZImageSizeAlignment); | |
| $zImageMaxCompressedSize = | |
| &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment); | |
| $aliceMaxCompressedSize = | |
| &vivaHelper::RoundUpToAlignment($aliceMaxCompressedSize, $aliceSizeAlignment); | |
| printLog("BOOT_ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($bootZImageMaxCompressedSize)); | |
| printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize)); | |
| printLog("ALICE Max Compressed Size: ".vivaHelper::DecToHex($aliceMaxCompressedSize)); | |
| } | |
| # Check whether the configurations are changed | |
| { | |
| if ($featureConfig{"CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE"} == $bootZImageMaxCompressedSize and | |
| $featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize and | |
| $featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} == $aliceMaxCompressedSize) | |
| { | |
| debugLog("Config not changed"); | |
| $configChanged = 0; | |
| } | |
| else | |
| { | |
| debugLog("Config changed"); | |
| $configChanged = 1; | |
| } | |
| if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or | |
| &_isObjectListChanged($objectBootZImageListFile, \@bootZImageList) or | |
| &_isObjectListChanged($objectZImageListFile, \@zImageList) or | |
| &_isObjectListChanged($objectAliceListFile, \@aliceList)) | |
| { | |
| debugLog("Object list changed"); | |
| $objectListChanged = 1; | |
| } | |
| else | |
| { | |
| debugLog("Object list not changed"); | |
| $objectListChanged = 0; | |
| } | |
| } | |
| return ($configChanged, $objectListChanged); | |
| } | |
| sub configZImage_Alice_FavorROM | |
| { | |
| printLog("Configuring ZIMAGE and ALICE favoring ROM..."); | |
| my $rom1RegionSize; | |
| my $zImageRegionSize; | |
| my $aliceRegionSize; | |
| my @aliceForbidDummyList; | |
| my @anyCodeDummyList; | |
| my @anyDataDummyList; | |
| my $aliceForbidDummyRegionPadding; | |
| my $anyCodeDummyRegionPadding; | |
| my $anyDataDummyRegionPadding; | |
| my $rom1DummyRegionSize; | |
| my $zImageDummyRegionSize; | |
| my $aliceDummyRegionSize; | |
| my $aliceForbidDummyRegionSize; | |
| my $anyCodeDummyRegionSize; | |
| my $anyDataDummyRegionSize; | |
| my $zImageDummyCompressionRatio; | |
| my $aliceDummyCompressionRatio; | |
| my $freeRAMSize; | |
| my $availableRAM; | |
| my $exceedROMSize; | |
| my $targetSplitSize; | |
| my %variables = | |
| ( | |
| '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM], | |
| '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio], | |
| '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize], | |
| '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize], | |
| '$aliceRegionSize' => ["ALICE Region Size", \$aliceRegionSize], | |
| '$aliceForbidDummyRegionPadding' => ["ALICE_FORBID Dummy Region Padding", \$aliceForbidDummyRegionPadding], | |
| '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding], | |
| '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding], | |
| '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize], | |
| '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize], | |
| '$aliceDummyRegionSize' => ["ALICE Dummy Region Size", \$aliceDummyRegionSize], | |
| '$aliceForbidDummyRegionSize' => ["ALICE_FORBID Dummy Region Size", \$aliceForbidDummyRegionSize], | |
| '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize], | |
| '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize], | |
| '$zImageDummyCompressionRatio' => ["ZIMAGE Dummy Compression Ratio", \$zImageDummyCompressionRatio], | |
| '$aliceDummyCompressionRatio' => ["ALICE Dummy Compression Ratio", \$aliceDummyCompressionRatio], | |
| '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize], | |
| '$availableRAM' => ["Available RAM", \$availableRAM], | |
| '$exceedROMSize' => ["Exceed ROM Size", \$exceedROMSize], | |
| '$targetSplitSize' => ["Target Split Size", \$targetSplitSize], | |
| ); | |
| my %objectLists = | |
| ( | |
| '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',], | |
| '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',], | |
| '@aliceList' => ["ALICE List", \@aliceList, '$aliceRegionSize',], | |
| '@aliceForbidDummyList' => ["ALICE_FORBID Dummy List", \@aliceForbidDummyList, '$aliceForbidDummyRegionSize', '$aliceForbidDummyRegionPadding'], | |
| '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'], | |
| '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding'] | |
| ); | |
| printLog("Get dummy scatter object lists"); | |
| { | |
| # Basic | |
| &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1"); | |
| &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE"); | |
| &_inputObjectListFromFile($objectAliceDummyListFile, \@aliceList, "ALICE"); | |
| # To be added | |
| $aliceForbidDummyRegionPadding = &_inputObjectListFromExecutionRegion("ALICE_FORBID", \@aliceForbidDummyList, "+RO", "ALICE_FORBID list"); | |
| $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list"); | |
| $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list"); | |
| } | |
| printLog("Get size information"); | |
| { | |
| $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size"); | |
| $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size"); | |
| $aliceDummyRegionSize = &_getExecutionRegionInfo("ALICE", "actual_size"); | |
| $aliceForbidDummyRegionSize = &_getExecutionRegionInfo("ALICE_FORBID", "actual_size"); | |
| $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size"); | |
| $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size"); | |
| $rom1RegionSize = $rom1DummyRegionSize; | |
| $zImageRegionSize = $zImageDummyRegionSize; | |
| $aliceRegionSize = $aliceDummyRegionSize; | |
| $freeRAMSize = &getFreeRAMSize(); | |
| $exceedROMSize = &getExceedROMSize(); | |
| } | |
| # Configure | |
| { | |
| printLog("Compute Available RAM"); | |
| &_evaluateAssignment('$availableRAM = int(($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio))', \%variables); | |
| if ($availableRAM < 0) | |
| { | |
| &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM); | |
| } | |
| # Compute the compression ratios | |
| printLog("Compute the compression ratios"); | |
| { | |
| $zImageDummyCompressionRatio = &_getCompressionRatio("ZIMAGE", $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary); | |
| $aliceDummyCompressionRatio = &_getCompressionRatio("ALICE", $aliceDummyRegionSize, $aliceBinary); | |
| } | |
| # Assume ANY_CODE in ALICE | |
| printLog("Assume ANY_CODE are all in ALICE"); | |
| { | |
| &_evaluateAssignment('$exceedROMSize = int($exceedROMSize - $anyCodeDummyRegionSize * (1 - $aliceDummyCompressionRatio))', \%variables); | |
| if ($exceedROMSize > $availableRAM * (1 - $zImageDummyCompressionRatio)) | |
| { | |
| debugLog("Exceed ROM Size > Available RAM * (1 - ZIMAGE Dummy Compression Ratio)"); | |
| debugLog(" = $availableRAM * (1 - $zImageDummyCompressionRatio)"); | |
| debugLog(" = ".($availableRAM * (1 - $zImageDummyCompressionRatio))); | |
| &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, $exceedROMSize / (1 - $zImageDummyCompressionRatio) - $availableRAM); | |
| } | |
| } | |
| # Push ALICE_FORBID to ZIMAGE or ROM1 | |
| &_splitObjectListAndPushByExceedROM('@aliceForbidDummyList', '@zImageList', '@rom1List', | |
| '$zImageDummyCompressionRatio', \%variables, \%objectLists); | |
| # Push ANY_DATA to ZIMAGE or ROM1 | |
| &_splitObjectListAndPushByExceedROM('@anyDataDummyList', '@zImageList', '@rom1List', | |
| '$zImageDummyCompressionRatio', \%variables, \%objectLists); | |
| # Push ANY_CODE to ZIMAGE or ALICE | |
| &_splitObjectListAndPushByExceedROM('@anyCodeDummyList', '@zImageList', '@aliceList', | |
| '$aliceDummyCompressionRatio - $zImageDummyCompressionRatio', \%variables, \%objectLists); | |
| #if ($exceedROMSize > 0) | |
| #{ | |
| # &configFail(CONFIG_FAIL_INSUFFICIENT_FLASH_SIZE, $exceedROMSize); | |
| #} | |
| printLog("Compute the Max Compressed Size"); | |
| { | |
| $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary); | |
| $aliceMaxCompressedSize = &_getRegionMaxCompressedSize("ALICE", $aliceRegionSize, $aliceDummyRegionSize, $aliceBinary); | |
| } | |
| $zImageMaxCompressedSize = | |
| &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment); | |
| $aliceMaxCompressedSize = | |
| &vivaHelper::RoundUpToAlignment($aliceMaxCompressedSize, $aliceSizeAlignment); | |
| printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize)); | |
| printLog("ALICE Max Compressed Size: ".vivaHelper::DecToHex($aliceMaxCompressedSize)); | |
| } | |
| # Check whether the configurations are changed | |
| { | |
| if ($featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize and | |
| $featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} == $aliceMaxCompressedSize) | |
| { | |
| debugLog("Config not changed"); | |
| $configChanged = 0; | |
| } | |
| else | |
| { | |
| debugLog("Config changed"); | |
| $configChanged = 1; | |
| } | |
| if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or | |
| &_isObjectListChanged($objectZImageListFile, \@zImageList) or | |
| &_isObjectListChanged($objectAliceListFile, \@aliceList)) | |
| { | |
| debugLog("Object list changed"); | |
| $objectListChanged = 1; | |
| } | |
| else | |
| { | |
| debugLog("Object list not changed"); | |
| $objectListChanged = 0; | |
| } | |
| } | |
| return ($configChanged, $objectListChanged); | |
| } | |
| sub configZImage_FavorROM | |
| { | |
| printLog("Configuring ZIMAGE favoring ROM..."); | |
| my $rom1RegionSize; | |
| my $zImageRegionSize; | |
| my @anyCodeDummyList; | |
| my @anyDataDummyList; | |
| my $anyCodeDummyRegionPadding; | |
| my $anyDataDummyRegionPadding; | |
| my $rom1DummyRegionSize; | |
| my $zImageDummyRegionSize; | |
| my $anyCodeDummyRegionSize; | |
| my $anyDataDummyRegionSize; | |
| my $zImageDummyCompressionRatio; | |
| my $freeRAMSize; | |
| my $availableRAM; | |
| my $exceedROMSize; | |
| my $targetSplitSize; | |
| my %variables = | |
| ( | |
| '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM], | |
| '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio], | |
| '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize], | |
| '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize], | |
| '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding], | |
| '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding], | |
| '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize], | |
| '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize], | |
| '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize], | |
| '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize], | |
| '$zImageDummyCompressionRatio' => ["ZIMAGE Dummy Compression Ratio", \$zImageDummyCompressionRatio], | |
| '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize], | |
| '$availableRAM' => ["Available RAM", \$availableRAM], | |
| '$exceedROMSize' => ["Exceed ROM Size", \$exceedROMSize], | |
| '$targetSplitSize' => ["Target Split Size", \$targetSplitSize], | |
| ); | |
| my %objectLists = | |
| ( | |
| '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',], | |
| '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',], | |
| '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'], | |
| '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding'] | |
| ); | |
| printLog("Get dummy scatter object lists"); | |
| { | |
| # Basic | |
| &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1"); | |
| &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE"); | |
| # To be added | |
| $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list"); | |
| $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list"); | |
| } | |
| printLog("Get size information"); | |
| { | |
| $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size"); | |
| $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size"); | |
| $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size"); | |
| $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size"); | |
| $rom1RegionSize = $rom1DummyRegionSize; | |
| $zImageRegionSize = $zImageDummyRegionSize; | |
| $freeRAMSize = &getFreeRAMSize(); | |
| $exceedROMSize = &getExceedROMSize(); | |
| } | |
| # Configure | |
| { | |
| printLog("Compute Available RAM"); | |
| &_evaluateAssignment('$availableRAM = int(($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio))', \%variables); | |
| if ($availableRAM < 0) | |
| { | |
| &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM); | |
| } | |
| # Compute the compression ratios | |
| printLog("Compute the compression ratios"); | |
| { | |
| $zImageDummyCompressionRatio = &_getCompressionRatio("ZIMAGE", $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary); | |
| } | |
| # Push ANY_DATA to ZIMAGE | |
| &_splitObjectListAndPushByExceedROM('@anyDataDummyList', '@zImageList', '@rom1List', | |
| '$zImageDummyCompressionRatio', \%variables, \%objectLists); | |
| # Push ANY_CODE to ZIMAGE | |
| &_splitObjectListAndPushByExceedROM('@anyCodeDummyList', '@zImageList', '@rom1List', | |
| '$zImageDummyCompressionRatio', \%variables, \%objectLists); | |
| #if ($exceedROMSize > 0) | |
| #{ | |
| # &configFail(CONFIG_FAIL_INSUFFICIENT_FLASH_SIZE, $exceedROMSize); | |
| #} | |
| printLog("Compute the Max Compressed Size"); | |
| { | |
| $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary); | |
| } | |
| $zImageMaxCompressedSize = | |
| &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment); | |
| printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize)); | |
| } | |
| # Check whether the configurations are changed | |
| { | |
| if ($featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize) | |
| { | |
| debugLog("Config not changed"); | |
| $configChanged = 0; | |
| } | |
| else | |
| { | |
| debugLog("Config changed"); | |
| $configChanged = 1; | |
| } | |
| if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or | |
| &_isObjectListChanged($objectZImageListFile, \@zImageList)) | |
| { | |
| debugLog("Object list changed"); | |
| $objectListChanged = 1; | |
| } | |
| else | |
| { | |
| debugLog("Object list not changed"); | |
| $objectListChanged = 0; | |
| } | |
| } | |
| return ($configChanged, $objectListChanged); | |
| } | |
| sub _getCompressionRatio | |
| { | |
| my $regionName = shift; | |
| my $dummyRegionSize = shift; | |
| my $dummyCompressedBinary = shift; | |
| my $dummyCompressedSize = -s $dummyCompressedBinary or | |
| &vivaHelper::ErrorHandler("Cannot get file size $dummyCompressedBinary: $!", __FILE__, __LINE__); | |
| #debugLog("$regionName Dummy Region Size = $dummyRegionSize"); | |
| #debugLog("$regionName Dummy Compressed Binary Size = $dummyCompressedSize"); | |
| my $compressionRatio = $dummyCompressedSize / $dummyRegionSize; | |
| debugLog("$regionName Compression Ratio = $regionName Dummy Compressed Binary Size / $regionName Dummy Region Size"); | |
| debugLog(" = $dummyCompressedSize / $dummyRegionSize"); | |
| debugLog(" = $compressionRatio"); | |
| return $compressionRatio; | |
| } | |
| sub _splitObjectListAndPushByExceedROM | |
| { | |
| my $sourceList = shift; | |
| my $firstList = shift; | |
| my $secondList = shift; | |
| my $compressionRatio = shift; | |
| my $variables = shift; | |
| my $objectLists = shift; | |
| if (${$variables->{'$exceedROMSize'}[1]} > 0) | |
| { | |
| printLog("Split $objectLists->{$sourceList}[0] to $objectLists->{$firstList}[0] and $objectLists->{$secondList}[0]"); | |
| &_evaluateAssignment('$targetSplitSize = min($availableRAM, '."$objectLists->{$sourceList}[2]".')', $variables); | |
| &_evaluateAssignment('$targetSplitSize = min($targetSplitSize, int($exceedROMSize / (1 - '."$compressionRatio".')))', $variables); | |
| ${$variables->{'$targetSplitSize'}[1]} = &_splitObjectListAndPush("$sourceList", "$firstList", "$secondList", | |
| '$targetSplitSize', $variables, $objectLists); | |
| &_evaluateAssignment('$availableRAM = $availableRAM - $targetSplitSize - '."$objectLists->{$sourceList}[3]", $variables); | |
| &_evaluateAssignment('$exceedROMSize = int($exceedROMSize - $targetSplitSize * (1 - '."$compressionRatio".'))', $variables); | |
| } | |
| else | |
| { | |
| printLog("Push $objectLists->{$sourceList}[0] to $objectLists->{$secondList}[0]"); | |
| &_pushToObjectList($secondList, $sourceList, $variables, $objectLists); | |
| } | |
| } | |
| #**************************************************************************** | |
| # subroutine: parseFeatureConfigFile | |
| # description: Get the settings in the feature config file | |
| # input: The setting hash ref | |
| # output: The settings | |
| #**************************************************************************** | |
| sub parseFeatureConfigFile | |
| { | |
| my $featureConfigRef = shift; | |
| my $filename = $featureConfigFilePath; | |
| open my $input, "<$filename" or | |
| &vivaHelper::ErrorHandler("Cannot open file $filename: $!", __FILE__, __LINE__); | |
| while (<$input>) | |
| { | |
| chomp; | |
| if (/^\s*\#define\s+(\S+)\s+(\S+)/) | |
| { | |
| $featureConfigRef->{$1} = hex($2); | |
| } | |
| } | |
| close $input; | |
| } | |
| #**************************************************************************** | |
| # subroutine: getFreeRAMSize | |
| # description: Get the free RAM size. | |
| # input: None | |
| # output: Free RAM size | |
| #**************************************************************************** | |
| sub getFreeRAMSize | |
| { | |
| # TODO: Move this to LISInfo.pm | |
| my $externalRAMSize = &getExternalRAMSize(); | |
| my $usedRAM; | |
| my $cacheDummyEndSize = 4; | |
| my $result; | |
| my %regionInfo; | |
| &vivaHelper::GetLISExecutionRegionInfo("DYNAMIC_CACHEABLE_EXTSRAM_DEFAULT_CACHEABLE_ZI", \%regionInfo); | |
| $usedRAM = ($regionInfo{"base_address"} & hex("0x07FFFFFF")) + $regionInfo{"actual_size"}; | |
| debugLog("End of cacheable ZI = $usedRAM"); | |
| &vivaHelper::GetLISExecutionRegionInfo("EXTSRAM_DSP_TX", \%regionInfo); | |
| $usedRAM += $regionInfo{"max_size"}; | |
| debugLog("DSP TX RAM = ".$regionInfo{"max_size"}); | |
| &vivaHelper::GetLISExecutionRegionInfo("EXTSRAM_DSP_RX", \%regionInfo); | |
| $usedRAM += $regionInfo{"max_size"}; | |
| debugLog("DSP RX RAM = ".$regionInfo{"max_size"}); | |
| debugLog("Cache dummy end size = $cacheDummyEndSize"); | |
| $result = $externalRAMSize - $usedRAM - $cacheDummyEndSize; | |
| debugLog("Free RAM size = External Total RAM Size - (End of cacheable ZI + DSP TX RAM + DSP RX RAM) - Cache Dummy End Size"); | |
| debugLog(" = $result"); | |
| return $result; | |
| } | |
| #**************************************************************************** | |
| # subroutine: getTotalLISROMSize | |
| # description: Get total ROM size in LIS file. | |
| # input: None | |
| # output: Total ROM size in LIS file | |
| #**************************************************************************** | |
| sub getTotalLISROMSize | |
| { | |
| my %totalSizeInfo; | |
| &vivaHelper::GetLISTotalSize(\%totalSizeInfo); | |
| my $totalLISROMSize = $totalSizeInfo{"ROM"}; | |
| debugLog("Total LIS ROM size = $totalLISROMSize"); | |
| return $totalLISROMSize; | |
| } | |
| #**************************************************************************** | |
| # subroutine: getFileSystemBaseAddress | |
| # description: Get the file system base address. | |
| # input: None | |
| # output: File system base address | |
| #**************************************************************************** | |
| sub getFileSystemBaseAddress | |
| { | |
| my $result; | |
| open my $input, "<$flashConfigFilePath" or | |
| &vivaHelper::ErrorHandler("Cannot open file $flashConfigFilePath: $!", __FILE__, __LINE__); | |
| while (<$input>) | |
| { | |
| if (/int flash_base_address\s+=\s+((\S|\s)+);/) | |
| { | |
| $result = eval($1); | |
| last; | |
| } | |
| } | |
| close ($input); | |
| debugLog("File System Base Address = $result"); | |
| return $result; | |
| } | |
| #**************************************************************************** | |
| # subroutine: getExceedROMSize | |
| # description: Get the bytes exceed maximum ROM size. | |
| # input: None | |
| # output: Byte exceeded | |
| #**************************************************************************** | |
| sub getExceedROMSize | |
| { | |
| my $fsBaseAddress = &getFileSystemBaseAddress(); | |
| my $totalLISROMSize = &getTotalLISROMSize(); | |
| my $scatterReservedSize = &vivaHelper::GetScatterReservedSize($fsBaseAddress); | |
| debugLog("Scatter Reserved Size = $scatterReservedSize"); | |
| my $exceedROMSize = $totalLISROMSize + $scatterReservedSize - $fsBaseAddress; | |
| debugLog("Exceed ROM Size = Total LIS ROM size + Scatter Reserved Size - File System Base Address"); | |
| debugLog(" = $totalLISROMSize + $scatterReservedSize - $fsBaseAddress"); | |
| debugLog(" = $exceedROMSize"); | |
| return $exceedROMSize; | |
| } | |
| #**************************************************************************** | |
| # subroutine: getExternalRAMSize | |
| # description: Get the external RAM size. | |
| # input: None | |
| # output: External RAM size | |
| #**************************************************************************** | |
| sub getExternalRAMSize | |
| { | |
| my $filename = "$customFolder\\custom_EMI_release.h"; | |
| my $result; | |
| open my $input, "<$filename" or | |
| &vivaHelper::ErrorHandler("Cannot open file $flashConfigFilePath: $!", __FILE__, __LINE__); | |
| while (<$input>) | |
| { | |
| if (/\#define EMI_EXTSRAM_SIZE ((\S|\s)+)/) | |
| { | |
| $result = eval($1); | |
| last; | |
| } | |
| } | |
| close ($input); | |
| debugLog("External Total RAM Size = $result"); | |
| return $result; | |
| } | |
| #**************************************************************************** | |
| # subroutine: isAutoConfigEnable | |
| # description: See if the auto configuration mechanism is enabled or not. | |
| # input: None | |
| # output: 1: enabled; 0: not enabled | |
| #**************************************************************************** | |
| sub isAutoConfigEnable | |
| { | |
| my $autoConfig = &vivaHelper::GetMakefileOption("ZIMAGE_AUTO_CONFIG"); | |
| if (not defined $autoConfig or $autoConfig eq "TRUE") | |
| { | |
| return 1; | |
| } | |
| else | |
| { | |
| return 0; | |
| } | |
| } | |
| #**************************************************************************** | |
| # subroutine: printIntermediateFile | |
| # description: Print to intermediate file. | |
| # input: Message | |
| # output: None | |
| #**************************************************************************** | |
| sub printIntermediateFile | |
| { | |
| my $message = shift; | |
| open my $output, ">$intermediateFilePath" or | |
| &vivaHelper::ErrorHandler("Cannot open file $intermediateFilePath: $!", __FILE__, __LINE__); | |
| print $output $message; | |
| close $output; | |
| } | |
| #**************************************************************************** | |
| # subroutine: configFailLog | |
| # description: Output the config fail information. | |
| # input: Fail reason message, recommendation message | |
| # output: None | |
| #**************************************************************************** | |
| sub configFailLog | |
| { | |
| my ($failReason, $recommend) = @_; | |
| my $message = "Error: $failReason\nRecommend: $recommend\n"; | |
| printLog("\n$message"); | |
| open (FILE_HANDLE, ">$intermediateFilePath") or | |
| &vivaHelper::ErrorHandler("Cannot open file $intermediateFilePath: $!", __FILE__, __LINE__); | |
| print FILE_HANDLE $message; | |
| close FILE_HANDLE; | |
| exit ERR::CANNOT_ADJUST; | |
| } | |
| #**************************************************************************** | |
| # subroutine: configFail | |
| # description: Indicate the configuration is failed. | |
| # input: Fail code (constant with CONFIG_FAIL_XXXX) | |
| # output: None | |
| #**************************************************************************** | |
| sub configFail | |
| { | |
| my $failCode = shift; | |
| my $failReason; | |
| my $recommend; | |
| if ($failCode == CONFIG_FAIL_INSUFFICIENT_RAM) | |
| { | |
| my $exceeded = shift; | |
| $failReason = "Insufficient RAM space. ($exceeded bytes exceeded)"; | |
| $recommend = "Please turn off some features. (e.g. DCM_COMPRESSION_SUPPORT)"; | |
| } | |
| elsif ($failCode == CONFIG_FAIL_ZIMAGE_OVERFLOW) | |
| { | |
| my $exceeded = shift; | |
| $failReason = "ZIMAGE overflow. ($exceeded bytes exceeded)"; | |
| $recommend = "Please either\n (1) remove xxx.lib/xxx.obj from ZIMAGE, or\n (2) turn off some features" | |
| } | |
| elsif ($failCode == CONFIG_FAIL_FEATURE_NOT_ENABLED) | |
| { | |
| $failReason = "No configurable feature is enabled."; | |
| $recommend = "Please turn off some features and refer to build\\[BB]\\VIVA_DEBUG\\[BB].error for more information."; | |
| } | |
| elsif ($failCode == CONFIG_FAIL_NO_CONFIG_CHANGED) | |
| { | |
| $failReason = "The configuration is not changed."; | |
| $recommend = "Please turn off some features." | |
| } | |
| elsif ($failCode == CONFIG_FAIL_INSUFFICIENT_FLASH_SIZE) | |
| { | |
| my $exceeded = shift; | |
| $failReason = "Insufficient flash space. ($exceeded bytes exceeded)"; | |
| $recommend = "Please turn off some features." | |
| } | |
| elsif ($failCode == CONFIG_FAIL_INSUFFICIENT_RAM_FOR_BOOT_ZIMAGE) | |
| { | |
| my $exceeded = shift; | |
| $failReason = "Insufficient RAM space for BOOT_ZIMAGE. ($exceeded bytes exceeded)"; | |
| $recommend = "Please turn off some features. (e.g. DCM_COMPRESSION_SUPPORT)"; | |
| } | |
| else | |
| { | |
| $failReason = "Unknown."; | |
| $recommend = "Please call for help"; | |
| } | |
| &configFailLog($failReason, $recommend); | |
| } | |
| #**************************************************************************** | |
| # subroutine: min | |
| # description: Get the minimum one in the two input. | |
| # input: Number 1, number 2 | |
| # output: Minimum number | |
| #**************************************************************************** | |
| sub min | |
| { | |
| my ($m, $n) = @_; | |
| if ($m < $n) { | |
| $m | |
| } | |
| else { | |
| $n | |
| } | |
| } | |
| #**************************************************************************** | |
| # subroutine: getTimeStamp | |
| # description: Get a time stamp. | |
| # input: None | |
| # output: The time stamp | |
| #**************************************************************************** | |
| sub getTimeStamp | |
| { | |
| return time().".".int(rand(1000)); | |
| } | |
| #**************************************************************************** | |
| # subroutine: backupFile | |
| # description: Backup file with a timestamp appended. | |
| # input: Filename | |
| # output: None | |
| #**************************************************************************** | |
| sub backupFile | |
| { | |
| my $filename = shift; | |
| my $backupFilename = $filename.".beforeAutoAdj".getTimeStamp(); | |
| copy($filename, $backupFilename) or | |
| &vivaHelper::ErrorHandler("Cannot backup file $filename: $!", __FILE__, __LINE__); | |
| } | |
| sub printLog | |
| { | |
| print "$_[0]\n"; | |
| } | |
| sub debugLog | |
| { | |
| if ($DEBUG) | |
| { | |
| printLog("\t$_[0]"); | |
| } | |
| } | |
| # DEBUG command | |
| # tools\vivaConfig.pl .\build\KHAN50D_V11_DEMO\VIVA_DEBUG\KHAN50D_V11_DEMO_PCB01_gprs_MT6250_S00.lis.dummy .\build\KHAN50D_V11_DEMO\VIVA_DEBUG\KHAN50D_V11_DEMO_PCB01_gprs_MT6250_S00.MAUI_11BW1132SP_W12_15.bin_dummy .\custom\system\KHAN50D_V11_DEMO_BB .\make\KHAN50D_V11_DEMO_GPRS.mak ~flash_cfg_tmp.c intermediate.log aapmc.log > build\KHAN50D_V11_DEMO\log\vivaConfig.log |