• M
    ACPI: implement acpi_os_get_timer() according the spec · 10619066
    Mika Westerberg 提交于
    ACPI Timer() opcode should return monotonically increasing clock with 100ns
    granularity according the ACPI 5.0 spec.
    
    Testing the current Timer() implementation with following ASL code (and an
    additional debug print in acpi_os_sleep() to get the sleep times dumped out
    to dmesg):
    
    	// Test: 10ms
    	Store(Timer, Local1)
    	Sleep(10)
    	Divide(Subtract(Timer, Local1), 10000,, Local1)
    	Sleep(Local1)
    
    	// Test: 200ms
    	Store(Timer, Local1)
    	Sleep(200)
    	Divide(Subtract(Timer, Local1), 10000,, Local1)
    	Sleep(Local1)
    
    	// Test 1300ms
    	Store(Timer, Local1)
    	Sleep(1300)
    	Divide(Subtract(Timer, Local1), 10000,, Local1)
    	Sleep(Local1)
    
    The second sleep value is calculated using Timer(). If the implementation
    is good enough we should be able to get the second value pretty close to
    the first.
    
    However, the current Timer() gives pretty bad sleep times:
    
    	[   11.488100] ACPI: acpi_os_get_timer() TBD
    	[   11.492150] ACPI: Sleep(10)
    	[   11.502993] ACPI: Sleep(0)
    	[   11.506315] ACPI: Sleep(200)
    	[   11.706237] ACPI: Sleep(0)
    	[   11.709550] ACPI: Sleep(1300)
    	[   13.008929] ACPI: Sleep(0)
    
    Fix this with the help of ktime_get(). Once the fix is applied and run
    against the same ASL code we get:
    
    	[   11.486786] ACPI: Sleep(10)
    	[   11.499029] ACPI: Sleep(12)
    	[   11.512350] ACPI: Sleep(200)
    	[   11.712282] ACPI: Sleep(200)
    	[   11.912170] ACPI: Sleep(1300)
    	[   13.211577] ACPI: Sleep(1300)
    
    That is much more closer to the values we expected.
    Signed-off-by: NMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
    10619066
osl.c 41.7 KB