Loading drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c +8 −8 Original line number Diff line number Diff line Loading @@ -109,9 +109,9 @@ gk104_fifo_engine(struct gk104_fifo *fifo, u32 engn) } static void gk104_fifo_recover_work(struct work_struct *work) gk104_fifo_recover_work(struct work_struct *w) { struct gk104_fifo *fifo = container_of(work, typeof(*fifo), fault); struct gk104_fifo *fifo = container_of(w, typeof(*fifo), recover.work); struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_engine *engine; unsigned long flags; Loading @@ -119,8 +119,8 @@ gk104_fifo_recover_work(struct work_struct *work) u64 mask, todo; spin_lock_irqsave(&fifo->base.lock, flags); mask = fifo->mask; fifo->mask = 0ULL; mask = fifo->recover.mask; fifo->recover.mask = 0ULL; spin_unlock_irqrestore(&fifo->base.lock, flags); for (todo = mask; engn = __ffs64(todo), todo; todo &= ~(1 << engn)) Loading Loading @@ -155,8 +155,8 @@ gk104_fifo_recover(struct gk104_fifo *fifo, struct nvkm_engine *engine, list_del_init(&chan->head); chan->killed = true; fifo->mask |= 1ULL << engine->subdev.index; schedule_work(&fifo->fault); fifo->recover.mask |= 1ULL << engine->subdev.index; schedule_work(&fifo->recover.work); } static const struct nvkm_enum Loading Loading @@ -651,7 +651,7 @@ gk104_fifo_fini(struct nvkm_fifo *base) { struct gk104_fifo *fifo = gk104_fifo(base); struct nvkm_device *device = fifo->base.engine.subdev.device; flush_work(&fifo->fault); flush_work(&fifo->recover.work); /* allow mmu fault interrupts, even when we're not using fifo */ nvkm_mask(device, 0x002140, 0x10000000, 0x10000000); } Loading Loading @@ -755,7 +755,7 @@ gk104_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device, if (!(fifo = kzalloc(sizeof(*fifo), GFP_KERNEL))) return -ENOMEM; INIT_WORK(&fifo->fault, gk104_fifo_recover_work); INIT_WORK(&fifo->recover.work, gk104_fifo_recover_work); *pfifo = &fifo->base; return nvkm_fifo_ctor(func, device, index, nr, &fifo->base); Loading drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.h +4 −2 Original line number Diff line number Diff line Loading @@ -16,8 +16,10 @@ struct gk104_fifo_engn { struct gk104_fifo { struct nvkm_fifo base; struct work_struct fault; struct { struct work_struct work; u64 mask; } recover; int pbdma_nr; Loading Loading
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c +8 −8 Original line number Diff line number Diff line Loading @@ -109,9 +109,9 @@ gk104_fifo_engine(struct gk104_fifo *fifo, u32 engn) } static void gk104_fifo_recover_work(struct work_struct *work) gk104_fifo_recover_work(struct work_struct *w) { struct gk104_fifo *fifo = container_of(work, typeof(*fifo), fault); struct gk104_fifo *fifo = container_of(w, typeof(*fifo), recover.work); struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_engine *engine; unsigned long flags; Loading @@ -119,8 +119,8 @@ gk104_fifo_recover_work(struct work_struct *work) u64 mask, todo; spin_lock_irqsave(&fifo->base.lock, flags); mask = fifo->mask; fifo->mask = 0ULL; mask = fifo->recover.mask; fifo->recover.mask = 0ULL; spin_unlock_irqrestore(&fifo->base.lock, flags); for (todo = mask; engn = __ffs64(todo), todo; todo &= ~(1 << engn)) Loading Loading @@ -155,8 +155,8 @@ gk104_fifo_recover(struct gk104_fifo *fifo, struct nvkm_engine *engine, list_del_init(&chan->head); chan->killed = true; fifo->mask |= 1ULL << engine->subdev.index; schedule_work(&fifo->fault); fifo->recover.mask |= 1ULL << engine->subdev.index; schedule_work(&fifo->recover.work); } static const struct nvkm_enum Loading Loading @@ -651,7 +651,7 @@ gk104_fifo_fini(struct nvkm_fifo *base) { struct gk104_fifo *fifo = gk104_fifo(base); struct nvkm_device *device = fifo->base.engine.subdev.device; flush_work(&fifo->fault); flush_work(&fifo->recover.work); /* allow mmu fault interrupts, even when we're not using fifo */ nvkm_mask(device, 0x002140, 0x10000000, 0x10000000); } Loading Loading @@ -755,7 +755,7 @@ gk104_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device, if (!(fifo = kzalloc(sizeof(*fifo), GFP_KERNEL))) return -ENOMEM; INIT_WORK(&fifo->fault, gk104_fifo_recover_work); INIT_WORK(&fifo->recover.work, gk104_fifo_recover_work); *pfifo = &fifo->base; return nvkm_fifo_ctor(func, device, index, nr, &fifo->base); Loading
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.h +4 −2 Original line number Diff line number Diff line Loading @@ -16,8 +16,10 @@ struct gk104_fifo_engn { struct gk104_fifo { struct nvkm_fifo base; struct work_struct fault; struct { struct work_struct work; u64 mask; } recover; int pbdma_nr; Loading