Skip to content
Snippets Groups Projects
dcc.py 2.61 KiB
Newer Older
# Copyright (c) 2015, The Linux Foundation. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 and
# only version 2 as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

import struct
from print_out import print_out_str
from ramparse import VERSION

dcc_register_list = [
    'DCC_HW_VERSION',
    'DCC_HW_INFO',
    'DCC_CGC_CFG',
    'DCC_LL',
    'DCC_RAM_CFG',
    'DCC_CFG',
    'DCC_SW_CTL',
    'DCC_STATUS',
    'DCC_FETCH_ADDR',
    'DCC_SRAM_ADDR',
    'DCC_INT_ENABLE',
    'DCC_INT_STATUS',
    'DCC_QSB_CFG'
    ]

# DCC regs hash table
dcc_regs = {}

class DccRegDump():

    def __init__(self, start, end):
        self.start_addr = start
        self.end_addr = end

    def parse_all_regs(self, ram_dump):
        num_reg = len(dcc_register_list)
        if (self.start_addr + 4 * num_reg) > self.end_addr:
                return False

        for reg in dcc_register_list:
                dcc_regs[reg] = ram_dump.read_u32(self.start_addr, False)
                self.start_addr += 4
        return True

    def dump_all_regs(self, ram_dump):
        outfile = ram_dump.open_file('dcc_regs.txt')
        outfile.write('DCC registers:\n')
        for reg in dcc_register_list:
                outfile.write('{0} : 0x{1:08x}\n'.format(reg, dcc_regs[reg]))
        outfile.close()

class DccSramDump():
    def __init__(self, start, end):
        self.start_addr = start
        self.end_addr = end

    def dump_sram_img(self, ram_dump):
        if self.start_addr >= self.end_addr:
                return False

        rsz = self.end_addr - self.start_addr

        if dcc_regs.has_key('DCC_HW_INFO') == False \
                        or dcc_regs['DCC_HW_INFO'] == 0:
            print_out_str('DCC HW Info missing! Skipping sram dump...')
            return False

        if dcc_regs['DCC_CFG'] & 0x1:
            print_out_str('DCC is configured in CRC mode. Skipping sram dump ...')
            return False

        if dcc_regs['DCC_RAM_CFG'] == 0:
            print_out_str('No config found in DCC SRAM. Skipping sram dump ...')
            return False

        sramfile = ram_dump.open_file('sram.bin')
        for i in range(0, rsz):
            val = ram_dump.read_byte(self.start_addr + i, False)
            sramfile.write(struct.pack('<B', val))

        sramfile.close()

        return True