blob: a05ad4024a6a0e4de78969ccba966267cfd34b1a [file] [log] [blame]
Chia-I Wu9737a102014-08-07 07:59:51 +08001/*
2 * XGL
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#include "kmd/winsys.h"
26#include "dev.h"
27#include "mem.h"
28#include "event.h"
29
30static XGL_RESULT event_map(struct intel_event *event, uint32_t **ptr_ret)
31{
32 void *ptr;
33
34 if (!event->obj.mem)
35 return XGL_ERROR_MEMORY_NOT_BOUND;
36
37 /*
38 * This is an unsynchronous mapping. It doesn't look like we want a
39 * synchronous mapping. But it is also unclear what would happen when GPU
40 * writes to it at the same time. We need atomicy here.
41 */
42 ptr = intel_mem_map(event->obj.mem, 0);
43 if (!ptr)
44 return XGL_ERROR_MEMORY_MAP_FAILED;
45
46 *ptr_ret = (uint32_t *) ((uint8_t *) ptr + event->obj.offset);
47
48 return XGL_SUCCESS;
49}
50
51static void event_unmap(struct intel_event *event)
52{
53 intel_mem_unmap(event->obj.mem);
54}
55
56static XGL_RESULT event_write(struct intel_event *event, uint32_t val)
57{
58 XGL_RESULT ret;
59 uint32_t *ptr;
60
61 ret = event_map(event, &ptr);
62 if (ret == XGL_SUCCESS) {
63 *ptr = val;
64 event_unmap(event);
65 }
66
67 return ret;
68}
69
70static XGL_RESULT event_read(struct intel_event *event, uint32_t *val)
71{
72 XGL_RESULT ret;
73 uint32_t *ptr;
74
75 ret = event_map(event, &ptr);
76 if (ret == XGL_SUCCESS) {
77 *val = *ptr;
78 event_unmap(event);
79 }
80
81 return ret;
82}
83
Chia-I Wu26f0bd02014-08-07 10:38:40 +080084static void event_destroy(struct intel_obj *obj)
Chia-I Wu9737a102014-08-07 07:59:51 +080085{
86 struct intel_event *event = intel_event_from_obj(obj);
87
88 intel_event_destroy(event);
89}
90
Chia-I Wu26f0bd02014-08-07 10:38:40 +080091static XGL_RESULT event_get_info(struct intel_base *base, int type,
92 XGL_SIZE *size, XGL_VOID *data)
93{
94 XGL_RESULT ret = XGL_SUCCESS;
95
96 switch (type) {
97 case XGL_INFO_TYPE_MEMORY_REQUIREMENTS:
98 {
99 XGL_MEMORY_REQUIREMENTS *mem_req = data;
100
101 /* use dword aligned to 64-byte boundaries */
102 mem_req->size = 4;
103 mem_req->alignment = 64;
104 mem_req->heapCount = 1;
105 mem_req->heaps[0] = 0;
106
107 *size = sizeof(*mem_req);
108 }
109 break;
110 default:
111 ret = intel_base_get_info(base, type, size, data);
112 break;
113 }
114
115 return ret;
116}
117
Chia-I Wu9737a102014-08-07 07:59:51 +0800118XGL_RESULT intel_event_create(struct intel_dev *dev,
119 const XGL_EVENT_CREATE_INFO *info,
120 struct intel_event **event_ret)
121{
122 struct intel_event *event;
Chia-I Wu9737a102014-08-07 07:59:51 +0800123
Chia-I Wubbf2c932014-08-07 12:20:08 +0800124 event = (struct intel_event *) intel_base_create(sizeof(*event),
125 dev->base.dbg, XGL_DBG_OBJECT_EVENT, info, 0);
Chia-I Wu9737a102014-08-07 07:59:51 +0800126 if (!event)
127 return XGL_ERROR_OUT_OF_MEMORY;
128
Chia-I Wu26f0bd02014-08-07 10:38:40 +0800129 event->obj.base.get_info = event_get_info;
Chia-I Wubbf2c932014-08-07 12:20:08 +0800130 event->obj.destroy = event_destroy;
Chia-I Wu9737a102014-08-07 07:59:51 +0800131
132 *event_ret = event;
133
134 return XGL_SUCCESS;
135}
136
137void intel_event_destroy(struct intel_event *event)
138{
Chia-I Wubbf2c932014-08-07 12:20:08 +0800139 intel_base_destroy(&event->obj.base);
Chia-I Wu9737a102014-08-07 07:59:51 +0800140}
141
142XGL_RESULT intel_event_set(struct intel_event *event)
143{
144 return event_write(event, 1);
145}
146
147XGL_RESULT intel_event_reset(struct intel_event *event)
148{
149 return event_write(event, 0);
150}
151
152XGL_RESULT intel_event_get_status(struct intel_event *event)
153{
154 XGL_RESULT ret;
155 uint32_t val;
156
157 ret = event_read(event, &val);
158 if (ret != XGL_SUCCESS)
159 return ret;
160
161 return (val) ? XGL_EVENT_SET : XGL_EVENT_RESET;
162}
163
164XGL_RESULT XGLAPI intelCreateEvent(
165 XGL_DEVICE device,
166 const XGL_EVENT_CREATE_INFO* pCreateInfo,
167 XGL_EVENT* pEvent)
168{
169 struct intel_dev *dev = intel_dev(device);
170
171 return intel_event_create(dev, pCreateInfo,
172 (struct intel_event **) pEvent);
173}
174
175XGL_RESULT XGLAPI intelGetEventStatus(
176 XGL_EVENT event_)
177{
178 struct intel_event *event = intel_event(event_);
179
180 return intel_event_get_status(event);
181}
182
183XGL_RESULT XGLAPI intelSetEvent(
184 XGL_EVENT event_)
185{
186 struct intel_event *event = intel_event(event_);
187
188 return intel_event_set(event);
189}
190
191XGL_RESULT XGLAPI intelResetEvent(
192 XGL_EVENT event_)
193{
194 struct intel_event *event = intel_event(event_);
195
196 return intel_event_reset(event);
197}