78 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
| # Copyright (c) 2012 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.
 | |
| 
 | |
| 
 | |
| # DESCRIPTION :
 | |
| #
 | |
| # This is a hardware test for interrupts. The test reloads kernel module
 | |
| # to check if the hardware issues interrupts back to the host.
 | |
| 
 | |
| 
 | |
| import re
 | |
| import time
 | |
| import logging
 | |
| 
 | |
| from autotest_lib.client.bin import test, utils
 | |
| from autotest_lib.client.common_lib import error
 | |
| 
 | |
| 
 | |
| class ProcInterrupts(object):
 | |
|     """
 | |
|     Parse /proc/interrupts and provide interfaces to access number of
 | |
|     interrupts per module or per interrupt number/name
 | |
|     """
 | |
| 
 | |
|     INTERRUPT_FILE='/proc/interrupts'
 | |
| 
 | |
|     def __init__(self):
 | |
|         self._int_count = {}
 | |
|         with open(self.INTERRUPT_FILE) as interrupts_file:
 | |
|             lines = interrupts_file.readlines()
 | |
| 
 | |
|             # First line indicates CPUs in system
 | |
|             num_cpus = len(lines.pop(0).split())
 | |
| 
 | |
|             for line in lines:
 | |
|                 fields = line.split()
 | |
|                 count = sum(map(int, fields[1:1 + num_cpus]))
 | |
|                 interrupt = fields[0].strip().split(':')[0]
 | |
|                 if interrupt.isdigit():
 | |
|                     self._int_count[fields[-1]] = count
 | |
|                     logging.debug('int[%s] = %d', fields[-1], count)
 | |
|                     interrupt = int(interrupt)
 | |
|                 self._int_count[interrupt] = count
 | |
|                 logging.debug('int[%s] = %d', interrupt, count)
 | |
| 
 | |
|     def get(self, interrupt):
 | |
|         if interrupt in self._int_count:
 | |
|             logging.debug('got int[%s] = %d', interrupt,
 | |
|                           self._int_count[interrupt])
 | |
|             return self._int_count[interrupt]
 | |
|         return 0
 | |
| 
 | |
| 
 | |
| class hardware_Interrupt(test.test):
 | |
|     version = 1
 | |
| 
 | |
|     def run_once(self,
 | |
|                  interrupt=None,
 | |
|                  reload_module=None,
 | |
|                  min_count=1):
 | |
|         proc_int = ProcInterrupts()
 | |
|         count = proc_int.get(interrupt)
 | |
| 
 | |
|         if reload_module:
 | |
|             utils.system('rmmod %s' % reload_module)
 | |
|             utils.system('modprobe %s' % reload_module)
 | |
|             # Wait for procfs update
 | |
|             time.sleep(1)
 | |
|             proc_int = ProcInterrupts()
 | |
|             count = proc_int.get(interrupt) - count
 | |
| 
 | |
|         if count < min_count:
 | |
|             raise error.TestError('Interrupt test failed: int[%s] = %d < '
 | |
|                                   'min_count %d' % (interrupt, count,
 | |
|                                   min_count))
 | |
| 
 |