]> Pileus Git - ~andy/linux/commit
ACPI: implement acpi_os_get_timer() according the spec
authorMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 23 May 2013 07:27:46 +0000 (10:27 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 27 Jun 2013 19:38:15 +0000 (21:38 +0200)
commit10619066a353f27fe3700a448fa2b21643687840
treef78d6f192c720fb1675ea93a1412dcea89a03b58
parenteff9a4b62b14cf0d9913e3caf1f26f8b7a6105c9
ACPI: implement acpi_os_get_timer() according the spec

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: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/osl.c