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