105c7145dSBen Skeggs /*
205c7145dSBen Skeggs  * Copyright 2012 Red Hat Inc.
305c7145dSBen Skeggs  *
405c7145dSBen Skeggs  * Permission is hereby granted, free of charge, to any person obtaining a
505c7145dSBen Skeggs  * copy of this software and associated documentation files (the "Software"),
605c7145dSBen Skeggs  * to deal in the Software without restriction, including without limitation
705c7145dSBen Skeggs  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
805c7145dSBen Skeggs  * and/or sell copies of the Software, and to permit persons to whom the
905c7145dSBen Skeggs  * Software is furnished to do so, subject to the following conditions:
1005c7145dSBen Skeggs  *
1105c7145dSBen Skeggs  * The above copyright notice and this permission notice shall be included in
1205c7145dSBen Skeggs  * all copies or substantial portions of the Software.
1305c7145dSBen Skeggs  *
1405c7145dSBen Skeggs  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1505c7145dSBen Skeggs  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1605c7145dSBen Skeggs  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1705c7145dSBen Skeggs  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1805c7145dSBen Skeggs  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1905c7145dSBen Skeggs  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2005c7145dSBen Skeggs  * OTHER DEALINGS IN THE SOFTWARE.
2105c7145dSBen Skeggs  *
2205c7145dSBen Skeggs  * Authors: Ben Skeggs
2305c7145dSBen Skeggs  */
24f5e45689SBen Skeggs #include "chan.h"
25d94470e9SBen Skeggs #include "runl.h"
26f5e45689SBen Skeggs 
2705c7145dSBen Skeggs #include "nv50.h"
289a65a38cSBen Skeggs #include "channv50.h"
2905c7145dSBen Skeggs 
30f5e45689SBen Skeggs #include <nvif/class.h>
31f5e45689SBen Skeggs 
32f5e45689SBen Skeggs const struct nvkm_chan_func
33f5e45689SBen Skeggs g84_chan = {
34f5e45689SBen Skeggs };
35f5e45689SBen Skeggs 
36d94470e9SBen Skeggs const struct nvkm_engn_func
37d94470e9SBen Skeggs g84_engn = {
38d94470e9SBen Skeggs };
39d94470e9SBen Skeggs 
40*d67f3b96SBen Skeggs static void
41*d67f3b96SBen Skeggs g84_fifo_nonstall_block(struct nvkm_event *event, int type, int index)
4205c7145dSBen Skeggs {
43*d67f3b96SBen Skeggs 	struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), nonstall.event);
44*d67f3b96SBen Skeggs 	unsigned long flags;
45*d67f3b96SBen Skeggs 
46*d67f3b96SBen Skeggs 	spin_lock_irqsave(&fifo->lock, flags);
47*d67f3b96SBen Skeggs 	nvkm_mask(fifo->engine.subdev.device, 0x002140, 0x40000000, 0x00000000);
48*d67f3b96SBen Skeggs 	spin_unlock_irqrestore(&fifo->lock, flags);
4905c7145dSBen Skeggs }
5005c7145dSBen Skeggs 
51*d67f3b96SBen Skeggs static void
52*d67f3b96SBen Skeggs g84_fifo_nonstall_allow(struct nvkm_event *event, int type, int index)
539a65a38cSBen Skeggs {
54*d67f3b96SBen Skeggs 	struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), nonstall.event);
55*d67f3b96SBen Skeggs 	unsigned long flags;
56*d67f3b96SBen Skeggs 
57*d67f3b96SBen Skeggs 	spin_lock_irqsave(&fifo->lock, flags);
58*d67f3b96SBen Skeggs 	nvkm_mask(fifo->engine.subdev.device, 0x002140, 0x40000000, 0x40000000);
59*d67f3b96SBen Skeggs 	spin_unlock_irqrestore(&fifo->lock, flags);
609a65a38cSBen Skeggs }
619a65a38cSBen Skeggs 
62*d67f3b96SBen Skeggs const struct nvkm_event_func
63*d67f3b96SBen Skeggs g84_fifo_nonstall = {
64*d67f3b96SBen Skeggs 	.init = g84_fifo_nonstall_allow,
65*d67f3b96SBen Skeggs 	.fini = g84_fifo_nonstall_block,
66*d67f3b96SBen Skeggs };
67*d67f3b96SBen Skeggs 
68d94470e9SBen Skeggs int
6964f7c698SBen Skeggs g84_fifo_engine_id(struct nvkm_fifo *base, struct nvkm_engine *engine)
7064f7c698SBen Skeggs {
7164f7c698SBen Skeggs 	switch (engine->subdev.type) {
7264f7c698SBen Skeggs 	case NVKM_ENGINE_SW    : return G84_FIFO_ENGN_SW;
7364f7c698SBen Skeggs 	case NVKM_ENGINE_GR    : return G84_FIFO_ENGN_GR;
7464f7c698SBen Skeggs 	case NVKM_ENGINE_MPEG  :
7564f7c698SBen Skeggs 	case NVKM_ENGINE_MSPPP : return G84_FIFO_ENGN_MPEG;
7664f7c698SBen Skeggs 	case NVKM_ENGINE_CE    : return G84_FIFO_ENGN_CE0;
7764f7c698SBen Skeggs 	case NVKM_ENGINE_VP    :
7864f7c698SBen Skeggs 	case NVKM_ENGINE_MSPDEC: return G84_FIFO_ENGN_VP;
7964f7c698SBen Skeggs 	case NVKM_ENGINE_CIPHER:
8064f7c698SBen Skeggs 	case NVKM_ENGINE_SEC   : return G84_FIFO_ENGN_CIPHER;
8164f7c698SBen Skeggs 	case NVKM_ENGINE_BSP   :
8264f7c698SBen Skeggs 	case NVKM_ENGINE_MSVLD : return G84_FIFO_ENGN_BSP;
8364f7c698SBen Skeggs 	case NVKM_ENGINE_DMAOBJ: return G84_FIFO_ENGN_DMA;
8464f7c698SBen Skeggs 	default:
8564f7c698SBen Skeggs 		WARN_ON(1);
8664f7c698SBen Skeggs 		return -1;
8764f7c698SBen Skeggs 	}
8864f7c698SBen Skeggs }
8964f7c698SBen Skeggs 
90d94470e9SBen Skeggs static int
91d94470e9SBen Skeggs g84_fifo_runl_ctor(struct nvkm_fifo *fifo)
92d94470e9SBen Skeggs {
93d94470e9SBen Skeggs 	struct nvkm_runl *runl;
94d94470e9SBen Skeggs 
95d94470e9SBen Skeggs 	runl = nvkm_runl_new(fifo, 0, 0, 0);
96d94470e9SBen Skeggs 	if (IS_ERR(runl))
97d94470e9SBen Skeggs 		return PTR_ERR(runl);
98d94470e9SBen Skeggs 
99d94470e9SBen Skeggs 	nvkm_runl_add(runl, 0, fifo->func->engn_sw, NVKM_ENGINE_SW, 0);
100d94470e9SBen Skeggs 	nvkm_runl_add(runl, 0, fifo->func->engn_sw, NVKM_ENGINE_DMAOBJ, 0);
101d94470e9SBen Skeggs 	nvkm_runl_add(runl, 1, fifo->func->engn, NVKM_ENGINE_GR, 0);
102d94470e9SBen Skeggs 	nvkm_runl_add(runl, 2, fifo->func->engn, NVKM_ENGINE_MPEG, 0);
103d94470e9SBen Skeggs 	nvkm_runl_add(runl, 3, fifo->func->engn, NVKM_ENGINE_ME, 0);
104d94470e9SBen Skeggs 	nvkm_runl_add(runl, 4, fifo->func->engn, NVKM_ENGINE_VP, 0);
105d94470e9SBen Skeggs 	nvkm_runl_add(runl, 5, fifo->func->engn, NVKM_ENGINE_CIPHER, 0);
106d94470e9SBen Skeggs 	nvkm_runl_add(runl, 6, fifo->func->engn, NVKM_ENGINE_BSP, 0);
107d94470e9SBen Skeggs 	return 0;
108d94470e9SBen Skeggs }
109d94470e9SBen Skeggs 
1108f0649b5SBen Skeggs static const struct nvkm_fifo_func
11113de7f46SBen Skeggs g84_fifo = {
11213de7f46SBen Skeggs 	.dtor = nv50_fifo_dtor,
11313de7f46SBen Skeggs 	.oneinit = nv50_fifo_oneinit,
1148c18138cSBen Skeggs 	.chid_nr = nv50_fifo_chid_nr,
115800ac1f8SBen Skeggs 	.chid_ctor = nv50_fifo_chid_ctor,
116d94470e9SBen Skeggs 	.runl_ctor = g84_fifo_runl_ctor,
11713de7f46SBen Skeggs 	.init = nv50_fifo_init,
11813de7f46SBen Skeggs 	.intr = nv04_fifo_intr,
11964f7c698SBen Skeggs 	.engine_id = g84_fifo_engine_id,
12013de7f46SBen Skeggs 	.pause = nv04_fifo_pause,
12113de7f46SBen Skeggs 	.start = nv04_fifo_start,
122*d67f3b96SBen Skeggs 	.nonstall = &g84_fifo_nonstall,
123d94470e9SBen Skeggs 	.runl = &nv50_runl,
124d94470e9SBen Skeggs 	.engn = &g84_engn,
125d94470e9SBen Skeggs 	.engn_sw = &nv50_engn_sw,
126f5e45689SBen Skeggs 	.cgrp = {{                          }, &nv04_cgrp },
127f5e45689SBen Skeggs 	.chan = {{ 0, 0, G82_CHANNEL_GPFIFO }, &g84_chan, .oclass = &g84_fifo_gpfifo_oclass },
1288f0649b5SBen Skeggs };
1298f0649b5SBen Skeggs 
13013de7f46SBen Skeggs int
131ab0db2bdSBen Skeggs g84_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
132ab0db2bdSBen Skeggs 	     struct nvkm_fifo **pfifo)
13305c7145dSBen Skeggs {
134ab0db2bdSBen Skeggs 	return nv50_fifo_new_(&g84_fifo, device, type, inst, pfifo);
13505c7145dSBen Skeggs }
136