2  * Copyright (c) 2014 Apple Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  29 #include <IOKit/IOInterruptAccountingPrivate.h> 
  30 #include <IOKit/IOKernelReporters.h> 
  32 uint32_t gInterruptAccountingStatisticBitmask 
= 
  33         /* Disable timestamps for older ARM platforms; they are expensive. */ 
  34         IA_GET_ENABLE_BIT(kInterruptAccountingFirstLevelTimeIndex
) | 
  35         IA_GET_ENABLE_BIT(kInterruptAccountingSecondLevelCPUTimeIndex
) | 
  36         IA_GET_ENABLE_BIT(kInterruptAccountingSecondLevelSystemTimeIndex
) | 
  37         IA_GET_ENABLE_BIT(kInterruptAccountingFirstLevelCountIndex
) | 
  38         IA_GET_ENABLE_BIT(kInterruptAccountingSecondLevelCountIndex
); 
  40 IOLock 
* gInterruptAccountingDataListLock 
= NULL
; 
  41 queue_head_t gInterruptAccountingDataList
; 
  43 void interruptAccountingInit(void) 
  47         if (PE_parse_boot_argn("interrupt_accounting", &bootArgValue
, sizeof(bootArgValue
))) 
  48                 gInterruptAccountingStatisticBitmask 
= bootArgValue
; 
  50         gInterruptAccountingDataListLock 
= IOLockAlloc(); 
  52         assert(gInterruptAccountingDataListLock
); 
  54         queue_init(&gInterruptAccountingDataList
); 
  57 void interruptAccountingDataAddToList(IOInterruptAccountingData 
* data
) 
  59         IOLockLock(gInterruptAccountingDataListLock
); 
  60         queue_enter(&gInterruptAccountingDataList
, data
, IOInterruptAccountingData 
*, chain
);  
  61         IOLockUnlock(gInterruptAccountingDataListLock
); 
  64 void interruptAccountingDataRemoveFromList(IOInterruptAccountingData 
* data
) 
  66         IOLockLock(gInterruptAccountingDataListLock
); 
  67         queue_remove(&gInterruptAccountingDataList
, data
, IOInterruptAccountingData 
*, chain
);  
  68         IOLockUnlock(gInterruptAccountingDataListLock
); 
  71 void interruptAccountingDataUpdateChannels(IOInterruptAccountingData 
* data
, IOSimpleReporter 
* reporter
) 
  75         for (i 
= 0; i 
< IA_NUM_INTERRUPT_ACCOUNTING_STATISTICS
; i
++) { 
  76                 if (IA_GET_STATISTIC_ENABLED(i
)) 
  77                 reporter
->setValue(IA_GET_CHANNEL_ID(data
->interruptIndex
, i
), data
->interruptStatistics
[i
]); 
  81 void interruptAccountingDataInheritChannels(IOInterruptAccountingData 
* data
, IOSimpleReporter 
* reporter
) 
  85         for (i 
= 0; i 
< IA_NUM_INTERRUPT_ACCOUNTING_STATISTICS
; i
++) { 
  86                 if (IA_GET_STATISTIC_ENABLED(i
)) 
  87                 data
->interruptStatistics
[i
] = reporter
->getValue(IA_GET_CHANNEL_ID(data
->interruptIndex
, i
));