blob: 604cf3caa955293cbb9106f7a41fda803d47b595 [file] [log] [blame]
#!/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:
#* ---------
#* zImageConfig.pl
#*
#* Project:
#* --------
#*
#*
#* Description:
#* ------------
#* This script parse scatter file and
#* 1. force generate custom_scatstruct.h if update required
#* 2. force generate custom_scatstruct.c if update required
#* 3. force generate custom_blconfig.c if update required
#*
#* Author:
#* -------
#* Ken Lin (mtk02554)
#*
#*============================================================================
#* HISTORY
#* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
#*------------------------------------------------------------------------------
#* $Revision$
#* $Modtime$
#* $Log$
#*
#* 05 22 2014 tafang.chen
#* [MOLY00062786] [UMOLY][SM]
#* Initial MoDIS build env - fix path problem.
#*
#*
#*------------------------------------------------------------------------------
#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
#*============================================================================
#****************************************************************************/
#****************************************************************************
# Included Modules
#****************************************************************************
use strict;
BEGIN { push @INC, "pcore/" , '.\\pcore\\tools\\' } # add additional library path
use auto_adjust_mem; #pm file name without case sensitivity
use File::Copy;
#****************************************************************************
# Constants
#****************************************************************************
my $ZIMAGECONFIG_VERNO = " v0.11";
# v0.11 , show healthy check error on the console
# v0.10 , AAPMC auto check-in support
# v0.09 , deduct the dcm share pool from $max_compressed_size
# v0.08 , detect if ZIMAGE overflows as a healthy check in advance
# v0.07 , take cached dummy end into account in free ram size calculation
# v0.06 , healthy check for RAM leakage
# v0.05 , align interface of DemandPagingConfig.pl
# v0.04 , get zimage config in custom_FeatureConfig.h
# v0.03 , get FS base address in ~flash_cfg_tmp.c
# v0.02 , take DCM into account
# v0.01 , initial draft
#****************************************************************************
# File Names
#****************************************************************************
my $LIS_FILE = $ARGV[0];
my $DUMMY_ZIMAGE = $ARGV[1];
my $CUSTOM_EMI_RELEASE_H = $ARGV[2] . '\\' . "custom_EMI_release.h";
my $CUSTOM_FEATURE_CONFIG_H = $ARGV[2] . '\\' . "custom_FeatureConfig.h";
my $MAKEFILE = $ARGV[3];
my $FLASH_CFG_TMP_C = $ARGV[4];
my $INTERMEDIATE_FILE = $ARGV[5];
my $LOG_PATH = $ARGV[6];
# to align error message file name format
$LIS_FILE =~ s/^.\\|^\\//;
$DUMMY_ZIMAGE =~ s/^.\\|^\\//;
$CUSTOM_EMI_RELEASE_H =~ s/^.\\|^\\//;
$CUSTOM_FEATURE_CONFIG_H =~ s/^.\\|^\\//;
$MAKEFILE =~ s/^.\\|^\\//;
$FLASH_CFG_TMP_C =~ s/^.\\|^\\//;
$INTERMEDIATE_FILE =~ s/^.\\|^\\//;
$LOG_PATH =~ s/^.\\|^\\//;
my $DebugPrint = 1; # 1 for debug; 0 for non-debug
#****************************************************************************
# 0 >>> Print out input parameters for checking
#****************************************************************************
if ($DebugPrint == 1) {
print "LIS_FILE: $LIS_FILE\n";
print "DUMMY_ZIMAGE: $DUMMY_ZIMAGE\n";
print "CUSTOM_EMI_RELEASE_H: $CUSTOM_EMI_RELEASE_H\n";
print "CUSTOM_FEATURE_CONFIG_H: $CUSTOM_FEATURE_CONFIG_H\n";
print "MAKEFILE: $MAKEFILE\n";
print "FLASH_CFG_TMP_C: $FLASH_CFG_TMP_C\n";
print "INTERMEDIATE_FILE: $INTERMEDIATE_FILE\n";
print "LOG_PATH: $LOG_PATH\n";
print "\n";
}
#****************************************************************************
# 1 >>> Parse Makefile
#****************************************************************************
# assumption: same category should be put together
use constant FEATURE_NAME => 0;
use constant CATEGORY => 1;
use constant LOAD_REGION => 2;
use constant SWITCH => 3;
use constant SIZE => 4;
my @feature_option = (
# feature name category load region switch(OFF) size
['MP4_DECODE', 'video', 'DYNAMIC_COMP_MP4DEC', 0, 0],
['H264_DECODE', 'video', 'DYNAMIC_COMP_H264DEC', 0, 0],
['MP4_ENCODE', 'video', 'DYNAMIC_COMP_MP4ENC', 0, 0],
['BES_LOUDNESS_SUPPORT', 'audio', 'DYNAMIC_COMP_BESLOUDNESS', 0, 0],
['BT_AUDIO_VIA_SCO', 'audio', 'DYNAMIC_COMP_RESAMPLE', 0, 0],
['BT_A2DP_PROFILE', 'audio', 'DYNAMIC_COMP_SBC', 0, 0],
);
my $auto_config;
print "Starting stage1 ... \n" if($DebugPrint == 1);
&error_handler("$MAKEFILE: NOT exist!", __FILE__, __LINE__) if (!-e $MAKEFILE);
open (FILE_HANDLE, "<$MAKEFILE") or &error_handler("$MAKEFILE: file error!", __FILE__, __LINE__);
while (<FILE_HANDLE>) {
if (/^(\S+)\s*=\s*TRUE/) {
# DCM
foreach $_ (@feature_option) {
if ($_->[FEATURE_NAME] eq $1) {
$_->[SWITCH] = 1; # ON
}
}
# ZIMAGE_AUTO_CONFIG
if ($1 eq 'ZIMAGE_AUTO_CONFIG') {
$auto_config = 1;
}
}
}
print "\n";
#****************************************************************************
# 2 >>> Parse LIS File
#****************************************************************************
my $total_rom;
my $basic_rom_size;
my $rw_bound;
my $dsp_tx_reserved;
my $dsp_rx_reserved;
my $orig_zimage_size;
my $static_zimage_size;
my $dcm_rom_size;
my $dcm_ram_size;
print "Starting stage2 ... \n" if($DebugPrint == 1);
&error_handler("$LIS_FILE: NOT exist!", __FILE__, __LINE__) if (!-e $LIS_FILE);
open (FILE_HANDLE, "<$LIS_FILE") or &error_handler("$LIS_FILE: file error!", __FILE__, __LINE__);
while (<FILE_HANDLE>) {
if (/Total ROM Size \(Code \+ RO Data \+ RW Data\)\s+(\S+)/) {
$total_rom = $1;
}
elsif (/Execution Region ROM1 \(Base: (\S+), Size: (\S+)/) {
$basic_rom_size = (hex($1) & hex("0x07FFFFFF")) + hex($2);
}
elsif (/Execution Region DYNAMIC_CACHEABLE_EXTSRAM_DEFAULT_CACHEABLE_ZI \(Base: (\S+), Size: (\S+)/) {
$rw_bound = (hex($1) & hex("0x07FFFFFF")) + hex($2);
}
elsif (/Execution Region EXTSRAM_DSP_TX \(Base: (\S+), Size: (\S+), Max: (\S+)/) {
$dsp_tx_reserved = hex($3);
}
elsif (/Execution Region EXTSRAM_DSP_RX \(Base: (\S+), Size: (\S+), Max: (\S+)/) {
$dsp_rx_reserved = hex($3);
}
elsif (/Load Region ZIMAGE \(Base: (\S+), Size: (\S+)/) {
$orig_zimage_size = hex($2);
}
elsif (/Execution Region ZIMAGE \(Base: (\S+), Size: (\S+)/) {
$static_zimage_size = hex($2);
}
# DCM RO
if (/Load Region (\S+) \(Base: (\S+), Size: (\S+)/) {
foreach $_ (@feature_option) {
if ($_->[SWITCH] == 1 && $_->[LOAD_REGION] eq $1) {
$_->[SIZE] = hex($3); # ON
$dcm_rom_size += hex($3);
}
}
}
}
close (FILE_HANDLE);
# calculate $dcm_ram_size
my $current_category = $feature_option[0][1];
my $category_max_size;
foreach $_ (@feature_option) {
print "$_->[FEATURE_NAME], $_->[CATEGORY], $_->[LOAD_REGION], $_->[SWITCH], $_->[SIZE]\n" if($DebugPrint == 1);
# next category
if ($current_category ne $_->[CATEGORY]) {
$dcm_ram_size += $category_max_size;
$category_max_size = $_->[SIZE];
$current_category = $_->[CATEGORY];
}
# same category, then update the max size
elsif ($category_max_size < $_->[SIZE]) {
$category_max_size = $_->[SIZE];
}
}
$dcm_ram_size += $category_max_size; # last category
print "\n" if($DebugPrint == 1);
if ($DebugPrint == 1) {
print "total_rom: $total_rom\n";
print "basic_rom_size: $basic_rom_size\n";
print "rw_bound: $rw_bound\n";
print "dsp_tx_reserved: $dsp_tx_reserved\n";
print "dsp_rx_reserved: $dsp_rx_reserved\n";
print "orig_zimage_size: $orig_zimage_size\n";
print "static_zimage_size: $static_zimage_size\n";
print "dcm_rom_size: $dcm_rom_size\n";
print "dcm_ram_size: $dcm_ram_size\n";
print "\n";
}
#****************************************************************************
# 3 >>> Parse custom_FeatureConfig.h
#****************************************************************************
my $orig_decompressed_size;
my $orig_max_compressed_size;
print "Starting stage3 ... \n" if($DebugPrint == 1);
&error_handler("$CUSTOM_FEATURE_CONFIG_H: NOT exist!", __FILE__, __LINE__) if (!-e $CUSTOM_FEATURE_CONFIG_H);
open (FILE_HANDLE, "<$CUSTOM_FEATURE_CONFIG_H") or &error_handler("$CUSTOM_FEATURE_CONFIG_H: file error!", __FILE__, __LINE__);
while (<FILE_HANDLE>) {
if (/\#define CONFIG_ZIMAGE_DECOMPRESSED_SIZE\s+((\S|\s)+)/) {
$orig_decompressed_size = hex($1);
}
elsif (/\#define CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE\s+((\S|\s)+)/) {
$orig_max_compressed_size = hex($1);
}
}
close (FILE_HANDLE);
if ($DebugPrint == 1) {
print "orig_decompressed_size: $orig_decompressed_size\n";
print "orig_max_compressed_size: $orig_max_compressed_size\n";
print "\n";
}
#****************************************************************************
# 4 >>> Parse custom_EMI_release.h (EMI_EXTSRAM_SIZE)
#****************************************************************************
my $max_ram;
my $ram_bound;
print "Starting stage4 ... \n" if($DebugPrint == 1);
&error_handler("$CUSTOM_EMI_RELEASE_H: NOT exist!", __FILE__, __LINE__) if (!-e $CUSTOM_EMI_RELEASE_H);
open (FILE_HANDLE, "<$CUSTOM_EMI_RELEASE_H") or &error_handler("$CUSTOM_EMI_RELEASE_H: file error!", __FILE__, __LINE__);
while (<FILE_HANDLE>) {
if (/\#define EMI_EXTSRAM_SIZE ((\S|\s)+)/) {
$max_ram = eval($1);
last;
}
}
close (FILE_HANDLE);
$ram_bound = $max_ram - $dsp_tx_reserved - $dsp_rx_reserved;
if ($DebugPrint == 1) {
print "max_ram: $max_ram\n";
print "ram_bound: $ram_bound\n";
print "\n";
}
#****************************************************************************
# 5 >>> Parse ~flash_cfg_tmp.c
#****************************************************************************
my $fs_base_addr;
print "Starting stage5 ... \n" if($DebugPrint == 1);
&error_handler("$FLASH_CFG_TMP_C: NOT exist!", __FILE__, __LINE__) if (!-e $FLASH_CFG_TMP_C);
open (FILE_HANDLE, "<$FLASH_CFG_TMP_C") or &error_handler("$FLASH_CFG_TMP_C: file error!", __FILE__, __LINE__);
while (<FILE_HANDLE>) {
if (/int flash_base_address\s+=\s+((\S|\s)+);/) {
$fs_base_addr = eval($1);
}
}
close (FILE_HANDLE);
if ($DebugPrint == 1) {
print "fs_base_addr: $fs_base_addr\n";
print "\n";
}
#****************************************************************************
# 6 >>> Calculate compression ratio
#****************************************************************************
my $zimage_size;
my $compression_ratio;
print "Starting stage6 ... \n" if($DebugPrint == 1);
$zimage_size = -s $DUMMY_ZIMAGE;
$compression_ratio = $zimage_size / $orig_zimage_size;
if ($DebugPrint == 1) {
print "zimage_size: $zimage_size\n";
print "compression_ratio: $compression_ratio\n";
print "\n";
}
#****************************************************************************
# 7 >>> Calculate CONFIG_ZIMAGE_DECOMPRESSED_SIZE
# & CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE
#****************************************************************************
my $decompressed_size;
my $max_compressed_size;
my $free_ram_size;
my $max_decompressed_size;
my $cached_dummy_end_size = 4;
print "Starting stage7 ... \n" if($DebugPrint == 1);
# calculate $free_ram_size & $max_decompressed_size
$free_ram_size = $ram_bound - $rw_bound - $cached_dummy_end_size;
$max_decompressed_size = $total_rom - $basic_rom_size;
# calculate $decompressed_size & $max_compressed_size
$decompressed_size = min($free_ram_size, $max_decompressed_size);
$max_compressed_size = int(($decompressed_size - $dcm_ram_size) * $compression_ratio + 0.99); # ceil
if ($DebugPrint == 1) {
print "basic_rom_size: $basic_rom_size\n";
print "free_ram_size: $free_ram_size\n";
print "max_decompressed_size: $max_decompressed_size\n";
print "decompressed_size: $decompressed_size\n";
print "max_compressed_size: $max_compressed_size\n";
print "\n";
}
#****************************************************************************
# 8 >>> Healthy check
#****************************************************************************
my $actual_rom_size;
my $total_compressed_size;
my $alignment = 4 * 1024;
print "Starting stage8 ... \n" if($DebugPrint == 1);
# health check (1)
if ($decompressed_size - $dcm_ram_size <= 0) {
my $exceeded = -($decompressed_size - $dcm_ram_size);
&write_log($INTERMEDIATE_FILE, "Error: Insufficient RAM space. ($exceeded bytes exceeded)\nRecommend: Please turn off some features. (e.g. DCM_COMPRESSION_SUPPORT)\n");
exit ERR::CANNOT_ADJUST;
}
$actual_rom_size = $total_rom - ($decompressed_size - $dcm_ram_size) - $dcm_rom_size;
$total_compressed_size = int(($decompressed_size + $dcm_rom_size) * $compression_ratio + 0.99); # ceil
if ($DebugPrint == 1) {
print "actual_rom_size: $actual_rom_size\n";
print "total_compressed_size: $total_compressed_size\n";
print "\n";
}
# health check (2)
if ($actual_rom_size + $total_compressed_size >= $fs_base_addr) {
my $exceeded = $actual_rom_size + $total_compressed_size - $fs_base_addr;
&write_log($INTERMEDIATE_FILE, "Error: Insufficient flash space. ($exceeded bytes exceeded)\nRecommend: Please turn off some features.\n");
exit ERR::CANNOT_ADJUST;
}
# health check (3)
if ($free_ram_size < 0) {
my $exceeded = -$free_ram_size;
&write_log($INTERMEDIATE_FILE, "Error: Insufficient RAM space. ($exceeded bytes exceeded)\nRecommend: Please turn off some features.\n");
exit ERR::CANNOT_ADJUST;
}
# make alignment (floor)
$decompressed_size = int($decompressed_size / $alignment) * $alignment;
$max_compressed_size = int($max_compressed_size / $alignment) * $alignment;
# health check (4)
if (($decompressed_size - $dcm_ram_size) <= $static_zimage_size) {
my $exceeded = $static_zimage_size - ($decompressed_size - $dcm_ram_size);
&write_log($INTERMEDIATE_FILE, "Error: ZIMAGE overflow. ($exceeded bytes exceeded)\nRecommend: Please either\n (1) remove xxx.lib/xxx.obj from ZIMAGE, or\n (2) turn off some features\n");
exit ERR::CANNOT_ADJUST;
}
# health check (5)
if ($decompressed_size == $orig_decompressed_size && $max_compressed_size == $orig_max_compressed_size) {
&write_log($INTERMEDIATE_FILE, "Error: Invalid configuration.\nRecommend: Please call for help.\n");
exit ERR::CANNOT_ADJUST;
}
#****************************************************************************
# 9 >>> Output
#****************************************************************************
my $err;
print "Starting stage9 ... \n" if($DebugPrint == 1);
# convert to hex
$orig_decompressed_size = sprintf("0x%X", $orig_decompressed_size);
$orig_max_compressed_size = sprintf("0x%X", $orig_max_compressed_size);
$decompressed_size = sprintf("0x%X", $decompressed_size);
$max_compressed_size = sprintf("0x%X", $max_compressed_size);
if ($auto_config) {
if( ERR::AAPMCLOG_SUCCESS == &AAPMCLogParser::Open($LOG_PATH)) {
my $P4Info_ref = &AUTO_ADJUST::CreateP4InfoTemplate("mtk01892", "", "zImage auto config",
"[Before]\n($orig_decompressed_size, $orig_max_compressed_size)\n[After]\n($decompressed_size, $max_compressed_size)\n");
my %ChangeList = (
'CONFIG_ZIMAGE_DECOMPRESSED_SIZE' => $decompressed_size,
'CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE' => $max_compressed_size,
);
$err = &AAPMCLogParser::AddOneChangeRecord($CUSTOM_FEATURE_CONFIG_H, \%ChangeList, \%$P4Info_ref);
if($err == ERR::ERR_MODIFYDUPLICATED) {
print "can't modified more than twice\n";
}
elsif ($err == ERR::AAPMCLOG_SUCCESS) {
print "add successfully!\n";
&write_log($INTERMEDIATE_FILE, "[Before auto adjustment]\nCONFIG_ZIMAGE_DECOMPRESSED_SIZE=$orig_decompressed_size\nCONFIG_ZIMAGE_MAX_COMPRESSED_SIZE=$orig_max_compressed_size\n[After auto adjustment]\nRECOMMAND: CONFIG_ZIMAGE_DECOMPRESSED_SIZE=$decompressed_size\nRECOMMAND: CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE=$max_compressed_size\n");
}
&AAPMCLogParser::Close($LOG_PATH);
}
else {
print "load AAPMCLog failed";
}
}
else {
print "No modification\n";
&write_log($INTERMEDIATE_FILE, "[Before auto adjustment]\nCONFIG_ZIMAGE_DECOMPRESSED_SIZE=$orig_decompressed_size\nCONFIG_ZIMAGE_MAX_COMPRESSED_SIZE=$orig_max_compressed_size\n[After auto adjustment]\nRECOMMAND: CONFIG_ZIMAGE_DECOMPRESSED_SIZE=$decompressed_size\nRECOMMAND: CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE=$max_compressed_size\n");
exit ERR::NO_MODIFY;
}
#****************************************************************************
# oo >>> Finished
#****************************************************************************
exit $err;
#****************************************************************************
# subroutine: min
# input: $m, $n
#****************************************************************************
sub min
{
my ($m, $n) = @_;
if ($m < $n) {
$m
}
else {
$n
}
}
#****************************************************************************
# subroutine: error_handler
# input: $error_msg: error message
# $file: filename
# $line_no: line number
#****************************************************************************
sub error_handler
{
my ($error_msg, $file, $line_no) = @_;
print "ZIMAGE CONFIG ERROR: $error_msg at $file line $line_no\n";
my $final_error_msg = "ZIMAGE CONFIG ERROR: $error_msg at $file line $line_no\n";
die $final_error_msg;
}
#****************************************************************************
# subroutine: write_log
# input: $log_path
#****************************************************************************
sub write_log
{
my ($log_path, $message) = @_;
print $message;
open (FILE_HANDLE, ">$log_path") or &error_handler("Cannot open log: $log_path\n", __FILE__, __LINE__);
print FILE_HANDLE $message;
close FILE_HANDLE;
}