drm/nouveau/ltc: s/ltcg/ltc/ + cleanup
[cascardo/linux.git] / drivers / gpu / drm / nouveau / core / subdev / ltc / base.c
1 /*
2  * Copyright 2014 Red Hat Inc.
3  *
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:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
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.
21  *
22  * Authors: Ben Skeggs <bskeggs@redhat.com>
23  */
24
25 #include "priv.h"
26
27 static int
28 nvkm_ltc_tags_alloc(struct nouveau_ltc *ltc, u32 n,
29                     struct nouveau_mm_node **pnode)
30 {
31         struct nvkm_ltc_priv *priv = (void *)ltc;
32         int ret;
33
34         ret = nouveau_mm_head(&priv->tags, 1, n, n, 1, pnode);
35         if (ret)
36                 *pnode = NULL;
37
38         return ret;
39 }
40
41 static void
42 nvkm_ltc_tags_free(struct nouveau_ltc *ltc, struct nouveau_mm_node **pnode)
43 {
44         struct nvkm_ltc_priv *priv = (void *)ltc;
45         nouveau_mm_free(&priv->tags, pnode);
46 }
47
48 static void
49 nvkm_ltc_tags_clear(struct nouveau_ltc *ltc, u32 first, u32 count)
50 {
51         const struct nvkm_ltc_impl *impl = (void *)nv_oclass(ltc);
52         struct nvkm_ltc_priv *priv = (void *)ltc;
53         const u32 limit = first + count - 1;
54
55         BUG_ON((first > limit) || (limit >= priv->num_tags));
56
57         impl->cbc_clear(priv, first, limit);
58         impl->cbc_wait(priv);
59 }
60
61 int
62 nvkm_ltc_create_(struct nouveau_object *parent, struct nouveau_object *engine,
63                  struct nouveau_oclass *oclass, int length, void **pobject)
64 {
65         const struct nvkm_ltc_impl *impl = (void *)oclass;
66         struct nvkm_ltc_priv *priv;
67         int ret;
68
69         ret = nouveau_subdev_create_(parent, engine, oclass, 0, "PLTCG",
70                                      "l2c", length, pobject);
71         priv = *pobject;
72         if (ret)
73                 return ret;
74
75         priv->base.base.intr = impl->intr;
76         priv->base.tags_alloc = nvkm_ltc_tags_alloc;
77         priv->base.tags_free = nvkm_ltc_tags_free;
78         priv->base.tags_clear = nvkm_ltc_tags_clear;
79         return 0;
80 }