2 * Copyright 2012 Red Hat Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
24 #define nv04_disp_root(p) container_of((p), struct nv04_disp_root, object)
28 #include <core/client.h>
30 #include <nvif/class.h>
31 #include <nvif/cl0046.h>
32 #include <nvif/unpack.h>
34 struct nv04_disp_root
{
35 struct nvkm_object object
;
36 struct nvkm_disp
*disp
;
40 nv04_disp_mthd(struct nvkm_object
*object
, u32 mthd
, void *data
, u32 size
)
42 struct nv04_disp_root
*root
= nv04_disp_root(object
);
44 struct nv04_disp_mthd_v0 v0
;
46 struct nvkm_head
*head
;
47 int id
, ret
= -ENOSYS
;
49 nvif_ioctl(object
, "disp mthd size %d\n", size
);
50 if (!(ret
= nvif_unpack(ret
, &data
, &size
, args
->v0
, 0, 0, true))) {
51 nvif_ioctl(object
, "disp mthd vers %d mthd %02x head %d\n",
52 args
->v0
.version
, args
->v0
.method
, args
->v0
.head
);
53 mthd
= args
->v0
.method
;
58 if (!(head
= nvkm_head_find(root
->disp
, id
)))
62 case NV04_DISP_SCANOUTPOS
:
63 return nvkm_head_mthd_scanoutpos(object
, head
, data
, size
);
71 static const struct nvkm_object_func
73 .mthd
= nv04_disp_mthd
,
74 .ntfy
= nvkm_disp_ntfy
,
78 nv04_disp_root_new(struct nvkm_disp
*disp
, const struct nvkm_oclass
*oclass
,
79 void *data
, u32 size
, struct nvkm_object
**pobject
)
81 struct nv04_disp_root
*root
;
83 if (!(root
= kzalloc(sizeof(*root
), GFP_KERNEL
)))
86 *pobject
= &root
->object
;
88 nvkm_object_ctor(&nv04_disp_root
, oclass
, &root
->object
);
92 const struct nvkm_disp_oclass
93 nv04_disp_root_oclass
= {
94 .base
.oclass
= NV04_DISP
,
97 .ctor
= nv04_disp_root_new
,