Merge tag 'drm-misc-next-fixes-2021-02-11' of git://anongit.freedesktop.org/drm/drm...
authorDave Airlie <airlied@redhat.com>
Fri, 12 Feb 2021 00:57:54 +0000 (10:57 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 12 Feb 2021 00:59:03 +0000 (10:59 +1000)
drm-misc-next-fixes cherry picked from drm-misc-next for v5.12:
- Assorted small fixes.
- Disable and remove gma3600 support.
- Fix CEC for vc4/hdmi.

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/dac2ae30-c5d9-4222-39e2-f64067310491@linux.intel.com
511 files changed:
drivers/gpu/drm/nouveau/include/nvif/cl0080.h
drivers/gpu/drm/nouveau/include/nvif/fifo.h
drivers/gpu/drm/nouveau/include/nvkm/core/device.h
drivers/gpu/drm/nouveau/include/nvkm/core/engine.h
drivers/gpu/drm/nouveau/include/nvkm/core/enum.h
drivers/gpu/drm/nouveau/include/nvkm/core/falcon.h
drivers/gpu/drm/nouveau/include/nvkm/core/layout.h [new file with mode: 0644]
drivers/gpu/drm/nouveau/include/nvkm/core/subdev.h
drivers/gpu/drm/nouveau/include/nvkm/engine/bsp.h
drivers/gpu/drm/nouveau/include/nvkm/engine/ce.h
drivers/gpu/drm/nouveau/include/nvkm/engine/cipher.h
drivers/gpu/drm/nouveau/include/nvkm/engine/disp.h
drivers/gpu/drm/nouveau/include/nvkm/engine/dma.h
drivers/gpu/drm/nouveau/include/nvkm/engine/falcon.h
drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h
drivers/gpu/drm/nouveau/include/nvkm/engine/gr.h
drivers/gpu/drm/nouveau/include/nvkm/engine/mpeg.h
drivers/gpu/drm/nouveau/include/nvkm/engine/mspdec.h
drivers/gpu/drm/nouveau/include/nvkm/engine/msppp.h
drivers/gpu/drm/nouveau/include/nvkm/engine/msvld.h
drivers/gpu/drm/nouveau/include/nvkm/engine/nvdec.h
drivers/gpu/drm/nouveau/include/nvkm/engine/nvenc.h
drivers/gpu/drm/nouveau/include/nvkm/engine/pm.h
drivers/gpu/drm/nouveau/include/nvkm/engine/sec.h
drivers/gpu/drm/nouveau/include/nvkm/engine/sec2.h
drivers/gpu/drm/nouveau/include/nvkm/engine/sw.h
drivers/gpu/drm/nouveau/include/nvkm/engine/vp.h
drivers/gpu/drm/nouveau/include/nvkm/engine/xtensa.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/acr.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/bar.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/bios.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/bus.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/clk.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/devinit.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/fault.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/fb.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/fuse.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/gpio.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/i2c.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/ibus.h [deleted file]
drivers/gpu/drm/nouveau/include/nvkm/subdev/iccsense.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/instmem.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/ltc.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/mc.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/mxm.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/pmu.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/privring.h [new file with mode: 0644]
drivers/gpu/drm/nouveau/include/nvkm/subdev/therm.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/timer.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/top.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/volt.h
drivers/gpu/drm/nouveau/nouveau_abi16.c
drivers/gpu/drm/nouveau/nouveau_chan.c
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nvif/fifo.c
drivers/gpu/drm/nouveau/nvkm/core/engine.c
drivers/gpu/drm/nouveau/nvkm/core/memory.c
drivers/gpu/drm/nouveau/nvkm/core/subdev.c
drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/ce/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/ce/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/ce/gm107.c
drivers/gpu/drm/nouveau/nvkm/engine/ce/gm200.c
drivers/gpu/drm/nouveau/nvkm/engine/ce/gp100.c
drivers/gpu/drm/nouveau/nvkm/engine/ce/gp102.c
drivers/gpu/drm/nouveau/nvkm/engine/ce/gt215.c
drivers/gpu/drm/nouveau/nvkm/engine/ce/gv100.c
drivers/gpu/drm/nouveau/nvkm/engine/ce/tu102.c
drivers/gpu/drm/nouveau/nvkm/engine/cipher/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
drivers/gpu/drm/nouveau/nvkm/engine/device/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/device/user.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/g94.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/ga102.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gk110.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gm107.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gm200.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gp100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gp102.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gt200.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gt215.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/mcp77.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/mcp89.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/tu102.c
drivers/gpu/drm/nouveau/nvkm/engine/dma/base.c
drivers/gpu/drm/nouveau/nvkm/engine/dma/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/dma/gf119.c
drivers/gpu/drm/nouveau/nvkm/engine/dma/gv100.c
drivers/gpu/drm/nouveau/nvkm/engine/dma/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/dma/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/dma/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/falcon.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/chang84.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/changf100.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/changk104.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/channv04.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/channv50.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/channv50.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/dmanv04.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/dmanv10.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/dmanv17.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/dmanv40.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk110.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk208.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk20a.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm107.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm200.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm20b.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gp100.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gp10b.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gpfifogf100.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gpfifogk104.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gpfifogv100.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gv100.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv10.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv17.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/base.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf108.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf110.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf117.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf119.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm107.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm200.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm20b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp102.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp107.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp108.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp10b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gt200.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gt215.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gv100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/mcp79.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/mcp89.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv10.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv10.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv15.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv17.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv25.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv2a.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv35.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv44.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/tu102.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.h
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv40.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv44.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/mspdec/base.c
drivers/gpu/drm/nouveau/nvkm/engine/mspdec/g98.c
drivers/gpu/drm/nouveau/nvkm/engine/mspdec/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/mspdec/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/mspdec/gt215.c
drivers/gpu/drm/nouveau/nvkm/engine/mspdec/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/msppp/base.c
drivers/gpu/drm/nouveau/nvkm/engine/msppp/g98.c
drivers/gpu/drm/nouveau/nvkm/engine/msppp/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/msppp/gt215.c
drivers/gpu/drm/nouveau/nvkm/engine/msppp/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/msvld/base.c
drivers/gpu/drm/nouveau/nvkm/engine/msvld/g98.c
drivers/gpu/drm/nouveau/nvkm/engine/msvld/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/msvld/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/msvld/gt215.c
drivers/gpu/drm/nouveau/nvkm/engine/msvld/mcp89.c
drivers/gpu/drm/nouveau/nvkm/engine/msvld/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/nvdec/base.c
drivers/gpu/drm/nouveau/nvkm/engine/nvdec/gm107.c
drivers/gpu/drm/nouveau/nvkm/engine/nvdec/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/nvenc/base.c
drivers/gpu/drm/nouveau/nvkm/engine/nvenc/gm107.c
drivers/gpu/drm/nouveau/nvkm/engine/nvenc/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/pm/base.c
drivers/gpu/drm/nouveau/nvkm/engine/pm/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/pm/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/pm/gf100.h
drivers/gpu/drm/nouveau/nvkm/engine/pm/gf108.c
drivers/gpu/drm/nouveau/nvkm/engine/pm/gf117.c
drivers/gpu/drm/nouveau/nvkm/engine/pm/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/pm/gt200.c
drivers/gpu/drm/nouveau/nvkm/engine/pm/gt215.c
drivers/gpu/drm/nouveau/nvkm/engine/pm/nv40.c
drivers/gpu/drm/nouveau/nvkm/engine/pm/nv40.h
drivers/gpu/drm/nouveau/nvkm/engine/pm/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/pm/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/sec/g98.c
drivers/gpu/drm/nouveau/nvkm/engine/sec2/base.c
drivers/gpu/drm/nouveau/nvkm/engine/sec2/gp102.c
drivers/gpu/drm/nouveau/nvkm/engine/sec2/gp108.c
drivers/gpu/drm/nouveau/nvkm/engine/sec2/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/sec2/tu102.c
drivers/gpu/drm/nouveau/nvkm/engine/sw/base.c
drivers/gpu/drm/nouveau/nvkm/engine/sw/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/sw/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/sw/nv10.c
drivers/gpu/drm/nouveau/nvkm/engine/sw/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/sw/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/vp/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c
drivers/gpu/drm/nouveau/nvkm/falcon/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/Kbuild
drivers/gpu/drm/nouveau/nvkm/subdev/acr/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp102.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp108.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp10b.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/acr/tu102.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/g84.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.h
drivers/gpu/drm/nouveau/nvkm/subdev/bar/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/gm107.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.h
drivers/gpu/drm/nouveau/nvkm/subdev/bar/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/bar/tu102.c
drivers/gpu/drm/nouveau/nvkm/subdev/bios/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/bus/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/bus/g94.c
drivers/gpu/drm/nouveau/nvkm/subdev/bus/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/bus/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/bus/nv31.c
drivers/gpu/drm/nouveau/nvkm/subdev/bus/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/bus/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/g84.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk20a.h
drivers/gpu/drm/nouveau/nvkm/subdev/clk/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/gt215.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/mcp77.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/nv40.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/nv50.h
drivers/gpu/drm/nouveau/nvkm/subdev/clk/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/g84.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/g98.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/ga100.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gm107.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gt215.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gv100.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/mcp89.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv04.h
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv05.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv10.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv1a.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv20.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv50.h
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/tu102.c
drivers/gpu/drm/nouveau/nvkm/subdev/fault/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/fault/gp100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fault/gp10b.c
drivers/gpu/drm/nouveau/nvkm/subdev/fault/gv100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fault/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/fault/tu102.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/g84.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga102.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gf100.h
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gf108.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk110.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm107.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gp100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gp102.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gp10b.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gt215.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gv100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/mcp77.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/mcp89.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv10.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv1a.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv20.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv25.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv30.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv35.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv36.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv40.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv41.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv44.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv46.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv47.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv49.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv4e.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv50.h
drivers/gpu/drm/nouveau/nvkm/subdev/fb/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/fuse/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/fuse/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fuse/gm107.c
drivers/gpu/drm/nouveau/nvkm/subdev/fuse/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/fuse/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/g94.c
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/ga102.c
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/gf119.c
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/nv10.c
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/gv100.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/g94.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gf117.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gf119.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gk110.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/nv4e.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/Kbuild [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/priv.h [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/iccsense/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/iccsense/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/iccsense/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv40.c
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/ltc/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm107.c
drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gp100.c
drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gp102.c
drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gp10b.c
drivers/gpu/drm/nouveau/nvkm/subdev/ltc/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/g84.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/g98.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/ga100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/gp100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/gp10b.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/gt215.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv11.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv17.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv44.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/mc/tu102.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/g84.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gp100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gp10b.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gv100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/mcp77.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv41.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv44.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/tu102.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv41.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmtu102.c
drivers/gpu/drm/nouveau/nvkm/subdev/mxm/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/mxm/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/mxm/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/g84.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/g92.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/g94.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/gf106.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/gp100.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv40.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv46.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv4c.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gf119.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk110.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk208.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm107.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp102.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp10b.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gt215.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/privring/Kbuild [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf100.c [moved from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gf100.c with 71% similarity]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf117.c [moved from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gf117.c with 79% similarity]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk104.c [moved from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk104.c with 71% similarity]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk20a.c [moved from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk20a.c with 73% similarity]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/gm200.c [moved from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gm200.c with 83% similarity]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/gp10b.c [moved from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gp10b.c with 78% similarity]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/priv.h [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/g84.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/gf119.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/gk104.h
drivers/gpu/drm/nouveau/nvkm/subdev/therm/gm107.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/gp100.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/gt215.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/nv40.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/timer/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv40.c
drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv41.c
drivers/gpu/drm/nouveau/nvkm/subdev/timer/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/top/Kbuild
drivers/gpu/drm/nouveau/nvkm/subdev/top/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/top/ga100.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/top/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/volt/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/volt/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/volt/gf117.c
drivers/gpu/drm/nouveau/nvkm/subdev/volt/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/volt/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/volt/gk20a.h
drivers/gpu/drm/nouveau/nvkm/subdev/volt/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/volt/nv40.c
drivers/gpu/drm/nouveau/nvkm/subdev/volt/priv.h

index 57d4f457a7d4ad03b4bd998a1ef1777923ebab83..0b86c44878e0c85c32bf11b20ab518642775e5c6 100644 (file)
@@ -60,37 +60,33 @@ struct nv_device_time_v0 {
 
 #define NV_DEVICE_INFO_UNIT                               (0xffffffffULL << 32)
 #define NV_DEVICE_INFO(n)                          ((n) | (0x00000000ULL << 32))
-#define NV_DEVICE_FIFO(n)                          ((n) | (0x00000001ULL << 32))
+#define NV_DEVICE_HOST(n)                          ((n) | (0x00000001ULL << 32))
 
-/* This will be returned for unsupported queries. */
+/* This will be returned in the mthd field for unsupported queries. */
 #define NV_DEVICE_INFO_INVALID                                           ~0ULL
 
-/* These return a mask of available engines of particular type. */
-#define NV_DEVICE_INFO_ENGINE_SW                     NV_DEVICE_INFO(0x00000000)
-#define NV_DEVICE_INFO_ENGINE_GR                     NV_DEVICE_INFO(0x00000001)
-#define NV_DEVICE_INFO_ENGINE_MPEG                   NV_DEVICE_INFO(0x00000002)
-#define NV_DEVICE_INFO_ENGINE_ME                     NV_DEVICE_INFO(0x00000003)
-#define NV_DEVICE_INFO_ENGINE_CIPHER                 NV_DEVICE_INFO(0x00000004)
-#define NV_DEVICE_INFO_ENGINE_BSP                    NV_DEVICE_INFO(0x00000005)
-#define NV_DEVICE_INFO_ENGINE_VP                     NV_DEVICE_INFO(0x00000006)
-#define NV_DEVICE_INFO_ENGINE_CE                     NV_DEVICE_INFO(0x00000007)
-#define NV_DEVICE_INFO_ENGINE_SEC                    NV_DEVICE_INFO(0x00000008)
-#define NV_DEVICE_INFO_ENGINE_MSVLD                  NV_DEVICE_INFO(0x00000009)
-#define NV_DEVICE_INFO_ENGINE_MSPDEC                 NV_DEVICE_INFO(0x0000000a)
-#define NV_DEVICE_INFO_ENGINE_MSPPP                  NV_DEVICE_INFO(0x0000000b)
-#define NV_DEVICE_INFO_ENGINE_MSENC                  NV_DEVICE_INFO(0x0000000c)
-#define NV_DEVICE_INFO_ENGINE_VIC                    NV_DEVICE_INFO(0x0000000d)
-#define NV_DEVICE_INFO_ENGINE_SEC2                   NV_DEVICE_INFO(0x0000000e)
-#define NV_DEVICE_INFO_ENGINE_NVDEC                  NV_DEVICE_INFO(0x0000000f)
-#define NV_DEVICE_INFO_ENGINE_NVENC                  NV_DEVICE_INFO(0x00000010)
-
+/* Returns the number of available runlists. */
+#define NV_DEVICE_HOST_RUNLISTS                       NV_DEVICE_HOST(0x00000000)
 /* Returns the number of available channels. */
-#define NV_DEVICE_FIFO_CHANNELS                      NV_DEVICE_FIFO(0x00000000)
-
-/* Returns a mask of available runlists. */
-#define NV_DEVICE_FIFO_RUNLISTS                      NV_DEVICE_FIFO(0x00000001)
+#define NV_DEVICE_HOST_CHANNELS                       NV_DEVICE_HOST(0x00000001)
 
-/* These return a mask of engines available on a particular runlist. */
-#define NV_DEVICE_FIFO_RUNLIST_ENGINES(n)     ((n) + NV_DEVICE_FIFO(0x00000010))
-#define NV_DEVICE_FIFO_RUNLIST_ENGINES__SIZE                                64
+/* Returns a mask of available engine types on runlist(data). */
+#define NV_DEVICE_HOST_RUNLIST_ENGINES                NV_DEVICE_HOST(0x00000100)
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_SW                            0x00000001
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_GR                            0x00000002
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_MPEG                          0x00000004
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_ME                            0x00000008
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_CIPHER                        0x00000010
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_BSP                           0x00000020
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_VP                            0x00000040
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_CE                            0x00000080
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_SEC                           0x00000100
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSVLD                         0x00000200
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSPDEC                        0x00000400
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSPPP                         0x00000800
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSENC                         0x00001000
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_VIC                           0x00002000
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_SEC2                          0x00004000
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_NVDEC                         0x00008000
+#define NV_DEVICE_HOST_RUNLIST_ENGINES_NVENC                         0x00010000
 #endif
index e9468c9f9abfddaba36057fc93baa34d2b69cdc6..d351ac890ca1a6c8edc060ab6ae289dad95df328 100644 (file)
@@ -2,15 +2,15 @@
 #define __NVIF_FIFO_H__
 #include <nvif/device.h>
 
-/* Returns mask of runlists that support a NV_DEVICE_INFO_ENGINE_* type. */
+/* Returns mask of runlists that support a NV_DEVICE_INFO_RUNLIST_ENGINES_* type. */
 u64 nvif_fifo_runlist(struct nvif_device *, u64 engine);
 
 /* CE-supporting runlists (excluding GRCE, if others exist). */
 static inline u64
 nvif_fifo_runlist_ce(struct nvif_device *device)
 {
-       u64 runmgr = nvif_fifo_runlist(device, NV_DEVICE_INFO_ENGINE_GR);
-       u64 runmce = nvif_fifo_runlist(device, NV_DEVICE_INFO_ENGINE_CE);
+       u64 runmgr = nvif_fifo_runlist(device, NV_DEVICE_HOST_RUNLIST_ENGINES_GR);
+       u64 runmce = nvif_fifo_runlist(device, NV_DEVICE_HOST_RUNLIST_ENGINES_CE);
        if (runmce && !(runmce &= ~runmgr))
                runmce = runmgr;
        return runmce;
index c920939a1467946c1c2281a1798d92dda5dc8623..a18b6cfda07e4a605d0b6e32d798b69b667a3e64 100644 (file)
@@ -3,79 +3,7 @@
 #define __NVKM_DEVICE_H__
 #include <core/oclass.h>
 #include <core/event.h>
-
-enum nvkm_devidx {
-       NVKM_SUBDEV_PCI,
-       NVKM_SUBDEV_VBIOS,
-       NVKM_SUBDEV_DEVINIT,
-       NVKM_SUBDEV_TOP,
-       NVKM_SUBDEV_IBUS,
-       NVKM_SUBDEV_GPIO,
-       NVKM_SUBDEV_I2C,
-       NVKM_SUBDEV_FUSE,
-       NVKM_SUBDEV_MXM,
-       NVKM_SUBDEV_MC,
-       NVKM_SUBDEV_BUS,
-       NVKM_SUBDEV_TIMER,
-       NVKM_SUBDEV_INSTMEM,
-       NVKM_SUBDEV_FB,
-       NVKM_SUBDEV_LTC,
-       NVKM_SUBDEV_MMU,
-       NVKM_SUBDEV_BAR,
-       NVKM_SUBDEV_FAULT,
-       NVKM_SUBDEV_ACR,
-       NVKM_SUBDEV_PMU,
-       NVKM_SUBDEV_VOLT,
-       NVKM_SUBDEV_ICCSENSE,
-       NVKM_SUBDEV_THERM,
-       NVKM_SUBDEV_CLK,
-       NVKM_SUBDEV_GSP,
-
-       NVKM_ENGINE_BSP,
-
-       NVKM_ENGINE_CE0,
-       NVKM_ENGINE_CE1,
-       NVKM_ENGINE_CE2,
-       NVKM_ENGINE_CE3,
-       NVKM_ENGINE_CE4,
-       NVKM_ENGINE_CE5,
-       NVKM_ENGINE_CE6,
-       NVKM_ENGINE_CE7,
-       NVKM_ENGINE_CE8,
-       NVKM_ENGINE_CE_LAST = NVKM_ENGINE_CE8,
-
-       NVKM_ENGINE_CIPHER,
-       NVKM_ENGINE_DISP,
-       NVKM_ENGINE_DMAOBJ,
-       NVKM_ENGINE_FIFO,
-       NVKM_ENGINE_GR,
-       NVKM_ENGINE_IFB,
-       NVKM_ENGINE_ME,
-       NVKM_ENGINE_MPEG,
-       NVKM_ENGINE_MSENC,
-       NVKM_ENGINE_MSPDEC,
-       NVKM_ENGINE_MSPPP,
-       NVKM_ENGINE_MSVLD,
-
-       NVKM_ENGINE_NVENC0,
-       NVKM_ENGINE_NVENC1,
-       NVKM_ENGINE_NVENC2,
-       NVKM_ENGINE_NVENC_LAST = NVKM_ENGINE_NVENC2,
-
-       NVKM_ENGINE_NVDEC0,
-       NVKM_ENGINE_NVDEC1,
-       NVKM_ENGINE_NVDEC2,
-       NVKM_ENGINE_NVDEC_LAST = NVKM_ENGINE_NVDEC2,
-
-       NVKM_ENGINE_PM,
-       NVKM_ENGINE_SEC,
-       NVKM_ENGINE_SEC2,
-       NVKM_ENGINE_SW,
-       NVKM_ENGINE_VIC,
-       NVKM_ENGINE_VP,
-
-       NVKM_SUBDEV_NR
-};
+enum nvkm_subdev_type;
 
 enum nvkm_device_type {
        NVKM_DEVICE_PCI,
@@ -102,7 +30,6 @@ struct nvkm_device {
 
        struct nvkm_event event;
 
-       u64 disable_mask;
        u32 debug;
 
        const struct nvkm_device_chip *chip;
@@ -130,58 +57,16 @@ struct nvkm_device {
                struct notifier_block nb;
        } acpi;
 
-       struct nvkm_acr *acr;
-       struct nvkm_bar *bar;
-       struct nvkm_bios *bios;
-       struct nvkm_bus *bus;
-       struct nvkm_clk *clk;
-       struct nvkm_devinit *devinit;
-       struct nvkm_fault *fault;
-       struct nvkm_fb *fb;
-       struct nvkm_fuse *fuse;
-       struct nvkm_gpio *gpio;
-       struct nvkm_gsp *gsp;
-       struct nvkm_i2c *i2c;
-       struct nvkm_subdev *ibus;
-       struct nvkm_iccsense *iccsense;
-       struct nvkm_instmem *imem;
-       struct nvkm_ltc *ltc;
-       struct nvkm_mc *mc;
-       struct nvkm_mmu *mmu;
-       struct nvkm_subdev *mxm;
-       struct nvkm_pci *pci;
-       struct nvkm_pmu *pmu;
-       struct nvkm_therm *therm;
-       struct nvkm_timer *timer;
-       struct nvkm_top *top;
-       struct nvkm_volt *volt;
-
-       struct nvkm_engine *bsp;
-       struct nvkm_engine *ce[9];
-       struct nvkm_engine *cipher;
-       struct nvkm_disp *disp;
-       struct nvkm_dma *dma;
-       struct nvkm_fifo *fifo;
-       struct nvkm_gr *gr;
-       struct nvkm_engine *ifb;
-       struct nvkm_engine *me;
-       struct nvkm_engine *mpeg;
-       struct nvkm_engine *msenc;
-       struct nvkm_engine *mspdec;
-       struct nvkm_engine *msppp;
-       struct nvkm_engine *msvld;
-       struct nvkm_nvenc *nvenc[3];
-       struct nvkm_nvdec *nvdec[3];
-       struct nvkm_pm *pm;
-       struct nvkm_engine *sec;
-       struct nvkm_sec2 *sec2;
-       struct nvkm_sw *sw;
-       struct nvkm_engine *vic;
-       struct nvkm_engine *vp;
+#define NVKM_LAYOUT_ONCE(type,data,ptr) data *ptr;
+#define NVKM_LAYOUT_INST(type,data,ptr,cnt) data *ptr[cnt];
+#include <core/layout.h>
+#undef NVKM_LAYOUT_INST
+#undef NVKM_LAYOUT_ONCE
+       struct list_head subdev;
 };
 
-struct nvkm_subdev *nvkm_device_subdev(struct nvkm_device *, int index);
-struct nvkm_engine *nvkm_device_engine(struct nvkm_device *, int index);
+struct nvkm_subdev *nvkm_device_subdev(struct nvkm_device *, int type, int inst);
+struct nvkm_engine *nvkm_device_engine(struct nvkm_device *, int type, int inst);
 
 struct nvkm_device_func {
        struct nvkm_device_pci *(*pci)(struct nvkm_device *);
@@ -202,55 +87,15 @@ struct nvkm_device_quirk {
 
 struct nvkm_device_chip {
        const char *name;
-
-       int (*acr     )(struct nvkm_device *, int idx, struct nvkm_acr **);
-       int (*bar     )(struct nvkm_device *, int idx, struct nvkm_bar **);
-       int (*bios    )(struct nvkm_device *, int idx, struct nvkm_bios **);
-       int (*bus     )(struct nvkm_device *, int idx, struct nvkm_bus **);
-       int (*clk     )(struct nvkm_device *, int idx, struct nvkm_clk **);
-       int (*devinit )(struct nvkm_device *, int idx, struct nvkm_devinit **);
-       int (*fault   )(struct nvkm_device *, int idx, struct nvkm_fault **);
-       int (*fb      )(struct nvkm_device *, int idx, struct nvkm_fb **);
-       int (*fuse    )(struct nvkm_device *, int idx, struct nvkm_fuse **);
-       int (*gpio    )(struct nvkm_device *, int idx, struct nvkm_gpio **);
-       int (*gsp     )(struct nvkm_device *, int idx, struct nvkm_gsp **);
-       int (*i2c     )(struct nvkm_device *, int idx, struct nvkm_i2c **);
-       int (*ibus    )(struct nvkm_device *, int idx, struct nvkm_subdev **);
-       int (*iccsense)(struct nvkm_device *, int idx, struct nvkm_iccsense **);
-       int (*imem    )(struct nvkm_device *, int idx, struct nvkm_instmem **);
-       int (*ltc     )(struct nvkm_device *, int idx, struct nvkm_ltc **);
-       int (*mc      )(struct nvkm_device *, int idx, struct nvkm_mc **);
-       int (*mmu     )(struct nvkm_device *, int idx, struct nvkm_mmu **);
-       int (*mxm     )(struct nvkm_device *, int idx, struct nvkm_subdev **);
-       int (*pci     )(struct nvkm_device *, int idx, struct nvkm_pci **);
-       int (*pmu     )(struct nvkm_device *, int idx, struct nvkm_pmu **);
-       int (*therm   )(struct nvkm_device *, int idx, struct nvkm_therm **);
-       int (*timer   )(struct nvkm_device *, int idx, struct nvkm_timer **);
-       int (*top     )(struct nvkm_device *, int idx, struct nvkm_top **);
-       int (*volt    )(struct nvkm_device *, int idx, struct nvkm_volt **);
-
-       int (*bsp     )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*ce[9]   )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*cipher  )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*disp    )(struct nvkm_device *, int idx, struct nvkm_disp **);
-       int (*dma     )(struct nvkm_device *, int idx, struct nvkm_dma **);
-       int (*fifo    )(struct nvkm_device *, int idx, struct nvkm_fifo **);
-       int (*gr      )(struct nvkm_device *, int idx, struct nvkm_gr **);
-       int (*ifb     )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*me      )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*mpeg    )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*msenc   )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*mspdec  )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*msppp   )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*msvld   )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*nvenc[3])(struct nvkm_device *, int idx, struct nvkm_nvenc **);
-       int (*nvdec[3])(struct nvkm_device *, int idx, struct nvkm_nvdec **);
-       int (*pm      )(struct nvkm_device *, int idx, struct nvkm_pm **);
-       int (*sec     )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*sec2    )(struct nvkm_device *, int idx, struct nvkm_sec2 **);
-       int (*sw      )(struct nvkm_device *, int idx, struct nvkm_sw **);
-       int (*vic     )(struct nvkm_device *, int idx, struct nvkm_engine **);
-       int (*vp      )(struct nvkm_device *, int idx, struct nvkm_engine **);
+#define NVKM_LAYOUT_ONCE(type,data,ptr,...)                                                  \
+       struct {                                                                             \
+               u32 inst;                                                                    \
+               int (*ctor)(struct nvkm_device *, enum nvkm_subdev_type, int inst, data **); \
+       } ptr;
+#define NVKM_LAYOUT_INST(A...) NVKM_LAYOUT_ONCE(A)
+#include <core/layout.h>
+#undef NVKM_LAYOUT_INST
+#undef NVKM_LAYOUT_ONCE
 };
 
 struct nvkm_device *nvkm_device_find(u64 name);
index c6b401a6ea236e1a66366a5c26e0fffdfcf54f04..e58923b67d7435abe9134cc76744d97d04c35581 100644 (file)
@@ -6,12 +6,18 @@
 struct nvkm_fifo_chan;
 struct nvkm_fb_tile;
 
+extern const struct nvkm_subdev_func nvkm_engine;
+
 struct nvkm_engine {
        const struct nvkm_engine_func *func;
        struct nvkm_subdev subdev;
        spinlock_t lock;
 
-       int usecount;
+       struct {
+               refcount_t refcount;
+               struct mutex mutex;
+               bool enabled;
+       } use;
 };
 
 struct nvkm_engine_func {
@@ -42,9 +48,10 @@ struct nvkm_engine_func {
 };
 
 int nvkm_engine_ctor(const struct nvkm_engine_func *, struct nvkm_device *,
-                    int index, bool enable, struct nvkm_engine *);
+                    enum nvkm_subdev_type, int inst, bool enable, struct nvkm_engine *);
 int nvkm_engine_new_(const struct nvkm_engine_func *, struct nvkm_device *,
-                    int index, bool enable, struct nvkm_engine **);
+                    enum nvkm_subdev_type, int, bool enable, struct nvkm_engine **);
+
 struct nvkm_engine *nvkm_engine_ref(struct nvkm_engine *);
 void nvkm_engine_unref(struct nvkm_engine **);
 void nvkm_engine_tile(struct nvkm_engine *, int region);
index ce98efd4b209f5f0e814599c25c8e1ea2ca2b2e1..070462be35d9668381935df55fcc058d1d88ee4c 100644 (file)
@@ -8,6 +8,7 @@ struct nvkm_enum {
        const char *name;
        const void *data;
        u32 data2;
+       int inst;
 };
 
 const struct nvkm_enum *nvkm_enum_find(const struct nvkm_enum *, u32 value);
index 3981cb106aae7db6b7920806d899e41c6be2d8ea..fd9a3f9a518e8dae1ef0c2272679032b4e60f9dd 100644 (file)
@@ -21,11 +21,11 @@ void nvkm_falcon_v1_disable(struct nvkm_falcon *);
 void gp102_sec2_flcn_bind_context(struct nvkm_falcon *, struct nvkm_memory *);
 int gp102_sec2_flcn_enable(struct nvkm_falcon *);
 
-#define FLCN_PRINTK(t,f,fmt,a...) do {                                         \
-       if (nvkm_subdev_name[(f)->owner->index] != (f)->name)                  \
-               nvkm_##t((f)->owner, "%s: "fmt"\n", (f)->name, ##a);           \
-       else                                                                   \
-               nvkm_##t((f)->owner, fmt"\n", ##a);                            \
+#define FLCN_PRINTK(t,f,fmt,a...) do {                               \
+       if ((f)->owner->name != (f)->name)                           \
+               nvkm_##t((f)->owner, "%s: "fmt"\n", (f)->name, ##a); \
+       else                                                         \
+               nvkm_##t((f)->owner, fmt"\n", ##a);                  \
 } while(0)
 #define FLCN_DBG(f,fmt,a...) FLCN_PRINTK(debug, (f), fmt, ##a)
 #define FLCN_ERR(f,fmt,a...) FLCN_PRINTK(error, (f), fmt, ##a)
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/layout.h b/drivers/gpu/drm/nouveau/include/nvkm/core/layout.h
new file mode 100644 (file)
index 0000000..7afe157
--- /dev/null
@@ -0,0 +1,53 @@
+/* SPDX-License-Identifier: MIT */
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_PCI     , struct nvkm_pci     ,      pci)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_VBIOS   , struct nvkm_bios    ,     bios)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_DEVINIT , struct nvkm_devinit ,  devinit)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_TOP     , struct nvkm_top     ,      top)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_PRIVRING, struct nvkm_subdev  , privring)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_GPIO    , struct nvkm_gpio    ,     gpio)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_I2C     , struct nvkm_i2c     ,      i2c)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_FUSE    , struct nvkm_fuse    ,     fuse)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_MXM     , struct nvkm_subdev  ,      mxm)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_MC      , struct nvkm_mc      ,       mc)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_BUS     , struct nvkm_bus     ,      bus)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_TIMER   , struct nvkm_timer   ,    timer)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_INSTMEM , struct nvkm_instmem ,     imem)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_FB      , struct nvkm_fb      ,       fb)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_LTC     , struct nvkm_ltc     ,      ltc)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_MMU     , struct nvkm_mmu     ,      mmu)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_BAR     , struct nvkm_bar     ,      bar)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_FAULT   , struct nvkm_fault   ,    fault)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_ACR     , struct nvkm_acr     ,      acr)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_PMU     , struct nvkm_pmu     ,      pmu)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_VOLT    , struct nvkm_volt    ,     volt)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_ICCSENSE, struct nvkm_iccsense, iccsense)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_THERM   , struct nvkm_therm   ,    therm)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_CLK     , struct nvkm_clk     ,      clk)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_GSP     , struct nvkm_gsp     ,      gsp)
+NVKM_LAYOUT_INST(NVKM_SUBDEV_IOCTRL  , struct nvkm_subdev  ,   ioctrl, 3)
+NVKM_LAYOUT_ONCE(NVKM_SUBDEV_FLA     , struct nvkm_subdev  ,      fla)
+
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_BSP     , struct nvkm_engine  ,      bsp)
+NVKM_LAYOUT_INST(NVKM_ENGINE_CE      , struct nvkm_engine  ,       ce, 10)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_CIPHER  , struct nvkm_engine  ,   cipher)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_DISP    , struct nvkm_disp    ,     disp)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_DMAOBJ  , struct nvkm_dma     ,      dma)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_FIFO    , struct nvkm_fifo    ,     fifo)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_GR      , struct nvkm_gr      ,       gr)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_IFB     , struct nvkm_engine  ,      ifb)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_ME      , struct nvkm_engine  ,       me)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_MPEG    , struct nvkm_engine  ,     mpeg)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_MSENC   , struct nvkm_engine  ,    msenc)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_MSPDEC  , struct nvkm_engine  ,   mspdec)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_MSPPP   , struct nvkm_engine  ,    msppp)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_MSVLD   , struct nvkm_engine  ,    msvld)
+NVKM_LAYOUT_INST(NVKM_ENGINE_NVDEC   , struct nvkm_nvdec   ,    nvdec, 5)
+NVKM_LAYOUT_INST(NVKM_ENGINE_NVENC   , struct nvkm_nvenc   ,    nvenc, 3)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_NVJPG   , struct nvkm_engine  ,    nvjpg)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_OFA     , struct nvkm_engine  ,      ofa)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_PM      , struct nvkm_pm      ,       pm)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_SEC     , struct nvkm_engine  ,      sec)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_SEC2    , struct nvkm_sec2    ,     sec2)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_SW      , struct nvkm_sw      ,       sw)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_VIC     , struct nvkm_engine  ,      vic)
+NVKM_LAYOUT_ONCE(NVKM_ENGINE_VP      , struct nvkm_engine  ,       vp)
index 76288c682e9eaed70332e5ce0a19bf47b0faace2..1665738948fb474127ec67d3b9ea64653c94b829 100644 (file)
@@ -3,13 +3,25 @@
 #define __NVKM_SUBDEV_H__
 #include <core/device.h>
 
+enum nvkm_subdev_type {
+#define NVKM_LAYOUT_ONCE(t,s,p,...) t,
+#define NVKM_LAYOUT_INST NVKM_LAYOUT_ONCE
+#include <core/layout.h>
+#undef NVKM_LAYOUT_INST
+#undef NVKM_LAYOUT_ONCE
+       NVKM_SUBDEV_NR
+};
+
 struct nvkm_subdev {
        const struct nvkm_subdev_func *func;
        struct nvkm_device *device;
-       enum nvkm_devidx index;
-       struct mutex mutex;
+       enum nvkm_subdev_type type;
+       int inst;
+       char name[16];
        u32 debug;
+       struct list_head head;
 
+       void **pself;
        bool oneinit;
 };
 
@@ -23,11 +35,12 @@ struct nvkm_subdev_func {
        void (*intr)(struct nvkm_subdev *);
 };
 
-extern const char *nvkm_subdev_name[NVKM_SUBDEV_NR];
-int nvkm_subdev_new_(const struct nvkm_subdev_func *, struct nvkm_device *,
-                    int index, struct nvkm_subdev **);
+extern const char *nvkm_subdev_type[NVKM_SUBDEV_NR];
+int nvkm_subdev_new_(const struct nvkm_subdev_func *, struct nvkm_device *, enum nvkm_subdev_type,
+                    int inst, struct nvkm_subdev **);
 void nvkm_subdev_ctor(const struct nvkm_subdev_func *, struct nvkm_device *,
-                     int index, struct nvkm_subdev *);
+                     enum nvkm_subdev_type, int inst, struct nvkm_subdev *);
+void nvkm_subdev_disable(struct nvkm_device *, enum nvkm_subdev_type, int inst);
 void nvkm_subdev_del(struct nvkm_subdev **);
 int  nvkm_subdev_preinit(struct nvkm_subdev *);
 int  nvkm_subdev_init(struct nvkm_subdev *);
@@ -38,10 +51,8 @@ void nvkm_subdev_intr(struct nvkm_subdev *);
 /* subdev logging */
 #define nvkm_printk_(s,l,p,f,a...) do {                                        \
        const struct nvkm_subdev *_subdev = (s);                               \
-       if (CONFIG_NOUVEAU_DEBUG >= (l) && _subdev->debug >= (l)) {            \
-               dev_##p(_subdev->device->dev, "%s: "f,                         \
-                       nvkm_subdev_name[_subdev->index], ##a);                \
-       }                                                                      \
+       if (CONFIG_NOUVEAU_DEBUG >= (l) && _subdev->debug >= (l))              \
+               dev_##p(_subdev->device->dev, "%s: "f, _subdev->name, ##a);    \
 } while(0)
 #define nvkm_printk(s,l,p,f,a...) nvkm_printk_((s), NV_DBG_##l, p, f, ##a)
 #define nvkm_fatal(s,f,a...) nvkm_printk((s), FATAL,   crit, f, ##a)
index f938f024db8107e95ddc3d6925bc13231943d616..d5530faf025e2306d720dc6ac2b7160c4a6a4fdc 100644 (file)
@@ -2,5 +2,5 @@
 #ifndef __NVKM_BSP_H__
 #define __NVKM_BSP_H__
 #include <engine/xtensa.h>
-int g84_bsp_new(struct nvkm_device *, int, struct nvkm_engine **);
+int g84_bsp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
 #endif
index 86f420f4630b28320f17960000ff616eab9399fc..cfd2da8e66fed60efd4a136bfedbe54d452aa5b1 100644 (file)
@@ -3,13 +3,13 @@
 #define __NVKM_CE_H__
 #include <engine/falcon.h>
 
-int gt215_ce_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gf100_ce_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gk104_ce_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gm107_ce_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gm200_ce_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gp100_ce_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gp102_ce_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gv100_ce_new(struct nvkm_device *, int, struct nvkm_engine **);
-int tu102_ce_new(struct nvkm_device *, int, struct nvkm_engine **);
+int gt215_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gf100_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gk104_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gm107_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gm200_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gp100_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gp102_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gv100_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int tu102_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
 #endif
index 66c5c5e275208f51157e411cf30047dd6d5309d5..9da9176bbbbf23c3659ebedd4d7b8f79d705c0f8 100644 (file)
@@ -2,5 +2,5 @@
 #ifndef __NVKM_CIPHER_H__
 #define __NVKM_CIPHER_H__
 #include <core/engine.h>
-int g84_cipher_new(struct nvkm_device *, int, struct nvkm_engine **);
+int g84_cipher_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
 #endif
index 0f6fa6631a197aaa7f26479e5bf24192678a0091..d08d3337ba0d0ea1cc8aded5bdf3f8e948250001 100644 (file)
@@ -17,25 +17,28 @@ struct nvkm_disp {
        struct nvkm_event hpd;
        struct nvkm_event vblank;
 
-       struct nvkm_oproxy *client;
+       struct {
+               spinlock_t lock;
+               struct nvkm_oproxy *object;
+       } client;
 };
 
-int nv04_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int nv50_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int g84_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int gt200_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int g94_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int mcp77_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int gt215_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int mcp89_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int gf119_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int gk104_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int gk110_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int gm107_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int gm200_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int gp100_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int gp102_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int gv100_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int tu102_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
-int ga102_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
+int nv04_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int nv50_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int g84_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int gt200_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int g94_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int mcp77_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int gt215_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int mcp89_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int gf119_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int gk104_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int gk110_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int gm107_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int gm200_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int gp100_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int gp102_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int gv100_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int tu102_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
+int ga102_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
 #endif
index 2e12cdb6bb9357f0a77d84563a7003b07d8b38c9..a003da39fd13d270dc28153cef35446cca8b8a0a 100644 (file)
@@ -23,9 +23,9 @@ struct nvkm_dma {
 
 struct nvkm_dmaobj *nvkm_dmaobj_search(struct nvkm_client *, u64 object);
 
-int nv04_dma_new(struct nvkm_device *, int, struct nvkm_dma **);
-int nv50_dma_new(struct nvkm_device *, int, struct nvkm_dma **);
-int gf100_dma_new(struct nvkm_device *, int, struct nvkm_dma **);
-int gf119_dma_new(struct nvkm_device *, int, struct nvkm_dma **);
-int gv100_dma_new(struct nvkm_device *, int, struct nvkm_dma **);
+int nv04_dma_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_dma **);
+int nv50_dma_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_dma **);
+int gf100_dma_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_dma **);
+int gf119_dma_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_dma **);
+int gv100_dma_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_dma **);
 #endif
index 27c1f868552cdb4380d0904cfda06eab792c725c..306125d17ecedc019e8c24bbcc8c5b52cd224e28 100644 (file)
@@ -64,7 +64,7 @@ int nvkm_falcon_get(struct nvkm_falcon *, const struct nvkm_subdev *);
 void nvkm_falcon_put(struct nvkm_falcon *, const struct nvkm_subdev *);
 
 int nvkm_falcon_new_(const struct nvkm_falcon_func *, struct nvkm_device *,
-                    int index, bool enable, u32 addr, struct nvkm_engine **);
+                    enum nvkm_subdev_type, int inst, bool enable, u32 addr, struct nvkm_engine **);
 
 struct nvkm_falcon_func {
        struct {
index b335f3a1e66da0810378c486b0d76230dee6d213..54fab7cc36c1b84ba925ffa78a846fe0918a02bc 100644 (file)
@@ -7,6 +7,7 @@
 struct nvkm_fault_data;
 
 #define NVKM_FIFO_CHID_NR 4096
+#define NVKM_FIFO_ENGN_NR 16
 
 struct nvkm_fifo_engn {
        struct nvkm_object *object;
@@ -17,7 +18,7 @@ struct nvkm_fifo_engn {
 struct nvkm_fifo_chan {
        const struct nvkm_fifo_chan_func *func;
        struct nvkm_fifo *fifo;
-       u64 engines;
+       u32 engm;
        struct nvkm_object object;
 
        struct list_head head;
@@ -29,7 +30,7 @@ struct nvkm_fifo_chan {
        u64 addr;
        u32 size;
 
-       struct nvkm_fifo_engn engn[NVKM_SUBDEV_NR];
+       struct nvkm_fifo_engn engn[NVKM_FIFO_ENGN_NR];
 };
 
 struct nvkm_fifo {
@@ -40,6 +41,7 @@ struct nvkm_fifo {
        int nr;
        struct list_head chan;
        spinlock_t lock;
+       struct mutex mutex;
 
        struct nvkm_event uevent; /* async user trigger */
        struct nvkm_event cevent; /* channel creation event */
@@ -57,22 +59,22 @@ nvkm_fifo_chan_inst(struct nvkm_fifo *, u64 inst, unsigned long *flags);
 struct nvkm_fifo_chan *
 nvkm_fifo_chan_chid(struct nvkm_fifo *, int chid, unsigned long *flags);
 
-int nv04_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int nv10_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int nv17_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int nv40_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int nv50_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int g84_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int gf100_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int gk104_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int gk110_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int gk208_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int gk20a_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int gm107_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int gm200_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int gm20b_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int gp100_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int gp10b_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int gv100_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
-int tu102_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
+int nv04_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int nv10_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int nv17_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int nv40_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int nv50_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int g84_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int gf100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int gk104_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int gk110_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int gk208_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int gk20a_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int gm107_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int gm200_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int gm20b_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int gp100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int gp10b_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int gv100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
+int tu102_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
 #endif
index 1530c81f86a28548b0db6eea8092faf40b4c7e42..b28b752ffaa255db083aacf9ae500e183b22983e 100644 (file)
@@ -14,44 +14,44 @@ int nvkm_gr_ctxsw_pause(struct nvkm_device *);
 int nvkm_gr_ctxsw_resume(struct nvkm_device *);
 u32 nvkm_gr_ctxsw_inst(struct nvkm_device *);
 
-int nv04_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv10_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv15_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv17_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv20_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv25_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv2a_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv30_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv34_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv35_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv40_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv44_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int nv50_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int g84_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gt200_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int mcp79_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gt215_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int mcp89_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gf100_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gf104_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gf108_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gf110_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gf117_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gf119_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gk104_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gk110_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gk110b_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gk208_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gk20a_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gm107_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gm200_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gm20b_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gp100_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gp102_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gp104_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gp107_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gp108_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gp10b_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int gv100_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
-int tu102_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
+int nv04_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv10_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv15_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv17_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv20_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv25_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv2a_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv30_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv34_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv35_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv40_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv44_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int nv50_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int g84_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gt200_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int mcp79_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gt215_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int mcp89_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gf100_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gf104_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gf108_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gf110_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gf117_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gf119_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gk104_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gk110_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gk110b_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gk208_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gk20a_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gm107_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gm200_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gm20b_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gp100_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gp102_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gp104_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gp107_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gp108_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gp10b_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int gv100_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
+int tu102_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
 #endif
index 8585a31f59432725feced87d248021192fa1be71..f137f277935f5be81e3c522134fa23493ac83e76 100644 (file)
@@ -2,9 +2,9 @@
 #ifndef __NVKM_MPEG_H__
 #define __NVKM_MPEG_H__
 #include <core/engine.h>
-int nv31_mpeg_new(struct nvkm_device *, int index, struct nvkm_engine **);
-int nv40_mpeg_new(struct nvkm_device *, int index, struct nvkm_engine **);
-int nv44_mpeg_new(struct nvkm_device *, int index, struct nvkm_engine **);
-int nv50_mpeg_new(struct nvkm_device *, int index, struct nvkm_engine **);
-int g84_mpeg_new(struct nvkm_device *, int index, struct nvkm_engine **);
+int nv31_mpeg_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int nv40_mpeg_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int nv44_mpeg_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int nv50_mpeg_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int g84_mpeg_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
 #endif
index 83bb2fcb2cbf5831a04a71d4a10661e922d290c0..ac8f08ce183ce3782c28d3fef6811c6f9f2bc530 100644 (file)
@@ -2,8 +2,8 @@
 #ifndef __NVKM_MSPDEC_H__
 #define __NVKM_MSPDEC_H__
 #include <engine/falcon.h>
-int g98_mspdec_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gt215_mspdec_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gf100_mspdec_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gk104_mspdec_new(struct nvkm_device *, int, struct nvkm_engine **);
+int g98_mspdec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gt215_mspdec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gf100_mspdec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gk104_mspdec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
 #endif
index 69e09fd96e0cbb35ab8f56d1c08cc2afac338157..81c2b6f0ad845547ce4107c9a608c929d4c7af59 100644 (file)
@@ -2,7 +2,7 @@
 #ifndef __NVKM_MSPPP_H__
 #define __NVKM_MSPPP_H__
 #include <engine/falcon.h>
-int g98_msppp_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gt215_msppp_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gf100_msppp_new(struct nvkm_device *, int, struct nvkm_engine **);
+int g98_msppp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gt215_msppp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gf100_msppp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
 #endif
index 9e11cefc9649d28095d3aa53b62935d89f8377f5..2d5fa961ba663f2094042f17362c47dd31f6c05c 100644 (file)
@@ -2,9 +2,9 @@
 #ifndef __NVKM_MSVLD_H__
 #define __NVKM_MSVLD_H__
 #include <engine/falcon.h>
-int g98_msvld_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gt215_msvld_new(struct nvkm_device *, int, struct nvkm_engine **);
-int mcp89_msvld_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gf100_msvld_new(struct nvkm_device *, int, struct nvkm_engine **);
-int gk104_msvld_new(struct nvkm_device *, int, struct nvkm_engine **);
+int g98_msvld_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gt215_msvld_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int mcp89_msvld_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gf100_msvld_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
+int gk104_msvld_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
 #endif
index 1b3183e31606823a7d5c35f0926b6e13d1843a8d..97bd3092f68a6c520c6c13258e53726fbd757f3d 100644 (file)
@@ -11,5 +11,5 @@ struct nvkm_nvdec {
        struct nvkm_falcon falcon;
 };
 
-int gm107_nvdec_new(struct nvkm_device *, int, struct nvkm_nvdec **);
+int gm107_nvdec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_nvdec **);
 #endif
index 33e6ba8adc8dc7ab0972349b004657ddf70f207d..1a259c5c9a7140e12be1e5c130cc255fe9ea074e 100644 (file)
@@ -11,5 +11,5 @@ struct nvkm_nvenc {
        struct nvkm_falcon falcon;
 };
 
-int gm107_nvenc_new(struct nvkm_device *, int, struct nvkm_nvenc **);
+int gm107_nvenc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_nvenc **);
 #endif
index 4d754e7650d9c2263b38e077e1d045c620836a5b..af89d46ea3603ad3423bda116b86d0585e8e014f 100644 (file)
@@ -7,20 +7,23 @@ struct nvkm_pm {
        const struct nvkm_pm_func *func;
        struct nvkm_engine engine;
 
-       struct nvkm_object *perfmon;
+       struct {
+               spinlock_t lock;
+               struct nvkm_object *object;
+       } client;
 
        struct list_head domains;
        struct list_head sources;
        u32 sequence;
 };
 
-int nv40_pm_new(struct nvkm_device *, int, struct nvkm_pm **);
-int nv50_pm_new(struct nvkm_device *, int, struct nvkm_pm **);
-int g84_pm_new(struct nvkm_device *, int, struct nvkm_pm **);
-int gt200_pm_new(struct nvkm_device *, int, struct nvkm_pm **);
-int gt215_pm_new(struct nvkm_device *, int, struct nvkm_pm **);
-int gf100_pm_new(struct nvkm_device *, int, struct nvkm_pm **);
-int gf108_pm_new(struct nvkm_device *, int, struct nvkm_pm **);
-int gf117_pm_new(struct nvkm_device *, int, struct nvkm_pm **);
-int gk104_pm_new(struct nvkm_device *, int, struct nvkm_pm **);
+int nv40_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
+int nv50_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
+int g84_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
+int gt200_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
+int gt215_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
+int gf100_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
+int gf108_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
+int gf117_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
+int gk104_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
 #endif
index f14e98a8a0cafdbd611af97159f52ec198b78d86..37ed7ab8d050ae346de152cf58937d119ffb07a0 100644 (file)
@@ -2,5 +2,5 @@
 #ifndef __NVKM_SEC_H__
 #define __NVKM_SEC_H__
 #include <engine/falcon.h>
-int g98_sec_new(struct nvkm_device *, int, struct nvkm_engine **);
+int g98_sec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
 #endif
index 34dc765648d56f371b024f8ca4448701b85fcbea..06264c840eae6a55ca7063d40fcbef3b66a2bf28 100644 (file)
@@ -18,7 +18,7 @@ struct nvkm_sec2 {
        bool initmsg_received;
 };
 
-int gp102_sec2_new(struct nvkm_device *, int, struct nvkm_sec2 **);
-int gp108_sec2_new(struct nvkm_device *, int, struct nvkm_sec2 **);
-int tu102_sec2_new(struct nvkm_device *, int, struct nvkm_sec2 **);
+int gp102_sec2_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sec2 **);
+int gp108_sec2_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sec2 **);
+int tu102_sec2_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sec2 **);
 #endif
index 2e91769e3ee29f7779c4cb667e42a3ce4175e6ac..b1a53ffbfdef6afbf2a5e4cc3916074c883f3c90 100644 (file)
@@ -12,8 +12,8 @@ struct nvkm_sw {
 
 bool nvkm_sw_mthd(struct nvkm_sw *sw, int chid, int subc, u32 mthd, u32 data);
 
-int nv04_sw_new(struct nvkm_device *, int, struct nvkm_sw **);
-int nv10_sw_new(struct nvkm_device *, int, struct nvkm_sw **);
-int nv50_sw_new(struct nvkm_device *, int, struct nvkm_sw **);
-int gf100_sw_new(struct nvkm_device *, int, struct nvkm_sw **);
+int nv04_sw_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sw **);
+int nv10_sw_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sw **);
+int nv50_sw_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sw **);
+int gf100_sw_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sw **);
 #endif
index 8984415b2a3d5ed24417265fbf9abaebc1862281..1bab268585381fce7d3ce23661e894105fd0dd3a 100644 (file)
@@ -2,5 +2,5 @@
 #ifndef __NVKM_VP_H__
 #define __NVKM_VP_H__
 #include <engine/xtensa.h>
-int g84_vp_new(struct nvkm_device *, int, struct nvkm_engine **);
+int g84_vp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
 #endif
index fbf27b2293a9f9c1200bf3b217bc51ecf661e7b7..3083a5866a5575ba43d5f87023bc7b8394e1fbd0 100644 (file)
@@ -13,7 +13,7 @@ struct nvkm_xtensa {
 };
 
 int nvkm_xtensa_new_(const struct nvkm_xtensa_func *, struct nvkm_device *,
-                    int index, bool enable, u32 addr, struct nvkm_engine **);
+                    enum nvkm_subdev_type, int, bool enable, u32 addr, struct nvkm_engine **);
 
 struct nvkm_xtensa_func {
        u32 fifo_val;
index 836d8b93282296718f120df97ef2a60070db1d5e..c0b254f7f0b5b4b828cc23340f00da465c7f46b3 100644 (file)
@@ -59,12 +59,12 @@ struct nvkm_acr {
 bool nvkm_acr_managed_falcon(struct nvkm_device *, enum nvkm_acr_lsf_id);
 int nvkm_acr_bootstrap_falcons(struct nvkm_device *, unsigned long mask);
 
-int gm200_acr_new(struct nvkm_device *, int, struct nvkm_acr **);
-int gm20b_acr_new(struct nvkm_device *, int, struct nvkm_acr **);
-int gp102_acr_new(struct nvkm_device *, int, struct nvkm_acr **);
-int gp108_acr_new(struct nvkm_device *, int, struct nvkm_acr **);
-int gp10b_acr_new(struct nvkm_device *, int, struct nvkm_acr **);
-int tu102_acr_new(struct nvkm_device *, int, struct nvkm_acr **);
+int gm200_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
+int gm20b_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
+int gp102_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
+int gp108_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
+int gp10b_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
+int tu102_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
 
 struct nvkm_acr_lsfw {
        const struct nvkm_acr_lsf_func *func;
index 14b09f7e46a579a6940b0efc7a518653f39e07bc..4f07836ab984e74636d8943b3f9e1700f054e2fb 100644 (file)
@@ -23,11 +23,11 @@ void nvkm_bar_bar2_reset(struct nvkm_device *);
 struct nvkm_vmm *nvkm_bar_bar2_vmm(struct nvkm_device *);
 void nvkm_bar_flush(struct nvkm_bar *);
 
-int nv50_bar_new(struct nvkm_device *, int, struct nvkm_bar **);
-int g84_bar_new(struct nvkm_device *, int, struct nvkm_bar **);
-int gf100_bar_new(struct nvkm_device *, int, struct nvkm_bar **);
-int gk20a_bar_new(struct nvkm_device *, int, struct nvkm_bar **);
-int gm107_bar_new(struct nvkm_device *, int, struct nvkm_bar **);
-int gm20b_bar_new(struct nvkm_device *, int, struct nvkm_bar **);
-int tu102_bar_new(struct nvkm_device *, int, struct nvkm_bar **);
+int nv50_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
+int g84_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
+int gf100_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
+int gk20a_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
+int gm107_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
+int gm20b_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
+int tu102_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
 #endif
index f2860f8e0c2e111f3e2a12c5f77933479ef74897..b61cfb077533ac5c77a0cb9a3136db89e4ee138f 100644 (file)
@@ -30,5 +30,5 @@ u8  nvbios_rd08(struct nvkm_bios *, u32 addr);
 u16 nvbios_rd16(struct nvkm_bios *, u32 addr);
 u32 nvbios_rd32(struct nvkm_bios *, u32 addr);
 
-int nvkm_bios_new(struct nvkm_device *, int, struct nvkm_bios **);
+int nvkm_bios_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_bios **);
 #endif
index ae9ad6c034fbddf9c82f4214daad600754e687d7..2ac03bbc6133d5beb2c0bfc245eb6e456c7b0856 100644 (file)
@@ -18,9 +18,9 @@ void nvkm_hwsq_wait(struct nvkm_hwsq *, u8 flag, u8 data);
 void nvkm_hwsq_wait_vblank(struct nvkm_hwsq *);
 void nvkm_hwsq_nsec(struct nvkm_hwsq *, u32 nsec);
 
-int nv04_bus_new(struct nvkm_device *, int, struct nvkm_bus **);
-int nv31_bus_new(struct nvkm_device *, int, struct nvkm_bus **);
-int nv50_bus_new(struct nvkm_device *, int, struct nvkm_bus **);
-int g94_bus_new(struct nvkm_device *, int, struct nvkm_bus **);
-int gf100_bus_new(struct nvkm_device *, int, struct nvkm_bus **);
+int nv04_bus_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bus **);
+int nv31_bus_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bus **);
+int nv50_bus_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bus **);
+int g94_bus_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bus **);
+int gf100_bus_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bus **);
 #endif
index bf937e7dfd779ba423aa79b12f85dd89af535996..05b99c9e9a26abe1ecc1da2e79a95aedf62730b1 100644 (file)
@@ -125,14 +125,14 @@ int nvkm_clk_astate(struct nvkm_clk *, int req, int rel, bool wait);
 int nvkm_clk_dstate(struct nvkm_clk *, int req, int rel);
 int nvkm_clk_tstate(struct nvkm_clk *, u8 temperature);
 
-int nv04_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
-int nv40_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
-int nv50_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
-int g84_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
-int mcp77_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
-int gt215_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
-int gf100_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
-int gk104_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
-int gk20a_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
-int gm20b_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
+int nv04_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
+int nv40_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
+int nv50_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
+int g84_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
+int mcp77_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
+int gt215_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
+int gf100_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
+int gk104_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
+int gk20a_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
+int gm20b_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
 #endif
index 50cc7c05eac49c64587bc3c90b24994e82505566..848b5d9ce7055f4340960f92a1f252828d966474 100644 (file)
@@ -14,23 +14,22 @@ struct nvkm_devinit {
 u32 nvkm_devinit_mmio(struct nvkm_devinit *, u32 addr);
 int nvkm_devinit_pll_set(struct nvkm_devinit *, u32 type, u32 khz);
 void nvkm_devinit_meminit(struct nvkm_devinit *);
-u64 nvkm_devinit_disable(struct nvkm_devinit *);
-int nvkm_devinit_post(struct nvkm_devinit *, u64 *disable);
+int nvkm_devinit_post(struct nvkm_devinit *);
 
-int nv04_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int nv05_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int nv10_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int nv1a_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int nv20_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int nv50_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int g84_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int g98_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int gt215_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int mcp89_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int gf100_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int gm107_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int gm200_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int gv100_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int tu102_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
-int ga100_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
+int nv04_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int nv05_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int nv10_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int nv1a_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int nv20_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int nv50_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int g84_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int g98_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int gt215_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int mcp89_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int gf100_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int gm107_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int gm200_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int gv100_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int tu102_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
+int ga100_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
 #endif
index a513c16ab10569a595eb573e60ee9687aac26b65..581458ad38e064b6e9ffaf9fe40d7c7e40305ae2 100644 (file)
@@ -30,8 +30,8 @@ struct nvkm_fault_data {
        u8 reason;
 };
 
-int gp100_fault_new(struct nvkm_device *, int, struct nvkm_fault **);
-int gp10b_fault_new(struct nvkm_device *, int, struct nvkm_fault **);
-int gv100_fault_new(struct nvkm_device *, int, struct nvkm_fault **);
-int tu102_fault_new(struct nvkm_device *, int, struct nvkm_fault **);
+int gp100_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
+int gp10b_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
+int gv100_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
+int tu102_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
 #endif
index 2ecd52aec1d121d050844e1e2e8b425c64c54aee..ef6a6297148c13200ca3f80b7b9fe33340c28c38 100644 (file)
@@ -36,7 +36,11 @@ struct nvkm_fb {
        struct nvkm_blob vpr_scrubber;
 
        struct nvkm_ram *ram;
-       struct nvkm_mm tags;
+
+       struct {
+               struct mutex mutex; /* protects mm and nvkm_memory::tags */
+               struct nvkm_mm mm;
+       } tags;
 
        struct {
                struct nvkm_fb_tile region[16];
@@ -54,40 +58,40 @@ void nvkm_fb_tile_init(struct nvkm_fb *, int region, u32 addr, u32 size,
 void nvkm_fb_tile_fini(struct nvkm_fb *, int region, struct nvkm_fb_tile *);
 void nvkm_fb_tile_prog(struct nvkm_fb *, int region, struct nvkm_fb_tile *);
 
-int nv04_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv10_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv1a_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv20_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv25_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv30_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv35_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv36_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv40_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv41_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv44_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv46_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv47_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv49_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv4e_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int nv50_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int g84_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gt215_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int mcp77_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int mcp89_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gf100_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gf108_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gk104_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gk110_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gk20a_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gm107_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gm200_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gm20b_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gp100_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gp102_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gp10b_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int gv100_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int ga100_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
-int ga102_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
+int nv04_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv10_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv1a_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv20_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv25_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv30_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv35_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv36_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv40_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv41_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv44_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv46_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv47_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv49_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv4e_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int nv50_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int g84_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gt215_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int mcp77_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int mcp89_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gf100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gf108_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gk104_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gk110_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gk20a_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gm107_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gm200_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gm20b_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gp100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gp102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gp10b_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int gv100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int ga100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
+int ga102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
 
 #include <subdev/bios.h>
 #include <subdev/bios/ramcfg.h>
@@ -128,6 +132,7 @@ struct nvkm_ram {
 #define NVKM_RAM_MM_MIXED  (NVKM_MM_HEAP_ANY + 3)
        struct nvkm_mm vram;
        u64 stolen;
+       struct mutex mutex;
 
        int ranks;
        int parts;
index 00111c34311e7794a5967d93b9537047e19e53b3..dabbef0ac96cbad423d57d92987d1b259c0692c6 100644 (file)
@@ -11,7 +11,7 @@ struct nvkm_fuse {
 
 u32 nvkm_fuse_read(struct nvkm_fuse *, u32 addr);
 
-int nv50_fuse_new(struct nvkm_device *, int, struct nvkm_fuse **);
-int gf100_fuse_new(struct nvkm_device *, int, struct nvkm_fuse **);
-int gm107_fuse_new(struct nvkm_device *, int, struct nvkm_fuse **);
+int nv50_fuse_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fuse **);
+int gf100_fuse_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fuse **);
+int gm107_fuse_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fuse **);
 #endif
index cdcce5ece6ff5973426f791cb4f02fc27537a904..0e46ea1fe97291296bb73ab66d508b3674e13077 100644 (file)
@@ -32,10 +32,10 @@ int nvkm_gpio_find(struct nvkm_gpio *, int idx, u8 tag, u8 line,
 int nvkm_gpio_set(struct nvkm_gpio *, int idx, u8 tag, u8 line, int state);
 int nvkm_gpio_get(struct nvkm_gpio *, int idx, u8 tag, u8 line);
 
-int nv10_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **);
-int nv50_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **);
-int g94_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **);
-int gf119_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **);
-int gk104_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **);
-int ga102_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **);
+int nv10_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
+int nv50_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
+int g94_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
+int gf119_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
+int gk104_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
+int ga102_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
 #endif
index 06db67610a5002d90fbed4a962d215203b045f99..cf42a59d4e58f66264e7c4429d00bd2cc2819d4a 100644 (file)
@@ -9,5 +9,5 @@ struct nvkm_gsp {
        struct nvkm_falcon falcon;
 };
 
-int gv100_gsp_new(struct nvkm_device *, int, struct nvkm_gsp **);
+int gv100_gsp_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_gsp **);
 #endif
index 640f649ce497e4a9c93f8fc5ad1940f4ba205125..146e13292203df767794823272d5849e4a5a53c8 100644 (file)
@@ -85,15 +85,15 @@ struct nvkm_i2c {
 struct nvkm_i2c_bus *nvkm_i2c_bus_find(struct nvkm_i2c *, int);
 struct nvkm_i2c_aux *nvkm_i2c_aux_find(struct nvkm_i2c *, int);
 
-int nv04_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **);
-int nv4e_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **);
-int nv50_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **);
-int g94_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **);
-int gf117_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **);
-int gf119_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **);
-int gk104_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **);
-int gk110_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **);
-int gm200_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **);
+int nv04_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
+int nv4e_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
+int nv50_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
+int g94_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
+int gf117_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
+int gf119_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
+int gk104_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
+int gk110_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
+int gm200_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
 
 static inline int
 nvkm_rdi2cr(struct i2c_adapter *adap, u8 addr, u8 reg)
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/ibus.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/ibus.h
deleted file mode 100644 (file)
index db79141..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-#ifndef __NVKM_IBUS_H__
-#define __NVKM_IBUS_H__
-#include <core/subdev.h>
-
-int gf100_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
-int gf117_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
-int gk104_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
-int gk20a_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
-int gm200_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
-int gp10b_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
-#endif
index f483dcd7cd1c9405e6d984e39e28afc35a2a2978..7400d62dcbec49086a5176b27acdcf1c6ff7011a 100644 (file)
@@ -14,6 +14,6 @@ struct nvkm_iccsense {
        u32 power_w_crit;
 };
 
-int gf100_iccsense_new(struct nvkm_device *, int index, struct nvkm_iccsense **);
+int gf100_iccsense_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_iccsense **);
 int nvkm_iccsense_read_all(struct nvkm_iccsense *iccsense);
 #endif
index c74ab7c31d052a1f80afec4c16963272ce7d750b..f967b97d163c0a444bd4813fd41ce388aa3feafc 100644 (file)
@@ -13,6 +13,11 @@ struct nvkm_instmem {
        struct list_head boot;
        u32 reserved;
 
+       /* <=nv4x: protects NV_PRAMIN/BAR2 MM
+        * >=nv50: protects BAR2 MM & LRU
+        */
+       struct mutex mutex;
+
        struct nvkm_memory *vbios;
        struct nvkm_ramht  *ramht;
        struct nvkm_memory *ramro;
@@ -25,8 +30,8 @@ int nvkm_instobj_new(struct nvkm_instmem *, u32 size, u32 align, bool zero,
                     struct nvkm_memory **);
 
 
-int nv04_instmem_new(struct nvkm_device *, int, struct nvkm_instmem **);
-int nv40_instmem_new(struct nvkm_device *, int, struct nvkm_instmem **);
-int nv50_instmem_new(struct nvkm_device *, int, struct nvkm_instmem **);
-int gk20a_instmem_new(struct nvkm_device *, int, struct nvkm_instmem **);
+int nv04_instmem_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_instmem **);
+int nv40_instmem_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_instmem **);
+int nv50_instmem_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_instmem **);
+int gk20a_instmem_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_instmem **);
 #endif
index d76f60d7d29a6924b32910211d02ca1c46b1c547..d32a326a9290740c26015654a7610a61f4c72848 100644 (file)
@@ -13,6 +13,7 @@ struct nvkm_ltc {
        u32 ltc_nr;
        u32 lts_nr;
 
+       struct mutex mutex; /* serialises CBC operations */
        u32 num_tags;
        u32 tag_base;
        struct nvkm_memory *tag_ram;
@@ -33,12 +34,11 @@ int nvkm_ltc_zbc_stencil_get(struct nvkm_ltc *, int index, const u32);
 void nvkm_ltc_invalidate(struct nvkm_ltc *);
 void nvkm_ltc_flush(struct nvkm_ltc *);
 
-int gf100_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
-int gk104_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
-int gk20a_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
-int gm107_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
-int gm200_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
-int gp100_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
-int gp102_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
-int gp10b_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
+int gf100_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
+int gk104_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
+int gm107_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
+int gm200_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
+int gp100_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
+int gp102_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
+int gp10b_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
 #endif
index e45ca458396709be315edb7cf88c36604db96dc4..cb86a56e68d4f86f82537c2a9662cfd7ce4b3f16 100644 (file)
@@ -8,29 +8,29 @@ struct nvkm_mc {
        struct nvkm_subdev subdev;
 };
 
-void nvkm_mc_enable(struct nvkm_device *, enum nvkm_devidx);
-void nvkm_mc_disable(struct nvkm_device *, enum nvkm_devidx);
-bool nvkm_mc_enabled(struct nvkm_device *, enum nvkm_devidx);
-void nvkm_mc_reset(struct nvkm_device *, enum nvkm_devidx);
+void nvkm_mc_enable(struct nvkm_device *, enum nvkm_subdev_type, int);
+void nvkm_mc_disable(struct nvkm_device *, enum nvkm_subdev_type, int);
+bool nvkm_mc_enabled(struct nvkm_device *, enum nvkm_subdev_type, int);
+void nvkm_mc_reset(struct nvkm_device *, enum nvkm_subdev_type, int);
 void nvkm_mc_intr(struct nvkm_device *, bool *handled);
 void nvkm_mc_intr_unarm(struct nvkm_device *);
 void nvkm_mc_intr_rearm(struct nvkm_device *);
-void nvkm_mc_intr_mask(struct nvkm_device *, enum nvkm_devidx, bool enable);
+void nvkm_mc_intr_mask(struct nvkm_device *, enum nvkm_subdev_type, int, bool enable);
 void nvkm_mc_unk260(struct nvkm_device *, u32 data);
 
-int nv04_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int nv11_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int nv17_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int nv44_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int nv50_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int g84_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int g98_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int gt215_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int gf100_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int gk104_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int gk20a_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int gp100_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int gp10b_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int tu102_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
-int ga100_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
+int nv04_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int nv11_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int nv17_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int nv44_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int nv50_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int g84_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int g98_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int gt215_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int gf100_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int gk104_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int gk20a_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int gp100_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int gp10b_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int tu102_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
+int ga100_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
 #endif
index 54cdcb017518660b5509604524db932eee391690..0911e73f742464a4d23e1c13c87339699b75ec1b 100644 (file)
@@ -117,22 +117,24 @@ struct nvkm_mmu {
                struct list_head list;
        } ptc, ptp;
 
+       struct mutex mutex; /* serialises mmu invalidations */
+
        struct nvkm_device_oclass user;
 };
 
-int nv04_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int nv41_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int nv44_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int nv50_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int g84_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int mcp77_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int gf100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int gk104_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int gk20a_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int gm200_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int gm20b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int gp100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int gp10b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int gv100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
-int tu102_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
+int nv04_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int nv41_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int nv44_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int nv50_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int g84_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int mcp77_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int gf100_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int gk104_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int gk20a_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int gm200_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int gm20b_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int gp100_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int gp10b_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int gv100_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
+int tu102_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
 #endif
index 78df1e9def05b098cd571ec0da2e2115a5766bd8..7d4132a17d0fe4cd453b7f7fedf2002e5a7c393a 100644 (file)
@@ -3,5 +3,5 @@
 #define __NVKM_MXM_H__
 #include <core/subdev.h>
 
-int nv50_mxm_new(struct nvkm_device *, int, struct nvkm_subdev **);
+int nv50_mxm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
 #endif
index 4803a4fad4a27dfd5003f46744bc2407a2d0f3a2..74c19bdfb757c3112ee53d3dea7beffdda4889d6 100644 (file)
@@ -39,17 +39,17 @@ void nvkm_pci_wr32(struct nvkm_pci *, u16 addr, u32 data);
 u32 nvkm_pci_mask(struct nvkm_pci *, u16 addr, u32 mask, u32 value);
 void nvkm_pci_rom_shadow(struct nvkm_pci *, bool shadow);
 
-int nv04_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
-int nv40_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
-int nv46_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
-int nv4c_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
-int g84_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
-int g92_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
-int g94_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
-int gf100_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
-int gf106_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
-int gk104_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
-int gp100_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
+int nv04_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
+int nv40_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
+int nv46_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
+int nv4c_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
+int g84_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
+int g92_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
+int g94_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
+int gf100_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
+int gf106_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
+int gk104_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
+int gp100_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
 
 /* pcie functions */
 int nvkm_pcie_set_link(struct nvkm_pci *, enum nvkm_pcie_speed, u8 width);
index 5ff6d1f8985a438bb6daf496363ba384a9081304..f57a3a5a288d303274e357055c17a51319fa5cf3 100644 (file)
@@ -18,6 +18,7 @@ struct nvkm_pmu {
        struct completion wpr_ready;
 
        struct {
+               struct mutex mutex;
                u32 base;
                u32 size;
        } send;
@@ -39,18 +40,18 @@ int nvkm_pmu_send(struct nvkm_pmu *, u32 reply[2], u32 process,
 void nvkm_pmu_pgob(struct nvkm_pmu *, bool enable);
 bool nvkm_pmu_fan_controlled(struct nvkm_device *);
 
-int gt215_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
-int gf100_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
-int gf119_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
-int gk104_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
-int gk110_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
-int gk208_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
-int gk20a_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
-int gm107_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
-int gm200_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
-int gm20b_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
-int gp102_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
-int gp10b_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
+int gt215_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
+int gf100_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
+int gf119_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
+int gk104_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
+int gk110_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
+int gk208_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
+int gk20a_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
+int gm107_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
+int gm200_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
+int gm20b_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
+int gp102_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
+int gp10b_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
 
 /* interface to MEMX process running on PMU */
 struct nvkm_memx;
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/privring.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/privring.h
new file mode 100644 (file)
index 0000000..e1399f8
--- /dev/null
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: MIT */
+#ifndef __NVKM_PRIVRING_H__
+#define __NVKM_PRIVRING_H__
+#include <core/subdev.h>
+
+int gf100_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
+int gf117_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
+int gk104_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
+int gk20a_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
+int gm200_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
+int gp10b_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
+#endif
index 62c34f98c93079fb0c91bfe21f8a9029606a6e83..bd04f49272a696ff3ef5a54b3bdba91043adaef6 100644 (file)
@@ -107,13 +107,13 @@ void nvkm_therm_clkgate_init(struct nvkm_therm *,
 void nvkm_therm_clkgate_enable(struct nvkm_therm *);
 void nvkm_therm_clkgate_fini(struct nvkm_therm *, bool);
 
-int nv40_therm_new(struct nvkm_device *, int, struct nvkm_therm **);
-int nv50_therm_new(struct nvkm_device *, int, struct nvkm_therm **);
-int g84_therm_new(struct nvkm_device *, int, struct nvkm_therm **);
-int gt215_therm_new(struct nvkm_device *, int, struct nvkm_therm **);
-int gf119_therm_new(struct nvkm_device *, int, struct nvkm_therm **);
-int gk104_therm_new(struct nvkm_device *, int, struct nvkm_therm **);
-int gm107_therm_new(struct nvkm_device *, int, struct nvkm_therm **);
-int gm200_therm_new(struct nvkm_device *, int, struct nvkm_therm **);
-int gp100_therm_new(struct nvkm_device *, int, struct nvkm_therm **);
+int nv40_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
+int nv50_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
+int g84_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
+int gt215_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
+int gf119_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
+int gk104_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
+int gm107_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
+int gm200_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
+int gp100_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 #endif
index d06dcbe1faa6e77b7c8ab7c2ef52f3d5b1b714eb..439a3f72b0d7d4ba79f8b671cb35469b1b9a5cd3 100644 (file)
@@ -76,8 +76,8 @@ s64 nvkm_timer_wait_test(struct nvkm_timer_wait *);
 #define nvkm_wait_msec(d,m,addr,mask,data)                                     \
        nvkm_wait_usec((d), (m) * 1000, (addr), (mask), (data))
 
-int nv04_timer_new(struct nvkm_device *, int, struct nvkm_timer **);
-int nv40_timer_new(struct nvkm_device *, int, struct nvkm_timer **);
-int nv41_timer_new(struct nvkm_device *, int, struct nvkm_timer **);
-int gk20a_timer_new(struct nvkm_device *, int, struct nvkm_timer **);
+int nv04_timer_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_timer **);
+int nv40_timer_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_timer **);
+int nv41_timer_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_timer **);
+int gk20a_timer_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_timer **);
 #endif
index 7be0e7e7bd77fa7c16d91774d2c3c29f3073ed9f..ee75c5524c436888eae67e15bfe90350872c4151 100644 (file)
@@ -9,13 +9,24 @@ struct nvkm_top {
        struct list_head device;
 };
 
-u32 nvkm_top_addr(struct nvkm_device *, enum nvkm_devidx);
-u32 nvkm_top_reset(struct nvkm_device *, enum nvkm_devidx);
-u32 nvkm_top_intr(struct nvkm_device *, u32 intr, u64 *subdevs);
-u32 nvkm_top_intr_mask(struct nvkm_device *, enum nvkm_devidx);
-int nvkm_top_fault_id(struct nvkm_device *, enum nvkm_devidx);
-enum nvkm_devidx nvkm_top_fault(struct nvkm_device *, int fault);
-enum nvkm_devidx nvkm_top_engine(struct nvkm_device *, int, int *runl, int *engn);
+struct nvkm_top_device {
+       enum nvkm_subdev_type type;
+       int inst;
+       u32 addr;
+       int fault;
+       int engine;
+       int runlist;
+       int reset;
+       int intr;
+       struct list_head head;
+};
+
+u32 nvkm_top_addr(struct nvkm_device *, enum nvkm_subdev_type, int);
+u32 nvkm_top_reset(struct nvkm_device *, enum nvkm_subdev_type, int);
+u32 nvkm_top_intr_mask(struct nvkm_device *, enum nvkm_subdev_type, int);
+int nvkm_top_fault_id(struct nvkm_device *, enum nvkm_subdev_type, int);
+struct nvkm_subdev *nvkm_top_fault(struct nvkm_device *, int fault);
 
-int gk104_top_new(struct nvkm_device *, int, struct nvkm_top **);
+int gk104_top_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_top **);
+int ga100_top_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_top **);
 #endif
index 45053a2809309b7e1507c5ee9eb3f3ecf60986a4..0be86d5f0158e2447d1c3739c688b85a508eba0b 100644 (file)
@@ -36,10 +36,10 @@ int nvkm_volt_get(struct nvkm_volt *);
 int nvkm_volt_set_id(struct nvkm_volt *, u8 id, u8 min_id, u8 temp,
                     int condition);
 
-int nv40_volt_new(struct nvkm_device *, int, struct nvkm_volt **);
-int gf100_volt_new(struct nvkm_device *, int, struct nvkm_volt **);
-int gf117_volt_new(struct nvkm_device *, int, struct nvkm_volt **);
-int gk104_volt_new(struct nvkm_device *, int, struct nvkm_volt **);
-int gk20a_volt_new(struct nvkm_device *, int, struct nvkm_volt **);
-int gm20b_volt_new(struct nvkm_device *, int, struct nvkm_volt **);
+int nv40_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
+int gf100_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
+int gf117_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
+int gk104_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
+int gk20a_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
+int gm20b_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
 #endif
index f08b31d84d4d3a25673afa5ec84f39b9dbb7face..0a9334deffe20296770ce590eb427c9286bad4ee 100644 (file)
@@ -269,19 +269,19 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
        if (device->info.family >= NV_DEVICE_INFO_V0_KEPLER) {
                if (init->fb_ctxdma_handle == ~0) {
                        switch (init->tt_ctxdma_handle) {
-                       case 0x01: engine = NV_DEVICE_INFO_ENGINE_GR    ; break;
-                       case 0x02: engine = NV_DEVICE_INFO_ENGINE_MSPDEC; break;
-                       case 0x04: engine = NV_DEVICE_INFO_ENGINE_MSPPP ; break;
-                       case 0x08: engine = NV_DEVICE_INFO_ENGINE_MSVLD ; break;
-                       case 0x30: engine = NV_DEVICE_INFO_ENGINE_CE    ; break;
+                       case 0x01: engine = NV_DEVICE_HOST_RUNLIST_ENGINES_GR    ; break;
+                       case 0x02: engine = NV_DEVICE_HOST_RUNLIST_ENGINES_MSPDEC; break;
+                       case 0x04: engine = NV_DEVICE_HOST_RUNLIST_ENGINES_MSPPP ; break;
+                       case 0x08: engine = NV_DEVICE_HOST_RUNLIST_ENGINES_MSVLD ; break;
+                       case 0x30: engine = NV_DEVICE_HOST_RUNLIST_ENGINES_CE    ; break;
                        default:
                                return nouveau_abi16_put(abi16, -ENOSYS);
                        }
                } else {
-                       engine = NV_DEVICE_INFO_ENGINE_GR;
+                       engine = NV_DEVICE_HOST_RUNLIST_ENGINES_GR;
                }
 
-               if (engine != NV_DEVICE_INFO_ENGINE_CE)
+               if (engine != NV_DEVICE_HOST_RUNLIST_ENGINES_CE)
                        engine = nvif_fifo_runlist(device, engine);
                else
                        engine = nvif_fifo_runlist_ce(device);
index e48f1f7eb3705376c420f0086f4c5bf87989d8c3..7cfac265fd4527c1af5e26b696c19afa08f65065 100644 (file)
@@ -556,7 +556,7 @@ nouveau_channels_init(struct nouveau_drm *drm)
        } args = {
                .m.version = 1,
                .m.count = sizeof(args.v) / sizeof(args.v.channels),
-               .v.channels.mthd = NV_DEVICE_FIFO_CHANNELS,
+               .v.channels.mthd = NV_DEVICE_HOST_CHANNELS,
        };
        struct nvif_object *device = &drm->client.device.object;
        int ret;
index 1b2169e9c295d5cb4bdb3022a8b93de25cf98032..885815ea917f89341b7c1b3fb21015bf84d46908 100644 (file)
@@ -344,7 +344,7 @@ nouveau_accel_gr_init(struct nouveau_drm *drm)
 
        /* Allocate channel that has access to the graphics engine. */
        if (device->info.family >= NV_DEVICE_INFO_V0_KEPLER) {
-               arg0 = nvif_fifo_runlist(device, NV_DEVICE_INFO_ENGINE_GR);
+               arg0 = nvif_fifo_runlist(device, NV_DEVICE_HOST_RUNLIST_ENGINES_GR);
                arg1 = 1;
        } else {
                arg0 = NvDmaFB;
index e84a2e2ff043152b058c519eadfceee4741286e5..a463289962b2507cc439a8958c1c157be0f29052 100644 (file)
@@ -41,9 +41,11 @@ nvif_fifo_runlists(struct nvif_device *device)
                return -ENOMEM;
        a->m.version = 1;
        a->m.count = sizeof(a->v) / sizeof(a->v.runlists);
-       a->v.runlists.mthd = NV_DEVICE_FIFO_RUNLISTS;
-       for (i = 0; i < ARRAY_SIZE(a->v.runlist); i++)
-               a->v.runlist[i].mthd = NV_DEVICE_FIFO_RUNLIST_ENGINES(i);
+       a->v.runlists.mthd = NV_DEVICE_HOST_RUNLISTS;
+       for (i = 0; i < ARRAY_SIZE(a->v.runlist); i++) {
+               a->v.runlist[i].mthd = NV_DEVICE_HOST_RUNLIST_ENGINES;
+               a->v.runlist[i].data = i;
+       }
 
        ret = nvif_object_mthd(object, NV_DEVICE_V0_INFO, a, sizeof(*a));
        if (ret)
@@ -58,7 +60,7 @@ nvif_fifo_runlists(struct nvif_device *device)
        }
 
        for (i = 0; i < device->runlists; i++) {
-               if (a->v.runlists.data & BIT_ULL(i))
+               if (a->v.runlist[i].mthd != NV_DEVICE_INFO_INVALID)
                        device->runlist[i].engines = a->v.runlist[i].data;
        }
 
@@ -70,29 +72,15 @@ done:
 u64
 nvif_fifo_runlist(struct nvif_device *device, u64 engine)
 {
-       struct nvif_object *object = &device->object;
-       struct {
-               struct nv_device_info_v1 m;
-               struct {
-                       struct nv_device_info_v1_data engine;
-               } v;
-       } a = {
-               .m.version = 1,
-               .m.count = sizeof(a.v) / sizeof(a.v.engine),
-               .v.engine.mthd = engine,
-       };
        u64 runm = 0;
        int ret, i;
 
        if ((ret = nvif_fifo_runlists(device)))
                return runm;
 
-       ret = nvif_object_mthd(object, NV_DEVICE_V0_INFO, &a, sizeof(a));
-       if (ret == 0) {
-               for (i = 0; i < device->runlists; i++) {
-                       if (device->runlist[i].engines & a.v.engine.data)
-                               runm |= BIT_ULL(i);
-               }
+       for (i = 0; i < device->runlists; i++) {
+               if (device->runlist[i].engines & engine)
+                       runm |= BIT_ULL(i);
        }
 
        return runm;
index 1a47c40e171b36e0e2ee519ea30851357ca99f05..e41a39ae1597aac09ed5bc9c78e7613ca9026507 100644 (file)
@@ -40,10 +40,11 @@ nvkm_engine_unref(struct nvkm_engine **pengine)
 {
        struct nvkm_engine *engine = *pengine;
        if (engine) {
-               mutex_lock(&engine->subdev.mutex);
-               if (--engine->usecount == 0)
+               if (refcount_dec_and_mutex_lock(&engine->use.refcount, &engine->use.mutex)) {
                        nvkm_subdev_fini(&engine->subdev, false);
-               mutex_unlock(&engine->subdev.mutex);
+                       engine->use.enabled = false;
+                       mutex_unlock(&engine->use.mutex);
+               }
                *pengine = NULL;
        }
 }
@@ -51,17 +52,21 @@ nvkm_engine_unref(struct nvkm_engine **pengine)
 struct nvkm_engine *
 nvkm_engine_ref(struct nvkm_engine *engine)
 {
+       int ret;
        if (engine) {
-               mutex_lock(&engine->subdev.mutex);
-               if (++engine->usecount == 1) {
-                       int ret = nvkm_subdev_init(&engine->subdev);
-                       if (ret) {
-                               engine->usecount--;
-                               mutex_unlock(&engine->subdev.mutex);
-                               return ERR_PTR(ret);
+               if (!refcount_inc_not_zero(&engine->use.refcount)) {
+                       mutex_lock(&engine->use.mutex);
+                       if (!refcount_inc_not_zero(&engine->use.refcount)) {
+                               engine->use.enabled = true;
+                               if ((ret = nvkm_subdev_init(&engine->subdev))) {
+                                       engine->use.enabled = false;
+                                       mutex_unlock(&engine->use.mutex);
+                                       return ERR_PTR(ret);
+                               }
+                               refcount_set(&engine->use.refcount, 1);
                        }
+                       mutex_unlock(&engine->use.mutex);
                }
-               mutex_unlock(&engine->subdev.mutex);
        }
        return engine;
 }
@@ -114,7 +119,7 @@ nvkm_engine_init(struct nvkm_subdev *subdev)
        int ret = 0, i;
        s64 time;
 
-       if (!engine->usecount) {
+       if (!engine->use.enabled) {
                nvkm_trace(subdev, "init skipped, engine has no users\n");
                return ret;
        }
@@ -156,11 +161,12 @@ nvkm_engine_dtor(struct nvkm_subdev *subdev)
        struct nvkm_engine *engine = nvkm_engine(subdev);
        if (engine->func->dtor)
                return engine->func->dtor(engine);
+       mutex_destroy(&engine->use.mutex);
        return engine;
 }
 
-static const struct nvkm_subdev_func
-nvkm_engine_func = {
+const struct nvkm_subdev_func
+nvkm_engine = {
        .dtor = nvkm_engine_dtor,
        .preinit = nvkm_engine_preinit,
        .init = nvkm_engine_init,
@@ -170,14 +176,15 @@ nvkm_engine_func = {
 };
 
 int
-nvkm_engine_ctor(const struct nvkm_engine_func *func,
-                struct nvkm_device *device, int index, bool enable,
-                struct nvkm_engine *engine)
+nvkm_engine_ctor(const struct nvkm_engine_func *func, struct nvkm_device *device,
+                enum nvkm_subdev_type type, int inst, bool enable, struct nvkm_engine *engine)
 {
-       nvkm_subdev_ctor(&nvkm_engine_func, device, index, &engine->subdev);
+       nvkm_subdev_ctor(&nvkm_engine, device, type, inst, &engine->subdev);
        engine->func = func;
+       refcount_set(&engine->use.refcount, 0);
+       mutex_init(&engine->use.mutex);
 
-       if (!nvkm_boolopt(device->cfgopt, nvkm_subdev_name[index], enable)) {
+       if (!nvkm_boolopt(device->cfgopt, engine->subdev.name, enable)) {
                nvkm_debug(&engine->subdev, "disabled\n");
                return -ENODEV;
        }
@@ -187,11 +194,11 @@ nvkm_engine_ctor(const struct nvkm_engine_func *func,
 }
 
 int
-nvkm_engine_new_(const struct nvkm_engine_func *func,
-                struct nvkm_device *device, int index, bool enable,
+nvkm_engine_new_(const struct nvkm_engine_func *func, struct nvkm_device *device,
+                enum nvkm_subdev_type type, int inst, bool enable,
                 struct nvkm_engine **pengine)
 {
        if (!(*pengine = kzalloc(sizeof(**pengine), GFP_KERNEL)))
                return -ENOMEM;
-       return nvkm_engine_ctor(func, device, index, enable, *pengine);
+       return nvkm_engine_ctor(func, device, type, inst, enable, *pengine);
 }
index 38130ef272d6f1023458f18cdf122fe1b16f3329..c69daac9bac7b0761e99815fc3dce7f51798e836 100644 (file)
@@ -33,13 +33,13 @@ nvkm_memory_tags_put(struct nvkm_memory *memory, struct nvkm_device *device,
        struct nvkm_fb *fb = device->fb;
        struct nvkm_tags *tags = *ptags;
        if (tags) {
-               mutex_lock(&fb->subdev.mutex);
+               mutex_lock(&fb->tags.mutex);
                if (refcount_dec_and_test(&tags->refcount)) {
-                       nvkm_mm_free(&fb->tags, &tags->mn);
+                       nvkm_mm_free(&fb->tags.mm, &tags->mn);
                        kfree(memory->tags);
                        memory->tags = NULL;
                }
-               mutex_unlock(&fb->subdev.mutex);
+               mutex_unlock(&fb->tags.mutex);
                *ptags = NULL;
        }
 }
@@ -52,29 +52,29 @@ nvkm_memory_tags_get(struct nvkm_memory *memory, struct nvkm_device *device,
        struct nvkm_fb *fb = device->fb;
        struct nvkm_tags *tags;
 
-       mutex_lock(&fb->subdev.mutex);
+       mutex_lock(&fb->tags.mutex);
        if ((tags = memory->tags)) {
                /* If comptags exist for the memory, but a different amount
                 * than requested, the buffer is being mapped with settings
                 * that are incompatible with existing mappings.
                 */
                if (tags->mn && tags->mn->length != nr) {
-                       mutex_unlock(&fb->subdev.mutex);
+                       mutex_unlock(&fb->tags.mutex);
                        return -EINVAL;
                }
 
                refcount_inc(&tags->refcount);
-               mutex_unlock(&fb->subdev.mutex);
+               mutex_unlock(&fb->tags.mutex);
                *ptags = tags;
                return 0;
        }
 
        if (!(tags = kmalloc(sizeof(*tags), GFP_KERNEL))) {
-               mutex_unlock(&fb->subdev.mutex);
+               mutex_unlock(&fb->tags.mutex);
                return -ENOMEM;
        }
 
-       if (!nvkm_mm_head(&fb->tags, 0, 1, nr, nr, 1, &tags->mn)) {
+       if (!nvkm_mm_head(&fb->tags.mm, 0, 1, nr, nr, 1, &tags->mn)) {
                if (clr)
                        clr(device, tags->mn->offset, tags->mn->length);
        } else {
@@ -92,7 +92,7 @@ nvkm_memory_tags_get(struct nvkm_memory *memory, struct nvkm_device *device,
 
        refcount_set(&tags->refcount, 1);
        *ptags = memory->tags = tags;
-       mutex_unlock(&fb->subdev.mutex);
+       mutex_unlock(&fb->tags.mutex);
        return 0;
 }
 
index 49d468b45d3f4def458e7d1e9051e79434e72340..a74b7acb6832e55540d2229c0dd16f9288af8a08 100644 (file)
 #include <core/option.h>
 #include <subdev/mc.h>
 
-static struct lock_class_key nvkm_subdev_lock_class[NVKM_SUBDEV_NR];
-
 const char *
-nvkm_subdev_name[NVKM_SUBDEV_NR] = {
-       [NVKM_SUBDEV_ACR     ] = "acr",
-       [NVKM_SUBDEV_BAR     ] = "bar",
-       [NVKM_SUBDEV_VBIOS   ] = "bios",
-       [NVKM_SUBDEV_BUS     ] = "bus",
-       [NVKM_SUBDEV_CLK     ] = "clk",
-       [NVKM_SUBDEV_DEVINIT ] = "devinit",
-       [NVKM_SUBDEV_FAULT   ] = "fault",
-       [NVKM_SUBDEV_FB      ] = "fb",
-       [NVKM_SUBDEV_FUSE    ] = "fuse",
-       [NVKM_SUBDEV_GPIO    ] = "gpio",
-       [NVKM_SUBDEV_GSP     ] = "gsp",
-       [NVKM_SUBDEV_I2C     ] = "i2c",
-       [NVKM_SUBDEV_IBUS    ] = "priv",
-       [NVKM_SUBDEV_ICCSENSE] = "iccsense",
-       [NVKM_SUBDEV_INSTMEM ] = "imem",
-       [NVKM_SUBDEV_LTC     ] = "ltc",
-       [NVKM_SUBDEV_MC      ] = "mc",
-       [NVKM_SUBDEV_MMU     ] = "mmu",
-       [NVKM_SUBDEV_MXM     ] = "mxm",
-       [NVKM_SUBDEV_PCI     ] = "pci",
-       [NVKM_SUBDEV_PMU     ] = "pmu",
-       [NVKM_SUBDEV_THERM   ] = "therm",
-       [NVKM_SUBDEV_TIMER   ] = "tmr",
-       [NVKM_SUBDEV_TOP     ] = "top",
-       [NVKM_SUBDEV_VOLT    ] = "volt",
-       [NVKM_ENGINE_BSP     ] = "bsp",
-       [NVKM_ENGINE_CE0     ] = "ce0",
-       [NVKM_ENGINE_CE1     ] = "ce1",
-       [NVKM_ENGINE_CE2     ] = "ce2",
-       [NVKM_ENGINE_CE3     ] = "ce3",
-       [NVKM_ENGINE_CE4     ] = "ce4",
-       [NVKM_ENGINE_CE5     ] = "ce5",
-       [NVKM_ENGINE_CE6     ] = "ce6",
-       [NVKM_ENGINE_CE7     ] = "ce7",
-       [NVKM_ENGINE_CE8     ] = "ce8",
-       [NVKM_ENGINE_CIPHER  ] = "cipher",
-       [NVKM_ENGINE_DISP    ] = "disp",
-       [NVKM_ENGINE_DMAOBJ  ] = "dma",
-       [NVKM_ENGINE_FIFO    ] = "fifo",
-       [NVKM_ENGINE_GR      ] = "gr",
-       [NVKM_ENGINE_IFB     ] = "ifb",
-       [NVKM_ENGINE_ME      ] = "me",
-       [NVKM_ENGINE_MPEG    ] = "mpeg",
-       [NVKM_ENGINE_MSENC   ] = "msenc",
-       [NVKM_ENGINE_MSPDEC  ] = "mspdec",
-       [NVKM_ENGINE_MSPPP   ] = "msppp",
-       [NVKM_ENGINE_MSVLD   ] = "msvld",
-       [NVKM_ENGINE_NVENC0  ] = "nvenc0",
-       [NVKM_ENGINE_NVENC1  ] = "nvenc1",
-       [NVKM_ENGINE_NVENC2  ] = "nvenc2",
-       [NVKM_ENGINE_NVDEC0  ] = "nvdec0",
-       [NVKM_ENGINE_NVDEC1  ] = "nvdec1",
-       [NVKM_ENGINE_NVDEC2  ] = "nvdec2",
-       [NVKM_ENGINE_PM      ] = "pm",
-       [NVKM_ENGINE_SEC     ] = "sec",
-       [NVKM_ENGINE_SEC2    ] = "sec2",
-       [NVKM_ENGINE_SW      ] = "sw",
-       [NVKM_ENGINE_VIC     ] = "vic",
-       [NVKM_ENGINE_VP      ] = "vp",
+nvkm_subdev_type[NVKM_SUBDEV_NR] = {
+#define NVKM_LAYOUT_ONCE(type,data,ptr,...) [type] = #ptr,
+#define NVKM_LAYOUT_INST(A...) NVKM_LAYOUT_ONCE(A)
+#include <core/layout.h>
+#undef NVKM_LAYOUT_ONCE
+#undef NVKM_LAYOUT_INST
 };
 
 void
@@ -125,7 +69,7 @@ nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend)
                }
        }
 
-       nvkm_mc_reset(device, subdev->index);
+       nvkm_mc_reset(device, subdev->type, subdev->inst);
 
        time = ktime_to_us(ktime_get()) - time;
        nvkm_trace(subdev, "%s completed in %lldus\n", action, time);
@@ -199,6 +143,7 @@ nvkm_subdev_del(struct nvkm_subdev **psubdev)
        if (subdev && !WARN_ON(!subdev->func)) {
                nvkm_trace(subdev, "destroy running...\n");
                time = ktime_to_us(ktime_get());
+               list_del(&subdev->head);
                if (subdev->func->dtor)
                        *psubdev = subdev->func->dtor(subdev);
                time = ktime_to_us(ktime_get()) - time;
@@ -209,26 +154,41 @@ nvkm_subdev_del(struct nvkm_subdev **psubdev)
 }
 
 void
-nvkm_subdev_ctor(const struct nvkm_subdev_func *func,
-                struct nvkm_device *device, int index,
-                struct nvkm_subdev *subdev)
+nvkm_subdev_disable(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
+{
+       struct nvkm_subdev *subdev;
+       list_for_each_entry(subdev, &device->subdev, head) {
+               if (subdev->type == type && subdev->inst == inst) {
+                       *subdev->pself = NULL;
+                       nvkm_subdev_del(&subdev);
+                       break;
+               }
+       }
+}
+
+void
+nvkm_subdev_ctor(const struct nvkm_subdev_func *func, struct nvkm_device *device,
+                enum nvkm_subdev_type type, int inst, struct nvkm_subdev *subdev)
 {
-       const char *name = nvkm_subdev_name[index];
        subdev->func = func;
        subdev->device = device;
-       subdev->index = index;
-
-       __mutex_init(&subdev->mutex, name, &nvkm_subdev_lock_class[index]);
-       subdev->debug = nvkm_dbgopt(device->dbgopt, name);
+       subdev->type = type;
+       subdev->inst = inst < 0 ? 0 : inst;
+
+       if (inst >= 0)
+               snprintf(subdev->name, sizeof(subdev->name), "%s%d", nvkm_subdev_type[type], inst);
+       else
+               strscpy(subdev->name, nvkm_subdev_type[type], sizeof(subdev->name));
+       subdev->debug = nvkm_dbgopt(device->dbgopt, subdev->name);
+       list_add_tail(&subdev->head, &device->subdev);
 }
 
 int
-nvkm_subdev_new_(const struct nvkm_subdev_func *func,
-                struct nvkm_device *device, int index,
-                struct nvkm_subdev **psubdev)
+nvkm_subdev_new_(const struct nvkm_subdev_func *func, struct nvkm_device *device,
+                enum nvkm_subdev_type type, int inst, struct nvkm_subdev **psubdev)
 {
        if (!(*psubdev = kzalloc(sizeof(**psubdev), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(func, device, index, *psubdev);
+       nvkm_subdev_ctor(func, device, type, inst, *psubdev);
        return 0;
 }
index 44e116f7880dd02e6754d3d328f1d909a0a7041a..39f6db269c7a5f25a126ed32d81f3617983020f7 100644 (file)
@@ -36,8 +36,9 @@ g84_bsp = {
 };
 
 int
-g84_bsp_new(struct nvkm_device *device, int index, struct nvkm_engine **pengine)
+g84_bsp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+           struct nvkm_engine **pengine)
 {
-       return nvkm_xtensa_new_(&g84_bsp, device, index,
+       return nvkm_xtensa_new_(&g84_bsp, device, type, inst,
                                device->chipset != 0x92, 0x103000, pengine);
 }
index ad9f855c9a407223c63b505e151e34b6953a1f16..b9cc3956598570fe89db1c416ed06ec1cfb98c6e 100644 (file)
@@ -29,9 +29,7 @@
 static void
 gf100_ce_init(struct nvkm_falcon *ce)
 {
-       struct nvkm_device *device = ce->engine.subdev.device;
-       const int index = ce->engine.subdev.index - NVKM_ENGINE_CE0;
-       nvkm_wr32(device, ce->addr + 0x084, index);
+       nvkm_wr32(ce->engine.subdev.device, ce->addr + 0x084, ce->engine.subdev.inst);
 }
 
 static const struct nvkm_falcon_func
@@ -63,16 +61,9 @@ gf100_ce1 = {
 };
 
 int
-gf100_ce_new(struct nvkm_device *device, int index,
+gf100_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
             struct nvkm_engine **pengine)
 {
-       if (index == NVKM_ENGINE_CE0) {
-               return nvkm_falcon_new_(&gf100_ce0, device, index, true,
-                                       0x104000, pengine);
-       } else
-       if (index == NVKM_ENGINE_CE1) {
-               return nvkm_falcon_new_(&gf100_ce1, device, index, true,
-                                       0x105000, pengine);
-       }
-       return -ENODEV;
+       return nvkm_falcon_new_(inst ? &gf100_ce1 : &gf100_ce0, device, type, inst, true,
+                               0x104000 + (inst * 0x1000), pengine);
 }
index 9e0b53a10f773bf648f046cc8e151427a88afc94..27f29eb0494da1212add0523ef51128ce8a5e0a3 100644 (file)
@@ -58,9 +58,9 @@ gk104_ce_intr_launcherr(struct nvkm_engine *ce, const u32 base)
 void
 gk104_ce_intr(struct nvkm_engine *ce)
 {
-       const u32 base = (ce->subdev.index - NVKM_ENGINE_CE0) * 0x1000;
        struct nvkm_subdev *subdev = &ce->subdev;
        struct nvkm_device *device = subdev->device;
+       const u32 base = subdev->inst * 0x1000;
        u32 mask = nvkm_rd32(device, 0x104904 + base);
        u32 intr = nvkm_rd32(device, 0x104908 + base) & mask;
        if (intr & 0x00000001) {
@@ -94,8 +94,8 @@ gk104_ce = {
 };
 
 int
-gk104_ce_new(struct nvkm_device *device, int index,
+gk104_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
             struct nvkm_engine **pengine)
 {
-       return nvkm_engine_new_(&gk104_ce, device, index, true, pengine);
+       return nvkm_engine_new_(&gk104_ce, device, type, inst, true, pengine);
 }
index c0df7daa85e274760e13cde68d4530fce514f7cf..c3c476592c4343031970104ad753581cfd78c088 100644 (file)
@@ -36,8 +36,8 @@ gm107_ce = {
 };
 
 int
-gm107_ce_new(struct nvkm_device *device, int index,
+gm107_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
             struct nvkm_engine **pengine)
 {
-       return nvkm_engine_new_(&gm107_ce, device, index, true, pengine);
+       return nvkm_engine_new_(&gm107_ce, device, type, inst, true, pengine);
 }
index c6fa8b20737e690cdc6d5d9e94bdd23b91b1129e..d2db61865371534b0b70b6781246be58787d20c0 100644 (file)
@@ -35,8 +35,8 @@ gm200_ce = {
 };
 
 int
-gm200_ce_new(struct nvkm_device *device, int index,
+gm200_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
             struct nvkm_engine **pengine)
 {
-       return nvkm_engine_new_(&gm200_ce, device, index, true, pengine);
+       return nvkm_engine_new_(&gm200_ce, device, type, inst, true, pengine);
 }
index c7710456bc309d2c013a37711a1585b8d6a57784..a4f08a4472c900a942ec59722020ee4c8421e2a7 100644 (file)
@@ -59,9 +59,9 @@ gp100_ce_intr_launcherr(struct nvkm_engine *ce, const u32 base)
 void
 gp100_ce_intr(struct nvkm_engine *ce)
 {
-       const u32 base = (ce->subdev.index - NVKM_ENGINE_CE0) * 0x80;
        struct nvkm_subdev *subdev = &ce->subdev;
        struct nvkm_device *device = subdev->device;
+       const u32 base = subdev->inst * 0x80;
        u32 mask = nvkm_rd32(device, 0x10440c + base);
        u32 intr = nvkm_rd32(device, 0x104410 + base) & mask;
        if (intr & 0x00000001) { //XXX: guess
@@ -95,8 +95,8 @@ gp100_ce = {
 };
 
 int
-gp100_ce_new(struct nvkm_device *device, int index,
+gp100_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
             struct nvkm_engine **pengine)
 {
-       return nvkm_engine_new_(&gp100_ce, device, index, true, pengine);
+       return nvkm_engine_new_(&gp100_ce, device, type, inst, true, pengine);
 }
index 985c8f653874d2a066ad683634ea776d390ac6ec..180d497a95eb0322dc0f792e0c4b500179ca40de 100644 (file)
@@ -37,8 +37,8 @@ gp102_ce = {
 };
 
 int
-gp102_ce_new(struct nvkm_device *device, int index,
+gp102_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
             struct nvkm_engine **pengine)
 {
-       return nvkm_engine_new_(&gp102_ce, device, index, true, pengine);
+       return nvkm_engine_new_(&gp102_ce, device, type, inst, true, pengine);
 }
index 63ac51a54fd3c981d105e9b1cdb0525ac7016be9..704df0f2d1f16c39fc5cbe897b80ffdc76fe3461 100644 (file)
@@ -44,7 +44,7 @@ gt215_ce_intr(struct nvkm_falcon *ce, struct nvkm_fifo_chan *chan)
 {
        struct nvkm_subdev *subdev = &ce->engine.subdev;
        struct nvkm_device *device = subdev->device;
-       const u32 base = (subdev->index - NVKM_ENGINE_CE0) * 0x1000;
+       const u32 base = subdev->inst * 0x1000;
        u32 ssta = nvkm_rd32(device, 0x104040 + base) & 0x0000ffff;
        u32 addr = nvkm_rd32(device, 0x104040 + base) >> 16;
        u32 mthd = (addr & 0x07ff) << 2;
@@ -75,9 +75,9 @@ gt215_ce = {
 };
 
 int
-gt215_ce_new(struct nvkm_device *device, int index,
+gt215_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
             struct nvkm_engine **pengine)
 {
-       return nvkm_falcon_new_(&gt215_ce, device, index,
+       return nvkm_falcon_new_(&gt215_ce, device, type, inst,
                                (device->chipset != 0xaf), 0x104000, pengine);
 }
index fcda3de45857583be80a84bdaa02a0713200b1fb..cd5e9cdca1cf9609f3d88fcfc4d2de06ce93a527 100644 (file)
@@ -33,8 +33,8 @@ gv100_ce = {
 };
 
 int
-gv100_ce_new(struct nvkm_device *device, int index,
+gv100_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
             struct nvkm_engine **pengine)
 {
-       return nvkm_engine_new_(&gv100_ce, device, index, true, pengine);
+       return nvkm_engine_new_(&gv100_ce, device, type, inst, true, pengine);
 }
index b4308e2d8c759962fbd91e8deecea968a7b6d6e4..e5ff92d9364cb0e8ebabe7b4dead56cfb02b96af 100644 (file)
@@ -33,8 +33,8 @@ tu102_ce = {
 };
 
 int
-tu102_ce_new(struct nvkm_device *device, int index,
+tu102_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
             struct nvkm_engine **pengine)
 {
-       return nvkm_engine_new_(&tu102_ce, device, index, true, pengine);
+       return nvkm_engine_new_(&tu102_ce, device, type, inst, true, pengine);
 }
index 68ffb520531e0f784b485e663f3f637b99528253..be2a7181dc159a41739f8e0caedae6d58cdef8fc 100644 (file)
@@ -127,8 +127,8 @@ g84_cipher = {
 };
 
 int
-g84_cipher_new(struct nvkm_device *device, int index,
+g84_cipher_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
               struct nvkm_engine **pengine)
 {
-       return nvkm_engine_new_(&g84_cipher, device, index, true, pengine);
+       return nvkm_engine_new_(&g84_cipher, device, type, inst, true, pengine);
 }
index cdcc851e06f9b5d8e82341048f8e77e53f07363c..b930f539feec727c98640c72f0249a94e3eead60 100644 (file)
@@ -71,2640 +71,2557 @@ nvkm_device_list(u64 *name, int size)
 static const struct nvkm_device_chip
 null_chipset = {
        .name = "NULL",
-       .bios = nvkm_bios_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
 };
 
 static const struct nvkm_device_chip
 nv4_chipset = {
        .name = "NV04",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv04_devinit_new,
-       .fb = nv04_fb_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv04_fifo_new,
-       .gr = nv04_gr_new,
-       .sw = nv04_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv04_devinit_new },
+       .fb       = { 0x00000001, nv04_fb_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv04_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv04_fifo_new },
+       .gr       = { 0x00000001, nv04_gr_new },
+       .sw       = { 0x00000001, nv04_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv5_chipset = {
        .name = "NV05",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv05_devinit_new,
-       .fb = nv04_fb_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv04_fifo_new,
-       .gr = nv04_gr_new,
-       .sw = nv04_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv05_devinit_new },
+       .fb       = { 0x00000001, nv04_fb_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv04_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv04_fifo_new },
+       .gr       = { 0x00000001, nv04_gr_new },
+       .sw       = { 0x00000001, nv04_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv10_chipset = {
        .name = "NV10",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv10_devinit_new,
-       .fb = nv10_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .gr = nv10_gr_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv10_devinit_new },
+       .fb       = { 0x00000001, nv10_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv04_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .gr       = { 0x00000001, nv10_gr_new },
 };
 
 static const struct nvkm_device_chip
 nv11_chipset = {
        .name = "NV11",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv10_devinit_new,
-       .fb = nv10_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv11_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv10_fifo_new,
-       .gr = nv15_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv10_devinit_new },
+       .fb       = { 0x00000001, nv10_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv11_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv10_fifo_new },
+       .gr       = { 0x00000001, nv15_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv15_chipset = {
        .name = "NV15",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv10_devinit_new,
-       .fb = nv10_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv10_fifo_new,
-       .gr = nv15_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv10_devinit_new },
+       .fb       = { 0x00000001, nv10_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv04_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv10_fifo_new },
+       .gr       = { 0x00000001, nv15_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv17_chipset = {
        .name = "NV17",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv10_devinit_new,
-       .fb = nv10_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv17_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv10_devinit_new },
+       .fb       = { 0x00000001, nv10_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv17_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv18_chipset = {
        .name = "NV18",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv10_devinit_new,
-       .fb = nv10_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv17_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv10_devinit_new },
+       .fb       = { 0x00000001, nv10_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv17_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv1a_chipset = {
        .name = "nForce",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv1a_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv10_fifo_new,
-       .gr = nv15_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv1a_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv04_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv10_fifo_new },
+       .gr       = { 0x00000001, nv15_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv1f_chipset = {
        .name = "nForce2",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv1a_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv17_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv1a_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv17_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv20_chipset = {
        .name = "NV20",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv20_devinit_new,
-       .fb = nv20_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv20_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv20_devinit_new },
+       .fb       = { 0x00000001, nv20_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv20_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv25_chipset = {
        .name = "NV25",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv20_devinit_new,
-       .fb = nv25_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv25_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv20_devinit_new },
+       .fb       = { 0x00000001, nv25_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv25_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv28_chipset = {
        .name = "NV28",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv20_devinit_new,
-       .fb = nv25_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv25_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv20_devinit_new },
+       .fb       = { 0x00000001, nv25_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv25_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv2a_chipset = {
        .name = "NV2A",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv20_devinit_new,
-       .fb = nv25_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv2a_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv20_devinit_new },
+       .fb       = { 0x00000001, nv25_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv2a_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv30_chipset = {
        .name = "NV30",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv20_devinit_new,
-       .fb = nv30_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv30_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv20_devinit_new },
+       .fb       = { 0x00000001, nv30_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv30_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv31_chipset = {
        .name = "NV31",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv20_devinit_new,
-       .fb = nv30_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv30_gr_new,
-       .mpeg = nv31_mpeg_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv20_devinit_new },
+       .fb       = { 0x00000001, nv30_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv30_gr_new },
+       .mpeg     = { 0x00000001, nv31_mpeg_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv34_chipset = {
        .name = "NV34",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv10_devinit_new,
-       .fb = nv10_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv34_gr_new,
-       .mpeg = nv31_mpeg_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv10_devinit_new },
+       .fb       = { 0x00000001, nv10_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv34_gr_new },
+       .mpeg     = { 0x00000001, nv31_mpeg_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv35_chipset = {
        .name = "NV35",
-       .bios = nvkm_bios_new,
-       .bus = nv04_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv20_devinit_new,
-       .fb = nv35_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv35_gr_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv04_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv20_devinit_new },
+       .fb       = { 0x00000001, nv35_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv35_gr_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv36_chipset = {
        .name = "NV36",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv04_clk_new,
-       .devinit = nv20_devinit_new,
-       .fb = nv36_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv04_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv04_pci_new,
-       .timer = nv04_timer_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv17_fifo_new,
-       .gr = nv35_gr_new,
-       .mpeg = nv31_mpeg_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv04_clk_new },
+       .devinit  = { 0x00000001, nv20_devinit_new },
+       .fb       = { 0x00000001, nv36_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv04_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv04_pci_new },
+       .timer    = { 0x00000001, nv04_timer_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv17_fifo_new },
+       .gr       = { 0x00000001, nv35_gr_new },
+       .mpeg     = { 0x00000001, nv31_mpeg_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv40_chipset = {
        .name = "NV40",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv40_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv40_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv40_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv40_gr_new,
-       .mpeg = nv40_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv40_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv40_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv40_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv40_gr_new },
+       .mpeg     = { 0x00000001, nv40_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv41_chipset = {
        .name = "NV41",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv41_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv41_mmu_new,
-       .pci = nv40_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv40_gr_new,
-       .mpeg = nv40_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv41_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv41_mmu_new },
+       .pci      = { 0x00000001, nv40_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv40_gr_new },
+       .mpeg     = { 0x00000001, nv40_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv42_chipset = {
        .name = "NV42",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv41_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv41_mmu_new,
-       .pci = nv40_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv40_gr_new,
-       .mpeg = nv40_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv41_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv41_mmu_new },
+       .pci      = { 0x00000001, nv40_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv40_gr_new },
+       .mpeg     = { 0x00000001, nv40_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv43_chipset = {
        .name = "NV43",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv41_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv41_mmu_new,
-       .pci = nv40_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv40_gr_new,
-       .mpeg = nv40_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv41_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv41_mmu_new },
+       .pci      = { 0x00000001, nv40_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv40_gr_new },
+       .mpeg     = { 0x00000001, nv40_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv44_chipset = {
        .name = "NV44",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv44_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv44_mc_new,
-       .mmu = nv44_mmu_new,
-       .pci = nv40_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv44_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv44_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv44_mc_new },
+       .mmu      = { 0x00000001, nv44_mmu_new },
+       .pci      = { 0x00000001, nv40_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv44_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv45_chipset = {
        .name = "NV45",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv40_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv40_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv40_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv40_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv40_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv40_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv46_chipset = {
        .name = "G72",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv46_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv44_mc_new,
-       .mmu = nv44_mmu_new,
-       .pci = nv46_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv44_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv46_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv44_mc_new },
+       .mmu      = { 0x00000001, nv44_mmu_new },
+       .pci      = { 0x00000001, nv46_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv44_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv47_chipset = {
        .name = "G70",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv47_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv41_mmu_new,
-       .pci = nv40_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv40_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv47_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv41_mmu_new },
+       .pci      = { 0x00000001, nv40_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv40_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv49_chipset = {
        .name = "G71",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv49_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv41_mmu_new,
-       .pci = nv40_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv40_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv49_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv41_mmu_new },
+       .pci      = { 0x00000001, nv40_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv40_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv4a_chipset = {
        .name = "NV44A",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv44_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv44_mc_new,
-       .mmu = nv04_mmu_new,
-       .pci = nv40_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv44_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv44_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv44_mc_new },
+       .mmu      = { 0x00000001, nv04_mmu_new },
+       .pci      = { 0x00000001, nv40_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv44_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv4b_chipset = {
        .name = "G73",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv49_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv17_mc_new,
-       .mmu = nv41_mmu_new,
-       .pci = nv40_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv40_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv49_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv17_mc_new },
+       .mmu      = { 0x00000001, nv41_mmu_new },
+       .pci      = { 0x00000001, nv40_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv40_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv4c_chipset = {
        .name = "C61",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv46_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv44_mc_new,
-       .mmu = nv44_mmu_new,
-       .pci = nv4c_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv44_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv46_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv44_mc_new },
+       .mmu      = { 0x00000001, nv44_mmu_new },
+       .pci      = { 0x00000001, nv4c_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv44_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv4e_chipset = {
        .name = "C51",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv4e_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv4e_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv44_mc_new,
-       .mmu = nv44_mmu_new,
-       .pci = nv4c_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv44_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv4e_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv4e_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv44_mc_new },
+       .mmu      = { 0x00000001, nv44_mmu_new },
+       .pci      = { 0x00000001, nv4c_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv44_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv50_chipset = {
        .name = "G80",
-       .bar = nv50_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = nv50_bus_new,
-       .clk = nv50_clk_new,
-       .devinit = nv50_devinit_new,
-       .fb = nv50_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = nv50_gpio_new,
-       .i2c = nv50_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = nv50_mc_new,
-       .mmu = nv50_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = nv46_pci_new,
-       .therm = nv50_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv50_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = nv50_fifo_new,
-       .gr = nv50_gr_new,
-       .mpeg = nv50_mpeg_new,
-       .pm = nv50_pm_new,
-       .sw = nv50_sw_new,
+       .bar      = { 0x00000001, nv50_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv50_bus_new },
+       .clk      = { 0x00000001, nv50_clk_new },
+       .devinit  = { 0x00000001, nv50_devinit_new },
+       .fb       = { 0x00000001, nv50_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, nv50_gpio_new },
+       .i2c      = { 0x00000001, nv50_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, nv50_mc_new },
+       .mmu      = { 0x00000001, nv50_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, nv46_pci_new },
+       .therm    = { 0x00000001, nv50_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv50_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, nv50_fifo_new },
+       .gr       = { 0x00000001, nv50_gr_new },
+       .mpeg     = { 0x00000001, nv50_mpeg_new },
+       .pm       = { 0x00000001, nv50_pm_new },
+       .sw       = { 0x00000001, nv50_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv63_chipset = {
        .name = "C73",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv46_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv44_mc_new,
-       .mmu = nv44_mmu_new,
-       .pci = nv4c_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv44_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv46_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv44_mc_new },
+       .mmu      = { 0x00000001, nv44_mmu_new },
+       .pci      = { 0x00000001, nv4c_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv44_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv67_chipset = {
        .name = "C67",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv46_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv44_mc_new,
-       .mmu = nv44_mmu_new,
-       .pci = nv4c_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv44_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv46_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv44_mc_new },
+       .mmu      = { 0x00000001, nv44_mmu_new },
+       .pci      = { 0x00000001, nv4c_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv44_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv68_chipset = {
        .name = "C68",
-       .bios = nvkm_bios_new,
-       .bus = nv31_bus_new,
-       .clk = nv40_clk_new,
-       .devinit = nv1a_devinit_new,
-       .fb = nv46_fb_new,
-       .gpio = nv10_gpio_new,
-       .i2c = nv04_i2c_new,
-       .imem = nv40_instmem_new,
-       .mc = nv44_mc_new,
-       .mmu = nv44_mmu_new,
-       .pci = nv4c_pci_new,
-       .therm = nv40_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = nv04_disp_new,
-       .dma = nv04_dma_new,
-       .fifo = nv40_fifo_new,
-       .gr = nv44_gr_new,
-       .mpeg = nv44_mpeg_new,
-       .pm = nv40_pm_new,
-       .sw = nv10_sw_new,
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv31_bus_new },
+       .clk      = { 0x00000001, nv40_clk_new },
+       .devinit  = { 0x00000001, nv1a_devinit_new },
+       .fb       = { 0x00000001, nv46_fb_new },
+       .gpio     = { 0x00000001, nv10_gpio_new },
+       .i2c      = { 0x00000001, nv04_i2c_new },
+       .imem     = { 0x00000001, nv40_instmem_new },
+       .mc       = { 0x00000001, nv44_mc_new },
+       .mmu      = { 0x00000001, nv44_mmu_new },
+       .pci      = { 0x00000001, nv4c_pci_new },
+       .therm    = { 0x00000001, nv40_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, nv04_disp_new },
+       .dma      = { 0x00000001, nv04_dma_new },
+       .fifo     = { 0x00000001, nv40_fifo_new },
+       .gr       = { 0x00000001, nv44_gr_new },
+       .mpeg     = { 0x00000001, nv44_mpeg_new },
+       .pm       = { 0x00000001, nv40_pm_new },
+       .sw       = { 0x00000001, nv10_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv84_chipset = {
        .name = "G84",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = nv50_bus_new,
-       .clk = g84_clk_new,
-       .devinit = g84_devinit_new,
-       .fb = g84_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = nv50_gpio_new,
-       .i2c = nv50_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = g84_mc_new,
-       .mmu = g84_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g84_pci_new,
-       .therm = g84_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .bsp = g84_bsp_new,
-       .cipher = g84_cipher_new,
-       .disp = g84_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = g84_gr_new,
-       .mpeg = g84_mpeg_new,
-       .pm = g84_pm_new,
-       .sw = nv50_sw_new,
-       .vp = g84_vp_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv50_bus_new },
+       .clk      = { 0x00000001, g84_clk_new },
+       .devinit  = { 0x00000001, g84_devinit_new },
+       .fb       = { 0x00000001, g84_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, nv50_gpio_new },
+       .i2c      = { 0x00000001, nv50_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, g84_mc_new },
+       .mmu      = { 0x00000001, g84_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g84_pci_new },
+       .therm    = { 0x00000001, g84_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .bsp      = { 0x00000001, g84_bsp_new },
+       .cipher   = { 0x00000001, g84_cipher_new },
+       .disp     = { 0x00000001, g84_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, g84_gr_new },
+       .mpeg     = { 0x00000001, g84_mpeg_new },
+       .pm       = { 0x00000001, g84_pm_new },
+       .sw       = { 0x00000001, nv50_sw_new },
+       .vp       = { 0x00000001, g84_vp_new },
 };
 
 static const struct nvkm_device_chip
 nv86_chipset = {
        .name = "G86",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = nv50_bus_new,
-       .clk = g84_clk_new,
-       .devinit = g84_devinit_new,
-       .fb = g84_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = nv50_gpio_new,
-       .i2c = nv50_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = g84_mc_new,
-       .mmu = g84_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g84_pci_new,
-       .therm = g84_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .bsp = g84_bsp_new,
-       .cipher = g84_cipher_new,
-       .disp = g84_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = g84_gr_new,
-       .mpeg = g84_mpeg_new,
-       .pm = g84_pm_new,
-       .sw = nv50_sw_new,
-       .vp = g84_vp_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv50_bus_new },
+       .clk      = { 0x00000001, g84_clk_new },
+       .devinit  = { 0x00000001, g84_devinit_new },
+       .fb       = { 0x00000001, g84_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, nv50_gpio_new },
+       .i2c      = { 0x00000001, nv50_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, g84_mc_new },
+       .mmu      = { 0x00000001, g84_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g84_pci_new },
+       .therm    = { 0x00000001, g84_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .bsp      = { 0x00000001, g84_bsp_new },
+       .cipher   = { 0x00000001, g84_cipher_new },
+       .disp     = { 0x00000001, g84_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, g84_gr_new },
+       .mpeg     = { 0x00000001, g84_mpeg_new },
+       .pm       = { 0x00000001, g84_pm_new },
+       .sw       = { 0x00000001, nv50_sw_new },
+       .vp       = { 0x00000001, g84_vp_new },
 };
 
 static const struct nvkm_device_chip
 nv92_chipset = {
        .name = "G92",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = nv50_bus_new,
-       .clk = g84_clk_new,
-       .devinit = g84_devinit_new,
-       .fb = g84_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = nv50_gpio_new,
-       .i2c = nv50_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = g84_mc_new,
-       .mmu = g84_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g92_pci_new,
-       .therm = g84_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .bsp = g84_bsp_new,
-       .cipher = g84_cipher_new,
-       .disp = g84_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = g84_gr_new,
-       .mpeg = g84_mpeg_new,
-       .pm = g84_pm_new,
-       .sw = nv50_sw_new,
-       .vp = g84_vp_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, nv50_bus_new },
+       .clk      = { 0x00000001, g84_clk_new },
+       .devinit  = { 0x00000001, g84_devinit_new },
+       .fb       = { 0x00000001, g84_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, nv50_gpio_new },
+       .i2c      = { 0x00000001, nv50_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, g84_mc_new },
+       .mmu      = { 0x00000001, g84_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g92_pci_new },
+       .therm    = { 0x00000001, g84_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .bsp      = { 0x00000001, g84_bsp_new },
+       .cipher   = { 0x00000001, g84_cipher_new },
+       .disp     = { 0x00000001, g84_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, g84_gr_new },
+       .mpeg     = { 0x00000001, g84_mpeg_new },
+       .pm       = { 0x00000001, g84_pm_new },
+       .sw       = { 0x00000001, nv50_sw_new },
+       .vp       = { 0x00000001, g84_vp_new },
 };
 
 static const struct nvkm_device_chip
 nv94_chipset = {
        .name = "G94",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = g94_bus_new,
-       .clk = g84_clk_new,
-       .devinit = g84_devinit_new,
-       .fb = g84_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = g84_mc_new,
-       .mmu = g84_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g94_pci_new,
-       .therm = g84_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .bsp = g84_bsp_new,
-       .cipher = g84_cipher_new,
-       .disp = g94_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = g84_gr_new,
-       .mpeg = g84_mpeg_new,
-       .pm = g84_pm_new,
-       .sw = nv50_sw_new,
-       .vp = g84_vp_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, g94_bus_new },
+       .clk      = { 0x00000001, g84_clk_new },
+       .devinit  = { 0x00000001, g84_devinit_new },
+       .fb       = { 0x00000001, g84_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, g84_mc_new },
+       .mmu      = { 0x00000001, g84_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g94_pci_new },
+       .therm    = { 0x00000001, g84_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .bsp      = { 0x00000001, g84_bsp_new },
+       .cipher   = { 0x00000001, g84_cipher_new },
+       .disp     = { 0x00000001, g94_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, g84_gr_new },
+       .mpeg     = { 0x00000001, g84_mpeg_new },
+       .pm       = { 0x00000001, g84_pm_new },
+       .sw       = { 0x00000001, nv50_sw_new },
+       .vp       = { 0x00000001, g84_vp_new },
 };
 
 static const struct nvkm_device_chip
 nv96_chipset = {
        .name = "G96",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = g94_bus_new,
-       .clk = g84_clk_new,
-       .devinit = g84_devinit_new,
-       .fb = g84_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = g84_mc_new,
-       .mmu = g84_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g94_pci_new,
-       .therm = g84_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .bsp = g84_bsp_new,
-       .cipher = g84_cipher_new,
-       .disp = g94_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = g84_gr_new,
-       .mpeg = g84_mpeg_new,
-       .pm = g84_pm_new,
-       .sw = nv50_sw_new,
-       .vp = g84_vp_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, g94_bus_new },
+       .clk      = { 0x00000001, g84_clk_new },
+       .devinit  = { 0x00000001, g84_devinit_new },
+       .fb       = { 0x00000001, g84_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, g84_mc_new },
+       .mmu      = { 0x00000001, g84_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g94_pci_new },
+       .therm    = { 0x00000001, g84_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .bsp      = { 0x00000001, g84_bsp_new },
+       .cipher   = { 0x00000001, g84_cipher_new },
+       .disp     = { 0x00000001, g94_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, g84_gr_new },
+       .mpeg     = { 0x00000001, g84_mpeg_new },
+       .pm       = { 0x00000001, g84_pm_new },
+       .sw       = { 0x00000001, nv50_sw_new },
+       .vp       = { 0x00000001, g84_vp_new },
 };
 
 static const struct nvkm_device_chip
 nv98_chipset = {
        .name = "G98",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = g94_bus_new,
-       .clk = g84_clk_new,
-       .devinit = g98_devinit_new,
-       .fb = g84_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = g98_mc_new,
-       .mmu = g84_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g94_pci_new,
-       .therm = g84_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = g94_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = g84_gr_new,
-       .mspdec = g98_mspdec_new,
-       .msppp = g98_msppp_new,
-       .msvld = g98_msvld_new,
-       .pm = g84_pm_new,
-       .sec = g98_sec_new,
-       .sw = nv50_sw_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, g94_bus_new },
+       .clk      = { 0x00000001, g84_clk_new },
+       .devinit  = { 0x00000001, g98_devinit_new },
+       .fb       = { 0x00000001, g84_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, g98_mc_new },
+       .mmu      = { 0x00000001, g84_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g94_pci_new },
+       .therm    = { 0x00000001, g84_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, g94_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, g84_gr_new },
+       .mspdec   = { 0x00000001, g98_mspdec_new },
+       .msppp    = { 0x00000001, g98_msppp_new },
+       .msvld    = { 0x00000001, g98_msvld_new },
+       .pm       = { 0x00000001, g84_pm_new },
+       .sec      = { 0x00000001, g98_sec_new },
+       .sw       = { 0x00000001, nv50_sw_new },
 };
 
 static const struct nvkm_device_chip
 nva0_chipset = {
        .name = "GT200",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = g94_bus_new,
-       .clk = g84_clk_new,
-       .devinit = g84_devinit_new,
-       .fb = g84_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = nv50_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = g84_mc_new,
-       .mmu = g84_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g94_pci_new,
-       .therm = g84_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .bsp = g84_bsp_new,
-       .cipher = g84_cipher_new,
-       .disp = gt200_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = gt200_gr_new,
-       .mpeg = g84_mpeg_new,
-       .pm = gt200_pm_new,
-       .sw = nv50_sw_new,
-       .vp = g84_vp_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, g94_bus_new },
+       .clk      = { 0x00000001, g84_clk_new },
+       .devinit  = { 0x00000001, g84_devinit_new },
+       .fb       = { 0x00000001, g84_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, nv50_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, g84_mc_new },
+       .mmu      = { 0x00000001, g84_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g94_pci_new },
+       .therm    = { 0x00000001, g84_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .bsp      = { 0x00000001, g84_bsp_new },
+       .cipher   = { 0x00000001, g84_cipher_new },
+       .disp     = { 0x00000001, gt200_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, gt200_gr_new },
+       .mpeg     = { 0x00000001, g84_mpeg_new },
+       .pm       = { 0x00000001, gt200_pm_new },
+       .sw       = { 0x00000001, nv50_sw_new },
+       .vp       = { 0x00000001, g84_vp_new },
 };
 
 static const struct nvkm_device_chip
 nva3_chipset = {
        .name = "GT215",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = g94_bus_new,
-       .clk = gt215_clk_new,
-       .devinit = gt215_devinit_new,
-       .fb = gt215_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = gt215_mc_new,
-       .mmu = g84_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g94_pci_new,
-       .pmu = gt215_pmu_new,
-       .therm = gt215_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .ce[0] = gt215_ce_new,
-       .disp = gt215_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = gt215_gr_new,
-       .mpeg = g84_mpeg_new,
-       .mspdec = gt215_mspdec_new,
-       .msppp = gt215_msppp_new,
-       .msvld = gt215_msvld_new,
-       .pm = gt215_pm_new,
-       .sw = nv50_sw_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, g94_bus_new },
+       .clk      = { 0x00000001, gt215_clk_new },
+       .devinit  = { 0x00000001, gt215_devinit_new },
+       .fb       = { 0x00000001, gt215_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, gt215_mc_new },
+       .mmu      = { 0x00000001, g84_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g94_pci_new },
+       .pmu      = { 0x00000001, gt215_pmu_new },
+       .therm    = { 0x00000001, gt215_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .ce       = { 0x00000001, gt215_ce_new },
+       .disp     = { 0x00000001, gt215_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, gt215_gr_new },
+       .mpeg     = { 0x00000001, g84_mpeg_new },
+       .mspdec   = { 0x00000001, gt215_mspdec_new },
+       .msppp    = { 0x00000001, gt215_msppp_new },
+       .msvld    = { 0x00000001, gt215_msvld_new },
+       .pm       = { 0x00000001, gt215_pm_new },
+       .sw       = { 0x00000001, nv50_sw_new },
 };
 
 static const struct nvkm_device_chip
 nva5_chipset = {
        .name = "GT216",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = g94_bus_new,
-       .clk = gt215_clk_new,
-       .devinit = gt215_devinit_new,
-       .fb = gt215_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = gt215_mc_new,
-       .mmu = g84_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g94_pci_new,
-       .pmu = gt215_pmu_new,
-       .therm = gt215_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .ce[0] = gt215_ce_new,
-       .disp = gt215_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = gt215_gr_new,
-       .mspdec = gt215_mspdec_new,
-       .msppp = gt215_msppp_new,
-       .msvld = gt215_msvld_new,
-       .pm = gt215_pm_new,
-       .sw = nv50_sw_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, g94_bus_new },
+       .clk      = { 0x00000001, gt215_clk_new },
+       .devinit  = { 0x00000001, gt215_devinit_new },
+       .fb       = { 0x00000001, gt215_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, gt215_mc_new },
+       .mmu      = { 0x00000001, g84_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g94_pci_new },
+       .pmu      = { 0x00000001, gt215_pmu_new },
+       .therm    = { 0x00000001, gt215_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .ce       = { 0x00000001, gt215_ce_new },
+       .disp     = { 0x00000001, gt215_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, gt215_gr_new },
+       .mspdec   = { 0x00000001, gt215_mspdec_new },
+       .msppp    = { 0x00000001, gt215_msppp_new },
+       .msvld    = { 0x00000001, gt215_msvld_new },
+       .pm       = { 0x00000001, gt215_pm_new },
+       .sw       = { 0x00000001, nv50_sw_new },
 };
 
 static const struct nvkm_device_chip
 nva8_chipset = {
        .name = "GT218",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = g94_bus_new,
-       .clk = gt215_clk_new,
-       .devinit = gt215_devinit_new,
-       .fb = gt215_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = gt215_mc_new,
-       .mmu = g84_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g94_pci_new,
-       .pmu = gt215_pmu_new,
-       .therm = gt215_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .ce[0] = gt215_ce_new,
-       .disp = gt215_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = gt215_gr_new,
-       .mspdec = gt215_mspdec_new,
-       .msppp = gt215_msppp_new,
-       .msvld = gt215_msvld_new,
-       .pm = gt215_pm_new,
-       .sw = nv50_sw_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, g94_bus_new },
+       .clk      = { 0x00000001, gt215_clk_new },
+       .devinit  = { 0x00000001, gt215_devinit_new },
+       .fb       = { 0x00000001, gt215_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, gt215_mc_new },
+       .mmu      = { 0x00000001, g84_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g94_pci_new },
+       .pmu      = { 0x00000001, gt215_pmu_new },
+       .therm    = { 0x00000001, gt215_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .ce       = { 0x00000001, gt215_ce_new },
+       .disp     = { 0x00000001, gt215_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, gt215_gr_new },
+       .mspdec   = { 0x00000001, gt215_mspdec_new },
+       .msppp    = { 0x00000001, gt215_msppp_new },
+       .msvld    = { 0x00000001, gt215_msvld_new },
+       .pm       = { 0x00000001, gt215_pm_new },
+       .sw       = { 0x00000001, nv50_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvaa_chipset = {
        .name = "MCP77/MCP78",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = g94_bus_new,
-       .clk = mcp77_clk_new,
-       .devinit = g98_devinit_new,
-       .fb = mcp77_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = g98_mc_new,
-       .mmu = mcp77_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g94_pci_new,
-       .therm = g84_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = mcp77_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = gt200_gr_new,
-       .mspdec = g98_mspdec_new,
-       .msppp = g98_msppp_new,
-       .msvld = g98_msvld_new,
-       .pm = g84_pm_new,
-       .sec = g98_sec_new,
-       .sw = nv50_sw_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, g94_bus_new },
+       .clk      = { 0x00000001, mcp77_clk_new },
+       .devinit  = { 0x00000001, g98_devinit_new },
+       .fb       = { 0x00000001, mcp77_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, g98_mc_new },
+       .mmu      = { 0x00000001, mcp77_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g94_pci_new },
+       .therm    = { 0x00000001, g84_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, mcp77_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, gt200_gr_new },
+       .mspdec   = { 0x00000001, g98_mspdec_new },
+       .msppp    = { 0x00000001, g98_msppp_new },
+       .msvld    = { 0x00000001, g98_msvld_new },
+       .pm       = { 0x00000001, g84_pm_new },
+       .sec      = { 0x00000001, g98_sec_new },
+       .sw       = { 0x00000001, nv50_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvac_chipset = {
        .name = "MCP79/MCP7A",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = g94_bus_new,
-       .clk = mcp77_clk_new,
-       .devinit = g98_devinit_new,
-       .fb = mcp77_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = g98_mc_new,
-       .mmu = mcp77_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g94_pci_new,
-       .therm = g84_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .disp = mcp77_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = mcp79_gr_new,
-       .mspdec = g98_mspdec_new,
-       .msppp = g98_msppp_new,
-       .msvld = g98_msvld_new,
-       .pm = g84_pm_new,
-       .sec = g98_sec_new,
-       .sw = nv50_sw_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, g94_bus_new },
+       .clk      = { 0x00000001, mcp77_clk_new },
+       .devinit  = { 0x00000001, g98_devinit_new },
+       .fb       = { 0x00000001, mcp77_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, g98_mc_new },
+       .mmu      = { 0x00000001, mcp77_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g94_pci_new },
+       .therm    = { 0x00000001, g84_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .disp     = { 0x00000001, mcp77_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, mcp79_gr_new },
+       .mspdec   = { 0x00000001, g98_mspdec_new },
+       .msppp    = { 0x00000001, g98_msppp_new },
+       .msvld    = { 0x00000001, g98_msvld_new },
+       .pm       = { 0x00000001, g84_pm_new },
+       .sec      = { 0x00000001, g98_sec_new },
+       .sw       = { 0x00000001, nv50_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvaf_chipset = {
        .name = "MCP89",
-       .bar = g84_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = g94_bus_new,
-       .clk = gt215_clk_new,
-       .devinit = mcp89_devinit_new,
-       .fb = mcp89_fb_new,
-       .fuse = nv50_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .imem = nv50_instmem_new,
-       .mc = gt215_mc_new,
-       .mmu = mcp77_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = g94_pci_new,
-       .pmu = gt215_pmu_new,
-       .therm = gt215_therm_new,
-       .timer = nv41_timer_new,
-       .volt = nv40_volt_new,
-       .ce[0] = gt215_ce_new,
-       .disp = mcp89_disp_new,
-       .dma = nv50_dma_new,
-       .fifo = g84_fifo_new,
-       .gr = mcp89_gr_new,
-       .mspdec = gt215_mspdec_new,
-       .msppp = gt215_msppp_new,
-       .msvld = mcp89_msvld_new,
-       .pm = gt215_pm_new,
-       .sw = nv50_sw_new,
+       .bar      = { 0x00000001, g84_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, g94_bus_new },
+       .clk      = { 0x00000001, gt215_clk_new },
+       .devinit  = { 0x00000001, mcp89_devinit_new },
+       .fb       = { 0x00000001, mcp89_fb_new },
+       .fuse     = { 0x00000001, nv50_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, gt215_mc_new },
+       .mmu      = { 0x00000001, mcp77_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, g94_pci_new },
+       .pmu      = { 0x00000001, gt215_pmu_new },
+       .therm    = { 0x00000001, gt215_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, nv40_volt_new },
+       .ce       = { 0x00000001, gt215_ce_new },
+       .disp     = { 0x00000001, mcp89_disp_new },
+       .dma      = { 0x00000001, nv50_dma_new },
+       .fifo     = { 0x00000001, g84_fifo_new },
+       .gr       = { 0x00000001, mcp89_gr_new },
+       .mspdec   = { 0x00000001, gt215_mspdec_new },
+       .msppp    = { 0x00000001, gt215_msppp_new },
+       .msvld    = { 0x00000001, mcp89_msvld_new },
+       .pm       = { 0x00000001, gt215_pm_new },
+       .sw       = { 0x00000001, nv50_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvc0_chipset = {
        .name = "GF100",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gf100_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gf100_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .ibus = gf100_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gf100_ltc_new,
-       .mc = gf100_mc_new,
-       .mmu = gf100_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gf100_pci_new,
-       .pmu = gf100_pmu_new,
-       .therm = gt215_therm_new,
-       .timer = nv41_timer_new,
-       .volt = gf100_volt_new,
-       .ce[0] = gf100_ce_new,
-       .ce[1] = gf100_ce_new,
-       .disp = gt215_disp_new,
-       .dma = gf100_dma_new,
-       .fifo = gf100_fifo_new,
-       .gr = gf100_gr_new,
-       .mspdec = gf100_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gf100_msvld_new,
-       .pm = gf100_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gf100_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gf100_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gf100_ltc_new },
+       .mc       = { 0x00000001, gf100_mc_new },
+       .mmu      = { 0x00000001, gf100_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gf100_pci_new },
+       .pmu      = { 0x00000001, gf100_pmu_new },
+       .privring = { 0x00000001, gf100_privring_new },
+       .therm    = { 0x00000001, gt215_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, gf100_volt_new },
+       .ce       = { 0x00000003, gf100_ce_new },
+       .disp     = { 0x00000001, gt215_disp_new },
+       .dma      = { 0x00000001, gf100_dma_new },
+       .fifo     = { 0x00000001, gf100_fifo_new },
+       .gr       = { 0x00000001, gf100_gr_new },
+       .mspdec   = { 0x00000001, gf100_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gf100_msvld_new },
+       .pm       = { 0x00000001, gf100_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvc1_chipset = {
        .name = "GF108",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gf100_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gf108_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .ibus = gf100_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gf100_ltc_new,
-       .mc = gf100_mc_new,
-       .mmu = gf100_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gf106_pci_new,
-       .pmu = gf100_pmu_new,
-       .therm = gt215_therm_new,
-       .timer = nv41_timer_new,
-       .volt = gf100_volt_new,
-       .ce[0] = gf100_ce_new,
-       .disp = gt215_disp_new,
-       .dma = gf100_dma_new,
-       .fifo = gf100_fifo_new,
-       .gr = gf108_gr_new,
-       .mspdec = gf100_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gf100_msvld_new,
-       .pm = gf108_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gf100_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gf108_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gf100_ltc_new },
+       .mc       = { 0x00000001, gf100_mc_new },
+       .mmu      = { 0x00000001, gf100_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gf106_pci_new },
+       .pmu      = { 0x00000001, gf100_pmu_new },
+       .privring = { 0x00000001, gf100_privring_new },
+       .therm    = { 0x00000001, gt215_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, gf100_volt_new },
+       .ce       = { 0x00000001, gf100_ce_new },
+       .disp     = { 0x00000001, gt215_disp_new },
+       .dma      = { 0x00000001, gf100_dma_new },
+       .fifo     = { 0x00000001, gf100_fifo_new },
+       .gr       = { 0x00000001, gf108_gr_new },
+       .mspdec   = { 0x00000001, gf100_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gf100_msvld_new },
+       .pm       = { 0x00000001, gf108_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvc3_chipset = {
        .name = "GF106",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gf100_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gf100_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .ibus = gf100_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gf100_ltc_new,
-       .mc = gf100_mc_new,
-       .mmu = gf100_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gf106_pci_new,
-       .pmu = gf100_pmu_new,
-       .therm = gt215_therm_new,
-       .timer = nv41_timer_new,
-       .volt = gf100_volt_new,
-       .ce[0] = gf100_ce_new,
-       .disp = gt215_disp_new,
-       .dma = gf100_dma_new,
-       .fifo = gf100_fifo_new,
-       .gr = gf104_gr_new,
-       .mspdec = gf100_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gf100_msvld_new,
-       .pm = gf100_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gf100_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gf100_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gf100_ltc_new },
+       .mc       = { 0x00000001, gf100_mc_new },
+       .mmu      = { 0x00000001, gf100_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gf106_pci_new },
+       .pmu      = { 0x00000001, gf100_pmu_new },
+       .privring = { 0x00000001, gf100_privring_new },
+       .therm    = { 0x00000001, gt215_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, gf100_volt_new },
+       .ce       = { 0x00000001, gf100_ce_new },
+       .disp     = { 0x00000001, gt215_disp_new },
+       .dma      = { 0x00000001, gf100_dma_new },
+       .fifo     = { 0x00000001, gf100_fifo_new },
+       .gr       = { 0x00000001, gf104_gr_new },
+       .mspdec   = { 0x00000001, gf100_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gf100_msvld_new },
+       .pm       = { 0x00000001, gf100_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvc4_chipset = {
        .name = "GF104",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gf100_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gf100_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .ibus = gf100_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gf100_ltc_new,
-       .mc = gf100_mc_new,
-       .mmu = gf100_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gf100_pci_new,
-       .pmu = gf100_pmu_new,
-       .therm = gt215_therm_new,
-       .timer = nv41_timer_new,
-       .volt = gf100_volt_new,
-       .ce[0] = gf100_ce_new,
-       .ce[1] = gf100_ce_new,
-       .disp = gt215_disp_new,
-       .dma = gf100_dma_new,
-       .fifo = gf100_fifo_new,
-       .gr = gf104_gr_new,
-       .mspdec = gf100_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gf100_msvld_new,
-       .pm = gf100_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gf100_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gf100_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gf100_ltc_new },
+       .mc       = { 0x00000001, gf100_mc_new },
+       .mmu      = { 0x00000001, gf100_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gf100_pci_new },
+       .pmu      = { 0x00000001, gf100_pmu_new },
+       .privring = { 0x00000001, gf100_privring_new },
+       .therm    = { 0x00000001, gt215_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, gf100_volt_new },
+       .ce       = { 0x00000003, gf100_ce_new },
+       .disp     = { 0x00000001, gt215_disp_new },
+       .dma      = { 0x00000001, gf100_dma_new },
+       .fifo     = { 0x00000001, gf100_fifo_new },
+       .gr       = { 0x00000001, gf104_gr_new },
+       .mspdec   = { 0x00000001, gf100_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gf100_msvld_new },
+       .pm       = { 0x00000001, gf100_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvc8_chipset = {
        .name = "GF110",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gf100_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gf100_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .ibus = gf100_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gf100_ltc_new,
-       .mc = gf100_mc_new,
-       .mmu = gf100_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gf100_pci_new,
-       .pmu = gf100_pmu_new,
-       .therm = gt215_therm_new,
-       .timer = nv41_timer_new,
-       .volt = gf100_volt_new,
-       .ce[0] = gf100_ce_new,
-       .ce[1] = gf100_ce_new,
-       .disp = gt215_disp_new,
-       .dma = gf100_dma_new,
-       .fifo = gf100_fifo_new,
-       .gr = gf110_gr_new,
-       .mspdec = gf100_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gf100_msvld_new,
-       .pm = gf100_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gf100_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gf100_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gf100_ltc_new },
+       .mc       = { 0x00000001, gf100_mc_new },
+       .mmu      = { 0x00000001, gf100_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gf100_pci_new },
+       .pmu      = { 0x00000001, gf100_pmu_new },
+       .privring = { 0x00000001, gf100_privring_new },
+       .therm    = { 0x00000001, gt215_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, gf100_volt_new },
+       .ce       = { 0x00000003, gf100_ce_new },
+       .disp     = { 0x00000001, gt215_disp_new },
+       .dma      = { 0x00000001, gf100_dma_new },
+       .fifo     = { 0x00000001, gf100_fifo_new },
+       .gr       = { 0x00000001, gf110_gr_new },
+       .mspdec   = { 0x00000001, gf100_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gf100_msvld_new },
+       .pm       = { 0x00000001, gf100_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvce_chipset = {
        .name = "GF114",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gf100_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gf100_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .ibus = gf100_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gf100_ltc_new,
-       .mc = gf100_mc_new,
-       .mmu = gf100_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gf100_pci_new,
-       .pmu = gf100_pmu_new,
-       .therm = gt215_therm_new,
-       .timer = nv41_timer_new,
-       .volt = gf100_volt_new,
-       .ce[0] = gf100_ce_new,
-       .ce[1] = gf100_ce_new,
-       .disp = gt215_disp_new,
-       .dma = gf100_dma_new,
-       .fifo = gf100_fifo_new,
-       .gr = gf104_gr_new,
-       .mspdec = gf100_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gf100_msvld_new,
-       .pm = gf100_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gf100_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gf100_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gf100_ltc_new },
+       .mc       = { 0x00000001, gf100_mc_new },
+       .mmu      = { 0x00000001, gf100_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gf100_pci_new },
+       .pmu      = { 0x00000001, gf100_pmu_new },
+       .privring = { 0x00000001, gf100_privring_new },
+       .therm    = { 0x00000001, gt215_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, gf100_volt_new },
+       .ce       = { 0x00000003, gf100_ce_new },
+       .disp     = { 0x00000001, gt215_disp_new },
+       .dma      = { 0x00000001, gf100_dma_new },
+       .fifo     = { 0x00000001, gf100_fifo_new },
+       .gr       = { 0x00000001, gf104_gr_new },
+       .mspdec   = { 0x00000001, gf100_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gf100_msvld_new },
+       .pm       = { 0x00000001, gf100_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvcf_chipset = {
        .name = "GF116",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gf100_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gf100_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = g94_gpio_new,
-       .i2c = g94_i2c_new,
-       .ibus = gf100_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gf100_ltc_new,
-       .mc = gf100_mc_new,
-       .mmu = gf100_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gf106_pci_new,
-       .pmu = gf100_pmu_new,
-       .therm = gt215_therm_new,
-       .timer = nv41_timer_new,
-       .volt = gf100_volt_new,
-       .ce[0] = gf100_ce_new,
-       .disp = gt215_disp_new,
-       .dma = gf100_dma_new,
-       .fifo = gf100_fifo_new,
-       .gr = gf104_gr_new,
-       .mspdec = gf100_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gf100_msvld_new,
-       .pm = gf100_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gf100_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gf100_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, g94_gpio_new },
+       .i2c      = { 0x00000001, g94_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gf100_ltc_new },
+       .mc       = { 0x00000001, gf100_mc_new },
+       .mmu      = { 0x00000001, gf100_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gf106_pci_new },
+       .pmu      = { 0x00000001, gf100_pmu_new },
+       .privring = { 0x00000001, gf100_privring_new },
+       .therm    = { 0x00000001, gt215_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, gf100_volt_new },
+       .ce       = { 0x00000001, gf100_ce_new },
+       .disp     = { 0x00000001, gt215_disp_new },
+       .dma      = { 0x00000001, gf100_dma_new },
+       .fifo     = { 0x00000001, gf100_fifo_new },
+       .gr       = { 0x00000001, gf104_gr_new },
+       .mspdec   = { 0x00000001, gf100_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gf100_msvld_new },
+       .pm       = { 0x00000001, gf100_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvd7_chipset = {
        .name = "GF117",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gf100_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gf100_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = gf119_gpio_new,
-       .i2c = gf117_i2c_new,
-       .ibus = gf117_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gf100_ltc_new,
-       .mc = gf100_mc_new,
-       .mmu = gf100_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gf106_pci_new,
-       .therm = gf119_therm_new,
-       .timer = nv41_timer_new,
-       .volt = gf117_volt_new,
-       .ce[0] = gf100_ce_new,
-       .disp = gf119_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gf100_fifo_new,
-       .gr = gf117_gr_new,
-       .mspdec = gf100_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gf100_msvld_new,
-       .pm = gf117_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gf100_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gf100_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, gf119_gpio_new },
+       .i2c      = { 0x00000001, gf117_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gf100_ltc_new },
+       .mc       = { 0x00000001, gf100_mc_new },
+       .mmu      = { 0x00000001, gf100_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gf106_pci_new },
+       .privring = { 0x00000001, gf117_privring_new },
+       .therm    = { 0x00000001, gf119_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, gf117_volt_new },
+       .ce       = { 0x00000001, gf100_ce_new },
+       .disp     = { 0x00000001, gf119_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gf100_fifo_new },
+       .gr       = { 0x00000001, gf117_gr_new },
+       .mspdec   = { 0x00000001, gf100_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gf100_msvld_new },
+       .pm       = { 0x00000001, gf117_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvd9_chipset = {
        .name = "GF119",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gf100_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gf100_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = gf119_gpio_new,
-       .i2c = gf119_i2c_new,
-       .ibus = gf117_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gf100_ltc_new,
-       .mc = gf100_mc_new,
-       .mmu = gf100_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gf106_pci_new,
-       .pmu = gf119_pmu_new,
-       .therm = gf119_therm_new,
-       .timer = nv41_timer_new,
-       .volt = gf100_volt_new,
-       .ce[0] = gf100_ce_new,
-       .disp = gf119_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gf100_fifo_new,
-       .gr = gf119_gr_new,
-       .mspdec = gf100_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gf100_msvld_new,
-       .pm = gf117_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gf100_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gf100_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, gf119_gpio_new },
+       .i2c      = { 0x00000001, gf119_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gf100_ltc_new },
+       .mc       = { 0x00000001, gf100_mc_new },
+       .mmu      = { 0x00000001, gf100_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gf106_pci_new },
+       .pmu      = { 0x00000001, gf119_pmu_new },
+       .privring = { 0x00000001, gf117_privring_new },
+       .therm    = { 0x00000001, gf119_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .volt     = { 0x00000001, gf100_volt_new },
+       .ce       = { 0x00000001, gf100_ce_new },
+       .disp     = { 0x00000001, gf119_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gf100_fifo_new },
+       .gr       = { 0x00000001, gf119_gr_new },
+       .mspdec   = { 0x00000001, gf100_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gf100_msvld_new },
+       .pm       = { 0x00000001, gf117_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nve4_chipset = {
        .name = "GK104",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gk104_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gk104_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gk104_i2c_new,
-       .ibus = gk104_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gk104_ltc_new,
-       .mc = gk104_mc_new,
-       .mmu = gk104_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gk104_pmu_new,
-       .therm = gk104_therm_new,
-       .timer = nv41_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gk104_ce_new,
-       .ce[1] = gk104_ce_new,
-       .ce[2] = gk104_ce_new,
-       .disp = gk104_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gk104_fifo_new,
-       .gr = gk104_gr_new,
-       .mspdec = gk104_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gk104_msvld_new,
-       .pm = gk104_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gk104_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gk104_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gk104_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gk104_ltc_new },
+       .mc       = { 0x00000001, gk104_mc_new },
+       .mmu      = { 0x00000001, gk104_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gk104_pmu_new },
+       .privring = { 0x00000001, gk104_privring_new },
+       .therm    = { 0x00000001, gk104_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000007, gk104_ce_new },
+       .disp     = { 0x00000001, gk104_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gk104_fifo_new },
+       .gr       = { 0x00000001, gk104_gr_new },
+       .mspdec   = { 0x00000001, gk104_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gk104_msvld_new },
+       .pm       = { 0x00000001, gk104_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nve6_chipset = {
        .name = "GK106",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gk104_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gk104_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gk104_i2c_new,
-       .ibus = gk104_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gk104_ltc_new,
-       .mc = gk104_mc_new,
-       .mmu = gk104_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gk104_pmu_new,
-       .therm = gk104_therm_new,
-       .timer = nv41_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gk104_ce_new,
-       .ce[1] = gk104_ce_new,
-       .ce[2] = gk104_ce_new,
-       .disp = gk104_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gk104_fifo_new,
-       .gr = gk104_gr_new,
-       .mspdec = gk104_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gk104_msvld_new,
-       .pm = gk104_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gk104_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gk104_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gk104_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gk104_ltc_new },
+       .mc       = { 0x00000001, gk104_mc_new },
+       .mmu      = { 0x00000001, gk104_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gk104_pmu_new },
+       .privring = { 0x00000001, gk104_privring_new },
+       .therm    = { 0x00000001, gk104_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000007, gk104_ce_new },
+       .disp     = { 0x00000001, gk104_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gk104_fifo_new },
+       .gr       = { 0x00000001, gk104_gr_new },
+       .mspdec   = { 0x00000001, gk104_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gk104_msvld_new },
+       .pm       = { 0x00000001, gk104_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nve7_chipset = {
        .name = "GK107",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gk104_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gk104_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gk104_i2c_new,
-       .ibus = gk104_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gk104_ltc_new,
-       .mc = gk104_mc_new,
-       .mmu = gk104_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gk104_pmu_new,
-       .therm = gk104_therm_new,
-       .timer = nv41_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gk104_ce_new,
-       .ce[1] = gk104_ce_new,
-       .ce[2] = gk104_ce_new,
-       .disp = gk104_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gk104_fifo_new,
-       .gr = gk104_gr_new,
-       .mspdec = gk104_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gk104_msvld_new,
-       .pm = gk104_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gk104_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gk104_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gk104_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gk104_ltc_new },
+       .mc       = { 0x00000001, gk104_mc_new },
+       .mmu      = { 0x00000001, gk104_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gk104_pmu_new },
+       .privring = { 0x00000001, gk104_privring_new },
+       .therm    = { 0x00000001, gk104_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000007, gk104_ce_new },
+       .disp     = { 0x00000001, gk104_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gk104_fifo_new },
+       .gr       = { 0x00000001, gk104_gr_new },
+       .mspdec   = { 0x00000001, gk104_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gk104_msvld_new },
+       .pm       = { 0x00000001, gk104_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvea_chipset = {
        .name = "GK20A",
-       .bar = gk20a_bar_new,
-       .bus = gf100_bus_new,
-       .clk = gk20a_clk_new,
-       .fb = gk20a_fb_new,
-       .fuse = gf100_fuse_new,
-       .ibus = gk20a_ibus_new,
-       .imem = gk20a_instmem_new,
-       .ltc = gk104_ltc_new,
-       .mc = gk20a_mc_new,
-       .mmu = gk20a_mmu_new,
-       .pmu = gk20a_pmu_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .volt = gk20a_volt_new,
-       .ce[2] = gk104_ce_new,
-       .dma = gf119_dma_new,
-       .fifo = gk20a_fifo_new,
-       .gr = gk20a_gr_new,
-       .pm = gk104_pm_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gk20a_bar_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gk20a_clk_new },
+       .fb       = { 0x00000001, gk20a_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .imem     = { 0x00000001, gk20a_instmem_new },
+       .ltc      = { 0x00000001, gk104_ltc_new },
+       .mc       = { 0x00000001, gk20a_mc_new },
+       .mmu      = { 0x00000001, gk20a_mmu_new },
+       .pmu      = { 0x00000001, gk20a_pmu_new },
+       .privring = { 0x00000001, gk20a_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk20a_volt_new },
+       .ce       = { 0x00000004, gk104_ce_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gk20a_fifo_new },
+       .gr       = { 0x00000001, gk20a_gr_new },
+       .pm       = { 0x00000001, gk104_pm_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvf0_chipset = {
        .name = "GK110",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gk104_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gk110_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gk110_i2c_new,
-       .ibus = gk104_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gk104_ltc_new,
-       .mc = gk104_mc_new,
-       .mmu = gk104_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gk110_pmu_new,
-       .therm = gk104_therm_new,
-       .timer = nv41_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gk104_ce_new,
-       .ce[1] = gk104_ce_new,
-       .ce[2] = gk104_ce_new,
-       .disp = gk110_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gk110_fifo_new,
-       .gr = gk110_gr_new,
-       .mspdec = gk104_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gk104_msvld_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gk104_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gk110_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gk110_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gk104_ltc_new },
+       .mc       = { 0x00000001, gk104_mc_new },
+       .mmu      = { 0x00000001, gk104_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gk110_pmu_new },
+       .privring = { 0x00000001, gk104_privring_new },
+       .therm    = { 0x00000001, gk104_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000007, gk104_ce_new },
+       .disp     = { 0x00000001, gk110_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gk110_fifo_new },
+       .gr       = { 0x00000001, gk110_gr_new },
+       .mspdec   = { 0x00000001, gk104_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gk104_msvld_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nvf1_chipset = {
        .name = "GK110B",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gk104_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gk110_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gk110_i2c_new,
-       .ibus = gk104_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gk104_ltc_new,
-       .mc = gk104_mc_new,
-       .mmu = gk104_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gk110_pmu_new,
-       .therm = gk104_therm_new,
-       .timer = nv41_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gk104_ce_new,
-       .ce[1] = gk104_ce_new,
-       .ce[2] = gk104_ce_new,
-       .disp = gk110_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gk110_fifo_new,
-       .gr = gk110b_gr_new,
-       .mspdec = gk104_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gk104_msvld_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gk104_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gk110_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gk110_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gk104_ltc_new },
+       .mc       = { 0x00000001, gk104_mc_new },
+       .mmu      = { 0x00000001, gk104_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gk110_pmu_new },
+       .privring = { 0x00000001, gk104_privring_new },
+       .therm    = { 0x00000001, gk104_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000007, gk104_ce_new },
+       .disp     = { 0x00000001, gk110_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gk110_fifo_new },
+       .gr       = { 0x00000001, gk110b_gr_new },
+       .mspdec   = { 0x00000001, gk104_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gk104_msvld_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv106_chipset = {
        .name = "GK208B",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gk104_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gk110_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gk110_i2c_new,
-       .ibus = gk104_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gk104_ltc_new,
-       .mc = gk20a_mc_new,
-       .mmu = gk104_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gk208_pmu_new,
-       .therm = gk104_therm_new,
-       .timer = nv41_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gk104_ce_new,
-       .ce[1] = gk104_ce_new,
-       .ce[2] = gk104_ce_new,
-       .disp = gk110_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gk208_fifo_new,
-       .gr = gk208_gr_new,
-       .mspdec = gk104_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gk104_msvld_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gk104_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gk110_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gk110_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gk104_ltc_new },
+       .mc       = { 0x00000001, gk20a_mc_new },
+       .mmu      = { 0x00000001, gk104_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gk208_pmu_new },
+       .privring = { 0x00000001, gk104_privring_new },
+       .therm    = { 0x00000001, gk104_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000007, gk104_ce_new },
+       .disp     = { 0x00000001, gk110_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gk208_fifo_new },
+       .gr       = { 0x00000001, gk208_gr_new },
+       .mspdec   = { 0x00000001, gk104_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gk104_msvld_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv108_chipset = {
        .name = "GK208",
-       .bar = gf100_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gk104_clk_new,
-       .devinit = gf100_devinit_new,
-       .fb = gk110_fb_new,
-       .fuse = gf100_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gk110_i2c_new,
-       .ibus = gk104_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gk104_ltc_new,
-       .mc = gk20a_mc_new,
-       .mmu = gk104_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gk208_pmu_new,
-       .therm = gk104_therm_new,
-       .timer = nv41_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gk104_ce_new,
-       .ce[1] = gk104_ce_new,
-       .ce[2] = gk104_ce_new,
-       .disp = gk110_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gk208_fifo_new,
-       .gr = gk208_gr_new,
-       .mspdec = gk104_mspdec_new,
-       .msppp = gf100_msppp_new,
-       .msvld = gk104_msvld_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gf100_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gk104_clk_new },
+       .devinit  = { 0x00000001, gf100_devinit_new },
+       .fb       = { 0x00000001, gk110_fb_new },
+       .fuse     = { 0x00000001, gf100_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gk110_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gk104_ltc_new },
+       .mc       = { 0x00000001, gk20a_mc_new },
+       .mmu      = { 0x00000001, gk104_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gk208_pmu_new },
+       .privring = { 0x00000001, gk104_privring_new },
+       .therm    = { 0x00000001, gk104_therm_new },
+       .timer    = { 0x00000001, nv41_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000007, gk104_ce_new },
+       .disp     = { 0x00000001, gk110_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gk208_fifo_new },
+       .gr       = { 0x00000001, gk208_gr_new },
+       .mspdec   = { 0x00000001, gk104_mspdec_new },
+       .msppp    = { 0x00000001, gf100_msppp_new },
+       .msvld    = { 0x00000001, gk104_msvld_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv117_chipset = {
        .name = "GM107",
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gk104_clk_new,
-       .devinit = gm107_devinit_new,
-       .fb = gm107_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gk110_i2c_new,
-       .ibus = gk104_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gm107_ltc_new,
-       .mc = gk20a_mc_new,
-       .mmu = gk104_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gm107_pmu_new,
-       .therm = gm107_therm_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gm107_ce_new,
-       .ce[2] = gm107_ce_new,
-       .disp = gm107_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gm107_fifo_new,
-       .gr = gm107_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gk104_clk_new },
+       .devinit  = { 0x00000001, gm107_devinit_new },
+       .fb       = { 0x00000001, gm107_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gk110_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gm107_ltc_new },
+       .mc       = { 0x00000001, gk20a_mc_new },
+       .mmu      = { 0x00000001, gk104_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gm107_pmu_new },
+       .privring = { 0x00000001, gk104_privring_new },
+       .therm    = { 0x00000001, gm107_therm_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000005, gm107_ce_new },
+       .disp     = { 0x00000001, gm107_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gm107_fifo_new },
+       .gr       = { 0x00000001, gm107_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000001, gm107_nvenc_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv118_chipset = {
        .name = "GM108",
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .clk = gk104_clk_new,
-       .devinit = gm107_devinit_new,
-       .fb = gm107_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gk110_i2c_new,
-       .ibus = gk104_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gm107_ltc_new,
-       .mc = gk20a_mc_new,
-       .mmu = gk104_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gm107_pmu_new,
-       .therm = gm107_therm_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gm107_ce_new,
-       .ce[2] = gm107_ce_new,
-       .disp = gm107_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gm107_fifo_new,
-       .gr = gm107_gr_new,
-       .sw = gf100_sw_new,
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gk104_clk_new },
+       .devinit  = { 0x00000001, gm107_devinit_new },
+       .fb       = { 0x00000001, gm107_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gk110_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gm107_ltc_new },
+       .mc       = { 0x00000001, gk20a_mc_new },
+       .mmu      = { 0x00000001, gk104_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gm107_pmu_new },
+       .privring = { 0x00000001, gk104_privring_new },
+       .therm    = { 0x00000001, gm107_therm_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000005, gm107_ce_new },
+       .disp     = { 0x00000001, gm107_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gm107_fifo_new },
+       .gr       = { 0x00000001, gm107_gr_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv120_chipset = {
        .name = "GM200",
-       .acr = gm200_acr_new,
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = gm200_devinit_new,
-       .fb = gm200_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gm200_ltc_new,
-       .mc = gk20a_mc_new,
-       .mmu = gm200_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gm200_pmu_new,
-       .therm = gm200_therm_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gm200_ce_new,
-       .ce[1] = gm200_ce_new,
-       .ce[2] = gm200_ce_new,
-       .disp = gm200_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gm200_fifo_new,
-       .gr = gm200_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .nvenc[1] = gm107_nvenc_new,
-       .sw = gf100_sw_new,
+       .acr      = { 0x00000001, gm200_acr_new },
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, gm200_devinit_new },
+       .fb       = { 0x00000001, gm200_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gm200_ltc_new },
+       .mc       = { 0x00000001, gk20a_mc_new },
+       .mmu      = { 0x00000001, gm200_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gm200_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .therm    = { 0x00000001, gm200_therm_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000007, gm200_ce_new },
+       .disp     = { 0x00000001, gm200_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gm200_fifo_new },
+       .gr       = { 0x00000001, gm200_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000003, gm107_nvenc_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv124_chipset = {
        .name = "GM204",
-       .acr = gm200_acr_new,
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = gm200_devinit_new,
-       .fb = gm200_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gm200_ltc_new,
-       .mc = gk20a_mc_new,
-       .mmu = gm200_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gm200_pmu_new,
-       .therm = gm200_therm_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gm200_ce_new,
-       .ce[1] = gm200_ce_new,
-       .ce[2] = gm200_ce_new,
-       .disp = gm200_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gm200_fifo_new,
-       .gr = gm200_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .nvenc[1] = gm107_nvenc_new,
-       .sw = gf100_sw_new,
+       .acr      = { 0x00000001, gm200_acr_new },
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, gm200_devinit_new },
+       .fb       = { 0x00000001, gm200_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gm200_ltc_new },
+       .mc       = { 0x00000001, gk20a_mc_new },
+       .mmu      = { 0x00000001, gm200_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gm200_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .therm    = { 0x00000001, gm200_therm_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000007, gm200_ce_new },
+       .disp     = { 0x00000001, gm200_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gm200_fifo_new },
+       .gr       = { 0x00000001, gm200_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000003, gm107_nvenc_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv126_chipset = {
        .name = "GM206",
-       .acr = gm200_acr_new,
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = gm200_devinit_new,
-       .fb = gm200_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .iccsense = gf100_iccsense_new,
-       .imem = nv50_instmem_new,
-       .ltc = gm200_ltc_new,
-       .mc = gk20a_mc_new,
-       .mmu = gm200_mmu_new,
-       .mxm = nv50_mxm_new,
-       .pci = gk104_pci_new,
-       .pmu = gm200_pmu_new,
-       .therm = gm200_therm_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .volt = gk104_volt_new,
-       .ce[0] = gm200_ce_new,
-       .ce[1] = gm200_ce_new,
-       .ce[2] = gm200_ce_new,
-       .disp = gm200_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gm200_fifo_new,
-       .gr = gm200_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .sw = gf100_sw_new,
+       .acr      = { 0x00000001, gm200_acr_new },
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, gm200_devinit_new },
+       .fb       = { 0x00000001, gm200_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .iccsense = { 0x00000001, gf100_iccsense_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gm200_ltc_new },
+       .mc       = { 0x00000001, gk20a_mc_new },
+       .mmu      = { 0x00000001, gm200_mmu_new },
+       .mxm      = { 0x00000001, nv50_mxm_new },
+       .pci      = { 0x00000001, gk104_pci_new },
+       .pmu      = { 0x00000001, gm200_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .therm    = { 0x00000001, gm200_therm_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gk104_volt_new },
+       .ce       = { 0x00000007, gm200_ce_new },
+       .disp     = { 0x00000001, gm200_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gm200_fifo_new },
+       .gr       = { 0x00000001, gm200_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000001, gm107_nvenc_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv12b_chipset = {
        .name = "GM20B",
-       .acr = gm20b_acr_new,
-       .bar = gm20b_bar_new,
-       .bus = gf100_bus_new,
-       .clk = gm20b_clk_new,
-       .fb = gm20b_fb_new,
-       .fuse = gm107_fuse_new,
-       .ibus = gk20a_ibus_new,
-       .imem = gk20a_instmem_new,
-       .ltc = gm200_ltc_new,
-       .mc = gk20a_mc_new,
-       .mmu = gm20b_mmu_new,
-       .pmu = gm20b_pmu_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[2] = gm200_ce_new,
-       .volt = gm20b_volt_new,
-       .dma = gf119_dma_new,
-       .fifo = gm20b_fifo_new,
-       .gr = gm20b_gr_new,
-       .sw = gf100_sw_new,
+       .acr      = { 0x00000001, gm20b_acr_new },
+       .bar      = { 0x00000001, gm20b_bar_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .clk      = { 0x00000001, gm20b_clk_new },
+       .fb       = { 0x00000001, gm20b_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .imem     = { 0x00000001, gk20a_instmem_new },
+       .ltc      = { 0x00000001, gm200_ltc_new },
+       .mc       = { 0x00000001, gk20a_mc_new },
+       .mmu      = { 0x00000001, gm20b_mmu_new },
+       .pmu      = { 0x00000001, gm20b_pmu_new },
+       .privring = { 0x00000001, gk20a_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .volt     = { 0x00000001, gm20b_volt_new },
+       .ce       = { 0x00000004, gm200_ce_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gm20b_fifo_new },
+       .gr       = { 0x00000001, gm20b_gr_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv130_chipset = {
        .name = "GP100",
-       .acr = gm200_acr_new,
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = gm200_devinit_new,
-       .fault = gp100_fault_new,
-       .fb = gp100_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp100_ltc_new,
-       .mc = gp100_mc_new,
-       .mmu = gp100_mmu_new,
-       .therm = gp100_therm_new,
-       .pci = gp100_pci_new,
-       .pmu = gm200_pmu_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = gp100_ce_new,
-       .ce[1] = gp100_ce_new,
-       .ce[2] = gp100_ce_new,
-       .ce[3] = gp100_ce_new,
-       .ce[4] = gp100_ce_new,
-       .ce[5] = gp100_ce_new,
-       .dma = gf119_dma_new,
-       .disp = gp100_disp_new,
-       .fifo = gp100_fifo_new,
-       .gr = gp100_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .nvenc[1] = gm107_nvenc_new,
-       .nvenc[2] = gm107_nvenc_new,
-       .sw = gf100_sw_new,
+       .acr      = { 0x00000001, gm200_acr_new },
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, gm200_devinit_new },
+       .fault    = { 0x00000001, gp100_fault_new },
+       .fb       = { 0x00000001, gp100_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp100_ltc_new },
+       .mc       = { 0x00000001, gp100_mc_new },
+       .mmu      = { 0x00000001, gp100_mmu_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gm200_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x0000003f, gp100_ce_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .disp     = { 0x00000001, gp100_disp_new },
+       .fifo     = { 0x00000001, gp100_fifo_new },
+       .gr       = { 0x00000001, gp100_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000007, gm107_nvenc_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv132_chipset = {
        .name = "GP102",
-       .acr = gp102_acr_new,
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = gm200_devinit_new,
-       .fault = gp100_fault_new,
-       .fb = gp102_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp102_ltc_new,
-       .mc = gp100_mc_new,
-       .mmu = gp100_mmu_new,
-       .therm = gp100_therm_new,
-       .pci = gp100_pci_new,
-       .pmu = gp102_pmu_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = gp102_ce_new,
-       .ce[1] = gp102_ce_new,
-       .ce[2] = gp102_ce_new,
-       .ce[3] = gp102_ce_new,
-       .disp = gp102_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gp100_fifo_new,
-       .gr = gp102_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .nvenc[1] = gm107_nvenc_new,
-       .sec2 = gp102_sec2_new,
-       .sw = gf100_sw_new,
+       .acr      = { 0x00000001, gp102_acr_new },
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, gm200_devinit_new },
+       .fault    = { 0x00000001, gp100_fault_new },
+       .fb       = { 0x00000001, gp102_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp102_ltc_new },
+       .mc       = { 0x00000001, gp100_mc_new },
+       .mmu      = { 0x00000001, gp100_mmu_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gp102_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x0000000f, gp102_ce_new },
+       .disp     = { 0x00000001, gp102_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gp100_fifo_new },
+       .gr       = { 0x00000001, gp102_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000003, gm107_nvenc_new },
+       .sec2     = { 0x00000001, gp102_sec2_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv134_chipset = {
        .name = "GP104",
-       .acr = gp102_acr_new,
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = gm200_devinit_new,
-       .fault = gp100_fault_new,
-       .fb = gp102_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp102_ltc_new,
-       .mc = gp100_mc_new,
-       .mmu = gp100_mmu_new,
-       .therm = gp100_therm_new,
-       .pci = gp100_pci_new,
-       .pmu = gp102_pmu_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = gp102_ce_new,
-       .ce[1] = gp102_ce_new,
-       .ce[2] = gp102_ce_new,
-       .ce[3] = gp102_ce_new,
-       .disp = gp102_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gp100_fifo_new,
-       .gr = gp104_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .nvenc[1] = gm107_nvenc_new,
-       .sec2 = gp102_sec2_new,
-       .sw = gf100_sw_new,
+       .acr      = { 0x00000001, gp102_acr_new },
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, gm200_devinit_new },
+       .fault    = { 0x00000001, gp100_fault_new },
+       .fb       = { 0x00000001, gp102_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp102_ltc_new },
+       .mc       = { 0x00000001, gp100_mc_new },
+       .mmu      = { 0x00000001, gp100_mmu_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gp102_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x0000000f, gp102_ce_new },
+       .disp     = { 0x00000001, gp102_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gp100_fifo_new },
+       .gr       = { 0x00000001, gp104_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000003, gm107_nvenc_new },
+       .sec2     = { 0x00000001, gp102_sec2_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv136_chipset = {
        .name = "GP106",
-       .acr = gp102_acr_new,
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = gm200_devinit_new,
-       .fault = gp100_fault_new,
-       .fb = gp102_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp102_ltc_new,
-       .mc = gp100_mc_new,
-       .mmu = gp100_mmu_new,
-       .therm = gp100_therm_new,
-       .pci = gp100_pci_new,
-       .pmu = gp102_pmu_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = gp102_ce_new,
-       .ce[1] = gp102_ce_new,
-       .ce[2] = gp102_ce_new,
-       .ce[3] = gp102_ce_new,
-       .disp = gp102_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gp100_fifo_new,
-       .gr = gp104_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .sec2 = gp102_sec2_new,
-       .sw = gf100_sw_new,
+       .acr      = { 0x00000001, gp102_acr_new },
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, gm200_devinit_new },
+       .fault    = { 0x00000001, gp100_fault_new },
+       .fb       = { 0x00000001, gp102_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp102_ltc_new },
+       .mc       = { 0x00000001, gp100_mc_new },
+       .mmu      = { 0x00000001, gp100_mmu_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gp102_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x0000000f, gp102_ce_new },
+       .disp     = { 0x00000001, gp102_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gp100_fifo_new },
+       .gr       = { 0x00000001, gp104_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000001, gm107_nvenc_new },
+       .sec2     = { 0x00000001, gp102_sec2_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv137_chipset = {
        .name = "GP107",
-       .acr = gp102_acr_new,
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = gm200_devinit_new,
-       .fault = gp100_fault_new,
-       .fb = gp102_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp102_ltc_new,
-       .mc = gp100_mc_new,
-       .mmu = gp100_mmu_new,
-       .therm = gp100_therm_new,
-       .pci = gp100_pci_new,
-       .pmu = gp102_pmu_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = gp102_ce_new,
-       .ce[1] = gp102_ce_new,
-       .ce[2] = gp102_ce_new,
-       .ce[3] = gp102_ce_new,
-       .disp = gp102_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gp100_fifo_new,
-       .gr = gp107_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .nvenc[1] = gm107_nvenc_new,
-       .sec2 = gp102_sec2_new,
-       .sw = gf100_sw_new,
+       .acr      = { 0x00000001, gp102_acr_new },
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, gm200_devinit_new },
+       .fault    = { 0x00000001, gp100_fault_new },
+       .fb       = { 0x00000001, gp102_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp102_ltc_new },
+       .mc       = { 0x00000001, gp100_mc_new },
+       .mmu      = { 0x00000001, gp100_mmu_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gp102_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x0000000f, gp102_ce_new },
+       .disp     = { 0x00000001, gp102_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gp100_fifo_new },
+       .gr       = { 0x00000001, gp107_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000003, gm107_nvenc_new },
+       .sec2     = { 0x00000001, gp102_sec2_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv138_chipset = {
        .name = "GP108",
-       .acr = gp108_acr_new,
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = gm200_devinit_new,
-       .fault = gp100_fault_new,
-       .fb = gp102_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp102_ltc_new,
-       .mc = gp100_mc_new,
-       .mmu = gp100_mmu_new,
-       .therm = gp100_therm_new,
-       .pci = gp100_pci_new,
-       .pmu = gp102_pmu_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = gp102_ce_new,
-       .ce[1] = gp102_ce_new,
-       .ce[2] = gp102_ce_new,
-       .ce[3] = gp102_ce_new,
-       .disp = gp102_disp_new,
-       .dma = gf119_dma_new,
-       .fifo = gp100_fifo_new,
-       .gr = gp108_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .sec2 = gp108_sec2_new,
-       .sw = gf100_sw_new,
+       .acr      = { 0x00000001, gp108_acr_new },
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, gm200_devinit_new },
+       .fault    = { 0x00000001, gp100_fault_new },
+       .fb       = { 0x00000001, gp102_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp102_ltc_new },
+       .mc       = { 0x00000001, gp100_mc_new },
+       .mmu      = { 0x00000001, gp100_mmu_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gp102_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x0000000f, gp102_ce_new },
+       .disp     = { 0x00000001, gp102_disp_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gp100_fifo_new },
+       .gr       = { 0x00000001, gp108_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .sec2     = { 0x00000001, gp108_sec2_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv13b_chipset = {
        .name = "GP10B",
-       .acr = gp10b_acr_new,
-       .bar = gm20b_bar_new,
-       .bus = gf100_bus_new,
-       .fault = gp10b_fault_new,
-       .fb = gp10b_fb_new,
-       .fuse = gm107_fuse_new,
-       .ibus = gp10b_ibus_new,
-       .imem = gk20a_instmem_new,
-       .ltc = gp10b_ltc_new,
-       .mc = gp10b_mc_new,
-       .mmu = gp10b_mmu_new,
-       .pmu = gp10b_pmu_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = gp100_ce_new,
-       .dma = gf119_dma_new,
-       .fifo = gp10b_fifo_new,
-       .gr = gp10b_gr_new,
-       .sw = gf100_sw_new,
+       .acr      = { 0x00000001, gp10b_acr_new },
+       .bar      = { 0x00000001, gm20b_bar_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .fault    = { 0x00000001, gp10b_fault_new },
+       .fb       = { 0x00000001, gp10b_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .imem     = { 0x00000001, gk20a_instmem_new },
+       .ltc      = { 0x00000001, gp10b_ltc_new },
+       .mc       = { 0x00000001, gp10b_mc_new },
+       .mmu      = { 0x00000001, gp10b_mmu_new },
+       .pmu      = { 0x00000001, gp10b_pmu_new },
+       .privring = { 0x00000001, gp10b_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x00000001, gp100_ce_new },
+       .dma      = { 0x00000001, gf119_dma_new },
+       .fifo     = { 0x00000001, gp10b_fifo_new },
+       .gr       = { 0x00000001, gp10b_gr_new },
+       .sw       = { 0x00000001, gf100_sw_new },
 };
 
 static const struct nvkm_device_chip
 nv140_chipset = {
        .name = "GV100",
-       .acr = gp108_acr_new,
-       .bar = gm107_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = gv100_devinit_new,
-       .fault = gv100_fault_new,
-       .fb = gv100_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .gsp = gv100_gsp_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp102_ltc_new,
-       .mc = gp100_mc_new,
-       .mmu = gv100_mmu_new,
-       .pci = gp100_pci_new,
-       .pmu = gp102_pmu_new,
-       .therm = gp100_therm_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .disp = gv100_disp_new,
-       .ce[0] = gv100_ce_new,
-       .ce[1] = gv100_ce_new,
-       .ce[2] = gv100_ce_new,
-       .ce[3] = gv100_ce_new,
-       .ce[4] = gv100_ce_new,
-       .ce[5] = gv100_ce_new,
-       .ce[6] = gv100_ce_new,
-       .ce[7] = gv100_ce_new,
-       .ce[8] = gv100_ce_new,
-       .dma = gv100_dma_new,
-       .fifo = gv100_fifo_new,
-       .gr = gv100_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .nvenc[1] = gm107_nvenc_new,
-       .nvenc[2] = gm107_nvenc_new,
-       .sec2 = gp108_sec2_new,
+       .acr      = { 0x00000001, gp108_acr_new },
+       .bar      = { 0x00000001, gm107_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, gv100_devinit_new },
+       .fault    = { 0x00000001, gv100_fault_new },
+       .fb       = { 0x00000001, gv100_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .gsp      = { 0x00000001, gv100_gsp_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp102_ltc_new },
+       .mc       = { 0x00000001, gp100_mc_new },
+       .mmu      = { 0x00000001, gv100_mmu_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gp102_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x000001ff, gv100_ce_new },
+       .disp     = { 0x00000001, gv100_disp_new },
+       .dma      = { 0x00000001, gv100_dma_new },
+       .fifo     = { 0x00000001, gv100_fifo_new },
+       .gr       = { 0x00000001, gv100_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000007, gm107_nvenc_new },
+       .sec2     = { 0x00000001, gp108_sec2_new },
 };
 
 static const struct nvkm_device_chip
 nv162_chipset = {
        .name = "TU102",
-       .acr = tu102_acr_new,
-       .bar = tu102_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = tu102_devinit_new,
-       .fault = tu102_fault_new,
-       .fb = gv100_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .gsp = gv100_gsp_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp102_ltc_new,
-       .mc = tu102_mc_new,
-       .mmu = tu102_mmu_new,
-       .pci = gp100_pci_new,
-       .pmu = gp102_pmu_new,
-       .therm = gp100_therm_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = tu102_ce_new,
-       .ce[1] = tu102_ce_new,
-       .ce[2] = tu102_ce_new,
-       .ce[3] = tu102_ce_new,
-       .ce[4] = tu102_ce_new,
-       .disp = tu102_disp_new,
-       .dma = gv100_dma_new,
-       .fifo = tu102_fifo_new,
-       .gr = tu102_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .sec2 = tu102_sec2_new,
+       .acr      = { 0x00000001, tu102_acr_new },
+       .bar      = { 0x00000001, tu102_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, tu102_devinit_new },
+       .fault    = { 0x00000001, tu102_fault_new },
+       .fb       = { 0x00000001, gv100_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .gsp      = { 0x00000001, gv100_gsp_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp102_ltc_new },
+       .mc       = { 0x00000001, tu102_mc_new },
+       .mmu      = { 0x00000001, tu102_mmu_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gp102_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x0000001f, tu102_ce_new },
+       .disp     = { 0x00000001, tu102_disp_new },
+       .dma      = { 0x00000001, gv100_dma_new },
+       .fifo     = { 0x00000001, tu102_fifo_new },
+       .gr       = { 0x00000001, tu102_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000001, gm107_nvenc_new },
+       .sec2     = { 0x00000001, tu102_sec2_new },
 };
 
 static const struct nvkm_device_chip
 nv164_chipset = {
        .name = "TU104",
-       .acr = tu102_acr_new,
-       .bar = tu102_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = tu102_devinit_new,
-       .fault = tu102_fault_new,
-       .fb = gv100_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .gsp = gv100_gsp_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp102_ltc_new,
-       .mc = tu102_mc_new,
-       .mmu = tu102_mmu_new,
-       .pci = gp100_pci_new,
-       .pmu = gp102_pmu_new,
-       .therm = gp100_therm_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = tu102_ce_new,
-       .ce[1] = tu102_ce_new,
-       .ce[2] = tu102_ce_new,
-       .ce[3] = tu102_ce_new,
-       .ce[4] = tu102_ce_new,
-       .disp = tu102_disp_new,
-       .dma = gv100_dma_new,
-       .fifo = tu102_fifo_new,
-       .gr = tu102_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvdec[1] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .sec2 = tu102_sec2_new,
+       .acr      = { 0x00000001, tu102_acr_new },
+       .bar      = { 0x00000001, tu102_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, tu102_devinit_new },
+       .fault    = { 0x00000001, tu102_fault_new },
+       .fb       = { 0x00000001, gv100_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .gsp      = { 0x00000001, gv100_gsp_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp102_ltc_new },
+       .mc       = { 0x00000001, tu102_mc_new },
+       .mmu      = { 0x00000001, tu102_mmu_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gp102_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x0000001f, tu102_ce_new },
+       .disp     = { 0x00000001, tu102_disp_new },
+       .dma      = { 0x00000001, gv100_dma_new },
+       .fifo     = { 0x00000001, tu102_fifo_new },
+       .gr       = { 0x00000001, tu102_gr_new },
+       .nvdec    = { 0x00000003, gm107_nvdec_new },
+       .nvenc    = { 0x00000001, gm107_nvenc_new },
+       .sec2     = { 0x00000001, tu102_sec2_new },
 };
 
 static const struct nvkm_device_chip
 nv166_chipset = {
        .name = "TU106",
-       .acr = tu102_acr_new,
-       .bar = tu102_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = tu102_devinit_new,
-       .fault = tu102_fault_new,
-       .fb = gv100_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .gsp = gv100_gsp_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp102_ltc_new,
-       .mc = tu102_mc_new,
-       .mmu = tu102_mmu_new,
-       .pci = gp100_pci_new,
-       .pmu = gp102_pmu_new,
-       .therm = gp100_therm_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = tu102_ce_new,
-       .ce[1] = tu102_ce_new,
-       .ce[2] = tu102_ce_new,
-       .ce[3] = tu102_ce_new,
-       .ce[4] = tu102_ce_new,
-       .disp = tu102_disp_new,
-       .dma = gv100_dma_new,
-       .fifo = tu102_fifo_new,
-       .gr = tu102_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvdec[1] = gm107_nvdec_new,
-       .nvdec[2] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .sec2 = tu102_sec2_new,
+       .acr      = { 0x00000001, tu102_acr_new },
+       .bar      = { 0x00000001, tu102_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, tu102_devinit_new },
+       .fault    = { 0x00000001, tu102_fault_new },
+       .fb       = { 0x00000001, gv100_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .gsp      = { 0x00000001, gv100_gsp_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp102_ltc_new },
+       .mc       = { 0x00000001, tu102_mc_new },
+       .mmu      = { 0x00000001, tu102_mmu_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gp102_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x0000001f, tu102_ce_new },
+       .disp     = { 0x00000001, tu102_disp_new },
+       .dma      = { 0x00000001, gv100_dma_new },
+       .fifo     = { 0x00000001, tu102_fifo_new },
+       .gr       = { 0x00000001, tu102_gr_new },
+       .nvdec    = { 0x00000007, gm107_nvdec_new },
+       .nvenc    = { 0x00000001, gm107_nvenc_new },
+       .sec2     = { 0x00000001, tu102_sec2_new },
 };
 
 static const struct nvkm_device_chip
 nv167_chipset = {
        .name = "TU117",
-       .acr = tu102_acr_new,
-       .bar = tu102_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = tu102_devinit_new,
-       .fault = tu102_fault_new,
-       .fb = gv100_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .gsp = gv100_gsp_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp102_ltc_new,
-       .mc = tu102_mc_new,
-       .mmu = tu102_mmu_new,
-       .pci = gp100_pci_new,
-       .pmu = gp102_pmu_new,
-       .therm = gp100_therm_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = tu102_ce_new,
-       .ce[1] = tu102_ce_new,
-       .ce[2] = tu102_ce_new,
-       .ce[3] = tu102_ce_new,
-       .ce[4] = tu102_ce_new,
-       .disp = tu102_disp_new,
-       .dma = gv100_dma_new,
-       .fifo = tu102_fifo_new,
-       .gr = tu102_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .sec2 = tu102_sec2_new,
+       .acr      = { 0x00000001, tu102_acr_new },
+       .bar      = { 0x00000001, tu102_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, tu102_devinit_new },
+       .fault    = { 0x00000001, tu102_fault_new },
+       .fb       = { 0x00000001, gv100_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .gsp      = { 0x00000001, gv100_gsp_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp102_ltc_new },
+       .mc       = { 0x00000001, tu102_mc_new },
+       .mmu      = { 0x00000001, tu102_mmu_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gp102_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x0000001f, tu102_ce_new },
+       .disp     = { 0x00000001, tu102_disp_new },
+       .dma      = { 0x00000001, gv100_dma_new },
+       .fifo     = { 0x00000001, tu102_fifo_new },
+       .gr       = { 0x00000001, tu102_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000001, gm107_nvenc_new },
+       .sec2     = { 0x00000001, tu102_sec2_new },
 };
 
 static const struct nvkm_device_chip
 nv168_chipset = {
        .name = "TU116",
-       .acr = tu102_acr_new,
-       .bar = tu102_bar_new,
-       .bios = nvkm_bios_new,
-       .bus = gf100_bus_new,
-       .devinit = tu102_devinit_new,
-       .fault = tu102_fault_new,
-       .fb = gv100_fb_new,
-       .fuse = gm107_fuse_new,
-       .gpio = gk104_gpio_new,
-       .gsp = gv100_gsp_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .ltc = gp102_ltc_new,
-       .mc = tu102_mc_new,
-       .mmu = tu102_mmu_new,
-       .pci = gp100_pci_new,
-       .pmu = gp102_pmu_new,
-       .therm = gp100_therm_new,
-       .timer = gk20a_timer_new,
-       .top = gk104_top_new,
-       .ce[0] = tu102_ce_new,
-       .ce[1] = tu102_ce_new,
-       .ce[2] = tu102_ce_new,
-       .ce[3] = tu102_ce_new,
-       .ce[4] = tu102_ce_new,
-       .disp = tu102_disp_new,
-       .dma = gv100_dma_new,
-       .fifo = tu102_fifo_new,
-       .gr = tu102_gr_new,
-       .nvdec[0] = gm107_nvdec_new,
-       .nvenc[0] = gm107_nvenc_new,
-       .sec2 = tu102_sec2_new,
+       .acr      = { 0x00000001, tu102_acr_new },
+       .bar      = { 0x00000001, tu102_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .bus      = { 0x00000001, gf100_bus_new },
+       .devinit  = { 0x00000001, tu102_devinit_new },
+       .fault    = { 0x00000001, tu102_fault_new },
+       .fb       = { 0x00000001, gv100_fb_new },
+       .fuse     = { 0x00000001, gm107_fuse_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .gsp      = { 0x00000001, gv100_gsp_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .ltc      = { 0x00000001, gp102_ltc_new },
+       .mc       = { 0x00000001, tu102_mc_new },
+       .mmu      = { 0x00000001, tu102_mmu_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .pmu      = { 0x00000001, gp102_pmu_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .therm    = { 0x00000001, gp100_therm_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, gk104_top_new },
+       .ce       = { 0x0000001f, tu102_ce_new },
+       .disp     = { 0x00000001, tu102_disp_new },
+       .dma      = { 0x00000001, gv100_dma_new },
+       .fifo     = { 0x00000001, tu102_fifo_new },
+       .gr       = { 0x00000001, tu102_gr_new },
+       .nvdec    = { 0x00000001, gm107_nvdec_new },
+       .nvenc    = { 0x00000001, gm107_nvenc_new },
+       .sec2     = { 0x00000001, tu102_sec2_new },
 };
 
 static const struct nvkm_device_chip
 nv170_chipset = {
        .name = "GA100",
-       .bar = tu102_bar_new,
-       .bios = nvkm_bios_new,
-       .devinit = ga100_devinit_new,
-       .fb = ga100_fb_new,
-       .gpio = gk104_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .mc = ga100_mc_new,
-       .mmu = tu102_mmu_new,
-       .pci = gp100_pci_new,
-       .timer = gk20a_timer_new,
+       .bar      = { 0x00000001, tu102_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .devinit  = { 0x00000001, ga100_devinit_new },
+       .fb       = { 0x00000001, ga100_fb_new },
+       .gpio     = { 0x00000001, gk104_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, ga100_mc_new },
+       .mmu      = { 0x00000001, tu102_mmu_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, ga100_top_new },
 };
 
 static const struct nvkm_device_chip
 nv172_chipset = {
        .name = "GA102",
-       .bar = tu102_bar_new,
-       .bios = nvkm_bios_new,
-       .devinit = ga100_devinit_new,
-       .fb = ga102_fb_new,
-       .gpio = ga102_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .mc = ga100_mc_new,
-       .mmu = tu102_mmu_new,
-       .pci = gp100_pci_new,
-       .timer = gk20a_timer_new,
-       .disp = ga102_disp_new,
-       .dma = gv100_dma_new,
+       .bar      = { 0x00000001, tu102_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .devinit  = { 0x00000001, ga100_devinit_new },
+       .fb       = { 0x00000001, ga102_fb_new },
+       .gpio     = { 0x00000001, ga102_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, ga100_mc_new },
+       .mmu      = { 0x00000001, tu102_mmu_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, ga100_top_new },
+       .disp     = { 0x00000001, ga102_disp_new },
+       .dma      = { 0x00000001, gv100_dma_new },
 };
 
 static const struct nvkm_device_chip
 nv174_chipset = {
        .name = "GA104",
-       .bar = tu102_bar_new,
-       .bios = nvkm_bios_new,
-       .devinit = ga100_devinit_new,
-       .fb = ga102_fb_new,
-       .gpio = ga102_gpio_new,
-       .i2c = gm200_i2c_new,
-       .ibus = gm200_ibus_new,
-       .imem = nv50_instmem_new,
-       .mc = ga100_mc_new,
-       .mmu = tu102_mmu_new,
-       .pci = gp100_pci_new,
-       .timer = gk20a_timer_new,
-       .disp = ga102_disp_new,
-       .dma = gv100_dma_new,
+       .bar      = { 0x00000001, tu102_bar_new },
+       .bios     = { 0x00000001, nvkm_bios_new },
+       .devinit  = { 0x00000001, ga100_devinit_new },
+       .fb       = { 0x00000001, ga102_fb_new },
+       .gpio     = { 0x00000001, ga102_gpio_new },
+       .i2c      = { 0x00000001, gm200_i2c_new },
+       .imem     = { 0x00000001, nv50_instmem_new },
+       .mc       = { 0x00000001, ga100_mc_new },
+       .mmu      = { 0x00000001, tu102_mmu_new },
+       .pci      = { 0x00000001, gp100_pci_new },
+       .privring = { 0x00000001, gm200_privring_new },
+       .timer    = { 0x00000001, gk20a_timer_new },
+       .top      = { 0x00000001, ga100_top_new },
+       .disp     = { 0x00000001, ga102_disp_new },
+       .dma      = { 0x00000001, gv100_dma_new },
 };
 
 static int
@@ -2726,97 +2643,24 @@ nvkm_device_event_func = {
 };
 
 struct nvkm_subdev *
-nvkm_device_subdev(struct nvkm_device *device, int index)
+nvkm_device_subdev(struct nvkm_device *device, int type, int inst)
 {
-       struct nvkm_engine *engine;
-
-       if (device->disable_mask & (1ULL << index))
-               return NULL;
-
-       switch (index) {
-#define _(n,p,m) case NVKM_SUBDEV_##n: if (p) return (m); break
-       _(ACR     , device->acr     , &device->acr->subdev);
-       _(BAR     , device->bar     , &device->bar->subdev);
-       _(VBIOS   , device->bios    , &device->bios->subdev);
-       _(BUS     , device->bus     , &device->bus->subdev);
-       _(CLK     , device->clk     , &device->clk->subdev);
-       _(DEVINIT , device->devinit , &device->devinit->subdev);
-       _(FAULT   , device->fault   , &device->fault->subdev);
-       _(FB      , device->fb      , &device->fb->subdev);
-       _(FUSE    , device->fuse    , &device->fuse->subdev);
-       _(GPIO    , device->gpio    , &device->gpio->subdev);
-       _(GSP     , device->gsp     , &device->gsp->subdev);
-       _(I2C     , device->i2c     , &device->i2c->subdev);
-       _(IBUS    , device->ibus    ,  device->ibus);
-       _(ICCSENSE, device->iccsense, &device->iccsense->subdev);
-       _(INSTMEM , device->imem    , &device->imem->subdev);
-       _(LTC     , device->ltc     , &device->ltc->subdev);
-       _(MC      , device->mc      , &device->mc->subdev);
-       _(MMU     , device->mmu     , &device->mmu->subdev);
-       _(MXM     , device->mxm     ,  device->mxm);
-       _(PCI     , device->pci     , &device->pci->subdev);
-       _(PMU     , device->pmu     , &device->pmu->subdev);
-       _(THERM   , device->therm   , &device->therm->subdev);
-       _(TIMER   , device->timer   , &device->timer->subdev);
-       _(TOP     , device->top     , &device->top->subdev);
-       _(VOLT    , device->volt    , &device->volt->subdev);
-#undef _
-       default:
-               engine = nvkm_device_engine(device, index);
-               if (engine)
-                       return &engine->subdev;
-               break;
+       struct nvkm_subdev *subdev;
+
+       list_for_each_entry(subdev, &device->subdev, head) {
+               if (subdev->type == type && subdev->inst == inst)
+                       return subdev;
        }
+
        return NULL;
 }
 
 struct nvkm_engine *
-nvkm_device_engine(struct nvkm_device *device, int index)
+nvkm_device_engine(struct nvkm_device *device, int type, int inst)
 {
-       if (device->disable_mask & (1ULL << index))
-               return NULL;
-
-       switch (index) {
-#define _(n,p,m) case NVKM_ENGINE_##n: if (p) return (m); break
-       _(BSP    , device->bsp     ,  device->bsp);
-       _(CE0    , device->ce[0]   ,  device->ce[0]);
-       _(CE1    , device->ce[1]   ,  device->ce[1]);
-       _(CE2    , device->ce[2]   ,  device->ce[2]);
-       _(CE3    , device->ce[3]   ,  device->ce[3]);
-       _(CE4    , device->ce[4]   ,  device->ce[4]);
-       _(CE5    , device->ce[5]   ,  device->ce[5]);
-       _(CE6    , device->ce[6]   ,  device->ce[6]);
-       _(CE7    , device->ce[7]   ,  device->ce[7]);
-       _(CE8    , device->ce[8]   ,  device->ce[8]);
-       _(CIPHER , device->cipher  ,  device->cipher);
-       _(DISP   , device->disp    , &device->disp->engine);
-       _(DMAOBJ , device->dma     , &device->dma->engine);
-       _(FIFO   , device->fifo    , &device->fifo->engine);
-       _(GR     , device->gr      , &device->gr->engine);
-       _(IFB    , device->ifb     ,  device->ifb);
-       _(ME     , device->me      ,  device->me);
-       _(MPEG   , device->mpeg    ,  device->mpeg);
-       _(MSENC  , device->msenc   ,  device->msenc);
-       _(MSPDEC , device->mspdec  ,  device->mspdec);
-       _(MSPPP  , device->msppp   ,  device->msppp);
-       _(MSVLD  , device->msvld   ,  device->msvld);
-       _(NVENC0 , device->nvenc[0], &device->nvenc[0]->engine);
-       _(NVENC1 , device->nvenc[1], &device->nvenc[1]->engine);
-       _(NVENC2 , device->nvenc[2], &device->nvenc[2]->engine);
-       _(NVDEC0 , device->nvdec[0], &device->nvdec[0]->engine);
-       _(NVDEC1 , device->nvdec[1], &device->nvdec[1]->engine);
-       _(NVDEC2 , device->nvdec[2], &device->nvdec[2]->engine);
-       _(PM     , device->pm      , &device->pm->engine);
-       _(SEC    , device->sec     ,  device->sec);
-       _(SEC2   , device->sec2    , &device->sec2->engine);
-       _(SW     , device->sw      , &device->sw->engine);
-       _(VIC    , device->vic     ,  device->vic);
-       _(VP     , device->vp      ,  device->vp);
-#undef _
-       default:
-               WARN_ON(1);
-               break;
-       }
+       struct nvkm_subdev *subdev = nvkm_device_subdev(device, type, inst);
+       if (subdev && subdev->func == &nvkm_engine)
+               return container_of(subdev, struct nvkm_engine, subdev);
        return NULL;
 }
 
@@ -2825,7 +2669,7 @@ nvkm_device_fini(struct nvkm_device *device, bool suspend)
 {
        const char *action = suspend ? "suspend" : "fini";
        struct nvkm_subdev *subdev;
-       int ret, i;
+       int ret;
        s64 time;
 
        nvdev_trace(device, "%s running...\n", action);
@@ -2833,12 +2677,10 @@ nvkm_device_fini(struct nvkm_device *device, bool suspend)
 
        nvkm_acpi_fini(device);
 
-       for (i = NVKM_SUBDEV_NR - 1; i >= 0; i--) {
-               if ((subdev = nvkm_device_subdev(device, i))) {
-                       ret = nvkm_subdev_fini(subdev, suspend);
-                       if (ret && suspend)
-                               goto fail;
-               }
+       list_for_each_entry_reverse(subdev, &device->subdev, head) {
+               ret = nvkm_subdev_fini(subdev, suspend);
+               if (ret && suspend)
+                       goto fail;
        }
 
        nvkm_therm_clkgate_fini(device->therm, suspend);
@@ -2851,13 +2693,11 @@ nvkm_device_fini(struct nvkm_device *device, bool suspend)
        return 0;
 
 fail:
-       do {
-               if ((subdev = nvkm_device_subdev(device, i))) {
-                       int rret = nvkm_subdev_init(subdev);
-                       if (rret)
-                               nvkm_fatal(subdev, "failed restart, %d\n", ret);
-               }
-       } while (++i < NVKM_SUBDEV_NR);
+       list_for_each_entry_from(subdev, &device->subdev, head) {
+               int rret = nvkm_subdev_init(subdev);
+               if (rret)
+                       nvkm_fatal(subdev, "failed restart, %d\n", ret);
+       }
 
        nvdev_trace(device, "%s failed with %d\n", action, ret);
        return ret;
@@ -2867,7 +2707,7 @@ static int
 nvkm_device_preinit(struct nvkm_device *device)
 {
        struct nvkm_subdev *subdev;
-       int ret, i;
+       int ret;
        s64 time;
 
        nvdev_trace(device, "preinit running...\n");
@@ -2879,15 +2719,13 @@ nvkm_device_preinit(struct nvkm_device *device)
                        goto fail;
        }
 
-       for (i = 0; i < NVKM_SUBDEV_NR; i++) {
-               if ((subdev = nvkm_device_subdev(device, i))) {
-                       ret = nvkm_subdev_preinit(subdev);
-                       if (ret)
-                               goto fail;
-               }
+       list_for_each_entry(subdev, &device->subdev, head) {
+               ret = nvkm_subdev_preinit(subdev);
+               if (ret)
+                       goto fail;
        }
 
-       ret = nvkm_devinit_post(device->devinit, &device->disable_mask);
+       ret = nvkm_devinit_post(device->devinit);
        if (ret)
                goto fail;
 
@@ -2904,7 +2742,7 @@ int
 nvkm_device_init(struct nvkm_device *device)
 {
        struct nvkm_subdev *subdev;
-       int ret, i;
+       int ret;
        s64 time;
 
        ret = nvkm_device_preinit(device);
@@ -2922,12 +2760,10 @@ nvkm_device_init(struct nvkm_device *device)
                        goto fail;
        }
 
-       for (i = 0; i < NVKM_SUBDEV_NR; i++) {
-               if ((subdev = nvkm_device_subdev(device, i))) {
-                       ret = nvkm_subdev_init(subdev);
-                       if (ret)
-                               goto fail_subdev;
-               }
+       list_for_each_entry(subdev, &device->subdev, head) {
+               ret = nvkm_subdev_init(subdev);
+               if (ret)
+                       goto fail_subdev;
        }
 
        nvkm_acpi_init(device);
@@ -2938,11 +2774,8 @@ nvkm_device_init(struct nvkm_device *device)
        return 0;
 
 fail_subdev:
-       do {
-               if ((subdev = nvkm_device_subdev(device, i)))
-                       nvkm_subdev_fini(subdev, false);
-       } while (--i >= 0);
-
+       list_for_each_entry_from(subdev, &device->subdev, head)
+               nvkm_subdev_fini(subdev, false);
 fail:
        nvkm_device_fini(device, false);
 
@@ -2954,15 +2787,12 @@ void
 nvkm_device_del(struct nvkm_device **pdevice)
 {
        struct nvkm_device *device = *pdevice;
-       int i;
+       struct nvkm_subdev *subdev, *subtmp;
        if (device) {
                mutex_lock(&nv_devices_mutex);
-               device->disable_mask = 0;
-               for (i = NVKM_SUBDEV_NR - 1; i >= 0; i--) {
-                       struct nvkm_subdev *subdev =
-                               nvkm_device_subdev(device, i);
+
+               list_for_each_entry_safe_reverse(subdev, subtmp, &device->subdev, head)
                        nvkm_subdev_del(&subdev);
-               }
 
                nvkm_event_fini(&device->event);
 
@@ -3021,7 +2851,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
        struct nvkm_subdev *subdev;
        u64 mmio_base, mmio_size;
        u32 boot0, boot1, strap;
-       int ret = -EEXIST, i;
+       int ret = -EEXIST, j;
        unsigned chipset;
 
        mutex_lock(&nv_devices_mutex);
@@ -3038,6 +2868,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
        device->name = name;
        list_add_tail(&device->head, &nv_devices);
        device->debug = nvkm_dbgopt(device->dbgopt, "device");
+       INIT_LIST_HEAD(&device->subdev);
 
        ret = nvkm_event_init(&nvkm_device_event_func, 1, 1, &device->event);
        if (ret)
@@ -3271,88 +3102,46 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
 
        mutex_init(&device->mutex);
 
-       for (i = 0; i < NVKM_SUBDEV_NR; i++) {
-#define _(s,m) case s:                                                         \
-       if (device->chip->m && (subdev_mask & (1ULL << (s)))) {                \
-               ret = device->chip->m(device, (s), &device->m);                \
-               if (ret) {                                                     \
-                       subdev = nvkm_device_subdev(device, (s));              \
-                       nvkm_subdev_del(&subdev);                              \
-                       device->m = NULL;                                      \
-                       if (ret != -ENODEV) {                                  \
-                               nvdev_error(device, "%s ctor failed, %d\n",    \
-                                           nvkm_subdev_name[s], ret);         \
-                               goto done;                                     \
-                       }                                                      \
-               }                                                              \
-       }                                                                      \
-       break
-               switch (i) {
-               _(NVKM_SUBDEV_ACR     ,      acr);
-               _(NVKM_SUBDEV_BAR     ,      bar);
-               _(NVKM_SUBDEV_VBIOS   ,     bios);
-               _(NVKM_SUBDEV_BUS     ,      bus);
-               _(NVKM_SUBDEV_CLK     ,      clk);
-               _(NVKM_SUBDEV_DEVINIT ,  devinit);
-               _(NVKM_SUBDEV_FAULT   ,    fault);
-               _(NVKM_SUBDEV_FB      ,       fb);
-               _(NVKM_SUBDEV_FUSE    ,     fuse);
-               _(NVKM_SUBDEV_GPIO    ,     gpio);
-               _(NVKM_SUBDEV_GSP     ,      gsp);
-               _(NVKM_SUBDEV_I2C     ,      i2c);
-               _(NVKM_SUBDEV_IBUS    ,     ibus);
-               _(NVKM_SUBDEV_ICCSENSE, iccsense);
-               _(NVKM_SUBDEV_INSTMEM ,     imem);
-               _(NVKM_SUBDEV_LTC     ,      ltc);
-               _(NVKM_SUBDEV_MC      ,       mc);
-               _(NVKM_SUBDEV_MMU     ,      mmu);
-               _(NVKM_SUBDEV_MXM     ,      mxm);
-               _(NVKM_SUBDEV_PCI     ,      pci);
-               _(NVKM_SUBDEV_PMU     ,      pmu);
-               _(NVKM_SUBDEV_THERM   ,    therm);
-               _(NVKM_SUBDEV_TIMER   ,    timer);
-               _(NVKM_SUBDEV_TOP     ,      top);
-               _(NVKM_SUBDEV_VOLT    ,     volt);
-               _(NVKM_ENGINE_BSP     ,      bsp);
-               _(NVKM_ENGINE_CE0     ,    ce[0]);
-               _(NVKM_ENGINE_CE1     ,    ce[1]);
-               _(NVKM_ENGINE_CE2     ,    ce[2]);
-               _(NVKM_ENGINE_CE3     ,    ce[3]);
-               _(NVKM_ENGINE_CE4     ,    ce[4]);
-               _(NVKM_ENGINE_CE5     ,    ce[5]);
-               _(NVKM_ENGINE_CE6     ,    ce[6]);
-               _(NVKM_ENGINE_CE7     ,    ce[7]);
-               _(NVKM_ENGINE_CE8     ,    ce[8]);
-               _(NVKM_ENGINE_CIPHER  ,   cipher);
-               _(NVKM_ENGINE_DISP    ,     disp);
-               _(NVKM_ENGINE_DMAOBJ  ,      dma);
-               _(NVKM_ENGINE_FIFO    ,     fifo);
-               _(NVKM_ENGINE_GR      ,       gr);
-               _(NVKM_ENGINE_IFB     ,      ifb);
-               _(NVKM_ENGINE_ME      ,       me);
-               _(NVKM_ENGINE_MPEG    ,     mpeg);
-               _(NVKM_ENGINE_MSENC   ,    msenc);
-               _(NVKM_ENGINE_MSPDEC  ,   mspdec);
-               _(NVKM_ENGINE_MSPPP   ,    msppp);
-               _(NVKM_ENGINE_MSVLD   ,    msvld);
-               _(NVKM_ENGINE_NVENC0  , nvenc[0]);
-               _(NVKM_ENGINE_NVENC1  , nvenc[1]);
-               _(NVKM_ENGINE_NVENC2  , nvenc[2]);
-               _(NVKM_ENGINE_NVDEC0  , nvdec[0]);
-               _(NVKM_ENGINE_NVDEC1  , nvdec[1]);
-               _(NVKM_ENGINE_NVDEC2  , nvdec[2]);
-               _(NVKM_ENGINE_PM      ,       pm);
-               _(NVKM_ENGINE_SEC     ,      sec);
-               _(NVKM_ENGINE_SEC2    ,     sec2);
-               _(NVKM_ENGINE_SW      ,       sw);
-               _(NVKM_ENGINE_VIC     ,      vic);
-               _(NVKM_ENGINE_VP      ,       vp);
-               default:
-                       WARN_ON(1);
-                       continue;
-               }
-#undef _
+#define NVKM_LAYOUT_ONCE(type,data,ptr)                                                      \
+       if (device->chip->ptr.inst && (subdev_mask & (BIT_ULL(type)))) {                     \
+               WARN_ON(device->chip->ptr.inst != 0x00000001);                               \
+               ret = device->chip->ptr.ctor(device, (type), -1, &device->ptr);              \
+               subdev = nvkm_device_subdev(device, (type), 0);                              \
+               if (ret) {                                                                   \
+                       nvkm_subdev_del(&subdev);                                            \
+                       device->ptr = NULL;                                                  \
+                       if (ret != -ENODEV) {                                                \
+                               nvdev_error(device, "%s ctor failed: %d\n",                  \
+                                           nvkm_subdev_type[(type)], ret);                  \
+                               goto done;                                                   \
+                       }                                                                    \
+               } else {                                                                     \
+                       subdev->pself = (void **)&device->ptr;                               \
+               }                                                                            \
+       }
+#define NVKM_LAYOUT_INST(type,data,ptr,cnt)                                                  \
+       WARN_ON(device->chip->ptr.inst & ~((1 << ARRAY_SIZE(device->ptr)) - 1));             \
+       for (j = 0; device->chip->ptr.inst && j < ARRAY_SIZE(device->ptr); j++) {            \
+               if ((device->chip->ptr.inst & BIT(j)) && (subdev_mask & BIT_ULL(type))) {    \
+                       int inst = (device->chip->ptr.inst == 1) ? -1 : (j);                 \
+                       ret = device->chip->ptr.ctor(device, (type), inst, &device->ptr[j]); \
+                       subdev = nvkm_device_subdev(device, (type), (j));                    \
+                       if (ret) {                                                           \
+                               nvkm_subdev_del(&subdev);                                    \
+                               device->ptr[j] = NULL;                                       \
+                               if (ret != -ENODEV) {                                        \
+                                       nvdev_error(device, "%s%d ctor failed: %d\n",        \
+                                                   nvkm_subdev_type[(type)], (j), ret);     \
+                                       goto done;                                           \
+                               }                                                            \
+                       } else {                                                             \
+                               subdev->pself = (void **)&device->ptr[j];                    \
+                       }                                                                    \
+               }                                                                            \
        }
+#include <core/layout.h>
+#undef NVKM_LAYOUT_INST
+#undef NVKM_LAYOUT_ONCE
 
        ret = 0;
 done:
index 54eab5e042307c3b6d8df3af5df668e7d138f866..93949b3c721432be017c3d20bde7a355b6b48c94 100644 (file)
@@ -15,7 +15,6 @@
 #include <subdev/gpio.h>
 #include <subdev/gsp.h>
 #include <subdev/i2c.h>
-#include <subdev/ibus.h>
 #include <subdev/iccsense.h>
 #include <subdev/instmem.h>
 #include <subdev/ltc.h>
@@ -24,6 +23,7 @@
 #include <subdev/mxm.h>
 #include <subdev/pci.h>
 #include <subdev/pmu.h>
+#include <subdev/privring.h>
 #include <subdev/therm.h>
 #include <subdev/timer.h>
 #include <subdev/top.h>
index 1478947987860d664a89247afaecd8e7d46c9dc7..fea9d8f2b10cbcfe83a390d197dd83e1a1fbb1ce 100644 (file)
@@ -43,15 +43,15 @@ static int
 nvkm_udevice_info_subdev(struct nvkm_device *device, u64 mthd, u64 *data)
 {
        struct nvkm_subdev *subdev;
-       enum nvkm_devidx subidx;
+       enum nvkm_subdev_type type;
 
        switch (mthd & NV_DEVICE_INFO_UNIT) {
-       case NV_DEVICE_FIFO(0): subidx = NVKM_ENGINE_FIFO; break;
+       case NV_DEVICE_HOST(0): type = NVKM_ENGINE_FIFO; break;
        default:
                return -EINVAL;
        }
 
-       subdev = nvkm_device_subdev(device, subidx);
+       subdev = nvkm_device_subdev(device, type, 0);
        if (subdev)
                return nvkm_subdev_info(subdev, mthd, data);
        return -ENODEV;
@@ -66,37 +66,7 @@ nvkm_udevice_info_v1(struct nvkm_device *device,
                        args->mthd = NV_DEVICE_INFO_INVALID;
                return;
        }
-
-       switch (args->mthd) {
-#define ENGINE__(A,B,C) NV_DEVICE_INFO_ENGINE_##A: { int _i;                   \
-       for (_i = (B), args->data = 0ULL; _i <= (C); _i++) {                   \
-               if (nvkm_device_engine(device, _i))                            \
-                       args->data |= BIT_ULL(_i);                             \
-       }                                                                      \
-}
-#define ENGINE_A(A) ENGINE__(A, NVKM_ENGINE_##A   , NVKM_ENGINE_##A)
-#define ENGINE_B(A) ENGINE__(A, NVKM_ENGINE_##A##0, NVKM_ENGINE_##A##_LAST)
-       case ENGINE_A(SW    ); break;
-       case ENGINE_A(GR    ); break;
-       case ENGINE_A(MPEG  ); break;
-       case ENGINE_A(ME    ); break;
-       case ENGINE_A(CIPHER); break;
-       case ENGINE_A(BSP   ); break;
-       case ENGINE_A(VP    ); break;
-       case ENGINE_B(CE    ); break;
-       case ENGINE_A(SEC   ); break;
-       case ENGINE_A(MSVLD ); break;
-       case ENGINE_A(MSPDEC); break;
-       case ENGINE_A(MSPPP ); break;
-       case ENGINE_A(MSENC ); break;
-       case ENGINE_A(VIC   ); break;
-       case ENGINE_A(SEC2  ); break;
-       case ENGINE_B(NVDEC ); break;
-       case ENGINE_B(NVENC ); break;
-       default:
-               args->mthd = NV_DEVICE_INFO_INVALID;
-               break;
-       }
+       args->mthd = NV_DEVICE_INFO_INVALID;
 }
 
 static int
@@ -357,7 +327,7 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index,
        int i;
 
        for (; i = __ffs64(mask), mask && !sclass; mask &= ~(1ULL << i)) {
-               if (!(engine = nvkm_device_engine(device, i)) ||
+               if (!(engine = nvkm_device_engine(device, i, 0)) ||
                    !(engine->func->base.sclass))
                        continue;
                oclass->engine = engine;
index cbd33e87b799a70b6085707de74bafaefe047e24..5daa777552767caf53ab04af65d6568efe0d1d22 100644 (file)
@@ -149,10 +149,10 @@ static void
 nvkm_disp_class_del(struct nvkm_oproxy *oproxy)
 {
        struct nvkm_disp *disp = nvkm_disp(oproxy->base.engine);
-       mutex_lock(&disp->engine.subdev.mutex);
-       if (disp->client == oproxy)
-               disp->client = NULL;
-       mutex_unlock(&disp->engine.subdev.mutex);
+       spin_lock(&disp->client.lock);
+       if (disp->client.object == oproxy)
+               disp->client.object = NULL;
+       spin_unlock(&disp->client.lock);
 }
 
 static const struct nvkm_oproxy_func
@@ -175,13 +175,13 @@ nvkm_disp_class_new(struct nvkm_device *device,
                return ret;
        *pobject = &oproxy->base;
 
-       mutex_lock(&disp->engine.subdev.mutex);
-       if (disp->client) {
-               mutex_unlock(&disp->engine.subdev.mutex);
+       spin_lock(&disp->client.lock);
+       if (disp->client.object) {
+               spin_unlock(&disp->client.lock);
                return -EBUSY;
        }
-       disp->client = oproxy;
-       mutex_unlock(&disp->engine.subdev.mutex);
+       disp->client.object = oproxy;
+       spin_unlock(&disp->client.lock);
 
        return sclass->ctor(disp, oclass, data, size, &oproxy->object);
 }
@@ -473,21 +473,22 @@ nvkm_disp = {
 
 int
 nvkm_disp_ctor(const struct nvkm_disp_func *func, struct nvkm_device *device,
-              int index, struct nvkm_disp *disp)
+              enum nvkm_subdev_type type, int inst, struct nvkm_disp *disp)
 {
        disp->func = func;
        INIT_LIST_HEAD(&disp->head);
        INIT_LIST_HEAD(&disp->ior);
        INIT_LIST_HEAD(&disp->outp);
        INIT_LIST_HEAD(&disp->conn);
-       return nvkm_engine_ctor(&nvkm_disp, device, index, true, &disp->engine);
+       spin_lock_init(&disp->client.lock);
+       return nvkm_engine_ctor(&nvkm_disp, device, type, inst, true, &disp->engine);
 }
 
 int
 nvkm_disp_new_(const struct nvkm_disp_func *func, struct nvkm_device *device,
-              int index, struct nvkm_disp **pdisp)
+              enum nvkm_subdev_type type, int inst, struct nvkm_disp **pdisp)
 {
        if (!(*pdisp = kzalloc(sizeof(**pdisp), GFP_KERNEL)))
                return -ENOMEM;
-       return nvkm_disp_ctor(func, device, index, *pdisp);
+       return nvkm_disp_ctor(func, device, type, inst, *pdisp);
 }
index 50e3539f33d22daa631e90a0bbcc8236f9899ff5..a7a7eb0415159e548bba8f3d043b33770980f734 100644 (file)
@@ -278,7 +278,7 @@ nv50_disp_chan_child_get(struct nvkm_object *object, int index,
        const struct nvkm_device_oclass *oclass = NULL;
 
        if (chan->func->bind)
-               sclass->engine = nvkm_device_engine(device, NVKM_ENGINE_DMAOBJ);
+               sclass->engine = nvkm_device_engine(device, NVKM_ENGINE_DMAOBJ, 0);
        else
                sclass->engine = NULL;
 
index 731f188fc1ee7d69fe959dd28d8d67c0855d8890..156bbe8b2de3e2107f8aa5df88682afb7069364b 100644 (file)
@@ -41,7 +41,8 @@ g84_disp = {
 };
 
 int
-g84_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+g84_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&g84_disp, device, index, pdisp);
+       return nv50_disp_new_(&g84_disp, device, type, inst, pdisp);
 }
index def54fe1951ec36641ec6a140b86bcff5e3f4c7c..3425b5d3bc72f65ef19e5a69f503669cf4737c46 100644 (file)
@@ -41,7 +41,8 @@ g94_disp = {
 };
 
 int
-g94_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+g94_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&g94_disp, device, index, pdisp);
+       return nv50_disp_new_(&g94_disp, device, type, inst, pdisp);
 }
index aa2e5645fe365929b44849d8407d5443ad0103f7..68aa52588d92fe202a15328ce74a8c33dc9fdb8c 100644 (file)
@@ -40,7 +40,8 @@ ga102_disp = {
 };
 
 int
-ga102_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+ga102_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&ga102_disp, device, index, pdisp);
+       return nv50_disp_new_(&ga102_disp, device, type, inst, pdisp);
 }
index e675d9b9d5d70f92b342bbea98a233449ffb8b85..a6bafe7fea1f2bd34f30c8b2e5d4902b739b027c 100644 (file)
@@ -266,7 +266,8 @@ gf119_disp = {
 };
 
 int
-gf119_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+gf119_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&gf119_disp, device, index, pdisp);
+       return nv50_disp_new_(&gf119_disp, device, type, inst, pdisp);
 }
index 4c3439b1a62da6d7472ed7869b2cd3c2576f3ac5..3b79cf233ac5a7044cff1535ddfd59b9ef3e96d0 100644 (file)
@@ -41,7 +41,8 @@ gk104_disp = {
 };
 
 int
-gk104_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+gk104_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&gk104_disp, device, index, pdisp);
+       return nv50_disp_new_(&gk104_disp, device, type, inst, pdisp);
 }
index bc6f4750c942eb57e8c34f1f5c0b90787e94921e..988eb12237a6edf976c865fc9ad6ba31ded6cec5 100644 (file)
@@ -41,7 +41,8 @@ gk110_disp = {
 };
 
 int
-gk110_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+gk110_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&gk110_disp, device, index, pdisp);
+       return nv50_disp_new_(&gk110_disp, device, type, inst, pdisp);
 }
index 031cf6b03a76680f045b222440622df752f9731c..5d8108feeacdb9cdc0102582eff2be33b7116b33 100644 (file)
@@ -41,7 +41,8 @@ gm107_disp = {
 };
 
 int
-gm107_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+gm107_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&gm107_disp, device, index, pdisp);
+       return nv50_disp_new_(&gm107_disp, device, type, inst, pdisp);
 }
index ec9c33a5162d798e87c816fbb8e03b7e626b5588..f7bb660874768e32526121d7385eee7cda8fc3ad 100644 (file)
@@ -41,7 +41,8 @@ gm200_disp = {
 };
 
 int
-gm200_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+gm200_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&gm200_disp, device, index, pdisp);
+       return nv50_disp_new_(&gm200_disp, device, type, inst, pdisp);
 }
index 8471de3f3b616cf54a4742c500efafa164ab4c15..af0ca812a39497c147a2957c5eb44ca6b7d6a12e 100644 (file)
@@ -40,7 +40,8 @@ gp100_disp = {
 };
 
 int
-gp100_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+gp100_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&gp100_disp, device, index, pdisp);
+       return nv50_disp_new_(&gp100_disp, device, type, inst, pdisp);
 }
index a3779c5046ead129dd42aa87b801f66f774d7d36..065fea1bdfd12b996268d99aab34b3ca6d6241d4 100644 (file)
@@ -67,7 +67,8 @@ gp102_disp = {
 };
 
 int
-gp102_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+gp102_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&gp102_disp, device, index, pdisp);
+       return nv50_disp_new_(&gp102_disp, device, type, inst, pdisp);
 }
index f80183701f448dc36b7a921e2d811a2ae41e9feb..22bc269df64acba2aae6525bafced3e13ccd0094 100644 (file)
@@ -41,7 +41,8 @@ gt200_disp = {
 };
 
 int
-gt200_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+gt200_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&gt200_disp, device, index, pdisp);
+       return nv50_disp_new_(&gt200_disp, device, type, inst, pdisp);
 }
index 7581efc1357e90d355625374097e43dd5da67df8..63a912b174d7fff0636866e74599e6436912d45f 100644 (file)
@@ -41,7 +41,8 @@ gt215_disp = {
 };
 
 int
-gt215_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+gt215_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&gt215_disp, device, index, pdisp);
+       return nv50_disp_new_(&gt215_disp, device, type, inst, pdisp);
 }
index c1032527f79111aaa237cfd51e33b01f574eebf4..53879d5271cf730b0352b72990d6b95929798a3d 100644 (file)
@@ -441,7 +441,8 @@ gv100_disp = {
 };
 
 int
-gv100_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+gv100_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&gv100_disp, device, index, pdisp);
+       return nv50_disp_new_(&gv100_disp, device, type, inst, pdisp);
 }
index cfdce23ab83a6a4bacb3f60ae3ba4f54556c1fc9..762a59f24bbb4f68c07c9ce4a1c4e9ec706a5e61 100644 (file)
@@ -39,7 +39,8 @@ mcp77_disp = {
 };
 
 int
-mcp77_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+mcp77_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&mcp77_disp, device, index, pdisp);
+       return nv50_disp_new_(&mcp77_disp, device, type, inst, pdisp);
 }
index 85d9329cfa0e1507d258b8473f16a2178a1046b6..e5c58aae15de64960421fdae2572c2a345e3184f 100644 (file)
@@ -39,7 +39,8 @@ mcp89_disp = {
 };
 
 int
-mcp89_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+mcp89_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&mcp89_disp, device, index, pdisp);
+       return nv50_disp_new_(&mcp89_disp, device, type, inst, pdisp);
 }
index b780ba1a3bc7fa31f2338bf184955dfc18e80be2..a12097db2c2a76f96d1750134284a2177a8dc415 100644 (file)
@@ -64,11 +64,12 @@ nv04_disp = {
 };
 
 int
-nv04_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+nv04_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_disp **pdisp)
 {
        int ret, i;
 
-       ret = nvkm_disp_new_(&nv04_disp, device, index, pdisp);
+       ret = nvkm_disp_new_(&nv04_disp, device, type, inst, pdisp);
        if (ret)
                return ret;
 
index e21556bf2cb1a1442d4c8d85908a14f03f06c02a..3f20e49070ced83aa61a577d76e2db5338feb892 100644 (file)
@@ -154,7 +154,7 @@ nv50_disp_ = {
 
 int
 nv50_disp_new_(const struct nv50_disp_func *func, struct nvkm_device *device,
-              int index, struct nvkm_disp **pdisp)
+              enum nvkm_subdev_type type, int inst, struct nvkm_disp **pdisp)
 {
        struct nv50_disp *disp;
        int ret;
@@ -164,7 +164,7 @@ nv50_disp_new_(const struct nv50_disp_func *func, struct nvkm_device *device,
        disp->func = func;
        *pdisp = &disp->base;
 
-       ret = nvkm_disp_ctor(&nv50_disp_, device, index, &disp->base);
+       ret = nvkm_disp_ctor(&nv50_disp_, device, type, inst, &disp->base);
        if (ret)
                return ret;
 
@@ -769,7 +769,8 @@ nv50_disp = {
 };
 
 int
-nv50_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+nv50_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&nv50_disp, device, index, pdisp);
+       return nv50_disp_new_(&nv50_disp, device, type, inst, pdisp);
 }
index db31b37752a270b163b9b1ea8366546bef2470fa..025cacd7c3b012567f27a52db045f4bf27ff2115 100644 (file)
@@ -47,8 +47,8 @@ void nv50_disp_super_2_1(struct nv50_disp *, struct nvkm_head *);
 void nv50_disp_super_2_2(struct nv50_disp *, struct nvkm_head *);
 void nv50_disp_super_3_0(struct nv50_disp *, struct nvkm_head *);
 
-int nv50_disp_new_(const struct nv50_disp_func *, struct nvkm_device *,
-                  int index, struct nvkm_disp **);
+int nv50_disp_new_(const struct nv50_disp_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                  struct nvkm_disp **);
 
 struct nv50_disp_func {
        int (*init)(struct nv50_disp *);
index f815a534288097599d850415f0081df8a6cd39a6..ec57d8b6bce9311dde08d326f482c15f0e282278 100644 (file)
@@ -4,10 +4,10 @@
 #include <engine/disp.h>
 #include "outp.h"
 
-int nvkm_disp_ctor(const struct nvkm_disp_func *, struct nvkm_device *,
-                  int index, struct nvkm_disp *);
-int nvkm_disp_new_(const struct nvkm_disp_func *, struct nvkm_device *,
-                  int index, struct nvkm_disp **);
+int nvkm_disp_ctor(const struct nvkm_disp_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                  struct nvkm_disp *);
+int nvkm_disp_new_(const struct nvkm_disp_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                  struct nvkm_disp **);
 void nvkm_disp_vblank(struct nvkm_disp *, int head);
 
 struct nvkm_disp_func {
index 4c85d1d4fbd4265cabd179923519412766473114..f5f8dc8e8f35d315b8e7114ee1b28dc9573feb5b 100644 (file)
@@ -146,7 +146,8 @@ tu102_disp = {
 };
 
 int
-tu102_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
+tu102_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_disp **pdisp)
 {
-       return nv50_disp_new_(&tu102_disp, device, index, pdisp);
+       return nv50_disp_new_(&tu102_disp, device, type, inst, pdisp);
 }
index 11b7b8fd5ddaf356b5a9bee8dbde507c70cf92ac..425cde35f12842267bc5c8178b49eb6e85be4b70 100644 (file)
@@ -104,7 +104,7 @@ nvkm_dma = {
 
 int
 nvkm_dma_new_(const struct nvkm_dma_func *func, struct nvkm_device *device,
-             int index, struct nvkm_dma **pdma)
+             enum nvkm_subdev_type type, int inst, struct nvkm_dma **pdma)
 {
        struct nvkm_dma *dma;
 
@@ -112,5 +112,5 @@ nvkm_dma_new_(const struct nvkm_dma_func *func, struct nvkm_device *device,
                return -ENOMEM;
        dma->func = func;
 
-       return nvkm_engine_ctor(&nvkm_dma, device, index, true, &dma->engine);
+       return nvkm_engine_ctor(&nvkm_dma, device, type, inst, true, &dma->engine);
 }
index efec5d3221799133ab6e24af9987fe4b2513cd55..99a1e07fa204d7b9bfca201e4ab3b06fba08ac6c 100644 (file)
@@ -30,7 +30,8 @@ gf100_dma = {
 };
 
 int
-gf100_dma_new(struct nvkm_device *device, int index, struct nvkm_dma **pdma)
+gf100_dma_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_dma **pdma)
 {
-       return nvkm_dma_new_(&gf100_dma, device, index, pdma);
+       return nvkm_dma_new_(&gf100_dma, device, type, inst, pdma);
 }
index 34c766039aedbee2ee80d0556e5b7d5a64684ece..fd1d1fc22dc692245ea04ddd515e9a1355006468 100644 (file)
@@ -30,7 +30,8 @@ gf119_dma = {
 };
 
 int
-gf119_dma_new(struct nvkm_device *device, int index, struct nvkm_dma **pdma)
+gf119_dma_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_dma **pdma)
 {
-       return nvkm_dma_new_(&gf119_dma, device, index, pdma);
+       return nvkm_dma_new_(&gf119_dma, device, type, inst, pdma);
 }
index c65a4c2ea93d47d9611e931adcd66e592bed5c80..a5af0df306637b97ea58afb26019b1a63f65f12c 100644 (file)
@@ -28,7 +28,8 @@ gv100_dma = {
 };
 
 int
-gv100_dma_new(struct nvkm_device *device, int index, struct nvkm_dma **pdma)
+gv100_dma_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_dma **pdma)
 {
-       return nvkm_dma_new_(&gv100_dma, device, index, pdma);
+       return nvkm_dma_new_(&gv100_dma, device, type, inst, pdma);
 }
index 30747a0ce488c8f9a582b08d6f5a8fdc317c186b..ea5a889f60c2c13cb717e60e070db673e8ad0dce 100644 (file)
@@ -30,7 +30,8 @@ nv04_dma = {
 };
 
 int
-nv04_dma_new(struct nvkm_device *device, int index, struct nvkm_dma **pdma)
+nv04_dma_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_dma **pdma)
 {
-       return nvkm_dma_new_(&nv04_dma, device, index, pdma);
+       return nvkm_dma_new_(&nv04_dma, device, type, inst, pdma);
 }
index 77aca7b71c83cbadf995253495d6f6a2c3088381..6e8f79660014148a90f36ecf6307996952a40ead 100644 (file)
@@ -30,7 +30,8 @@ nv50_dma = {
 };
 
 int
-nv50_dma_new(struct nvkm_device *device, int index, struct nvkm_dma **pdma)
+nv50_dma_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_dma **pdma)
 {
-       return nvkm_dma_new_(&nv50_dma, device, index, pdma);
+       return nvkm_dma_new_(&nv50_dma, device, type, inst, pdma);
 }
index 0c9d9640a59d707abe1f4a70ae912ce1acbef4f7..d403bedb485aaca61cf36dffc502cdea5e0970b7 100644 (file)
@@ -9,8 +9,8 @@ struct nvkm_dmaobj_func {
                    struct nvkm_gpuobj **);
 };
 
-int nvkm_dma_new_(const struct nvkm_dma_func *, struct nvkm_device *,
-                 int index, struct nvkm_dma **);
+int nvkm_dma_new_(const struct nvkm_dma_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                 struct nvkm_dma **);
 
 struct nvkm_dma_func {
        int (*class_new)(struct nvkm_dma *, const struct nvkm_oclass *,
index 8675613e142b64a54ac6a2acf8dd0afb934dc7e5..43b7dec45179609eab3d99b887e15dd8f40d1b88 100644 (file)
@@ -108,7 +108,7 @@ nvkm_falcon_fini(struct nvkm_engine *engine, bool suspend)
                }
        }
 
-       if (nvkm_mc_enabled(device, engine->subdev.index)) {
+       if (nvkm_mc_enabled(device, engine->subdev.type, engine->subdev.inst)) {
                nvkm_mask(device, base + 0x048, 0x00000003, 0x00000000);
                nvkm_wr32(device, base + 0x014, 0xffffffff);
        }
@@ -335,9 +335,9 @@ nvkm_falcon = {
 };
 
 int
-nvkm_falcon_new_(const struct nvkm_falcon_func *func,
-                struct nvkm_device *device, int index, bool enable,
-                u32 addr, struct nvkm_engine **pengine)
+nvkm_falcon_new_(const struct nvkm_falcon_func *func, struct nvkm_device *device,
+                enum nvkm_subdev_type type, int inst, bool enable, u32 addr,
+                struct nvkm_engine **pengine)
 {
        struct nvkm_falcon *falcon;
 
@@ -351,6 +351,5 @@ nvkm_falcon_new_(const struct nvkm_falcon_func *func,
        falcon->data.size = func->data.size;
        *pengine = &falcon->engine;
 
-       return nvkm_engine_ctor(&nvkm_falcon, device, index,
-                               enable, &falcon->engine);
+       return nvkm_engine_ctor(&nvkm_falcon, device, type, inst, enable, &falcon->engine);
 }
index c773caf21f6be068a464d6bf64f0a3449cc49382..2ed4ff05d2075e51f5d8b797f6d4926881e976a6 100644 (file)
@@ -292,7 +292,7 @@ nvkm_fifo_info(struct nvkm_engine *engine, u64 mthd, u64 *data)
 {
        struct nvkm_fifo *fifo = nvkm_fifo(engine);
        switch (mthd) {
-       case NV_DEVICE_FIFO_CHANNELS: *data = fifo->nr; return 0;
+       case NV_DEVICE_HOST_CHANNELS: *data = fifo->nr; return 0;
        default:
                if (fifo->func->info)
                        return fifo->func->info(fifo, mthd, data);
@@ -313,7 +313,7 @@ nvkm_fifo_oneinit(struct nvkm_engine *engine)
 static void
 nvkm_fifo_preinit(struct nvkm_engine *engine)
 {
-       nvkm_mc_reset(engine->subdev.device, NVKM_ENGINE_FIFO);
+       nvkm_mc_reset(engine->subdev.device, NVKM_ENGINE_FIFO, 0);
 }
 
 static int
@@ -334,6 +334,7 @@ nvkm_fifo_dtor(struct nvkm_engine *engine)
        nvkm_event_fini(&fifo->kevent);
        nvkm_event_fini(&fifo->cevent);
        nvkm_event_fini(&fifo->uevent);
+       mutex_destroy(&fifo->mutex);
        return data;
 }
 
@@ -351,13 +352,14 @@ nvkm_fifo = {
 
 int
 nvkm_fifo_ctor(const struct nvkm_fifo_func *func, struct nvkm_device *device,
-              int index, int nr, struct nvkm_fifo *fifo)
+              enum nvkm_subdev_type type, int inst, int nr, struct nvkm_fifo *fifo)
 {
        int ret;
 
        fifo->func = func;
        INIT_LIST_HEAD(&fifo->chan);
        spin_lock_init(&fifo->lock);
+       mutex_init(&fifo->mutex);
 
        if (WARN_ON(fifo->nr > NVKM_FIFO_CHID_NR))
                fifo->nr = NVKM_FIFO_CHID_NR;
@@ -365,7 +367,7 @@ nvkm_fifo_ctor(const struct nvkm_fifo_func *func, struct nvkm_device *device,
                fifo->nr = nr;
        bitmap_clear(fifo->mask, 0, fifo->nr);
 
-       ret = nvkm_engine_ctor(&nvkm_fifo, device, index, true, &fifo->engine);
+       ret = nvkm_engine_ctor(&nvkm_fifo, device, type, inst, true, &fifo->engine);
        if (ret)
                return ret;
 
index d83485385934d86dc475662ccfef1c87de01fe3d..8d957643940ae93a5e710b7beb0e0e7488bd5e28 100644 (file)
@@ -35,6 +35,15 @@ struct nvkm_fifo_chan_object {
        int hash;
 };
 
+static struct nvkm_fifo_engn *
+nvkm_fifo_chan_engn(struct nvkm_fifo_chan *chan, struct nvkm_engine *engine)
+{
+       int engi = chan->fifo->func->engine_id(chan->fifo, engine);
+       if (engi >= 0)
+               return &chan->engn[engi];
+       return NULL;
+}
+
 static int
 nvkm_fifo_chan_child_fini(struct nvkm_oproxy *base, bool suspend)
 {
@@ -42,8 +51,8 @@ nvkm_fifo_chan_child_fini(struct nvkm_oproxy *base, bool suspend)
                container_of(base, typeof(*object), oproxy);
        struct nvkm_engine *engine  = object->oproxy.object->engine;
        struct nvkm_fifo_chan *chan = object->chan;
-       struct nvkm_fifo_engn *engn = &chan->engn[engine->subdev.index];
-       const char *name = nvkm_subdev_name[engine->subdev.index];
+       struct nvkm_fifo_engn *engn = nvkm_fifo_chan_engn(chan, engine);
+       const char *name = engine->subdev.name;
        int ret = 0;
 
        if (--engn->usecount)
@@ -75,8 +84,8 @@ nvkm_fifo_chan_child_init(struct nvkm_oproxy *base)
                container_of(base, typeof(*object), oproxy);
        struct nvkm_engine *engine  = object->oproxy.object->engine;
        struct nvkm_fifo_chan *chan = object->chan;
-       struct nvkm_fifo_engn *engn = &chan->engn[engine->subdev.index];
-       const char *name = nvkm_subdev_name[engine->subdev.index];
+       struct nvkm_fifo_engn *engn = nvkm_fifo_chan_engn(chan, engine);
+       const char *name = engine->subdev.name;
        int ret;
 
        if (engn->usecount++)
@@ -108,7 +117,7 @@ nvkm_fifo_chan_child_del(struct nvkm_oproxy *base)
                container_of(base, typeof(*object), oproxy);
        struct nvkm_engine *engine  = object->oproxy.base.engine;
        struct nvkm_fifo_chan *chan = object->chan;
-       struct nvkm_fifo_engn *engn = &chan->engn[engine->subdev.index];
+       struct nvkm_fifo_engn *engn = nvkm_fifo_chan_engn(chan, engine);
 
        if (chan->func->object_dtor)
                chan->func->object_dtor(chan, object->hash);
@@ -118,7 +127,7 @@ nvkm_fifo_chan_child_del(struct nvkm_oproxy *base)
                        chan->func->engine_dtor(chan, engine);
                nvkm_object_del(&engn->object);
                if (chan->vmm)
-                       atomic_dec(&chan->vmm->engref[engine->subdev.index]);
+                       atomic_dec(&chan->vmm->engref[engine->subdev.type]);
        }
 }
 
@@ -135,7 +144,7 @@ nvkm_fifo_chan_child_new(const struct nvkm_oclass *oclass, void *data, u32 size,
 {
        struct nvkm_engine *engine = oclass->engine;
        struct nvkm_fifo_chan *chan = nvkm_fifo_chan(oclass->parent);
-       struct nvkm_fifo_engn *engn = &chan->engn[engine->subdev.index];
+       struct nvkm_fifo_engn *engn = nvkm_fifo_chan_engn(chan, engine);
        struct nvkm_fifo_chan_object *object;
        int ret = 0;
 
@@ -152,7 +161,7 @@ nvkm_fifo_chan_child_new(const struct nvkm_oclass *oclass, void *data, u32 size,
                };
 
                if (chan->vmm)
-                       atomic_inc(&chan->vmm->engref[engine->subdev.index]);
+                       atomic_inc(&chan->vmm->engref[engine->subdev.type]);
 
                if (engine->func->fifo.cclass) {
                        ret = engine->func->fifo.cclass(chan, &cclass,
@@ -203,13 +212,12 @@ nvkm_fifo_chan_child_get(struct nvkm_object *object, int index,
 {
        struct nvkm_fifo_chan *chan = nvkm_fifo_chan(object);
        struct nvkm_fifo *fifo = chan->fifo;
-       struct nvkm_device *device = fifo->engine.subdev.device;
        struct nvkm_engine *engine;
-       u64 mask = chan->engines;
-       int ret, i, c;
+       u32 engm = chan->engm;
+       int engi, ret, c;
 
-       for (; c = 0, i = __ffs64(mask), mask; mask &= ~(1ULL << i)) {
-               if (!(engine = nvkm_device_engine(device, i)))
+       for (; c = 0, engi = __ffs(engm), engm; engm &= ~(1ULL << engi)) {
+               if (!(engine = fifo->func->id_engine(fifo, engi)))
                        continue;
                oclass->engine = engine;
                oclass->base.oclass = 0;
@@ -352,7 +360,7 @@ nvkm_fifo_chan_func = {
 int
 nvkm_fifo_chan_ctor(const struct nvkm_fifo_chan_func *func,
                    struct nvkm_fifo *fifo, u32 size, u32 align, bool zero,
-                   u64 hvmm, u64 push, u64 engines, int bar, u32 base,
+                   u64 hvmm, u64 push, u32 engm, int bar, u32 base,
                    u32 user, const struct nvkm_oclass *oclass,
                    struct nvkm_fifo_chan *chan)
 {
@@ -365,7 +373,7 @@ nvkm_fifo_chan_ctor(const struct nvkm_fifo_chan_func *func,
        nvkm_object_ctor(&nvkm_fifo_chan_func, oclass, &chan->object);
        chan->func = func;
        chan->fifo = fifo;
-       chan->engines = engines;
+       chan->engm = engm;
        INIT_LIST_HEAD(&chan->head);
 
        /* instance memory */
index 177e10562600a02f340dffe9e44ed640f78a4460..e53504354841b3282ecba8e1853b3b306c35d418 100644 (file)
@@ -22,7 +22,7 @@ struct nvkm_fifo_chan_func {
 
 int nvkm_fifo_chan_ctor(const struct nvkm_fifo_chan_func *, struct nvkm_fifo *,
                        u32 size, u32 align, bool zero, u64 vm, u64 push,
-                       u64 engines, int bar, u32 base, u32 user,
+                       u32 engm, int bar, u32 base, u32 user,
                        const struct nvkm_oclass *, struct nvkm_fifo_chan *);
 
 struct nvkm_fifo_chan_oclass {
index a5c998fe4485a938eb0f00351c14f98054c39db9..353b77d9b3dcffe35f12172e36e24b75cd454950 100644 (file)
@@ -44,30 +44,10 @@ g84_fifo_chan_ntfy(struct nvkm_fifo_chan *chan, u32 type,
        return -EINVAL;
 }
 
-static int
-g84_fifo_chan_engine(struct nvkm_engine *engine)
-{
-       switch (engine->subdev.index) {
-       case NVKM_ENGINE_GR    : return 0;
-       case NVKM_ENGINE_MPEG  :
-       case NVKM_ENGINE_MSPPP : return 1;
-       case NVKM_ENGINE_CE0   : return 2;
-       case NVKM_ENGINE_VP    :
-       case NVKM_ENGINE_MSPDEC: return 3;
-       case NVKM_ENGINE_CIPHER:
-       case NVKM_ENGINE_SEC   : return 4;
-       case NVKM_ENGINE_BSP   :
-       case NVKM_ENGINE_MSVLD : return 5;
-       default:
-               WARN_ON(1);
-               return 0;
-       }
-}
-
 static int
 g84_fifo_chan_engine_addr(struct nvkm_engine *engine)
 {
-       switch (engine->subdev.index) {
+       switch (engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : return -1;
        case NVKM_ENGINE_GR    : return 0x0020;
@@ -79,7 +59,7 @@ g84_fifo_chan_engine_addr(struct nvkm_engine *engine)
        case NVKM_ENGINE_MSVLD : return 0x0080;
        case NVKM_ENGINE_CIPHER:
        case NVKM_ENGINE_SEC   : return 0x00a0;
-       case NVKM_ENGINE_CE0   : return 0x00c0;
+       case NVKM_ENGINE_CE    : return 0x00c0;
        default:
                WARN_ON(1);
                return -1;
@@ -102,7 +82,7 @@ g84_fifo_chan_engine_fini(struct nvkm_fifo_chan *base,
        if (offset < 0)
                return 0;
 
-       engn = g84_fifo_chan_engine(engine);
+       engn = fifo->base.func->engine_id(&fifo->base, engine);
        save = nvkm_mask(device, 0x002520, 0x0000003f, 1 << engn);
        nvkm_wr32(device, 0x0032fc, chan->base.inst->addr >> 12);
        done = nvkm_msec(device, 2000,
@@ -134,7 +114,7 @@ g84_fifo_chan_engine_init(struct nvkm_fifo_chan *base,
                          struct nvkm_engine *engine)
 {
        struct nv50_fifo_chan *chan = nv50_fifo_chan(base);
-       struct nvkm_gpuobj *engn = chan->engn[engine->subdev.index];
+       struct nvkm_gpuobj *engn = *nv50_fifo_chan_engine(chan, engine);
        u64 limit, start;
        int offset;
 
@@ -162,12 +142,11 @@ g84_fifo_chan_engine_ctor(struct nvkm_fifo_chan *base,
                          struct nvkm_object *object)
 {
        struct nv50_fifo_chan *chan = nv50_fifo_chan(base);
-       int engn = engine->subdev.index;
 
        if (g84_fifo_chan_engine_addr(engine) < 0)
                return 0;
 
-       return nvkm_object_bind(object, NULL, 0, &chan->engn[engn]);
+       return nvkm_object_bind(object, NULL, 0, nv50_fifo_chan_engine(chan, engine));
 }
 
 static int
@@ -178,14 +157,14 @@ g84_fifo_chan_object_ctor(struct nvkm_fifo_chan *base,
        u32 handle = object->handle;
        u32 context;
 
-       switch (object->engine->subdev.index) {
+       switch (object->engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : context = 0x00000000; break;
        case NVKM_ENGINE_GR    : context = 0x00100000; break;
        case NVKM_ENGINE_MPEG  :
        case NVKM_ENGINE_MSPPP : context = 0x00200000; break;
        case NVKM_ENGINE_ME    :
-       case NVKM_ENGINE_CE0   : context = 0x00300000; break;
+       case NVKM_ENGINE_CE    : context = 0x00300000; break;
        case NVKM_ENGINE_VP    :
        case NVKM_ENGINE_MSPDEC: context = 0x00400000; break;
        case NVKM_ENGINE_CIPHER:
@@ -241,20 +220,20 @@ g84_fifo_chan_ctor(struct nv50_fifo *fifo, u64 vmm, u64 push,
 
        ret = nvkm_fifo_chan_ctor(&g84_fifo_chan_func, &fifo->base,
                                  0x10000, 0x1000, false, vmm, push,
-                                 (1ULL << NVKM_ENGINE_BSP) |
-                                 (1ULL << NVKM_ENGINE_CE0) |
-                                 (1ULL << NVKM_ENGINE_CIPHER) |
-                                 (1ULL << NVKM_ENGINE_DMAOBJ) |
-                                 (1ULL << NVKM_ENGINE_GR) |
-                                 (1ULL << NVKM_ENGINE_ME) |
-                                 (1ULL << NVKM_ENGINE_MPEG) |
-                                 (1ULL << NVKM_ENGINE_MSPDEC) |
-                                 (1ULL << NVKM_ENGINE_MSPPP) |
-                                 (1ULL << NVKM_ENGINE_MSVLD) |
-                                 (1ULL << NVKM_ENGINE_SEC) |
-                                 (1ULL << NVKM_ENGINE_SW) |
-                                 (1ULL << NVKM_ENGINE_VIC) |
-                                 (1ULL << NVKM_ENGINE_VP),
+                                 BIT(G84_FIFO_ENGN_SW) |
+                                 BIT(G84_FIFO_ENGN_GR) |
+                                 BIT(G84_FIFO_ENGN_MPEG) |
+                                 BIT(G84_FIFO_ENGN_MSPPP) |
+                                 BIT(G84_FIFO_ENGN_ME) |
+                                 BIT(G84_FIFO_ENGN_CE0) |
+                                 BIT(G84_FIFO_ENGN_VP) |
+                                 BIT(G84_FIFO_ENGN_MSPDEC) |
+                                 BIT(G84_FIFO_ENGN_CIPHER) |
+                                 BIT(G84_FIFO_ENGN_SEC) |
+                                 BIT(G84_FIFO_ENGN_VIC) |
+                                 BIT(G84_FIFO_ENGN_BSP) |
+                                 BIT(G84_FIFO_ENGN_MSVLD) |
+                                 BIT(G84_FIFO_ENGN_DMA),
                                  0, 0xc00000, 0x2000, oclass, &chan->base);
        chan->fifo = fifo;
        if (ret)
index 7c125a15f9630a5e1615db4635d03624aab6a503..f7ac1061fa84936520f72ad111f4b9f1092b3a56 100644 (file)
@@ -12,10 +12,17 @@ struct gf100_fifo_chan {
        struct list_head head;
        bool killed;
 
-       struct {
+#define GF100_FIFO_ENGN_GR     0
+#define GF100_FIFO_ENGN_MSPDEC 1
+#define GF100_FIFO_ENGN_MSPPP  2
+#define GF100_FIFO_ENGN_MSVLD  3
+#define GF100_FIFO_ENGN_CE0    4
+#define GF100_FIFO_ENGN_CE1    5
+#define GF100_FIFO_ENGN_SW     15
+       struct gf100_fifo_engn {
                struct nvkm_gpuobj *inst;
                struct nvkm_vma *vma;
-       } engn[NVKM_SUBDEV_NR];
+       } engn[NVKM_FIFO_ENGN_NR];
 };
 
 extern const struct nvkm_fifo_chan_oclass gf100_fifo_gpfifo_oclass;
index 22698661aa8584ff284c7e5597c4cc5173ae07bc..cfbe096e604f5777cf1310582cd417d74365e259 100644 (file)
@@ -16,10 +16,11 @@ struct gk104_fifo_chan {
 
        struct nvkm_memory *mthd;
 
-       struct {
+#define GK104_FIFO_ENGN_SW 15
+       struct gk104_fifo_engn {
                struct nvkm_gpuobj *inst;
                struct nvkm_vma *vma;
-       } engn[NVKM_SUBDEV_NR];
+       } engn[NVKM_FIFO_ENGN_NR];
 };
 
 extern const struct nvkm_fifo_chan_func gk104_fifo_gpfifo_func;
@@ -29,6 +30,7 @@ int gk104_fifo_gpfifo_new(struct gk104_fifo *, const struct nvkm_oclass *,
 void *gk104_fifo_gpfifo_dtor(struct nvkm_fifo_chan *);
 void gk104_fifo_gpfifo_init(struct nvkm_fifo_chan *);
 void gk104_fifo_gpfifo_fini(struct nvkm_fifo_chan *);
+struct gk104_fifo_engn *gk104_fifo_gpfifo_engine(struct gk104_fifo_chan *, struct nvkm_engine *);
 int gk104_fifo_gpfifo_engine_ctor(struct nvkm_fifo_chan *, struct nvkm_engine *,
                                  struct nvkm_object *);
 void gk104_fifo_gpfifo_engine_dtor(struct nvkm_fifo_chan *,
index 60ca79465aff037bca6c963a3fc1f688c13c1a81..727bc8976b401ff3da295ac4f862300cb7217c17 100644 (file)
@@ -9,7 +9,11 @@ struct nv04_fifo_chan {
        struct nvkm_fifo_chan base;
        struct nv04_fifo *fifo;
        u32 ramfc;
-       struct nvkm_gpuobj *engn[NVKM_SUBDEV_NR];
+#define NV04_FIFO_ENGN_SW   0
+#define NV04_FIFO_ENGN_GR   1
+#define NV04_FIFO_ENGN_MPEG 2
+#define NV04_FIFO_ENGN_DMA  3
+       struct nvkm_gpuobj *engn[NVKM_FIFO_ENGN_NR];
 };
 
 extern const struct nvkm_fifo_chan_func nv04_fifo_dma_func;
index 85f7dbf53c997bc1bd62ea7008e8b91b350e7323..c44d7c81dd52a531d5f4fd323ab1056d39f1c43f 100644 (file)
@@ -31,7 +31,7 @@
 static int
 nv50_fifo_chan_engine_addr(struct nvkm_engine *engine)
 {
-       switch (engine->subdev.index) {
+       switch (engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : return -1;
        case NVKM_ENGINE_GR    : return 0x0000;
@@ -42,6 +42,15 @@ nv50_fifo_chan_engine_addr(struct nvkm_engine *engine)
        }
 }
 
+struct nvkm_gpuobj **
+nv50_fifo_chan_engine(struct nv50_fifo_chan *chan, struct nvkm_engine *engine)
+{
+       int engi = chan->base.fifo->func->engine_id(chan->base.fifo, engine);
+       if (engi >= 0)
+               return &chan->engn[engi];
+       return NULL;
+}
+
 static int
 nv50_fifo_chan_engine_fini(struct nvkm_fifo_chan *base,
                           struct nvkm_engine *engine, bool suspend)
@@ -103,7 +112,7 @@ nv50_fifo_chan_engine_init(struct nvkm_fifo_chan *base,
                           struct nvkm_engine *engine)
 {
        struct nv50_fifo_chan *chan = nv50_fifo_chan(base);
-       struct nvkm_gpuobj *engn = chan->engn[engine->subdev.index];
+       struct nvkm_gpuobj *engn = *nv50_fifo_chan_engine(chan, engine);
        u64 limit, start;
        int offset;
 
@@ -130,7 +139,7 @@ nv50_fifo_chan_engine_dtor(struct nvkm_fifo_chan *base,
                           struct nvkm_engine *engine)
 {
        struct nv50_fifo_chan *chan = nv50_fifo_chan(base);
-       nvkm_gpuobj_del(&chan->engn[engine->subdev.index]);
+       nvkm_gpuobj_del(nv50_fifo_chan_engine(chan, engine));
 }
 
 static int
@@ -139,12 +148,11 @@ nv50_fifo_chan_engine_ctor(struct nvkm_fifo_chan *base,
                           struct nvkm_object *object)
 {
        struct nv50_fifo_chan *chan = nv50_fifo_chan(base);
-       int engn = engine->subdev.index;
 
        if (nv50_fifo_chan_engine_addr(engine) < 0)
                return 0;
 
-       return nvkm_object_bind(object, NULL, 0, &chan->engn[engn]);
+       return nvkm_object_bind(object, NULL, 0, nv50_fifo_chan_engine(chan, engine));
 }
 
 void
@@ -162,7 +170,7 @@ nv50_fifo_chan_object_ctor(struct nvkm_fifo_chan *base,
        u32 handle = object->handle;
        u32 context;
 
-       switch (object->engine->subdev.index) {
+       switch (object->engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : context = 0x00000000; break;
        case NVKM_ENGINE_GR    : context = 0x00100000; break;
@@ -240,10 +248,10 @@ nv50_fifo_chan_ctor(struct nv50_fifo *fifo, u64 vmm, u64 push,
 
        ret = nvkm_fifo_chan_ctor(&nv50_fifo_chan_func, &fifo->base,
                                  0x10000, 0x1000, false, vmm, push,
-                                 (1ULL << NVKM_ENGINE_DMAOBJ) |
-                                 (1ULL << NVKM_ENGINE_SW) |
-                                 (1ULL << NVKM_ENGINE_GR) |
-                                 (1ULL << NVKM_ENGINE_MPEG),
+                                 BIT(NV50_FIFO_ENGN_SW) |
+                                 BIT(NV50_FIFO_ENGN_GR) |
+                                 BIT(NV50_FIFO_ENGN_MPEG) |
+                                 BIT(NV50_FIFO_ENGN_DMA),
                                  0, 0xc00000, 0x2000, oclass, &chan->base);
        chan->fifo = fifo;
        if (ret)
index 5735ff72a9d1258247737614f2c1d29360fa10f7..af8bdf27555234e91a02a0914d71b2a7c2e5f0fd 100644 (file)
@@ -15,13 +15,33 @@ struct nv50_fifo_chan {
        struct nvkm_gpuobj *pgd;
        struct nvkm_ramht *ramht;
 
-       struct nvkm_gpuobj *engn[NVKM_SUBDEV_NR];
+#define NV50_FIFO_ENGN_SW   0
+#define NV50_FIFO_ENGN_GR   1
+#define NV50_FIFO_ENGN_MPEG 2
+#define NV50_FIFO_ENGN_DMA  3
+
+#define G84_FIFO_ENGN_SW     0
+#define G84_FIFO_ENGN_GR     1
+#define G84_FIFO_ENGN_MPEG   2
+#define G84_FIFO_ENGN_MSPPP  2
+#define G84_FIFO_ENGN_ME     3
+#define G84_FIFO_ENGN_CE0    3
+#define G84_FIFO_ENGN_VP     4
+#define G84_FIFO_ENGN_MSPDEC 4
+#define G84_FIFO_ENGN_CIPHER 5
+#define G84_FIFO_ENGN_SEC    5
+#define G84_FIFO_ENGN_VIC    5
+#define G84_FIFO_ENGN_BSP    6
+#define G84_FIFO_ENGN_MSVLD  6
+#define G84_FIFO_ENGN_DMA    7
+       struct nvkm_gpuobj *engn[NVKM_FIFO_ENGN_NR];
 };
 
 int nv50_fifo_chan_ctor(struct nv50_fifo *, u64 vmm, u64 push,
                        const struct nvkm_oclass *, struct nv50_fifo_chan *);
 void *nv50_fifo_chan_dtor(struct nvkm_fifo_chan *);
 void nv50_fifo_chan_fini(struct nvkm_fifo_chan *);
+struct nvkm_gpuobj **nv50_fifo_chan_engine(struct nv50_fifo_chan *, struct nvkm_engine *);
 void nv50_fifo_chan_engine_dtor(struct nvkm_fifo_chan *, struct nvkm_engine *);
 void nv50_fifo_chan_object_dtor(struct nvkm_fifo_chan *, int);
 
index c213122cf08858cf3920cc7c05a2ec5e4dfd7692..dbcdc5fab990bf060ea62ef41d7dbe590340f8d1 100644 (file)
@@ -38,9 +38,9 @@ nv04_fifo_dma_object_dtor(struct nvkm_fifo_chan *base, int cookie)
        struct nv04_fifo_chan *chan = nv04_fifo_chan(base);
        struct nvkm_instmem *imem = chan->fifo->base.engine.subdev.device->imem;
 
-       mutex_lock(&chan->fifo->base.engine.subdev.mutex);
+       mutex_lock(&chan->fifo->base.mutex);
        nvkm_ramht_remove(imem->ramht, cookie);
-       mutex_unlock(&chan->fifo->base.engine.subdev.mutex);
+       mutex_unlock(&chan->fifo->base.mutex);
 }
 
 static int
@@ -53,7 +53,7 @@ nv04_fifo_dma_object_ctor(struct nvkm_fifo_chan *base,
        u32 handle  = object->handle;
        int hash;
 
-       switch (object->engine->subdev.index) {
+       switch (object->engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : context |= 0x00000000; break;
        case NVKM_ENGINE_GR    : context |= 0x00010000; break;
@@ -63,10 +63,10 @@ nv04_fifo_dma_object_ctor(struct nvkm_fifo_chan *base,
                return -EINVAL;
        }
 
-       mutex_lock(&chan->fifo->base.engine.subdev.mutex);
+       mutex_lock(&chan->fifo->base.mutex);
        hash = nvkm_ramht_insert(imem->ramht, object, chan->base.chid, 4,
                                 handle, context);
-       mutex_unlock(&chan->fifo->base.engine.subdev.mutex);
+       mutex_unlock(&chan->fifo->base.mutex);
        return hash;
 }
 
@@ -191,9 +191,9 @@ nv04_fifo_dma_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass,
 
        ret = nvkm_fifo_chan_ctor(&nv04_fifo_dma_func, &fifo->base,
                                  0x1000, 0x1000, false, 0, args->v0.pushbuf,
-                                 (1ULL << NVKM_ENGINE_DMAOBJ) |
-                                 (1ULL << NVKM_ENGINE_GR) |
-                                 (1ULL << NVKM_ENGINE_SW),
+                                 BIT(NV04_FIFO_ENGN_SW) |
+                                 BIT(NV04_FIFO_ENGN_GR) |
+                                 BIT(NV04_FIFO_ENGN_DMA),
                                  0, 0x800000, 0x10000, oclass, &chan->base);
        chan->fifo = fifo;
        if (ret)
index f5f355ff005da617a9ed7f83dfae06f3bb4c15cf..07d80d54a07cf8d61edd87f2a0ea83563f5782bb 100644 (file)
@@ -62,9 +62,9 @@ nv10_fifo_dma_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass,
 
        ret = nvkm_fifo_chan_ctor(&nv04_fifo_dma_func, &fifo->base,
                                  0x1000, 0x1000, false, 0, args->v0.pushbuf,
-                                 (1ULL << NVKM_ENGINE_DMAOBJ) |
-                                 (1ULL << NVKM_ENGINE_GR) |
-                                 (1ULL << NVKM_ENGINE_SW),
+                                 BIT(NV04_FIFO_ENGN_SW) |
+                                 BIT(NV04_FIFO_ENGN_GR) |
+                                 BIT(NV04_FIFO_ENGN_DMA),
                                  0, 0x800000, 0x10000, oclass, &chan->base);
        chan->fifo = fifo;
        if (ret)
index 7edc6a564b5da60504e933e77f0ddf8781c9c640..edd70a11421858da961e90b0b34683864eb7b468 100644 (file)
@@ -62,10 +62,10 @@ nv17_fifo_dma_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass,
 
        ret = nvkm_fifo_chan_ctor(&nv04_fifo_dma_func, &fifo->base,
                                  0x1000, 0x1000, false, 0, args->v0.pushbuf,
-                                 (1ULL << NVKM_ENGINE_DMAOBJ) |
-                                 (1ULL << NVKM_ENGINE_GR) |
-                                 (1ULL << NVKM_ENGINE_MPEG) | /* NV31- */
-                                 (1ULL << NVKM_ENGINE_SW),
+                                 BIT(NV04_FIFO_ENGN_SW) |
+                                 BIT(NV04_FIFO_ENGN_GR) |
+                                 BIT(NV04_FIFO_ENGN_MPEG) | /* NV31- */
+                                 BIT(NV04_FIFO_ENGN_DMA),
                                  0, 0x800000, 0x10000, oclass, &chan->base);
        chan->fifo = fifo;
        if (ret)
index 5f722c6e8a2f4652eec5dde550d0a4792cd86c8b..0411fb9084577f4aa0556296640196c1c9facd32 100644 (file)
@@ -35,7 +35,7 @@
 static bool
 nv40_fifo_dma_engine(struct nvkm_engine *engine, u32 *reg, u32 *ctx)
 {
-       switch (engine->subdev.index) {
+       switch (engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW:
                return false;
@@ -55,6 +55,15 @@ nv40_fifo_dma_engine(struct nvkm_engine *engine, u32 *reg, u32 *ctx)
        }
 }
 
+static struct nvkm_gpuobj **
+nv40_fifo_dma_engn(struct nv04_fifo_chan *chan, struct nvkm_engine *engine)
+{
+       int engi = chan->base.fifo->func->engine_id(chan->base.fifo, engine);
+       if (engi >= 0)
+               return &chan->engn[engi];
+       return NULL;
+}
+
 static int
 nv40_fifo_dma_engine_fini(struct nvkm_fifo_chan *base,
                          struct nvkm_engine *engine, bool suspend)
@@ -99,7 +108,7 @@ nv40_fifo_dma_engine_init(struct nvkm_fifo_chan *base,
 
        if (!nv40_fifo_dma_engine(engine, &reg, &ctx))
                return 0;
-       inst = chan->engn[engine->subdev.index]->addr >> 4;
+       inst = (*nv40_fifo_dma_engn(chan, engine))->addr >> 4;
 
        spin_lock_irqsave(&fifo->base.lock, flags);
        nvkm_mask(device, 0x002500, 0x00000001, 0x00000000);
@@ -121,7 +130,7 @@ nv40_fifo_dma_engine_dtor(struct nvkm_fifo_chan *base,
                          struct nvkm_engine *engine)
 {
        struct nv04_fifo_chan *chan = nv04_fifo_chan(base);
-       nvkm_gpuobj_del(&chan->engn[engine->subdev.index]);
+       nvkm_gpuobj_del(nv40_fifo_dma_engn(chan, engine));
 }
 
 static int
@@ -130,13 +139,12 @@ nv40_fifo_dma_engine_ctor(struct nvkm_fifo_chan *base,
                          struct nvkm_object *object)
 {
        struct nv04_fifo_chan *chan = nv04_fifo_chan(base);
-       const int engn = engine->subdev.index;
        u32 reg, ctx;
 
        if (!nv40_fifo_dma_engine(engine, &reg, &ctx))
                return 0;
 
-       return nvkm_object_bind(object, NULL, 0, &chan->engn[engn]);
+       return nvkm_object_bind(object, NULL, 0, nv40_fifo_dma_engn(chan, engine));
 }
 
 static int
@@ -149,7 +157,7 @@ nv40_fifo_dma_object_ctor(struct nvkm_fifo_chan *base,
        u32 handle  = object->handle;
        int hash;
 
-       switch (object->engine->subdev.index) {
+       switch (object->engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : context |= 0x00000000; break;
        case NVKM_ENGINE_GR    : context |= 0x00100000; break;
@@ -159,10 +167,10 @@ nv40_fifo_dma_object_ctor(struct nvkm_fifo_chan *base,
                return -EINVAL;
        }
 
-       mutex_lock(&chan->fifo->base.engine.subdev.mutex);
+       mutex_lock(&chan->fifo->base.mutex);
        hash = nvkm_ramht_insert(imem->ramht, object, chan->base.chid, 4,
                                 handle, context);
-       mutex_unlock(&chan->fifo->base.engine.subdev.mutex);
+       mutex_unlock(&chan->fifo->base.mutex);
        return hash;
 }
 
@@ -209,10 +217,10 @@ nv40_fifo_dma_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass,
 
        ret = nvkm_fifo_chan_ctor(&nv40_fifo_dma_func, &fifo->base,
                                  0x1000, 0x1000, false, 0, args->v0.pushbuf,
-                                 (1ULL << NVKM_ENGINE_DMAOBJ) |
-                                 (1ULL << NVKM_ENGINE_GR) |
-                                 (1ULL << NVKM_ENGINE_MPEG) |
-                                 (1ULL << NVKM_ENGINE_SW),
+                                 BIT(NV04_FIFO_ENGN_SW) |
+                                 BIT(NV04_FIFO_ENGN_GR) |
+                                 BIT(NV04_FIFO_ENGN_MPEG) |
+                                 BIT(NV04_FIFO_ENGN_DMA),
                                  0, 0xc00000, 0x1000, oclass, &chan->base);
        chan->fifo = fifo;
        if (ret)
index ff7b529764fe03935a50f7d66b30e25d4497999b..c0a7d0f21dacdecbbc57275e2115d0634df84ba6 100644 (file)
@@ -38,12 +38,82 @@ g84_fifo_uevent_init(struct nvkm_fifo *fifo)
        nvkm_mask(device, 0x002140, 0x40000000, 0x40000000);
 }
 
+static struct nvkm_engine *
+g84_fifo_id_engine(struct nvkm_fifo *fifo, int engi)
+{
+       struct nvkm_device *device = fifo->engine.subdev.device;
+       struct nvkm_engine *engine;
+       enum nvkm_subdev_type type;
+
+       switch (engi) {
+       case G84_FIFO_ENGN_SW    : type = NVKM_ENGINE_SW; break;
+       case G84_FIFO_ENGN_GR    : type = NVKM_ENGINE_GR; break;
+       case G84_FIFO_ENGN_MPEG  :
+               if ((engine = nvkm_device_engine(device, NVKM_ENGINE_MSPPP, 0)))
+                       return engine;
+               type = NVKM_ENGINE_MPEG;
+               break;
+       case G84_FIFO_ENGN_ME    :
+               if ((engine = nvkm_device_engine(device, NVKM_ENGINE_CE, 0)))
+                       return engine;
+               type = NVKM_ENGINE_ME;
+               break;
+       case G84_FIFO_ENGN_VP    :
+               if ((engine = nvkm_device_engine(device, NVKM_ENGINE_MSPDEC, 0)))
+                       return engine;
+               type = NVKM_ENGINE_VP;
+               break;
+       case G84_FIFO_ENGN_CIPHER:
+               if ((engine = nvkm_device_engine(device, NVKM_ENGINE_VIC, 0)))
+                       return engine;
+               if ((engine = nvkm_device_engine(device, NVKM_ENGINE_SEC, 0)))
+                       return engine;
+               type = NVKM_ENGINE_CIPHER;
+               break;
+       case G84_FIFO_ENGN_BSP   :
+               if ((engine = nvkm_device_engine(device, NVKM_ENGINE_MSVLD, 0)))
+                       return engine;
+               type = NVKM_ENGINE_BSP;
+               break;
+       case G84_FIFO_ENGN_DMA   : type = NVKM_ENGINE_DMAOBJ; break;
+       default:
+               WARN_ON(1);
+               return NULL;
+       }
+
+       return nvkm_device_engine(fifo->engine.subdev.device, type, 0);
+}
+
+static int
+g84_fifo_engine_id(struct nvkm_fifo *base, struct nvkm_engine *engine)
+{
+       switch (engine->subdev.type) {
+       case NVKM_ENGINE_SW    : return G84_FIFO_ENGN_SW;
+       case NVKM_ENGINE_GR    : return G84_FIFO_ENGN_GR;
+       case NVKM_ENGINE_MPEG  :
+       case NVKM_ENGINE_MSPPP : return G84_FIFO_ENGN_MPEG;
+       case NVKM_ENGINE_CE    : return G84_FIFO_ENGN_CE0;
+       case NVKM_ENGINE_VP    :
+       case NVKM_ENGINE_MSPDEC: return G84_FIFO_ENGN_VP;
+       case NVKM_ENGINE_CIPHER:
+       case NVKM_ENGINE_SEC   : return G84_FIFO_ENGN_CIPHER;
+       case NVKM_ENGINE_BSP   :
+       case NVKM_ENGINE_MSVLD : return G84_FIFO_ENGN_BSP;
+       case NVKM_ENGINE_DMAOBJ: return G84_FIFO_ENGN_DMA;
+       default:
+               WARN_ON(1);
+               return -1;
+       }
+}
+
 static const struct nvkm_fifo_func
 g84_fifo = {
        .dtor = nv50_fifo_dtor,
        .oneinit = nv50_fifo_oneinit,
        .init = nv50_fifo_init,
        .intr = nv04_fifo_intr,
+       .engine_id = g84_fifo_engine_id,
+       .id_engine = g84_fifo_id_engine,
        .pause = nv04_fifo_pause,
        .start = nv04_fifo_start,
        .uevent_init = g84_fifo_uevent_init,
@@ -56,7 +126,8 @@ g84_fifo = {
 };
 
 int
-g84_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+g84_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_fifo **pfifo)
 {
-       return nv50_fifo_new_(&g84_fifo, device, index, pfifo);
+       return nv50_fifo_new_(&g84_fifo, device, type, inst, pfifo);
 }
index 5a39e51d42d738fe5800fc2a97feb8255c901b8a..8b4f36b3e34b5d8960835376ed848fba4b035c45 100644 (file)
@@ -57,7 +57,7 @@ gf100_fifo_runlist_commit(struct gf100_fifo *fifo)
        int nr = 0;
        int target;
 
-       mutex_lock(&subdev->mutex);
+       mutex_lock(&fifo->base.mutex);
        cur = fifo->runlist.mem[fifo->runlist.active];
        fifo->runlist.active = !fifo->runlist.active;
 
@@ -73,7 +73,7 @@ gf100_fifo_runlist_commit(struct gf100_fifo *fifo)
        case NVKM_MEM_TARGET_VRAM: target = 0; break;
        case NVKM_MEM_TARGET_NCOH: target = 3; break;
        default:
-               mutex_unlock(&subdev->mutex);
+               mutex_unlock(&fifo->base.mutex);
                WARN_ON(1);
                return;
        }
@@ -86,59 +86,61 @@ gf100_fifo_runlist_commit(struct gf100_fifo *fifo)
                               !(nvkm_rd32(device, 0x00227c) & 0x00100000),
                               msecs_to_jiffies(2000)) == 0)
                nvkm_error(subdev, "runlist update timeout\n");
-       mutex_unlock(&subdev->mutex);
+       mutex_unlock(&fifo->base.mutex);
 }
 
 void
 gf100_fifo_runlist_remove(struct gf100_fifo *fifo, struct gf100_fifo_chan *chan)
 {
-       mutex_lock(&fifo->base.engine.subdev.mutex);
+       mutex_lock(&fifo->base.mutex);
        list_del_init(&chan->head);
-       mutex_unlock(&fifo->base.engine.subdev.mutex);
+       mutex_unlock(&fifo->base.mutex);
 }
 
 void
 gf100_fifo_runlist_insert(struct gf100_fifo *fifo, struct gf100_fifo_chan *chan)
 {
-       mutex_lock(&fifo->base.engine.subdev.mutex);
+       mutex_lock(&fifo->base.mutex);
        list_add_tail(&chan->head, &fifo->chan);
-       mutex_unlock(&fifo->base.engine.subdev.mutex);
+       mutex_unlock(&fifo->base.mutex);
 }
 
-static inline int
-gf100_fifo_engidx(struct gf100_fifo *fifo, u32 engn)
+static struct nvkm_engine *
+gf100_fifo_id_engine(struct nvkm_fifo *fifo, int engi)
 {
-       switch (engn) {
-       case NVKM_ENGINE_GR    : engn = 0; break;
-       case NVKM_ENGINE_MSVLD : engn = 1; break;
-       case NVKM_ENGINE_MSPPP : engn = 2; break;
-       case NVKM_ENGINE_MSPDEC: engn = 3; break;
-       case NVKM_ENGINE_CE0   : engn = 4; break;
-       case NVKM_ENGINE_CE1   : engn = 5; break;
+       enum nvkm_subdev_type type;
+       int inst;
+
+       switch (engi) {
+       case GF100_FIFO_ENGN_GR    : type = NVKM_ENGINE_GR    ; inst = 0; break;
+       case GF100_FIFO_ENGN_MSPDEC: type = NVKM_ENGINE_MSPDEC; inst = 0; break;
+       case GF100_FIFO_ENGN_MSPPP : type = NVKM_ENGINE_MSPPP ; inst = 0; break;
+       case GF100_FIFO_ENGN_MSVLD : type = NVKM_ENGINE_MSVLD ; inst = 0; break;
+       case GF100_FIFO_ENGN_CE0   : type = NVKM_ENGINE_CE    ; inst = 0; break;
+       case GF100_FIFO_ENGN_CE1   : type = NVKM_ENGINE_CE    ; inst = 1; break;
+       case GF100_FIFO_ENGN_SW    : type = NVKM_ENGINE_SW    ; inst = 0; break;
        default:
-               return -1;
+               WARN_ON(1);
+               return NULL;
        }
 
-       return engn;
+       return nvkm_device_engine(fifo->engine.subdev.device, type, inst);
 }
 
-static inline struct nvkm_engine *
-gf100_fifo_engine(struct gf100_fifo *fifo, u32 engn)
+static int
+gf100_fifo_engine_id(struct nvkm_fifo *base, struct nvkm_engine *engine)
 {
-       struct nvkm_device *device = fifo->base.engine.subdev.device;
-
-       switch (engn) {
-       case 0: engn = NVKM_ENGINE_GR; break;
-       case 1: engn = NVKM_ENGINE_MSVLD; break;
-       case 2: engn = NVKM_ENGINE_MSPPP; break;
-       case 3: engn = NVKM_ENGINE_MSPDEC; break;
-       case 4: engn = NVKM_ENGINE_CE0; break;
-       case 5: engn = NVKM_ENGINE_CE1; break;
+       switch (engine->subdev.type) {
+       case NVKM_ENGINE_GR    : return GF100_FIFO_ENGN_GR;
+       case NVKM_ENGINE_MSPDEC: return GF100_FIFO_ENGN_MSPDEC;
+       case NVKM_ENGINE_MSPPP : return GF100_FIFO_ENGN_MSPPP;
+       case NVKM_ENGINE_MSVLD : return GF100_FIFO_ENGN_MSVLD;
+       case NVKM_ENGINE_CE    : return GF100_FIFO_ENGN_CE0 + engine->subdev.inst;
+       case NVKM_ENGINE_SW    : return GF100_FIFO_ENGN_SW;
        default:
-               return NULL;
+               WARN_ON(1);
+               return -1;
        }
-
-       return nvkm_device_engine(device, engn);
 }
 
 static void
@@ -148,20 +150,17 @@ gf100_fifo_recover_work(struct work_struct *w)
        struct nvkm_device *device = fifo->base.engine.subdev.device;
        struct nvkm_engine *engine;
        unsigned long flags;
-       u32 engn, engm = 0;
-       u64 mask, todo;
+       u32 engm, engn, todo;
 
        spin_lock_irqsave(&fifo->base.lock, flags);
-       mask = fifo->recover.mask;
+       engm = fifo->recover.mask;
        fifo->recover.mask = 0ULL;
        spin_unlock_irqrestore(&fifo->base.lock, flags);
 
-       for (todo = mask; engn = __ffs64(todo), todo; todo &= ~BIT_ULL(engn))
-               engm |= 1 << gf100_fifo_engidx(fifo, engn);
        nvkm_mask(device, 0x002630, engm, engm);
 
-       for (todo = mask; engn = __ffs64(todo), todo; todo &= ~BIT_ULL(engn)) {
-               if ((engine = nvkm_device_engine(device, engn))) {
+       for (todo = engm; engn = __ffs(todo), todo; todo &= ~BIT_ULL(engn)) {
+               if ((engine = gf100_fifo_id_engine(&fifo->base, engn))) {
                        nvkm_subdev_fini(&engine->subdev, false);
                        WARN_ON(nvkm_subdev_init(&engine->subdev));
                }
@@ -179,17 +178,18 @@ gf100_fifo_recover(struct gf100_fifo *fifo, struct nvkm_engine *engine,
        struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
        struct nvkm_device *device = subdev->device;
        u32 chid = chan->base.chid;
+       int engi = gf100_fifo_engine_id(&fifo->base, engine);
 
        nvkm_error(subdev, "%s engine fault on channel %d, recovering...\n",
-                  nvkm_subdev_name[engine->subdev.index], chid);
+                  engine->subdev.name, chid);
        assert_spin_locked(&fifo->base.lock);
 
        nvkm_mask(device, 0x003004 + (chid * 0x08), 0x00000001, 0x00000000);
        list_del_init(&chan->head);
        chan->killed = true;
 
-       if (engine != &fifo->base.engine)
-               fifo->recover.mask |= 1ULL << engine->subdev.index;
+       if (engi >= 0 && engi != GF100_FIFO_ENGN_SW)
+               fifo->recover.mask |= BIT(engi);
        schedule_work(&fifo->recover.work);
        nvkm_fifo_kevent(&fifo->base, chid);
 }
@@ -205,8 +205,8 @@ gf100_fifo_fault_engine[] = {
        { 0x11, "PMSPPP", NULL, NVKM_ENGINE_MSPPP },
        { 0x13, "PCOUNTER" },
        { 0x14, "PMSPDEC", NULL, NVKM_ENGINE_MSPDEC },
-       { 0x15, "PCE0", NULL, NVKM_ENGINE_CE0 },
-       { 0x16, "PCE1", NULL, NVKM_ENGINE_CE1 },
+       { 0x15, "PCE0", NULL, NVKM_ENGINE_CE0 },
+       { 0x16, "PCE1", NULL, NVKM_ENGINE_CE1 },
        { 0x17, "PMU" },
        {}
 };
@@ -286,7 +286,7 @@ gf100_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info)
                        nvkm_mask(device, 0x001718, 0x00000000, 0x00000000);
                        break;
                default:
-                       engine = nvkm_device_engine(device, eu->data2);
+                       engine = nvkm_device_engine(device, eu->data2, eu->inst);
                        break;
                }
        }
@@ -335,7 +335,7 @@ gf100_fifo_intr_sched_ctxsw(struct gf100_fifo *fifo)
                if (busy && unk0 && unk1) {
                        list_for_each_entry(chan, &fifo->chan, head) {
                                if (chan->base.chid == chid) {
-                                       engine = gf100_fifo_engine(fifo, engn);
+                                       engine = gf100_fifo_id_engine(&fifo->base, engn);
                                        if (!engine)
                                                break;
                                        gf100_fifo_recover(fifo, engine, chan);
@@ -673,6 +673,8 @@ gf100_fifo = {
        .fini = gf100_fifo_fini,
        .intr = gf100_fifo_intr,
        .fault = gf100_fifo_fault,
+       .engine_id = gf100_fifo_engine_id,
+       .id_engine = gf100_fifo_id_engine,
        .uevent_init = gf100_fifo_uevent_init,
        .uevent_fini = gf100_fifo_uevent_fini,
        .chan = {
@@ -682,7 +684,8 @@ gf100_fifo = {
 };
 
 int
-gf100_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+gf100_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
        struct gf100_fifo *fifo;
 
@@ -692,5 +695,5 @@ gf100_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
        INIT_WORK(&fifo->recover.work, gf100_fifo_recover_work);
        *pfifo = &fifo->base;
 
-       return nvkm_fifo_ctor(&gf100_fifo, device, index, 128, &fifo->base);
+       return nvkm_fifo_ctor(&gf100_fifo, device, type, inst, 128, &fifo->base);
 }
index c73b7eab776e4e6469d8a9dafe2507fbc2ebb3c4..69da601f1754a5cfe4b852a120bc3f7be2c617e9 100644 (file)
@@ -168,12 +168,11 @@ gk104_fifo_runlist_update(struct gk104_fifo *fifo, int runl)
 {
        const struct gk104_fifo_runlist_func *func = fifo->func->runlist;
        struct gk104_fifo_chan *chan;
-       struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
        struct nvkm_memory *mem;
        struct nvkm_fifo_cgrp *cgrp;
        int nr = 0;
 
-       mutex_lock(&subdev->mutex);
+       mutex_lock(&fifo->base.mutex);
        mem = fifo->runlist[runl].mem[fifo->runlist[runl].next];
        fifo->runlist[runl].next = !fifo->runlist[runl].next;
 
@@ -191,27 +190,27 @@ gk104_fifo_runlist_update(struct gk104_fifo *fifo, int runl)
        nvkm_done(mem);
 
        func->commit(fifo, runl, mem, nr);
-       mutex_unlock(&subdev->mutex);
+       mutex_unlock(&fifo->base.mutex);
 }
 
 void
 gk104_fifo_runlist_remove(struct gk104_fifo *fifo, struct gk104_fifo_chan *chan)
 {
        struct nvkm_fifo_cgrp *cgrp = chan->cgrp;
-       mutex_lock(&fifo->base.engine.subdev.mutex);
+       mutex_lock(&fifo->base.mutex);
        if (!list_empty(&chan->head)) {
                list_del_init(&chan->head);
                if (cgrp && !--cgrp->chan_nr)
                        list_del_init(&cgrp->head);
        }
-       mutex_unlock(&fifo->base.engine.subdev.mutex);
+       mutex_unlock(&fifo->base.mutex);
 }
 
 void
 gk104_fifo_runlist_insert(struct gk104_fifo *fifo, struct gk104_fifo_chan *chan)
 {
        struct nvkm_fifo_cgrp *cgrp = chan->cgrp;
-       mutex_lock(&fifo->base.engine.subdev.mutex);
+       mutex_lock(&fifo->base.mutex);
        if (cgrp) {
                if (!cgrp->chan_nr++)
                        list_add_tail(&cgrp->head, &fifo->runlist[chan->runl].cgrp);
@@ -219,7 +218,7 @@ gk104_fifo_runlist_insert(struct gk104_fifo *fifo, struct gk104_fifo_chan *chan)
        } else {
                list_add_tail(&chan->head, &fifo->runlist[chan->runl].chan);
        }
-       mutex_unlock(&fifo->base.engine.subdev.mutex);
+       mutex_unlock(&fifo->base.mutex);
 }
 
 void
@@ -259,6 +258,30 @@ gk104_fifo_pbdma = {
        .init = gk104_fifo_pbdma_init,
 };
 
+struct nvkm_engine *
+gk104_fifo_id_engine(struct nvkm_fifo *base, int engi)
+{
+       return gk104_fifo(base)->engine[engi].engine;
+}
+
+int
+gk104_fifo_engine_id(struct nvkm_fifo *base, struct nvkm_engine *engine)
+{
+       struct gk104_fifo *fifo = gk104_fifo(base);
+       int engn;
+
+       if (engine->subdev.type == NVKM_ENGINE_SW)
+               return GK104_FIFO_ENGN_SW;
+
+       for (engn = 0; engn < fifo->engine_nr && engine; engn++) {
+               if (fifo->engine[engn].engine == engine)
+                       return engn;
+       }
+
+       WARN_ON(1);
+       return -1;
+}
+
 static void
 gk104_fifo_recover_work(struct work_struct *w)
 {
@@ -410,11 +433,12 @@ gk104_fifo_recover_engn(struct gk104_fifo *fifo, int engn)
         * called from the fault handler already.
         */
        if (!status.faulted && engine) {
-               mmui = nvkm_top_fault_id(device, engine->subdev.index);
+               mmui = nvkm_top_fault_id(device, engine->subdev.type, engine->subdev.inst);
                if (mmui < 0) {
                        const struct nvkm_enum *en = fifo->func->fault.engine;
                        for (; en && en->name; en++) {
-                               if (en->data2 == engine->subdev.index) {
+                               if (en->data2 == engine->subdev.type &&
+                                   en->inst  == engine->subdev.inst) {
                                        mmui = en->value;
                                        break;
                                }
@@ -459,8 +483,8 @@ gk104_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info)
        struct nvkm_engine *engine = NULL;
        struct nvkm_fifo_chan *chan;
        unsigned long flags;
-       char ct[8] = "HUB/", en[16] = "";
-       int engn;
+       const char *en = "";
+       char ct[8] = "HUB/";
 
        er = nvkm_enum_find(fifo->func->fault.reason, info->reason);
        ee = nvkm_enum_find(fifo->func->fault.engine, info->engine);
@@ -484,23 +508,20 @@ gk104_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info)
                        nvkm_mask(device, 0x001718, 0x00000000, 0x00000000);
                        break;
                default:
-                       engine = nvkm_device_engine(device, ee->data2);
+                       engine = nvkm_device_engine(device, ee->data2, 0);
                        break;
                }
        }
 
        if (ee == NULL) {
-               enum nvkm_devidx engidx = nvkm_top_fault(device, info->engine);
-               if (engidx < NVKM_SUBDEV_NR) {
-                       const char *src = nvkm_subdev_name[engidx];
-                       char *dst = en;
-                       do {
-                               *dst++ = toupper(*src++);
-                       } while(*src);
-                       engine = nvkm_device_engine(device, engidx);
+               struct nvkm_subdev *subdev = nvkm_top_fault(device, info->engine);
+               if (subdev) {
+                       if (subdev->func == &nvkm_engine)
+                               engine = container_of(subdev, typeof(*engine), subdev);
+                       en = engine->subdev.name;
                }
        } else {
-               snprintf(en, sizeof(en), "%s", ee->name);
+               en = ee->name;
        }
 
        spin_lock_irqsave(&fifo->base.lock, flags);
@@ -523,11 +544,10 @@ gk104_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info)
         * correct engine(s), but just in case we can't find the channel
         * information...
         */
-       for (engn = 0; engn < fifo->engine_nr && engine; engn++) {
-               if (fifo->engine[engn].engine == engine) {
+       if (engine) {
+               int engn = fifo->base.func->engine_id(&fifo->base, engine);
+               if (engn >= 0 && engn != GK104_FIFO_ENGN_SW)
                        gk104_fifo_recover_engn(fifo, engn);
-                       break;
-               }
        }
 
        spin_unlock_irqrestore(&fifo->base.lock, flags);
@@ -864,19 +884,41 @@ gk104_fifo_info(struct nvkm_fifo *base, u64 mthd, u64 *data)
 {
        struct gk104_fifo *fifo = gk104_fifo(base);
        switch (mthd) {
-       case NV_DEVICE_FIFO_RUNLISTS:
+       case NV_DEVICE_HOST_RUNLISTS:
                *data = (1ULL << fifo->runlist_nr) - 1;
                return 0;
-       case NV_DEVICE_FIFO_RUNLIST_ENGINES(0)...
-            NV_DEVICE_FIFO_RUNLIST_ENGINES(63): {
-               int runl = mthd - NV_DEVICE_FIFO_RUNLIST_ENGINES(0), engn;
-               if (runl < fifo->runlist_nr) {
-                       unsigned long engm = fifo->runlist[runl].engm;
+       case NV_DEVICE_HOST_RUNLIST_ENGINES: {
+               if (*data < fifo->runlist_nr) {
+                       unsigned long engm = fifo->runlist[*data].engm;
                        struct nvkm_engine *engine;
+                       int engn;
                        *data = 0;
                        for_each_set_bit(engn, &engm, fifo->engine_nr) {
-                               if ((engine = fifo->engine[engn].engine))
-                                       *data |= BIT_ULL(engine->subdev.index);
+                               if ((engine = fifo->engine[engn].engine)) {
+#define CASE(n) case NVKM_ENGINE_##n: *data |= NV_DEVICE_HOST_RUNLIST_ENGINES_##n; break
+                                       switch (engine->subdev.type) {
+                                       CASE(SW    );
+                                       CASE(GR    );
+                                       CASE(MPEG  );
+                                       CASE(ME    );
+                                       CASE(CIPHER);
+                                       CASE(BSP   );
+                                       CASE(VP    );
+                                       CASE(CE    );
+                                       CASE(SEC   );
+                                       CASE(MSVLD );
+                                       CASE(MSPDEC);
+                                       CASE(MSPPP );
+                                       CASE(MSENC );
+                                       CASE(VIC   );
+                                       CASE(SEC2  );
+                                       CASE(NVDEC );
+                                       CASE(NVENC );
+                                       default:
+                                               WARN_ON(1);
+                                               break;
+                                       }
+                               }
                        }
                        return 0;
                }
@@ -894,8 +936,8 @@ gk104_fifo_oneinit(struct nvkm_fifo *base)
        struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
        struct nvkm_device *device = subdev->device;
        struct nvkm_vmm *bar = nvkm_bar_bar1_vmm(device);
-       int engn, runl, pbid, ret, i, j;
-       enum nvkm_devidx engidx;
+       struct nvkm_top_device *tdev;
+       int pbid, ret, i, j;
        u32 *map;
 
        fifo->pbdma_nr = fifo->func->pbdma->nr(fifo);
@@ -909,25 +951,41 @@ gk104_fifo_oneinit(struct nvkm_fifo *base)
                map[i] = nvkm_rd32(device, 0x002390 + (i * 0x04));
 
        /* Determine runlist configuration from topology device info. */
-       i = 0;
-       while ((int)(engidx = nvkm_top_engine(device, i++, &runl, &engn)) >= 0) {
+       list_for_each_entry(tdev, &device->top->device, head) {
+               const int engn = tdev->engine;
+               char _en[16], *en;
+
+               if (engn < 0)
+                       continue;
+
                /* Determine which PBDMA handles requests for this engine. */
                for (j = 0, pbid = -1; j < fifo->pbdma_nr; j++) {
-                       if (map[j] & (1 << runl)) {
+                       if (map[j] & BIT(tdev->runlist)) {
                                pbid = j;
                                break;
                        }
                }
 
+               fifo->engine[engn].engine = nvkm_device_engine(device, tdev->type, tdev->inst);
+               if (!fifo->engine[engn].engine) {
+                       snprintf(_en, sizeof(_en), "%s, %d",
+                                nvkm_subdev_type[tdev->type], tdev->inst);
+                       en = _en;
+               } else {
+                       en = fifo->engine[engn].engine->subdev.name;
+               }
+
                nvkm_debug(subdev, "engine %2d: runlist %2d pbdma %2d (%s)\n",
-                          engn, runl, pbid, nvkm_subdev_name[engidx]);
+                          tdev->engine, tdev->runlist, pbid, en);
 
-               fifo->engine[engn].engine = nvkm_device_engine(device, engidx);
-               fifo->engine[engn].runl = runl;
+               fifo->engine[engn].runl = tdev->runlist;
                fifo->engine[engn].pbid = pbid;
                fifo->engine_nr = max(fifo->engine_nr, engn + 1);
-               fifo->runlist[runl].engm |= 1 << engn;
-               fifo->runlist_nr = max(fifo->runlist_nr, runl + 1);
+               fifo->runlist[tdev->runlist].engm |= BIT(engn);
+               fifo->runlist[tdev->runlist].engm_sw |= BIT(engn);
+               if (tdev->type == NVKM_ENGINE_GR)
+                       fifo->runlist[tdev->runlist].engm_sw |= BIT(GK104_FIFO_ENGN_SW);
+               fifo->runlist_nr = max(fifo->runlist_nr, tdev->runlist + 1);
        }
 
        kfree(map);
@@ -1021,6 +1079,8 @@ gk104_fifo_ = {
        .fini = gk104_fifo_fini,
        .intr = gk104_fifo_intr,
        .fault = gk104_fifo_fault,
+       .engine_id = gk104_fifo_engine_id,
+       .id_engine = gk104_fifo_id_engine,
        .uevent_init = gk104_fifo_uevent_init,
        .uevent_fini = gk104_fifo_uevent_fini,
        .recover_chan = gk104_fifo_recover_chan,
@@ -1030,7 +1090,7 @@ gk104_fifo_ = {
 
 int
 gk104_fifo_new_(const struct gk104_fifo_func *func, struct nvkm_device *device,
-               int index, int nr, struct nvkm_fifo **pfifo)
+               enum nvkm_subdev_type type, int inst, int nr, struct nvkm_fifo **pfifo)
 {
        struct gk104_fifo *fifo;
 
@@ -1040,7 +1100,7 @@ gk104_fifo_new_(const struct gk104_fifo_func *func, struct nvkm_device *device,
        INIT_WORK(&fifo->recover.work, gk104_fifo_recover_work);
        *pfifo = &fifo->base;
 
-       return nvkm_fifo_ctor(&gk104_fifo_, device, index, nr, &fifo->base);
+       return nvkm_fifo_ctor(&gk104_fifo_, device, type, inst, nr, &fifo->base);
 }
 
 const struct nvkm_enum
@@ -1072,12 +1132,12 @@ gk104_fifo_fault_engine[] = {
        { 0x11, "MSPPP", NULL, NVKM_ENGINE_MSPPP },
        { 0x13, "PERF" },
        { 0x14, "MSPDEC", NULL, NVKM_ENGINE_MSPDEC },
-       { 0x15, "CE0", NULL, NVKM_ENGINE_CE0 },
-       { 0x16, "CE1", NULL, NVKM_ENGINE_CE1 },
+       { 0x15, "CE0", NULL, NVKM_ENGINE_CE0 },
+       { 0x16, "CE1", NULL, NVKM_ENGINE_CE1 },
        { 0x17, "PMU" },
        { 0x18, "PTP" },
        { 0x19, "MSENC", NULL, NVKM_ENGINE_MSENC },
-       { 0x1b, "CE2", NULL, NVKM_ENGINE_CE2 },
+       { 0x1b, "CE2", NULL, NVKM_ENGINE_CE2 },
        {}
 };
 
@@ -1179,7 +1239,8 @@ gk104_fifo = {
 };
 
 int
-gk104_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+gk104_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
-       return gk104_fifo_new_(&gk104_fifo, device, index, 4096, pfifo);
+       return gk104_fifo_new_(&gk104_fifo, device, type, inst, 4096, pfifo);
 }
index 4398b340e514b8b5582709c28a642ecaaea76c80..f2d12ae739449ab4e19b703ba06ec9fa86b2e804 100644 (file)
@@ -35,6 +35,7 @@ struct gk104_fifo {
                struct list_head cgrp;
                struct list_head chan;
                u32 engm;
+               u32 engm_sw;
        } runlist[16];
        int runlist_nr;
 
@@ -99,7 +100,7 @@ struct gk104_fifo_engine_status {
        } prev, next, *chan;
 };
 
-int gk104_fifo_new_(const struct gk104_fifo_func *, struct nvkm_device *,
+int gk104_fifo_new_(const struct gk104_fifo_func *, struct nvkm_device *, enum nvkm_subdev_type,
                    int index, int nr, struct nvkm_fifo **);
 void gk104_fifo_runlist_insert(struct gk104_fifo *, struct gk104_fifo_chan *);
 void gk104_fifo_runlist_remove(struct gk104_fifo *, struct gk104_fifo_chan *);
index f820969e4405df8908298bcef62d2a928f74b1c5..915278c7e0128c8feaa4dbbaa03404693e1e0fe7 100644 (file)
@@ -60,7 +60,8 @@ gk110_fifo = {
 };
 
 int
-gk110_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+gk110_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
-       return gk104_fifo_new_(&gk110_fifo, device, index, 4096, pfifo);
+       return gk104_fifo_new_(&gk110_fifo, device, type, inst, 4096, pfifo);
 }
index 2f54787b5fd0b4285d021514f41ab0541b5e2225..cb703693de52c0d52681367376e27cf41f715bdc 100644 (file)
@@ -57,7 +57,8 @@ gk208_fifo = {
 };
 
 int
-gk208_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+gk208_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
-       return gk104_fifo_new_(&gk208_fifo, device, index, 1024, pfifo);
+       return gk104_fifo_new_(&gk208_fifo, device, type, inst, 1024, pfifo);
 }
index a814c4e0ed3e5ebff69518833d54dc6a92407394..6e35cf44c640f8de9364fe7185d4f7f2fbfca469 100644 (file)
@@ -38,7 +38,8 @@ gk20a_fifo = {
 };
 
 int
-gk20a_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+gk20a_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
-       return gk104_fifo_new_(&gk20a_fifo, device, index, 128, pfifo);
+       return gk104_fifo_new_(&gk20a_fifo, device, type, inst, 128, pfifo);
 }
index c2a2e4572f6cb1a54d6f8ccd673f08dc1e813ce3..7af6e687d47491d83af7954f499ffbeafe1b580f 100644 (file)
@@ -106,7 +106,8 @@ gm107_fifo = {
 };
 
 int
-gm107_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+gm107_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
-       return gk104_fifo_new_(&gm107_fifo, device, index, 2048, pfifo);
+       return gk104_fifo_new_(&gm107_fifo, device, type, inst, 2048, pfifo);
 }
index b8cfe3b28c4fd5302a682b41bd6314667d39df93..573658cb6c73f4c4c9cb03965c44f9eaf6cd9e11 100644 (file)
@@ -54,7 +54,8 @@ gm200_fifo = {
 };
 
 int
-gm200_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+gm200_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
-       return gk104_fifo_new_(&gm200_fifo, device, index, 4096, pfifo);
+       return gk104_fifo_new_(&gm200_fifo, device, type, inst, 4096, pfifo);
 }
index 70b4feebc1faca571b0db72e3bcc4844439a16cc..556c97e54f143fb0394f9e21d7e277cd8b9a2b2b 100644 (file)
@@ -38,7 +38,8 @@ gm20b_fifo = {
 };
 
 int
-gm20b_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+gm20b_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
-       return gk104_fifo_new_(&gm20b_fifo, device, index, 512, pfifo);
+       return gk104_fifo_new_(&gm20b_fifo, device, type, inst, 512, pfifo);
 }
index 2c7a0176b3c840a13a3e50742cb460d1f0bd58f8..6b46b6b65b87724ad73158a38420be93a46a0c86 100644 (file)
@@ -91,7 +91,8 @@ gp100_fifo = {
 };
 
 int
-gp100_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+gp100_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
-       return gk104_fifo_new_(&gp100_fifo, device, index, 4096, pfifo);
+       return gk104_fifo_new_(&gp100_fifo, device, type, inst, 4096, pfifo);
 }
index 8c65ad4feedbeb0bbf1bb5c44369a415672c5267..7a5929cb4d29b8ad737caef43ea93c559766eac7 100644 (file)
@@ -39,7 +39,8 @@ gp10b_fifo = {
 };
 
 int
-gp10b_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+gp10b_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
-       return gk104_fifo_new_(&gp10b_fifo, device, index, 512, pfifo);
+       return gk104_fifo_new_(&gp10b_fifo, device, type, inst, 512, pfifo);
 }
index 75f9632789b33aeaa1528e2a548deb436f2ccd46..4e78bbe3b94bb29f17715a6e321f21de44752cc4 100644 (file)
@@ -52,11 +52,10 @@ gf100_fifo_chan_ntfy(struct nvkm_fifo_chan *chan, u32 type,
 static u32
 gf100_fifo_gpfifo_engine_addr(struct nvkm_engine *engine)
 {
-       switch (engine->subdev.index) {
+       switch (engine->subdev.type) {
        case NVKM_ENGINE_SW    : return 0;
        case NVKM_ENGINE_GR    : return 0x0210;
-       case NVKM_ENGINE_CE0   : return 0x0230;
-       case NVKM_ENGINE_CE1   : return 0x0240;
+       case NVKM_ENGINE_CE    : return 0x0230 + (engine->subdev.inst * 0x10);
        case NVKM_ENGINE_MSPDEC: return 0x0250;
        case NVKM_ENGINE_MSPPP : return 0x0260;
        case NVKM_ENGINE_MSVLD : return 0x0270;
@@ -66,6 +65,15 @@ gf100_fifo_gpfifo_engine_addr(struct nvkm_engine *engine)
        }
 }
 
+static struct gf100_fifo_engn *
+gf100_fifo_gpfifo_engine(struct gf100_fifo_chan *chan, struct nvkm_engine *engine)
+{
+       int engi = chan->base.fifo->func->engine_id(chan->base.fifo, engine);
+       if (engi >= 0)
+               return &chan->engn[engi];
+       return NULL;
+}
+
 static int
 gf100_fifo_gpfifo_engine_fini(struct nvkm_fifo_chan *base,
                              struct nvkm_engine *engine, bool suspend)
@@ -77,7 +85,7 @@ gf100_fifo_gpfifo_engine_fini(struct nvkm_fifo_chan *base,
        struct nvkm_gpuobj *inst = chan->base.inst;
        int ret = 0;
 
-       mutex_lock(&subdev->mutex);
+       mutex_lock(&chan->fifo->base.mutex);
        nvkm_wr32(device, 0x002634, chan->base.chid);
        if (nvkm_msec(device, 2000,
                if (nvkm_rd32(device, 0x002634) == chan->base.chid)
@@ -87,7 +95,7 @@ gf100_fifo_gpfifo_engine_fini(struct nvkm_fifo_chan *base,
                           chan->base.chid, chan->base.object.client->name);
                ret = -ETIMEDOUT;
        }
-       mutex_unlock(&subdev->mutex);
+       mutex_unlock(&chan->fifo->base.mutex);
 
        if (ret && suspend)
                return ret;
@@ -108,13 +116,13 @@ gf100_fifo_gpfifo_engine_init(struct nvkm_fifo_chan *base,
 {
        const u32 offset = gf100_fifo_gpfifo_engine_addr(engine);
        struct gf100_fifo_chan *chan = gf100_fifo_chan(base);
+       struct gf100_fifo_engn *engn = gf100_fifo_gpfifo_engine(chan, engine);
        struct nvkm_gpuobj *inst = chan->base.inst;
 
        if (offset) {
-               u64 addr = chan->engn[engine->subdev.index].vma->addr;
                nvkm_kmap(inst);
-               nvkm_wo32(inst, offset + 0x00, lower_32_bits(addr) | 4);
-               nvkm_wo32(inst, offset + 0x04, upper_32_bits(addr));
+               nvkm_wo32(inst, offset + 0x00, lower_32_bits(engn->vma->addr) | 4);
+               nvkm_wo32(inst, offset + 0x04, upper_32_bits(engn->vma->addr));
                nvkm_done(inst);
        }
 
@@ -126,8 +134,9 @@ gf100_fifo_gpfifo_engine_dtor(struct nvkm_fifo_chan *base,
                              struct nvkm_engine *engine)
 {
        struct gf100_fifo_chan *chan = gf100_fifo_chan(base);
-       nvkm_vmm_put(chan->base.vmm, &chan->engn[engine->subdev.index].vma);
-       nvkm_gpuobj_del(&chan->engn[engine->subdev.index].inst);
+       struct gf100_fifo_engn *engn = gf100_fifo_gpfifo_engine(chan, engine);
+       nvkm_vmm_put(chan->base.vmm, &engn->vma);
+       nvkm_gpuobj_del(&engn->inst);
 }
 
 static int
@@ -136,23 +145,21 @@ gf100_fifo_gpfifo_engine_ctor(struct nvkm_fifo_chan *base,
                              struct nvkm_object *object)
 {
        struct gf100_fifo_chan *chan = gf100_fifo_chan(base);
-       int engn = engine->subdev.index;
+       struct gf100_fifo_engn *engn = gf100_fifo_gpfifo_engine(chan, engine);
        int ret;
 
        if (!gf100_fifo_gpfifo_engine_addr(engine))
                return 0;
 
-       ret = nvkm_object_bind(object, NULL, 0, &chan->engn[engn].inst);
+       ret = nvkm_object_bind(object, NULL, 0, &engn->inst);
        if (ret)
                return ret;
 
-       ret = nvkm_vmm_get(chan->base.vmm, 12, chan->engn[engn].inst->size,
-                          &chan->engn[engn].vma);
+       ret = nvkm_vmm_get(chan->base.vmm, 12, engn->inst->size, &engn->vma);
        if (ret)
                return ret;
 
-       return nvkm_memory_map(chan->engn[engn].inst, 0, chan->base.vmm,
-                              chan->engn[engn].vma, NULL, 0);
+       return nvkm_memory_map(engn->inst, 0, chan->base.vmm, engn->vma, NULL, 0);
 }
 
 static void
@@ -243,13 +250,13 @@ gf100_fifo_gpfifo_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass,
 
        ret = nvkm_fifo_chan_ctor(&gf100_fifo_gpfifo_func, &fifo->base,
                                  0x1000, 0x1000, true, args->v0.vmm, 0,
-                                 (1ULL << NVKM_ENGINE_CE0) |
-                                 (1ULL << NVKM_ENGINE_CE1) |
-                                 (1ULL << NVKM_ENGINE_GR) |
-                                 (1ULL << NVKM_ENGINE_MSPDEC) |
-                                 (1ULL << NVKM_ENGINE_MSPPP) |
-                                 (1ULL << NVKM_ENGINE_MSVLD) |
-                                 (1ULL << NVKM_ENGINE_SW),
+                                 BIT(GF100_FIFO_ENGN_GR) |
+                                 BIT(GF100_FIFO_ENGN_MSPDEC) |
+                                 BIT(GF100_FIFO_ENGN_MSPPP) |
+                                 BIT(GF100_FIFO_ENGN_MSVLD) |
+                                 BIT(GF100_FIFO_ENGN_CE0) |
+                                 BIT(GF100_FIFO_ENGN_CE1) |
+                                 BIT(GF100_FIFO_ENGN_SW),
                                  1, fifo->user.bar->addr, 0x1000,
                                  oclass, &chan->base);
        if (ret)
index 728a1edbf98c8cce3f7cb81ea8912b8097d293b5..b6900a52bcce5ae714b8029acd322a42ad2654ab 100644 (file)
@@ -65,19 +65,18 @@ int
 gk104_fifo_gpfifo_kick(struct gk104_fifo_chan *chan)
 {
        int ret;
-       mutex_lock(&chan->base.fifo->engine.subdev.mutex);
+       mutex_lock(&chan->base.fifo->mutex);
        ret = gk104_fifo_gpfifo_kick_locked(chan);
-       mutex_unlock(&chan->base.fifo->engine.subdev.mutex);
+       mutex_unlock(&chan->base.fifo->mutex);
        return ret;
 }
 
 static u32
 gk104_fifo_gpfifo_engine_addr(struct nvkm_engine *engine)
 {
-       switch (engine->subdev.index) {
+       switch (engine->subdev.type) {
        case NVKM_ENGINE_SW    :
-       case NVKM_ENGINE_CE0...NVKM_ENGINE_CE_LAST:
-               return 0;
+       case NVKM_ENGINE_CE    : return 0;
        case NVKM_ENGINE_GR    : return 0x0210;
        case NVKM_ENGINE_SEC   : return 0x0220;
        case NVKM_ENGINE_MSPDEC: return 0x0250;
@@ -85,15 +84,26 @@ gk104_fifo_gpfifo_engine_addr(struct nvkm_engine *engine)
        case NVKM_ENGINE_MSVLD : return 0x0270;
        case NVKM_ENGINE_VIC   : return 0x0280;
        case NVKM_ENGINE_MSENC : return 0x0290;
-       case NVKM_ENGINE_NVDEC0: return 0x02100270;
-       case NVKM_ENGINE_NVENC0: return 0x02100290;
-       case NVKM_ENGINE_NVENC1: return 0x0210;
+       case NVKM_ENGINE_NVDEC : return 0x02100270;
+       case NVKM_ENGINE_NVENC :
+               if (engine->subdev.inst)
+                       return 0x0210;
+               return 0x02100290;
        default:
                WARN_ON(1);
                return 0;
        }
 }
 
+struct gk104_fifo_engn *
+gk104_fifo_gpfifo_engine(struct gk104_fifo_chan *chan, struct nvkm_engine *engine)
+{
+       int engi = chan->base.fifo->func->engine_id(chan->base.fifo, engine);
+       if (engi >= 0)
+               return &chan->engn[engi];
+       return NULL;
+}
+
 static int
 gk104_fifo_gpfifo_engine_fini(struct nvkm_fifo_chan *base,
                              struct nvkm_engine *engine, bool suspend)
@@ -126,13 +136,13 @@ gk104_fifo_gpfifo_engine_init(struct nvkm_fifo_chan *base,
                              struct nvkm_engine *engine)
 {
        struct gk104_fifo_chan *chan = gk104_fifo_chan(base);
+       struct gk104_fifo_engn *engn = gk104_fifo_gpfifo_engine(chan, engine);
        struct nvkm_gpuobj *inst = chan->base.inst;
        u32 offset = gk104_fifo_gpfifo_engine_addr(engine);
 
        if (offset) {
-               u64   addr = chan->engn[engine->subdev.index].vma->addr;
-               u32 datalo = lower_32_bits(addr) | 0x00000004;
-               u32 datahi = upper_32_bits(addr);
+               u32 datalo = lower_32_bits(engn->vma->addr) | 0x00000004;
+               u32 datahi = upper_32_bits(engn->vma->addr);
                nvkm_kmap(inst);
                nvkm_wo32(inst, (offset & 0xffff) + 0x00, datalo);
                nvkm_wo32(inst, (offset & 0xffff) + 0x04, datahi);
@@ -151,8 +161,9 @@ gk104_fifo_gpfifo_engine_dtor(struct nvkm_fifo_chan *base,
                              struct nvkm_engine *engine)
 {
        struct gk104_fifo_chan *chan = gk104_fifo_chan(base);
-       nvkm_vmm_put(chan->base.vmm, &chan->engn[engine->subdev.index].vma);
-       nvkm_gpuobj_del(&chan->engn[engine->subdev.index].inst);
+       struct gk104_fifo_engn *engn = gk104_fifo_gpfifo_engine(chan, engine);
+       nvkm_vmm_put(chan->base.vmm, &engn->vma);
+       nvkm_gpuobj_del(&engn->inst);
 }
 
 int
@@ -161,23 +172,21 @@ gk104_fifo_gpfifo_engine_ctor(struct nvkm_fifo_chan *base,
                              struct nvkm_object *object)
 {
        struct gk104_fifo_chan *chan = gk104_fifo_chan(base);
-       int engn = engine->subdev.index;
+       struct gk104_fifo_engn *engn = gk104_fifo_gpfifo_engine(chan, engine);
        int ret;
 
        if (!gk104_fifo_gpfifo_engine_addr(engine))
                return 0;
 
-       ret = nvkm_object_bind(object, NULL, 0, &chan->engn[engn].inst);
+       ret = nvkm_object_bind(object, NULL, 0, &engn->inst);
        if (ret)
                return ret;
 
-       ret = nvkm_vmm_get(chan->base.vmm, 12, chan->engn[engn].inst->size,
-                          &chan->engn[engn].vma);
+       ret = nvkm_vmm_get(chan->base.vmm, 12, engn->inst->size, &engn->vma);
        if (ret)
                return ret;
 
-       return nvkm_memory_map(chan->engn[engn].inst, 0, chan->base.vmm,
-                              chan->engn[engn].vma, NULL, 0);
+       return nvkm_memory_map(engn->inst, 0, chan->base.vmm, engn->vma, NULL, 0);
 }
 
 void
@@ -247,23 +256,12 @@ gk104_fifo_gpfifo_new_(struct gk104_fifo *fifo, u64 *runlists, u16 *chid,
 {
        struct gk104_fifo_chan *chan;
        int runlist = ffs(*runlists) -1, ret, i;
-       unsigned long engm;
-       u64 subdevs = 0;
        u64 usermem;
 
        if (!vmm || runlist < 0 || runlist >= fifo->runlist_nr)
                return -EINVAL;
        *runlists = BIT_ULL(runlist);
 
-       engm = fifo->runlist[runlist].engm;
-       for_each_set_bit(i, &engm, fifo->engine_nr) {
-               if (fifo->engine[i].engine)
-                       subdevs |= BIT_ULL(fifo->engine[i].engine->subdev.index);
-       }
-
-       if (subdevs & BIT_ULL(NVKM_ENGINE_GR))
-               subdevs |= BIT_ULL(NVKM_ENGINE_SW);
-
        /* Allocate the channel. */
        if (!(chan = kzalloc(sizeof(*chan), GFP_KERNEL)))
                return -ENOMEM;
@@ -273,7 +271,7 @@ gk104_fifo_gpfifo_new_(struct gk104_fifo *fifo, u64 *runlists, u16 *chid,
        INIT_LIST_HEAD(&chan->head);
 
        ret = nvkm_fifo_chan_ctor(&gk104_fifo_gpfifo_func, &fifo->base,
-                                 0x1000, 0x1000, true, vmm, 0, subdevs,
+                                 0x1000, 0x1000, true, vmm, 0, fifo->runlist[runlist].engm_sw,
                                  1, fifo->user.bar->addr, 0x200,
                                  oclass, &chan->base);
        if (ret)
index a7462cf59d65cb1c6afc5388d5f3f9e211db64d4..ee4967b706a7d1991ef583b743bc7e8774d74a5e 100644 (file)
@@ -44,7 +44,7 @@ gv100_fifo_gpfifo_engine_valid(struct gk104_fifo_chan *chan, bool ce, bool valid
        int ret;
 
        /* Block runlist to prevent the channel from being rescheduled. */
-       mutex_lock(&subdev->mutex);
+       mutex_lock(&chan->fifo->base.mutex);
        nvkm_mask(device, 0x002630, BIT(chan->runl), BIT(chan->runl));
 
        /* Preempt the channel. */
@@ -58,7 +58,7 @@ gv100_fifo_gpfifo_engine_valid(struct gk104_fifo_chan *chan, bool ce, bool valid
 
        /* Resume runlist. */
        nvkm_mask(device, 0x002630, BIT(chan->runl), 0);
-       mutex_unlock(&subdev->mutex);
+       mutex_unlock(&chan->fifo->base.mutex);
        return ret;
 }
 
@@ -70,8 +70,7 @@ gv100_fifo_gpfifo_engine_fini(struct nvkm_fifo_chan *base,
        struct nvkm_gpuobj *inst = chan->base.inst;
        int ret;
 
-       if (engine->subdev.index >= NVKM_ENGINE_CE0 &&
-           engine->subdev.index <= NVKM_ENGINE_CE_LAST)
+       if (engine->subdev.type == NVKM_ENGINE_CE)
                return gk104_fifo_gpfifo_kick(chan);
 
        ret = gv100_fifo_gpfifo_engine_valid(chan, false, false);
@@ -90,17 +89,15 @@ gv100_fifo_gpfifo_engine_init(struct nvkm_fifo_chan *base,
                              struct nvkm_engine *engine)
 {
        struct gk104_fifo_chan *chan = gk104_fifo_chan(base);
+       struct gk104_fifo_engn *engn = gk104_fifo_gpfifo_engine(chan, engine);
        struct nvkm_gpuobj *inst = chan->base.inst;
-       u64 addr;
 
-       if (engine->subdev.index >= NVKM_ENGINE_CE0 &&
-           engine->subdev.index <= NVKM_ENGINE_CE_LAST)
+       if (engine->subdev.type == NVKM_ENGINE_CE)
                return 0;
 
-       addr = chan->engn[engine->subdev.index].vma->addr;
        nvkm_kmap(inst);
-       nvkm_wo32(inst, 0x210, lower_32_bits(addr) | 0x00000004);
-       nvkm_wo32(inst, 0x214, upper_32_bits(addr));
+       nvkm_wo32(inst, 0x210, lower_32_bits(engn->vma->addr) | 0x00000004);
+       nvkm_wo32(inst, 0x214, upper_32_bits(engn->vma->addr));
        nvkm_done(inst);
 
        return gv100_fifo_gpfifo_engine_valid(chan, false, true);
@@ -129,8 +126,6 @@ gv100_fifo_gpfifo_new_(const struct nvkm_fifo_chan_func *func,
        struct nvkm_device *device = fifo->base.engine.subdev.device;
        struct gk104_fifo_chan *chan;
        int runlist = ffs(*runlists) -1, ret, i;
-       unsigned long engm;
-       u64 subdevs = 0;
        u64 usermem, mthd;
        u32 size;
 
@@ -138,12 +133,6 @@ gv100_fifo_gpfifo_new_(const struct nvkm_fifo_chan_func *func,
                return -EINVAL;
        *runlists = BIT_ULL(runlist);
 
-       engm = fifo->runlist[runlist].engm;
-       for_each_set_bit(i, &engm, fifo->engine_nr) {
-               if (fifo->engine[i].engine)
-                       subdevs |= BIT_ULL(fifo->engine[i].engine->subdev.index);
-       }
-
        /* Allocate the channel. */
        if (!(chan = kzalloc(sizeof(*chan), GFP_KERNEL)))
                return -ENOMEM;
@@ -153,7 +142,7 @@ gv100_fifo_gpfifo_new_(const struct nvkm_fifo_chan_func *func,
        INIT_LIST_HEAD(&chan->head);
 
        ret = nvkm_fifo_chan_ctor(func, &fifo->base, 0x1000, 0x1000, true, vmm,
-                                 0, subdevs, 1, fifo->user.bar->addr, 0x200,
+                                 0, fifo->runlist[runlist].engm, 1, fifo->user.bar->addr, 0x200,
                                  oclass, &chan->base);
        if (ret)
                return ret;
index 6ee1bb32a071c0bd9c51e0cf3063049d206e06f2..70e16a91ac12ad6b3ddaf577b20479e16e6eaf64 100644 (file)
@@ -301,7 +301,8 @@ gv100_fifo = {
 };
 
 int
-gv100_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+gv100_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
-       return gk104_fifo_new_(&gv100_fifo, device, index, 4096, pfifo);
+       return gk104_fifo_new_(&gv100_fifo, device, type, inst, 4096, pfifo);
 }
index c1d1b1aa5bc662afef97f383eff8cd2959d6c482..c6730c124769ca7c7850e91bad5bfd6c40a1c20c 100644 (file)
@@ -94,6 +94,38 @@ __releases(fifo->base.lock)
        spin_unlock_irqrestore(&fifo->base.lock, flags);
 }
 
+struct nvkm_engine *
+nv04_fifo_id_engine(struct nvkm_fifo *fifo, int engi)
+{
+       enum nvkm_subdev_type type;
+
+       switch (engi) {
+       case NV04_FIFO_ENGN_SW  : type = NVKM_ENGINE_SW; break;
+       case NV04_FIFO_ENGN_GR  : type = NVKM_ENGINE_GR; break;
+       case NV04_FIFO_ENGN_MPEG: type = NVKM_ENGINE_MPEG; break;
+       case NV04_FIFO_ENGN_DMA : type = NVKM_ENGINE_DMAOBJ; break;
+       default:
+               WARN_ON(1);
+               return NULL;
+       }
+
+       return nvkm_device_engine(fifo->engine.subdev.device, type, 0);
+}
+
+int
+nv04_fifo_engine_id(struct nvkm_fifo *base, struct nvkm_engine *engine)
+{
+       switch (engine->subdev.type) {
+       case NVKM_ENGINE_SW    : return NV04_FIFO_ENGN_SW;
+       case NVKM_ENGINE_GR    : return NV04_FIFO_ENGN_GR;
+       case NVKM_ENGINE_MPEG  : return NV04_FIFO_ENGN_MPEG;
+       case NVKM_ENGINE_DMAOBJ: return NV04_FIFO_ENGN_DMA;
+       default:
+               WARN_ON(1);
+               return 0;
+       }
+}
+
 static const char *
 nv_dma_state_err(u32 state)
 {
@@ -326,7 +358,7 @@ nv04_fifo_init(struct nvkm_fifo *base)
 
 int
 nv04_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device,
-              int index, int nr, const struct nv04_fifo_ramfc *ramfc,
+              enum nvkm_subdev_type type, int inst, int nr, const struct nv04_fifo_ramfc *ramfc,
               struct nvkm_fifo **pfifo)
 {
        struct nv04_fifo *fifo;
@@ -337,7 +369,7 @@ nv04_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device,
        fifo->ramfc = ramfc;
        *pfifo = &fifo->base;
 
-       ret = nvkm_fifo_ctor(func, device, index, nr, &fifo->base);
+       ret = nvkm_fifo_ctor(func, device, type, inst, nr, &fifo->base);
        if (ret)
                return ret;
 
@@ -349,6 +381,8 @@ static const struct nvkm_fifo_func
 nv04_fifo = {
        .init = nv04_fifo_init,
        .intr = nv04_fifo_intr,
+       .engine_id = nv04_fifo_engine_id,
+       .id_engine = nv04_fifo_id_engine,
        .pause = nv04_fifo_pause,
        .start = nv04_fifo_start,
        .chan = {
@@ -358,8 +392,8 @@ nv04_fifo = {
 };
 
 int
-nv04_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+nv04_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_fifo **pfifo)
 {
-       return nv04_fifo_new_(&nv04_fifo, device, index, 16,
-                             nv04_fifo_ramfc, pfifo);
+       return nv04_fifo_new_(&nv04_fifo, device, type, inst, 16, nv04_fifo_ramfc, pfifo);
 }
index e5ecceee77ae768d6da413a9b53fa6da48041c14..3f23bcde4a540cc3c9a4384744f675120d08a023 100644 (file)
@@ -17,8 +17,7 @@ struct nv04_fifo {
        const struct nv04_fifo_ramfc *ramfc;
 };
 
-int nv04_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *,
-                  int index, int nr, const struct nv04_fifo_ramfc *,
-                  struct nvkm_fifo **);
+int nv04_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                  int nr, const struct nv04_fifo_ramfc *, struct nvkm_fifo **);
 void nv04_fifo_init(struct nvkm_fifo *);
 #endif
index f9a87deb2b3dc3fd1f11e926bdb1bec17cf56b2b..f8887f0f2f82ac9223bdda847e99a603a49b6068 100644 (file)
@@ -43,6 +43,8 @@ static const struct nvkm_fifo_func
 nv10_fifo = {
        .init = nv04_fifo_init,
        .intr = nv04_fifo_intr,
+       .engine_id = nv04_fifo_engine_id,
+       .id_engine = nv04_fifo_id_engine,
        .pause = nv04_fifo_pause,
        .start = nv04_fifo_start,
        .chan = {
@@ -52,8 +54,8 @@ nv10_fifo = {
 };
 
 int
-nv10_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+nv10_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_fifo **pfifo)
 {
-       return nv04_fifo_new_(&nv10_fifo, device, index, 32,
-                             nv10_fifo_ramfc, pfifo);
+       return nv04_fifo_new_(&nv10_fifo, device, type, inst, 32, nv10_fifo_ramfc, pfifo);
 }
index f6d383a21222e07b48ea569801ae227ba734c6b4..3f94c7b5b054b7983f0621efa1206e5275a5aa2c 100644 (file)
@@ -81,6 +81,8 @@ static const struct nvkm_fifo_func
 nv17_fifo = {
        .init = nv17_fifo_init,
        .intr = nv04_fifo_intr,
+       .engine_id = nv04_fifo_engine_id,
+       .id_engine = nv04_fifo_id_engine,
        .pause = nv04_fifo_pause,
        .start = nv04_fifo_start,
        .chan = {
@@ -90,8 +92,8 @@ nv17_fifo = {
 };
 
 int
-nv17_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+nv17_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_fifo **pfifo)
 {
-       return nv04_fifo_new_(&nv17_fifo, device, index, 32,
-                             nv17_fifo_ramfc, pfifo);
+       return nv04_fifo_new_(&nv17_fifo, device, type, inst, 32, nv17_fifo_ramfc, pfifo);
 }
index 2d61fd832ddb0d882d223b3073dd4fcc3cdb7009..f9ea46809bc05aac502eef61bb9723827765a9bb 100644 (file)
@@ -112,6 +112,8 @@ static const struct nvkm_fifo_func
 nv40_fifo = {
        .init = nv40_fifo_init,
        .intr = nv04_fifo_intr,
+       .engine_id = nv04_fifo_engine_id,
+       .id_engine = nv04_fifo_id_engine,
        .pause = nv04_fifo_pause,
        .start = nv04_fifo_start,
        .chan = {
@@ -121,8 +123,8 @@ nv40_fifo = {
 };
 
 int
-nv40_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+nv40_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_fifo **pfifo)
 {
-       return nv04_fifo_new_(&nv40_fifo, device, index, 32,
-                             nv40_fifo_ramfc, pfifo);
+       return nv04_fifo_new_(&nv40_fifo, device, type, inst, 32, nv40_fifo_ramfc, pfifo);
 }
index fa6e094d8068679b209542c4a0707e7eed643970..be94156ea2488551c4e6cfd4b77ddd93a211e53a 100644 (file)
@@ -51,9 +51,9 @@ nv50_fifo_runlist_update_locked(struct nv50_fifo *fifo)
 void
 nv50_fifo_runlist_update(struct nv50_fifo *fifo)
 {
-       mutex_lock(&fifo->base.engine.subdev.mutex);
+       mutex_lock(&fifo->base.mutex);
        nv50_fifo_runlist_update_locked(fifo);
-       mutex_unlock(&fifo->base.engine.subdev.mutex);
+       mutex_unlock(&fifo->base.mutex);
 }
 
 int
@@ -107,7 +107,7 @@ nv50_fifo_dtor(struct nvkm_fifo *base)
 
 int
 nv50_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device,
-              int index, struct nvkm_fifo **pfifo)
+              enum nvkm_subdev_type type, int inst, struct nvkm_fifo **pfifo)
 {
        struct nv50_fifo *fifo;
        int ret;
@@ -116,7 +116,7 @@ nv50_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device,
                return -ENOMEM;
        *pfifo = &fifo->base;
 
-       ret = nvkm_fifo_ctor(func, device, index, 128, &fifo->base);
+       ret = nvkm_fifo_ctor(func, device, type, inst, 128, &fifo->base);
        if (ret)
                return ret;
 
@@ -131,6 +131,8 @@ nv50_fifo = {
        .oneinit = nv50_fifo_oneinit,
        .init = nv50_fifo_init,
        .intr = nv04_fifo_intr,
+       .engine_id = nv04_fifo_engine_id,
+       .id_engine = nv04_fifo_id_engine,
        .pause = nv04_fifo_pause,
        .start = nv04_fifo_start,
        .chan = {
@@ -141,7 +143,8 @@ nv50_fifo = {
 };
 
 int
-nv50_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+nv50_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_fifo **pfifo)
 {
-       return nv50_fifo_new_(&nv50_fifo, device, index, pfifo);
+       return nv50_fifo_new_(&nv50_fifo, device, type, inst, pfifo);
 }
index 87d30b6bd2ea8f929a97b2dd24f3ab83a53109f0..0111e7e5a4e38802d2aba577dcd5c0ea2f462599 100644 (file)
@@ -10,8 +10,8 @@ struct nv50_fifo {
        int cur_runlist;
 };
 
-int nv50_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *,
-                  int index, struct nvkm_fifo **);
+int nv50_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                  struct nvkm_fifo **);
 
 void *nv50_fifo_dtor(struct nvkm_fifo *);
 int nv50_fifo_oneinit(struct nvkm_fifo *);
index 0ef8baab513e5ff4e8411da035d72b8994e53454..899272801a8bfd088a2c9347ff5bcbe17a295424 100644 (file)
@@ -4,8 +4,8 @@
 #define nvkm_fifo(p) container_of((p), struct nvkm_fifo, engine)
 #include <engine/fifo.h>
 
-int nvkm_fifo_ctor(const struct nvkm_fifo_func *, struct nvkm_device *,
-                  int index, int nr, struct nvkm_fifo *);
+int nvkm_fifo_ctor(const struct nvkm_fifo_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                  int nr, struct nvkm_fifo *);
 void nvkm_fifo_uevent(struct nvkm_fifo *);
 void nvkm_fifo_cevent(struct nvkm_fifo *);
 void nvkm_fifo_kevent(struct nvkm_fifo *, int chid);
@@ -23,6 +23,8 @@ struct nvkm_fifo_func {
        void (*fini)(struct nvkm_fifo *);
        void (*intr)(struct nvkm_fifo *);
        void (*fault)(struct nvkm_fifo *, struct nvkm_fault_data *);
+       int (*engine_id)(struct nvkm_fifo *, struct nvkm_engine *);
+       struct nvkm_engine *(*id_engine)(struct nvkm_fifo *, int engi);
        void (*pause)(struct nvkm_fifo *, unsigned long *);
        void (*start)(struct nvkm_fifo *, unsigned long *);
        void (*uevent_init)(struct nvkm_fifo *);
@@ -35,8 +37,13 @@ struct nvkm_fifo_func {
 };
 
 void nv04_fifo_intr(struct nvkm_fifo *);
+int nv04_fifo_engine_id(struct nvkm_fifo *, struct nvkm_engine *);
+struct nvkm_engine *nv04_fifo_id_engine(struct nvkm_fifo *, int);
 void nv04_fifo_pause(struct nvkm_fifo *, unsigned long *);
 void nv04_fifo_start(struct nvkm_fifo *, unsigned long *);
 
 void gf100_fifo_intr_fault(struct nvkm_fifo *, int);
+
+int gk104_fifo_engine_id(struct nvkm_fifo *, struct nvkm_engine *);
+struct nvkm_engine *gk104_fifo_id_engine(struct nvkm_fifo *, int);
 #endif
index 14e5b70e0255283e23acde11cc7006e44b40f883..e417044cc3474ba043a252ccc8689dfec3cb38c5 100644 (file)
@@ -278,7 +278,8 @@ tu102_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info)
        struct nvkm_engine *engine = NULL;
        struct nvkm_fifo_chan *chan;
        unsigned long flags;
-       char ct[8] = "HUB/", en[16] = "";
+       const char *en = "";
+       char ct[8] = "HUB/";
        int engn;
 
        er = nvkm_enum_find(fifo->func->fault.reason, info->reason);
@@ -303,25 +304,20 @@ tu102_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info)
                        nvkm_mask(device, 0x001718, 0x00000000, 0x00000000);
                        break;
                default:
-                       engine = nvkm_device_engine(device, ee->data2);
+                       engine = nvkm_device_engine(device, ee->data2, 0);
                        break;
                }
        }
 
        if (ee == NULL) {
-               enum nvkm_devidx engidx = nvkm_top_fault(device, info->engine);
-
-               if (engidx < NVKM_SUBDEV_NR) {
-                       const char *src = nvkm_subdev_name[engidx];
-                       char *dst = en;
-
-                       do {
-                               *dst++ = toupper(*src++);
-                       } while (*src);
-                       engine = nvkm_device_engine(device, engidx);
+               struct nvkm_subdev *subdev = nvkm_top_fault(device, info->engine);
+               if (subdev) {
+                       if (subdev->func == &nvkm_engine)
+                               engine = container_of(subdev, typeof(*engine), subdev);
+                       en = engine->subdev.name;
                }
        } else {
-               snprintf(en, sizeof(en), "%s", ee->name);
+               en = ee->name;
        }
 
        spin_lock_irqsave(&fifo->base.lock, flags);
@@ -456,6 +452,8 @@ tu102_fifo_ = {
        .fini = gk104_fifo_fini,
        .intr = tu102_fifo_intr,
        .fault = tu102_fifo_fault,
+       .engine_id = gk104_fifo_engine_id,
+       .id_engine = gk104_fifo_id_engine,
        .uevent_init = gk104_fifo_uevent_init,
        .uevent_fini = gk104_fifo_uevent_fini,
        .recover_chan = tu102_fifo_recover_chan,
@@ -464,7 +462,8 @@ tu102_fifo_ = {
 };
 
 int
-tu102_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
+tu102_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fifo **pfifo)
 {
        struct gk104_fifo *fifo;
 
@@ -474,5 +473,5 @@ tu102_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
        INIT_WORK(&fifo->recover.work, tu102_fifo_recover_work);
        *pfifo = &fifo->base;
 
-       return nvkm_fifo_ctor(&tu102_fifo_, device, index, 4096, &fifo->base);
+       return nvkm_fifo_ctor(&tu102_fifo_, device, type, inst, 4096, &fifo->base);
 }
index d41fb94524e948072b9048d4a432cecfbe34ed65..61759f54406e40a328cea3a05fdaa71a02f68af6 100644 (file)
@@ -175,8 +175,8 @@ nvkm_gr = {
 
 int
 nvkm_gr_ctor(const struct nvkm_gr_func *func, struct nvkm_device *device,
-            int index, bool enable, struct nvkm_gr *gr)
+            enum nvkm_subdev_type type, int inst, bool enable, struct nvkm_gr *gr)
 {
        gr->func = func;
-       return nvkm_engine_ctor(&nvkm_gr, device, index, enable, &gr->engine);
+       return nvkm_engine_ctor(&nvkm_gr, device, type, inst, enable, &gr->engine);
 }
index da1ba74682b4448955e4e81d0ffd2a48282c3f2b..65c332118fd66c6b1e0b71386a9a366cd7702d80 100644 (file)
@@ -192,7 +192,7 @@ g84_gr = {
 };
 
 int
-g84_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+g84_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv50_gr_new_(&g84_gr, device, index, pgr);
+       return nv50_gr_new_(&g84_gr, device, type, inst, pgr);
 }
index 749f73fc45a84224e932639fb72518e6a80639ae..397ff4fe9df89fac4b6b01d1e19a2c03409fc442 100644 (file)
@@ -2087,8 +2087,8 @@ gf100_gr_flcn = {
 };
 
 int
-gf100_gr_new_(const struct gf100_gr_fwif *fwif,
-             struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gf100_gr_new_(const struct gf100_gr_fwif *fwif, struct nvkm_device *device,
+             enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
        struct gf100_gr *gr;
        int ret;
@@ -2097,7 +2097,7 @@ gf100_gr_new_(const struct gf100_gr_fwif *fwif,
                return -ENOMEM;
        *pgr = &gr->base;
 
-       ret = nvkm_gr_ctor(&gf100_gr_, device, index, true, &gr->base);
+       ret = nvkm_gr_ctor(&gf100_gr_, device, type, inst, true, &gr->base);
        if (ret)
                return ret;
 
@@ -2483,7 +2483,7 @@ gf100_gr_fwif[] = {
 };
 
 int
-gf100_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gf100_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gf100_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gf100_gr_fwif, device, type, inst, pgr);
 }
index dfd5dd74f0d59d35ce4de4dc4d3fa550dd223ea5..c0038f906135567c64694cfa49d743f1cb5c1dcd 100644 (file)
@@ -416,6 +416,6 @@ void gm20b_gr_acr_bld_patch(struct nvkm_acr *, u32, s64);
 extern const struct nvkm_acr_lsf_func gp108_gr_gpccs_acr;
 extern const struct nvkm_acr_lsf_func gp108_gr_fecs_acr;
 
-int gf100_gr_new_(const struct gf100_gr_fwif *, struct nvkm_device *, int,
+int gf100_gr_new_(const struct gf100_gr_fwif *, struct nvkm_device *, enum nvkm_subdev_type, int,
                  struct nvkm_gr **);
 #endif
index 0536fe8b2b9258b0f32b049cadb6723ae57552d4..3acd99c306f201f80f97e854b166cf455c6758a6 100644 (file)
@@ -152,7 +152,7 @@ gf104_gr_fwif[] = {
 };
 
 int
-gf104_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gf104_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gf104_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gf104_gr_fwif, device, type, inst, pgr);
 }
index 14284b06112f7a2926a8a0ac46738d9d4ef22978..030640bb3dca073c4592dbb7502b3a100c83f907 100644 (file)
@@ -151,7 +151,7 @@ gf108_gr_fwif[] = {
 };
 
 int
-gf108_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gf108_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gf108_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gf108_gr_fwif, device, type, inst, pgr);
 }
index 280752551a3ad1853be03f1ba7e4cfb5bf0f1eef..616e2def1865f8ceae3819b00936c0852c42f18e 100644 (file)
@@ -127,7 +127,7 @@ gf110_gr_fwif[] = {
 };
 
 int
-gf110_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gf110_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gf110_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gf110_gr_fwif, device, type, inst, pgr);
 }
index 235c3fbe4b957b56ab41a2715ee0a4d9e4f60a1c..669e7536970e6142f015ec0a3d436316efc573fc 100644 (file)
@@ -192,7 +192,7 @@ gf117_gr_fwif[] = {
 };
 
 int
-gf117_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gf117_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gf117_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gf117_gr_fwif, device, type, inst, pgr);
 }
index 7eac385ece972c04c63d93859b0d1a4e6d1600e0..5b09bda8110c3539f1f8ed32f58337c2f4201309 100644 (file)
@@ -218,7 +218,7 @@ gf119_gr_fwif[] = {
 };
 
 int
-gf119_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gf119_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gf119_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gf119_gr_fwif, device, type, inst, pgr);
 }
index 89f51d76082bcc5e7b3a8bafca16e3edc7fa4130..b680eaa0f3502e2936080583edca7a3585b8ecd8 100644 (file)
@@ -497,7 +497,7 @@ gk104_gr_fwif[] = {
 };
 
 int
-gk104_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gk104_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gk104_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gk104_gr_fwif, device, type, inst, pgr);
 }
index 735f05e54d62af1714e820c0294ed6601dcc961a..103e06a77e658ca9f108c3fc0259043715a05138 100644 (file)
@@ -393,7 +393,7 @@ gk110_gr_fwif[] = {
 };
 
 int
-gk110_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gk110_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gk110_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gk110_gr_fwif, device, type, inst, pgr);
 }
index adc971be8f3b5c641670897ea80d50149b0a8096..034d0b11a17d451f88b04093d9680037cada8c77 100644 (file)
@@ -144,7 +144,8 @@ gk110b_gr_fwif[] = {
 };
 
 int
-gk110b_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gk110b_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gk110b_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gk110b_gr_fwif, device, type, inst, pgr);
 }
index aa0eff6795ac76b5d847421fbacd255b44d4df50..116d682f9f962523dfeb3fa1655de26115c6e7f1 100644 (file)
@@ -202,7 +202,7 @@ gk208_gr_fwif[] = {
 };
 
 int
-gk208_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gk208_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gk208_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gk208_gr_fwif, device, type, inst, pgr);
 }
index 6d4d7285161018a5e301787fd9c3a69456df086f..be0b2cefd8e8aad984946be55d8759cf0c364287 100644 (file)
@@ -357,7 +357,7 @@ gk20a_gr_fwif[] = {
 };
 
 int
-gk20a_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gk20a_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gk20a_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gk20a_gr_fwif, device, type, inst, pgr);
 }
index 09bb78ba9d0005c2ef5eb7d0a863e19b11094dbe..310987174cb566bdd27d50029c1a594e02834c8b 100644 (file)
@@ -437,7 +437,7 @@ gm107_gr_fwif[] = {
 };
 
 int
-gm107_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gm107_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gm107_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gm107_gr_fwif, device, type, inst, pgr);
 }
index 81513704751895594e3c40a918ef518bac40ef7b..5c38ff0fe7f9dde24985ea459b148b3750a1797b 100644 (file)
@@ -288,7 +288,7 @@ gm200_gr_fwif[] = {
 };
 
 int
-gm200_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gm200_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gm200_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gm200_gr_fwif, device, type, inst, pgr);
 }
index 1aab691fa71c9a25193e431b057c712ff08d08d3..ec1c46e47e00618f6e15f64b82481587b5caec48 100644 (file)
@@ -181,7 +181,7 @@ gm20b_gr_fwif[] = {
 };
 
 int
-gm20b_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gm20b_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gm20b_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gm20b_gr_fwif, device, type, inst, pgr);
 }
index ddba7ce937c7769833d406926cae82c451c53495..0550dd6f46f130a8d545cfd99fd26e86b2dd6709 100644 (file)
@@ -156,7 +156,7 @@ gp100_gr_fwif[] = {
 };
 
 int
-gp100_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gp100_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gp100_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gp100_gr_fwif, device, type, inst, pgr);
 }
index c083f3757ff74e5fda9c4a64520687a0da0a2b46..5b001f374be0b7992b8b819535b366abd058e5d1 100644 (file)
@@ -152,7 +152,7 @@ gp102_gr_fwif[] = {
 };
 
 int
-gp102_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gp102_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gp102_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gp102_gr_fwif, device, type, inst, pgr);
 }
index f6a31e9a8cc8be828055c43d7039f16118a2acab..2655574ec63b089faa27236127870e7e2d678e52 100644 (file)
@@ -93,7 +93,7 @@ gp104_gr_fwif[] = {
 };
 
 int
-gp104_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gp104_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gp104_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gp104_gr_fwif, device, type, inst, pgr);
 }
index 2c80c6a75b56f22e31b834b592badae16de32c3f..adabc04d4f3a96fdb27681c5f2ae2982503b8cc1 100644 (file)
@@ -82,7 +82,7 @@ gp107_gr_fwif[] = {
 };
 
 int
-gp107_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gp107_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gp107_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gp107_gr_fwif, device, type, inst, pgr);
 }
index 2be8f416dd6f8c09a7d8af0eb2a47c445847e38b..7310f0466bb70579aaa7af29fa10c2de670c9a79 100644 (file)
@@ -92,7 +92,7 @@ gp108_gr_fwif[] = {
 };
 
 int
-gp108_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gp108_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gp108_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gp108_gr_fwif, device, type, inst, pgr);
 }
index 6edc4bc7ed44cce28a7b616d77a432419af085b5..e13683b6e7b104022b8db3b6970be24aaf706509 100644 (file)
@@ -94,7 +94,7 @@ gp10b_gr_fwif[] = {
 };
 
 int
-gp10b_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gp10b_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gp10b_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gp10b_gr_fwif, device, type, inst, pgr);
 }
index c711a55ce392f3f8f37d70448d4a68c999253283..1dfc65d45b5223d1b015888ea002b461565c1b57 100644 (file)
@@ -43,7 +43,7 @@ gt200_gr = {
 };
 
 int
-gt200_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gt200_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv50_gr_new_(&gt200_gr, device, index, pgr);
+       return nv50_gr_new_(&gt200_gr, device, type, inst, pgr);
 }
index fa103df32ec755e796691bcbef16c7e8ac36f030..fcb5ead345a38407a0c53690a5acc2a19482af7b 100644 (file)
@@ -44,7 +44,7 @@ gt215_gr = {
 };
 
 int
-gt215_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gt215_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv50_gr_new_(&gt215_gr, device, index, pgr);
+       return nv50_gr_new_(&gt215_gr, device, type, inst, pgr);
 }
index 2189a8f4e644b8c88b19b434a603683103095ed0..4d043c1173eafa53f871ffee81d1f37885c161e1 100644 (file)
@@ -141,7 +141,7 @@ gv100_gr_fwif[] = {
 };
 
 int
-gv100_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+gv100_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(gv100_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(gv100_gr_fwif, device, type, inst, pgr);
 }
index eb1a90644752bb55da6531953bb069d638f35dae..cf782b64f62ef8c3b39e15731fbe716e0a8fb943 100644 (file)
@@ -42,7 +42,7 @@ mcp79_gr = {
 };
 
 int
-mcp79_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+mcp79_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv50_gr_new_(&mcp79_gr, device, index, pgr);
+       return nv50_gr_new_(&mcp79_gr, device, type, inst, pgr);
 }
index c91eb56e93279e9723659f9d4668c9934a2ff592..6f90a6395453c3ef8a4080d03b3a9a31a9ad6c89 100644 (file)
@@ -44,7 +44,7 @@ mcp89_gr = {
 };
 
 int
-mcp89_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+mcp89_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv50_gr_new_(&mcp89_gr, device, index, pgr);
+       return nv50_gr_new_(&mcp89_gr, device, type, inst, pgr);
 }
index 9c2e985dc079e9b142add0d32646ef554fc0ed85..0bc1a238de435f0485ba304196f1df31bf16c2e6 100644 (file)
@@ -1413,7 +1413,7 @@ nv04_gr = {
 };
 
 int
-nv04_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv04_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
        struct nv04_gr *gr;
 
@@ -1422,5 +1422,5 @@ nv04_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
        spin_lock_init(&gr->lock);
        *pgr = &gr->base;
 
-       return nvkm_gr_ctor(&nv04_gr, device, index, true, &gr->base);
+       return nvkm_gr_ctor(&nv04_gr, device, type, inst, true, &gr->base);
 }
index 4ebbfbdd8240455c2a17fa58ac650f668897ded6..942450b33bc60d73dcc931ee0bceb1c86ef02862 100644 (file)
@@ -1173,7 +1173,7 @@ nv10_gr_init(struct nvkm_gr *base)
 
 int
 nv10_gr_new_(const struct nvkm_gr_func *func, struct nvkm_device *device,
-            int index, struct nvkm_gr **pgr)
+            enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
        struct nv10_gr *gr;
 
@@ -1182,7 +1182,7 @@ nv10_gr_new_(const struct nvkm_gr_func *func, struct nvkm_device *device,
        spin_lock_init(&gr->lock);
        *pgr = &gr->base;
 
-       return nvkm_gr_ctor(func, device, index, true, &gr->base);
+       return nvkm_gr_ctor(func, device, type, inst, true, &gr->base);
 }
 
 static const struct nvkm_gr_func
@@ -1215,7 +1215,7 @@ nv10_gr = {
 };
 
 int
-nv10_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv10_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv10_gr_new_(&nv10_gr, device, index, pgr);
+       return nv10_gr_new_(&nv10_gr, device, type, inst, pgr);
 }
index 4327baea02af5722344bbb704e05f8e7617f8262..5cfe927c9123ea64999af16df0a839f37d74315b 100644 (file)
@@ -3,7 +3,7 @@
 #define __NV10_GR_H__
 #include "priv.h"
 
-int nv10_gr_new_(const struct nvkm_gr_func *, struct nvkm_device *, int index,
+int nv10_gr_new_(const struct nvkm_gr_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
                 struct nvkm_gr **);
 int nv10_gr_init(struct nvkm_gr *);
 void nv10_gr_intr(struct nvkm_gr *);
index 3e2c6856b4c4e4bb92a67c8d56b17e8df47b3ed6..69ece259df86580e69e46ab445ff08e99dbb483c 100644 (file)
@@ -53,7 +53,7 @@ nv15_gr = {
 };
 
 int
-nv15_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv15_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv10_gr_new_(&nv15_gr, device, index, pgr);
+       return nv10_gr_new_(&nv15_gr, device, type, inst, pgr);
 }
index 12437d085a7380da0944efca8872220b25613731..e39dfc7d407719de533b20824105820d7450ebe5 100644 (file)
@@ -53,7 +53,7 @@ nv17_gr = {
 };
 
 int
-nv17_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv17_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv10_gr_new_(&nv17_gr, device, index, pgr);
+       return nv10_gr_new_(&nv17_gr, device, type, inst, pgr);
 }
index d837630a362589892c28e3653533d55d9b10eed9..6bff10cee71b9e9ca307352c2b41bb44f3e76f66 100644 (file)
@@ -330,7 +330,7 @@ nv20_gr_dtor(struct nvkm_gr *base)
 
 int
 nv20_gr_new_(const struct nvkm_gr_func *func, struct nvkm_device *device,
-            int index, struct nvkm_gr **pgr)
+            enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
        struct nv20_gr *gr;
 
@@ -338,7 +338,7 @@ nv20_gr_new_(const struct nvkm_gr_func *func, struct nvkm_device *device,
                return -ENOMEM;
        *pgr = &gr->base;
 
-       return nvkm_gr_ctor(func, device, index, true, &gr->base);
+       return nvkm_gr_ctor(func, device, type, inst, true, &gr->base);
 }
 
 static const struct nvkm_gr_func
@@ -370,7 +370,7 @@ nv20_gr = {
 };
 
 int
-nv20_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv20_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv20_gr_new_(&nv20_gr, device, index, pgr);
+       return nv20_gr_new_(&nv20_gr, device, type, inst, pgr);
 }
index e57407a8a7c3b57724d58b652c06229d2cdd1286..c0d2be53413e0dbdde1c2c88d6fba624c4af3ac2 100644 (file)
@@ -9,8 +9,8 @@ struct nv20_gr {
        struct nvkm_memory *ctxtab;
 };
 
-int nv20_gr_new_(const struct nvkm_gr_func *, struct nvkm_device *,
-                int, struct nvkm_gr **);
+int nv20_gr_new_(const struct nvkm_gr_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                struct nvkm_gr **);
 void *nv20_gr_dtor(struct nvkm_gr *);
 int nv20_gr_oneinit(struct nvkm_gr *);
 int nv20_gr_init(struct nvkm_gr *);
index 32d29d3faee08dd368940662ab0a32be061936e3..f3a56f17d94aeda0b38b017dda83f9cf3126e617 100644 (file)
@@ -129,7 +129,7 @@ nv25_gr = {
 };
 
 int
-nv25_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv25_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv20_gr_new_(&nv25_gr, device, index, pgr);
+       return nv20_gr_new_(&nv25_gr, device, type, inst, pgr);
 }
index f941062c66f0d349e6b7a66b04d26af2be752620..f268d2642d2953e53fcf5d005b32a2a86060dd2d 100644 (file)
@@ -120,7 +120,7 @@ nv2a_gr = {
 };
 
 int
-nv2a_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv2a_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv20_gr_new_(&nv2a_gr, device, index, pgr);
+       return nv20_gr_new_(&nv2a_gr, device, type, inst, pgr);
 }
index 785ec956df0fb0c39c5703d2343a6a455772f474..e5737cdf2fa143f0d53b4dea0b3e591fefe07609 100644 (file)
@@ -194,7 +194,7 @@ nv30_gr = {
 };
 
 int
-nv30_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv30_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv20_gr_new_(&nv30_gr, device, index, pgr);
+       return nv20_gr_new_(&nv30_gr, device, type, inst, pgr);
 }
index bd610d75c6771b88976c6fdee977b02286090e44..1ab2da8ebf4eb2d3429fabd5069ebc27b88ecd50 100644 (file)
@@ -131,7 +131,7 @@ nv34_gr = {
 };
 
 int
-nv34_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv34_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv20_gr_new_(&nv34_gr, device, index, pgr);
+       return nv20_gr_new_(&nv34_gr, device, type, inst, pgr);
 }
index 89db7f523037411ffd80529533a660251804f4ff..591260f5676b76709dfb2f33abc30bfdbf8b0f89 100644 (file)
@@ -131,7 +131,7 @@ nv35_gr = {
 };
 
 int
-nv35_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv35_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv20_gr_new_(&nv35_gr, device, index, pgr);
+       return nv20_gr_new_(&nv35_gr, device, type, inst, pgr);
 }
index 5f1ad8344ea9d2c4b9f79c6eda0f11db1a5b5571..67f3535ff97e1b7b7cf6d3fffe088f66ba54d12d 100644 (file)
@@ -429,7 +429,7 @@ nv40_gr_init(struct nvkm_gr *base)
 
 int
 nv40_gr_new_(const struct nvkm_gr_func *func, struct nvkm_device *device,
-            int index, struct nvkm_gr **pgr)
+            enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
        struct nv40_gr *gr;
 
@@ -438,7 +438,7 @@ nv40_gr_new_(const struct nvkm_gr_func *func, struct nvkm_device *device,
        *pgr = &gr->base;
        INIT_LIST_HEAD(&gr->chan);
 
-       return nvkm_gr_ctor(func, device, index, true, &gr->base);
+       return nvkm_gr_ctor(func, device, type, inst, true, &gr->base);
 }
 
 static const struct nvkm_gr_func
@@ -470,7 +470,7 @@ nv40_gr = {
 };
 
 int
-nv40_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv40_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv40_gr_new_(&nv40_gr, device, index, pgr);
+       return nv40_gr_new_(&nv40_gr, device, type, inst, pgr);
 }
index e6128791b2d2df1b650acc8dd850f185546e307d..f3d3d3a5ae5b2a5eaab52c4e8bbc008e76d58fef 100644 (file)
@@ -10,7 +10,7 @@ struct nv40_gr {
        struct list_head chan;
 };
 
-int nv40_gr_new_(const struct nvkm_gr_func *, struct nvkm_device *, int index,
+int nv40_gr_new_(const struct nvkm_gr_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
                 struct nvkm_gr **);
 int nv40_gr_init(struct nvkm_gr *);
 void nv40_gr_intr(struct nvkm_gr *);
index 45ff80254eb404ea641d83e600aa72cda21a6357..22b6a38a703197d47e4b574cb562e4c3eb204f76 100644 (file)
@@ -102,7 +102,7 @@ nv44_gr = {
 };
 
 int
-nv44_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv44_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv40_gr_new_(&nv44_gr, device, index, pgr);
+       return nv40_gr_new_(&nv44_gr, device, type, inst, pgr);
 }
index df16ffda17491d29f6706de8208e56fdafaa68a8..563a10097e9530a6c6e15419ce4ac3f0f7661f02 100644 (file)
@@ -761,7 +761,7 @@ nv50_gr_init(struct nvkm_gr *base)
 
 int
 nv50_gr_new_(const struct nvkm_gr_func *func, struct nvkm_device *device,
-            int index, struct nvkm_gr **pgr)
+            enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
        struct nv50_gr *gr;
 
@@ -770,7 +770,7 @@ nv50_gr_new_(const struct nvkm_gr_func *func, struct nvkm_device *device,
        spin_lock_init(&gr->lock);
        *pgr = &gr->base;
 
-       return nvkm_gr_ctor(func, device, index, true, &gr->base);
+       return nvkm_gr_ctor(func, device, type, inst, true, &gr->base);
 }
 
 static const struct nvkm_gr_func
@@ -790,7 +790,7 @@ nv50_gr = {
 };
 
 int
-nv50_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+nv50_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return nv50_gr_new_(&nv50_gr, device, index, pgr);
+       return nv50_gr_new_(&nv50_gr, device, type, inst, pgr);
 }
index 465f4da0ddfc16dd7fe1d4f09775d80139b41eb7..84388c42e5c6882d4e41e0f79f8400258ae6e4d8 100644 (file)
@@ -11,7 +11,7 @@ struct nv50_gr {
        u32 size;
 };
 
-int nv50_gr_new_(const struct nvkm_gr_func *, struct nvkm_device *, int index,
+int nv50_gr_new_(const struct nvkm_gr_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
                 struct nvkm_gr **);
 int nv50_gr_init(struct nvkm_gr *);
 void nv50_gr_intr(struct nvkm_gr *);
index 3b30f24032cca49caf705bbf8bd6edae4c4d71cc..9b2c66e8be9092e730fbecbdd907c55712f821e6 100644 (file)
@@ -7,8 +7,8 @@
 struct nvkm_fb_tile;
 struct nvkm_fifo_chan;
 
-int nvkm_gr_ctor(const struct nvkm_gr_func *, struct nvkm_device *,
-                int index, bool enable, struct nvkm_gr *);
+int nvkm_gr_ctor(const struct nvkm_gr_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                bool enable, struct nvkm_gr *);
 
 bool nv04_gr_idle(struct nvkm_gr *);
 
index 6039f9948aa2d8f8770a801d42aaea9bd8d8dc0a..1a8a21844e12e0d3288133f534220e7ca4378c63 100644 (file)
@@ -198,7 +198,7 @@ tu102_gr_fwif[] = {
 };
 
 int
-tu102_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
+tu102_gr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_gr **pgr)
 {
-       return gf100_gr_new_(tu102_gr_fwif, device, index, pgr);
+       return gf100_gr_new_(tu102_gr_fwif, device, type, inst, pgr);
 }
index c0e11a071843b22470af3fd82119d3b4c96215e7..0fcc0ffa1e4095b2d45307546cf29fea3583712a 100644 (file)
@@ -37,7 +37,8 @@ g84_mpeg = {
 };
 
 int
-g84_mpeg_new(struct nvkm_device *device, int index, struct nvkm_engine **pmpeg)
+g84_mpeg_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_engine **pmpeg)
 {
-       return nvkm_engine_new_(&g84_mpeg, device, index, true, pmpeg);
+       return nvkm_engine_new_(&g84_mpeg, device, type, inst, true, pmpeg);
 }
index 7fea7d45202f1a7a2cee1996dd8b45b9c0dd38df..b1054db4c1b85370cd84bfc5207e65634bf05188 100644 (file)
@@ -274,7 +274,7 @@ nv31_mpeg_ = {
 
 int
 nv31_mpeg_new_(const struct nv31_mpeg_func *func, struct nvkm_device *device,
-              int index, struct nvkm_engine **pmpeg)
+              enum nvkm_subdev_type type, int inst, struct nvkm_engine **pmpeg)
 {
        struct nv31_mpeg *mpeg;
 
@@ -283,8 +283,7 @@ nv31_mpeg_new_(const struct nv31_mpeg_func *func, struct nvkm_device *device,
        mpeg->func = func;
        *pmpeg = &mpeg->engine;
 
-       return nvkm_engine_ctor(&nv31_mpeg_, device, index,
-                               true, &mpeg->engine);
+       return nvkm_engine_ctor(&nv31_mpeg_, device, type, inst, true, &mpeg->engine);
 }
 
 static const struct nv31_mpeg_func
@@ -293,7 +292,8 @@ nv31_mpeg = {
 };
 
 int
-nv31_mpeg_new(struct nvkm_device *device, int index, struct nvkm_engine **pmpeg)
+nv31_mpeg_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_engine **pmpeg)
 {
-       return nv31_mpeg_new_(&nv31_mpeg, device, index, pmpeg);
+       return nv31_mpeg_new_(&nv31_mpeg, device, type, inst, pmpeg);
 }
index b3e13153885896422470e712780ca09c649c3873..9f30aaaf809efdec566532445d37f50d0fea2e09 100644 (file)
@@ -11,8 +11,8 @@ struct nv31_mpeg {
        struct nv31_mpeg_chan *chan;
 };
 
-int nv31_mpeg_new_(const struct nv31_mpeg_func *, struct nvkm_device *,
-                  int index, struct nvkm_engine **);
+int nv31_mpeg_new_(const struct nv31_mpeg_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                  struct nvkm_engine **);
 
 struct nv31_mpeg_func {
        bool (*mthd_dma)(struct nvkm_device *, u32 mthd, u32 data);
index b5ec7c504dc64c5d0c85aff4c65ccdfced3c83fe..179167484ef1804f49d32fdb2b2e18ec49002886 100644 (file)
@@ -76,7 +76,8 @@ nv40_mpeg = {
 };
 
 int
-nv40_mpeg_new(struct nvkm_device *device, int index, struct nvkm_engine **pmpeg)
+nv40_mpeg_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_engine **pmpeg)
 {
-       return nv31_mpeg_new_(&nv40_mpeg, device, index, pmpeg);
+       return nv31_mpeg_new_(&nv40_mpeg, device, type, inst, pmpeg);
 }
index c3cf02ed468ea1ccf6212a5e9c42dbee00fa612e..521ce43a2871e7f576c80d9ad9966e6ed955b805 100644 (file)
@@ -203,7 +203,8 @@ nv44_mpeg = {
 };
 
 int
-nv44_mpeg_new(struct nvkm_device *device, int index, struct nvkm_engine **pmpeg)
+nv44_mpeg_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_engine **pmpeg)
 {
        struct nv44_mpeg *mpeg;
 
@@ -212,5 +213,5 @@ nv44_mpeg_new(struct nvkm_device *device, int index, struct nvkm_engine **pmpeg)
        INIT_LIST_HEAD(&mpeg->chan);
        *pmpeg = &mpeg->engine;
 
-       return nvkm_engine_ctor(&nv44_mpeg, device, index, true, &mpeg->engine);
+       return nvkm_engine_ctor(&nv44_mpeg, device, type, inst, true, &mpeg->engine);
 }
index 6df880a390193a2b22598bb022312ca96b216d0e..e6374f36961cda8489e6bacb77219876bf32ea42 100644 (file)
@@ -129,7 +129,8 @@ nv50_mpeg = {
 };
 
 int
-nv50_mpeg_new(struct nvkm_device *device, int index, struct nvkm_engine **pmpeg)
+nv50_mpeg_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_engine **pmpeg)
 {
-       return nvkm_engine_new_(&nv50_mpeg, device, index, true, pmpeg);
+       return nvkm_engine_new_(&nv50_mpeg, device, type, inst, true, pmpeg);
 }
index 80211f76093bdca030c29a0d044b71adc2402ca2..842fcfbd28b83815ad3984f3db75cafe11c6949d 100644 (file)
@@ -24,9 +24,8 @@
 #include "priv.h"
 
 int
-nvkm_mspdec_new_(const struct nvkm_falcon_func *func,
-                struct nvkm_device *device, int index,
-                struct nvkm_engine **pengine)
+nvkm_mspdec_new_(const struct nvkm_falcon_func *func, struct nvkm_device *device,
+                enum nvkm_subdev_type type, int inst, struct nvkm_engine **pengine)
 {
-       return nvkm_falcon_new_(func, device, index, true, 0x085000, pengine);
+       return nvkm_falcon_new_(func, device, type, inst, true, 0x085000, pengine);
 }
index f30cf1dcfb30b999bac4f9f5a864465046de167a..ecb06d68f544fa191dd635b041fe42a9a439a81d 100644 (file)
@@ -43,8 +43,8 @@ g98_mspdec = {
 };
 
 int
-g98_mspdec_new(struct nvkm_device *device, int index,
-            struct nvkm_engine **pengine)
+g98_mspdec_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_engine **pengine)
 {
-       return nvkm_mspdec_new_(&g98_mspdec, device, index, pengine);
+       return nvkm_mspdec_new_(&g98_mspdec, device, type, inst, pengine);
 }
index cfe1aa81bd144f503d0ca318e9c5d2279f8ef0f8..0a69bd767d698ef724701c8711cfae495dc66ead 100644 (file)
@@ -43,8 +43,8 @@ gf100_mspdec = {
 };
 
 int
-gf100_mspdec_new(struct nvkm_device *device, int index,
+gf100_mspdec_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_engine **pengine)
 {
-       return nvkm_mspdec_new_(&gf100_mspdec, device, index, pengine);
+       return nvkm_mspdec_new_(&gf100_mspdec, device, type, inst, pengine);
 }
index 24272b4927bcdf41a46a146a2e1f07bd316668e1..a08991dca4281cc67970ee0c255b8e67fe9b3111 100644 (file)
@@ -35,8 +35,8 @@ gk104_mspdec = {
 };
 
 int
-gk104_mspdec_new(struct nvkm_device *device, int index,
+gk104_mspdec_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_engine **pengine)
 {
-       return nvkm_mspdec_new_(&gk104_mspdec, device, index, pengine);
+       return nvkm_mspdec_new_(&gk104_mspdec, device, type, inst, pengine);
 }
index cf6e59ad6ee296dfab8de7a3e19ab3e3e3db6893..791fb03a32ad3a6488380e5287ddb346c229f128 100644 (file)
@@ -35,8 +35,8 @@ gt215_mspdec = {
 };
 
 int
-gt215_mspdec_new(struct nvkm_device *device, int index,
-            struct nvkm_engine **pengine)
+gt215_mspdec_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                struct nvkm_engine **pengine)
 {
-       return nvkm_mspdec_new_(&gt215_mspdec, device, index, pengine);
+       return nvkm_mspdec_new_(&gt215_mspdec, device, type, inst, pengine);
 }
index 86445a2600d0edc93f64aaa08c29189421ff8a69..2bc5537d40a3e777bfa19d1e0d029c732fc19052 100644 (file)
@@ -3,8 +3,8 @@
 #define __NVKM_MSPDEC_PRIV_H__
 #include <engine/mspdec.h>
 
-int nvkm_mspdec_new_(const struct nvkm_falcon_func *, struct nvkm_device *,
-                    int index, struct nvkm_engine **);
+int nvkm_mspdec_new_(const struct nvkm_falcon_func *, struct nvkm_device *, enum nvkm_subdev_type,
+                    int, struct nvkm_engine **);
 
 void g98_mspdec_init(struct nvkm_falcon *);
 
index bfae5e60e9259e88ffbf487e37e88f98d17de78a..45a9411ab2e28dd9c9d0e7046dd0334bf668aea0 100644 (file)
@@ -25,7 +25,7 @@
 
 int
 nvkm_msppp_new_(const struct nvkm_falcon_func *func, struct nvkm_device *device,
-               int index, struct nvkm_engine **pengine)
+               enum nvkm_subdev_type type, int inst, struct nvkm_engine **pengine)
 {
-       return nvkm_falcon_new_(func, device, index, true, 0x086000, pengine);
+       return nvkm_falcon_new_(func, device, type, inst, true, 0x086000, pengine);
 }
index c45dbf79d1f9d1977da44da1306b1dd52846da7b..160120b9bd641ee2c24b8da57da71183e2e538b7 100644 (file)
@@ -43,8 +43,8 @@ g98_msppp = {
 };
 
 int
-g98_msppp_new(struct nvkm_device *device, int index,
+g98_msppp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
              struct nvkm_engine **pengine)
 {
-       return nvkm_msppp_new_(&g98_msppp, device, index, pengine);
+       return nvkm_msppp_new_(&g98_msppp, device, type, inst, pengine);
 }
index 803c62ab516e107858f5c396e27c45be4755ce59..debed9ae873197c38a370ed922b612cc7776a7ce 100644 (file)
@@ -43,8 +43,8 @@ gf100_msppp = {
 };
 
 int
-gf100_msppp_new(struct nvkm_device *device, int index,
+gf100_msppp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_engine **pengine)
 {
-       return nvkm_msppp_new_(&gf100_msppp, device, index, pengine);
+       return nvkm_msppp_new_(&gf100_msppp, device, type, inst, pengine);
 }
index 49cbf72cee4bd6ac587317be85dd339551f33c20..a2fd736fef943adeed8650c4139b185c679f07d9 100644 (file)
@@ -35,8 +35,8 @@ gt215_msppp = {
 };
 
 int
-gt215_msppp_new(struct nvkm_device *device, int index,
-             struct nvkm_engine **pengine)
+gt215_msppp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+               struct nvkm_engine **pengine)
 {
-       return nvkm_msppp_new_(&gt215_msppp, device, index, pengine);
+       return nvkm_msppp_new_(&gt215_msppp, device, type, inst, pengine);
 }
index f20b10915db262600688e74f5e08fa49b4209ab2..582ab8ce14255072401b052f709996320c2ccbbb 100644 (file)
@@ -3,8 +3,8 @@
 #define __NVKM_MSPPP_PRIV_H__
 #include <engine/msppp.h>
 
-int nvkm_msppp_new_(const struct nvkm_falcon_func *, struct nvkm_device *,
-                   int index, struct nvkm_engine **);
+int nvkm_msppp_new_(const struct nvkm_falcon_func *, struct nvkm_device *, enum nvkm_subdev_type,
+                   int, struct nvkm_engine **);
 
 void g98_msppp_init(struct nvkm_falcon *);
 #endif
index 745bbb653dc0890540f34bd4d5ee1e3204545057..7be42b980e577dcb7e364da48eb20ad73113b3a7 100644 (file)
@@ -25,7 +25,7 @@
 
 int
 nvkm_msvld_new_(const struct nvkm_falcon_func *func, struct nvkm_device *device,
-               int index, struct nvkm_engine **pengine)
+               enum nvkm_subdev_type type, int inst, struct nvkm_engine **pengine)
 {
-       return nvkm_falcon_new_(func, device, index, true, 0x084000, pengine);
+       return nvkm_falcon_new_(func, device, type, inst, true, 0x084000, pengine);
 }
index 4a2a9f0494af8aa625903ca5a7531808089ea03f..cfa2065319a6617c74483be34cc94d1ffcb3cb45 100644 (file)
@@ -43,8 +43,8 @@ g98_msvld = {
 };
 
 int
-g98_msvld_new(struct nvkm_device *device, int index,
+g98_msvld_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
              struct nvkm_engine **pengine)
 {
-       return nvkm_msvld_new_(&g98_msvld, device, index, pengine);
+       return nvkm_msvld_new_(&g98_msvld, device, type, inst, pengine);
 }
index 1695e532c081f543fd3b0b7166188737e56804f4..8d58ad8e04d33460a15daaa916f92a89d9e434ec 100644 (file)
@@ -43,8 +43,8 @@ gf100_msvld = {
 };
 
 int
-gf100_msvld_new(struct nvkm_device *device, int index,
+gf100_msvld_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_engine **pengine)
 {
-       return nvkm_msvld_new_(&gf100_msvld, device, index, pengine);
+       return nvkm_msvld_new_(&gf100_msvld, device, type, inst, pengine);
 }
index b640cd63ebe8593f96bbb75503385e2090673c70..b28be28046f1e042705181d7ff2141c9d8a8f58e 100644 (file)
@@ -35,8 +35,8 @@ gk104_msvld = {
 };
 
 int
-gk104_msvld_new(struct nvkm_device *device, int index,
+gk104_msvld_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_engine **pengine)
 {
-       return nvkm_msvld_new_(&gk104_msvld, device, index, pengine);
+       return nvkm_msvld_new_(&gk104_msvld, device, type, inst, pengine);
 }
index 201e8ef3519ec0941f2c0dde67733e91aff76d79..d7489f972c997341e59a24cdc880908b55c47466 100644 (file)
@@ -35,8 +35,8 @@ gt215_msvld = {
 };
 
 int
-gt215_msvld_new(struct nvkm_device *device, int index,
-             struct nvkm_engine **pengine)
+gt215_msvld_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+               struct nvkm_engine **pengine)
 {
-       return nvkm_msvld_new_(&gt215_msvld, device, index, pengine);
+       return nvkm_msvld_new_(&gt215_msvld, device, type, inst, pengine);
 }
index a0f540ef257b8dbc418cc780f5644f0ca4bfc63e..16c30b62ab09985923a2af1b6273ce2c3c0c656b 100644 (file)
@@ -35,8 +35,8 @@ mcp89_msvld = {
 };
 
 int
-mcp89_msvld_new(struct nvkm_device *device, int index,
-             struct nvkm_engine **pengine)
+mcp89_msvld_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+               struct nvkm_engine **pengine)
 {
-       return nvkm_msvld_new_(&mcp89_msvld, device, index, pengine);
+       return nvkm_msvld_new_(&mcp89_msvld, device, type, inst, pengine);
 }
index 5cd1e83badbbb8656846144cefec7351570e1f83..f729d919b0540f7524e22bed810633b9792366d1 100644 (file)
@@ -3,8 +3,8 @@
 #define __NVKM_MSVLD_PRIV_H__
 #include <engine/msvld.h>
 
-int nvkm_msvld_new_(const struct nvkm_falcon_func *, struct nvkm_device *,
-                   int index, struct nvkm_engine **);
+int nvkm_msvld_new_(const struct nvkm_falcon_func *, struct nvkm_device *, enum nvkm_subdev_type,
+                   int, struct nvkm_engine **);
 
 void g98_msvld_init(struct nvkm_falcon *);
 
index 9b23c1b70ebfe07c9820e9976045b435b2cf33d8..b0181cc5953bc827a8477d360c7089925cd670ab 100644 (file)
@@ -37,7 +37,7 @@ nvkm_nvdec = {
 
 int
 nvkm_nvdec_new_(const struct nvkm_nvdec_fwif *fwif, struct nvkm_device *device,
-               int index, struct nvkm_nvdec **pnvdec)
+               enum nvkm_subdev_type type, int inst, struct nvkm_nvdec **pnvdec)
 {
        struct nvkm_nvdec *nvdec;
        int ret;
@@ -45,7 +45,7 @@ nvkm_nvdec_new_(const struct nvkm_nvdec_fwif *fwif, struct nvkm_device *device,
        if (!(nvdec = *pnvdec = kzalloc(sizeof(*nvdec), GFP_KERNEL)))
                return -ENOMEM;
 
-       ret = nvkm_engine_ctor(&nvkm_nvdec, device, index, true,
+       ret = nvkm_engine_ctor(&nvkm_nvdec, device, type, inst, true,
                               &nvdec->engine);
        if (ret)
                return ret;
@@ -57,5 +57,5 @@ nvkm_nvdec_new_(const struct nvkm_nvdec_fwif *fwif, struct nvkm_device *device,
        nvdec->func = fwif->func;
 
        return nvkm_falcon_ctor(nvdec->func->flcn, &nvdec->engine.subdev,
-                               nvkm_subdev_name[index], 0, &nvdec->falcon);
+                               nvdec->engine.subdev.name, 0, &nvdec->falcon);
 };
index 0ab27ab4d8ee6d94e3541bc9cfec475d1a5c792c..8c44ce44a6d7b45c70627ebb1a855c56db8a9189 100644 (file)
@@ -56,8 +56,8 @@ gm107_nvdec_fwif[] = {
 };
 
 int
-gm107_nvdec_new(struct nvkm_device *device, int index,
+gm107_nvdec_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_nvdec **pnvdec)
 {
-       return nvkm_nvdec_new_(gm107_nvdec_fwif, device, index, pnvdec);
+       return nvkm_nvdec_new_(gm107_nvdec_fwif, device, type, inst, pnvdec);
 }
index e14da8b000d02f815b6356756b982b1a06d4e4fd..0920f6a887e2a1f4b047507cb62dd00b678b7b44 100644 (file)
@@ -14,6 +14,6 @@ struct nvkm_nvdec_fwif {
        const struct nvkm_nvdec_func *func;
 };
 
-int nvkm_nvdec_new_(const struct nvkm_nvdec_fwif *fwif,
-                   struct nvkm_device *, int, struct nvkm_nvdec **);
+int nvkm_nvdec_new_(const struct nvkm_nvdec_fwif *fwif, struct nvkm_device *,
+                   enum nvkm_subdev_type, int, struct nvkm_nvdec **);
 #endif
index 484100e156680fcf0c05413d370e3077d810ba26..c39e797dc7c9425d7c9ceab5329ec681e0a5c162 100644 (file)
@@ -39,7 +39,7 @@ nvkm_nvenc = {
 
 int
 nvkm_nvenc_new_(const struct nvkm_nvenc_fwif *fwif, struct nvkm_device *device,
-               int index, struct nvkm_nvenc **pnvenc)
+               enum nvkm_subdev_type type, int inst, struct nvkm_nvenc **pnvenc)
 {
        struct nvkm_nvenc *nvenc;
        int ret;
@@ -47,7 +47,7 @@ nvkm_nvenc_new_(const struct nvkm_nvenc_fwif *fwif, struct nvkm_device *device,
        if (!(nvenc = *pnvenc = kzalloc(sizeof(*nvenc), GFP_KERNEL)))
                return -ENOMEM;
 
-       ret = nvkm_engine_ctor(&nvkm_nvenc, device, index, true,
+       ret = nvkm_engine_ctor(&nvkm_nvenc, device, type, inst, true,
                               &nvenc->engine);
        if (ret)
                return ret;
@@ -59,5 +59,5 @@ nvkm_nvenc_new_(const struct nvkm_nvenc_fwif *fwif, struct nvkm_device *device,
        nvenc->func = fwif->func;
 
        return nvkm_falcon_ctor(nvenc->func->flcn, &nvenc->engine.subdev,
-                               nvkm_subdev_name[index], 0, &nvenc->falcon);
+                               nvenc->engine.subdev.name, 0, &nvenc->falcon);
 };
index d249c8ffb2d5c3b9374b1b1eb98a2ef32f0ad795..f44d41bf203409462743e48751a6b6d41216cc84 100644 (file)
@@ -56,8 +56,8 @@ gm107_nvenc_fwif[] = {
 };
 
 int
-gm107_nvenc_new(struct nvkm_device *device, int index,
+gm107_nvenc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_nvenc **pnvenc)
 {
-       return nvkm_nvenc_new_(gm107_nvenc_fwif, device, index, pnvenc);
+       return nvkm_nvenc_new_(gm107_nvenc_fwif, device, type, inst, pnvenc);
 }
index 100fa5ebbeefad4e93c6d70f899d4bda92dc3521..4130a2bfbb4f79b060eae00eb552f26a26a058d9 100644 (file)
@@ -14,6 +14,6 @@ struct nvkm_nvenc_fwif {
        const struct nvkm_nvenc_func *func;
 };
 
-int nvkm_nvenc_new_(const struct nvkm_nvenc_fwif *, struct nvkm_device *,
+int nvkm_nvenc_new_(const struct nvkm_nvenc_fwif *, struct nvkm_device *, enum nvkm_subdev_type,
                    int, struct nvkm_nvenc **pnvenc);
 #endif
index b2785bee418efdfc239bf5e30df43f3e8b4b7a5f..8fe0444f761e5aa4fff4175d5ff96a9b418a479e 100644 (file)
@@ -628,10 +628,10 @@ nvkm_perfmon_dtor(struct nvkm_object *object)
 {
        struct nvkm_perfmon *perfmon = nvkm_perfmon(object);
        struct nvkm_pm *pm = perfmon->pm;
-       mutex_lock(&pm->engine.subdev.mutex);
-       if (pm->perfmon == &perfmon->object)
-               pm->perfmon = NULL;
-       mutex_unlock(&pm->engine.subdev.mutex);
+       spin_lock(&pm->client.lock);
+       if (pm->client.object == &perfmon->object)
+               pm->client.object = NULL;
+       spin_unlock(&pm->client.lock);
        return perfmon;
 }
 
@@ -671,11 +671,11 @@ nvkm_pm_oclass_new(struct nvkm_device *device, const struct nvkm_oclass *oclass,
        if (ret)
                return ret;
 
-       mutex_lock(&pm->engine.subdev.mutex);
-       if (pm->perfmon == NULL)
-               pm->perfmon = *pobject;
-       ret = (pm->perfmon == *pobject) ? 0 : -EBUSY;
-       mutex_unlock(&pm->engine.subdev.mutex);
+       spin_lock(&pm->client.lock);
+       if (pm->client.object == NULL)
+               pm->client.object = *pobject;
+       ret = (pm->client.object == *pobject) ? 0 : -EBUSY;
+       spin_unlock(&pm->client.lock);
        return ret;
 }
 
@@ -858,10 +858,11 @@ nvkm_pm = {
 
 int
 nvkm_pm_ctor(const struct nvkm_pm_func *func, struct nvkm_device *device,
-            int index, struct nvkm_pm *pm)
+            enum nvkm_subdev_type type, int inst, struct nvkm_pm *pm)
 {
        pm->func = func;
        INIT_LIST_HEAD(&pm->domains);
        INIT_LIST_HEAD(&pm->sources);
-       return nvkm_engine_ctor(&nvkm_pm, device, index, true, &pm->engine);
+       spin_lock_init(&pm->client.lock);
+       return nvkm_engine_ctor(&nvkm_pm, device, type, inst, true, &pm->engine);
 }
index 6e441ddafd86fdea39feec0967fed4755cc1c998..0086d00eb16230b009fa0706cd4dc199f139c05b 100644 (file)
@@ -159,7 +159,7 @@ g84_pm[] = {
 };
 
 int
-g84_pm_new(struct nvkm_device *device, int index, struct nvkm_pm **ppm)
+g84_pm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_pm **ppm)
 {
-       return nv40_pm_new_(g84_pm, device, index, ppm);
+       return nv40_pm_new_(g84_pm, device, type, inst, ppm);
 }
index fe2532ee4145b33effa772d583426dcd646eb39d..8e02701def8e8e3d43b1ef57134e01f78ad8a6f7 100644 (file)
@@ -187,7 +187,7 @@ gf100_pm_ = {
 
 int
 gf100_pm_new_(const struct gf100_pm_func *func, struct nvkm_device *device,
-             int index, struct nvkm_pm **ppm)
+             enum nvkm_subdev_type type, int inst, struct nvkm_pm **ppm)
 {
        struct nvkm_pm *pm;
        u32 mask;
@@ -196,7 +196,7 @@ gf100_pm_new_(const struct gf100_pm_func *func, struct nvkm_device *device,
        if (!(pm = *ppm = kzalloc(sizeof(*pm), GFP_KERNEL)))
                return -ENOMEM;
 
-       ret = nvkm_pm_ctor(&gf100_pm_, device, index, pm);
+       ret = nvkm_pm_ctor(&gf100_pm_, device, type, inst, pm);
        if (ret)
                return ret;
 
@@ -237,7 +237,7 @@ gf100_pm = {
 };
 
 int
-gf100_pm_new(struct nvkm_device *device, int index, struct nvkm_pm **ppm)
+gf100_pm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_pm **ppm)
 {
-       return gf100_pm_new_(&gf100_pm, device, index, ppm);
+       return gf100_pm_new_(&gf100_pm, device, type, inst, ppm);
 }
index 461bb219b1c0fb64eb7614c3a19d58f00004217d..bc4b014c4e8ebbaae1a6c094067d681b041c75a9 100644 (file)
@@ -9,8 +9,8 @@ struct gf100_pm_func {
        const struct nvkm_specdom *doms_part;
 };
 
-int gf100_pm_new_(const struct gf100_pm_func *, struct nvkm_device *,
-                 int index, struct nvkm_pm **);
+int gf100_pm_new_(const struct gf100_pm_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                 struct nvkm_pm **);
 
 extern const struct nvkm_funcdom gf100_perfctr_func;
 extern const struct nvkm_specdom gf100_pm_gpc[];
index 49b24c98a7f7fd221b4f7c0ea35e6f7ca47683ae..505565866b5911d518e5a546d888879a6b92d94a 100644 (file)
@@ -60,7 +60,7 @@ gf108_pm = {
 };
 
 int
-gf108_pm_new(struct nvkm_device *device, int index, struct nvkm_pm **ppm)
+gf108_pm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_pm **ppm)
 {
-       return gf100_pm_new_(&gf108_pm, device, index, ppm);
+       return gf100_pm_new_(&gf108_pm, device, type, inst, ppm);
 }
index 9170025fc9887da8aab814d56c89c0208079dc5b..c61e8c010bb3a9a2df879438166a6285171dc3d8 100644 (file)
@@ -74,7 +74,7 @@ gf117_pm = {
 };
 
 int
-gf117_pm_new(struct nvkm_device *device, int index, struct nvkm_pm **ppm)
+gf117_pm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_pm **ppm)
 {
-       return gf100_pm_new_(&gf117_pm, device, index, ppm);
+       return gf100_pm_new_(&gf117_pm, device, type, inst, ppm);
 }
index 07f946d26ac6c5b68d54fd2fcb541aebe049a769..75bf3df1cb186e75a2648895f0edd39fe5ca0089 100644 (file)
@@ -178,7 +178,7 @@ gk104_pm = {
 };
 
 int
-gk104_pm_new(struct nvkm_device *device, int index, struct nvkm_pm **ppm)
+gk104_pm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_pm **ppm)
 {
-       return gf100_pm_new_(&gk104_pm, device, index, ppm);
+       return gf100_pm_new_(&gk104_pm, device, type, inst, ppm);
 }
index 5cf5dd536fd0fec9ebd1ccf00ed813188e28e78d..25874c5414865508dc17c9d55969541eef9f8d72 100644 (file)
@@ -151,7 +151,7 @@ gt200_pm[] = {
 };
 
 int
-gt200_pm_new(struct nvkm_device *device, int index, struct nvkm_pm **ppm)
+gt200_pm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_pm **ppm)
 {
-       return nv40_pm_new_(gt200_pm, device, index, ppm);
+       return nv40_pm_new_(gt200_pm, device, type, inst, ppm);
 }
index c9227ad41b04bf3a0ceebda93fd5345ca3a89eee..54c23e2b6645f367fd0113a8b60e656ac9b76198 100644 (file)
@@ -132,7 +132,7 @@ gt215_pm[] = {
 };
 
 int
-gt215_pm_new(struct nvkm_device *device, int index, struct nvkm_pm **ppm)
+gt215_pm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_pm **ppm)
 {
-       return nv40_pm_new_(gt215_pm, device, index, ppm);
+       return nv40_pm_new_(gt215_pm, device, type, inst, ppm);
 }
index 3fda594700e023f71d3cc5b885ef80232e4873d9..eba5b3b79340455246ac812d756cc978a15596c6 100644 (file)
@@ -80,7 +80,7 @@ nv40_pm_ = {
 
 int
 nv40_pm_new_(const struct nvkm_specdom *doms, struct nvkm_device *device,
-            int index, struct nvkm_pm **ppm)
+            enum nvkm_subdev_type type, int inst, struct nvkm_pm **ppm)
 {
        struct nv40_pm *pm;
        int ret;
@@ -89,7 +89,7 @@ nv40_pm_new_(const struct nvkm_specdom *doms, struct nvkm_device *device,
                return -ENOMEM;
        *ppm = &pm->base;
 
-       ret = nvkm_pm_ctor(&nv40_pm_, device, index, &pm->base);
+       ret = nvkm_pm_ctor(&nv40_pm_, device, type, inst, &pm->base);
        if (ret)
                return ret;
 
@@ -117,7 +117,7 @@ nv40_pm[] = {
 };
 
 int
-nv40_pm_new(struct nvkm_device *device, int index, struct nvkm_pm **ppm)
+nv40_pm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_pm **ppm)
 {
-       return nv40_pm_new_(nv40_pm, device, index, ppm);
+       return nv40_pm_new_(nv40_pm, device, type, inst, ppm);
 }
index 8ed19320fda10f9acb001c3bd6f01fa02678342a..afb79843723d95a889ab45ddc91e233905a10e70 100644 (file)
@@ -9,7 +9,7 @@ struct nv40_pm {
        u32 sequence;
 };
 
-int nv40_pm_new_(const struct nvkm_specdom *, struct nvkm_device *,
-                int index, struct nvkm_pm **);
+int nv40_pm_new_(const struct nvkm_specdom *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                struct nvkm_pm **);
 extern const struct nvkm_funcdom nv40_perfctr_func;
 #endif
index cc5a41d4c6f226a6ed55a440db1b8915d2918080..bbd3404901f95351b28d0552aafe4ad126909a8a 100644 (file)
@@ -169,7 +169,7 @@ nv50_pm[] = {
 };
 
 int
-nv50_pm_new(struct nvkm_device *device, int index, struct nvkm_pm **ppm)
+nv50_pm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_pm **ppm)
 {
-       return nv40_pm_new_(nv50_pm, device, index, ppm);
+       return nv40_pm_new_(nv50_pm, device, type, inst, ppm);
 }
index cd6f8f79b235fe81a30c6a3e8b6bf7852fe3395e..6ae25d3e7f45c814759f8881827550dd80bde39a 100644 (file)
@@ -4,8 +4,8 @@
 #define nvkm_pm(p) container_of((p), struct nvkm_pm, engine)
 #include <engine/pm.h>
 
-int nvkm_pm_ctor(const struct nvkm_pm_func *, struct nvkm_device *,
-                int index, struct nvkm_pm *);
+int nvkm_pm_ctor(const struct nvkm_pm_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                struct nvkm_pm *);
 
 struct nvkm_pm_func {
        void (*fini)(struct nvkm_pm *);
index 6d2a7f0afbb55d8bed5add0641a0f1a6c7cb5f37..1b87df03c8235fc729a81acf17140cf63841a332 100644 (file)
@@ -74,9 +74,8 @@ g98_sec = {
 };
 
 int
-g98_sec_new(struct nvkm_device *device, int index,
+g98_sec_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
            struct nvkm_engine **pengine)
 {
-       return nvkm_falcon_new_(&g98_sec, device, index,
-                               true, 0x087000, pengine);
+       return nvkm_falcon_new_(&g98_sec, device, type, inst, true, 0x087000, pengine);
 }
index 41318aa0d481db2ab31a7e481dd1ddeede400824..092c6d0b8e01e172260f7a9ac2ce0a4f6e5d6cdf 100644 (file)
@@ -85,7 +85,7 @@ nvkm_sec2 = {
 
 int
 nvkm_sec2_new_(const struct nvkm_sec2_fwif *fwif, struct nvkm_device *device,
-              int index, u32 addr, struct nvkm_sec2 **psec2)
+              enum nvkm_subdev_type type, int inst, u32 addr, struct nvkm_sec2 **psec2)
 {
        struct nvkm_sec2 *sec2;
        int ret;
@@ -93,7 +93,7 @@ nvkm_sec2_new_(const struct nvkm_sec2_fwif *fwif, struct nvkm_device *device,
        if (!(sec2 = *psec2 = kzalloc(sizeof(*sec2), GFP_KERNEL)))
                return -ENOMEM;
 
-       ret = nvkm_engine_ctor(&nvkm_sec2, device, index, true, &sec2->engine);
+       ret = nvkm_engine_ctor(&nvkm_sec2, device, type, inst, true, &sec2->engine);
        if (ret)
                return ret;
 
@@ -104,7 +104,7 @@ nvkm_sec2_new_(const struct nvkm_sec2_fwif *fwif, struct nvkm_device *device,
        sec2->func = fwif->func;
 
        ret = nvkm_falcon_ctor(sec2->func->flcn, &sec2->engine.subdev,
-                              nvkm_subdev_name[index], addr, &sec2->falcon);
+                              sec2->engine.subdev.name, addr, &sec2->falcon);
        if (ret)
                return ret;
 
index bccf7acb7f98e772699b54454f33bb3d3a3360dc..44e39f5743d59f8ae1b1724c2ca40944ca1080c5 100644 (file)
@@ -343,7 +343,8 @@ gp102_sec2_fwif[] = {
 };
 
 int
-gp102_sec2_new(struct nvkm_device *device, int index, struct nvkm_sec2 **psec2)
+gp102_sec2_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_sec2 **psec2)
 {
-       return nvkm_sec2_new_(gp102_sec2_fwif, device, index, 0, psec2);
+       return nvkm_sec2_new_(gp102_sec2_fwif, device, type, inst, 0, psec2);
 }
index e770c9497871bc09086f2b4a7f5ddefe688c2327..3e9f5c842f3c5ff876f58211c3395682ab52a42d 100644 (file)
@@ -36,7 +36,8 @@ gp108_sec2_fwif[] = {
 };
 
 int
-gp108_sec2_new(struct nvkm_device *device, int index, struct nvkm_sec2 **psec2)
+gp108_sec2_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_sec2 **psec2)
 {
-       return nvkm_sec2_new_(gp108_sec2_fwif, device, index, 0, psec2);
+       return nvkm_sec2_new_(gp108_sec2_fwif, device, type, inst, 0, psec2);
 }
index 8cbc0b7d0a2752e0485b4831905e333b79e7566f..af19229e885dd1edb9a890cd2d74fe3319366bc7 100644 (file)
@@ -25,6 +25,6 @@ int gp102_sec2_load(struct nvkm_sec2 *, int, const struct nvkm_sec2_fwif *);
 extern const struct nvkm_sec2_func gp102_sec2;
 extern const struct nvkm_acr_lsf_func gp102_sec2_acr_1;
 
-int nvkm_sec2_new_(const struct nvkm_sec2_fwif *, struct nvkm_device *,
+int nvkm_sec2_new_(const struct nvkm_sec2_fwif *, struct nvkm_device *, enum nvkm_subdev_type,
                   int, u32 addr, struct nvkm_sec2 **);
 #endif
index a231c1c6c0a5ef1db04268918425dd87f0676601..f3faeb70557559049a111727e1a01edc4e0abfba 100644 (file)
@@ -72,10 +72,11 @@ tu102_sec2_fwif[] = {
 };
 
 int
-tu102_sec2_new(struct nvkm_device *device, int index, struct nvkm_sec2 **psec2)
+tu102_sec2_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_sec2 **psec2)
 {
        /* TOP info wasn't updated on Turing to reflect the PRI
         * address change for some reason.  We override it here.
         */
-       return nvkm_sec2_new_(tu102_sec2_fwif, device, index, 0x840000, psec2);
+       return nvkm_sec2_new_(tu102_sec2_fwif, device, type, inst, 0x840000, psec2);
 }
index 7be3198e11de402e413083729cacbda3f51181f7..14871d0bd74630e4f98ba6f287c81488c35c1513 100644 (file)
@@ -97,7 +97,7 @@ nvkm_sw = {
 
 int
 nvkm_sw_new_(const struct nvkm_sw_func *func, struct nvkm_device *device,
-            int index, struct nvkm_sw **psw)
+            enum nvkm_subdev_type type, int inst, struct nvkm_sw **psw)
 {
        struct nvkm_sw *sw;
 
@@ -106,5 +106,5 @@ nvkm_sw_new_(const struct nvkm_sw_func *func, struct nvkm_device *device,
        INIT_LIST_HEAD(&sw->chan);
        sw->func = func;
 
-       return nvkm_engine_ctor(&nvkm_sw, device, index, true, &sw->engine);
+       return nvkm_engine_ctor(&nvkm_sw, device, type, inst, true, &sw->engine);
 }
index ea8f4247b628d4acfe97c5b7494a51822f970c27..55abf839f29d5cd66050f4daf81d86233a3221c6 100644 (file)
@@ -149,7 +149,7 @@ gf100_sw = {
 };
 
 int
-gf100_sw_new(struct nvkm_device *device, int index, struct nvkm_sw **psw)
+gf100_sw_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_sw **psw)
 {
-       return nvkm_sw_new_(&gf100_sw, device, index, psw);
+       return nvkm_sw_new_(&gf100_sw, device, type, inst, psw);
 }
index b6675fe1b0ce97876e567595c312a9f1aff032a4..4aa57573869c95b5152b07a82412594f65931123 100644 (file)
@@ -133,7 +133,7 @@ nv04_sw = {
 };
 
 int
-nv04_sw_new(struct nvkm_device *device, int index, struct nvkm_sw **psw)
+nv04_sw_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_sw **psw)
 {
-       return nvkm_sw_new_(&nv04_sw, device, index, psw);
+       return nvkm_sw_new_(&nv04_sw, device, type, inst, psw);
 }
index 09d22fcd194c0cf3b036e0da0524206e1264a693..e79e640ae535feb0606db25b75704dcb49a496eb 100644 (file)
@@ -62,7 +62,7 @@ nv10_sw = {
 };
 
 int
-nv10_sw_new(struct nvkm_device *device, int index, struct nvkm_sw **psw)
+nv10_sw_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_sw **psw)
 {
-       return nvkm_sw_new_(&nv10_sw, device, index, psw);
+       return nvkm_sw_new_(&nv10_sw, device, type, inst, psw);
 }
index 01573d187f2c66aac93139d6ecd7c06b5decc800..1fdd094c8b7e518a059943c9d50def310cc58129 100644 (file)
@@ -142,7 +142,7 @@ nv50_sw = {
 };
 
 int
-nv50_sw_new(struct nvkm_device *device, int index, struct nvkm_sw **psw)
+nv50_sw_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_sw **psw)
 {
-       return nvkm_sw_new_(&nv50_sw, device, index, psw);
+       return nvkm_sw_new_(&nv50_sw, device, type, inst, psw);
 }
index 6d18fc6180f2904cf58ea3ea9c2140ebbb1b0f45..d9d83b1b884955e1916b3a479456f037b7540893 100644 (file)
@@ -5,8 +5,8 @@
 #include <engine/sw.h>
 struct nvkm_sw_chan;
 
-int nvkm_sw_new_(const struct nvkm_sw_func *, struct nvkm_device *,
-                int index, struct nvkm_sw **);
+int nvkm_sw_new_(const struct nvkm_sw_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                struct nvkm_sw **);
 
 struct nvkm_sw_chan_sclass {
        int (*ctor)(struct nvkm_sw_chan *, const struct nvkm_oclass *,
index 7a96178786c4ca6a90bccc3bbd6ba86318801c63..b502266c76fd963f24458ecd6851bce5a234a0c2 100644 (file)
@@ -36,8 +36,8 @@ g84_vp = {
 };
 
 int
-g84_vp_new(struct nvkm_device *device, int index, struct nvkm_engine **pengine)
+g84_vp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+          struct nvkm_engine **pengine)
 {
-       return nvkm_xtensa_new_(&g84_vp, device, index,
-                               true, 0x00f000, pengine);
+       return nvkm_xtensa_new_(&g84_vp, device, type, inst, true, 0x00f000, pengine);
 }
index 70549381e082833ffcf4489c22d6c778babf5b6e..f7d3ba0afb556495979eced21bb8137bd6dbe737 100644 (file)
@@ -175,9 +175,9 @@ nvkm_xtensa = {
 };
 
 int
-nvkm_xtensa_new_(const struct nvkm_xtensa_func *func,
-                struct nvkm_device *device, int index, bool enable,
-                u32 addr, struct nvkm_engine **pengine)
+nvkm_xtensa_new_(const struct nvkm_xtensa_func *func, struct nvkm_device *device,
+                enum nvkm_subdev_type type, int inst, bool enable, u32 addr,
+                struct nvkm_engine **pengine)
 {
        struct nvkm_xtensa *xtensa;
 
@@ -187,6 +187,5 @@ nvkm_xtensa_new_(const struct nvkm_xtensa_func *func,
        xtensa->addr = addr;
        *pengine = &xtensa->engine;
 
-       return nvkm_engine_ctor(&nvkm_xtensa, device, index,
-                               enable, &xtensa->engine);
+       return nvkm_engine_ctor(&nvkm_xtensa, device, type, inst, enable, &xtensa->engine);
 }
index c6a3448180d6fdb9102026bbbd17bffad1ca1775..262641a014b066ff346f888f889006f83aa0ecce 100644 (file)
@@ -88,13 +88,12 @@ int
 nvkm_falcon_enable(struct nvkm_falcon *falcon)
 {
        struct nvkm_device *device = falcon->owner->device;
-       enum nvkm_devidx id = falcon->owner->index;
        int ret;
 
-       nvkm_mc_enable(device, id);
+       nvkm_mc_enable(device, falcon->owner->type, falcon->owner->inst);
        ret = falcon->func->enable(falcon);
        if (ret) {
-               nvkm_mc_disable(device, id);
+               nvkm_mc_disable(device, falcon->owner->type, falcon->owner->inst);
                return ret;
        }
 
@@ -105,15 +104,14 @@ void
 nvkm_falcon_disable(struct nvkm_falcon *falcon)
 {
        struct nvkm_device *device = falcon->owner->device;
-       enum nvkm_devidx id = falcon->owner->index;
 
        /* already disabled, return or wait_idle will timeout */
-       if (!nvkm_mc_enabled(device, id))
+       if (!nvkm_mc_enabled(device, falcon->owner->type, falcon->owner->inst))
                return;
 
        falcon->func->disable(falcon);
 
-       nvkm_mc_disable(device, id);
+       nvkm_mc_disable(device, falcon->owner->type, falcon->owner->inst);
 }
 
 int
@@ -143,7 +141,7 @@ nvkm_falcon_oneinit(struct nvkm_falcon *falcon)
        u32 reg;
 
        if (!falcon->addr) {
-               falcon->addr = nvkm_top_addr(subdev->device, subdev->index);
+               falcon->addr = nvkm_top_addr(subdev->device, subdev->type, subdev->inst);
                if (WARN_ON(!falcon->addr))
                        return -ENODEV;
        }
@@ -188,7 +186,7 @@ nvkm_falcon_get(struct nvkm_falcon *falcon, const struct nvkm_subdev *user)
        mutex_lock(&falcon->mutex);
        if (falcon->user) {
                nvkm_error(user, "%s falcon already acquired by %s!\n",
-                          falcon->name, nvkm_subdev_name[falcon->user->index]);
+                          falcon->name, falcon->user->name);
                mutex_unlock(&falcon->mutex);
                return -EBUSY;
        }
index fb4fff1222afea261c23ade9b13dd95f44f7ddb4..2cb24fff7e321585ea48923335aac8cfd00c3ab9 100644 (file)
@@ -11,7 +11,6 @@ include $(src)/nvkm/subdev/fuse/Kbuild
 include $(src)/nvkm/subdev/gpio/Kbuild
 include $(src)/nvkm/subdev/gsp/Kbuild
 include $(src)/nvkm/subdev/i2c/Kbuild
-include $(src)/nvkm/subdev/ibus/Kbuild
 include $(src)/nvkm/subdev/iccsense/Kbuild
 include $(src)/nvkm/subdev/instmem/Kbuild
 include $(src)/nvkm/subdev/ltc/Kbuild
@@ -20,6 +19,7 @@ include $(src)/nvkm/subdev/mmu/Kbuild
 include $(src)/nvkm/subdev/mxm/Kbuild
 include $(src)/nvkm/subdev/pci/Kbuild
 include $(src)/nvkm/subdev/pmu/Kbuild
+include $(src)/nvkm/subdev/privring/Kbuild
 include $(src)/nvkm/subdev/therm/Kbuild
 include $(src)/nvkm/subdev/timer/Kbuild
 include $(src)/nvkm/subdev/top/Kbuild
index c962df9910dd46a71658a23ce7cb6b586392ed12..af6cac696d434c8ac3785427940c477e97408b1a 100644 (file)
@@ -410,14 +410,14 @@ nvkm_acr_ctor_wpr(struct nvkm_acr *acr, int ver)
 
 int
 nvkm_acr_new_(const struct nvkm_acr_fwif *fwif, struct nvkm_device *device,
-             int index, struct nvkm_acr **pacr)
+             enum nvkm_subdev_type type, int inst, struct nvkm_acr **pacr)
 {
        struct nvkm_acr *acr;
        long wprfw;
 
        if (!(acr = *pacr = kzalloc(sizeof(*acr), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&nvkm_acr, device, index, &acr->subdev);
+       nvkm_subdev_ctor(&nvkm_acr, device, type, inst, &acr->subdev);
        INIT_LIST_HEAD(&acr->hsfw);
        INIT_LIST_HEAD(&acr->lsfw);
        INIT_LIST_HEAD(&acr->hsf);
index cd41b2e6cc8795feca6152c8188028be96163d22..cdb1ead26d84f0efb0076ef775dfb77b6b757675 100644 (file)
@@ -262,7 +262,7 @@ gm200_acr_hsfw_boot(struct nvkm_acr *acr, struct nvkm_acr_hsf *hsf,
        hsf->func->bld(acr, hsf);
 
        /* Boot the falcon. */
-       nvkm_mc_intr_mask(device, falcon->owner->index, false);
+       nvkm_mc_intr_mask(device, falcon->owner->type, falcon->owner->inst, false);
 
        nvkm_falcon_wr32(falcon, 0x040, 0xdeada5a5);
        nvkm_falcon_set_start_addr(falcon, hsf->imem_tag << 8);
@@ -279,7 +279,7 @@ gm200_acr_hsfw_boot(struct nvkm_acr *acr, struct nvkm_acr_hsf *hsf,
                return -EIO;
 
        nvkm_falcon_clear_interrupt(falcon, intr_clear);
-       nvkm_mc_intr_mask(device, falcon->owner->index, true);
+       nvkm_mc_intr_mask(device, falcon->owner->type, falcon->owner->inst, true);
        return ret;
 }
 
@@ -478,7 +478,8 @@ gm200_acr_fwif[] = {
 };
 
 int
-gm200_acr_new(struct nvkm_device *device, int index, struct nvkm_acr **pacr)
+gm200_acr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_acr **pacr)
 {
-       return nvkm_acr_new_(gm200_acr_fwif, device, index, pacr);
+       return nvkm_acr_new_(gm200_acr_fwif, device, type, inst, pacr);
 }
index b1ecc58152ccab978ceb027f24d8399ace1c2b5c..54e996f2f630b22217675fd2437089f84ea96db7 100644 (file)
@@ -129,7 +129,8 @@ gm20b_acr_fwif[] = {
 };
 
 int
-gm20b_acr_new(struct nvkm_device *device, int index, struct nvkm_acr **pacr)
+gm20b_acr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_acr **pacr)
 {
-       return nvkm_acr_new_(gm20b_acr_fwif, device, index, pacr);
+       return nvkm_acr_new_(gm20b_acr_fwif, device, type, inst, pacr);
 }
index 80eb9d8dbc8037f5de38aaf0f25027298cef1ad1..fb9132a39bb1a5be122cf23fcb074a901ee9a435 100644 (file)
@@ -276,7 +276,8 @@ gp102_acr_fwif[] = {
 };
 
 int
-gp102_acr_new(struct nvkm_device *device, int index, struct nvkm_acr **pacr)
+gp102_acr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_acr **pacr)
 {
-       return nvkm_acr_new_(gp102_acr_fwif, device, index, pacr);
+       return nvkm_acr_new_(gp102_acr_fwif, device, type, inst, pacr);
 }
index 67a7c141004bd30a2b820731a4633da1a8b2e47f..373d638a21777e1a5d20db13fd0a3551e0e6eb94 100644 (file)
@@ -106,7 +106,8 @@ gp108_acr_fwif[] = {
 };
 
 int
-gp108_acr_new(struct nvkm_device *device, int index, struct nvkm_acr **pacr)
+gp108_acr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_acr **pacr)
 {
-       return nvkm_acr_new_(gp108_acr_fwif, device, index, pacr);
+       return nvkm_acr_new_(gp108_acr_fwif, device, type, inst, pacr);
 }
index 8249f0d2d81d7737281d125e058cc7b94dc56716..f03ba028867b6691899a4d329f9fa29f67d21d42 100644 (file)
@@ -52,7 +52,8 @@ gp10b_acr_fwif[] = {
 };
 
 int
-gp10b_acr_new(struct nvkm_device *device, int index, struct nvkm_acr **pacr)
+gp10b_acr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_acr **pacr)
 {
-       return nvkm_acr_new_(gp10b_acr_fwif, device, index, pacr);
+       return nvkm_acr_new_(gp10b_acr_fwif, device, type, inst, pacr);
 }
index d71af17a169a40e6837bffb56de71b93dbd27828..c30b841c9d352f5b1b1655979d47029cbc51922e 100644 (file)
@@ -135,8 +135,8 @@ int gp102_acr_load_load(struct nvkm_acr *, struct nvkm_acr_hsfw *);
 extern const struct nvkm_acr_hsf_func gp108_acr_unload_0;
 void gp108_acr_hsfw_bld(struct nvkm_acr *, struct nvkm_acr_hsf *);
 
-int nvkm_acr_new_(const struct nvkm_acr_fwif *, struct nvkm_device *, int,
-                 struct nvkm_acr **);
+int nvkm_acr_new_(const struct nvkm_acr_fwif *, struct nvkm_device *, enum nvkm_subdev_type,
+                 int inst, struct nvkm_acr **);
 int nvkm_acr_hsf_boot(struct nvkm_acr *, const char *name);
 
 struct nvkm_acr_lsf {
index c4981bce9a2b6a735de8e36c1d314fc416c1f5b7..05a87e77525f61e4c0fb3bc271ad0169f4e0edf0 100644 (file)
@@ -224,7 +224,8 @@ tu102_acr_fwif[] = {
 };
 
 int
-tu102_acr_new(struct nvkm_device *device, int index, struct nvkm_acr **pacr)
+tu102_acr_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_acr **pacr)
 {
-       return nvkm_acr_new_(tu102_acr_fwif, device, index, pacr);
+       return nvkm_acr_new_(tu102_acr_fwif, device, type, inst, pacr);
 }
index 209a6a40834a0f21d6a341f008337a2730f848bc..d017a1b5e5dd55f23ce0ef7d752727b07ac86ab1 100644 (file)
@@ -134,9 +134,9 @@ nvkm_bar = {
 
 void
 nvkm_bar_ctor(const struct nvkm_bar_func *func, struct nvkm_device *device,
-             int index, struct nvkm_bar *bar)
+             enum nvkm_subdev_type type, int inst, struct nvkm_bar *bar)
 {
-       nvkm_subdev_ctor(&nvkm_bar, device, index, &bar->subdev);
+       nvkm_subdev_ctor(&nvkm_bar, device, type, inst, &bar->subdev);
        bar->func = func;
        spin_lock_init(&bar->lock);
 }
index 87f26f54b48184dc6437cd2e047cd5dc18afc4a9..77a41bcf860e9f39f03dd5c43addd24cc949504d 100644 (file)
@@ -56,7 +56,8 @@ g84_bar_func = {
 };
 
 int
-g84_bar_new(struct nvkm_device *device, int index, struct nvkm_bar **pbar)
+g84_bar_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+           struct nvkm_bar **pbar)
 {
-       return nv50_bar_new_(&g84_bar_func, device, index, 0x200, pbar);
+       return nv50_bar_new_(&g84_bar_func, device, type, inst, 0x200, pbar);
 }
index a3dcb09a40ee374747901bfdd07c33a6859ad9b1..51070b7dda85a8a584bac3c0fddf002131b1aa00 100644 (file)
@@ -162,12 +162,12 @@ gf100_bar_dtor(struct nvkm_bar *base)
 
 int
 gf100_bar_new_(const struct nvkm_bar_func *func, struct nvkm_device *device,
-              int index, struct nvkm_bar **pbar)
+              enum nvkm_subdev_type type, int inst, struct nvkm_bar **pbar)
 {
        struct gf100_bar *bar;
        if (!(bar = kzalloc(sizeof(*bar), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_bar_ctor(func, device, index, &bar->base);
+       nvkm_bar_ctor(func, device, type, inst, &bar->base);
        bar->bar2_halve = nvkm_boolopt(device->cfgopt, "NvBar2Halve", false);
        *pbar = &bar->base;
        return 0;
@@ -189,7 +189,8 @@ gf100_bar_func = {
 };
 
 int
-gf100_bar_new(struct nvkm_device *device, int index, struct nvkm_bar **pbar)
+gf100_bar_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_bar **pbar)
 {
-       return gf100_bar_new_(&gf100_bar_func, device, index, pbar);
+       return gf100_bar_new_(&gf100_bar_func, device, type, inst, pbar);
 }
index 4ae4c7145712caf17178394feb39a08e9b504a64..328a68b418d931c9a19a890f42625b88f50a04f8 100644 (file)
@@ -15,7 +15,7 @@ struct gf100_bar {
        struct gf100_barN bar[2];
 };
 
-int gf100_bar_new_(const struct nvkm_bar_func *, struct nvkm_device *,
+int gf100_bar_new_(const struct nvkm_bar_func *, struct nvkm_device *, enum nvkm_subdev_type,
                   int, struct nvkm_bar **);
 void *gf100_bar_dtor(struct nvkm_bar *);
 int gf100_bar_oneinit(struct nvkm_bar *);
index 35878fb538f2c58fb1116c367c2314b3a391e7bd..eead8ab8839349429e7130f97eb59f5a8dbb21d3 100644 (file)
@@ -32,9 +32,10 @@ gk20a_bar_func = {
 };
 
 int
-gk20a_bar_new(struct nvkm_device *device, int index, struct nvkm_bar **pbar)
+gk20a_bar_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_bar **pbar)
 {
-       int ret = gf100_bar_new_(&gk20a_bar_func, device, index, pbar);
+       int ret = gf100_bar_new_(&gk20a_bar_func, device, type, inst, pbar);
        if (ret == 0)
                (*pbar)->iomap_uncached = true;
        return ret;
index 3ddf9222d9351d633ff445545033c6b850a55a69..da95307a79129a81ac01fa77c2639e56ab2c2e3a 100644 (file)
@@ -59,7 +59,8 @@ gm107_bar_func = {
 };
 
 int
-gm107_bar_new(struct nvkm_device *device, int index, struct nvkm_bar **pbar)
+gm107_bar_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_bar **pbar)
 {
-       return gf100_bar_new_(&gm107_bar_func, device, index, pbar);
+       return gf100_bar_new_(&gm107_bar_func, device, type, inst, pbar);
 }
index 1ed6170891c4285d9a5408c4e0d445b42a5c3c01..4acdb4fb01070525d1fc98627a6fe832e05a4400 100644 (file)
@@ -32,9 +32,10 @@ gm20b_bar_func = {
 };
 
 int
-gm20b_bar_new(struct nvkm_device *device, int index, struct nvkm_bar **pbar)
+gm20b_bar_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_bar **pbar)
 {
-       int ret = gf100_bar_new_(&gm20b_bar_func, device, index, pbar);
+       int ret = gf100_bar_new_(&gm20b_bar_func, device, type, inst, pbar);
        if (ret == 0)
                (*pbar)->iomap_uncached = true;
        return ret;
index f23a0ccc2becca6d733089941d4850d3b410d567..27d8a1be43e4ff85e8ab5ffe7138211884a4daac 100644 (file)
@@ -220,12 +220,12 @@ nv50_bar_dtor(struct nvkm_bar *base)
 
 int
 nv50_bar_new_(const struct nvkm_bar_func *func, struct nvkm_device *device,
-             int index, u32 pgd_addr, struct nvkm_bar **pbar)
+             enum nvkm_subdev_type type, int inst, u32 pgd_addr, struct nvkm_bar **pbar)
 {
        struct nv50_bar *bar;
        if (!(bar = kzalloc(sizeof(*bar), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_bar_ctor(func, device, index, &bar->base);
+       nvkm_bar_ctor(func, device, type, inst, &bar->base);
        bar->pgd_addr = pgd_addr;
        *pbar = &bar->base;
        return 0;
@@ -248,7 +248,8 @@ nv50_bar_func = {
 };
 
 int
-nv50_bar_new(struct nvkm_device *device, int index, struct nvkm_bar **pbar)
+nv50_bar_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_bar **pbar)
 {
-       return nv50_bar_new_(&nv50_bar_func, device, index, 0x1400, pbar);
+       return nv50_bar_new_(&nv50_bar_func, device, type, inst, 0x1400, pbar);
 }
index e4193deb2e51ca70a5a5f128c5821724d3a01b85..dedee9394079585bbb8cc80191f425a2a3bf1c7c 100644 (file)
@@ -16,7 +16,7 @@ struct nv50_bar {
        struct nvkm_gpuobj *bar2;
 };
 
-int nv50_bar_new_(const struct nvkm_bar_func *, struct nvkm_device *,
+int nv50_bar_new_(const struct nvkm_bar_func *, struct nvkm_device *, enum nvkm_subdev_type,
                  int, u32 pgd_addr, struct nvkm_bar **);
 void *nv50_bar_dtor(struct nvkm_bar *);
 int nv50_bar_oneinit(struct nvkm_bar *);
index 869ad184f9231b9b06e79f70b92b767e105ce934..daebfc991c76e6b8e3f1a004a7e364807b2dfac5 100644 (file)
@@ -5,7 +5,7 @@
 #include <subdev/bar.h>
 
 void nvkm_bar_ctor(const struct nvkm_bar_func *, struct nvkm_device *,
-                  int, struct nvkm_bar *);
+                  enum nvkm_subdev_type, int, struct nvkm_bar *);
 
 struct nvkm_bar_func {
        void *(*dtor)(struct nvkm_bar *);
index 798f65ec3a86c457ea6789205667f93d66d60bbb..c25ab407b85d9182ff26ba361ac23dadde8b87a0 100644 (file)
@@ -92,7 +92,8 @@ tu102_bar = {
 };
 
 int
-tu102_bar_new(struct nvkm_device *device, int index, struct nvkm_bar **pbar)
+tu102_bar_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_bar **pbar)
 {
-       return gf100_bar_new_(&tu102_bar, device, index, pbar);
+       return gf100_bar_new_(&tu102_bar, device, type, inst, pbar);
 }
index f3c30b2a788e8534fe72c23729779afd5e39d573..d0f52d59fc2f9f6eef9ef79e123ace125c9e1bc4 100644 (file)
@@ -140,7 +140,8 @@ nvkm_bios = {
 };
 
 int
-nvkm_bios_new(struct nvkm_device *device, int index, struct nvkm_bios **pbios)
+nvkm_bios_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_bios **pbios)
 {
        struct nvkm_bios *bios;
        struct nvbios_image image;
@@ -149,7 +150,7 @@ nvkm_bios_new(struct nvkm_device *device, int index, struct nvkm_bios **pbios)
 
        if (!(bios = *pbios = kzalloc(sizeof(*bios), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&nvkm_bios, device, index, &bios->subdev);
+       nvkm_subdev_ctor(&nvkm_bios, device, type, inst, &bios->subdev);
 
        ret = nvbios_shadow(bios);
        if (ret)
index 52ad73bce5febd0a1d8b166ca9422fa4e59e7c3f..0e5a46db52eaf795befb7bf8033e035596c11419 100644 (file)
@@ -53,12 +53,12 @@ nvkm_bus = {
 
 int
 nvkm_bus_new_(const struct nvkm_bus_func *func, struct nvkm_device *device,
-             int index, struct nvkm_bus **pbus)
+             enum nvkm_subdev_type type, int inst, struct nvkm_bus **pbus)
 {
        struct nvkm_bus *bus;
        if (!(bus = *pbus = kzalloc(sizeof(*bus), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&nvkm_bus, device, index, &bus->subdev);
+       nvkm_subdev_ctor(&nvkm_bus, device, type, inst, &bus->subdev);
        bus->func = func;
        return 0;
 }
index 9700b5c01cc69ca5243e339deec7a55922f0efb9..a0d6e2d3f804c9dca877d8f75fe449dab6beb176 100644 (file)
@@ -58,7 +58,8 @@ g94_bus = {
 };
 
 int
-g94_bus_new(struct nvkm_device *device, int index, struct nvkm_bus **pbus)
+g94_bus_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+           struct nvkm_bus **pbus)
 {
-       return nvkm_bus_new_(&g94_bus, device, index, pbus);
+       return nvkm_bus_new_(&g94_bus, device, type, inst, pbus);
 }
index e0930d5fdfb188ab7f7ecf9cb5860ffba4a5e541..53a6651ac22581dc29a2702613a2275dd99cf88f 100644 (file)
@@ -40,7 +40,7 @@ gf100_bus_intr(struct nvkm_bus *bus)
                           (addr & 0x00000002) ? "write" : "read", data,
                           (addr & 0x00fffffc),
                           (stat & 0x00000002) ? "!ENGINE " : "",
-                          (stat & 0x00000004) ? "IBUS " : "",
+                          (stat & 0x00000004) ? "PRIVRING " : "",
                           (stat & 0x00000008) ? "TIMEOUT " : "");
 
                nvkm_wr32(device, 0x009084, 0x00000000);
@@ -69,7 +69,8 @@ gf100_bus = {
 };
 
 int
-gf100_bus_new(struct nvkm_device *device, int index, struct nvkm_bus **pbus)
+gf100_bus_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_bus **pbus)
 {
-       return nvkm_bus_new_(&gf100_bus, device, index, pbus);
+       return nvkm_bus_new_(&gf100_bus, device, type, inst, pbus);
 }
index 2b44ba5cf4b0bf2e76917d528510aeeee4282caa..cfed17c062ea8ef3841d6890ac3a2608b6e9b6c3 100644 (file)
@@ -68,7 +68,8 @@ nv04_bus = {
 };
 
 int
-nv04_bus_new(struct nvkm_device *device, int index, struct nvkm_bus **pbus)
+nv04_bus_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_bus **pbus)
 {
-       return nvkm_bus_new_(&nv04_bus, device, index, pbus);
+       return nvkm_bus_new_(&nv04_bus, device, type, inst, pbus);
 }
index 5153d89e1f0b5f7a1f90da7460dc0029aabf30dd..ad8da523bb22e3e95862cf873126ae1451860394 100644 (file)
@@ -82,7 +82,8 @@ nv31_bus = {
 };
 
 int
-nv31_bus_new(struct nvkm_device *device, int index, struct nvkm_bus **pbus)
+nv31_bus_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_bus **pbus)
 {
-       return nvkm_bus_new_(&nv31_bus, device, index, pbus);
+       return nvkm_bus_new_(&nv31_bus, device, type, inst, pbus);
 }
index 19e10fdc9291885b0af44cf79f643ce3939f2bdd..3a1e45adeedc1c6d36b82eec3477485f29254ace 100644 (file)
@@ -99,7 +99,8 @@ nv50_bus = {
 };
 
 int
-nv50_bus_new(struct nvkm_device *device, int index, struct nvkm_bus **pbus)
+nv50_bus_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_bus **pbus)
 {
-       return nvkm_bus_new_(&nv50_bus, device, index, pbus);
+       return nvkm_bus_new_(&nv50_bus, device, type, inst, pbus);
 }
index 76f7ba1c64940820da5cb1dc015788fcfa7a50d6..2e9345b17cf808153ca22c934a2bc4a1b56977f7 100644 (file)
@@ -11,7 +11,7 @@ struct nvkm_bus_func {
        u32 hwsq_size;
 };
 
-int nvkm_bus_new_(const struct nvkm_bus_func *, struct nvkm_device *, int,
+int nvkm_bus_new_(const struct nvkm_bus_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
                  struct nvkm_bus **);
 
 void nv50_bus_init(struct nvkm_bus *);
index dc184e857f857853fdca108b780e1155bac70321..57199be082fd361e45b9d131fa76148843eaedc3 100644 (file)
@@ -649,7 +649,7 @@ nvkm_clk = {
 
 int
 nvkm_clk_ctor(const struct nvkm_clk_func *func, struct nvkm_device *device,
-             int index, bool allow_reclock, struct nvkm_clk *clk)
+             enum nvkm_subdev_type type, int inst, bool allow_reclock, struct nvkm_clk *clk)
 {
        struct nvkm_subdev *subdev = &clk->subdev;
        struct nvkm_bios *bios = device->bios;
@@ -657,7 +657,7 @@ nvkm_clk_ctor(const struct nvkm_clk_func *func, struct nvkm_device *device,
        const char *mode;
        struct nvbios_vpstate_header h;
 
-       nvkm_subdev_ctor(&nvkm_clk, device, index, subdev);
+       nvkm_subdev_ctor(&nvkm_clk, device, type, inst, subdev);
 
        if (bios && !nvbios_vpstate_parse(bios, &h)) {
                struct nvbios_vpstate_entry base, boost;
@@ -716,9 +716,9 @@ nvkm_clk_ctor(const struct nvkm_clk_func *func, struct nvkm_device *device,
 
 int
 nvkm_clk_new_(const struct nvkm_clk_func *func, struct nvkm_device *device,
-             int index, bool allow_reclock, struct nvkm_clk **pclk)
+             enum nvkm_subdev_type type, int inst, bool allow_reclock, struct nvkm_clk **pclk)
 {
        if (!(*pclk = kzalloc(sizeof(**pclk), GFP_KERNEL)))
                return -ENOMEM;
-       return nvkm_clk_ctor(func, device, index, allow_reclock, *pclk);
+       return nvkm_clk_ctor(func, device, type, inst, allow_reclock, *pclk);
 }
index f97e3ec196bb03c9f35b80c5ac78aacc4a92eeb9..07157cf53c9e8992a9c02f2468d3bd74af15e1f5 100644 (file)
@@ -41,8 +41,8 @@ g84_clk = {
 };
 
 int
-g84_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
+g84_clk_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+           struct nvkm_clk **pclk)
 {
-       return nv50_clk_new_(&g84_clk, device, index,
-                            (device->chipset >= 0x94), pclk);
+       return nv50_clk_new_(&g84_clk, device, type, inst, (device->chipset >= 0x94), pclk);
 }
index 7f67f9f5a550120e405337be5f5bc50bd7a419dd..6eea11aefb70e893814ab2aaffd25bedcdc541e2 100644 (file)
@@ -468,7 +468,8 @@ gf100_clk = {
 };
 
 int
-gf100_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
+gf100_clk_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_clk **pclk)
 {
        struct gf100_clk *clk;
 
@@ -476,5 +477,5 @@ gf100_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
                return -ENOMEM;
        *pclk = &clk->base;
 
-       return nvkm_clk_ctor(&gf100_clk, device, index, false, &clk->base);
+       return nvkm_clk_ctor(&gf100_clk, device, type, inst, false, &clk->base);
 }
index 0b37e3da7feb6b8d0e7eecbfe64b7ee958fbe4b3..0d8e2ddcc5eebf366bccb57a0956796da7b788a2 100644 (file)
@@ -504,7 +504,8 @@ gk104_clk = {
 };
 
 int
-gk104_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
+gk104_clk_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_clk **pclk)
 {
        struct gk104_clk *clk;
 
@@ -512,5 +513,5 @@ gk104_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
                return -ENOMEM;
        *pclk = &clk->base;
 
-       return nvkm_clk_ctor(&gk104_clk, device, index, true, &clk->base);
+       return nvkm_clk_ctor(&gk104_clk, device, type, inst, true, &clk->base);
 }
index 218893e3e5f92b95efa613e2f4269b4d19d0e8bb..d573fb0917fc535437a0b81bc3d88c56b036fb22 100644 (file)
@@ -610,10 +610,9 @@ gk20a_clk = {
 };
 
 int
-gk20a_clk_ctor(struct nvkm_device *device, int index,
-               const struct nvkm_clk_func *func,
-               const struct gk20a_clk_pllg_params *params,
-               struct gk20a_clk *clk)
+gk20a_clk_ctor(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              const struct nvkm_clk_func *func, const struct gk20a_clk_pllg_params *params,
+              struct gk20a_clk *clk)
 {
        struct nvkm_device_tegra *tdev = device->func->tegra(device);
        int ret;
@@ -628,7 +627,7 @@ gk20a_clk_ctor(struct nvkm_device *device, int index,
        clk->params = params;
        clk->parent_rate = clk_get_rate(tdev->clk);
 
-       ret = nvkm_clk_ctor(func, device, index, true, &clk->base);
+       ret = nvkm_clk_ctor(func, device, type, inst, true, &clk->base);
        if (ret)
                return ret;
 
@@ -639,7 +638,8 @@ gk20a_clk_ctor(struct nvkm_device *device, int index,
 }
 
 int
-gk20a_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
+gk20a_clk_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_clk **pclk)
 {
        struct gk20a_clk *clk;
        int ret;
@@ -649,11 +649,9 @@ gk20a_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
                return -ENOMEM;
        *pclk = &clk->base;
 
-       ret = gk20a_clk_ctor(device, index, &gk20a_clk, &gk20a_pllg_params,
-                             clk);
+       ret = gk20a_clk_ctor(device, type, inst, &gk20a_clk, &gk20a_pllg_params, clk);
 
        clk->pl_to_div = pl_to_div;
        clk->div_to_pl = div_to_pl;
-
        return ret;
 }
index 0d1450972162cb158dc727bb964aed67bdd56446..286413ff4a9ec7f2273c9446ac7a15eb1a843aeb 100644 (file)
@@ -146,8 +146,8 @@ gk20a_pllg_n_lo(struct gk20a_clk *clk, struct gk20a_pll *pll)
                            clk->parent_rate / KHZ);
 }
 
-int gk20a_clk_ctor(struct nvkm_device *, int, const struct nvkm_clk_func *,
-                   const struct gk20a_clk_pllg_params *, struct gk20a_clk *);
+int gk20a_clk_ctor(struct nvkm_device *, enum nvkm_subdev_type, int, const struct nvkm_clk_func *,
+                  const struct gk20a_clk_pllg_params *, struct gk20a_clk *);
 void gk20a_clk_fini(struct nvkm_clk *);
 int gk20a_clk_read(struct nvkm_clk *, enum nv_clk_src);
 int gk20a_clk_calc(struct nvkm_clk *, struct nvkm_cstate *);
index b284e949f73240c2702e87113d696523b7baea73..a139dafffe0630126b56011ccea6896c3ef09e58 100644 (file)
@@ -908,7 +908,7 @@ gm20b_clk = {
 };
 
 static int
-gm20b_clk_new_speedo0(struct nvkm_device *device, int index,
+gm20b_clk_new_speedo0(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                      struct nvkm_clk **pclk)
 {
        struct gk20a_clk *clk;
@@ -919,12 +919,9 @@ gm20b_clk_new_speedo0(struct nvkm_device *device, int index,
                return -ENOMEM;
        *pclk = &clk->base;
 
-       ret = gk20a_clk_ctor(device, index, &gm20b_clk_speedo0,
-                            &gm20b_pllg_params, clk);
-
+       ret = gk20a_clk_ctor(device, type, inst, &gm20b_clk_speedo0, &gm20b_pllg_params, clk);
        clk->pl_to_div = pl_to_div;
        clk->div_to_pl = div_to_pl;
-
        return ret;
 }
 
@@ -1014,7 +1011,8 @@ gm20b_clk_init_safe_fmax(struct gm20b_clk *clk)
 }
 
 int
-gm20b_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
+gm20b_clk_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_clk **pclk)
 {
        struct nvkm_device_tegra *tdev = device->func->tegra(device);
        struct gm20b_clk *clk;
@@ -1024,7 +1022,7 @@ gm20b_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
 
        /* Speedo 0 GPUs cannot use noise-aware PLL */
        if (tdev->gpu_speedo_id == 0)
-               return gm20b_clk_new_speedo0(device, index, pclk);
+               return gm20b_clk_new_speedo0(device, type, inst, pclk);
 
        /* Speedo >= 1, use NAPLL */
        clk = kzalloc(sizeof(*clk) + sizeof(*clk_params), GFP_KERNEL);
@@ -1036,8 +1034,7 @@ gm20b_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
        /* duplicate the clock parameters since we will patch them below */
        clk_params = (void *) (clk + 1);
        *clk_params = gm20b_pllg_params;
-       ret = gk20a_clk_ctor(device, index, &gm20b_clk, clk_params,
-                            &clk->base);
+       ret = gk20a_clk_ctor(device, type, inst, &gm20b_clk, clk_params, &clk->base);
        if (ret)
                return ret;
 
@@ -1050,7 +1047,7 @@ gm20b_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
        if (clk_params->max_m == 0) {
                nvkm_warn(subdev, "cannot use NAPLL, using legacy clock...\n");
                kfree(clk);
-               return gm20b_clk_new_speedo0(device, index, pclk);
+               return gm20b_clk_new_speedo0(device, type, inst, pclk);
        }
 
        clk->base.pl_to_div = pl_to_div;
index f0a26881d9b9bc7f7eba0696ce7a6db96aa35623..b5f3969727a2045811843aba1d2d255cd7b13bf3 100644 (file)
@@ -537,7 +537,8 @@ gt215_clk = {
 };
 
 int
-gt215_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
+gt215_clk_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_clk **pclk)
 {
        struct gt215_clk *clk;
 
@@ -545,5 +546,5 @@ gt215_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
                return -ENOMEM;
        *pclk = &clk->base;
 
-       return nvkm_clk_ctor(&gt215_clk, device, index, true, &clk->base);
+       return nvkm_clk_ctor(&gt215_clk, device, type, inst, true, &clk->base);
 }
index 4884eb4a9221ad23ae732912aaa32c04e05d018e..81f103f88dc8bce5a8b28ab1a2183d890ef176b1 100644 (file)
@@ -409,7 +409,8 @@ mcp77_clk = {
 };
 
 int
-mcp77_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
+mcp77_clk_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_clk **pclk)
 {
        struct mcp77_clk *clk;
 
@@ -417,5 +418,5 @@ mcp77_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
                return -ENOMEM;
        *pclk = &clk->base;
 
-       return nvkm_clk_ctor(&mcp77_clk, device, index, true, &clk->base);
+       return nvkm_clk_ctor(&mcp77_clk, device, type, inst, true, &clk->base);
 }
index b280f85e8827446f964d97996cf7213f90e958dd..ca13598c2caa46f9ae37e841046e1938d0d87015 100644 (file)
@@ -72,9 +72,10 @@ nv04_clk = {
 };
 
 int
-nv04_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
+nv04_clk_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_clk **pclk)
 {
-       int ret = nvkm_clk_new_(&nv04_clk, device, index, false, pclk);
+       int ret = nvkm_clk_new_(&nv04_clk, device, type, inst, false, pclk);
        if (ret == 0) {
                (*pclk)->pll_calc = nv04_clk_pll_calc;
                (*pclk)->pll_prog = nv04_clk_pll_prog;
index 2ab9b9b84018661ad3c5a0afb0a5b17f4a5ba531..7ddd8cecb80510dce6c98f5bb70e0cb166d60bc7 100644 (file)
@@ -218,7 +218,8 @@ nv40_clk = {
 };
 
 int
-nv40_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
+nv40_clk_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_clk **pclk)
 {
        struct nv40_clk *clk;
 
@@ -228,5 +229,5 @@ nv40_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
        clk->base.pll_prog = nv04_clk_pll_prog;
        *pclk = &clk->base;
 
-       return nvkm_clk_ctor(&nv40_clk, device, index, true, &clk->base);
+       return nvkm_clk_ctor(&nv40_clk, device, type, inst, true, &clk->base);
 }
index da1770e47490e7006082a1421ab72c04ab28bc62..83067763c0ecfad0430259d54997289d9a11e43f 100644 (file)
@@ -507,14 +507,14 @@ nv50_clk_tidy(struct nvkm_clk *base)
 
 int
 nv50_clk_new_(const struct nvkm_clk_func *func, struct nvkm_device *device,
-             int index, bool allow_reclock, struct nvkm_clk **pclk)
+             enum nvkm_subdev_type type, int inst, bool allow_reclock, struct nvkm_clk **pclk)
 {
        struct nv50_clk *clk;
        int ret;
 
        if (!(clk = kzalloc(sizeof(*clk), GFP_KERNEL)))
                return -ENOMEM;
-       ret = nvkm_clk_ctor(func, device, index, allow_reclock, &clk->base);
+       ret = nvkm_clk_ctor(func, device, type, inst, allow_reclock, &clk->base);
        *pclk = &clk->base;
        if (ret)
                return ret;
@@ -555,7 +555,8 @@ nv50_clk = {
 };
 
 int
-nv50_clk_new(struct nvkm_device *device, int index, struct nvkm_clk **pclk)
+nv50_clk_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_clk **pclk)
 {
-       return nv50_clk_new_(&nv50_clk, device, index, false, pclk);
+       return nv50_clk_new_(&nv50_clk, device, type, inst, false, pclk);
 }
index 7c7713238ec4b0ec70fdb02c2bac6df7cca0e337..5b4cb7e5cff6e093e7ce69ee36a89383316cf34e 100644 (file)
@@ -20,7 +20,7 @@ struct nv50_clk {
        struct nv50_clk_hwsq hwsq;
 };
 
-int nv50_clk_new_(const struct nvkm_clk_func *, struct nvkm_device *, int,
+int nv50_clk_new_(const struct nvkm_clk_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
                  bool, struct nvkm_clk **);
 int nv50_clk_read(struct nvkm_clk *, enum nv_clk_src);
 int nv50_clk_calc(struct nvkm_clk *, struct nvkm_cstate *);
index 81dfb37480ae8c0d2b5afe64f79ea9abd4ae1191..810cc572cd30e128198ef6a24ab9394ef8f8dc17 100644 (file)
@@ -16,9 +16,9 @@ struct nvkm_clk_func {
        struct nvkm_domain domains[];
 };
 
-int nvkm_clk_ctor(const struct nvkm_clk_func *, struct nvkm_device *, int,
+int nvkm_clk_ctor(const struct nvkm_clk_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
                  bool allow_reclock, struct nvkm_clk *);
-int nvkm_clk_new_(const struct nvkm_clk_func *, struct nvkm_device *, int,
+int nvkm_clk_new_(const struct nvkm_clk_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
                  bool allow_reclock, struct nvkm_clk **);
 
 int nv04_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, int clk,
index 4756019ddf3fba74bf69795a7fd567e38241d813..dd4981708fe40e90f1823a917d2e69f1bacc87b8 100644 (file)
@@ -56,12 +56,12 @@ nvkm_devinit_disable(struct nvkm_devinit *init)
 }
 
 int
-nvkm_devinit_post(struct nvkm_devinit *init, u64 *disable)
+nvkm_devinit_post(struct nvkm_devinit *init)
 {
        int ret = 0;
        if (init && init->func->post)
                ret = init->func->post(init, init->post);
-       *disable = nvkm_devinit_disable(init);
+       nvkm_devinit_disable(init);
        return ret;
 }
 
@@ -126,11 +126,10 @@ nvkm_devinit = {
 };
 
 void
-nvkm_devinit_ctor(const struct nvkm_devinit_func *func,
-                 struct nvkm_device *device, int index,
-                 struct nvkm_devinit *init)
+nvkm_devinit_ctor(const struct nvkm_devinit_func *func, struct nvkm_device *device,
+                 enum nvkm_subdev_type type, int inst, struct nvkm_devinit *init)
 {
-       nvkm_subdev_ctor(&nvkm_devinit, device, index, &init->subdev);
+       nvkm_subdev_ctor(&nvkm_devinit, device, type, inst, &init->subdev);
        init->func = func;
        init->force_post = nvkm_boolopt(device->cfgopt, "NvForcePost", false);
 }
index e895289bf3c176a16ad9fd57d0354b7dd012a0a1..c224702b7bedf5a19d0246e2d053329a9fe61a66 100644 (file)
@@ -35,18 +35,18 @@ g84_devinit_disable(struct nvkm_devinit *init)
        u64 disable = 0ULL;
 
        if (!(r001540 & 0x40000000)) {
-               disable |= (1ULL << NVKM_ENGINE_MPEG);
-               disable |= (1ULL << NVKM_ENGINE_VP);
-               disable |= (1ULL << NVKM_ENGINE_BSP);
-               disable |= (1ULL << NVKM_ENGINE_CIPHER);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MPEG, 0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_VP, 0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_BSP, 0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_CIPHER, 0);
        }
 
        if (!(r00154c & 0x00000004))
-               disable |= (1ULL << NVKM_ENGINE_DISP);
+               nvkm_subdev_disable(device, NVKM_ENGINE_DISP, 0);
        if (!(r00154c & 0x00000020))
-               disable |= (1ULL << NVKM_ENGINE_BSP);
+               nvkm_subdev_disable(device, NVKM_ENGINE_BSP, 0);
        if (!(r00154c & 0x00000040))
-               disable |= (1ULL << NVKM_ENGINE_CIPHER);
+               nvkm_subdev_disable(device, NVKM_ENGINE_CIPHER, 0);
 
        return disable;
 }
@@ -61,8 +61,8 @@ g84_devinit = {
 };
 
 int
-g84_devinit_new(struct nvkm_device *device, int index,
+g84_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_devinit **pinit)
 {
-       return nv50_devinit_new_(&g84_devinit, device, index, pinit);
+       return nv50_devinit_new_(&g84_devinit, device, type, inst, pinit);
 }
index a9d45844df5a8fafca713afb1acc38da8d9b3b84..05729ca19e9a7e591202051d8c75bbcb93143396 100644 (file)
@@ -35,17 +35,17 @@ g98_devinit_disable(struct nvkm_devinit *init)
        u64 disable = 0ULL;
 
        if (!(r001540 & 0x40000000)) {
-               disable |= (1ULL << NVKM_ENGINE_MSPDEC);
-               disable |= (1ULL << NVKM_ENGINE_MSVLD);
-               disable |= (1ULL << NVKM_ENGINE_MSPPP);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSPDEC, 0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSVLD, 0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSPPP, 0);
        }
 
        if (!(r00154c & 0x00000004))
-               disable |= (1ULL << NVKM_ENGINE_DISP);
+               nvkm_subdev_disable(device, NVKM_ENGINE_DISP, 0);
        if (!(r00154c & 0x00000020))
-               disable |= (1ULL << NVKM_ENGINE_MSVLD);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSVLD, 0);
        if (!(r00154c & 0x00000040))
-               disable |= (1ULL << NVKM_ENGINE_SEC);
+               nvkm_subdev_disable(device, NVKM_ENGINE_SEC, 0);
 
        return disable;
 }
@@ -60,8 +60,8 @@ g98_devinit = {
 };
 
 int
-g98_devinit_new(struct nvkm_device *device, int index,
+g98_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_devinit **pinit)
 {
-       return nv50_devinit_new_(&g98_devinit, device, index, pinit);
+       return nv50_devinit_new_(&g98_devinit, device, type, inst, pinit);
 }
index 636a92128f6c8cab99160cee3f8c392ceb0f11df..6b280b05c4ca07c9bedf81b76c26827bbf2f937f 100644 (file)
@@ -70,7 +70,8 @@ ga100_devinit = {
 };
 
 int
-ga100_devinit_new(struct nvkm_device *device, int index, struct nvkm_devinit **pinit)
+ga100_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                 struct nvkm_devinit **pinit)
 {
-       return nv50_devinit_new_(&ga100_devinit, device, index, pinit);
+       return nv50_devinit_new_(&ga100_devinit, device, type, inst, pinit);
 }
index 8b1b34c3ad2624cfbda40054a7c5410b8a0364f6..051cfd6a5caf5ce82bd55cc8f52bc21bfd541516 100644 (file)
@@ -71,21 +71,21 @@ gf100_devinit_disable(struct nvkm_devinit *init)
        u64 disable = 0ULL;
 
        if (r022500 & 0x00000001)
-               disable |= (1ULL << NVKM_ENGINE_DISP);
+               nvkm_subdev_disable(device, NVKM_ENGINE_DISP, 0);
 
        if (r022500 & 0x00000002) {
-               disable |= (1ULL << NVKM_ENGINE_MSPDEC);
-               disable |= (1ULL << NVKM_ENGINE_MSPPP);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSPDEC, 0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSPPP, 0);
        }
 
        if (r022500 & 0x00000004)
-               disable |= (1ULL << NVKM_ENGINE_MSVLD);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSVLD, 0);
        if (r022500 & 0x00000008)
-               disable |= (1ULL << NVKM_ENGINE_MSENC);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSENC, 0);
        if (r022500 & 0x00000100)
-               disable |= (1ULL << NVKM_ENGINE_CE0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_CE, 0);
        if (r022500 & 0x00000200)
-               disable |= (1ULL << NVKM_ENGINE_CE1);
+               nvkm_subdev_disable(device, NVKM_ENGINE_CE, 1);
 
        return disable;
 }
@@ -114,8 +114,8 @@ gf100_devinit = {
 };
 
 int
-gf100_devinit_new(struct nvkm_device *device, int index,
-               struct nvkm_devinit **pinit)
+gf100_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                 struct nvkm_devinit **pinit)
 {
-       return nv50_devinit_new_(&gf100_devinit, device, index, pinit);
+       return nv50_devinit_new_(&gf100_devinit, device, type, inst, pinit);
 }
index 28ca01be3d3825b4fd249f85c87c41782b10d5f5..4323732a3cb22897b3ec035e4cfe7081847c1fb0 100644 (file)
@@ -35,11 +35,11 @@ gm107_devinit_disable(struct nvkm_devinit *init)
        u64 disable = 0ULL;
 
        if (r021c00 & 0x00000001)
-               disable |= (1ULL << NVKM_ENGINE_CE0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_CE, 0);
        if (r021c00 & 0x00000004)
-               disable |= (1ULL << NVKM_ENGINE_CE2);
+               nvkm_subdev_disable(device, NVKM_ENGINE_CE, 2);
        if (r021c04 & 0x00000001)
-               disable |= (1ULL << NVKM_ENGINE_DISP);
+               nvkm_subdev_disable(device, NVKM_ENGINE_DISP, 0);
 
        return disable;
 }
@@ -54,8 +54,8 @@ gm107_devinit = {
 };
 
 int
-gm107_devinit_new(struct nvkm_device *device, int index,
-               struct nvkm_devinit **pinit)
+gm107_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                 struct nvkm_devinit **pinit)
 {
-       return nv50_devinit_new_(&gm107_devinit, device, index, pinit);
+       return nv50_devinit_new_(&gm107_devinit, device, type, inst, pinit);
 }
index 59940dacc2ba028939d3822c0e736248a5af9359..a308b9bde4497e403377d8f048f8407ba63ef2c9 100644 (file)
@@ -179,8 +179,8 @@ gm200_devinit = {
 };
 
 int
-gm200_devinit_new(struct nvkm_device *device, int index,
-               struct nvkm_devinit **pinit)
+gm200_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                 struct nvkm_devinit **pinit)
 {
-       return nv50_devinit_new_(&gm200_devinit, device, index, pinit);
+       return nv50_devinit_new_(&gm200_devinit, device, type, inst, pinit);
 }
index 9a8522fa9c6523ff16666456cb9ee02433dc86ad..dc026ac1b5950cdf6ff40895974890f3468ffc04 100644 (file)
@@ -71,16 +71,16 @@ gt215_devinit_disable(struct nvkm_devinit *init)
        u64 disable = 0ULL;
 
        if (!(r001540 & 0x40000000)) {
-               disable |= (1ULL << NVKM_ENGINE_MSPDEC);
-               disable |= (1ULL << NVKM_ENGINE_MSPPP);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSPDEC, 0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSPPP, 0);
        }
 
        if (!(r00154c & 0x00000004))
-               disable |= (1ULL << NVKM_ENGINE_DISP);
+               nvkm_subdev_disable(device, NVKM_ENGINE_DISP, 0);
        if (!(r00154c & 0x00000020))
-               disable |= (1ULL << NVKM_ENGINE_MSVLD);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSVLD, 0);
        if (!(r00154c & 0x00000200))
-               disable |= (1ULL << NVKM_ENGINE_CE0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_CE, 0);
 
        return disable;
 }
@@ -146,8 +146,8 @@ gt215_devinit = {
 };
 
 int
-gt215_devinit_new(struct nvkm_device *device, int index,
-               struct nvkm_devinit **pinit)
+gt215_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                 struct nvkm_devinit **pinit)
 {
-       return nv50_devinit_new_(&gt215_devinit, device, index, pinit);
+       return nv50_devinit_new_(&gt215_devinit, device, type, inst, pinit);
 }
index fbde6828bd38ecc9e6080e877c4eac554d7a800b..b4d1688517d5a5df2ed32b68cfef0e5ed8e5abc3 100644 (file)
@@ -72,8 +72,8 @@ gv100_devinit = {
 };
 
 int
-gv100_devinit_new(struct nvkm_device *device, int index,
-               struct nvkm_devinit **pinit)
+gv100_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                 struct nvkm_devinit **pinit)
 {
-       return nv50_devinit_new_(&gv100_devinit, device, index, pinit);
+       return nv50_devinit_new_(&gv100_devinit, device, type, inst, pinit);
 }
index ce4f718e98a174fb5b6a982fd3c7b8b90d8079f3..fb90d47e12252c32f966f896d672a9debc5a83bc 100644 (file)
@@ -35,18 +35,18 @@ mcp89_devinit_disable(struct nvkm_devinit *init)
        u64 disable = 0;
 
        if (!(r001540 & 0x40000000)) {
-               disable |= (1ULL << NVKM_ENGINE_MSPDEC);
-               disable |= (1ULL << NVKM_ENGINE_MSPPP);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSPDEC, 0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSPPP, 0);
        }
 
        if (!(r00154c & 0x00000004))
-               disable |= (1ULL << NVKM_ENGINE_DISP);
+               nvkm_subdev_disable(device, NVKM_ENGINE_DISP, 0);
        if (!(r00154c & 0x00000020))
-               disable |= (1ULL << NVKM_ENGINE_MSVLD);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MSVLD, 0);
        if (!(r00154c & 0x00000040))
-               disable |= (1ULL << NVKM_ENGINE_VIC);
+               nvkm_subdev_disable(device, NVKM_ENGINE_VIC, 0);
        if (!(r00154c & 0x00000200))
-               disable |= (1ULL << NVKM_ENGINE_CE0);
+               nvkm_subdev_disable(device, NVKM_ENGINE_CE, 0);
 
        return disable;
 }
@@ -61,8 +61,8 @@ mcp89_devinit = {
 };
 
 int
-mcp89_devinit_new(struct nvkm_device *device, int index,
-               struct nvkm_devinit **pinit)
+mcp89_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                 struct nvkm_devinit **pinit)
 {
-       return nv50_devinit_new_(&mcp89_devinit, device, index, pinit);
+       return nv50_devinit_new_(&mcp89_devinit, device, type, inst, pinit);
 }
index 317ce9fb82251caeb9da9e53c94e4ad43d2386e6..88bc890f89a2b44e368eecb7f6565e9756490573 100644 (file)
@@ -434,9 +434,8 @@ nv04_devinit_dtor(struct nvkm_devinit *base)
 }
 
 int
-nv04_devinit_new_(const struct nvkm_devinit_func *func,
-                 struct nvkm_device *device, int index,
-                 struct nvkm_devinit **pinit)
+nv04_devinit_new_(const struct nvkm_devinit_func *func, struct nvkm_device *device,
+                 enum nvkm_subdev_type type, int inst, struct nvkm_devinit **pinit)
 {
        struct nv04_devinit *init;
 
@@ -444,7 +443,7 @@ nv04_devinit_new_(const struct nvkm_devinit_func *func,
                return -ENOMEM;
        *pinit = &init->base;
 
-       nvkm_devinit_ctor(func, device, index, &init->base);
+       nvkm_devinit_ctor(func, device, type, inst, &init->base);
        init->owner = -1;
        return 0;
 }
@@ -459,8 +458,8 @@ nv04_devinit = {
 };
 
 int
-nv04_devinit_new(struct nvkm_device *device, int index,
+nv04_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_devinit **pinit)
 {
-       return nv04_devinit_new_(&nv04_devinit, device, index, pinit);
+       return nv04_devinit_new_(&nv04_devinit, device, type, inst, pinit);
 }
index 15b029ddf6df2e58e78ae964297ef6242f33f59c..06ad8a606bb824066f2992b0eac9a782d9e3365e 100644 (file)
@@ -11,7 +11,7 @@ struct nv04_devinit {
 };
 
 int nv04_devinit_new_(const struct nvkm_devinit_func *, struct nvkm_device *,
-                     int, struct nvkm_devinit **);
+                     enum nvkm_subdev_type, int, struct nvkm_devinit **);
 void *nv04_devinit_dtor(struct nvkm_devinit *);
 void nv04_devinit_preinit(struct nvkm_devinit *);
 void nv04_devinit_fini(struct nvkm_devinit *);
index 9891eadca1ce85545e5ecab77e8d29c79ce30a4c..1410befd2285a3a2f8336b531352519adc748ece 100644 (file)
@@ -136,8 +136,8 @@ nv05_devinit = {
 };
 
 int
-nv05_devinit_new(struct nvkm_device *device, int index,
+nv05_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_devinit **pinit)
 {
-       return nv04_devinit_new_(&nv05_devinit, device, index, pinit);
+       return nv04_devinit_new_(&nv05_devinit, device, type, inst, pinit);
 }
index 570822f83acf5f539fb2322493b5a7c926919b42..a6aa8786d610fd855efc77dafd667adec2ad63f2 100644 (file)
@@ -106,8 +106,8 @@ nv10_devinit = {
 };
 
 int
-nv10_devinit_new(struct nvkm_device *device, int index,
+nv10_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_devinit **pinit)
 {
-       return nv04_devinit_new_(&nv10_devinit, device, index, pinit);
+       return nv04_devinit_new_(&nv10_devinit, device, type, inst, pinit);
 }
index fefafec7e2a7cb7b695dd7b5b6b6b80c1629b97d..4cc5ef9a5a63f3a0910d7b5440093c5cc657839f 100644 (file)
@@ -35,8 +35,8 @@ nv1a_devinit = {
 };
 
 int
-nv1a_devinit_new(struct nvkm_device *device, int index,
+nv1a_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_devinit **pinit)
 {
-       return nv04_devinit_new_(&nv1a_devinit, device, index, pinit);
+       return nv04_devinit_new_(&nv1a_devinit, device, type, inst, pinit);
 }
index 4ef04e0d8826117679bcd91ebb08569f5301db75..67f46df723e43c4b6ddf09c9f82214666650af4f 100644 (file)
@@ -72,8 +72,8 @@ nv20_devinit = {
 };
 
 int
-nv20_devinit_new(struct nvkm_device *device, int index,
+nv20_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_devinit **pinit)
 {
-       return nv04_devinit_new_(&nv20_devinit, device, index, pinit);
+       return nv04_devinit_new_(&nv20_devinit, device, type, inst, pinit);
 }
index d7947c4391dcec107f896d685e558fc074ac8fba..380995d398b1c8c0bbe36be93962a1c6876a45eb 100644 (file)
@@ -85,7 +85,7 @@ nv50_devinit_disable(struct nvkm_devinit *init)
        u64 disable = 0ULL;
 
        if (!(r001540 & 0x40000000))
-               disable |= (1ULL << NVKM_ENGINE_MPEG);
+               nvkm_subdev_disable(device, NVKM_ENGINE_MPEG, 0);
 
        return disable;
 }
@@ -101,8 +101,8 @@ nv50_devinit_preinit(struct nvkm_devinit *base)
         * missing, assume it's a secondary gpu which requires post
         */
        if (!base->post) {
-               u64 disable = nvkm_devinit_disable(base);
-               if (disable & (1ULL << NVKM_ENGINE_DISP))
+               nvkm_devinit_disable(base);
+               if (!device->disp)
                        base->post = true;
        }
 
@@ -148,9 +148,8 @@ nv50_devinit_init(struct nvkm_devinit *base)
 }
 
 int
-nv50_devinit_new_(const struct nvkm_devinit_func *func,
-                 struct nvkm_device *device, int index,
-                 struct nvkm_devinit **pinit)
+nv50_devinit_new_(const struct nvkm_devinit_func *func, struct nvkm_device *device,
+                 enum nvkm_subdev_type type, int inst, struct nvkm_devinit **pinit)
 {
        struct nv50_devinit *init;
 
@@ -158,7 +157,7 @@ nv50_devinit_new_(const struct nvkm_devinit_func *func,
                return -ENOMEM;
        *pinit = &init->base;
 
-       nvkm_devinit_ctor(func, device, index, &init->base);
+       nvkm_devinit_ctor(func, device, type, inst, &init->base);
        return 0;
 }
 
@@ -172,8 +171,8 @@ nv50_devinit = {
 };
 
 int
-nv50_devinit_new(struct nvkm_device *device, int index,
+nv50_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_devinit **pinit)
 {
-       return nv50_devinit_new_(&nv50_devinit, device, index, pinit);
+       return nv50_devinit_new_(&nv50_devinit, device, type, inst, pinit);
 }
index e8d37a6145a2645e7903c9756ea96c32c9b2a9e1..987a7f478b84bb11368026780e4f75f0b35b4b1b 100644 (file)
@@ -9,7 +9,7 @@ struct nv50_devinit {
        u32 r001540;
 };
 
-int nv50_devinit_new_(const struct nvkm_devinit_func *, struct nvkm_device *,
+int nv50_devinit_new_(const struct nvkm_devinit_func *, struct nvkm_device *, enum nvkm_subdev_type,
                      int, struct nvkm_devinit **);
 void nv50_devinit_preinit(struct nvkm_devinit *);
 void nv50_devinit_init(struct nvkm_devinit *);
index 05961e624264754078e6bc48bc669db3f978c54f..dd8b038a8ceee402f85f6b5421dcbe50356fca09 100644 (file)
@@ -16,7 +16,8 @@ struct nvkm_devinit_func {
 };
 
 void nvkm_devinit_ctor(const struct nvkm_devinit_func *, struct nvkm_device *,
-                      int index, struct nvkm_devinit *);
+                      enum nvkm_subdev_type, int inst, struct nvkm_devinit *);
+u64 nvkm_devinit_disable(struct nvkm_devinit *);
 
 int nv04_devinit_post(struct nvkm_devinit *, bool);
 int tu102_devinit_post(struct nvkm_devinit *, bool);
index 9a469bf482f2f5bb13b270c625d9fc37b476df2c..634f64f88fc8be391f3efba4e0ff8744eed9e94c 100644 (file)
@@ -82,8 +82,8 @@ tu102_devinit = {
 };
 
 int
-tu102_devinit_new(struct nvkm_device *device, int index,
-               struct nvkm_devinit **pinit)
+tu102_devinit_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                 struct nvkm_devinit **pinit)
 {
-       return nv50_devinit_new_(&tu102_devinit, device, index, pinit);
+       return nv50_devinit_new_(&tu102_devinit, device, type, inst, pinit);
 }
index f6dca97140d6bdf877c97e5348bcec3f48ccf5c4..fd54fa504efa04a50de2cd1fced419f1e6aad9e6 100644 (file)
@@ -170,12 +170,12 @@ nvkm_fault = {
 
 int
 nvkm_fault_new_(const struct nvkm_fault_func *func, struct nvkm_device *device,
-               int index, struct nvkm_fault **pfault)
+               enum nvkm_subdev_type type, int inst, struct nvkm_fault **pfault)
 {
        struct nvkm_fault *fault;
        if (!(fault = *pfault = kzalloc(sizeof(*fault), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&nvkm_fault, device, index, &fault->subdev);
+       nvkm_subdev_ctor(&nvkm_fault, device, type, inst, &fault->subdev);
        fault->func = func;
        fault->user.ctor = nvkm_ufault_new;
        fault->user.base = func->user.base;
index f6b189cc43301f05b6220651f558830e2196a4bc..6af7959e02ea64df99415fc111998522c1aa54e6 100644 (file)
@@ -30,7 +30,7 @@ void
 gp100_fault_buffer_intr(struct nvkm_fault_buffer *buffer, bool enable)
 {
        struct nvkm_device *device = buffer->fault->subdev.device;
-       nvkm_mc_intr_mask(device, NVKM_SUBDEV_FAULT, enable);
+       nvkm_mc_intr_mask(device, NVKM_SUBDEV_FAULT, 0, enable);
 }
 
 void
@@ -82,8 +82,8 @@ gp100_fault = {
 };
 
 int
-gp100_fault_new(struct nvkm_device *device, int index,
+gp100_fault_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_fault **pfault)
 {
-       return nvkm_fault_new_(&gp100_fault, device, index, pfault);
+       return nvkm_fault_new_(&gp100_fault, device, type, inst, pfault);
 }
index 9e66d1f7654d4a7ad9843676ff21983e1b1771c9..89e0bc96fb92dd5ec5f871a78c453adca8c600d5 100644 (file)
@@ -46,8 +46,8 @@ gp10b_fault = {
 };
 
 int
-gp10b_fault_new(struct nvkm_device *device, int index,
+gp10b_fault_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_fault **pfault)
 {
-       return nvkm_fault_new_(&gp10b_fault, device, index, pfault);
+       return nvkm_fault_new_(&gp10b_fault, device, type, inst, pfault);
 }
index 2707be4ffabc37773fd01838eaa3481bfdbde597..cd9d2ade5ac7a5c5174ecfc0ce5995055ada4917 100644 (file)
@@ -228,8 +228,8 @@ gv100_fault = {
 };
 
 int
-gv100_fault_new(struct nvkm_device *device, int index,
+gv100_fault_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_fault **pfault)
 {
-       return nvkm_fault_new_(&gv100_fault, device, index, pfault);
+       return nvkm_fault_new_(&gv100_fault, device, type, inst, pfault);
 }
index f6f1dd7eee1ff5dd394c4b3f5efdc1ce3cb039c8..36681c347fb597a631a1909200d63e148f38ea70 100644 (file)
@@ -18,8 +18,8 @@ struct nvkm_fault_buffer {
        u64 addr;
 };
 
-int nvkm_fault_new_(const struct nvkm_fault_func *, struct nvkm_device *,
-                   int index, struct nvkm_fault **);
+int nvkm_fault_new_(const struct nvkm_fault_func *, struct nvkm_device *, enum nvkm_subdev_type,
+                   int inst, struct nvkm_fault **);
 
 struct nvkm_fault_func {
        int (*oneinit)(struct nvkm_fault *);
index f080051b0c65fe434911a41b2443a9a7df213b3d..91eb6729c84d67977b61b15f59af10658fdaf568 100644 (file)
@@ -37,7 +37,7 @@ tu102_fault_buffer_intr(struct nvkm_fault_buffer *buffer, bool enable)
         */
        struct nvkm_device *device = buffer->fault->subdev.device;
 
-       nvkm_mc_intr_mask(device, NVKM_SUBDEV_FAULT, enable);
+       nvkm_mc_intr_mask(device, NVKM_SUBDEV_FAULT, 0, enable);
 }
 
 static void
@@ -181,8 +181,8 @@ tu102_fault = {
 };
 
 int
-tu102_fault_new(struct nvkm_device *device, int index,
+tu102_fault_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_fault **pfault)
 {
-       return nvkm_fault_new_(&tu102_fault, device, index, pfault);
+       return nvkm_fault_new_(&tu102_fault, device, type, inst, pfault);
 }
index 5940e0dea2f8b96f3d9f548d33dc75d14a088e6c..6faaea948fc44d5ac8ff487f47f26f08af55e20a 100644 (file)
@@ -122,7 +122,7 @@ nvkm_fb_oneinit(struct nvkm_subdev *subdev)
                nvkm_debug(subdev, "%d comptags\n", tags);
        }
 
-       return nvkm_mm_init(&fb->tags, 0, 0, tags, 1);
+       return nvkm_mm_init(&fb->tags.mm, 0, 0, tags, 1);
 }
 
 static int
@@ -205,7 +205,9 @@ nvkm_fb_dtor(struct nvkm_subdev *subdev)
        for (i = 0; i < fb->tile.regions; i++)
                fb->func->tile.fini(fb, i, &fb->tile.region[i]);
 
-       nvkm_mm_fini(&fb->tags);
+       nvkm_mm_fini(&fb->tags.mm);
+       mutex_destroy(&fb->tags.mutex);
+
        nvkm_ram_del(&fb->ram);
 
        nvkm_blob_dtor(&fb->vpr_scrubber);
@@ -225,21 +227,21 @@ nvkm_fb = {
 
 void
 nvkm_fb_ctor(const struct nvkm_fb_func *func, struct nvkm_device *device,
-            int index, struct nvkm_fb *fb)
+            enum nvkm_subdev_type type, int inst, struct nvkm_fb *fb)
 {
-       nvkm_subdev_ctor(&nvkm_fb, device, index, &fb->subdev);
+       nvkm_subdev_ctor(&nvkm_fb, device, type, inst, &fb->subdev);
        fb->func = func;
        fb->tile.regions = fb->func->tile.regions;
-       fb->page = nvkm_longopt(device->cfgopt, "NvFbBigPage",
-                               fb->func->default_bigpage);
+       fb->page = nvkm_longopt(device->cfgopt, "NvFbBigPage", fb->func->default_bigpage);
+       mutex_init(&fb->tags.mutex);
 }
 
 int
 nvkm_fb_new_(const struct nvkm_fb_func *func, struct nvkm_device *device,
-            int index, struct nvkm_fb **pfb)
+            enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
        if (!(*pfb = kzalloc(sizeof(**pfb), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_fb_ctor(func, device, index, *pfb);
+       nvkm_fb_ctor(func, device, type, inst, *pfb);
        return 0;
 }
index 06bf95c0c5493bd37866eb38d32b6ba323c69156..770a4ad391229d35baff9ff49528864f4d17eb03 100644 (file)
@@ -32,7 +32,7 @@ g84_fb = {
 };
 
 int
-g84_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+g84_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nv50_fb_new_(&g84_fb, device, index, pfb);
+       return nv50_fb_new_(&g84_fb, device, type, inst, pfb);
 }
index bf82686851cd4a5b47e830448c49058ddf92c615..b47bebfbc26f97bcb27673cf2b67b99484363952 100644 (file)
@@ -34,7 +34,7 @@ ga100_fb = {
 };
 
 int
-ga100_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+ga100_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gp102_fb_new_(&ga100_fb, device, index, pfb);
+       return gp102_fb_new_(&ga100_fb, device, type, inst, pfb);
 }
index bcecf84a6e67995a50d527cf73dab04a77e67105..6ea7908f05638cd1b58221ffe0a24314fac5ded9 100644 (file)
@@ -34,7 +34,7 @@ ga102_fb = {
 };
 
 int
-ga102_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+ga102_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gp102_fb_new_(&ga102_fb, device, index, pfb);
+       return gp102_fb_new_(&ga102_fb, device, type, inst, pfb);
 }
index e8dc4e913494a5e8791b171fce4bbe54deec08af..9dcc40f9ef797b8f310e5b00b4af3847d3a1d8e5 100644 (file)
@@ -117,13 +117,13 @@ gf100_fb_dtor(struct nvkm_fb *base)
 
 int
 gf100_fb_new_(const struct nvkm_fb_func *func, struct nvkm_device *device,
-             int index, struct nvkm_fb **pfb)
+             enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
        struct gf100_fb *fb;
 
        if (!(fb = kzalloc(sizeof(*fb), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_fb_ctor(func, device, index, &fb->base);
+       nvkm_fb_ctor(func, device, type, inst, &fb->base);
        *pfb = &fb->base;
 
        return 0;
@@ -141,7 +141,7 @@ gf100_fb = {
 };
 
 int
-gf100_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gf100_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gf100_fb_new_(&gf100_fb, device, index, pfb);
+       return gf100_fb_new_(&gf100_fb, device, type, inst, pfb);
 }
index 2ed7cdaab37c36fad1e333162ed9b09a2380e494..0cac7b06acc818d2f97a307b9fb971c2526eaf19 100644 (file)
@@ -10,8 +10,8 @@ struct gf100_fb {
        dma_addr_t r100c10;
 };
 
-int gf100_fb_new_(const struct nvkm_fb_func *, struct nvkm_device *,
-                 int index, struct nvkm_fb **);
+int gf100_fb_new_(const struct nvkm_fb_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                 struct nvkm_fb **);
 void *gf100_fb_dtor(struct nvkm_fb *);
 void gf100_fb_init(struct nvkm_fb *);
 void gf100_fb_intr(struct nvkm_fb *);
index 4a9f463745b53450452e2796bdbfcbecdad12669..76678dd60f93f9fd7373615776d73266abbe7344 100644 (file)
@@ -36,7 +36,7 @@ gf108_fb = {
 };
 
 int
-gf108_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gf108_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gf100_fb_new_(&gf108_fb, device, index, pfb);
+       return gf100_fb_new_(&gf108_fb, device, type, inst, pfb);
 }
index 48fd98e08baae33993f9440581c61b8cb9e580ce..f73442ccb424b491461054cb30abe87aaf6f8520 100644 (file)
@@ -83,7 +83,7 @@ gk104_fb = {
 };
 
 int
-gk104_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gk104_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gf100_fb_new_(&gk104_fb, device, index, pfb);
+       return gf100_fb_new_(&gk104_fb, device, type, inst, pfb);
 }
index 0695e5dd360e4b419c68be377ae8f0f4d85bfaa2..45d6cdffafeedc5f326bc45556357d882531f7d9 100644 (file)
@@ -65,7 +65,7 @@ gk110_fb = {
 };
 
 int
-gk110_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gk110_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gf100_fb_new_(&gk110_fb, device, index, pfb);
+       return gf100_fb_new_(&gk110_fb, device, type, inst, pfb);
 }
index a7e29b1250941e4684f7a49cde5dca3195d2bd6d..6bc42f89d8c4100a100750b70a0012ab5dd34776 100644 (file)
@@ -34,7 +34,7 @@ gk20a_fb = {
 };
 
 int
-gk20a_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gk20a_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gf100_fb_new_(&gk20a_fb, device, index, pfb);
+       return gf100_fb_new_(&gk20a_fb, device, type, inst, pfb);
 }
index 69c876d5d1c11ed0af14c399644ae500545cadcd..de52462a92bf0ecd2b85a509091800e7b9761444 100644 (file)
@@ -36,7 +36,7 @@ gm107_fb = {
 };
 
 int
-gm107_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gm107_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gf100_fb_new_(&gm107_fb, device, index, pfb);
+       return gf100_fb_new_(&gm107_fb, device, type, inst, pfb);
 }
index d3b8c3367152b4b18b58ecc38770c3cf4279d962..5acf8d15d06fb70a5970f6082e69f1cffbd937b7 100644 (file)
@@ -67,7 +67,7 @@ gm200_fb = {
 };
 
 int
-gm200_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gm200_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gf100_fb_new_(&gm200_fb, device, index, pfb);
+       return gf100_fb_new_(&gm200_fb, device, type, inst, pfb);
 }
index 12db61e31128ce0f1e1904b072a52a2bc9b809d1..86f61a3f2feae1563be947d66b99921232a181d8 100644 (file)
@@ -34,7 +34,7 @@ gm20b_fb = {
 };
 
 int
-gm20b_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gm20b_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gf100_fb_new_(&gm20b_fb, device, index, pfb);
+       return gf100_fb_new_(&gm20b_fb, device, type, inst, pfb);
 }
index 8205ce436b3e847663d5d44ab35c9e13885008a4..09e943edc3628256f514a8ba7050b0775eeafdce 100644 (file)
@@ -71,7 +71,7 @@ gp100_fb = {
 };
 
 int
-gp100_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gp100_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gf100_fb_new_(&gp100_fb, device, index, pfb);
+       return gf100_fb_new_(&gp100_fb, device, type, inst, pfb);
 }
index fc8c93aa3da52e6b85fcb99a8d83a1589023b0c6..0e78b3d734a0fbfb0f1f047a1cf93f3181be8002 100644 (file)
@@ -114,9 +114,9 @@ gp102_fb = {
 
 int
 gp102_fb_new_(const struct nvkm_fb_func *func, struct nvkm_device *device,
-             int index, struct nvkm_fb **pfb)
+             enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       int ret = gf100_fb_new_(func, device, index, pfb);
+       int ret = gf100_fb_new_(func, device, type, inst, pfb);
        if (ret)
                return ret;
 
@@ -126,9 +126,9 @@ gp102_fb_new_(const struct nvkm_fb_func *func, struct nvkm_device *device,
 }
 
 int
-gp102_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gp102_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gp102_fb_new_(&gp102_fb, device, index, pfb);
+       return gp102_fb_new_(&gp102_fb, device, type, inst, pfb);
 }
 
 MODULE_FIRMWARE("nvidia/gp102/nvdec/scrubber.bin");
index af8e43979dc1154866ec13631ce0fa7a8dfd9a4f..84c9815a6d48aa5975815c379033e9612903e8b2 100644 (file)
@@ -31,7 +31,7 @@ gp10b_fb = {
 };
 
 int
-gp10b_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gp10b_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gf100_fb_new_(&gp10b_fb, device, index, pfb);
+       return gf100_fb_new_(&gp10b_fb, device, type, inst, pfb);
 }
index 9266559b45f971c44569508093c99a25de1f106a..c1ec9758617c69e40ecc6dd4828b80209ab52c83 100644 (file)
@@ -32,7 +32,7 @@ gt215_fb = {
 };
 
 int
-gt215_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gt215_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nv50_fb_new_(&gt215_fb, device, index, pfb);
+       return nv50_fb_new_(&gt215_fb, device, type, inst, pfb);
 }
index feda86a5fba8592000ac2657a815b72203cbaf91..63daa83ae12d13252e408986bf8a4ec405c01944 100644 (file)
@@ -42,9 +42,9 @@ gv100_fb = {
 };
 
 int
-gv100_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+gv100_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return gp102_fb_new_(&gv100_fb, device, index, pfb);
+       return gp102_fb_new_(&gv100_fb, device, type, inst, pfb);
 }
 
 MODULE_FIRMWARE("nvidia/gv100/nvdec/scrubber.bin");
index 73b3b86a282622a39998b0b90761edeb8c8e49cb..70c7b08ee0a65936f05c4ea896b29755dfa742d0 100644 (file)
@@ -31,7 +31,7 @@ mcp77_fb = {
 };
 
 int
-mcp77_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+mcp77_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nv50_fb_new_(&mcp77_fb, device, index, pfb);
+       return nv50_fb_new_(&mcp77_fb, device, type, inst, pfb);
 }
index 6d11e32ec7addc2497e3bab52d22355ebcce1ea1..308d955168e8b1c3e6a78ed3cac7233ae716ce30 100644 (file)
@@ -31,7 +31,7 @@ mcp89_fb = {
 };
 
 int
-mcp89_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+mcp89_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nv50_fb_new_(&mcp89_fb, device, index, pfb);
+       return nv50_fb_new_(&mcp89_fb, device, type, inst, pfb);
 }
index c886664533c81dd3fc056a6e5220d6705ec4d53b..8d5a007ecc47658c9db981a1cd57a2cb0aca02eb 100644 (file)
@@ -44,7 +44,7 @@ nv04_fb = {
 };
 
 int
-nv04_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv04_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv04_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv04_fb, device, type, inst, pfb);
 }
index c998b7e96aa3f0287dd22f2a47e4eb44adb152cb..7d2c16b27032f73a325d80f31d4df7b771e28494 100644 (file)
@@ -64,7 +64,7 @@ nv10_fb = {
 };
 
 int
-nv10_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv10_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv10_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv10_fb, device, type, inst, pfb);
 }
index 7b9f04f44af8940cd0043374ec66c1f4791b9067..4bdad2abd56f6252a4e90fee22c766c6fab71211 100644 (file)
@@ -36,7 +36,7 @@ nv1a_fb = {
 };
 
 int
-nv1a_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv1a_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv1a_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv1a_fb, device, type, inst, pfb);
 }
index a021d21ff153a3fe40dcb871682976e00c98816c..d254f27f9b3768cf983742769b439475f14e27ac 100644 (file)
@@ -45,7 +45,7 @@ nv20_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
 {
        u32 tiles = DIV_ROUND_UP(size, 0x40);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x40);
-       if (!nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+       if (!nvkm_mm_head(&fb->tags.mm, 0, 1, tags, tags, 1, &tile->tag)) {
                if (!(flags & 2)) tile->zcomp = 0x00000000; /* Z16 */
                else              tile->zcomp = 0x04000000; /* Z24S8 */
                tile->zcomp |= tile->tag->offset;
@@ -63,7 +63,7 @@ nv20_fb_tile_fini(struct nvkm_fb *fb, int i, struct nvkm_fb_tile *tile)
        tile->limit = 0;
        tile->pitch = 0;
        tile->zcomp = 0;
-       nvkm_mm_free(&fb->tags, &tile->tag);
+       nvkm_mm_free(&fb->tags.mm, &tile->tag);
 }
 
 void
@@ -96,7 +96,7 @@ nv20_fb = {
 };
 
 int
-nv20_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv20_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv20_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv20_fb, device, type, inst, pfb);
 }
index 7709f5fe9a458b77b5006126636d91d1a090a691..47da66dea6e6e2feed8ef96e93624197057eae26 100644 (file)
@@ -32,7 +32,7 @@ nv25_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
 {
        u32 tiles = DIV_ROUND_UP(size, 0x40);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x40);
-       if (!nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+       if (!nvkm_mm_head(&fb->tags.mm, 0, 1, tags, tags, 1, &tile->tag)) {
                if (!(flags & 2)) tile->zcomp = 0x00100000; /* Z16 */
                else              tile->zcomp = 0x00200000; /* Z24S8 */
                tile->zcomp |= tile->tag->offset;
@@ -54,7 +54,7 @@ nv25_fb = {
 };
 
 int
-nv25_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv25_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv25_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv25_fb, device, type, inst, pfb);
 }
index 8aa7826665079f8ed0fabe43c14f7d3c5d54569b..0f87efb636d5d62609ad1c6f14a37a4562d3a29f 100644 (file)
@@ -51,7 +51,7 @@ nv30_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
 {
        u32 tiles = DIV_ROUND_UP(size, 0x40);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x40);
-       if (!nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+       if (!nvkm_mm_head(&fb->tags.mm, 0, 1, tags, tags, 1, &tile->tag)) {
                if (flags & 2) tile->zcomp |= 0x01000000; /* Z16 */
                else           tile->zcomp |= 0x02000000; /* Z24S8 */
                tile->zcomp |= ((tile->tag->offset           ) >> 6);
@@ -127,7 +127,7 @@ nv30_fb = {
 };
 
 int
-nv30_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv30_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv30_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv30_fb, device, type, inst, pfb);
 }
index 6e83dcff72e08eed9f6b5fda4a17608313a39bab..0694dcfd107e6dc9bcd4075900f7ad40509c218e 100644 (file)
@@ -32,7 +32,7 @@ nv35_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
 {
        u32 tiles = DIV_ROUND_UP(size, 0x40);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x40);
-       if (!nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+       if (!nvkm_mm_head(&fb->tags.mm, 0, 1, tags, tags, 1, &tile->tag)) {
                if (flags & 2) tile->zcomp |= 0x04000000; /* Z16 */
                else           tile->zcomp |= 0x08000000; /* Z24S8 */
                tile->zcomp |= ((tile->tag->offset           ) >> 6);
@@ -56,7 +56,7 @@ nv35_fb = {
 };
 
 int
-nv35_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv35_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv35_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv35_fb, device, type, inst, pfb);
 }
index 2a07617bb44cb107866ae25b704d311024cdbb32..1a39770372f15d15055017cfd5eb537a580b5866 100644 (file)
@@ -32,7 +32,7 @@ nv36_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
 {
        u32 tiles = DIV_ROUND_UP(size, 0x40);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x40);
-       if (!nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+       if (!nvkm_mm_head(&fb->tags.mm, 0, 1, tags, tags, 1, &tile->tag)) {
                if (flags & 2) tile->zcomp |= 0x10000000; /* Z16 */
                else           tile->zcomp |= 0x20000000; /* Z24S8 */
                tile->zcomp |= ((tile->tag->offset           ) >> 6);
@@ -56,7 +56,7 @@ nv36_fb = {
 };
 
 int
-nv36_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv36_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv36_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv36_fb, device, type, inst, pfb);
 }
index 955160778b5b82ab928bf5c56b095fc7770c7266..77dbb9d6ba480dde95758023feae72058a36eed5 100644 (file)
@@ -33,7 +33,7 @@ nv40_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
        u32 tiles = DIV_ROUND_UP(size, 0x80);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x100);
        if ( (flags & 2) &&
-           !nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+           !nvkm_mm_head(&fb->tags.mm, 0, 1, tags, tags, 1, &tile->tag)) {
                tile->zcomp  = 0x28000000; /* Z24S8_SPLIT_GRAD */
                tile->zcomp |= ((tile->tag->offset           ) >> 8);
                tile->zcomp |= ((tile->tag->offset + tags - 1) >> 8) << 13;
@@ -62,7 +62,7 @@ nv40_fb = {
 };
 
 int
-nv40_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv40_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv40_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv40_fb, device, type, inst, pfb);
 }
index b77f08d34cc35a34d66e7873eca701206e6ad1dd..0f9d9e48e7add9a03fe5011651def9c62610bb38 100644 (file)
@@ -56,7 +56,7 @@ nv41_fb = {
 };
 
 int
-nv41_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv41_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv41_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv41_fb, device, type, inst, pfb);
 }
index b59dc486083decb9714550f7cf9bd6c36b62d87d..b1046ee9f0eaf53f4a73aa710caaa56c94306639 100644 (file)
@@ -65,7 +65,7 @@ nv44_fb = {
 };
 
 int
-nv44_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv44_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv44_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv44_fb, device, type, inst, pfb);
 }
index cab7d20fa03981e3a04754de86e4823db1fd6709..0d78de422dfa823989aaad8bbe0ac30de7764ba5 100644 (file)
@@ -51,7 +51,7 @@ nv46_fb = {
 };
 
 int
-nv46_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv46_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv46_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv46_fb, device, type, inst, pfb);
 }
index a8b0ad4c871db966129c6df0642477b5c6a6db63..5cedde29c8eee93ea36b65affaaa19b038eb8b28 100644 (file)
@@ -39,7 +39,7 @@ nv47_fb = {
 };
 
 int
-nv47_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv47_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv47_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv47_fb, device, type, inst, pfb);
 }
index d0b317bb0252e5b05a6328158ad504b628e4a7dc..95cc099603d8bfb46f666c3c2545410591c36404 100644 (file)
@@ -39,7 +39,7 @@ nv49_fb = {
 };
 
 int
-nv49_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv49_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv49_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv49_fb, device, type, inst, pfb);
 }
index 6a6f0c0860713c594f2ad65b1e3f9a94fbb9f596..c9f3148f4e75cfd9aee63b6c9c3d185cb588a5ff 100644 (file)
@@ -37,7 +37,7 @@ nv4e_fb = {
 };
 
 int
-nv4e_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv4e_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nvkm_fb_new_(&nv4e_fb, device, index, pfb);
+       return nvkm_fb_new_(&nv4e_fb, device, type, inst, pfb);
 }
index b2f5bf8144eaaa660e085190c950bb9afbda5b2d..95fd8f83401025bdb219b894dcddceb9697a6c70 100644 (file)
@@ -262,16 +262,15 @@ nv50_fb_ = {
 
 int
 nv50_fb_new_(const struct nv50_fb_func *func, struct nvkm_device *device,
-            int index, struct nvkm_fb **pfb)
+            enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
        struct nv50_fb *fb;
 
        if (!(fb = kzalloc(sizeof(*fb), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_fb_ctor(&nv50_fb_, device, index, &fb->base);
+       nvkm_fb_ctor(&nv50_fb_, device, type, inst, &fb->base);
        fb->func = func;
        *pfb = &fb->base;
-
        return 0;
 }
 
@@ -283,7 +282,7 @@ nv50_fb = {
 };
 
 int
-nv50_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+nv50_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
 {
-       return nv50_fb_new_(&nv50_fb, device, index, pfb);
+       return nv50_fb_new_(&nv50_fb, device, type, inst, pfb);
 }
index 5e2b0c9539ede919ca40d2d93a6e0dc8d5abb7bb..a5e673859a90165533fc935d054428c5afb05f72 100644 (file)
@@ -17,6 +17,6 @@ struct nv50_fb_func {
        u32 trap;
 };
 
-int nv50_fb_new_(const struct nv50_fb_func *, struct nvkm_device *, int index,
+int nv50_fb_new_(const struct nv50_fb_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
                 struct nvkm_fb **pfb);
 #endif
index 66932ac10d15c68b65e80d982a90e54873e3d393..3f1be9780c65fdd35c4f4088f254cf72c21d145b 100644 (file)
@@ -38,9 +38,9 @@ struct nvkm_fb_func {
 };
 
 void nvkm_fb_ctor(const struct nvkm_fb_func *, struct nvkm_device *device,
-                 int index, struct nvkm_fb *);
+                 enum nvkm_subdev_type type, int inst, struct nvkm_fb *);
 int nvkm_fb_new_(const struct nvkm_fb_func *, struct nvkm_device *device,
-                int index, struct nvkm_fb **);
+                enum nvkm_subdev_type type, int inst, struct nvkm_fb **);
 int nvkm_fb_bios_memtype(struct nvkm_bios *);
 
 void nv10_fb_tile_init(struct nvkm_fb *, int i, u32 addr, u32 size,
@@ -78,7 +78,7 @@ int gm200_fb_init_page(struct nvkm_fb *);
 void gp100_fb_init_remapper(struct nvkm_fb *);
 void gp100_fb_init_unkn(struct nvkm_fb *);
 
-int gp102_fb_new_(const struct nvkm_fb_func *, struct nvkm_device *, int,
+int gp102_fb_new_(const struct nvkm_fb_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
                  struct nvkm_fb **);
 bool gp102_fb_vpr_scrub_required(struct nvkm_fb *);
 int gp102_fb_vpr_scrub(struct nvkm_fb *);
index b11867f682cb933fe60996092e29357e4aab8154..03b1bdb27770a62e6dbc2414ccd13ae7e0b0b060 100644 (file)
@@ -81,12 +81,12 @@ nvkm_vram_dtor(struct nvkm_memory *memory)
        struct nvkm_vram *vram = nvkm_vram(memory);
        struct nvkm_mm_node *next = vram->mn;
        struct nvkm_mm_node *node;
-       mutex_lock(&vram->ram->fb->subdev.mutex);
+       mutex_lock(&vram->ram->mutex);
        while ((node = next)) {
                next = node->next;
                nvkm_mm_free(&vram->ram->vram, &node);
        }
-       mutex_unlock(&vram->ram->fb->subdev.mutex);
+       mutex_unlock(&vram->ram->mutex);
        return vram;
 }
 
@@ -126,7 +126,7 @@ nvkm_ram_get(struct nvkm_device *device, u8 heap, u8 type, u8 rpage, u64 size,
        vram->page = page;
        *pmemory = &vram->memory;
 
-       mutex_lock(&ram->fb->subdev.mutex);
+       mutex_lock(&ram->mutex);
        node = &vram->mn;
        do {
                if (back)
@@ -134,7 +134,7 @@ nvkm_ram_get(struct nvkm_device *device, u8 heap, u8 type, u8 rpage, u64 size,
                else
                        ret = nvkm_mm_head(mm, heap, type, max, min, align, &r);
                if (ret) {
-                       mutex_unlock(&ram->fb->subdev.mutex);
+                       mutex_unlock(&ram->mutex);
                        nvkm_memory_unref(pmemory);
                        return ret;
                }
@@ -143,7 +143,7 @@ nvkm_ram_get(struct nvkm_device *device, u8 heap, u8 type, u8 rpage, u64 size,
                node = &r->next;
                max -= r->length;
        } while (max);
-       mutex_unlock(&ram->fb->subdev.mutex);
+       mutex_unlock(&ram->mutex);
        return 0;
 }
 
@@ -163,6 +163,7 @@ nvkm_ram_del(struct nvkm_ram **pram)
                if (ram->func->dtor)
                        *pram = ram->func->dtor(ram);
                nvkm_mm_fini(&ram->vram);
+               mutex_destroy(&ram->mutex);
                kfree(*pram);
                *pram = NULL;
        }
@@ -196,6 +197,7 @@ nvkm_ram_ctor(const struct nvkm_ram_func *func, struct nvkm_fb *fb,
        ram->fb = fb;
        ram->type = type;
        ram->size = size;
+       mutex_init(&ram->mutex);
 
        if (!nvkm_mm_initialised(&ram->vram)) {
                ret = nvkm_mm_init(&ram->vram, NVKM_RAM_MM_NORMAL, 0,
index d350d92852d285ac65293f73224b4a2a02c3e09b..2b678b60b4d3e15e91528bfb789fd2d4f303f741 100644 (file)
@@ -260,7 +260,7 @@ gk104_ram_calc_gddr5(struct gk104_ram *ram, u32 freq)
        ram_mask(fuc, 0x10f808, 0x40000000, 0x40000000);
        ram_block(fuc);
 
-       if (nvkm_device_engine(ram->base.fb->subdev.device, NVKM_ENGINE_DISP))
+       if (ram->base.fb->subdev.device->disp)
                ram_wr32(fuc, 0x62c000, 0x0f0f0000);
 
        /* MR1: turn termination on early, for some reason.. */
@@ -661,7 +661,7 @@ gk104_ram_calc_gddr5(struct gk104_ram *ram, u32 freq)
 
        ram_unblock(fuc);
 
-       if (nvkm_device_engine(ram->base.fb->subdev.device, NVKM_ENGINE_DISP))
+       if (ram->base.fb->subdev.device->disp)
                ram_wr32(fuc, 0x62c000, 0x0f0f0f00);
 
        if (next->bios.rammap_11_08_01)
@@ -711,7 +711,7 @@ gk104_ram_calc_sddr3(struct gk104_ram *ram, u32 freq)
        ram_mask(fuc, 0x10f808, 0x40000000, 0x40000000);
        ram_block(fuc);
 
-       if (nvkm_device_engine(ram->base.fb->subdev.device, NVKM_ENGINE_DISP))
+       if (ram->base.fb->subdev.device->disp)
                ram_wr32(fuc, 0x62c000, 0x0f0f0000);
 
        if (vc == 1 && ram_have(fuc, gpio2E)) {
@@ -943,7 +943,7 @@ gk104_ram_calc_sddr3(struct gk104_ram *ram, u32 freq)
 
        ram_unblock(fuc);
 
-       if (nvkm_device_engine(ram->base.fb->subdev.device, NVKM_ENGINE_DISP))
+       if (ram->base.fb->subdev.device->disp)
                ram_wr32(fuc, 0x62c000, 0x0f0f0f00);
 
        if (next->bios.rammap_11_08_01)
index 1c3c18ea8cedfcc8fe1699290e35eaea45252483..375dfce09f8402393086884dd4b1c43e4f87f31d 100644 (file)
@@ -42,12 +42,12 @@ nvkm_fuse = {
 
 int
 nvkm_fuse_new_(const struct nvkm_fuse_func *func, struct nvkm_device *device,
-              int index, struct nvkm_fuse **pfuse)
+              enum nvkm_subdev_type type, int inst, struct nvkm_fuse **pfuse)
 {
        struct nvkm_fuse *fuse;
        if (!(fuse = *pfuse = kzalloc(sizeof(*fuse), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&nvkm_fuse, device, index, &fuse->subdev);
+       nvkm_subdev_ctor(&nvkm_fuse, device, type, inst, &fuse->subdev);
        fuse->func = func;
        spin_lock_init(&fuse->lock);
        return 0;
index 13671fedc80593040f488940a84a185e000e92d6..01f770654b1d93e2b5ca1071b2d1a16eeede0f01 100644 (file)
@@ -47,7 +47,8 @@ gf100_fuse = {
 };
 
 int
-gf100_fuse_new(struct nvkm_device *device, int index, struct nvkm_fuse **pfuse)
+gf100_fuse_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fuse **pfuse)
 {
-       return nvkm_fuse_new_(&gf100_fuse, device, index, pfuse);
+       return nvkm_fuse_new_(&gf100_fuse, device, type, inst, pfuse);
 }
index 9aff4ea045060a7d42634ba5990f36a59296b3c4..7dc99492f536e7c90f5d16fc3c1bcd3c77ecd6b9 100644 (file)
@@ -36,7 +36,8 @@ gm107_fuse = {
 };
 
 int
-gm107_fuse_new(struct nvkm_device *device, int index, struct nvkm_fuse **pfuse)
+gm107_fuse_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_fuse **pfuse)
 {
-       return nvkm_fuse_new_(&gm107_fuse, device, index, pfuse);
+       return nvkm_fuse_new_(&gm107_fuse, device, type, inst, pfuse);
 }
index 514c193db25dba1847ffef8a4283801e06d6f0ae..2505e8e1c1d355dc1e22a5e02c66f3eeb7e80f58 100644 (file)
@@ -45,7 +45,8 @@ nv50_fuse = {
 };
 
 int
-nv50_fuse_new(struct nvkm_device *device, int index, struct nvkm_fuse **pfuse)
+nv50_fuse_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_fuse **pfuse)
 {
-       return nvkm_fuse_new_(&nv50_fuse, device, index, pfuse);
+       return nvkm_fuse_new_(&nv50_fuse, device, type, inst, pfuse);
 }
index 2edc612408dd30e8a2898c0dd7fa0d0a8a693ce1..e83d0c30dff65bf53ce946ee19bd8a35643866ce 100644 (file)
@@ -8,6 +8,6 @@ struct nvkm_fuse_func {
        u32 (*read)(struct nvkm_fuse *, u32 addr);
 };
 
-int nvkm_fuse_new_(const struct nvkm_fuse_func *, struct nvkm_device *,
-                  int index, struct nvkm_fuse **);
+int nvkm_fuse_new_(const struct nvkm_fuse_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                  struct nvkm_fuse **);
 #endif
index 914276410ef853a8b080e31eb1f09ef4bd4060e1..048bcc70c3f48f97abde6e901843479ff364ac72 100644 (file)
@@ -241,14 +241,14 @@ nvkm_gpio = {
 
 int
 nvkm_gpio_new_(const struct nvkm_gpio_func *func, struct nvkm_device *device,
-              int index, struct nvkm_gpio **pgpio)
+              enum nvkm_subdev_type type, int inst, struct nvkm_gpio **pgpio)
 {
        struct nvkm_gpio *gpio;
 
        if (!(gpio = *pgpio = kzalloc(sizeof(*gpio), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_subdev_ctor(&nvkm_gpio, device, index, &gpio->subdev);
+       nvkm_subdev_ctor(&nvkm_gpio, device, type, inst, &gpio->subdev);
        gpio->func = func;
 
        return nvkm_event_init(&nvkm_gpio_intr_func, 2, func->lines,
index 6dcda55fb8655fc77e4077904fb02fdbb7ab7c78..114728ccdf8eef551756d3a9d1f6af4d3ed1e369 100644 (file)
@@ -68,7 +68,8 @@ g94_gpio = {
 };
 
 int
-g94_gpio_new(struct nvkm_device *device, int index, struct nvkm_gpio **pgpio)
+g94_gpio_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_gpio **pgpio)
 {
-       return nvkm_gpio_new_(&g94_gpio, device, index, pgpio);
+       return nvkm_gpio_new_(&g94_gpio, device, type, inst, pgpio);
 }
index 62c791baf4008dde51f3db198d96835117578cce..4a96f926b66df2758c40b1ac24317b60422389d8 100644 (file)
@@ -112,7 +112,8 @@ ga102_gpio = {
 };
 
 int
-ga102_gpio_new(struct nvkm_device *device, int index, struct nvkm_gpio **pgpio)
+ga102_gpio_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_gpio **pgpio)
 {
-       return nvkm_gpio_new_(&ga102_gpio, device, index, pgpio);
+       return nvkm_gpio_new_(&ga102_gpio, device, type, inst, pgpio);
 }
index bb7400dfaef859ef75bae804aca6c8b3c9981ebc..ecb19e4f5c48f01ca5f5cbf7c55e9b85f160b9b2 100644 (file)
@@ -80,7 +80,8 @@ gf119_gpio = {
 };
 
 int
-gf119_gpio_new(struct nvkm_device *device, int index, struct nvkm_gpio **pgpio)
+gf119_gpio_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_gpio **pgpio)
 {
-       return nvkm_gpio_new_(&gf119_gpio, device, index, pgpio);
+       return nvkm_gpio_new_(&gf119_gpio, device, type, inst, pgpio);
 }
index 2ead515b853095e5e69a847d47d63e12d98c9e0d..c0e4cdb45520be5b87d3887f2e13b7d47f8fe4cf 100644 (file)
@@ -68,7 +68,8 @@ gk104_gpio = {
 };
 
 int
-gk104_gpio_new(struct nvkm_device *device, int index, struct nvkm_gpio **pgpio)
+gk104_gpio_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_gpio **pgpio)
 {
-       return nvkm_gpio_new_(&gk104_gpio, device, index, pgpio);
+       return nvkm_gpio_new_(&gk104_gpio, device, type, inst, pgpio);
 }
index ae3499b48330d5b1ac70a77f4355403f45bc8390..48ad29b5638f5e44f9d31722a850ca4ea813c44a 100644 (file)
@@ -112,7 +112,8 @@ nv10_gpio = {
 };
 
 int
-nv10_gpio_new(struct nvkm_device *device, int index, struct nvkm_gpio **pgpio)
+nv10_gpio_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_gpio **pgpio)
 {
-       return nvkm_gpio_new_(&nv10_gpio, device, index, pgpio);
+       return nvkm_gpio_new_(&nv10_gpio, device, type, inst, pgpio);
 }
index 73923fd5f7f2e7f0c2b499ea9c9b7323e716c1ca..b86c49762f11b4b89e9ccc2744ca853104442dcd 100644 (file)
@@ -126,7 +126,8 @@ nv50_gpio = {
 };
 
 int
-nv50_gpio_new(struct nvkm_device *device, int index, struct nvkm_gpio **pgpio)
+nv50_gpio_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_gpio **pgpio)
 {
-       return nvkm_gpio_new_(&nv50_gpio, device, index, pgpio);
+       return nvkm_gpio_new_(&nv50_gpio, device, type, inst, pgpio);
 }
index 59e39affe2a080b1abb71ade2835cd43dcb7fe16..6590d81164e7a752a737430bd0f1071a2b8a9c12 100644 (file)
@@ -28,8 +28,8 @@ struct nvkm_gpio_func {
        void (*reset)(struct nvkm_gpio *, u8);
 };
 
-int nvkm_gpio_new_(const struct nvkm_gpio_func *, struct nvkm_device *,
-                  int index, struct nvkm_gpio **);
+int nvkm_gpio_new_(const struct nvkm_gpio_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                  struct nvkm_gpio **);
 
 void nv50_gpio_reset(struct nvkm_gpio *, u8);
 int  nv50_gpio_drive(struct nvkm_gpio *, int, int, int);
index 5a32df0f9992582ff5f9a71fa304605fd510fcef..22574886b81948ce7c4953e657a05ce67f58d42a 100644 (file)
@@ -40,20 +40,18 @@ nvkm_gsp = {
 
 int
 nvkm_gsp_new_(const struct nvkm_gsp_fwif *fwif, struct nvkm_device *device,
-             int index, struct nvkm_gsp **pgsp)
+             enum nvkm_subdev_type type, int inst, struct nvkm_gsp **pgsp)
 {
        struct nvkm_gsp *gsp;
 
        if (!(gsp = *pgsp = kzalloc(sizeof(*gsp), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_subdev_ctor(&nvkm_gsp, device, index, &gsp->subdev);
+       nvkm_subdev_ctor(&nvkm_gsp, device, type, inst, &gsp->subdev);
 
        fwif = nvkm_firmware_load(&gsp->subdev, fwif, "Gsp", gsp);
        if (IS_ERR(fwif))
                return PTR_ERR(fwif);
 
-       return nvkm_falcon_ctor(fwif->flcn, &gsp->subdev,
-                               nvkm_subdev_name[gsp->subdev.index], 0,
-                               &gsp->falcon);
+       return nvkm_falcon_ctor(fwif->flcn, &gsp->subdev, gsp->subdev.name, 0, &gsp->falcon);
 }
index 2114f9b00a28f0718448c0370fa8b9fe18b825ba..2ac7fc934c09172927251d9d073182d4270e0f90 100644 (file)
@@ -49,7 +49,8 @@ gv100_gsp[] = {
 };
 
 int
-gv100_gsp_new(struct nvkm_device *device, int index, struct nvkm_gsp **pgsp)
+gv100_gsp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_gsp **pgsp)
 {
-       return nvkm_gsp_new_(gv100_gsp, device, index, pgsp);
+       return nvkm_gsp_new_(gv100_gsp, device, type, inst, pgsp);
 }
index 92820fb997c1c887a9fcf8849b9b3d32128244a4..19381ddd38d4d5069e2aa6025df9ea0ca4dd96e3 100644 (file)
@@ -10,6 +10,6 @@ struct nvkm_gsp_fwif {
        const struct nvkm_falcon_func *flcn;
 };
 
-int nvkm_gsp_new_(const struct nvkm_gsp_fwif *, struct nvkm_device *, int,
+int nvkm_gsp_new_(const struct nvkm_gsp_fwif *, struct nvkm_device *, enum nvkm_subdev_type, int,
                  struct nvkm_gsp **);
 #endif
index 719345074711144d13b85b7e75ccac2c8eeb0c5b..cb5cb533d91c81d8ee5e5d288bc37bcf811be8c4 100644 (file)
@@ -277,7 +277,7 @@ nvkm_i2c_drv[] = {
 
 int
 nvkm_i2c_new_(const struct nvkm_i2c_func *func, struct nvkm_device *device,
-             int index, struct nvkm_i2c **pi2c)
+             enum nvkm_subdev_type type, int inst, struct nvkm_i2c **pi2c)
 {
        struct nvkm_bios *bios = device->bios;
        struct nvkm_i2c *i2c;
@@ -289,7 +289,7 @@ nvkm_i2c_new_(const struct nvkm_i2c_func *func, struct nvkm_device *device,
        if (!(i2c = *pi2c = kzalloc(sizeof(*i2c), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_subdev_ctor(&nvkm_i2c, device, index, &i2c->subdev);
+       nvkm_subdev_ctor(&nvkm_i2c, device, type, inst, &i2c->subdev);
        i2c->func = func;
        INIT_LIST_HEAD(&i2c->pad);
        INIT_LIST_HEAD(&i2c->bus);
index bb2a31d8816111e48b5066c794c126b73608682a..e5bad085c06f01cf53fdfd5624605baeb9d8d69c 100644 (file)
@@ -66,7 +66,8 @@ g94_i2c = {
 };
 
 int
-g94_i2c_new(struct nvkm_device *device, int index, struct nvkm_i2c **pi2c)
+g94_i2c_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+           struct nvkm_i2c **pi2c)
 {
-       return nvkm_i2c_new_(&g94_i2c, device, index, pi2c);
+       return nvkm_i2c_new_(&g94_i2c, device, type, inst, pi2c);
 }
index ae4aad3fcd2e35d2fdc7201dc70cda2f321cb6ef..cda30ee6767d23f0833d938688c023e9dd0ab860 100644 (file)
@@ -30,7 +30,8 @@ gf117_i2c = {
 };
 
 int
-gf117_i2c_new(struct nvkm_device *device, int index, struct nvkm_i2c **pi2c)
+gf117_i2c_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_i2c **pi2c)
 {
-       return nvkm_i2c_new_(&gf117_i2c, device, index, pi2c);
+       return nvkm_i2c_new_(&gf117_i2c, device, type, inst, pi2c);
 }
index 6f2b02af42c839a73ea07ca900a375e841bde5ae..e9c6a6cca09db39aae4b4308bf0d02b4e7c307a4 100644 (file)
@@ -34,7 +34,8 @@ gf119_i2c = {
 };
 
 int
-gf119_i2c_new(struct nvkm_device *device, int index, struct nvkm_i2c **pi2c)
+gf119_i2c_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_i2c **pi2c)
 {
-       return nvkm_i2c_new_(&gf119_i2c, device, index, pi2c);
+       return nvkm_i2c_new_(&gf119_i2c, device, type, inst, pi2c);
 }
index f9f6bf4b66c97ab755589bfa52067106e3468d62..d35aa6fe301564d61f57dfea73ffde6b512c9206 100644 (file)
@@ -66,7 +66,8 @@ gk104_i2c = {
 };
 
 int
-gk104_i2c_new(struct nvkm_device *device, int index, struct nvkm_i2c **pi2c)
+gk104_i2c_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_i2c **pi2c)
 {
-       return nvkm_i2c_new_(&gk104_i2c, device, index, pi2c);
+       return nvkm_i2c_new_(&gk104_i2c, device, type, inst, pi2c);
 }
index 8e3bfa1af52a2d3c09211d3e7382aa24f2deeda4..9fec6af56e07a1d4a4b55ad9d17036a435956a70 100644 (file)
@@ -39,7 +39,8 @@ gk110_i2c = {
 };
 
 int
-gk110_i2c_new(struct nvkm_device *device, int index, struct nvkm_i2c **pi2c)
+gk110_i2c_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_i2c **pi2c)
 {
-       return nvkm_i2c_new_(&gk110_i2c, device, index, pi2c);
+       return nvkm_i2c_new_(&gk110_i2c, device, type, inst, pi2c);
 }
index 7b2375bff8a9cc8cc9e43ed0c945db02a8fe75fe..46917eb600f9dd3b929f53cf3feeb0b8c3684d47 100644 (file)
@@ -41,7 +41,8 @@ gm200_i2c = {
 };
 
 int
-gm200_i2c_new(struct nvkm_device *device, int index, struct nvkm_i2c **pi2c)
+gm200_i2c_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_i2c **pi2c)
 {
-       return nvkm_i2c_new_(&gm200_i2c, device, index, pi2c);
+       return nvkm_i2c_new_(&gm200_i2c, device, type, inst, pi2c);
 }
index 18776f49355c341e241530c2e68b27bfaa6bde19..ecfcf147c789b04c34a26062c282666fd2e36137 100644 (file)
@@ -30,7 +30,8 @@ nv04_i2c = {
 };
 
 int
-nv04_i2c_new(struct nvkm_device *device, int index, struct nvkm_i2c **pi2c)
+nv04_i2c_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_i2c **pi2c)
 {
-       return nvkm_i2c_new_(&nv04_i2c, device, index, pi2c);
+       return nvkm_i2c_new_(&nv04_i2c, device, type, inst, pi2c);
 }
index 6b762f7cee9eeec4557175493e520e7050601ca1..ad1d3fd2bcbc38806fa920081df71608821dc2e7 100644 (file)
@@ -30,7 +30,8 @@ nv4e_i2c = {
 };
 
 int
-nv4e_i2c_new(struct nvkm_device *device, int index, struct nvkm_i2c **pi2c)
+nv4e_i2c_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_i2c **pi2c)
 {
-       return nvkm_i2c_new_(&nv4e_i2c, device, index, pi2c);
+       return nvkm_i2c_new_(&nv4e_i2c, device, type, inst, pi2c);
 }
index 75640ab97d6acbefee6c0355f6edf40dfb1677f0..2f94bed2c0561574b0f9f213ccad49fd61048045 100644 (file)
@@ -30,7 +30,8 @@ nv50_i2c = {
 };
 
 int
-nv50_i2c_new(struct nvkm_device *device, int index, struct nvkm_i2c **pi2c)
+nv50_i2c_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_i2c **pi2c)
 {
-       return nvkm_i2c_new_(&nv50_i2c, device, index, pi2c);
+       return nvkm_i2c_new_(&nv50_i2c, device, type, inst, pi2c);
 }
index e35f6036fcfcb85edd2d652cec50e858d72a4dfb..f9d79f72f7e7c77180ad3defbff202faaadcbb1b 100644 (file)
@@ -4,8 +4,8 @@
 #define nvkm_i2c(p) container_of((p), struct nvkm_i2c, subdev)
 #include <subdev/i2c.h>
 
-int nvkm_i2c_new_(const struct nvkm_i2c_func *, struct nvkm_device *,
-                 int index, struct nvkm_i2c **);
+int nvkm_i2c_new_(const struct nvkm_i2c_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                 struct nvkm_i2c **);
 
 struct nvkm_i2c_func {
        int (*pad_x_new)(struct nvkm_i2c *, int id, struct nvkm_i2c_pad **);
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/Kbuild b/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/Kbuild
deleted file mode 100644 (file)
index 127efb5..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-# SPDX-License-Identifier: MIT
-nvkm-y += nvkm/subdev/ibus/gf100.o
-nvkm-y += nvkm/subdev/ibus/gf117.o
-nvkm-y += nvkm/subdev/ibus/gk104.o
-nvkm-y += nvkm/subdev/ibus/gk20a.o
-nvkm-y += nvkm/subdev/ibus/gm200.o
-nvkm-y += nvkm/subdev/ibus/gp10b.o
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/priv.h b/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/priv.h
deleted file mode 100644 (file)
index 302d69e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-#ifndef __NVKM_IBUS_PRIV_H__
-#define __NVKM_IBUS_PRIV_H__
-
-#include <subdev/ibus.h>
-
-void gf100_ibus_intr(struct nvkm_subdev *);
-void gk104_ibus_intr(struct nvkm_subdev *);
-#endif
index fecfa6afcf54e8548079e7ce494dfa8871cb6d29..8f0ccd3664eb6c7c6ce5aff42b3043c64a109965 100644 (file)
@@ -312,20 +312,20 @@ iccsense_func = {
 };
 
 void
-nvkm_iccsense_ctor(struct nvkm_device *device, int index,
+nvkm_iccsense_ctor(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                   struct nvkm_iccsense *iccsense)
 {
-       nvkm_subdev_ctor(&iccsense_func, device, index, &iccsense->subdev);
+       nvkm_subdev_ctor(&iccsense_func, device, type, inst, &iccsense->subdev);
 }
 
 int
-nvkm_iccsense_new_(struct nvkm_device *device, int index,
+nvkm_iccsense_new_(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                   struct nvkm_iccsense **iccsense)
 {
        if (!(*iccsense = kzalloc(sizeof(**iccsense), GFP_KERNEL)))
                return -ENOMEM;
        INIT_LIST_HEAD(&(*iccsense)->sensors);
        INIT_LIST_HEAD(&(*iccsense)->rails);
-       nvkm_iccsense_ctor(device, index, *iccsense);
+       nvkm_iccsense_ctor(device, type, inst, *iccsense);
        return 0;
 }
index cccff1c8a409cbe9c7138cc4d3ca56f5692c654b..3eabf49443951de159b86f58d7cf6be645d078a7 100644 (file)
@@ -24,8 +24,8 @@
 #include "priv.h"
 
 int
-gf100_iccsense_new(struct nvkm_device *device, int index,
+gf100_iccsense_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                   struct nvkm_iccsense **piccsense)
 {
-       return nvkm_iccsense_new_(device, index, piccsense);
+       return nvkm_iccsense_new_(device, type, inst, piccsense);
 }
index cc09c6c504af7880134ec223e5b2c0fd3c6e1480..c33441124241cc4bdfc3017e5ecc436102726b59 100644 (file)
@@ -22,6 +22,6 @@ struct nvkm_iccsense_rail {
        u8 mohm;
 };
 
-void nvkm_iccsense_ctor(struct nvkm_device *, int, struct nvkm_iccsense *);
-int nvkm_iccsense_new_(struct nvkm_device *, int, struct nvkm_iccsense **);
+void nvkm_iccsense_ctor(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_iccsense *);
+int nvkm_iccsense_new_(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_iccsense **);
 #endif
index 364ea4492acc8f0336d3e179a84ec65b1f43184b..cd8163a52bb65c6bf4ba04d45b0a4b01089bc94f 100644 (file)
@@ -218,9 +218,11 @@ static void *
 nvkm_instmem_dtor(struct nvkm_subdev *subdev)
 {
        struct nvkm_instmem *imem = nvkm_instmem(subdev);
+       void *data = imem;
        if (imem->func->dtor)
-               return imem->func->dtor(imem);
-       return imem;
+               data = imem->func->dtor(imem);
+       mutex_destroy(&imem->mutex);
+       return data;
 }
 
 static const struct nvkm_subdev_func
@@ -232,13 +234,13 @@ nvkm_instmem = {
 };
 
 void
-nvkm_instmem_ctor(const struct nvkm_instmem_func *func,
-                 struct nvkm_device *device, int index,
-                 struct nvkm_instmem *imem)
+nvkm_instmem_ctor(const struct nvkm_instmem_func *func, struct nvkm_device *device,
+                 enum nvkm_subdev_type type, int inst, struct nvkm_instmem *imem)
 {
-       nvkm_subdev_ctor(&nvkm_instmem, device, index, &imem->subdev);
+       nvkm_subdev_ctor(&nvkm_instmem, device, type, inst, &imem->subdev);
        imem->func = func;
        spin_lock_init(&imem->lock);
        INIT_LIST_HEAD(&imem->list);
        INIT_LIST_HEAD(&imem->boot);
+       mutex_init(&imem->mutex);
 }
index 13d4d7ac0697b474db64450c42e097b1cfaec91d..648ecf5a8fbc2a298db0758438f926628024ed36 100644 (file)
@@ -568,7 +568,7 @@ gk20a_instmem = {
 };
 
 int
-gk20a_instmem_new(struct nvkm_device *device, int index,
+gk20a_instmem_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                  struct nvkm_instmem **pimem)
 {
        struct nvkm_device_tegra *tdev = device->func->tegra(device);
@@ -576,7 +576,7 @@ gk20a_instmem_new(struct nvkm_device *device, int index,
 
        if (!(imem = kzalloc(sizeof(*imem), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_instmem_ctor(&gk20a_instmem, device, index, &imem->base);
+       nvkm_instmem_ctor(&gk20a_instmem, device, type, inst, &imem->base);
        mutex_init(&imem->lock);
        *pimem = &imem->base;
 
index 6bf0dad469195a65efaa07b7e588922229e2d0d4..25603b01d6f8421a1bb01d73559a1dfb87b0e2d7 100644 (file)
@@ -99,9 +99,9 @@ static void *
 nv04_instobj_dtor(struct nvkm_memory *memory)
 {
        struct nv04_instobj *iobj = nv04_instobj(memory);
-       mutex_lock(&iobj->imem->base.subdev.mutex);
+       mutex_lock(&iobj->imem->base.mutex);
        nvkm_mm_free(&iobj->imem->heap, &iobj->node);
-       mutex_unlock(&iobj->imem->base.subdev.mutex);
+       mutex_unlock(&iobj->imem->base.mutex);
        nvkm_instobj_dtor(&iobj->imem->base, &iobj->base);
        return iobj;
 }
@@ -132,10 +132,9 @@ nv04_instobj_new(struct nvkm_instmem *base, u32 size, u32 align, bool zero,
        iobj->base.memory.ptrs = &nv04_instobj_ptrs;
        iobj->imem = imem;
 
-       mutex_lock(&imem->base.subdev.mutex);
-       ret = nvkm_mm_head(&imem->heap, 0, 1, size, size,
-                          align ? align : 1, &iobj->node);
-       mutex_unlock(&imem->base.subdev.mutex);
+       mutex_lock(&imem->base.mutex);
+       ret = nvkm_mm_head(&imem->heap, 0, 1, size, size, align ? align : 1, &iobj->node);
+       mutex_unlock(&imem->base.mutex);
        return ret;
 }
 
@@ -218,14 +217,14 @@ nv04_instmem = {
 };
 
 int
-nv04_instmem_new(struct nvkm_device *device, int index,
+nv04_instmem_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_instmem **pimem)
 {
        struct nv04_instmem *imem;
 
        if (!(imem = kzalloc(sizeof(*imem), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_instmem_ctor(&nv04_instmem, device, index, &imem->base);
+       nvkm_instmem_ctor(&nv04_instmem, device, type, inst, &imem->base);
        *pimem = &imem->base;
        return 0;
 }
index 086c118488ef5fa937b0d7eccf5e023b07349e33..6b462f9609226e1c63a72f5cc5bf7bca73d81385 100644 (file)
@@ -99,9 +99,9 @@ static void *
 nv40_instobj_dtor(struct nvkm_memory *memory)
 {
        struct nv40_instobj *iobj = nv40_instobj(memory);
-       mutex_lock(&iobj->imem->base.subdev.mutex);
+       mutex_lock(&iobj->imem->base.mutex);
        nvkm_mm_free(&iobj->imem->heap, &iobj->node);
-       mutex_unlock(&iobj->imem->base.subdev.mutex);
+       mutex_unlock(&iobj->imem->base.mutex);
        nvkm_instobj_dtor(&iobj->imem->base, &iobj->base);
        return iobj;
 }
@@ -132,10 +132,9 @@ nv40_instobj_new(struct nvkm_instmem *base, u32 size, u32 align, bool zero,
        iobj->base.memory.ptrs = &nv40_instobj_ptrs;
        iobj->imem = imem;
 
-       mutex_lock(&imem->base.subdev.mutex);
-       ret = nvkm_mm_head(&imem->heap, 0, 1, size, size,
-                          align ? align : 1, &iobj->node);
-       mutex_unlock(&imem->base.subdev.mutex);
+       mutex_lock(&imem->base.mutex);
+       ret = nvkm_mm_head(&imem->heap, 0, 1, size, size, align ? align : 1, &iobj->node);
+       mutex_unlock(&imem->base.mutex);
        return ret;
 }
 
@@ -236,7 +235,7 @@ nv40_instmem = {
 };
 
 int
-nv40_instmem_new(struct nvkm_device *device, int index,
+nv40_instmem_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_instmem **pimem)
 {
        struct nv40_instmem *imem;
@@ -244,7 +243,7 @@ nv40_instmem_new(struct nvkm_device *device, int index,
 
        if (!(imem = kzalloc(sizeof(*imem), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_instmem_ctor(&nv40_instmem, device, index, &imem->base);
+       nvkm_instmem_ctor(&nv40_instmem, device, type, inst, &imem->base);
        *pimem = &imem->base;
 
        /* map bar */
index 02c4eb28cef44db11ef989f34cab124b74d4f84b..96aca0edfa3c04f4cd2ff76d0853d87785e6470e 100644 (file)
@@ -133,12 +133,12 @@ nv50_instobj_kmap(struct nv50_instobj *iobj, struct nvkm_vmm *vmm)
         * into it.  The lock has to be dropped while doing this due
         * to the possibility of recursion for page table allocation.
         */
-       mutex_unlock(&subdev->mutex);
+       mutex_unlock(&imem->base.mutex);
        while ((ret = nvkm_vmm_get(vmm, 12, size, &bar))) {
                /* Evict unused mappings, and keep retrying until we either
                 * succeed,or there's no more objects left on the LRU.
                 */
-               mutex_lock(&subdev->mutex);
+               mutex_lock(&imem->base.mutex);
                eobj = list_first_entry_or_null(&imem->lru, typeof(*eobj), lru);
                if (eobj) {
                        nvkm_debug(subdev, "evict %016llx %016llx @ %016llx\n",
@@ -151,7 +151,7 @@ nv50_instobj_kmap(struct nv50_instobj *iobj, struct nvkm_vmm *vmm)
                        emap = eobj->map;
                        eobj->map = NULL;
                }
-               mutex_unlock(&subdev->mutex);
+               mutex_unlock(&imem->base.mutex);
                if (!eobj)
                        break;
                iounmap(emap);
@@ -160,12 +160,12 @@ nv50_instobj_kmap(struct nv50_instobj *iobj, struct nvkm_vmm *vmm)
 
        if (ret == 0)
                ret = nvkm_memory_map(memory, 0, vmm, bar, NULL, 0);
-       mutex_lock(&subdev->mutex);
+       mutex_lock(&imem->base.mutex);
        if (ret || iobj->bar) {
                /* We either failed, or another thread beat us. */
-               mutex_unlock(&subdev->mutex);
+               mutex_unlock(&imem->base.mutex);
                nvkm_vmm_put(vmm, &bar);
-               mutex_lock(&subdev->mutex);
+               mutex_lock(&imem->base.mutex);
                return;
        }
 
@@ -197,7 +197,7 @@ nv50_instobj_release(struct nvkm_memory *memory)
        wmb();
        nvkm_bar_flush(subdev->device->bar);
 
-       if (refcount_dec_and_mutex_lock(&iobj->maps, &subdev->mutex)) {
+       if (refcount_dec_and_mutex_lock(&iobj->maps, &imem->base.mutex)) {
                /* Add the now-unused mapping to the LRU instead of directly
                 * unmapping it here, in case we need to map it again later.
                 */
@@ -208,7 +208,7 @@ nv50_instobj_release(struct nvkm_memory *memory)
 
                /* Switch back to NULL accessors when last map is gone. */
                iobj->base.memory.ptrs = NULL;
-               mutex_unlock(&subdev->mutex);
+               mutex_unlock(&imem->base.mutex);
        }
 }
 
@@ -227,9 +227,9 @@ nv50_instobj_acquire(struct nvkm_memory *memory)
        /* Take the lock, and re-check that another thread hasn't
         * already mapped the object in the meantime.
         */
-       mutex_lock(&imem->subdev.mutex);
+       mutex_lock(&imem->mutex);
        if (refcount_inc_not_zero(&iobj->maps)) {
-               mutex_unlock(&imem->subdev.mutex);
+               mutex_unlock(&imem->mutex);
                return iobj->map;
        }
 
@@ -252,7 +252,7 @@ nv50_instobj_acquire(struct nvkm_memory *memory)
                refcount_set(&iobj->maps, 1);
        }
 
-       mutex_unlock(&imem->subdev.mutex);
+       mutex_unlock(&imem->mutex);
        return map;
 }
 
@@ -265,7 +265,7 @@ nv50_instobj_boot(struct nvkm_memory *memory, struct nvkm_vmm *vmm)
        /* Exclude bootstrapped objects (ie. the page tables for the
         * instmem BAR itself) from eviction.
         */
-       mutex_lock(&imem->subdev.mutex);
+       mutex_lock(&imem->mutex);
        if (likely(iobj->lru.next)) {
                list_del_init(&iobj->lru);
                iobj->lru.next = NULL;
@@ -273,7 +273,7 @@ nv50_instobj_boot(struct nvkm_memory *memory, struct nvkm_vmm *vmm)
 
        nv50_instobj_kmap(iobj, vmm);
        nvkm_instmem_boot(imem);
-       mutex_unlock(&imem->subdev.mutex);
+       mutex_unlock(&imem->mutex);
 }
 
 static u64
@@ -315,12 +315,12 @@ nv50_instobj_dtor(struct nvkm_memory *memory)
        struct nvkm_vma *bar;
        void *map = map;
 
-       mutex_lock(&imem->subdev.mutex);
+       mutex_lock(&imem->mutex);
        if (likely(iobj->lru.next))
                list_del(&iobj->lru);
        map = iobj->map;
        bar = iobj->bar;
-       mutex_unlock(&imem->subdev.mutex);
+       mutex_unlock(&imem->mutex);
 
        if (map) {
                struct nvkm_vmm *vmm = nvkm_bar_bar2_vmm(imem->subdev.device);
@@ -386,14 +386,14 @@ nv50_instmem = {
 };
 
 int
-nv50_instmem_new(struct nvkm_device *device, int index,
+nv50_instmem_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_instmem **pimem)
 {
        struct nv50_instmem *imem;
 
        if (!(imem = kzalloc(sizeof(*imem), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_instmem_ctor(&nv50_instmem, device, index, &imem->base);
+       nvkm_instmem_ctor(&nv50_instmem, device, type, inst, &imem->base);
        INIT_LIST_HEAD(&imem->lru);
        *pimem = &imem->base;
        return 0;
index f5da8fcbdde35a9be8fff8fec01b312ba429e97d..56c15e30a5dd70aceca31fb42f8ee643c88ebe2d 100644 (file)
@@ -16,7 +16,7 @@ struct nvkm_instmem_func {
 };
 
 void nvkm_instmem_ctor(const struct nvkm_instmem_func *, struct nvkm_device *,
-                      int index, struct nvkm_instmem *);
+                      enum nvkm_subdev_type, int, struct nvkm_instmem *);
 void nvkm_instmem_boot(struct nvkm_instmem *);
 
 #include <core/memory.h>
index 23242179e60051ec48a4a3ba167df8016a15b234..fa683c1907955f2c561cfb6bd90787e62f464ae6 100644 (file)
@@ -33,10 +33,10 @@ nvkm_ltc_tags_clear(struct nvkm_device *device, u32 first, u32 count)
 
        BUG_ON((first > limit) || (limit >= ltc->num_tags));
 
-       mutex_lock(&ltc->subdev.mutex);
+       mutex_lock(&ltc->mutex);
        ltc->func->cbc_clear(ltc, first, limit);
        ltc->func->cbc_wait(ltc);
-       mutex_unlock(&ltc->subdev.mutex);
+       mutex_unlock(&ltc->mutex);
 }
 
 int
@@ -113,6 +113,7 @@ nvkm_ltc_dtor(struct nvkm_subdev *subdev)
 {
        struct nvkm_ltc *ltc = nvkm_ltc(subdev);
        nvkm_memory_unref(&ltc->tag_ram);
+       mutex_destroy(&ltc->mutex);
        return ltc;
 }
 
@@ -126,15 +127,16 @@ nvkm_ltc = {
 
 int
 nvkm_ltc_new_(const struct nvkm_ltc_func *func, struct nvkm_device *device,
-             int index, struct nvkm_ltc **pltc)
+             enum nvkm_subdev_type type, int inst, struct nvkm_ltc **pltc)
 {
        struct nvkm_ltc *ltc;
 
        if (!(ltc = *pltc = kzalloc(sizeof(*ltc), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_subdev_ctor(&nvkm_ltc, device, index, &ltc->subdev);
+       nvkm_subdev_ctor(&nvkm_ltc, device, type, inst, &ltc->subdev);
        ltc->func = func;
+       mutex_init(&ltc->mutex);
        ltc->zbc_min = 1; /* reserve 0 for disabled */
        ltc->zbc_max = min(func->zbc, NVKM_LTC_MAX_ZBC_CNT) - 1;
        return 0;
index a21ef45b857284b26da51998ab759cd8ff172785..fd8aeafc812d4e0a39426fe8b14e07368bc20811 100644 (file)
@@ -200,8 +200,8 @@ gf100_ltc_oneinit_tag_ram(struct nvkm_ltc *ltc)
        }
 
 mm_init:
-       nvkm_mm_fini(&fb->tags);
-       return nvkm_mm_init(&fb->tags, 0, 0, ltc->num_tags, 1);
+       nvkm_mm_fini(&fb->tags.mm);
+       return nvkm_mm_init(&fb->tags.mm, 0, 0, ltc->num_tags, 1);
 }
 
 int
@@ -249,7 +249,8 @@ gf100_ltc = {
 };
 
 int
-gf100_ltc_new(struct nvkm_device *device, int index, struct nvkm_ltc **pltc)
+gf100_ltc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_ltc **pltc)
 {
-       return nvkm_ltc_new_(&gf100_ltc, device, index, pltc);
+       return nvkm_ltc_new_(&gf100_ltc, device, type, inst, pltc);
 }
index b4f6e0034d5889677f00c0756e1d09c04c772d57..94aa09244d67379cf176d6fe660b14ebd03c058f 100644 (file)
@@ -50,7 +50,8 @@ gk104_ltc = {
 };
 
 int
-gk104_ltc_new(struct nvkm_device *device, int index, struct nvkm_ltc **pltc)
+gk104_ltc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_ltc **pltc)
 {
-       return nvkm_ltc_new_(&gk104_ltc, device, index, pltc);
+       return nvkm_ltc_new_(&gk104_ltc, device, type, inst, pltc);
 }
index ec0a3844b2d14995e342e0fdaa9fa638bdc17de8..54d1d65d5a858d4f3072a266657bb801f6d3c681 100644 (file)
@@ -145,7 +145,8 @@ gm107_ltc = {
 };
 
 int
-gm107_ltc_new(struct nvkm_device *device, int index, struct nvkm_ltc **pltc)
+gm107_ltc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_ltc **pltc)
 {
-       return nvkm_ltc_new_(&gm107_ltc, device, index, pltc);
+       return nvkm_ltc_new_(&gm107_ltc, device, type, inst, pltc);
 }
index e18e0dc19ec8b1f988c2ea30ec4e5d274af0b59f..8cfdbbdd8e8d8862e565100c31ab675e15da0681 100644 (file)
@@ -57,7 +57,8 @@ gm200_ltc = {
 };
 
 int
-gm200_ltc_new(struct nvkm_device *device, int index, struct nvkm_ltc **pltc)
+gm200_ltc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_ltc **pltc)
 {
-       return nvkm_ltc_new_(&gm200_ltc, device, index, pltc);
+       return nvkm_ltc_new_(&gm200_ltc, device, type, inst, pltc);
 }
index e923ed76d37ae088efcc5d7888eaf5b30ea9b1a0..a4a6cd9b435adad7c893b30c003b2f696b51d8f1 100644 (file)
@@ -69,7 +69,8 @@ gp100_ltc = {
 };
 
 int
-gp100_ltc_new(struct nvkm_device *device, int index, struct nvkm_ltc **pltc)
+gp100_ltc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_ltc **pltc)
 {
-       return nvkm_ltc_new_(&gp100_ltc, device, index, pltc);
+       return nvkm_ltc_new_(&gp100_ltc, device, type, inst, pltc);
 }
index 601747ada6555e2be7252c2348e1ff905d0afb6e..ff05d617e7f453b1ef3895261bef81b5d4824054 100644 (file)
@@ -45,7 +45,8 @@ gp102_ltc = {
 };
 
 int
-gp102_ltc_new(struct nvkm_device *device, int index, struct nvkm_ltc **pltc)
+gp102_ltc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_ltc **pltc)
 {
-       return nvkm_ltc_new_(&gp102_ltc, device, index, pltc);
+       return nvkm_ltc_new_(&gp102_ltc, device, type, inst, pltc);
 }
index c0063c7caa50a678939ee608cc205c3aa7e9bf35..dfebd796cb4ba1febd700c659296c75c19a12ec4 100644 (file)
@@ -59,7 +59,8 @@ gp10b_ltc = {
 };
 
 int
-gp10b_ltc_new(struct nvkm_device *device, int index, struct nvkm_ltc **pltc)
+gp10b_ltc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_ltc **pltc)
 {
-       return nvkm_ltc_new_(&gp10b_ltc, device, index, pltc);
+       return nvkm_ltc_new_(&gp10b_ltc, device, type, inst, pltc);
 }
index eca5a711b1b83bb870561baa22f88c4e475c9212..2bebe139005d95a045e5279b5ecbaea257d3eb64 100644 (file)
@@ -5,8 +5,8 @@
 #include <subdev/ltc.h>
 #include <core/enum.h>
 
-int nvkm_ltc_new_(const struct nvkm_ltc_func *, struct nvkm_device *,
-                 int index, struct nvkm_ltc **);
+int nvkm_ltc_new_(const struct nvkm_ltc_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                 struct nvkm_ltc **);
 
 struct nvkm_ltc_func {
        int  (*oneinit)(struct nvkm_ltc *);
index 09f669ac663090ecc7615cf3dbb504915fcc3323..21c4af3f81d5fc7a4fe3a2c4512b3d57e5bc8cc2 100644 (file)
@@ -35,14 +35,14 @@ nvkm_mc_unk260(struct nvkm_device *device, u32 data)
 }
 
 void
-nvkm_mc_intr_mask(struct nvkm_device *device, enum nvkm_devidx devidx, bool en)
+nvkm_mc_intr_mask(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, bool en)
 {
        struct nvkm_mc *mc = device->mc;
        const struct nvkm_mc_map *map;
        if (likely(mc) && mc->func->intr_mask) {
-               u32 mask = nvkm_top_intr_mask(device, devidx);
+               u32 mask = nvkm_top_intr_mask(device, type, inst);
                for (map = mc->func->intr; !mask && map->stat; map++) {
-                       if (map->unit == devidx)
+                       if (map->type == type && map->inst == inst)
                                mask = map->stat;
                }
                mc->func->intr_mask(mc, mask, en ? mask : 0);
@@ -78,27 +78,34 @@ void
 nvkm_mc_intr(struct nvkm_device *device, bool *handled)
 {
        struct nvkm_mc *mc = device->mc;
+       struct nvkm_top *top = device->top;
+       struct nvkm_top_device *tdev;
        struct nvkm_subdev *subdev;
        const struct nvkm_mc_map *map;
        u32 stat, intr;
-       u64 subdevs;
 
        if (unlikely(!mc))
                return;
 
-       intr = nvkm_mc_intr_stat(mc);
-       stat = nvkm_top_intr(device, intr, &subdevs);
-       while (subdevs) {
-               enum nvkm_devidx subidx = __ffs64(subdevs);
-               subdev = nvkm_device_subdev(device, subidx);
-               if (subdev)
-                       nvkm_subdev_intr(subdev);
-               subdevs &= ~BIT_ULL(subidx);
+       stat = intr = nvkm_mc_intr_stat(mc);
+
+       if (top) {
+               list_for_each_entry(tdev, &top->device, head) {
+                       if (tdev->intr >= 0 && (stat & BIT(tdev->intr))) {
+                               subdev = nvkm_device_subdev(device, tdev->type, tdev->inst);
+                               if (subdev) {
+                                       nvkm_subdev_intr(subdev);
+                                       stat &= ~BIT(tdev->intr);
+                                       if (!stat)
+                                               break;
+                               }
+                       }
+               }
        }
 
        for (map = mc->func->intr; map->stat; map++) {
                if (intr & map->stat) {
-                       subdev = nvkm_device_subdev(device, map->unit);
+                       subdev = nvkm_device_subdev(device, map->type, map->inst);
                        if (subdev)
                                nvkm_subdev_intr(subdev);
                        stat &= ~map->stat;
@@ -111,17 +118,16 @@ nvkm_mc_intr(struct nvkm_device *device, bool *handled)
 }
 
 static u32
-nvkm_mc_reset_mask(struct nvkm_device *device, bool isauto,
-                  enum nvkm_devidx devidx)
+nvkm_mc_reset_mask(struct nvkm_device *device, bool isauto, enum nvkm_subdev_type type, int inst)
 {
        struct nvkm_mc *mc = device->mc;
        const struct nvkm_mc_map *map;
        u64 pmc_enable = 0;
        if (likely(mc)) {
-               if (!(pmc_enable = nvkm_top_reset(device, devidx))) {
+               if (!(pmc_enable = nvkm_top_reset(device, type, inst))) {
                        for (map = mc->func->reset; map && map->stat; map++) {
                                if (!isauto || !map->noauto) {
-                                       if (map->unit == devidx) {
+                                       if (map->type == type && map->inst == inst) {
                                                pmc_enable = map->stat;
                                                break;
                                        }
@@ -133,9 +139,9 @@ nvkm_mc_reset_mask(struct nvkm_device *device, bool isauto,
 }
 
 void
-nvkm_mc_reset(struct nvkm_device *device, enum nvkm_devidx devidx)
+nvkm_mc_reset(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
 {
-       u64 pmc_enable = nvkm_mc_reset_mask(device, true, devidx);
+       u64 pmc_enable = nvkm_mc_reset_mask(device, true, type, inst);
        if (pmc_enable) {
                nvkm_mask(device, 0x000200, pmc_enable, 0x00000000);
                nvkm_mask(device, 0x000200, pmc_enable, pmc_enable);
@@ -144,17 +150,17 @@ nvkm_mc_reset(struct nvkm_device *device, enum nvkm_devidx devidx)
 }
 
 void
-nvkm_mc_disable(struct nvkm_device *device, enum nvkm_devidx devidx)
+nvkm_mc_disable(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
 {
-       u64 pmc_enable = nvkm_mc_reset_mask(device, false, devidx);
+       u64 pmc_enable = nvkm_mc_reset_mask(device, false, type, inst);
        if (pmc_enable)
                nvkm_mask(device, 0x000200, pmc_enable, 0x00000000);
 }
 
 void
-nvkm_mc_enable(struct nvkm_device *device, enum nvkm_devidx devidx)
+nvkm_mc_enable(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
 {
-       u64 pmc_enable = nvkm_mc_reset_mask(device, false, devidx);
+       u64 pmc_enable = nvkm_mc_reset_mask(device, false, type, inst);
        if (pmc_enable) {
                nvkm_mask(device, 0x000200, pmc_enable, pmc_enable);
                nvkm_rd32(device, 0x000200);
@@ -162,9 +168,9 @@ nvkm_mc_enable(struct nvkm_device *device, enum nvkm_devidx devidx)
 }
 
 bool
-nvkm_mc_enabled(struct nvkm_device *device, enum nvkm_devidx devidx)
+nvkm_mc_enabled(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
 {
-       u64 pmc_enable = nvkm_mc_reset_mask(device, false, devidx);
+       u64 pmc_enable = nvkm_mc_reset_mask(device, false, type, inst);
 
        return (pmc_enable != 0) &&
               ((nvkm_rd32(device, 0x000200) & pmc_enable) == pmc_enable);
@@ -203,19 +209,19 @@ nvkm_mc = {
 
 void
 nvkm_mc_ctor(const struct nvkm_mc_func *func, struct nvkm_device *device,
-            int index, struct nvkm_mc *mc)
+            enum nvkm_subdev_type type, int inst, struct nvkm_mc *mc)
 {
-       nvkm_subdev_ctor(&nvkm_mc, device, index, &mc->subdev);
+       nvkm_subdev_ctor(&nvkm_mc, device, type, inst, &mc->subdev);
        mc->func = func;
 }
 
 int
 nvkm_mc_new_(const struct nvkm_mc_func *func, struct nvkm_device *device,
-            int index, struct nvkm_mc **pmc)
+            enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
        struct nvkm_mc *mc;
        if (!(mc = *pmc = kzalloc(sizeof(*mc), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_mc_ctor(func, device, index, *pmc);
+       nvkm_mc_ctor(func, device, type, inst, *pmc);
        return 0;
 }
index 430a61c3df4450bf6cd1a5e69034705a2ccacec6..4cfc1c98400687e09859b342aa6e5ed87114e837 100644 (file)
@@ -62,7 +62,7 @@ g84_mc = {
 };
 
 int
-g84_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+g84_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&g84_mc, device, index, pmc);
+       return nvkm_mc_new_(&g84_mc, device, type, inst, pmc);
 }
index 93ad4982ce5f656544ffdf3ca16f886a32a8f8c2..b7e58d75d894b0a28fe4f6c380376377807bac59 100644 (file)
@@ -62,7 +62,7 @@ g98_mc = {
 };
 
 int
-g98_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+g98_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&g98_mc, device, index, pmc);
+       return nvkm_mc_new_(&g98_mc, device, type, inst, pmc);
 }
index 967eb3af11eb00efd775b15d973f551a9e427876..4105175dfccd66bd3eae25914f754b3d0fbcf1bf 100644 (file)
@@ -68,7 +68,7 @@ ga100_mc = {
 };
 
 int
-ga100_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+ga100_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&ga100_mc, device, index, pmc);
+       return nvkm_mc_new_(&ga100_mc, device, type, inst, pmc);
 }
index f93766418056aa67d629222c7423425dacf23c4f..3a589c6f7fad62c6f29511befc3558ab6618bd1d 100644 (file)
@@ -27,11 +27,11 @@ static const struct nvkm_mc_map
 gf100_mc_reset[] = {
        { 0x00020000, NVKM_ENGINE_MSPDEC },
        { 0x00008000, NVKM_ENGINE_MSVLD },
-       { 0x00002000, NVKM_SUBDEV_PMU, true },
+       { 0x00002000, NVKM_SUBDEV_PMU, 0, true },
        { 0x00001000, NVKM_ENGINE_GR },
        { 0x00000100, NVKM_ENGINE_FIFO },
-       { 0x00000080, NVKM_ENGINE_CE1 },
-       { 0x00000040, NVKM_ENGINE_CE0 },
+       { 0x00000080, NVKM_ENGINE_CE1 },
+       { 0x00000040, NVKM_ENGINE_CE0 },
        { 0x00000002, NVKM_ENGINE_MSPPP },
        {}
 };
@@ -43,10 +43,10 @@ gf100_mc_intr[] = {
        { 0x00008000, NVKM_ENGINE_MSVLD },
        { 0x00001000, NVKM_ENGINE_GR },
        { 0x00000100, NVKM_ENGINE_FIFO },
-       { 0x00000040, NVKM_ENGINE_CE1 },
-       { 0x00000020, NVKM_ENGINE_CE0 },
+       { 0x00000040, NVKM_ENGINE_CE1 },
+       { 0x00000020, NVKM_ENGINE_CE0 },
        { 0x00000001, NVKM_ENGINE_MSPPP },
-       { 0x40000000, NVKM_SUBDEV_IBUS },
+       { 0x40000000, NVKM_SUBDEV_PRIVRING },
        { 0x10000000, NVKM_SUBDEV_BUS },
        { 0x08000000, NVKM_SUBDEV_FB },
        { 0x02000000, NVKM_SUBDEV_LTC },
@@ -112,7 +112,7 @@ gf100_mc = {
 };
 
 int
-gf100_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+gf100_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&gf100_mc, device, index, pmc);
+       return nvkm_mc_new_(&gf100_mc, device, type, inst, pmc);
 }
index 7b8c6ecad1a5d544d7012d1577cc7f8b03f8b06c..d9b9067fa93f5c33fa0b9215423b53b260f4b636 100644 (file)
@@ -26,7 +26,7 @@
 const struct nvkm_mc_map
 gk104_mc_reset[] = {
        { 0x00000100, NVKM_ENGINE_FIFO },
-       { 0x00002000, NVKM_SUBDEV_PMU, true },
+       { 0x00002000, NVKM_SUBDEV_PMU, 0, true },
        {}
 };
 
@@ -34,7 +34,7 @@ const struct nvkm_mc_map
 gk104_mc_intr[] = {
        { 0x04000000, NVKM_ENGINE_DISP },
        { 0x00000100, NVKM_ENGINE_FIFO },
-       { 0x40000000, NVKM_SUBDEV_IBUS },
+       { 0x40000000, NVKM_SUBDEV_PRIVRING },
        { 0x10000000, NVKM_SUBDEV_BUS },
        { 0x08000000, NVKM_SUBDEV_FB },
        { 0x02000000, NVKM_SUBDEV_LTC },
@@ -60,7 +60,7 @@ gk104_mc = {
 };
 
 int
-gk104_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+gk104_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&gk104_mc, device, index, pmc);
+       return nvkm_mc_new_(&gk104_mc, device, type, inst, pmc);
 }
index ca1bf3279dbe9a046c958cfe744e7f60fd07cfa8..03590292749ac0434ca727a8d8509bdf80885d73 100644 (file)
@@ -35,7 +35,7 @@ gk20a_mc = {
 };
 
 int
-gk20a_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+gk20a_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&gk20a_mc, device, index, pmc);
+       return nvkm_mc_new_(&gk20a_mc, device, type, inst, pmc);
 }
index 43db245eec9af667902a0d0e81404a52f653064d..5fd1a0595c334c32c2d22df37e7b3dca81989b6d 100644 (file)
@@ -80,7 +80,7 @@ gp100_mc_intr[] = {
        { 0x04000000, NVKM_ENGINE_DISP },
        { 0x00000100, NVKM_ENGINE_FIFO },
        { 0x00000200, NVKM_SUBDEV_FAULT },
-       { 0x40000000, NVKM_SUBDEV_IBUS },
+       { 0x40000000, NVKM_SUBDEV_PRIVRING },
        { 0x10000000, NVKM_SUBDEV_BUS },
        { 0x08000000, NVKM_SUBDEV_FB },
        { 0x02000000, NVKM_SUBDEV_LTC },
@@ -106,13 +106,13 @@ gp100_mc = {
 
 int
 gp100_mc_new_(const struct nvkm_mc_func *func, struct nvkm_device *device,
-             int index, struct nvkm_mc **pmc)
+             enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
        struct gp100_mc *mc;
 
        if (!(mc = kzalloc(sizeof(*mc), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_mc_ctor(func, device, index, &mc->base);
+       nvkm_mc_ctor(func, device, type, inst, &mc->base);
        *pmc = &mc->base;
 
        spin_lock_init(&mc->lock);
@@ -122,7 +122,7 @@ gp100_mc_new_(const struct nvkm_mc_func *func, struct nvkm_device *device,
 }
 
 int
-gp100_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+gp100_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return gp100_mc_new_(&gp100_mc, device, index, pmc);
+       return gp100_mc_new_(&gp100_mc, device, type, inst, pmc);
 }
index 45c62f5ef7821976af61f311f67f7fd563ec0a1f..dd581d030cededb8482e72cf4e1ffc78a0523b45 100644 (file)
@@ -43,7 +43,7 @@ gp10b_mc = {
 };
 
 int
-gp10b_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+gp10b_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return gp100_mc_new_(&gp10b_mc, device, index, pmc);
+       return gp100_mc_new_(&gp10b_mc, device, type, inst, pmc);
 }
index 99d50a3d956fc312b3d91ade85f3f36f2b944d22..1b4d43531dbac629095a249c114574f891df1668 100644 (file)
@@ -27,7 +27,7 @@ static const struct nvkm_mc_map
 gt215_mc_reset[] = {
        { 0x04008000, NVKM_ENGINE_MSVLD },
        { 0x01020000, NVKM_ENGINE_MSPDEC },
-       { 0x00802000, NVKM_ENGINE_CE0 },
+       { 0x00802000, NVKM_ENGINE_CE0 },
        { 0x00400002, NVKM_ENGINE_MSPPP },
        { 0x00201000, NVKM_ENGINE_GR },
        { 0x00000100, NVKM_ENGINE_FIFO },
@@ -37,7 +37,7 @@ gt215_mc_reset[] = {
 static const struct nvkm_mc_map
 gt215_mc_intr[] = {
        { 0x04000000, NVKM_ENGINE_DISP },
-       { 0x00400000, NVKM_ENGINE_CE0 },
+       { 0x00400000, NVKM_ENGINE_CE0 },
        { 0x00020000, NVKM_ENGINE_MSPDEC },
        { 0x00008000, NVKM_ENGINE_MSVLD },
        { 0x00001000, NVKM_ENGINE_GR },
@@ -71,7 +71,7 @@ gt215_mc = {
 };
 
 int
-gt215_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+gt215_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&gt215_mc, device, index, pmc);
+       return nvkm_mc_new_(&gt215_mc, device, type, inst, pmc);
 }
index 6509defd14609c1a9675424da7f45f3c6cf5ee8b..bc0d09bafa99cce94d3c5b2cdf168f770bc94e3a 100644 (file)
@@ -80,7 +80,7 @@ nv04_mc = {
 };
 
 int
-nv04_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+nv04_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&nv04_mc, device, index, pmc);
+       return nvkm_mc_new_(&nv04_mc, device, type, inst, pmc);
 }
index 9213107901e6de32f51973f2d6d086e2eb6f2edc..ab59ca1ee06821735d6d0721571af3c50662b681 100644 (file)
@@ -44,7 +44,7 @@ nv11_mc = {
 };
 
 int
-nv11_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+nv11_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&nv11_mc, device, index, pmc);
+       return nvkm_mc_new_(&nv11_mc, device, type, inst, pmc);
 }
index 64bf5bbf8146cb80e6ace6f69bdca9da0e9c0d2a..03d756e26e5782a34ffb7a10ef29f13182577186 100644 (file)
@@ -53,7 +53,7 @@ nv17_mc = {
 };
 
 int
-nv17_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+nv17_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&nv17_mc, device, index, pmc);
+       return nvkm_mc_new_(&nv17_mc, device, type, inst, pmc);
 }
index 65fa44a64b985f12437fa3fa7473eaa704b98927..95f65766e8b00a724288fd32f87182f5def998e1 100644 (file)
@@ -48,7 +48,7 @@ nv44_mc = {
 };
 
 int
-nv44_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+nv44_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&nv44_mc, device, index, pmc);
+       return nvkm_mc_new_(&nv44_mc, device, type, inst, pmc);
 }
index fe93b4fd71002ccbfcab3505c0a6b13f4bf039c1..fce3613cdfa527fd6462ec725ee8b87f081555db 100644 (file)
@@ -55,7 +55,7 @@ nv50_mc = {
 };
 
 int
-nv50_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+nv50_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return nvkm_mc_new_(&nv50_mc, device, index, pmc);
+       return nvkm_mc_new_(&nv50_mc, device, type, inst, pmc);
 }
index 0d01b2c419ff50f873e7247aea1c010b955b48b1..c8bcabb98f999a5d6895e234bf2dca3f768af326 100644 (file)
@@ -4,14 +4,15 @@
 #define nvkm_mc(p) container_of((p), struct nvkm_mc, subdev)
 #include <subdev/mc.h>
 
-void nvkm_mc_ctor(const struct nvkm_mc_func *, struct nvkm_device *,
-                 int index, struct nvkm_mc *);
-int nvkm_mc_new_(const struct nvkm_mc_func *, struct nvkm_device *,
-                int index, struct nvkm_mc **);
+void nvkm_mc_ctor(const struct nvkm_mc_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                 struct nvkm_mc *);
+int nvkm_mc_new_(const struct nvkm_mc_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                struct nvkm_mc **);
 
 struct nvkm_mc_map {
        u32 stat;
-       u32 unit;
+       enum nvkm_subdev_type type;
+       int inst;
        bool noauto;
 };
 
@@ -52,7 +53,7 @@ void gf100_mc_unk260(struct nvkm_mc *, u32);
 void gp100_mc_intr_unarm(struct nvkm_mc *);
 void gp100_mc_intr_rearm(struct nvkm_mc *);
 void gp100_mc_intr_mask(struct nvkm_mc *, u32, u32);
-int gp100_mc_new_(const struct nvkm_mc_func *, struct nvkm_device *, int,
+int gp100_mc_new_(const struct nvkm_mc_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
                  struct nvkm_mc **);
 
 extern const struct nvkm_mc_map gk104_mc_intr[];
index af0afd1ad6ee026871f1631f86f74760432e24f0..58db83ebadc5f7d7eb36e7296a7ce5ff3d24ec99 100644 (file)
@@ -112,15 +112,15 @@ tu102_mc = {
        .reset = gk104_mc_reset,
 };
 
-int
+static int
 tu102_mc_new_(const struct nvkm_mc_func *func, struct nvkm_device *device,
-             int index, struct nvkm_mc **pmc)
+             enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
        struct tu102_mc *mc;
 
        if (!(mc = kzalloc(sizeof(*mc), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_mc_ctor(func, device, index, &mc->base);
+       nvkm_mc_ctor(func, device, type, inst, &mc->base);
        *pmc = &mc->base;
 
        spin_lock_init(&mc->lock);
@@ -130,7 +130,7 @@ tu102_mc_new_(const struct nvkm_mc_func *func, struct nvkm_device *device,
 }
 
 int
-tu102_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+tu102_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
 {
-       return tu102_mc_new_(&tu102_mc, device, index, pmc);
+       return tu102_mc_new_(&tu102_mc, device, type, inst, pmc);
 }
index 6d5212ae2fd57b741715e7d7c9e4c83fe5bdd13e..ad3b44a9e0e71583fd154b653e7f9e2f03e77f80 100644 (file)
@@ -402,6 +402,7 @@ nvkm_mmu_dtor(struct nvkm_subdev *subdev)
        nvkm_vmm_unref(&mmu->vmm);
 
        nvkm_mmu_ptc_fini(mmu);
+       mutex_destroy(&mmu->mutex);
        return mmu;
 }
 
@@ -414,22 +415,23 @@ nvkm_mmu = {
 
 void
 nvkm_mmu_ctor(const struct nvkm_mmu_func *func, struct nvkm_device *device,
-             int index, struct nvkm_mmu *mmu)
+             enum nvkm_subdev_type type, int inst, struct nvkm_mmu *mmu)
 {
-       nvkm_subdev_ctor(&nvkm_mmu, device, index, &mmu->subdev);
+       nvkm_subdev_ctor(&nvkm_mmu, device, type, inst, &mmu->subdev);
        mmu->func = func;
        mmu->dma_bits = func->dma_bits;
        nvkm_mmu_ptc_init(mmu);
+       mutex_init(&mmu->mutex);
        mmu->user.ctor = nvkm_ummu_new;
        mmu->user.base = func->mmu.user;
 }
 
 int
 nvkm_mmu_new_(const struct nvkm_mmu_func *func, struct nvkm_device *device,
-             int index, struct nvkm_mmu **pmmu)
+             enum nvkm_subdev_type type, int inst, struct nvkm_mmu **pmmu)
 {
        if (!(*pmmu = kzalloc(sizeof(**pmmu), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_mmu_ctor(func, device, index, *pmmu);
+       nvkm_mmu_ctor(func, device, type, inst, *pmmu);
        return 0;
 }
index 8accda5a772b7fffab4083edf1dbf8c7863a16ce..ce47a3b97be90c358abb725b8a48ec811f85d6a3 100644 (file)
@@ -35,7 +35,8 @@ g84_mmu = {
 };
 
 int
-g84_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+g84_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+           struct nvkm_mmu **pmmu)
 {
-       return nvkm_mmu_new_(&g84_mmu, device, index, pmmu);
+       return nvkm_mmu_new_(&g84_mmu, device, type, inst, pmmu);
 }
index 2cd5ec81c0d0ad6b4976f640394e38262201b889..7a28b1d49f7c861b9a7b39323bcf9f47393db5b8 100644 (file)
@@ -84,7 +84,8 @@ gf100_mmu = {
 };
 
 int
-gf100_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+gf100_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_mmu **pmmu)
 {
-       return nvkm_mmu_new_(&gf100_mmu, device, index, pmmu);
+       return nvkm_mmu_new_(&gf100_mmu, device, type, inst, pmmu);
 }
index 3d7d1eb1cff90f32e102303a10afee8865db0723..34c9b2b821f643199764f953237d7c153cfa6d3f 100644 (file)
@@ -35,7 +35,8 @@ gk104_mmu = {
 };
 
 int
-gk104_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+gk104_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_mmu **pmmu)
 {
-       return nvkm_mmu_new_(&gk104_mmu, device, index, pmmu);
+       return nvkm_mmu_new_(&gk104_mmu, device, type, inst, pmmu);
 }
index ac74965a60d4c0eac43738780f6c0b71cc41d8bc..a7db29c429eea46e06ff288767e5dbe73523385d 100644 (file)
@@ -35,7 +35,8 @@ gk20a_mmu = {
 };
 
 int
-gk20a_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+gk20a_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_mmu **pmmu)
 {
-       return nvkm_mmu_new_(&gk20a_mmu, device, index, pmmu);
+       return nvkm_mmu_new_(&gk20a_mmu, device, type, inst, pmmu);
 }
index 83990c83f9f81728490b8eed1d54f5dfbfbbf01c..e1696f637a689ad0da92a41c5907ee5a6a136124 100644 (file)
@@ -90,9 +90,10 @@ gm200_mmu_fixed = {
 };
 
 int
-gm200_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+gm200_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_mmu **pmmu)
 {
        if (device->fb->page)
-               return nvkm_mmu_new_(&gm200_mmu_fixed, device, index, pmmu);
-       return nvkm_mmu_new_(&gm200_mmu, device, index, pmmu);
+               return nvkm_mmu_new_(&gm200_mmu_fixed, device, type, inst, pmmu);
+       return nvkm_mmu_new_(&gm200_mmu, device, type, inst, pmmu);
 }
index 7353a94b40914acc7485c1ccd02f2ec0dc22c42c..e6e1a8ad701ef4371982a328f36b49ed69a10797 100644 (file)
@@ -47,9 +47,10 @@ gm20b_mmu_fixed = {
 };
 
 int
-gm20b_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+gm20b_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_mmu **pmmu)
 {
        if (device->fb->page)
-               return nvkm_mmu_new_(&gm20b_mmu_fixed, device, index, pmmu);
-       return nvkm_mmu_new_(&gm20b_mmu, device, index, pmmu);
+               return nvkm_mmu_new_(&gm20b_mmu_fixed, device, type, inst, pmmu);
+       return nvkm_mmu_new_(&gm20b_mmu, device, type, inst, pmmu);
 }
index 65cb9d28e60e2bac860cc6e8d155343a267a6c98..daa5ab0f871189ec789a45305316ef989bd54428 100644 (file)
@@ -37,9 +37,10 @@ gp100_mmu = {
 };
 
 int
-gp100_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+gp100_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_mmu **pmmu)
 {
        if (!nvkm_boolopt(device->cfgopt, "GP100MmuLayout", true))
-               return gm200_mmu_new(device, index, pmmu);
-       return nvkm_mmu_new_(&gp100_mmu, device, index, pmmu);
+               return gm200_mmu_new(device, type, inst, pmmu);
+       return nvkm_mmu_new_(&gp100_mmu, device, type, inst, pmmu);
 }
index 0a50be9a785ae1042d405614ee4b121922120acd..edd0bf9a5cd820666330a28bc5aa4dfe031e90ab 100644 (file)
@@ -37,9 +37,10 @@ gp10b_mmu = {
 };
 
 int
-gp10b_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+gp10b_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_mmu **pmmu)
 {
        if (!nvkm_boolopt(device->cfgopt, "GP100MmuLayout", true))
-               return gm20b_mmu_new(device, index, pmmu);
-       return nvkm_mmu_new_(&gp10b_mmu, device, index, pmmu);
+               return gm20b_mmu_new(device, type, inst, pmmu);
+       return nvkm_mmu_new_(&gp10b_mmu, device, type, inst, pmmu);
 }
index e0997eedd6d9c97aec00c72a79d1bdd8246f952f..fb8bdc88d5667e622bb3deae6ba3888b6ffe273e 100644 (file)
@@ -37,7 +37,8 @@ gv100_mmu = {
 };
 
 int
-gv100_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+gv100_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_mmu **pmmu)
 {
-       return nvkm_mmu_new_(&gv100_mmu, device, index, pmmu);
+       return nvkm_mmu_new_(&gv100_mmu, device, type, inst, pmmu);
 }
index 0527b50730d959d29eab938d19540fb86016bced..514876d6411bc9dfe356f526437ed09720dd7c6a 100644 (file)
@@ -35,7 +35,8 @@ mcp77_mmu = {
 };
 
 int
-mcp77_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+mcp77_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_mmu **pmmu)
 {
-       return nvkm_mmu_new_(&mcp77_mmu, device, index, pmmu);
+       return nvkm_mmu_new_(&mcp77_mmu, device, type, inst, pmmu);
 }
index d201c887c2cd6725dc58eac19c1f85683a5979e5..0674aa8f68c8970af5be7ae43ac1e7675a3cdee3 100644 (file)
@@ -35,7 +35,8 @@ nv04_mmu = {
 };
 
 int
-nv04_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+nv04_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_mmu **pmmu)
 {
-       return nvkm_mmu_new_(&nv04_mmu, device, index, pmmu);
+       return nvkm_mmu_new_(&nv04_mmu, device, type, inst, pmmu);
 }
index adca81895c09e1489e4685dec1ac813683bc67f0..909f92b728479dfac6dde3289f2113d41a18e9a0 100644 (file)
@@ -47,11 +47,12 @@ nv41_mmu = {
 };
 
 int
-nv41_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+nv41_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_mmu **pmmu)
 {
        if (device->type == NVKM_DEVICE_AGP ||
            !nvkm_boolopt(device->cfgopt, "NvPCIE", true))
-               return nv04_mmu_new(device, index, pmmu);
+               return nv04_mmu_new(device, type, inst, pmmu);
 
-       return nvkm_mmu_new_(&nv41_mmu, device, index, pmmu);
+       return nvkm_mmu_new_(&nv41_mmu, device, type, inst, pmmu);
 }
index 598c53a27bde4549d8a803407f7ed0759bc1865c..dd2a8d461da3ecdfc16c648e006400c202a3db7f 100644 (file)
@@ -62,11 +62,12 @@ nv44_mmu = {
 };
 
 int
-nv44_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+nv44_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_mmu **pmmu)
 {
        if (device->type == NVKM_DEVICE_AGP ||
            !nvkm_boolopt(device->cfgopt, "NvPCIE", true))
-               return nv04_mmu_new(device, index, pmmu);
+               return nv04_mmu_new(device, type, inst, pmmu);
 
-       return nvkm_mmu_new_(&nv44_mmu, device, index, pmmu);
+       return nvkm_mmu_new_(&nv44_mmu, device, type, inst, pmmu);
 }
index c0083ddda65a08a534ec3116e0d759158dac9ab4..78d46e35d0a9166ec72a4e6416aa8240f8399760 100644 (file)
@@ -71,7 +71,8 @@ nv50_mmu = {
 };
 
 int
-nv50_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+nv50_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_mmu **pmmu)
 {
-       return nvkm_mmu_new_(&nv50_mmu, device, index, pmmu);
+       return nvkm_mmu_new_(&nv50_mmu, device, type, inst, pmmu);
 }
index 479b023442710a41d23c7fc44f0723b7f6e6a20b..5265bf4d8366c0133a0318b318f26071ac3262fa 100644 (file)
@@ -4,10 +4,10 @@
 #define nvkm_mmu(p) container_of((p), struct nvkm_mmu, subdev)
 #include <subdev/mmu.h>
 
-void nvkm_mmu_ctor(const struct nvkm_mmu_func *, struct nvkm_device *,
-                  int index, struct nvkm_mmu *);
-int nvkm_mmu_new_(const struct nvkm_mmu_func *, struct nvkm_device *,
-                 int index, struct nvkm_mmu **);
+void nvkm_mmu_ctor(const struct nvkm_mmu_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                  struct nvkm_mmu *);
+int nvkm_mmu_new_(const struct nvkm_mmu_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                 struct nvkm_mmu **);
 
 struct nvkm_mmu_func {
        void (*init)(struct nvkm_mmu *);
index 94081f35f9675dd13c4314288275c105c6a58930..8d060ce47f8657aeef67c7533f0f24f2d4e2930e 100644 (file)
@@ -51,7 +51,8 @@ tu102_mmu = {
 };
 
 int
-tu102_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
+tu102_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_mmu **pmmu)
 {
-       return nvkm_mmu_new_(&tu102_mmu, device, index, pmmu);
+       return nvkm_mmu_new_(&tu102_mmu, device, type, inst, pmmu);
 }
index 6a2d9eb8e1ea8fbb6885c5064a1e2e988afd8782..5438384d9a67445625fce05b77565704424495d5 100644 (file)
@@ -187,12 +187,11 @@ gf100_vmm_invalidate_pdb(struct nvkm_vmm *vmm, u64 addr)
 void
 gf100_vmm_invalidate(struct nvkm_vmm *vmm, u32 type)
 {
-       struct nvkm_subdev *subdev = &vmm->mmu->subdev;
-       struct nvkm_device *device = subdev->device;
+       struct nvkm_device *device = vmm->mmu->subdev.device;
        struct nvkm_mmu_pt *pd = vmm->pd->pt[0];
        u64 addr = 0;
 
-       mutex_lock(&subdev->mutex);
+       mutex_lock(&vmm->mmu->mutex);
        /* Looks like maybe a "free flush slots" counter, the
         * faster you write to 0x100cbc to more it decreases.
         */
@@ -222,7 +221,7 @@ gf100_vmm_invalidate(struct nvkm_vmm *vmm, u32 type)
                if (nvkm_rd32(device, 0x100c80) & 0x00008000)
                        break;
        );
-       mutex_unlock(&subdev->mutex);
+       mutex_unlock(&vmm->mmu->mutex);
 }
 
 void
index 1d3369683a21f3616e4bf4aec507fe6c806045f0..31984671daf84aadd7b5aa4ffcc68b768e2f3607 100644 (file)
@@ -80,17 +80,16 @@ nv41_vmm_desc_12[] = {
 static void
 nv41_vmm_flush(struct nvkm_vmm *vmm, int level)
 {
-       struct nvkm_subdev *subdev = &vmm->mmu->subdev;
-       struct nvkm_device *device = subdev->device;
+       struct nvkm_device *device = vmm->mmu->subdev.device;
 
-       mutex_lock(&subdev->mutex);
+       mutex_lock(&vmm->mmu->mutex);
        nvkm_wr32(device, 0x100810, 0x00000022);
        nvkm_msec(device, 2000,
                if (nvkm_rd32(device, 0x100810) & 0x00000020)
                        break;
        );
        nvkm_wr32(device, 0x100810, 0x00000000);
-       mutex_unlock(&subdev->mutex);
+       mutex_unlock(&vmm->mmu->mutex);
 }
 
 static const struct nvkm_vmm_func
index 2d89e27e8e9e5eb60e7164957dc1e36c27b4fc3d..b7548dcd72c779d68885f56357f8ceb148c90ee1 100644 (file)
@@ -184,7 +184,7 @@ nv50_vmm_flush(struct nvkm_vmm *vmm, int level)
        struct nvkm_device *device = subdev->device;
        int i, id;
 
-       mutex_lock(&subdev->mutex);
+       mutex_lock(&vmm->mmu->mutex);
        for (i = 0; i < NVKM_SUBDEV_NR; i++) {
                if (!atomic_read(&vmm->engref[i]))
                        continue;
@@ -207,7 +207,7 @@ nv50_vmm_flush(struct nvkm_vmm *vmm, int level)
                case NVKM_ENGINE_MSVLD : id = 0x09; break;
                case NVKM_ENGINE_CIPHER:
                case NVKM_ENGINE_SEC   : id = 0x0a; break;
-               case NVKM_ENGINE_CE0   : id = 0x0d; break;
+               case NVKM_ENGINE_CE    : id = 0x0d; break;
                default:
                        continue;
                }
@@ -217,10 +217,9 @@ nv50_vmm_flush(struct nvkm_vmm *vmm, int level)
                        if (!(nvkm_rd32(device, 0x100c80) & 0x00000001))
                                break;
                ) < 0)
-                       nvkm_error(subdev, "%s mmu invalidate timeout\n",
-                                  nvkm_subdev_name[i]);
+                       nvkm_error(subdev, "%s mmu invalidate timeout\n", nvkm_subdev_type[i]);
        }
-       mutex_unlock(&subdev->mutex);
+       mutex_unlock(&vmm->mmu->mutex);
 }
 
 int
index b1294d0076c081b83f18f697754d18d6558db017..6cb5eefa45e9aa321d4c71ae73ba34d93457c951 100644 (file)
 static void
 tu102_vmm_flush(struct nvkm_vmm *vmm, int depth)
 {
-       struct nvkm_subdev *subdev = &vmm->mmu->subdev;
-       struct nvkm_device *device = subdev->device;
+       struct nvkm_device *device = vmm->mmu->subdev.device;
        u32 type = (5 /* CACHE_LEVEL_UP_TO_PDE3 */ - depth) << 24;
 
        type |= 0x00000001; /* PAGE_ALL */
        if (atomic_read(&vmm->engref[NVKM_SUBDEV_BAR]))
                type |= 0x00000004; /* HUB_ONLY */
 
-       mutex_lock(&subdev->mutex);
+       mutex_lock(&vmm->mmu->mutex);
 
        nvkm_wr32(device, 0xb830a0, vmm->pd->pt[0]->addr >> 8);
        nvkm_wr32(device, 0xb830a4, 0x00000000);
@@ -46,7 +45,7 @@ tu102_vmm_flush(struct nvkm_vmm *vmm, int depth)
                        break;
        );
 
-       mutex_unlock(&subdev->mutex);
+       mutex_unlock(&vmm->mmu->mutex);
 }
 
 static const struct nvkm_vmm_func
index f44682d62f750dcb5311505f67dc8691472e6463..c1acfe642da3949ce9333226ae79612f01876e73 100644 (file)
@@ -230,7 +230,8 @@ nvkm_mxm = {
 };
 
 int
-nvkm_mxm_new_(struct nvkm_device *device, int index, struct nvkm_mxm **pmxm)
+nvkm_mxm_new_(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_mxm **pmxm)
 {
        struct nvkm_bios *bios = device->bios;
        struct nvkm_mxm *mxm;
@@ -240,7 +241,7 @@ nvkm_mxm_new_(struct nvkm_device *device, int index, struct nvkm_mxm **pmxm)
        if (!(mxm = *pmxm = kzalloc(sizeof(*mxm), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_subdev_ctor(&nvkm_mxm, device, index, &mxm->subdev);
+       nvkm_subdev_ctor(&nvkm_mxm, device, type, inst, &mxm->subdev);
 
        data = mxm_table(bios, &ver, &len);
        if (!data || !(ver = nvbios_rd08(bios, data))) {
index 70e2c414bb7b6e8ae3d4d9d02f8e65c03cfc94e8..f3167904dcb0a5e409f72b1c5133f5cd91cb912e 100644 (file)
@@ -201,12 +201,13 @@ mxm_dcb_sanitise(struct nvkm_mxm *mxm)
 }
 
 int
-nv50_mxm_new(struct nvkm_device *device, int index, struct nvkm_subdev **pmxm)
+nv50_mxm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_subdev **pmxm)
 {
        struct nvkm_mxm *mxm;
        int ret;
 
-       ret = nvkm_mxm_new_(device, index, &mxm);
+       ret = nvkm_mxm_new_(device, type, inst, &mxm);
        if (mxm)
                *pmxm = &mxm->subdev;
        if (ret)
index fc8f69e6fc64f724e8a411f80ec81fc3ccdf44a2..fcacb6c6a7f721b46c83201d4dfc59e1ea34162d 100644 (file)
@@ -12,5 +12,5 @@ struct nvkm_mxm {
        u8 *mxms;
 };
 
-int nvkm_mxm_new_(struct nvkm_device *, int index, struct nvkm_mxm **);
+int nvkm_mxm_new_(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_mxm **);
 #endif
index ee2431a7804ec81f4e74cfceaa0969d16e7a336e..a7d42ea8ba2866de040a2f2e44fe5390a29e0c67 100644 (file)
@@ -183,13 +183,13 @@ nvkm_pci_func = {
 
 int
 nvkm_pci_new_(const struct nvkm_pci_func *func, struct nvkm_device *device,
-             int index, struct nvkm_pci **ppci)
+             enum nvkm_subdev_type type, int inst, struct nvkm_pci **ppci)
 {
        struct nvkm_pci *pci;
 
        if (!(pci = *ppci = kzalloc(sizeof(**ppci), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&nvkm_pci_func, device, index, &pci->subdev);
+       nvkm_subdev_ctor(&nvkm_pci_func, device, type, inst, &pci->subdev);
        pci->func = func;
        pci->pdev = device->func->pci(device)->pdev;
        pci->irq = -1;
index 62438d892f422bb3ebc123470b54e9514d4d0cc3..5b29aacedef3bf450d7822927f51482fd4162175 100644 (file)
@@ -150,7 +150,8 @@ g84_pci_func = {
 };
 
 int
-g84_pci_new(struct nvkm_device *device, int index, struct nvkm_pci **ppci)
+g84_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+           struct nvkm_pci **ppci)
 {
-       return nvkm_pci_new_(&g84_pci_func, device, index, ppci);
+       return nvkm_pci_new_(&g84_pci_func, device, type, inst, ppci);
 }
index 48874359d5f63bde6b1a8ff791c22c61925fa014..a9e0674009c6f704ccb0f6af080bdc05c03cc1c0 100644 (file)
@@ -51,7 +51,8 @@ g92_pci_func = {
 };
 
 int
-g92_pci_new(struct nvkm_device *device, int index, struct nvkm_pci **ppci)
+g92_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+           struct nvkm_pci **ppci)
 {
-       return nvkm_pci_new_(&g92_pci_func, device, index, ppci);
+       return nvkm_pci_new_(&g92_pci_func, device, type, inst, ppci);
 }
index 09adb37a5664c6451db045a4f20ff6ec7fbbc36b..7bacd0693283f37ce8d2fe223a3feaa8200262a7 100644 (file)
@@ -43,7 +43,8 @@ g94_pci_func = {
 };
 
 int
-g94_pci_new(struct nvkm_device *device, int index, struct nvkm_pci **ppci)
+g94_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+           struct nvkm_pci **ppci)
 {
-       return nvkm_pci_new_(&g94_pci_func, device, index, ppci);
+       return nvkm_pci_new_(&g94_pci_func, device, type, inst, ppci);
 }
index 00a5e7d3ee9d491383d42735aa4f8ff2f3396ed6..099906092fe15f66d1c6ff51ef142bd8c7e16b97 100644 (file)
@@ -96,7 +96,8 @@ gf100_pci_func = {
 };
 
 int
-gf100_pci_new(struct nvkm_device *device, int index, struct nvkm_pci **ppci)
+gf100_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pci **ppci)
 {
-       return nvkm_pci_new_(&gf100_pci_func, device, index, ppci);
+       return nvkm_pci_new_(&gf100_pci_func, device, type, inst, ppci);
 }
index 11bf419afe3fb1c95d343d26a483c1c15597c4b5..bcde609ba8666864f8d388876dc976c5f76c00cd 100644 (file)
@@ -43,7 +43,8 @@ gf106_pci_func = {
 };
 
 int
-gf106_pci_new(struct nvkm_device *device, int index, struct nvkm_pci **ppci)
+gf106_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pci **ppci)
 {
-       return nvkm_pci_new_(&gf106_pci_func, device, index, ppci);
+       return nvkm_pci_new_(&gf106_pci_func, device, type, inst, ppci);
 }
index e68030507d88bd266d4eee8ee2a9660f10eae278..6be87ecffc89c864dfc80b32007dee96b9f0854c 100644 (file)
@@ -222,7 +222,8 @@ gk104_pci_func = {
 };
 
 int
-gk104_pci_new(struct nvkm_device *device, int index, struct nvkm_pci **ppci)
+gk104_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pci **ppci)
 {
-       return nvkm_pci_new_(&gk104_pci_func, device, index, ppci);
+       return nvkm_pci_new_(&gk104_pci_func, device, type, inst, ppci);
 }
index 82c5234a06ff5884c6b75728c2907fc7774e4f93..a5fafda0014d9846e7627c35f9b65cd3a1d48341 100644 (file)
@@ -38,7 +38,8 @@ gp100_pci_func = {
 };
 
 int
-gp100_pci_new(struct nvkm_device *device, int index, struct nvkm_pci **ppci)
+gp100_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pci **ppci)
 {
-       return nvkm_pci_new_(&gp100_pci_func, device, index, ppci);
+       return nvkm_pci_new_(&gp100_pci_func, device, type, inst, ppci);
 }
index 5b1ed42cb90b90aa65f1af7550139f82457a5c94..9ab64194b185ab4fda04759ae126cd350390dd41 100644 (file)
@@ -52,7 +52,8 @@ nv04_pci_func = {
 };
 
 int
-nv04_pci_new(struct nvkm_device *device, int index, struct nvkm_pci **ppci)
+nv04_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_pci **ppci)
 {
-       return nvkm_pci_new_(&nv04_pci_func, device, index, ppci);
+       return nvkm_pci_new_(&nv04_pci_func, device, type, inst, ppci);
 }
index 6eb417765802d07847b30e3c120178faea657c15..6a3c31cf0200f84fc1c67b7108e389fe87ae1021 100644 (file)
@@ -59,7 +59,8 @@ nv40_pci_func = {
 };
 
 int
-nv40_pci_new(struct nvkm_device *device, int index, struct nvkm_pci **ppci)
+nv40_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_pci **ppci)
 {
-       return nvkm_pci_new_(&nv40_pci_func, device, index, ppci);
+       return nvkm_pci_new_(&nv40_pci_func, device, type, inst, ppci);
 }
index fc617e4c0ab6f52bee743c2d95d3ce31949fb75e..9cad17f178ec49c9638608213103b9d775446c7d 100644 (file)
@@ -45,7 +45,8 @@ nv46_pci_func = {
 };
 
 int
-nv46_pci_new(struct nvkm_device *device, int index, struct nvkm_pci **ppci)
+nv46_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_pci **ppci)
 {
-       return nvkm_pci_new_(&nv46_pci_func, device, index, ppci);
+       return nvkm_pci_new_(&nv46_pci_func, device, type, inst, ppci);
 }
index 1f1b26b5fa729c8c886fadb8b334e3a75ef1e0c6..741e34bf307cfccefd02d1c4a54bda248dd71f2b 100644 (file)
@@ -31,7 +31,8 @@ nv4c_pci_func = {
 };
 
 int
-nv4c_pci_new(struct nvkm_device *device, int index, struct nvkm_pci **ppci)
+nv4c_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+            struct nvkm_pci **ppci)
 {
-       return nvkm_pci_new_(&nv4c_pci_func, device, index, ppci);
+       return nvkm_pci_new_(&nv4c_pci_func, device, type, inst, ppci);
 }
index 7009aad86b6e5b73f7bb28a8db99bbb3439488d8..9b75835329625f80b99844c6a8e06c25527a1adb 100644 (file)
@@ -4,8 +4,8 @@
 #define nvkm_pci(p) container_of((p), struct nvkm_pci, subdev)
 #include <subdev/pci.h>
 
-int nvkm_pci_new_(const struct nvkm_pci_func *, struct nvkm_device *,
-                 int index, struct nvkm_pci **);
+int nvkm_pci_new_(const struct nvkm_pci_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                 struct nvkm_pci **);
 
 struct nvkm_pci_func {
        void (*init)(struct nvkm_pci *);
index a0fe607c9c07fc5f59f88c45ff4c4538dc5badc2..24382875fb4f37d6bfbfcb129223e05f9e9c1037 100644 (file)
@@ -148,6 +148,7 @@ nvkm_pmu_dtor(struct nvkm_subdev *subdev)
        nvkm_falcon_cmdq_del(&pmu->hpq);
        nvkm_falcon_qmgr_del(&pmu->qmgr);
        nvkm_falcon_dtor(&pmu->falcon);
+       mutex_destroy(&pmu->send.mutex);
        return nvkm_pmu(subdev);
 }
 
@@ -162,11 +163,13 @@ nvkm_pmu = {
 
 int
 nvkm_pmu_ctor(const struct nvkm_pmu_fwif *fwif, struct nvkm_device *device,
-             int index, struct nvkm_pmu *pmu)
+             enum nvkm_subdev_type type, int inst, struct nvkm_pmu *pmu)
 {
        int ret;
 
-       nvkm_subdev_ctor(&nvkm_pmu, device, index, &pmu->subdev);
+       nvkm_subdev_ctor(&nvkm_pmu, device, type, inst, &pmu->subdev);
+
+       mutex_init(&pmu->send.mutex);
 
        INIT_WORK(&pmu->recv.work, nvkm_pmu_recv);
        init_waitqueue_head(&pmu->recv.wait);
@@ -177,9 +180,8 @@ nvkm_pmu_ctor(const struct nvkm_pmu_fwif *fwif, struct nvkm_device *device,
 
        pmu->func = fwif->func;
 
-       ret = nvkm_falcon_ctor(pmu->func->flcn, &pmu->subdev,
-                              nvkm_subdev_name[pmu->subdev.index], 0x10a000,
-                              &pmu->falcon);
+       ret = nvkm_falcon_ctor(pmu->func->flcn, &pmu->subdev, pmu->subdev.name,
+                              0x10a000, &pmu->falcon);
        if (ret)
                return ret;
 
@@ -195,10 +197,10 @@ nvkm_pmu_ctor(const struct nvkm_pmu_fwif *fwif, struct nvkm_device *device,
 
 int
 nvkm_pmu_new_(const struct nvkm_pmu_fwif *fwif, struct nvkm_device *device,
-             int index, struct nvkm_pmu **ppmu)
+             enum nvkm_subdev_type type, int inst, struct nvkm_pmu **ppmu)
 {
        struct nvkm_pmu *pmu;
        if (!(pmu = *ppmu = kzalloc(sizeof(*pmu), GFP_KERNEL)))
                return -ENOMEM;
-       return nvkm_pmu_ctor(fwif, device, index, *ppmu);
+       return nvkm_pmu_ctor(fwif, device, type, inst, *ppmu);
 }
index 3ecb3d9cbcf234674a42c22d313f10c779cbf1df..f725a3ec547909ba0fca001874baeff70da64958 100644 (file)
@@ -30,14 +30,14 @@ void
 gf100_pmu_reset(struct nvkm_pmu *pmu)
 {
        struct nvkm_device *device = pmu->subdev.device;
-       nvkm_mc_disable(device, NVKM_SUBDEV_PMU);
-       nvkm_mc_enable(device, NVKM_SUBDEV_PMU);
+       nvkm_mc_disable(device, NVKM_SUBDEV_PMU, 0);
+       nvkm_mc_enable(device, NVKM_SUBDEV_PMU, 0);
 }
 
 bool
 gf100_pmu_enabled(struct nvkm_pmu *pmu)
 {
-       return nvkm_mc_enabled(pmu->subdev.device, NVKM_SUBDEV_PMU);
+       return nvkm_mc_enabled(pmu->subdev.device, NVKM_SUBDEV_PMU, 0);
 }
 
 static const struct nvkm_pmu_func
@@ -69,7 +69,8 @@ gf100_pmu_fwif[] = {
 };
 
 int
-gf100_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gf100_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
-       return nvkm_pmu_new_(gf100_pmu_fwif, device, index, ppmu);
+       return nvkm_pmu_new_(gf100_pmu_fwif, device, type, inst, ppmu);
 }
index 8dd0271aaaee6af471fad5417811d5082189cd39..0f4b6697a4e401541b3b22744909b01fdc5cbcac 100644 (file)
@@ -47,7 +47,8 @@ gf119_pmu_fwif[] = {
 };
 
 int
-gf119_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gf119_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
-       return nvkm_pmu_new_(gf119_pmu_fwif, device, index, ppmu);
+       return nvkm_pmu_new_(gf119_pmu_fwif, device, type, inst, ppmu);
 }
index 8b70cc17a6341cd3eeb3820738532bb2283097ac..9e7631d7aa41bc78c7ab23ab25d3097f004572c6 100644 (file)
@@ -127,7 +127,8 @@ gk104_pmu_fwif[] = {
 };
 
 int
-gk104_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gk104_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
-       return nvkm_pmu_new_(gk104_pmu_fwif, device, index, ppmu);
+       return nvkm_pmu_new_(gk104_pmu_fwif, device, type, inst, ppmu);
 }
index 0081f2141b1083abf7fa8b67150150781edb05a9..dbaefee53e1f31e25067396c69848c543d720313 100644 (file)
@@ -106,7 +106,8 @@ gk110_pmu_fwif[] = {
 };
 
 int
-gk110_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gk110_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
-       return nvkm_pmu_new_(gk110_pmu_fwif, device, index, ppmu);
+       return nvkm_pmu_new_(gk110_pmu_fwif, device, type, inst, ppmu);
 }
index b227c701a5e7c6d9c81d1dd356c0f73bf09e430e..a08fb049e6d6b0ba035f2c87a7298bdd21dca6bd 100644 (file)
@@ -48,7 +48,8 @@ gk208_pmu_fwif[] = {
 };
 
 int
-gk208_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gk208_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
-       return nvkm_pmu_new_(gk208_pmu_fwif, device, index, ppmu);
+       return nvkm_pmu_new_(gk208_pmu_fwif, device, type, inst, ppmu);
 }
index 26c1adf8f44c6f742c6baeededf2f52636907a37..a67a42e73f084505a8389201e3c2fcea5ec2fdb9 100644 (file)
@@ -210,7 +210,8 @@ gk20a_pmu_fwif[] = {
 };
 
 int
-gk20a_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gk20a_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
        struct gk20a_pmu *pmu;
        int ret;
@@ -219,7 +220,7 @@ gk20a_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
                return -ENOMEM;
        *ppmu = &pmu->base;
 
-       ret = nvkm_pmu_ctor(gk20a_pmu_fwif, device, index, &pmu->base);
+       ret = nvkm_pmu_ctor(gk20a_pmu_fwif, device, type, inst, &pmu->base);
        if (ret)
                return ret;
 
index 5afb55e58b517e406451a8203066e664629928c3..622ee637f97b50117c9a098b615a368712205df0 100644 (file)
@@ -49,7 +49,8 @@ gm107_pmu_fwif[] = {
 };
 
 int
-gm107_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gm107_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
-       return nvkm_pmu_new_(gm107_pmu_fwif, device, index, ppmu);
+       return nvkm_pmu_new_(gm107_pmu_fwif, device, type, inst, ppmu);
 }
index 383376addb41c4a55dd1261ea65c748c846233fa..5968c7696596c328ebe355b54a2acd139c813bfe 100644 (file)
@@ -45,7 +45,8 @@ gm200_pmu_fwif[] = {
 };
 
 int
-gm200_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gm200_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
-       return nvkm_pmu_new_(gm200_pmu_fwif, device, index, ppmu);
+       return nvkm_pmu_new_(gm200_pmu_fwif, device, type, inst, ppmu);
 }
index 8f6ed5373ea16e046a7748717639a304ac1327f9..148706977eec740824943bbcb6007f24c7ebc375 100644 (file)
@@ -240,7 +240,8 @@ gm20b_pmu_fwif[] = {
 };
 
 int
-gm20b_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gm20b_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
-       return nvkm_pmu_new_(gm20b_pmu_fwif, device, index, ppmu);
+       return nvkm_pmu_new_(gm20b_pmu_fwif, device, type, inst, ppmu);
 }
index 3d8ce14dba7bf1fb2b7a1d4c54dd9ced9f2f6ed0..00da1b873ce81c858a4ed556a59aa05a19e80ad6 100644 (file)
@@ -51,7 +51,8 @@ gp102_pmu_fwif[] = {
 };
 
 int
-gp102_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gp102_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
-       return nvkm_pmu_new_(gp102_pmu_fwif, device, index, ppmu);
+       return nvkm_pmu_new_(gp102_pmu_fwif, device, type, inst, ppmu);
 }
index 9c237c426599b543e38f39e3d2fd3888bb70e510..461f722656e242b45e34a7d05688eb8713ba39d1 100644 (file)
@@ -99,7 +99,8 @@ gp10b_pmu_fwif[] = {
 };
 
 int
-gp10b_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gp10b_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
-       return nvkm_pmu_new_(gp10b_pmu_fwif, device, index, ppmu);
+       return nvkm_pmu_new_(gp10b_pmu_fwif, device, type, inst, ppmu);
 }
index 88b909913ff96e83799a317aa4808e3f19a017cd..b0407b86bc10d9ab29b1f728d4be92ac654a06b5 100644 (file)
@@ -34,7 +34,7 @@ gt215_pmu_send(struct nvkm_pmu *pmu, u32 reply[2],
        struct nvkm_device *device = subdev->device;
        u32 addr;
 
-       mutex_lock(&subdev->mutex);
+       mutex_lock(&pmu->send.mutex);
        /* wait for a free slot in the fifo */
        addr  = nvkm_rd32(device, 0x10a4a0);
        if (nvkm_msec(device, 2000,
@@ -42,7 +42,7 @@ gt215_pmu_send(struct nvkm_pmu *pmu, u32 reply[2],
                if (tmp != (addr ^ 8))
                        break;
        ) < 0) {
-               mutex_unlock(&subdev->mutex);
+               mutex_unlock(&pmu->send.mutex);
                return -EBUSY;
        }
 
@@ -79,7 +79,7 @@ gt215_pmu_send(struct nvkm_pmu *pmu, u32 reply[2],
                reply[1] = pmu->recv.data[1];
        }
 
-       mutex_unlock(&subdev->mutex);
+       mutex_unlock(&pmu->send.mutex);
        return 0;
 }
 
@@ -282,7 +282,8 @@ gt215_pmu_fwif[] = {
 };
 
 int
-gt215_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
+gt215_pmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_pmu **ppmu)
 {
-       return nvkm_pmu_new_(gt215_pmu_fwif, device, index, ppmu);
+       return nvkm_pmu_new_(gt215_pmu_fwif, device, type, inst, ppmu);
 }
index 276b6d778e532fc54b0049833ddb88d498c6f21e..e7860d17735398ba5b3d6efef7135db627fb3914 100644 (file)
@@ -62,8 +62,8 @@ int gf100_pmu_nofw(struct nvkm_pmu *, int, const struct nvkm_pmu_fwif *);
 int gm200_pmu_nofw(struct nvkm_pmu *, int, const struct nvkm_pmu_fwif *);
 int gm20b_pmu_load(struct nvkm_pmu *, int, const struct nvkm_pmu_fwif *);
 
-int nvkm_pmu_ctor(const struct nvkm_pmu_fwif *, struct nvkm_device *,
-                 int index, struct nvkm_pmu *);
-int nvkm_pmu_new_(const struct nvkm_pmu_fwif *, struct nvkm_device *,
-                 int index, struct nvkm_pmu **);
+int nvkm_pmu_ctor(const struct nvkm_pmu_fwif *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                 struct nvkm_pmu *);
+int nvkm_pmu_new_(const struct nvkm_pmu_fwif *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                 struct nvkm_pmu **);
 #endif
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/privring/Kbuild b/drivers/gpu/drm/nouveau/nvkm/subdev/privring/Kbuild
new file mode 100644 (file)
index 0000000..d47d1bd
--- /dev/null
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: MIT
+nvkm-y += nvkm/subdev/privring/gf100.o
+nvkm-y += nvkm/subdev/privring/gf117.o
+nvkm-y += nvkm/subdev/privring/gk104.o
+nvkm-y += nvkm/subdev/privring/gk20a.o
+nvkm-y += nvkm/subdev/privring/gm200.o
+nvkm-y += nvkm/subdev/privring/gp10b.o
similarity index 71%
rename from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gf100.c
rename to drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf100.c
index 1115376bc85f5fd5d28e5cb37185721d73cf5e7d..ef7caca7037233f39e62c728e934b1459516a349 100644 (file)
 #include <subdev/timer.h>
 
 static void
-gf100_ibus_intr_hub(struct nvkm_subdev *ibus, int i)
+gf100_privring_intr_hub(struct nvkm_subdev *privring, int i)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        u32 addr = nvkm_rd32(device, 0x122120 + (i * 0x0400));
        u32 data = nvkm_rd32(device, 0x122124 + (i * 0x0400));
        u32 stat = nvkm_rd32(device, 0x122128 + (i * 0x0400));
-       nvkm_debug(ibus, "HUB%d: %06x %08x (%08x)\n", i, addr, data, stat);
+       nvkm_debug(privring, "HUB%d: %06x %08x (%08x)\n", i, addr, data, stat);
 }
 
 static void
-gf100_ibus_intr_rop(struct nvkm_subdev *ibus, int i)
+gf100_privring_intr_rop(struct nvkm_subdev *privring, int i)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        u32 addr = nvkm_rd32(device, 0x124120 + (i * 0x0400));
        u32 data = nvkm_rd32(device, 0x124124 + (i * 0x0400));
        u32 stat = nvkm_rd32(device, 0x124128 + (i * 0x0400));
-       nvkm_debug(ibus, "ROP%d: %06x %08x (%08x)\n", i, addr, data, stat);
+       nvkm_debug(privring, "ROP%d: %06x %08x (%08x)\n", i, addr, data, stat);
 }
 
 static void
-gf100_ibus_intr_gpc(struct nvkm_subdev *ibus, int i)
+gf100_privring_intr_gpc(struct nvkm_subdev *privring, int i)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        u32 addr = nvkm_rd32(device, 0x128120 + (i * 0x0400));
        u32 data = nvkm_rd32(device, 0x128124 + (i * 0x0400));
        u32 stat = nvkm_rd32(device, 0x128128 + (i * 0x0400));
-       nvkm_debug(ibus, "GPC%d: %06x %08x (%08x)\n", i, addr, data, stat);
+       nvkm_debug(privring, "GPC%d: %06x %08x (%08x)\n", i, addr, data, stat);
 }
 
 void
-gf100_ibus_intr(struct nvkm_subdev *ibus)
+gf100_privring_intr(struct nvkm_subdev *privring)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        u32 intr0 = nvkm_rd32(device, 0x121c58);
        u32 intr1 = nvkm_rd32(device, 0x121c5c);
        u32 hubnr = nvkm_rd32(device, 0x121c70);
@@ -68,7 +68,7 @@ gf100_ibus_intr(struct nvkm_subdev *ibus)
        for (i = 0; (intr0 & 0x0000ff00) && i < hubnr; i++) {
                u32 stat = 0x00000100 << i;
                if (intr0 & stat) {
-                       gf100_ibus_intr_hub(ibus, i);
+                       gf100_privring_intr_hub(privring, i);
                        intr0 &= ~stat;
                }
        }
@@ -76,7 +76,7 @@ gf100_ibus_intr(struct nvkm_subdev *ibus)
        for (i = 0; (intr0 & 0xffff0000) && i < ropnr; i++) {
                u32 stat = 0x00010000 << i;
                if (intr0 & stat) {
-                       gf100_ibus_intr_rop(ibus, i);
+                       gf100_privring_intr_rop(privring, i);
                        intr0 &= ~stat;
                }
        }
@@ -84,7 +84,7 @@ gf100_ibus_intr(struct nvkm_subdev *ibus)
        for (i = 0; intr1 && i < gpcnr; i++) {
                u32 stat = 0x00000001 << i;
                if (intr1 & stat) {
-                       gf100_ibus_intr_gpc(ibus, i);
+                       gf100_privring_intr_gpc(privring, i);
                        intr1 &= ~stat;
                }
        }
@@ -97,9 +97,9 @@ gf100_ibus_intr(struct nvkm_subdev *ibus)
 }
 
 static int
-gf100_ibus_init(struct nvkm_subdev *ibus)
+gf100_privring_init(struct nvkm_subdev *privring)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        nvkm_mask(device, 0x122310, 0x0003ffff, 0x00000800);
        nvkm_wr32(device, 0x12232c, 0x00100064);
        nvkm_wr32(device, 0x122330, 0x00100064);
@@ -109,14 +109,14 @@ gf100_ibus_init(struct nvkm_subdev *ibus)
 }
 
 static const struct nvkm_subdev_func
-gf100_ibus = {
-       .init = gf100_ibus_init,
-       .intr = gf100_ibus_intr,
+gf100_privring = {
+       .init = gf100_privring_init,
+       .intr = gf100_privring_intr,
 };
 
 int
-gf100_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
+gf100_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
 {
-       return nvkm_subdev_new_(&gf100_ibus, device, index, pibus);
+       return nvkm_subdev_new_(&gf100_privring, device, type, inst, pprivring);
 }
similarity index 79%
rename from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gf117.c
rename to drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf117.c
index 1124dadac145b7cb957542aa7da31724213b75f0..c78721fcd729f3eb6755f928f09d0b262c9711c5 100644 (file)
@@ -24,9 +24,9 @@
 #include "priv.h"
 
 static int
-gf117_ibus_init(struct nvkm_subdev *ibus)
+gf117_privring_init(struct nvkm_subdev *privring)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        nvkm_mask(device, 0x122310, 0x0003ffff, 0x00000800);
        nvkm_mask(device, 0x122348, 0x0003ffff, 0x00000100);
        nvkm_mask(device, 0x1223b0, 0x0003ffff, 0x00000fff);
@@ -34,14 +34,14 @@ gf117_ibus_init(struct nvkm_subdev *ibus)
 }
 
 static const struct nvkm_subdev_func
-gf117_ibus = {
-       .init = gf117_ibus_init,
-       .intr = gf100_ibus_intr,
+gf117_privring = {
+       .init = gf117_privring_init,
+       .intr = gf100_privring_intr,
 };
 
 int
-gf117_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
+gf117_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
 {
-       return nvkm_subdev_new_(&gf117_ibus, device, index, pibus);
+       return nvkm_subdev_new_(&gf117_privring, device, type, inst, pprivring);
 }
similarity index 71%
rename from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk104.c
rename to drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk104.c
index 22e487b493ad1346851a58c02599ceb97011a798..568a4c0997bd52143a769c96c190d0843b2dbf01 100644 (file)
 #include <subdev/timer.h>
 
 static void
-gk104_ibus_intr_hub(struct nvkm_subdev *ibus, int i)
+gk104_privring_intr_hub(struct nvkm_subdev *privring, int i)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        u32 addr = nvkm_rd32(device, 0x122120 + (i * 0x0800));
        u32 data = nvkm_rd32(device, 0x122124 + (i * 0x0800));
        u32 stat = nvkm_rd32(device, 0x122128 + (i * 0x0800));
-       nvkm_debug(ibus, "HUB%d: %06x %08x (%08x)\n", i, addr, data, stat);
+       nvkm_debug(privring, "HUB%d: %06x %08x (%08x)\n", i, addr, data, stat);
 }
 
 static void
-gk104_ibus_intr_rop(struct nvkm_subdev *ibus, int i)
+gk104_privring_intr_rop(struct nvkm_subdev *privring, int i)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        u32 addr = nvkm_rd32(device, 0x124120 + (i * 0x0800));
        u32 data = nvkm_rd32(device, 0x124124 + (i * 0x0800));
        u32 stat = nvkm_rd32(device, 0x124128 + (i * 0x0800));
-       nvkm_debug(ibus, "ROP%d: %06x %08x (%08x)\n", i, addr, data, stat);
+       nvkm_debug(privring, "ROP%d: %06x %08x (%08x)\n", i, addr, data, stat);
 }
 
 static void
-gk104_ibus_intr_gpc(struct nvkm_subdev *ibus, int i)
+gk104_privring_intr_gpc(struct nvkm_subdev *privring, int i)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        u32 addr = nvkm_rd32(device, 0x128120 + (i * 0x0800));
        u32 data = nvkm_rd32(device, 0x128124 + (i * 0x0800));
        u32 stat = nvkm_rd32(device, 0x128128 + (i * 0x0800));
-       nvkm_debug(ibus, "GPC%d: %06x %08x (%08x)\n", i, addr, data, stat);
+       nvkm_debug(privring, "GPC%d: %06x %08x (%08x)\n", i, addr, data, stat);
 }
 
 void
-gk104_ibus_intr(struct nvkm_subdev *ibus)
+gk104_privring_intr(struct nvkm_subdev *privring)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        u32 intr0 = nvkm_rd32(device, 0x120058);
        u32 intr1 = nvkm_rd32(device, 0x12005c);
        u32 hubnr = nvkm_rd32(device, 0x120070);
@@ -68,7 +68,7 @@ gk104_ibus_intr(struct nvkm_subdev *ibus)
        for (i = 0; (intr0 & 0x0000ff00) && i < hubnr; i++) {
                u32 stat = 0x00000100 << i;
                if (intr0 & stat) {
-                       gk104_ibus_intr_hub(ibus, i);
+                       gk104_privring_intr_hub(privring, i);
                        intr0 &= ~stat;
                }
        }
@@ -76,7 +76,7 @@ gk104_ibus_intr(struct nvkm_subdev *ibus)
        for (i = 0; (intr0 & 0xffff0000) && i < ropnr; i++) {
                u32 stat = 0x00010000 << i;
                if (intr0 & stat) {
-                       gk104_ibus_intr_rop(ibus, i);
+                       gk104_privring_intr_rop(privring, i);
                        intr0 &= ~stat;
                }
        }
@@ -84,7 +84,7 @@ gk104_ibus_intr(struct nvkm_subdev *ibus)
        for (i = 0; intr1 && i < gpcnr; i++) {
                u32 stat = 0x00000001 << i;
                if (intr1 & stat) {
-                       gk104_ibus_intr_gpc(ibus, i);
+                       gk104_privring_intr_gpc(privring, i);
                        intr1 &= ~stat;
                }
        }
@@ -97,9 +97,9 @@ gk104_ibus_intr(struct nvkm_subdev *ibus)
 }
 
 static int
-gk104_ibus_init(struct nvkm_subdev *ibus)
+gk104_privring_init(struct nvkm_subdev *privring)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        nvkm_mask(device, 0x122318, 0x0003ffff, 0x00001000);
        nvkm_mask(device, 0x12231c, 0x0003ffff, 0x00000200);
        nvkm_mask(device, 0x122310, 0x0003ffff, 0x00000800);
@@ -111,15 +111,15 @@ gk104_ibus_init(struct nvkm_subdev *ibus)
 }
 
 static const struct nvkm_subdev_func
-gk104_ibus = {
-       .preinit = gk104_ibus_init,
-       .init = gk104_ibus_init,
-       .intr = gk104_ibus_intr,
+gk104_privring = {
+       .preinit = gk104_privring_init,
+       .init = gk104_privring_init,
+       .intr = gk104_privring_intr,
 };
 
 int
-gk104_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
+gk104_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
 {
-       return nvkm_subdev_new_(&gk104_ibus, device, index, pibus);
+       return nvkm_subdev_new_(&gk104_privring, device, type, inst, pprivring);
 }
similarity index 73%
rename from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk20a.c
rename to drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk20a.c
index 187d544378b04fa603ceba76360a2c0ffcb3b5f1..55e4a60d87700435385971d44ab7066417f80cb3 100644 (file)
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  * DEALINGS IN THE SOFTWARE.
  */
-#include <subdev/ibus.h>
+#include <subdev/privring.h>
 #include <subdev/timer.h>
 
 static void
-gk20a_ibus_init_ibus_ring(struct nvkm_subdev *ibus)
+gk20a_privring_init_privring_ring(struct nvkm_subdev *privring)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        nvkm_mask(device, 0x137250, 0x3f, 0);
 
        nvkm_mask(device, 0x000200, 0x20, 0);
@@ -46,14 +46,14 @@ gk20a_ibus_init_ibus_ring(struct nvkm_subdev *ibus)
 }
 
 static void
-gk20a_ibus_intr(struct nvkm_subdev *ibus)
+gk20a_privring_intr(struct nvkm_subdev *privring)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
        u32 status0 = nvkm_rd32(device, 0x120058);
 
        if (status0 & 0x7) {
-               nvkm_debug(ibus, "resetting ibus ring\n");
-               gk20a_ibus_init_ibus_ring(ibus);
+               nvkm_debug(privring, "resetting privring ring\n");
+               gk20a_privring_init_privring_ring(privring);
        }
 
        /* Acknowledge interrupt */
@@ -65,21 +65,21 @@ gk20a_ibus_intr(struct nvkm_subdev *ibus)
 }
 
 static int
-gk20a_ibus_init(struct nvkm_subdev *ibus)
+gk20a_privring_init(struct nvkm_subdev *privring)
 {
-       gk20a_ibus_init_ibus_ring(ibus);
+       gk20a_privring_init_privring_ring(privring);
        return 0;
 }
 
 static const struct nvkm_subdev_func
-gk20a_ibus = {
-       .init = gk20a_ibus_init,
-       .intr = gk20a_ibus_intr,
+gk20a_privring = {
+       .init = gk20a_privring_init,
+       .intr = gk20a_privring_intr,
 };
 
 int
-gk20a_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
+gk20a_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
 {
-       return nvkm_subdev_new_(&gk20a_ibus, device, index, pibus);
+       return nvkm_subdev_new_(&gk20a_privring, device, type, inst, pprivring);
 }
similarity index 83%
rename from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gm200.c
rename to drivers/gpu/drm/nouveau/nvkm/subdev/privring/gm200.c
index 0f1f0ad6377e2fb875e5de6aa5e518f956376e34..b4eaf6db36d728fda55143f85d5ab61b9212beb9 100644 (file)
 #include "priv.h"
 
 static const struct nvkm_subdev_func
-gm200_ibus = {
-       .intr = gk104_ibus_intr,
+gm200_privring = {
+       .intr = gk104_privring_intr,
 };
 
 int
-gm200_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
+gm200_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
 {
-       return nvkm_subdev_new_(&gm200_ibus, device, index, pibus);
+       return nvkm_subdev_new_(&gm200_privring, device, type, inst, pprivring);
 }
similarity index 78%
rename from drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gp10b.c
rename to drivers/gpu/drm/nouveau/nvkm/subdev/privring/gp10b.c
index 0347b367cefe47aaec103dc426a81db7866327ed..4534111cf9074f915ac4c27330367ec2d7f76c4b 100644 (file)
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  * DEALINGS IN THE SOFTWARE.
  */
-#include <subdev/ibus.h>
+#include <subdev/privring.h>
 
 #include "priv.h"
 
 static int
-gp10b_ibus_init(struct nvkm_subdev *ibus)
+gp10b_privring_init(struct nvkm_subdev *privring)
 {
-       struct nvkm_device *device = ibus->device;
+       struct nvkm_device *device = privring->device;
 
        nvkm_wr32(device, 0x1200a8, 0x0);
 
@@ -42,14 +42,14 @@ gp10b_ibus_init(struct nvkm_subdev *ibus)
 }
 
 static const struct nvkm_subdev_func
-gp10b_ibus = {
-       .init = gp10b_ibus_init,
-       .intr = gk104_ibus_intr,
+gp10b_privring = {
+       .init = gp10b_privring_init,
+       .intr = gk104_privring_intr,
 };
 
 int
-gp10b_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
+gp10b_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
 {
-       return nvkm_subdev_new_(&gp10b_ibus, device, index, pibus);
+       return nvkm_subdev_new_(&gp10b_privring, device, type, inst, pprivring);
 }
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/privring/priv.h b/drivers/gpu/drm/nouveau/nvkm/subdev/privring/priv.h
new file mode 100644 (file)
index 0000000..b378c14
--- /dev/null
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: MIT */
+#ifndef __NVKM_PRIVRING_PRIV_H__
+#define __NVKM_PRIVRING_PRIV_H__
+#include <subdev/privring.h>
+
+void gf100_privring_intr(struct nvkm_subdev *);
+void gk104_privring_intr(struct nvkm_subdev *);
+#endif
index 4a4d1e224126464fd1881a062cbddcc1b34ad8b4..fc5ee118e91067ff5568e566ada85c77d166c24e 100644 (file)
@@ -421,10 +421,10 @@ nvkm_therm = {
 };
 
 void
-nvkm_therm_ctor(struct nvkm_therm *therm, struct nvkm_device *device,
-               int index, const struct nvkm_therm_func *func)
+nvkm_therm_ctor(struct nvkm_therm *therm, struct nvkm_device *device, enum nvkm_subdev_type type,
+               int inst, const struct nvkm_therm_func *func)
 {
-       nvkm_subdev_ctor(&nvkm_therm, device, index, &therm->subdev);
+       nvkm_subdev_ctor(&nvkm_therm, device, type, inst, &therm->subdev);
        therm->func = func;
 
        nvkm_alarm_init(&therm->alarm, nvkm_therm_alarm);
@@ -443,13 +443,13 @@ nvkm_therm_ctor(struct nvkm_therm *therm, struct nvkm_device *device,
 
 int
 nvkm_therm_new_(const struct nvkm_therm_func *func, struct nvkm_device *device,
-               int index, struct nvkm_therm **ptherm)
+               enum nvkm_subdev_type type, int inst, struct nvkm_therm **ptherm)
 {
        struct nvkm_therm *therm;
 
        if (!(therm = *ptherm = kzalloc(sizeof(*therm), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_therm_ctor(therm, device, index, func);
+       nvkm_therm_ctor(therm, device, type, inst, func);
        return 0;
 }
index 96f8da40ac82670ddceab1547dfb813e413859ae..4af86f2d3e7e743db643cedd1c418c5dd7297050 100644 (file)
@@ -223,12 +223,13 @@ g84_therm = {
 };
 
 int
-g84_therm_new(struct nvkm_device *device, int index, struct nvkm_therm **ptherm)
+g84_therm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_therm **ptherm)
 {
        struct nvkm_therm *therm;
        int ret;
 
-       ret = nvkm_therm_new_(&g84_therm, device, index, &therm);
+       ret = nvkm_therm_new_(&g84_therm, device, type, inst, &therm);
        *ptherm = therm;
        if (ret)
                return ret;
index 0981b02790e2bdeb03496fac7e6d292bd121f386..2b031d4eaeb6864b1becb518334d5c83ae82866f 100644 (file)
@@ -146,8 +146,8 @@ gf119_therm = {
 };
 
 int
-gf119_therm_new(struct nvkm_device *device, int index,
-              struct nvkm_therm **ptherm)
+gf119_therm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+               struct nvkm_therm **ptherm)
 {
-       return nvkm_therm_new_(&gf119_therm, device, index, ptherm);
+       return nvkm_therm_new_(&gf119_therm, device, type, inst, ptherm);
 }
index 4e03971d2e3df2cd4f1c7f78788896b72530398d..45e295c271fb5baed46646861d80a4428efd17bb 100644 (file)
@@ -35,8 +35,8 @@ gk104_clkgate_enable(struct nvkm_therm *base)
        int i;
 
        /* Program ENG_MANT, ENG_FILTER */
-       for (i = 0; order[i].engine != NVKM_SUBDEV_NR; i++) {
-               if (!nvkm_device_subdev(dev, order[i].engine))
+       for (i = 0; order[i].type != NVKM_SUBDEV_NR; i++) {
+               if (!nvkm_device_subdev(dev, order[i].type, order[i].inst))
                        continue;
 
                nvkm_mask(dev, 0x20200 + order[i].offset, 0xff00, 0x4500);
@@ -47,8 +47,8 @@ gk104_clkgate_enable(struct nvkm_therm *base)
        nvkm_wr32(dev, 0x02028c, therm->idle_filter->hubmmu);
 
        /* Enable clockgating (ENG_CLK = RUN->AUTO) */
-       for (i = 0; order[i].engine != NVKM_SUBDEV_NR; i++) {
-               if (!nvkm_device_subdev(dev, order[i].engine))
+       for (i = 0; order[i].type != NVKM_SUBDEV_NR; i++) {
+               if (!nvkm_device_subdev(dev, order[i].type, order[i].inst))
                        continue;
 
                nvkm_mask(dev, 0x20200 + order[i].offset, 0x00ff, 0x0045);
@@ -64,8 +64,8 @@ gk104_clkgate_fini(struct nvkm_therm *base, bool suspend)
        int i;
 
        /* ENG_CLK = AUTO->RUN, ENG_PWR = RUN->AUTO */
-       for (i = 0; order[i].engine != NVKM_SUBDEV_NR; i++) {
-               if (!nvkm_device_subdev(dev, order[i].engine))
+       for (i = 0; order[i].type != NVKM_SUBDEV_NR; i++) {
+               if (!nvkm_device_subdev(dev, order[i].type, order[i].inst))
                        continue;
 
                nvkm_mask(dev, 0x20200 + order[i].offset, 0xff, 0x54);
@@ -73,15 +73,15 @@ gk104_clkgate_fini(struct nvkm_therm *base, bool suspend)
 }
 
 const struct gk104_clkgate_engine_info gk104_clkgate_engine_info[] = {
-       { NVKM_ENGINE_GR,     0x00 },
-       { NVKM_ENGINE_MSPDEC, 0x04 },
-       { NVKM_ENGINE_MSPPP,  0x08 },
-       { NVKM_ENGINE_MSVLD,  0x0c },
-       { NVKM_ENGINE_CE0,    0x10 },
-       { NVKM_ENGINE_CE1,    0x14 },
-       { NVKM_ENGINE_MSENC,  0x18 },
-       { NVKM_ENGINE_CE2,    0x1c },
-       { NVKM_SUBDEV_NR, 0 },
+       { NVKM_ENGINE_GR,     0, 0x00 },
+       { NVKM_ENGINE_MSPDEC, 0, 0x04 },
+       { NVKM_ENGINE_MSPPP,  0, 0x08 },
+       { NVKM_ENGINE_MSVLD,  0, 0x0c },
+       { NVKM_ENGINE_CE,     0, 0x10 },
+       { NVKM_ENGINE_CE,     1, 0x14 },
+       { NVKM_ENGINE_MSENC,  0, 0x18 },
+       { NVKM_ENGINE_CE,     2, 0x1c },
+       { NVKM_SUBDEV_NR },
 };
 
 const struct gf100_idle_filter gk104_idle_filter = {
@@ -106,9 +106,8 @@ gk104_therm_func = {
 };
 
 static int
-gk104_therm_new_(const struct nvkm_therm_func *func,
-                struct nvkm_device *device,
-                int index,
+gk104_therm_new_(const struct nvkm_therm_func *func, struct nvkm_device *device,
+                enum nvkm_subdev_type type, int inst,
                 const struct gk104_clkgate_engine_info *clkgate_order,
                 const struct gf100_idle_filter *idle_filter,
                 struct nvkm_therm **ptherm)
@@ -118,19 +117,17 @@ gk104_therm_new_(const struct nvkm_therm_func *func,
        if (!therm)
                return -ENOMEM;
 
-       nvkm_therm_ctor(&therm->base, device, index, func);
+       nvkm_therm_ctor(&therm->base, device, type, inst, func);
        *ptherm = &therm->base;
        therm->clkgate_order = clkgate_order;
        therm->idle_filter = idle_filter;
-
        return 0;
 }
 
 int
-gk104_therm_new(struct nvkm_device *device,
-               int index, struct nvkm_therm **ptherm)
+gk104_therm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_therm **ptherm)
 {
-       return gk104_therm_new_(&gk104_therm_func, device, index,
+       return gk104_therm_new_(&gk104_therm_func, device, type, inst,
                                gk104_clkgate_engine_info, &gk104_idle_filter,
                                ptherm);
 }
index 293e7743b19bb2357064e22fe642ec741b4426cd..9a8641421038f3048404dbd0fb22fcb929037963 100644 (file)
@@ -31,7 +31,8 @@
 #include "gf100.h"
 
 struct gk104_clkgate_engine_info {
-       enum nvkm_devidx engine;
+       enum nvkm_subdev_type type;
+       int inst;
        u8 offset;
 };
 
index 86848ece4d897de7b318e3805f591ed46ba950de..c845fd392f58f0cdf05234cf236206bfcb3299d0 100644 (file)
@@ -68,8 +68,8 @@ gm107_therm = {
 };
 
 int
-gm107_therm_new(struct nvkm_device *device, int index,
+gm107_therm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_therm **ptherm)
 {
-       return nvkm_therm_new_(&gm107_therm, device, index, ptherm);
+       return nvkm_therm_new_(&gm107_therm, device, type, inst, ptherm);
 }
index 73dc78093d5d5b55fec453075623b65a86e57f05..e0cdd12463ecfa7183da0e90e4015355d0c5d6e2 100644 (file)
@@ -32,8 +32,8 @@ gm200_therm = {
 };
 
 int
-gm200_therm_new(struct nvkm_device *device, int index,
+gm200_therm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_therm **ptherm)
 {
-       return nvkm_therm_new_(&gm200_therm, device, index, ptherm);
+       return nvkm_therm_new_(&gm200_therm, device, type, inst, ptherm);
 }
index 9f0dea3f61dc42f4453c23031f14de98fa9941f3..44f021392b955d9f708bd1c77475b6680c22dd31 100644 (file)
@@ -49,8 +49,8 @@ gp100_therm = {
 };
 
 int
-gp100_therm_new(struct nvkm_device *device, int index,
+gp100_therm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                struct nvkm_therm **ptherm)
 {
-       return nvkm_therm_new_(&gp100_therm, device, index, ptherm);
+       return nvkm_therm_new_(&gp100_therm, device, type, inst, ptherm);
 }
index c08097f2aff5028a0bdfc2ec2e4e2512505f1ee8..9e451bd9395c33f19cda5a0ce97d5df7c8b84d37 100644 (file)
@@ -68,8 +68,8 @@ gt215_therm = {
 };
 
 int
-gt215_therm_new(struct nvkm_device *device, int index,
-              struct nvkm_therm **ptherm)
+gt215_therm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+               struct nvkm_therm **ptherm)
 {
-       return nvkm_therm_new_(&gt215_therm, device, index, ptherm);
+       return nvkm_therm_new_(&gt215_therm, device, type, inst, ptherm);
 }
index 2c92ffb5f9d0623dd850d42c202110173ac2647e..c13fee9734dff77df9857116bd7d52bc4c95e636 100644 (file)
@@ -197,8 +197,8 @@ nv40_therm = {
 };
 
 int
-nv40_therm_new(struct nvkm_device *device, int index,
+nv40_therm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
               struct nvkm_therm **ptherm)
 {
-       return nvkm_therm_new_(&nv40_therm, device, index, ptherm);
+       return nvkm_therm_new_(&nv40_therm, device, type, inst, ptherm);
 }
index 9b57b433d4cf622e0e14433db80c51fa4b51d2e6..9cf16a75a3cdc27929005bb32a9d6af4417d0868 100644 (file)
@@ -169,8 +169,8 @@ nv50_therm = {
 };
 
 int
-nv50_therm_new(struct nvkm_device *device, int index,
+nv50_therm_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
               struct nvkm_therm **ptherm)
 {
-       return nvkm_therm_new_(&nv50_therm, device, index, ptherm);
+       return nvkm_therm_new_(&nv50_therm, device, type, inst, ptherm);
 }
index 21659daf18649c827aff2369dab63fb0230cd87e..54e960589411e213d18d2e08237afa2468346986 100644 (file)
 #include <subdev/bios/gpio.h>
 #include <subdev/bios/perf.h>
 
-int nvkm_therm_new_(const struct nvkm_therm_func *, struct nvkm_device *,
-                   int index, struct nvkm_therm **);
-void nvkm_therm_ctor(struct nvkm_therm *therm, struct nvkm_device *device,
-                    int index, const struct nvkm_therm_func *func);
+int nvkm_therm_new_(const struct nvkm_therm_func *, struct nvkm_device *, enum nvkm_subdev_type,
+                   int, struct nvkm_therm **);
+void nvkm_therm_ctor(struct nvkm_therm *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                    const struct nvkm_therm_func *);
 
 struct nvkm_fan {
        struct nvkm_therm *parent;
index dd922033628c236cfec38f3e91d49aa9ba886e78..8b0da0c062685d7f22e1558937e33255a5469998 100644 (file)
@@ -183,14 +183,14 @@ nvkm_timer = {
 
 int
 nvkm_timer_new_(const struct nvkm_timer_func *func, struct nvkm_device *device,
-               int index, struct nvkm_timer **ptmr)
+               enum nvkm_subdev_type type, int inst, struct nvkm_timer **ptmr)
 {
        struct nvkm_timer *tmr;
 
        if (!(tmr = *ptmr = kzalloc(sizeof(*tmr), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_subdev_ctor(&nvkm_timer, device, index, &tmr->subdev);
+       nvkm_subdev_ctor(&nvkm_timer, device, type, inst, &tmr->subdev);
        tmr->func = func;
        INIT_LIST_HEAD(&tmr->alarms);
        spin_lock_init(&tmr->lock);
index 9ed5f64912d0dd09168fe44fa1472b2123ee5460..73c3776b6b83c1676c11c640dd0699d525e6ed7e 100644 (file)
@@ -33,7 +33,8 @@ gk20a_timer = {
 };
 
 int
-gk20a_timer_new(struct nvkm_device *device, int index, struct nvkm_timer **ptmr)
+gk20a_timer_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+               struct nvkm_timer **ptmr)
 {
-       return nvkm_timer_new_(&gk20a_timer, device, index, ptmr);
+       return nvkm_timer_new_(&gk20a_timer, device, type, inst, ptmr);
 }
index 7f48249f41decea964d62790601b6be5d6d78f4c..0058e856b378dfbdbc102b9ec5afc99bd247558f 100644 (file)
@@ -145,7 +145,8 @@ nv04_timer = {
 };
 
 int
-nv04_timer_new(struct nvkm_device *device, int index, struct nvkm_timer **ptmr)
+nv04_timer_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_timer **ptmr)
 {
-       return nvkm_timer_new_(&nv04_timer, device, index, ptmr);
+       return nvkm_timer_new_(&nv04_timer, device, type, inst, ptmr);
 }
index bb99a152f26e6ef24ae1ea643f97dba785867cf3..7e1f8c22f2a83988dc38feb4b7e94a63235ca809 100644 (file)
@@ -82,7 +82,8 @@ nv40_timer = {
 };
 
 int
-nv40_timer_new(struct nvkm_device *device, int index, struct nvkm_timer **ptmr)
+nv40_timer_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_timer **ptmr)
 {
-       return nvkm_timer_new_(&nv40_timer, device, index, ptmr);
+       return nvkm_timer_new_(&nv40_timer, device, type, inst, ptmr);
 }
index 3cf9ec1b1b57cc0e23311b3aaa590d7462495571..c2b263721f10c7b36f89eaabfc6435ccb7e4c708 100644 (file)
@@ -79,7 +79,8 @@ nv41_timer = {
 };
 
 int
-nv41_timer_new(struct nvkm_device *device, int index, struct nvkm_timer **ptmr)
+nv41_timer_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_timer **ptmr)
 {
-       return nvkm_timer_new_(&nv41_timer, device, index, ptmr);
+       return nvkm_timer_new_(&nv41_timer, device, type, inst, ptmr);
 }
index 89e97294b182045e00c4d53a1df0bcb5b7dcf84e..e6debe7e2fa95e848102f1e81bed01062ed2e010 100644 (file)
@@ -4,8 +4,8 @@
 #define nvkm_timer(p) container_of((p), struct nvkm_timer, subdev)
 #include <subdev/timer.h>
 
-int nvkm_timer_new_(const struct nvkm_timer_func *, struct nvkm_device *,
-                   int index, struct nvkm_timer **);
+int nvkm_timer_new_(const struct nvkm_timer_func *, struct nvkm_device *, enum nvkm_subdev_type,
+                   int, struct nvkm_timer **);
 
 struct nvkm_timer_func {
        void (*init)(struct nvkm_timer *);
index 438d9d78ab52859094a44bed6f23fea7ee86bd13..d5db845195dca72733d726e37abe291d32360cf0 100644 (file)
@@ -1,3 +1,4 @@
 # SPDX-License-Identifier: MIT
 nvkm-y += nvkm/subdev/top/base.o
 nvkm-y += nvkm/subdev/top/gk104.o
+nvkm-y += nvkm/subdev/top/ga100.o
index cce6e4e90ebf804ffb699371e0cf3a4b8fb55a95..28d0789f50fecca9059087eaba7dafcb1f1de6dc 100644 (file)
@@ -28,7 +28,8 @@ nvkm_top_device_new(struct nvkm_top *top)
 {
        struct nvkm_top_device *info = kmalloc(sizeof(*info), GFP_KERNEL);
        if (info) {
-               info->index = NVKM_SUBDEV_NR;
+               info->type = NVKM_SUBDEV_NR;
+               info->inst = -1;
                info->addr = 0;
                info->fault = -1;
                info->engine = -1;
@@ -41,14 +42,14 @@ nvkm_top_device_new(struct nvkm_top *top)
 }
 
 u32
-nvkm_top_addr(struct nvkm_device *device, enum nvkm_devidx index)
+nvkm_top_addr(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
 {
        struct nvkm_top *top = device->top;
        struct nvkm_top_device *info;
 
        if (top) {
                list_for_each_entry(info, &top->device, head) {
-                       if (info->index == index)
+                       if (info->type == type && info->inst == inst)
                                return info->addr;
                }
        }
@@ -57,14 +58,14 @@ nvkm_top_addr(struct nvkm_device *device, enum nvkm_devidx index)
 }
 
 u32
-nvkm_top_reset(struct nvkm_device *device, enum nvkm_devidx index)
+nvkm_top_reset(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
 {
        struct nvkm_top *top = device->top;
        struct nvkm_top_device *info;
 
        if (top) {
                list_for_each_entry(info, &top->device, head) {
-                       if (info->index == index && info->reset >= 0)
+                       if (info->type == type && info->inst == inst && info->reset >= 0)
                                return BIT(info->reset);
                }
        }
@@ -73,14 +74,14 @@ nvkm_top_reset(struct nvkm_device *device, enum nvkm_devidx index)
 }
 
 u32
-nvkm_top_intr_mask(struct nvkm_device *device, enum nvkm_devidx devidx)
+nvkm_top_intr_mask(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
 {
        struct nvkm_top *top = device->top;
        struct nvkm_top_device *info;
 
        if (top) {
                list_for_each_entry(info, &top->device, head) {
-                       if (info->index == devidx && info->intr >= 0)
+                       if (info->type == type && info->inst == inst && info->intr >= 0)
                                return BIT(info->intr);
                }
        }
@@ -88,44 +89,21 @@ nvkm_top_intr_mask(struct nvkm_device *device, enum nvkm_devidx devidx)
        return 0;
 }
 
-u32
-nvkm_top_intr(struct nvkm_device *device, u32 intr, u64 *psubdevs)
-{
-       struct nvkm_top *top = device->top;
-       struct nvkm_top_device *info;
-       u64 subdevs = 0;
-       u32 handled = 0;
-
-       if (top) {
-               list_for_each_entry(info, &top->device, head) {
-                       if (info->index != NVKM_SUBDEV_NR && info->intr >= 0) {
-                               if (intr & BIT(info->intr)) {
-                                       subdevs |= BIT_ULL(info->index);
-                                       handled |= BIT(info->intr);
-                               }
-                       }
-               }
-       }
-
-       *psubdevs = subdevs;
-       return intr & ~handled;
-}
-
 int
-nvkm_top_fault_id(struct nvkm_device *device, enum nvkm_devidx devidx)
+nvkm_top_fault_id(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
 {
        struct nvkm_top *top = device->top;
        struct nvkm_top_device *info;
 
        list_for_each_entry(info, &top->device, head) {
-               if (info->index == devidx && info->fault >= 0)
+               if (info->type == type && info->inst == inst && info->fault >= 0)
                        return info->fault;
        }
 
        return -ENOENT;
 }
 
-enum nvkm_devidx
+struct nvkm_subdev *
 nvkm_top_fault(struct nvkm_device *device, int fault)
 {
        struct nvkm_top *top = device->top;
@@ -133,28 +111,10 @@ nvkm_top_fault(struct nvkm_device *device, int fault)
 
        list_for_each_entry(info, &top->device, head) {
                if (info->fault == fault)
-                       return info->index;
-       }
-
-       return NVKM_SUBDEV_NR;
-}
-
-enum nvkm_devidx
-nvkm_top_engine(struct nvkm_device *device, int index, int *runl, int *engn)
-{
-       struct nvkm_top *top = device->top;
-       struct nvkm_top_device *info;
-       int n = 0;
-
-       list_for_each_entry(info, &top->device, head) {
-               if (info->engine >= 0 && info->runlist >= 0 && n++ == index) {
-                       *runl = info->runlist;
-                       *engn = info->engine;
-                       return info->index;
-               }
+                       return nvkm_device_subdev(device, info->type, info->inst);
        }
 
-       return -ENODEV;
+       return NULL;
 }
 
 static int
@@ -186,12 +146,12 @@ nvkm_top = {
 
 int
 nvkm_top_new_(const struct nvkm_top_func *func, struct nvkm_device *device,
-             int index, struct nvkm_top **ptop)
+             enum nvkm_subdev_type type, int inst, struct nvkm_top **ptop)
 {
        struct nvkm_top *top;
        if (!(top = *ptop = kzalloc(sizeof(*top), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&nvkm_top, device, index, &top->subdev);
+       nvkm_subdev_ctor(&nvkm_top, device, type, inst, &top->subdev);
        top->func = func;
        INIT_LIST_HEAD(&top->device);
        return 0;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/top/ga100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/top/ga100.c
new file mode 100644 (file)
index 0000000..31933f3
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2021 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include "priv.h"
+
+static int
+ga100_top_oneinit(struct nvkm_top *top)
+{
+       struct nvkm_subdev *subdev = &top->subdev;
+       struct nvkm_device *device = subdev->device;
+       struct nvkm_top_device *info = NULL;
+       u32 data, type, inst;
+       int i, n, size = nvkm_rd32(device, 0x0224fc) >> 20;
+
+       for (i = 0, n = 0; i < size; i++) {
+               if (!info) {
+                       if (!(info = nvkm_top_device_new(top)))
+                               return -ENOMEM;
+                       type = ~0;
+                       inst = 0;
+               }
+
+               data = nvkm_rd32(device, 0x022800 + (i * 0x04));
+               nvkm_trace(subdev, "%02x: %08x\n", i, data);
+               if (!data && n == 0)
+                       continue;
+
+               switch (n++) {
+               case 0:
+                       type          = (data & 0x3f000000) >> 24;
+                       inst          = (data & 0x000f0000) >> 16;
+                       info->fault   = (data & 0x0000007f);
+                       break;
+               case 1:
+                       info->addr    = (data & 0x00fff000);
+                       info->reset   = (data & 0x0000001f);
+                       break;
+               case 2:
+                       info->runlist = (data & 0x0000fc00) >> 10;
+                       info->engine  = (data & 0x00000003);
+                       break;
+               default:
+                       break;
+               }
+
+               if (data & 0x80000000)
+                       continue;
+               n = 0;
+
+               /* Translate engine type to NVKM engine identifier. */
+#define I_(T,I) do { info->type = (T); info->inst = (I); } while(0)
+#define O_(T,I) do { WARN_ON(inst); I_(T, I); } while (0)
+               switch (type) {
+               case 0x00000000: O_(NVKM_ENGINE_GR    ,    0); break;
+               case 0x0000000d: O_(NVKM_ENGINE_SEC2  ,    0); break;
+               case 0x0000000e: I_(NVKM_ENGINE_NVENC , inst); break;
+               case 0x00000010: I_(NVKM_ENGINE_NVDEC , inst); break;
+               case 0x00000012: I_(NVKM_SUBDEV_IOCTRL, inst); break;
+               case 0x00000013: I_(NVKM_ENGINE_CE    , inst); break;
+               case 0x00000014: O_(NVKM_SUBDEV_GSP   ,    0); break;
+               case 0x00000015: O_(NVKM_ENGINE_NVJPG ,    0); break;
+               case 0x00000016: O_(NVKM_ENGINE_OFA   ,    0); break;
+               case 0x00000017: O_(NVKM_SUBDEV_FLA   ,    0); break;
+                       break;
+               default:
+                       break;
+               }
+
+               nvkm_debug(subdev, "%02x.%d (%8s): addr %06x fault %2d "
+                                  "runlist %2d engine %2d reset %2d\n", type, inst,
+                          info->type == NVKM_SUBDEV_NR ? "????????" : nvkm_subdev_type[info->type],
+                          info->addr, info->fault, info->runlist, info->engine, info->reset);
+               info = NULL;
+       }
+
+       return 0;
+}
+
+static const struct nvkm_top_func
+ga100_top = {
+       .oneinit = ga100_top_oneinit,
+};
+
+int
+ga100_top_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_top **ptop)
+{
+       return nvkm_top_new_(&ga100_top, device, type, inst, ptop);
+}
index 1156634533f9751277d3c656a827fce393a88965..4dcad97bd505bd12fb17b44026b5fe40906a4bd1 100644 (file)
@@ -70,26 +70,26 @@ gk104_top_oneinit(struct nvkm_top *top)
                        continue;
 
                /* Translate engine type to NVKM engine identifier. */
-#define A_(A) if (inst == 0) info->index = NVKM_ENGINE_##A
-#define B_(A) if (inst + NVKM_ENGINE_##A##0 < NVKM_ENGINE_##A##_LAST + 1)      \
-               info->index = NVKM_ENGINE_##A##0 + inst
-#define C_(A) if (inst == 0) info->index = NVKM_SUBDEV_##A
+#define I_(T,I) do { info->type = (T); info->inst = (I); } while(0)
+#define O_(T,I) do { WARN_ON(inst); I_(T, I); } while (0)
                switch (type) {
-               case 0x00000000: A_(GR    ); break;
-               case 0x00000001: A_(CE0   ); break;
-               case 0x00000002: A_(CE1   ); break;
-               case 0x00000003: A_(CE2   ); break;
-               case 0x00000008: A_(MSPDEC); break;
-               case 0x00000009: A_(MSPPP ); break;
-               case 0x0000000a: A_(MSVLD ); break;
-               case 0x0000000b: A_(MSENC ); break;
-               case 0x0000000c: A_(VIC   ); break;
-               case 0x0000000d: A_(SEC2  ); break;
-               case 0x0000000e: B_(NVENC ); break;
-               case 0x0000000f: A_(NVENC1); break;
-               case 0x00000010: B_(NVDEC ); break;
-               case 0x00000013: B_(CE    ); break;
-               case 0x00000014: C_(GSP   ); break;
+               case 0x00000000: O_(NVKM_ENGINE_GR    ,    0); break;
+               case 0x00000001: O_(NVKM_ENGINE_CE    ,    0); break;
+               case 0x00000002: O_(NVKM_ENGINE_CE    ,    1); break;
+               case 0x00000003: O_(NVKM_ENGINE_CE    ,    2); break;
+               case 0x00000008: O_(NVKM_ENGINE_MSPDEC,    0); break;
+               case 0x00000009: O_(NVKM_ENGINE_MSPPP ,    0); break;
+               case 0x0000000a: O_(NVKM_ENGINE_MSVLD ,    0); break;
+               case 0x0000000b: O_(NVKM_ENGINE_MSENC ,    0); break;
+               case 0x0000000c: O_(NVKM_ENGINE_VIC   ,    0); break;
+               case 0x0000000d: O_(NVKM_ENGINE_SEC2  ,    0); break;
+               case 0x0000000e: I_(NVKM_ENGINE_NVENC , inst); break;
+               case 0x0000000f: O_(NVKM_ENGINE_NVENC ,    1); break;
+               case 0x00000010: I_(NVKM_ENGINE_NVDEC , inst); break;
+               case 0x00000012: I_(NVKM_SUBDEV_IOCTRL, inst); break;
+               case 0x00000013: I_(NVKM_ENGINE_CE    , inst); break;
+               case 0x00000014: O_(NVKM_SUBDEV_GSP   ,    0); break;
+               case 0x00000015: O_(NVKM_ENGINE_NVJPG ,    0); break;
                default:
                        break;
                }
@@ -97,8 +97,7 @@ gk104_top_oneinit(struct nvkm_top *top)
                nvkm_debug(subdev, "%02x.%d (%8s): addr %06x fault %2d "
                                   "engine %2d runlist %2d intr %2d "
                                   "reset %2d\n", type, inst,
-                          info->index == NVKM_SUBDEV_NR ? NULL :
-                                         nvkm_subdev_name[info->index],
+                          info->type == NVKM_SUBDEV_NR ? "????????" : nvkm_subdev_type[info->type],
                           info->addr, info->fault, info->engine, info->runlist,
                           info->intr, info->reset);
                info = NULL;
@@ -113,7 +112,8 @@ gk104_top = {
 };
 
 int
-gk104_top_new(struct nvkm_device *device, int index, struct nvkm_top **ptop)
+gk104_top_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_top **ptop)
 {
-       return nvkm_top_new_(&gk104_top, device, index, ptop);
+       return nvkm_top_new_(&gk104_top, device, type, inst, ptop);
 }
index a16baa2941cf45ed0d7d2adc75af368e9118dbf4..8e103a83670591caeef823abeb33b970afe27511 100644 (file)
@@ -8,19 +8,8 @@ struct nvkm_top_func {
        int (*oneinit)(struct nvkm_top *);
 };
 
-int nvkm_top_new_(const struct nvkm_top_func *, struct nvkm_device *,
-                 int, struct nvkm_top **);
-
-struct nvkm_top_device {
-       enum nvkm_devidx index;
-       u32 addr;
-       int fault;
-       int engine;
-       int runlist;
-       int reset;
-       int intr;
-       struct list_head head;
-};
+int nvkm_top_new_(const struct nvkm_top_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                 struct nvkm_top **);
 
 struct nvkm_top_device *nvkm_top_device_new(struct nvkm_top *);
 #endif
index e344901cfdc7fcdbe02f9e0f2d32be0a1ef18a90..a17a6dd8d3de9066df9d8f3e074f3b5f43be8e29 100644 (file)
@@ -281,12 +281,12 @@ nvkm_volt = {
 
 void
 nvkm_volt_ctor(const struct nvkm_volt_func *func, struct nvkm_device *device,
-              int index, struct nvkm_volt *volt)
+              enum nvkm_subdev_type type, int inst, struct nvkm_volt *volt)
 {
        struct nvkm_bios *bios = device->bios;
        int i;
 
-       nvkm_subdev_ctor(&nvkm_volt, device, index, &volt->subdev);
+       nvkm_subdev_ctor(&nvkm_volt, device, type, inst, &volt->subdev);
        volt->func = func;
 
        /* Assuming the non-bios device should build the voltage table later */
@@ -319,10 +319,10 @@ nvkm_volt_ctor(const struct nvkm_volt_func *func, struct nvkm_device *device,
 
 int
 nvkm_volt_new_(const struct nvkm_volt_func *func, struct nvkm_device *device,
-              int index, struct nvkm_volt **pvolt)
+              enum nvkm_subdev_type type, int inst, struct nvkm_volt **pvolt)
 {
        if (!(*pvolt = kzalloc(sizeof(**pvolt), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_volt_ctor(func, device, index, *pvolt);
+       nvkm_volt_ctor(func, device, type, inst, *pvolt);
        return 0;
 }
index d9ed6925ca6422c94f802ee109815a4ff5dabf52..b47a1c0817be16de1107b4baa280fb1dc9b9194e 100644 (file)
@@ -56,12 +56,13 @@ gf100_volt = {
 };
 
 int
-gf100_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
+gf100_volt_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_volt **pvolt)
 {
        struct nvkm_volt *volt;
        int ret;
 
-       ret = nvkm_volt_new_(&gf100_volt, device, index, &volt);
+       ret = nvkm_volt_new_(&gf100_volt, device, type, inst, &volt);
        *pvolt = volt;
        if (ret)
                return ret;
index 547a58f0aeac326b3b7685d5a04fa1956e77b1c6..03c8a2c2916c25437df7b821432f17e1e9a71f5d 100644 (file)
@@ -46,12 +46,13 @@ gf117_volt = {
 };
 
 int
-gf117_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
+gf117_volt_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_volt **pvolt)
 {
        struct nvkm_volt *volt;
        int ret;
 
-       ret = nvkm_volt_new_(&gf117_volt, device, index, &volt);
+       ret = nvkm_volt_new_(&gf117_volt, device, type, inst, &volt);
        *pvolt = volt;
        if (ret)
                return ret;
index 1c744e029454030e04c3003a7db803ae83b59e28..d1ce4309cfb84057872f2d8af9cf52490bf0c33f 100644 (file)
@@ -95,7 +95,8 @@ gk104_volt_pwm = {
 };
 
 int
-gk104_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
+gk104_volt_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_volt **pvolt)
 {
        const struct nvkm_volt_func *volt_func = &gk104_volt_gpio;
        struct dcb_gpio_func gpio;
@@ -114,7 +115,7 @@ gk104_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
 
        if (!(volt = kzalloc(sizeof(*volt), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_volt_ctor(volt_func, device, index, &volt->base);
+       nvkm_volt_ctor(volt_func, device, type, inst, &volt->base);
        *pvolt = &volt->base;
        volt->bios = bios;
 
index ce5d83cdc7cf7900cf86060750b9398ef24063d9..8c2faa9645111932c6920befc021d71363d7869c 100644 (file)
@@ -144,14 +144,14 @@ gk20a_volt = {
 };
 
 int
-gk20a_volt_ctor(struct nvkm_device *device, int index,
+gk20a_volt_ctor(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                const struct cvb_coef *coefs, int nb_coefs,
                int vmin, struct gk20a_volt *volt)
 {
        struct nvkm_device_tegra *tdev = device->func->tegra(device);
        int i, uv;
 
-       nvkm_volt_ctor(&gk20a_volt, device, index, &volt->base);
+       nvkm_volt_ctor(&gk20a_volt, device, type, inst, &volt->base);
 
        uv = regulator_get_voltage(tdev->vdd);
        nvkm_debug(&volt->base.subdev, "the default voltage is %duV\n", uv);
@@ -172,7 +172,7 @@ gk20a_volt_ctor(struct nvkm_device *device, int index,
 }
 
 int
-gk20a_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
+gk20a_volt_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_volt **pvolt)
 {
        struct gk20a_volt *volt;
 
@@ -181,6 +181,6 @@ gk20a_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
                return -ENOMEM;
        *pvolt = &volt->base;
 
-       return gk20a_volt_ctor(device, index, gk20a_cvb_coef,
+       return gk20a_volt_ctor(device, type, inst, gk20a_cvb_coef,
                               ARRAY_SIZE(gk20a_cvb_coef), 0, volt);
 }
index 6a6c97f9684e0c1e560d03209fbed77755ac4dac..01f8a5fcf496162dfb2b92f07d44181461a0d586 100644 (file)
@@ -37,7 +37,7 @@ struct gk20a_volt {
        struct regulator *vdd;
 };
 
-int gk20a_volt_ctor(struct nvkm_device *device, int index,
+int gk20a_volt_ctor(struct nvkm_device *device, enum nvkm_subdev_type, int,
                    const struct cvb_coef *coefs, int nb_coefs,
                    int vmin, struct gk20a_volt *volt);
 
index 2925b9cae6813fe8c67d5c7ced06d06183c203a0..c2e9694d333f4d5a4167d80a26e59b0885a6d046 100644 (file)
@@ -64,7 +64,8 @@ static const u32 speedo_to_vmin[] = {
 };
 
 int
-gm20b_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
+gm20b_volt_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+              struct nvkm_volt **pvolt)
 {
        struct nvkm_device_tegra *tdev = device->func->tegra(device);
        struct gk20a_volt *volt;
@@ -84,9 +85,9 @@ gm20b_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
        vmin = speedo_to_vmin[tdev->gpu_speedo_id];
 
        if (tdev->gpu_speedo_id >= 1)
-               return gk20a_volt_ctor(device, index, gm20b_na_cvb_coef,
-                                    ARRAY_SIZE(gm20b_na_cvb_coef), vmin, volt);
+               return gk20a_volt_ctor(device, type, inst, gm20b_na_cvb_coef,
+                                      ARRAY_SIZE(gm20b_na_cvb_coef), vmin, volt);
        else
-               return gk20a_volt_ctor(device, index, gm20b_cvb_coef,
-                                       ARRAY_SIZE(gm20b_cvb_coef), vmin, volt);
+               return gk20a_volt_ctor(device, type, inst, gm20b_cvb_coef,
+                                      ARRAY_SIZE(gm20b_cvb_coef), vmin, volt);
 }
index 23409387abb58701f6773b8a7cc1c64326f1aa01..d6a587d6082d96b7f48a4c4b271155450a8d8c76 100644 (file)
@@ -30,12 +30,13 @@ nv40_volt = {
 };
 
 int
-nv40_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
+nv40_volt_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+             struct nvkm_volt **pvolt)
 {
        struct nvkm_volt *volt;
        int ret;
 
-       ret = nvkm_volt_new_(&nv40_volt, device, index, &volt);
+       ret = nvkm_volt_new_(&nv40_volt, device, type, inst, &volt);
        *pvolt = volt;
        if (ret)
                return ret;
index 75f13a34671fb34db527dc0406ee98f839d66708..24e2d16d19134e249795aee33354a1d92b94da7d 100644 (file)
@@ -4,10 +4,10 @@
 #define nvkm_volt(p) container_of((p), struct nvkm_volt, subdev)
 #include <subdev/volt.h>
 
-void nvkm_volt_ctor(const struct nvkm_volt_func *, struct nvkm_device *,
-                   int index, struct nvkm_volt *);
-int nvkm_volt_new_(const struct nvkm_volt_func *, struct nvkm_device *,
-                  int index, struct nvkm_volt **);
+void nvkm_volt_ctor(const struct nvkm_volt_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                   struct nvkm_volt *);
+int nvkm_volt_new_(const struct nvkm_volt_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
+                  struct nvkm_volt **);
 
 struct nvkm_volt_func {
        int (*oneinit)(struct nvkm_volt *);