Home | History | Annotate | Download | only in hardware_Interrupt
      1 # Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 
      6 # DESCRIPTION :
      7 #
      8 # This is a hardware test for interrupts. The test reloads kernel module
      9 # to check if the hardware issues interrupts back to the host.
     10 
     11 
     12 import re
     13 import time
     14 import logging
     15 
     16 from autotest_lib.client.bin import test, utils
     17 from autotest_lib.client.common_lib import error
     18 
     19 
     20 class ProcInterrupts(object):
     21     """
     22     Parse /proc/interrupts and provide interfaces to access number of
     23     interrupts per module or per interrupt number/name
     24     """
     25 
     26     INTERRUPT_FILE='/proc/interrupts'
     27 
     28     def __init__(self):
     29         self._int_count = {}
     30         with open(self.INTERRUPT_FILE) as interrupts_file:
     31             lines = interrupts_file.readlines()
     32 
     33             # First line indicates CPUs in system
     34             num_cpus = len(lines.pop(0).split())
     35 
     36             for line in lines:
     37                 fields = line.split()
     38                 count = sum(map(int, fields[1:1 + num_cpus]))
     39                 interrupt = fields[0].strip().split(':')[0]
     40                 if interrupt.isdigit():
     41                     self._int_count[fields[-1]] = count
     42                     logging.debug('int[%s] = %d', fields[-1], count)
     43                     interrupt = int(interrupt)
     44                 self._int_count[interrupt] = count
     45                 logging.debug('int[%s] = %d', interrupt, count)
     46 
     47     def get(self, interrupt):
     48         if interrupt in self._int_count:
     49             logging.debug('got int[%s] = %d', interrupt,
     50                           self._int_count[interrupt])
     51             return self._int_count[interrupt]
     52         return 0
     53 
     54 
     55 class hardware_Interrupt(test.test):
     56     version = 1
     57 
     58     def run_once(self,
     59                  interrupt=None,
     60                  reload_module=None,
     61                  min_count=1):
     62         proc_int = ProcInterrupts()
     63         count = proc_int.get(interrupt)
     64 
     65         if reload_module:
     66             utils.system('rmmod %s' % reload_module)
     67             utils.system('modprobe %s' % reload_module)
     68             # Wait for procfs update
     69             time.sleep(1)
     70             proc_int = ProcInterrupts()
     71             count = proc_int.get(interrupt) - count
     72 
     73         if count < min_count:
     74             raise error.TestError('Interrupt test failed: int[%s] = %d < '
     75                                   'min_count %d' % (interrupt, count,
     76                                   min_count))
     77 
     78