xref: /openbmc/linux/drivers/gpu/drm/nouveau/nvif/event.c (revision f43e47c0)
1*f43e47c0SBen Skeggs /*
2*f43e47c0SBen Skeggs  * Copyright 2021 Red Hat Inc.
3*f43e47c0SBen Skeggs  *
4*f43e47c0SBen Skeggs  * Permission is hereby granted, free of charge, to any person obtaining a
5*f43e47c0SBen Skeggs  * copy of this software and associated documentation files (the "Software"),
6*f43e47c0SBen Skeggs  * to deal in the Software without restriction, including without limitation
7*f43e47c0SBen Skeggs  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*f43e47c0SBen Skeggs  * and/or sell copies of the Software, and to permit persons to whom the
9*f43e47c0SBen Skeggs  * Software is furnished to do so, subject to the following conditions:
10*f43e47c0SBen Skeggs  *
11*f43e47c0SBen Skeggs  * The above copyright notice and this permission notice shall be included in
12*f43e47c0SBen Skeggs  * all copies or substantial portions of the Software.
13*f43e47c0SBen Skeggs  *
14*f43e47c0SBen Skeggs  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*f43e47c0SBen Skeggs  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*f43e47c0SBen Skeggs  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*f43e47c0SBen Skeggs  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*f43e47c0SBen Skeggs  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*f43e47c0SBen Skeggs  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*f43e47c0SBen Skeggs  * OTHER DEALINGS IN THE SOFTWARE.
21*f43e47c0SBen Skeggs  */
22*f43e47c0SBen Skeggs #include <nvif/event.h>
23*f43e47c0SBen Skeggs #include <nvif/printf.h>
24*f43e47c0SBen Skeggs 
25*f43e47c0SBen Skeggs #include <nvif/class.h>
26*f43e47c0SBen Skeggs #include <nvif/if000e.h>
27*f43e47c0SBen Skeggs 
28*f43e47c0SBen Skeggs int
nvif_event_block(struct nvif_event * event)29*f43e47c0SBen Skeggs nvif_event_block(struct nvif_event *event)
30*f43e47c0SBen Skeggs {
31*f43e47c0SBen Skeggs 	if (nvif_event_constructed(event)) {
32*f43e47c0SBen Skeggs 		int ret = nvif_mthd(&event->object, NVIF_EVENT_V0_BLOCK, NULL, 0);
33*f43e47c0SBen Skeggs 		NVIF_ERRON(ret, &event->object, "[BLOCK]");
34*f43e47c0SBen Skeggs 		return ret;
35*f43e47c0SBen Skeggs 	}
36*f43e47c0SBen Skeggs 	return 0;
37*f43e47c0SBen Skeggs }
38*f43e47c0SBen Skeggs 
39*f43e47c0SBen Skeggs int
nvif_event_allow(struct nvif_event * event)40*f43e47c0SBen Skeggs nvif_event_allow(struct nvif_event *event)
41*f43e47c0SBen Skeggs {
42*f43e47c0SBen Skeggs 	if (nvif_event_constructed(event)) {
43*f43e47c0SBen Skeggs 		int ret = nvif_mthd(&event->object, NVIF_EVENT_V0_ALLOW, NULL, 0);
44*f43e47c0SBen Skeggs 		NVIF_ERRON(ret, &event->object, "[ALLOW]");
45*f43e47c0SBen Skeggs 		return ret;
46*f43e47c0SBen Skeggs 	}
47*f43e47c0SBen Skeggs 	return 0;
48*f43e47c0SBen Skeggs }
49*f43e47c0SBen Skeggs 
50*f43e47c0SBen Skeggs void
nvif_event_dtor(struct nvif_event * event)51*f43e47c0SBen Skeggs nvif_event_dtor(struct nvif_event *event)
52*f43e47c0SBen Skeggs {
53*f43e47c0SBen Skeggs 	nvif_object_dtor(&event->object);
54*f43e47c0SBen Skeggs }
55*f43e47c0SBen Skeggs 
56*f43e47c0SBen Skeggs int
nvif_event_ctor_(struct nvif_object * parent,const char * name,u32 handle,nvif_event_func func,bool wait,struct nvif_event_v0 * args,u32 argc,bool warn,struct nvif_event * event)57*f43e47c0SBen Skeggs nvif_event_ctor_(struct nvif_object *parent, const char *name, u32 handle, nvif_event_func func,
58*f43e47c0SBen Skeggs 		 bool wait, struct nvif_event_v0 *args, u32 argc, bool warn,
59*f43e47c0SBen Skeggs 		 struct nvif_event *event)
60*f43e47c0SBen Skeggs {
61*f43e47c0SBen Skeggs 	struct nvif_event_v0 _args;
62*f43e47c0SBen Skeggs 	int ret;
63*f43e47c0SBen Skeggs 
64*f43e47c0SBen Skeggs 	if (!args) {
65*f43e47c0SBen Skeggs 		args = &_args;
66*f43e47c0SBen Skeggs 		argc = sizeof(_args);
67*f43e47c0SBen Skeggs 	}
68*f43e47c0SBen Skeggs 
69*f43e47c0SBen Skeggs 	args->version = 0;
70*f43e47c0SBen Skeggs 	args->wait = wait;
71*f43e47c0SBen Skeggs 
72*f43e47c0SBen Skeggs 	ret = nvif_object_ctor(parent, name ?: "nvifEvent", handle,
73*f43e47c0SBen Skeggs 			       NVIF_CLASS_EVENT, args, argc, &event->object);
74*f43e47c0SBen Skeggs 	NVIF_ERRON(ret && warn, parent, "[NEW EVENT wait:%d size:%zd]",
75*f43e47c0SBen Skeggs 		   args->wait, argc - sizeof(*args));
76*f43e47c0SBen Skeggs 	if (ret)
77*f43e47c0SBen Skeggs 		return ret;
78*f43e47c0SBen Skeggs 
79*f43e47c0SBen Skeggs 	event->func = func;
80*f43e47c0SBen Skeggs 	return 0;
81*f43e47c0SBen Skeggs }
82