1/*
2 * Copyright 2007-2012 Haiku, Inc.  All rights reserved.
3 * Distributed under the terms of the MIT license.
4 *
5 * Authors:
6 *		Gerald Zajac
7 */
8
9
10#include "accelerant.h"
11#include "i810_regs.h"
12
13
14static engine_token sEngineToken = { 1, B_2D_ACCELERATION, NULL };
15
16
17uint32
18AccelerantEngineCount(void)
19{
20	return 1;
21}
22
23
24status_t
25AcquireEngine(uint32 capabilities, uint32 maxWait,
26	sync_token* syncToken, engine_token** engineToken)
27{
28	(void)capabilities;	// avoid compiler warning for unused arg
29	(void)maxWait;		// avoid compiler warning for unused arg
30
31	if (gInfo.sharedInfo->engineLock.Acquire() != B_OK)
32		return B_ERROR;
33
34	if (syncToken)
35		SyncToToken(syncToken);
36
37	*engineToken = &sEngineToken;
38	return B_OK;
39}
40
41
42status_t
43ReleaseEngine(engine_token* engineToken, sync_token* syncToken)
44{
45	if (syncToken)
46		GetSyncToken(engineToken, syncToken);
47
48	gInfo.sharedInfo->engineLock.Release();
49	return B_OK;
50}
51
52
53void
54WaitEngineIdle(void)
55{
56	// Wait until engine is idle.
57
58	int k = 10000000;
59
60	while ((INREG16(INST_DONE) & 0x7B) != 0x7B && k > 0)
61		k--;
62}
63
64
65status_t
66GetSyncToken(engine_token* engineToken, sync_token* syncToken)
67{
68	syncToken->engine_id = engineToken->engine_id;
69	syncToken->counter = 0;
70	return B_OK;
71}
72
73
74status_t
75SyncToToken(sync_token* syncToken)
76{
77	(void)syncToken;
78		// avoid compiler warning for unused arg
79
80	WaitEngineIdle();
81	return B_OK;
82}
83