1bd6c5cabSBen Skeggs /* 2bd6c5cabSBen Skeggs * Copyright 2012 Red Hat Inc. 3bd6c5cabSBen Skeggs * 4bd6c5cabSBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 5bd6c5cabSBen Skeggs * copy of this software and associated documentation files (the "Software"), 6bd6c5cabSBen Skeggs * to deal in the Software without restriction, including without limitation 7bd6c5cabSBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8bd6c5cabSBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the 9bd6c5cabSBen Skeggs * Software is furnished to do so, subject to the following conditions: 10bd6c5cabSBen Skeggs * 11bd6c5cabSBen Skeggs * The above copyright notice and this permission notice shall be included in 12bd6c5cabSBen Skeggs * all copies or substantial portions of the Software. 13bd6c5cabSBen Skeggs * 14bd6c5cabSBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15bd6c5cabSBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16bd6c5cabSBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17bd6c5cabSBen Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18bd6c5cabSBen Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19bd6c5cabSBen Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20bd6c5cabSBen Skeggs * OTHER DEALINGS IN THE SOFTWARE. 21bd6c5cabSBen Skeggs * 22bd6c5cabSBen Skeggs * Authors: Ben Skeggs 23bd6c5cabSBen Skeggs */ 24bd6c5cabSBen Skeggs #include <engine/ce.h> 25e5ff1127SBen Skeggs #include <engine/fifo.h> 26bd6c5cabSBen Skeggs 27e5ff1127SBen Skeggs #include <nvif/class.h> 28bd6c5cabSBen Skeggs 29bd6c5cabSBen Skeggs static void 30bd6c5cabSBen Skeggs gk104_ce_intr(struct nvkm_subdev *subdev) 31bd6c5cabSBen Skeggs { 3229e9f510SBen Skeggs struct nvkm_device *device = subdev->device; 33d9261a68SBen Skeggs const int idx = nv_subidx(subdev) - NVDEV_ENGINE_CE0; 3429e9f510SBen Skeggs u32 stat = nvkm_rd32(device, 0x104908 + (idx * 0x1000)); 35bd6c5cabSBen Skeggs 36bd6c5cabSBen Skeggs if (stat) { 371eed206fSBen Skeggs nvkm_warn(subdev, "intr %08x\n", stat); 3829e9f510SBen Skeggs nvkm_wr32(device, 0x104908 + (idx * 0x1000), stat); 39bd6c5cabSBen Skeggs } 40bd6c5cabSBen Skeggs } 41bd6c5cabSBen Skeggs 42e5ff1127SBen Skeggs static const struct nvkm_engine_func 43e5ff1127SBen Skeggs gk104_ce = { 44e5ff1127SBen Skeggs .sclass = { 45e5ff1127SBen Skeggs { -1, -1, KEPLER_DMA_COPY_A }, 46e5ff1127SBen Skeggs {} 47e5ff1127SBen Skeggs } 48e5ff1127SBen Skeggs }; 49e5ff1127SBen Skeggs 50bd6c5cabSBen Skeggs static int 51bd6c5cabSBen Skeggs gk104_ce0_ctor(struct nvkm_object *parent, struct nvkm_object *engine, 52bd6c5cabSBen Skeggs struct nvkm_oclass *oclass, void *data, u32 size, 53bd6c5cabSBen Skeggs struct nvkm_object **pobject) 54bd6c5cabSBen Skeggs { 55d9261a68SBen Skeggs struct nvkm_engine *ce; 56bd6c5cabSBen Skeggs int ret; 57bd6c5cabSBen Skeggs 58bd6c5cabSBen Skeggs ret = nvkm_engine_create(parent, engine, oclass, true, 59d9261a68SBen Skeggs "PCE0", "ce0", &ce); 60d9261a68SBen Skeggs *pobject = nv_object(ce); 61bd6c5cabSBen Skeggs if (ret) 62bd6c5cabSBen Skeggs return ret; 63bd6c5cabSBen Skeggs 64e5ff1127SBen Skeggs ce->func = &gk104_ce; 65d9261a68SBen Skeggs nv_subdev(ce)->unit = 0x00000040; 66d9261a68SBen Skeggs nv_subdev(ce)->intr = gk104_ce_intr; 67bd6c5cabSBen Skeggs return 0; 68bd6c5cabSBen Skeggs } 69bd6c5cabSBen Skeggs 70bd6c5cabSBen Skeggs static int 71bd6c5cabSBen Skeggs gk104_ce1_ctor(struct nvkm_object *parent, struct nvkm_object *engine, 72bd6c5cabSBen Skeggs struct nvkm_oclass *oclass, void *data, u32 size, 73bd6c5cabSBen Skeggs struct nvkm_object **pobject) 74bd6c5cabSBen Skeggs { 75d9261a68SBen Skeggs struct nvkm_engine *ce; 76bd6c5cabSBen Skeggs int ret; 77bd6c5cabSBen Skeggs 78bd6c5cabSBen Skeggs ret = nvkm_engine_create(parent, engine, oclass, true, 79d9261a68SBen Skeggs "PCE1", "ce1", &ce); 80d9261a68SBen Skeggs *pobject = nv_object(ce); 81bd6c5cabSBen Skeggs if (ret) 82bd6c5cabSBen Skeggs return ret; 83bd6c5cabSBen Skeggs 84e5ff1127SBen Skeggs ce->func = &gk104_ce; 85d9261a68SBen Skeggs nv_subdev(ce)->unit = 0x00000080; 86d9261a68SBen Skeggs nv_subdev(ce)->intr = gk104_ce_intr; 87bd6c5cabSBen Skeggs return 0; 88bd6c5cabSBen Skeggs } 89bd6c5cabSBen Skeggs 90bd6c5cabSBen Skeggs static int 91bd6c5cabSBen Skeggs gk104_ce2_ctor(struct nvkm_object *parent, struct nvkm_object *engine, 92bd6c5cabSBen Skeggs struct nvkm_oclass *oclass, void *data, u32 size, 93bd6c5cabSBen Skeggs struct nvkm_object **pobject) 94bd6c5cabSBen Skeggs { 95d9261a68SBen Skeggs struct nvkm_engine *ce; 96bd6c5cabSBen Skeggs int ret; 97bd6c5cabSBen Skeggs 98bd6c5cabSBen Skeggs ret = nvkm_engine_create(parent, engine, oclass, true, 99d9261a68SBen Skeggs "PCE2", "ce2", &ce); 100d9261a68SBen Skeggs *pobject = nv_object(ce); 101bd6c5cabSBen Skeggs if (ret) 102bd6c5cabSBen Skeggs return ret; 103bd6c5cabSBen Skeggs 104e5ff1127SBen Skeggs ce->func = &gk104_ce; 105d9261a68SBen Skeggs nv_subdev(ce)->unit = 0x00200000; 106d9261a68SBen Skeggs nv_subdev(ce)->intr = gk104_ce_intr; 107bd6c5cabSBen Skeggs return 0; 108bd6c5cabSBen Skeggs } 109bd6c5cabSBen Skeggs 110bd6c5cabSBen Skeggs struct nvkm_oclass 111bd6c5cabSBen Skeggs gk104_ce0_oclass = { 112bd6c5cabSBen Skeggs .handle = NV_ENGINE(CE0, 0xe0), 113bd6c5cabSBen Skeggs .ofuncs = &(struct nvkm_ofuncs) { 114bd6c5cabSBen Skeggs .ctor = gk104_ce0_ctor, 115bd6c5cabSBen Skeggs .dtor = _nvkm_engine_dtor, 116bd6c5cabSBen Skeggs .init = _nvkm_engine_init, 117bd6c5cabSBen Skeggs .fini = _nvkm_engine_fini, 118bd6c5cabSBen Skeggs }, 119bd6c5cabSBen Skeggs }; 120bd6c5cabSBen Skeggs 121bd6c5cabSBen Skeggs struct nvkm_oclass 122bd6c5cabSBen Skeggs gk104_ce1_oclass = { 123bd6c5cabSBen Skeggs .handle = NV_ENGINE(CE1, 0xe0), 124bd6c5cabSBen Skeggs .ofuncs = &(struct nvkm_ofuncs) { 125bd6c5cabSBen Skeggs .ctor = gk104_ce1_ctor, 126bd6c5cabSBen Skeggs .dtor = _nvkm_engine_dtor, 127bd6c5cabSBen Skeggs .init = _nvkm_engine_init, 128bd6c5cabSBen Skeggs .fini = _nvkm_engine_fini, 129bd6c5cabSBen Skeggs }, 130bd6c5cabSBen Skeggs }; 131bd6c5cabSBen Skeggs 132bd6c5cabSBen Skeggs struct nvkm_oclass 133bd6c5cabSBen Skeggs gk104_ce2_oclass = { 134bd6c5cabSBen Skeggs .handle = NV_ENGINE(CE2, 0xe0), 135bd6c5cabSBen Skeggs .ofuncs = &(struct nvkm_ofuncs) { 136bd6c5cabSBen Skeggs .ctor = gk104_ce2_ctor, 137bd6c5cabSBen Skeggs .dtor = _nvkm_engine_dtor, 138bd6c5cabSBen Skeggs .init = _nvkm_engine_init, 139bd6c5cabSBen Skeggs .fini = _nvkm_engine_fini, 140bd6c5cabSBen Skeggs }, 141bd6c5cabSBen Skeggs }; 142