blob: 3d7c36b4a9435b6c6fb04fe25e54bac34989f041 [file] [log] [blame] [edit]
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import glob
import os
import logging
import subprocess
def chrome_vmodule_flag():
"""Return vmodule flag for chrome to enable VDAs/VEAs/JDAs/V4L2IP logs"""
logging_patterns = ['*/media/gpu/*video_decode_accelerator.cc=2',
'*/media/gpu/*video_encode_accelerator.cc=2',
'*/media/gpu/*jpeg_decode_accelerator.cc=2',
'*/media/gpu/*image_processor.cc=2',
'*/media/gpu/v4l2/v4l2_device.cc=2']
chrome_video_vmodule_flag = '--vmodule=' + ','.join(logging_patterns)
logging.info('chrome video vmodule flag: %s', chrome_video_vmodule_flag)
return chrome_video_vmodule_flag
def video_log_wrapper(func):
"""
Return decorator that make verbose video logs enable
before test and make them disable after completing test.
@param func: function, the test function, e.g., run_once
@returns decorator function
"""
vlog = VideoLog()
#videobuf2 log
files = glob.glob('/sys/module/videobuf2_*/parameters/debug')
vlog.add_log(files,
['1'] * len(files),
['0'] * len(files),
'videobuf2 log')
#s5p_mfc log
fpath = '/sys/module/s5p_mfc/parameters/debug'
if os.path.exists(fpath):
vlog.add_log([fpath],
['1'],
['0'],
's5p_mfc log')
#rk3399 log
#rk3399 debug level is controlled by bits.
#Here, 3 means to enable log level 0 and 1.
fpath = '/sys/module/rockchip_vpu/parameters/debug'
if os.path.exists(fpath):
vlog.add_log([fpath],
['3'],
['0'],
'rk3399 log')
#rk3288 log
#rk3288 debug level is controlled by bits.
#Here, 3 means to enable log level 0 and 1.
fpath = '/sys/module/rk3288_vpu/parameters/debug'
if os.path.exists(fpath):
vlog.add_log([fpath],
['3'],
['0'],
'rk3288 log')
#go2001 log
fpath = '/sys/module/go2001/parameters/go2001_debug_level'
if os.path.exists(fpath):
vlog.add_log([fpath],
['1'],
['0'],
'go2001 log')
def call(*args, **kwargs):
"""
Enable logs before the test, execute the test and disable logs
after the test.
In any case, it is guranteed to disable logs.
"""
with vlog:
return func(*args, **kwargs)
return call
def cmdexec_with_log(cmd, info_message):
"""
Execute command, logging infomation message.
@param cmd: string, command to be executed
@param info_message: string, the messages to be shown in log message
"""
try:
logging.info('%s : %s', info_message, cmd)
subprocess.check_call(cmd, shell=True)
except subprocess.CalledProcessError:
logging.warning('Fail to execute command [%s] : %s',
info_message, cmd)
class VideoLog:
"""
Enable/Disable video logs.
"""
def __init__(self):
self.logs = []
def add_log(self, files, enable_values, disable_values, log_name):
"""
Add new log
@param files: list of string, file paths
@param enable_values: list of string, the list of value
to write to each file path for enabling
@param disable_values: list of string, the list of value
to write to each file path for disabling
@param log_name: string, name to be shown in log message
"""
self.logs.append({'files': files,
'enable values': enable_values,
'disable values': disable_values,
'log name': log_name})
def __enter__(self):
"""Enable logs"""
for log in self.logs:
log_name = log['log name']
for f, ev in zip(log['files'], log['enable values']):
cmdexec_with_log('echo %s > %s' % (ev, f),
'%s enable' % log_name)
def __exit__(self, exception_type, exception_value, traceback):
"""Disable logs"""
for log in self.logs:
log_name = log['log name']
for f, dv in zip(log['files'], log['disable values']):
cmdexec_with_log('echo %s > %s' % (dv, f),
'%s disable' % log_name)