OsdSchedule.c revision 1.17
1/*	$NetBSD: OsdSchedule.c,v 1.17 2013/12/27 18:53:25 christos Exp $	*/
2
3/*
4 * Copyright 2001 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 *    must display the following acknowledgement:
19 *	This product includes software developed for the NetBSD Project by
20 *	Wasabi Systems, Inc.
21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 *    or promote products derived from this software without specific prior
23 *    written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38/*
39 * OS Services Layer
40 *
41 * 6.3: Scheduling services
42 */
43
44#include <sys/cdefs.h>
45__KERNEL_RCSID(0, "$NetBSD: OsdSchedule.c,v 1.17 2013/12/27 18:53:25 christos Exp $");
46
47#include <sys/param.h>
48#include <sys/malloc.h>
49#include <sys/proc.h>
50#include <sys/systm.h>
51#include <sys/kernel.h>
52#include <sys/condvar.h>
53#include <sys/mutex.h>
54
55#include <dev/acpi/acpica.h>
56
57#include <dev/acpi/acpi_osd.h>
58
59#include <dev/sysmon/sysmon_taskq.h>
60
61extern int acpi_suspended;
62
63#define	_COMPONENT	ACPI_OS_SERVICES
64ACPI_MODULE_NAME("SCHEDULE")
65
66static kcondvar_t	acpi_osd_sleep_cv;
67static kmutex_t		acpi_osd_sleep_mtx;
68
69/*
70 * acpi_osd_sched_init:
71 *
72 *	Initialize the APCICA Osd scheduler.  Called from AcpiOsInitialize().
73 */
74void
75acpi_osd_sched_init(void)
76{
77	sysmon_task_queue_init();
78	mutex_init(&acpi_osd_sleep_mtx, MUTEX_DEFAULT, IPL_NONE);
79	cv_init(&acpi_osd_sleep_cv, "acpislp");
80}
81
82/*
83 * AcpiOsGetThreadId:
84 *
85 *	Obtain the ID of the currently executing thread.
86 */
87ACPI_THREAD_ID
88AcpiOsGetThreadId(void)
89{
90	return (ACPI_THREAD_ID)(uintptr_t)curlwp;
91}
92
93/*
94 * AcpiOsQueueForExecution:
95 *
96 *	Schedule a procedure for deferred execution.
97 */
98ACPI_STATUS
99AcpiOsExecute(ACPI_EXECUTE_TYPE Type, ACPI_OSD_EXEC_CALLBACK Function,
100    void *Context)
101{
102	int pri;
103
104	switch (Type) {
105	case OSL_GPE_HANDLER:
106		pri = 10;
107		break;
108	case OSL_GLOBAL_LOCK_HANDLER:
109	case OSL_EC_POLL_HANDLER:
110	case OSL_EC_BURST_HANDLER:
111		pri = 5;
112		break;
113	case OSL_NOTIFY_HANDLER:
114		pri = 3;
115		break;
116	case OSL_DEBUGGER_THREAD:
117		pri = 0;
118		break;
119	default:
120		return AE_BAD_PARAMETER;
121	}
122
123	switch (sysmon_task_queue_sched(pri, Function, Context)) {
124	case 0:
125		return AE_OK;
126
127	case ENOMEM:
128		return AE_NO_MEMORY;
129
130	default:
131		return AE_BAD_PARAMETER;
132	}
133}
134
135/*
136 * AcpiOsSleep:
137 *
138 *	Suspend the running task (coarse granularity).
139 */
140void
141AcpiOsSleep(ACPI_INTEGER Milliseconds)
142{
143
144	if (cold || doing_shutdown || acpi_suspended)
145		DELAY(Milliseconds * 1000);
146	else {
147		mutex_enter(&acpi_osd_sleep_mtx);
148		cv_timedwait_sig(&acpi_osd_sleep_cv, &acpi_osd_sleep_mtx,
149		    MAX(mstohz(Milliseconds), 1));
150		mutex_exit(&acpi_osd_sleep_mtx);
151	}
152}
153
154/*
155 * AcpiOsStall:
156 *
157 *	Suspend the running task (fine granularity).
158 */
159void
160AcpiOsStall(UINT32 Microseconds)
161{
162
163	delay(Microseconds);
164}
165
166/*
167 * AcpiOsGetTimer:
168 *
169 *	Get the current system time in 100 nanosecond units
170 */
171UINT64
172AcpiOsGetTimer(void)
173{
174	struct timeval tv;
175	UINT64 t;
176
177	/* XXX During early boot there is no (decent) timer available yet. */
178	if (cold)
179		panic("acpi: timer op not yet supported during boot");
180
181	microtime(&tv);
182	t = (UINT64)10 * tv.tv_usec;
183	t += (UINT64)10000000 * tv.tv_sec;
184
185	return t;
186}
187
188/*
189 *
190 * AcpiOsWaitEventsComplete:
191 *
192 * 	Wait for all asynchronous events to complete. This implementation
193 *	does nothing.
194 */
195void
196AcpiOsWaitEventsComplete(void)
197{
198	return;
199}
200