aboutsummaryrefslogtreecommitdiff
path: root/drivers/gpu/pvr/servicesint.h
blob: a81adff8f49bf58ff6480b8c358b5e27c3bbb0a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/**********************************************************************
 *
 * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful but, except
 * as otherwise stated in writing, without any warranty; without even the
 * implied warranty of merchantability or fitness for a particular purpose.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * The full GNU General Public License is included in this distribution in
 * the file called "COPYING".
 *
 * Contact Information:
 * Imagination Technologies Ltd. <gpl-support@imgtec.com>
 * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
 *
 ******************************************************************************/

#if !defined(__SERVICESINT_H__)
#define __SERVICESINT_H__


#include "services.h"
#include "sysinfo.h"

#define HWREC_DEFAULT_TIMEOUT		500

#define DRIVERNAME_MAXLENGTH		100

struct PVRSRV_KERNEL_MEM_INFO {

	void *pvLinAddrKM;
	struct IMG_DEV_VIRTADDR sDevVAddr;
	u32 ui32Flags;
	u32 ui32AllocSize;
	struct PVRSRV_MEMBLK sMemBlk;

	void *pvSysBackupBuffer;

	u32 ui32RefCount;

	struct PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo;
};

struct PVRSRV_KERNEL_SYNC_INFO {
	struct PVRSRV_SYNC_DATA *psSyncData;
	struct IMG_DEV_VIRTADDR sWriteOpsCompleteDevVAddr;
	struct IMG_DEV_VIRTADDR sReadOpsCompleteDevVAddr;
	struct PVRSRV_KERNEL_MEM_INFO *psSyncDataMemInfoKM;

	/*
	 * This stores the physical address of the buffer that
	 * this syncobject manages (if provided)
	 */
	struct IMG_SYS_PHYADDR phys_addr;
	void *dev_cookie;
	u32 refcount;
};

struct PVRSRV_DEVICE_SYNC_OBJECT {

	u32 ui32ReadOpsPendingVal;
	struct IMG_DEV_VIRTADDR sReadOpsCompleteDevVAddr;
	u32 ui32WriteOpsPendingVal;
	struct IMG_DEV_VIRTADDR sWriteOpsCompleteDevVAddr;
};

struct PVRSRV_SYNC_OBJECT {
	struct PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfoKM;
	u32 ui32WriteOpsPending;
	u32 ui32ReadOpsPending;
};

struct PVRSRV_COMMAND {
	u32 ui32CmdSize;
	u32 ui32DevIndex;
	u32 CommandType;
	u32 ui32DstSyncCount;
	u32 ui32SrcSyncCount;
	struct PVRSRV_SYNC_OBJECT *psDstSync;
	struct PVRSRV_SYNC_OBJECT *psSrcSync;
	u32 ui32DataSize;
	u32 ui32ProcessID;
	void *pvData;
};

struct PVRSRV_QUEUE_INFO {
	void *pvLinQueueKM;
	void *pvLinQueueUM;
	volatile u32 ui32ReadOffset;
	volatile u32 ui32WriteOffset;
	u32 *pui32KickerAddrKM;
	u32 *pui32KickerAddrUM;
	u32 ui32QueueSize;

	u32 ui32ProcessID;

	void *hMemBlock[2];

	struct PVRSRV_QUEUE_INFO *psNextKM;
};

struct PVRSRV_DEVICECLASS_BUFFER {
	enum PVRSRV_ERROR (*pfnGetBufferAddr)(void *, void *,
				    struct IMG_SYS_PHYADDR **, u32 *,
				    void __iomem **, void **, IMG_BOOL *);
	void *hDevMemContext;
	void *hExtDevice;
	void *hExtBuffer;
	struct PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo;
};

struct PVRSRV_CLIENT_DEVICECLASS_INFO {
	void *hDeviceKM;
	void *hServices;
};

static inline u32 PVRSRVGetWriteOpsPending(
		struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo, IMG_BOOL bIsReadOp)
{
	u32 ui32WriteOpsPending;

	if (bIsReadOp)
		ui32WriteOpsPending =
		    psSyncInfo->psSyncData->ui32WriteOpsPending;
	else
		ui32WriteOpsPending =
		    psSyncInfo->psSyncData->ui32WriteOpsPending++;

	return ui32WriteOpsPending;
}

static inline u32 PVRSRVGetReadOpsPending(
		struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo, IMG_BOOL bIsReadOp)
{
	u32 ui32ReadOpsPending;

	if (bIsReadOp)
		ui32ReadOpsPending =
		    psSyncInfo->psSyncData->ui32ReadOpsPending++;
	else
		ui32ReadOpsPending = psSyncInfo->psSyncData->ui32ReadOpsPending;

	return ui32ReadOpsPending;
}

enum PVRSRV_ERROR PVRSRVQueueCommand(void *hQueueInfo,
				    struct PVRSRV_COMMAND *psCommand);

enum PVRSRV_ERROR PVRSRVGetMMUContextPDDevPAddr(
			const struct PVRSRV_CONNECTION *psConnection,
			void *hDevMemContext,
			struct IMG_DEV_PHYADDR *sPDDevPAddr);

enum PVRSRV_ERROR PVRSRVAllocSharedSysMem(
			const struct PVRSRV_CONNECTION *psConnection,
			u32 ui32Flags, u32 ui32Size,
			struct PVRSRV_CLIENT_MEM_INFO **ppsClientMemInfo);

enum PVRSRV_ERROR PVRSRVFreeSharedSysMem(
			const struct PVRSRV_CONNECTION *psConnection,
			struct PVRSRV_CLIENT_MEM_INFO *psClientMemInfo);

enum PVRSRV_ERROR PVRSRVUnrefSharedSysMem(
			const struct PVRSRV_CONNECTION *psConnection,
			struct PVRSRV_CLIENT_MEM_INFO *psClientMemInfo);

enum PVRSRV_ERROR PVRSRVMapMemInfoMem(
			const struct PVRSRV_CONNECTION *psConnection,
			void *hKernelMemInfo,
			struct PVRSRV_CLIENT_MEM_INFO **ppsClientMemInfo);

#endif