Merge tag 'amd-drm-next-5.12-2021-02-18' of https://gitlab.freedesktop.org/agd5f...
authorDave Airlie <airlied@redhat.com>
Fri, 19 Feb 2021 03:50:47 +0000 (13:50 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 19 Feb 2021 03:50:48 +0000 (13:50 +1000)
amd-drm-next-5.12-2021-02-18:

amdgpu:
- Prefer Bhawan's unused variable fix
- Fixes for high priority queues on gfx8,9
- swSMU fixes for sienna cichlid
- swSMU fixes for renoir
- mmhub client id fixes for arcturus
- SMUIO fixes for navi family
- swSMU fixes for vangogh
- GPU reset cleanup
- Display fixes
- GFX harvesting fix for sienna cichlid
- Fix reference clock on Renoir
- Misc fixes and cleanups

amdkfd:
- Fix for unique id query
- Fix recursive lock warnings

radeon:
- Remove confusing VCE messages on Oland

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexdeucher@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210218221531.3870-1-alexander.deucher@amd.com
554 files changed:
Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml
Documentation/gpu/todo.rst
drivers/dma-buf/st-dma-fence.c
drivers/gpu/drm/drm_client_modeset.c
drivers/gpu/drm/drm_dp_mst_topology.c
drivers/gpu/drm/gma500/Kconfig
drivers/gpu/drm/gma500/Makefile
drivers/gpu/drm/gma500/cdv_intel_hdmi.c
drivers/gpu/drm/gma500/mdfld_device.c [deleted file]
drivers/gpu/drm/gma500/mdfld_dsi_dpi.c [deleted file]
drivers/gpu/drm/gma500/mdfld_dsi_dpi.h [deleted file]
drivers/gpu/drm/gma500/mdfld_dsi_output.c [deleted file]
drivers/gpu/drm/gma500/mdfld_dsi_output.h [deleted file]
drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c [deleted file]
drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.h [deleted file]
drivers/gpu/drm/gma500/mdfld_intel_display.c [deleted file]
drivers/gpu/drm/gma500/mdfld_output.c [deleted file]
drivers/gpu/drm/gma500/mdfld_output.h [deleted file]
drivers/gpu/drm/gma500/mdfld_tmd_vid.c [deleted file]
drivers/gpu/drm/gma500/mdfld_tpo_vid.c [deleted file]
drivers/gpu/drm/gma500/mmu.c
drivers/gpu/drm/gma500/psb_drv.c
drivers/gpu/drm/gma500/psb_drv.h
drivers/gpu/drm/gma500/psb_intel_reg.h
drivers/gpu/drm/gma500/psb_irq.c
drivers/gpu/drm/gma500/psb_irq.h
drivers/gpu/drm/gma500/psb_reg.h
drivers/gpu/drm/gma500/tc35876x-dsi-lvds.c [deleted file]
drivers/gpu/drm/gma500/tc35876x-dsi-lvds.h [deleted file]
drivers/gpu/drm/lima/lima_sched.c
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_bios.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/gf100.c [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gf117.c [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk104.c [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk20a.c [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gm200.c [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gp10b.c [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 [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf117.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk104.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk20a.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/gm200.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/privring/gp10b.c [new file with mode: 0644]
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
drivers/gpu/drm/vc4/vc4_gem.c
drivers/gpu/drm/vc4/vc4_hdmi.c
drivers/gpu/drm/vc4/vc4_hdmi.h
drivers/gpu/drm/vc4/vc4_hdmi_regs.h
drivers/gpu/drm/virtio/virtgpu_kms.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c

index 7ce06f9..6e8ac91 100644 (file)
@@ -53,6 +53,24 @@ properties:
       - const: audio
       - const: cec
 
+  interrupts:
+    items:
+      - description: CEC TX interrupt
+      - description: CEC RX interrupt
+      - description: CEC stuck at low interrupt
+      - description: Wake-up interrupt
+      - description: Hotplug connected interrupt
+      - description: Hotplug removed interrupt
+
+  interrupt-names:
+    items:
+      - const: cec-tx
+      - const: cec-rx
+      - const: cec-low
+      - const: wakeup
+      - const: hpd-connected
+      - const: hpd-removed
+
   ddc:
     allOf:
       - $ref: /schemas/types.yaml#/definitions/phandle
@@ -90,7 +108,7 @@ required:
   - resets
   - ddc
 
-additionalProperties: false
+unevaluatedProperties: false
 
 examples:
   - |
index 009d8e6..77fbfe9 100644 (file)
@@ -23,6 +23,9 @@ Advanced: Tricky tasks that need fairly good understanding of the DRM subsystem
 and graphics topics. Generally need the relevant hardware for development and
 testing.
 
+Expert: Only attempt these if you've successfully completed some tricky
+refactorings already and are an expert in the specific area
+
 Subsystem-wide refactorings
 ===========================
 
@@ -168,6 +171,22 @@ Contact: Daniel Vetter, respective driver maintainers
 
 Level: Advanced
 
+Move Buffer Object Locking to dma_resv_lock()
+---------------------------------------------
+
+Many drivers have their own per-object locking scheme, usually using
+mutex_lock(). This causes all kinds of trouble for buffer sharing, since
+depending which driver is the exporter and importer, the locking hierarchy is
+reversed.
+
+To solve this we need one standard per-object locking mechanism, which is
+dma_resv_lock(). This lock needs to be called as the outermost lock, with all
+other driver specific per-object locks removed. The problem is tha rolling out
+the actual change to the locking contract is a flag day, due to struct dma_buf
+buffer sharing.
+
+Level: Expert
+
 Convert logging to drm_* functions with drm_device paramater
 ------------------------------------------------------------
 
index e593064..c8a12d7 100644 (file)
@@ -471,8 +471,11 @@ static int thread_signal_callback(void *arg)
                        dma_fence_signal(f1);
 
                smp_store_mb(cb.seen, false);
-               if (!f2 || dma_fence_add_callback(f2, &cb.cb, simple_callback))
-                       miss++, cb.seen = true;
+               if (!f2 ||
+                   dma_fence_add_callback(f2, &cb.cb, simple_callback)) {
+                       miss++;
+                       cb.seen = true;
+               }
 
                if (!t->before)
                        dma_fence_signal(f1);
index b7e9e1c..ced09c7 100644 (file)
@@ -7,6 +7,7 @@
  * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
  */
 
+#include "drm/drm_modeset_lock.h"
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/slab.h>
@@ -1181,9 +1182,11 @@ static void drm_client_modeset_dpms_legacy(struct drm_client_dev *client, int dp
        struct drm_device *dev = client->dev;
        struct drm_connector *connector;
        struct drm_mode_set *modeset;
+       struct drm_modeset_acquire_ctx ctx;
        int j;
+       int ret;
 
-       drm_modeset_lock_all(dev);
+       DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, 0, ret);
        drm_client_for_each_modeset(modeset, client) {
                if (!modeset->crtc->enabled)
                        continue;
@@ -1195,7 +1198,7 @@ static void drm_client_modeset_dpms_legacy(struct drm_client_dev *client, int dp
                                dev->mode_config.dpms_property, dpms_mode);
                }
        }
-       drm_modeset_unlock_all(dev);
+       DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
 }
 
 /**
index e82b596..da10a43 100644 (file)
@@ -2302,7 +2302,8 @@ drm_dp_mst_port_add_connector(struct drm_dp_mst_branch *mstb,
        }
 
        if (port->pdt != DP_PEER_DEVICE_NONE &&
-           drm_dp_mst_is_end_device(port->pdt, port->mcs)) {
+           drm_dp_mst_is_end_device(port->pdt, port->mcs) &&
+           port->port_num >= DP_MST_LOGICAL_PORT_0) {
                port->cached_edid = drm_get_edid(port->connector,
                                                 &port->aux.ddc);
                drm_connector_set_tile_property(port->connector);
index 0e23c93..ec39565 100644 (file)
@@ -1,9 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0-only
 config DRM_GMA500
-       tristate "Intel GMA5/600 KMS Framebuffer"
+       tristate "Intel GMA500/600/3600/3650 KMS Framebuffer"
        depends on DRM && PCI && X86 && MMU
        select DRM_KMS_HELPER
-       select DRM_TTM
        # GMA500 depends on ACPI_VIDEO when ACPI is enabled, just like i915
        select ACPI_VIDEO if ACPI
        select BACKLIGHT_CLASS_DEVICE if ACPI
@@ -19,17 +18,3 @@ config DRM_GMA600
        help
          Say yes to include support for GMA600 (Intel Moorestown/Oaktrail)
          platforms with LVDS ports. MIPI is not currently supported.
-
-config DRM_GMA3600
-       bool "Intel GMA3600/3650 support (Experimental)"
-       depends on DRM_GMA500
-       help
-         Say yes to include basic support for Intel GMA3600/3650 (Intel
-         Cedar Trail) platforms.
-
-config DRM_MEDFIELD
-       bool "Intel Medfield support (Experimental)"
-       depends on DRM_GMA500 && X86_INTEL_MID
-       help
-         Say yes to include support for the Intel Medfield platform.
-
index c8f2c89..884ab1f 100644 (file)
@@ -6,36 +6,35 @@
 gma500_gfx-y += \
          accel_2d.o \
          backlight.o \
+         blitter.o \
+         cdv_device.o \
+         cdv_intel_crt.o \
+         cdv_intel_display.o \
+         cdv_intel_dp.o \
+         cdv_intel_hdmi.o \
+         cdv_intel_lvds.o \
          framebuffer.o \
          gem.o \
+         gma_device.o \
+         gma_display.o \
          gtt.o \
          intel_bios.o \
-         intel_i2c.o \
          intel_gmbus.o \
+         intel_i2c.o \
+         mid_bios.o \
          mmu.o \
-         blitter.o \
          power.o \
+         psb_device.o \
          psb_drv.o \
-         gma_display.o \
-         gma_device.o \
          psb_intel_display.o \
          psb_intel_lvds.o \
          psb_intel_modes.o \
          psb_intel_sdvo.o \
          psb_lid.o \
-         psb_irq.o \
-         psb_device.o \
-         mid_bios.o
+         psb_irq.o
 
 gma500_gfx-$(CONFIG_ACPI) +=  opregion.o \
 
-gma500_gfx-$(CONFIG_DRM_GMA3600) +=  cdv_device.o \
-         cdv_intel_crt.o \
-         cdv_intel_display.o \
-         cdv_intel_hdmi.o \
-         cdv_intel_lvds.o \
-         cdv_intel_dp.o
-
 gma500_gfx-$(CONFIG_DRM_GMA600) += oaktrail_device.o \
          oaktrail_crtc.o \
          oaktrail_lvds.o \
@@ -43,14 +42,4 @@ gma500_gfx-$(CONFIG_DRM_GMA600) += oaktrail_device.o \
          oaktrail_hdmi.o \
          oaktrail_hdmi_i2c.o
 
-gma500_gfx-$(CONFIG_DRM_MEDFIELD) += mdfld_device.o \
-         mdfld_output.o \
-         mdfld_intel_display.o \
-         mdfld_dsi_output.o \
-         mdfld_dsi_dpi.o \
-         mdfld_dsi_pkg_sender.o \
-         mdfld_tpo_vid.o \
-         mdfld_tmd_vid.o \
-         tc35876x-dsi-lvds.o
-
 obj-$(CONFIG_DRM_GMA500) += gma500_gfx.o
index 0d12c6f..e525689 100644 (file)
@@ -22,9 +22,6 @@
  *
  * Authors:
  *     jim liu <jim.liu@intel.com>
- *
- * FIXME:
- *     We should probably make this generic and share it with Medfield
  */
 
 #include <linux/pm_runtime.h>
@@ -56,7 +53,6 @@ struct mid_intel_hdmi_priv {
        bool has_hdmi_audio;
        /* Should set this when detect hotplug */
        bool hdmi_device_connected;
-       struct mdfld_hdmi_i2c *i2c_bus;
        struct i2c_adapter *hdmi_i2c_adapter;   /* for control functions */
        struct drm_device *dev;
 };
diff --git a/drivers/gpu/drm/gma500/mdfld_device.c b/drivers/gpu/drm/gma500/mdfld_device.c
deleted file mode 100644 (file)
index 684d6cf..0000000
+++ /dev/null
@@ -1,564 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/**************************************************************************
- * Copyright (c) 2011, Intel Corporation.
- * All Rights Reserved.
- *
- **************************************************************************/
-
-#include <linux/delay.h>
-#include <linux/gpio/machine.h>
-
-#include <asm/intel_scu_ipc.h>
-
-#include "mdfld_dsi_output.h"
-#include "mdfld_output.h"
-#include "mid_bios.h"
-#include "psb_drv.h"
-#include "tc35876x-dsi-lvds.h"
-
-#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
-
-#define MRST_BLC_MAX_PWM_REG_FREQ          0xFFFF
-#define BLC_PWM_PRECISION_FACTOR 100   /* 10000000 */
-#define BLC_PWM_FREQ_CALC_CONSTANT 32
-#define MHz 1000000
-#define BRIGHTNESS_MIN_LEVEL 1
-#define BRIGHTNESS_MAX_LEVEL 100
-#define BRIGHTNESS_MASK        0xFF
-#define BLC_POLARITY_NORMAL 0
-#define BLC_POLARITY_INVERSE 1
-#define BLC_ADJUSTMENT_MAX 100
-
-#define MDFLD_BLC_PWM_PRECISION_FACTOR    10
-#define MDFLD_BLC_MAX_PWM_REG_FREQ        0xFFFE
-#define MDFLD_BLC_MIN_PWM_REG_FREQ        0x2
-
-#define MDFLD_BACKLIGHT_PWM_POLARITY_BIT_CLEAR (0xFFFE)
-#define MDFLD_BACKLIGHT_PWM_CTL_SHIFT  (16)
-
-static struct backlight_device *mdfld_backlight_device;
-
-int mdfld_set_brightness(struct backlight_device *bd)
-{
-       struct drm_device *dev =
-               (struct drm_device *)bl_get_data(mdfld_backlight_device);
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       int level = bd->props.brightness;
-
-       DRM_DEBUG_DRIVER("backlight level set to %d\n", level);
-
-       /* Perform value bounds checking */
-       if (level < BRIGHTNESS_MIN_LEVEL)
-               level = BRIGHTNESS_MIN_LEVEL;
-
-       if (gma_power_begin(dev, false)) {
-               u32 adjusted_level = 0;
-
-               /*
-                * Adjust the backlight level with the percent in
-                * dev_priv->blc_adj2
-                */
-               adjusted_level = level * dev_priv->blc_adj2;
-               adjusted_level = adjusted_level / BLC_ADJUSTMENT_MAX;
-               dev_priv->brightness_adjusted = adjusted_level;
-
-               if (mdfld_get_panel_type(dev, 0) == TC35876X) {
-                       if (dev_priv->dpi_panel_on[0] ||
-                                       dev_priv->dpi_panel_on[2])
-                               tc35876x_brightness_control(dev,
-                                               dev_priv->brightness_adjusted);
-               } else {
-                       if (dev_priv->dpi_panel_on[0])
-                               mdfld_dsi_brightness_control(dev, 0,
-                                               dev_priv->brightness_adjusted);
-               }
-
-               if (dev_priv->dpi_panel_on[2])
-                       mdfld_dsi_brightness_control(dev, 2,
-                                       dev_priv->brightness_adjusted);
-               gma_power_end(dev);
-       }
-
-       /* cache the brightness for later use */
-       dev_priv->brightness = level;
-       return 0;
-}
-
-static int mdfld_get_brightness(struct backlight_device *bd)
-{
-       struct drm_device *dev =
-               (struct drm_device *)bl_get_data(mdfld_backlight_device);
-       struct drm_psb_private *dev_priv = dev->dev_private;
-
-       DRM_DEBUG_DRIVER("brightness = 0x%x \n", dev_priv->brightness);
-
-       /* return locally cached var instead of HW read (due to DPST etc.) */
-       return dev_priv->brightness;
-}
-
-static const struct backlight_ops mdfld_ops = {
-       .get_brightness = mdfld_get_brightness,
-       .update_status  = mdfld_set_brightness,
-};
-
-static int device_backlight_init(struct drm_device *dev)
-{
-       struct drm_psb_private *dev_priv = (struct drm_psb_private *)
-               dev->dev_private;
-
-       dev_priv->blc_adj1 = BLC_ADJUSTMENT_MAX;
-       dev_priv->blc_adj2 = BLC_ADJUSTMENT_MAX;
-
-       return 0;
-}
-
-static int mdfld_backlight_init(struct drm_device *dev)
-{
-       struct backlight_properties props;
-       int ret = 0;
-
-       memset(&props, 0, sizeof(struct backlight_properties));
-       props.max_brightness = BRIGHTNESS_MAX_LEVEL;
-       props.type = BACKLIGHT_PLATFORM;
-       mdfld_backlight_device = backlight_device_register("mdfld-bl",
-                               NULL, (void *)dev, &mdfld_ops, &props);
-
-       if (IS_ERR(mdfld_backlight_device))
-               return PTR_ERR(mdfld_backlight_device);
-
-       ret = device_backlight_init(dev);
-       if (ret)
-               return ret;
-
-       mdfld_backlight_device->props.brightness = BRIGHTNESS_MAX_LEVEL;
-       mdfld_backlight_device->props.max_brightness = BRIGHTNESS_MAX_LEVEL;
-       backlight_update_status(mdfld_backlight_device);
-       return 0;
-}
-#endif
-
-struct backlight_device *mdfld_get_backlight_device(void)
-{
-#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
-       return mdfld_backlight_device;
-#else
-       return NULL;
-#endif
-}
-
-/*
- * mdfld_save_display_registers
- *
- * Description: We are going to suspend so save current display
- * register state.
- *
- * Notes: FIXME_JLIU7 need to add the support for DPI MIPI & HDMI audio
- */
-static int mdfld_save_display_registers(struct drm_device *dev, int pipenum)
-{
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       struct medfield_state *regs = &dev_priv->regs.mdfld;
-       struct psb_pipe *pipe = &dev_priv->regs.pipe[pipenum];
-       const struct psb_offset *map = &dev_priv->regmap[pipenum];
-       int i;
-       u32 *mipi_val;
-
-       /* register */
-       u32 mipi_reg = MIPI;
-
-       switch (pipenum) {
-       case 0:
-               mipi_val = &regs->saveMIPI;
-               break;
-       case 1:
-               mipi_val = &regs->saveMIPI;
-               break;
-       case 2:
-               /* register */
-               mipi_reg = MIPI_C;
-               /* pointer to values */
-               mipi_val = &regs->saveMIPI_C;
-               break;
-       default:
-               DRM_ERROR("%s, invalid pipe number.\n", __func__);
-               return -EINVAL;
-       }
-
-       /* Pipe & plane A info */
-       pipe->dpll = PSB_RVDC32(map->dpll);
-       pipe->fp0 = PSB_RVDC32(map->fp0);
-       pipe->conf = PSB_RVDC32(map->conf);
-       pipe->htotal = PSB_RVDC32(map->htotal);
-       pipe->hblank = PSB_RVDC32(map->hblank);
-       pipe->hsync = PSB_RVDC32(map->hsync);
-       pipe->vtotal = PSB_RVDC32(map->vtotal);
-       pipe->vblank = PSB_RVDC32(map->vblank);
-       pipe->vsync = PSB_RVDC32(map->vsync);
-       pipe->src = PSB_RVDC32(map->src);
-       pipe->stride = PSB_RVDC32(map->stride);
-       pipe->linoff = PSB_RVDC32(map->linoff);
-       pipe->tileoff = PSB_RVDC32(map->tileoff);
-       pipe->size = PSB_RVDC32(map->size);
-       pipe->pos = PSB_RVDC32(map->pos);
-       pipe->surf = PSB_RVDC32(map->surf);
-       pipe->cntr = PSB_RVDC32(map->cntr);
-       pipe->status = PSB_RVDC32(map->status);
-
-       /*save palette (gamma) */
-       for (i = 0; i < 256; i++)
-               pipe->palette[i] = PSB_RVDC32(map->palette + (i << 2));
-
-       if (pipenum == 1) {
-               regs->savePFIT_CONTROL = PSB_RVDC32(PFIT_CONTROL);
-               regs->savePFIT_PGM_RATIOS = PSB_RVDC32(PFIT_PGM_RATIOS);
-
-               regs->saveHDMIPHYMISCCTL = PSB_RVDC32(HDMIPHYMISCCTL);
-               regs->saveHDMIB_CONTROL = PSB_RVDC32(HDMIB_CONTROL);
-               return 0;
-       }
-
-       *mipi_val = PSB_RVDC32(mipi_reg);
-       return 0;
-}
-
-/*
- * mdfld_restore_display_registers
- *
- * Description: We are going to resume so restore display register state.
- *
- * Notes: FIXME_JLIU7 need to add the support for DPI MIPI & HDMI audio
- */
-static int mdfld_restore_display_registers(struct drm_device *dev, int pipenum)
-{
-       /* To get  panel out of ULPS mode. */
-       u32 temp = 0;
-       u32 device_ready_reg = DEVICE_READY_REG;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       struct mdfld_dsi_config *dsi_config = NULL;
-       struct medfield_state *regs = &dev_priv->regs.mdfld;
-       struct psb_pipe *pipe = &dev_priv->regs.pipe[pipenum];
-       const struct psb_offset *map = &dev_priv->regmap[pipenum];
-       u32 i;
-       u32 dpll;
-       u32 timeout = 0;
-
-       /* register */
-       u32 mipi_reg = MIPI;
-
-       /* values */
-       u32 dpll_val = pipe->dpll;
-       u32 mipi_val = regs->saveMIPI;
-
-       switch (pipenum) {
-       case 0:
-               dpll_val &= ~DPLL_VCO_ENABLE;
-               dsi_config = dev_priv->dsi_configs[0];
-               break;
-       case 1:
-               dpll_val &= ~DPLL_VCO_ENABLE;
-               break;
-       case 2:
-               mipi_reg = MIPI_C;
-               mipi_val = regs->saveMIPI_C;
-               dsi_config = dev_priv->dsi_configs[1];
-               break;
-       default:
-               DRM_ERROR("%s, invalid pipe number.\n", __func__);
-               return -EINVAL;
-       }
-
-       /*make sure VGA plane is off. it initializes to on after reset!*/
-       PSB_WVDC32(0x80000000, VGACNTRL);
-
-       if (pipenum == 1) {
-               PSB_WVDC32(dpll_val & ~DPLL_VCO_ENABLE, map->dpll);
-               PSB_RVDC32(map->dpll);
-
-               PSB_WVDC32(pipe->fp0, map->fp0);
-       } else {
-
-               dpll = PSB_RVDC32(map->dpll);
-
-               if (!(dpll & DPLL_VCO_ENABLE)) {
-
-                       /* When ungating power of DPLL, needs to wait 0.5us
-                          before enable the VCO */
-                       if (dpll & MDFLD_PWR_GATE_EN) {
-                               dpll &= ~MDFLD_PWR_GATE_EN;
-                               PSB_WVDC32(dpll, map->dpll);
-                               /* FIXME_MDFLD PO - change 500 to 1 after PO */
-                               udelay(500);
-                       }
-
-                       PSB_WVDC32(pipe->fp0, map->fp0);
-                       PSB_WVDC32(dpll_val, map->dpll);
-                       /* FIXME_MDFLD PO - change 500 to 1 after PO */
-                       udelay(500);
-
-                       dpll_val |= DPLL_VCO_ENABLE;
-                       PSB_WVDC32(dpll_val, map->dpll);
-                       PSB_RVDC32(map->dpll);
-
-                       /* wait for DSI PLL to lock */
-                       while (timeout < 20000 &&
-                         !(PSB_RVDC32(map->conf) & PIPECONF_DSIPLL_LOCK)) {
-                               udelay(150);
-                               timeout++;
-                       }
-
-                       if (timeout == 20000) {
-                               DRM_ERROR("%s, can't lock DSIPLL.\n",
-                                                               __func__);
-                               return -EINVAL;
-                       }
-               }
-       }
-       /* Restore mode */
-       PSB_WVDC32(pipe->htotal, map->htotal);
-       PSB_WVDC32(pipe->hblank, map->hblank);
-       PSB_WVDC32(pipe->hsync, map->hsync);
-       PSB_WVDC32(pipe->vtotal, map->vtotal);
-       PSB_WVDC32(pipe->vblank, map->vblank);
-       PSB_WVDC32(pipe->vsync, map->vsync);
-       PSB_WVDC32(pipe->src, map->src);
-       PSB_WVDC32(pipe->status, map->status);
-
-       /*set up the plane*/
-       PSB_WVDC32(pipe->stride, map->stride);
-       PSB_WVDC32(pipe->linoff, map->linoff);
-       PSB_WVDC32(pipe->tileoff, map->tileoff);
-       PSB_WVDC32(pipe->size, map->size);
-       PSB_WVDC32(pipe->pos, map->pos);
-       PSB_WVDC32(pipe->surf, map->surf);
-
-       if (pipenum == 1) {
-               /* restore palette (gamma) */
-               /* udelay(50000); */
-               for (i = 0; i < 256; i++)
-                       PSB_WVDC32(pipe->palette[i], map->palette + (i << 2));
-
-               PSB_WVDC32(regs->savePFIT_CONTROL, PFIT_CONTROL);
-               PSB_WVDC32(regs->savePFIT_PGM_RATIOS, PFIT_PGM_RATIOS);
-
-               /*TODO: resume HDMI port */
-
-               /*TODO: resume pipe*/
-
-               /*enable the plane*/
-               PSB_WVDC32(pipe->cntr & ~DISPLAY_PLANE_ENABLE, map->cntr);
-
-               return 0;
-       }
-
-       /*set up pipe related registers*/
-       PSB_WVDC32(mipi_val, mipi_reg);
-
-       /*setup MIPI adapter + MIPI IP registers*/
-       if (dsi_config)
-               mdfld_dsi_controller_init(dsi_config, pipenum);
-
-       if (in_atomic() || in_interrupt())
-               mdelay(20);
-       else
-               msleep(20);
-
-       /*enable the plane*/
-       PSB_WVDC32(pipe->cntr, map->cntr);
-
-       if (in_atomic() || in_interrupt())
-               mdelay(20);
-       else
-               msleep(20);
-
-       /* LP Hold Release */
-       temp = REG_READ(mipi_reg);
-       temp |= LP_OUTPUT_HOLD_RELEASE;
-       REG_WRITE(mipi_reg, temp);
-       mdelay(1);
-
-
-       /* Set DSI host to exit from Utra Low Power State */
-       temp = REG_READ(device_ready_reg);
-       temp &= ~ULPS_MASK;
-       temp |= 0x3;
-       temp |= EXIT_ULPS_DEV_READY;
-       REG_WRITE(device_ready_reg, temp);
-       mdelay(1);
-
-       temp = REG_READ(device_ready_reg);
-       temp &= ~ULPS_MASK;
-       temp |= EXITING_ULPS;
-       REG_WRITE(device_ready_reg, temp);
-       mdelay(1);
-
-       /*enable the pipe*/
-       PSB_WVDC32(pipe->conf, map->conf);
-
-       /* restore palette (gamma) */
-       /* udelay(50000); */
-       for (i = 0; i < 256; i++)
-               PSB_WVDC32(pipe->palette[i], map->palette + (i << 2));
-
-       return 0;
-}
-
-static int mdfld_save_registers(struct drm_device *dev)
-{
-       /* mdfld_save_cursor_overlay_registers(dev); */
-       mdfld_save_display_registers(dev, 0);
-       mdfld_save_display_registers(dev, 2);
-       mdfld_disable_crtc(dev, 0);
-       mdfld_disable_crtc(dev, 2);
-
-       return 0;
-}
-
-static int mdfld_restore_registers(struct drm_device *dev)
-{
-       mdfld_restore_display_registers(dev, 2);
-       mdfld_restore_display_registers(dev, 0);
-       /* mdfld_restore_cursor_overlay_registers(dev); */
-
-       return 0;
-}
-
-static int mdfld_power_down(struct drm_device *dev)
-{
-       /* FIXME */
-       return 0;
-}
-
-static int mdfld_power_up(struct drm_device *dev)
-{
-       /* FIXME */
-       return 0;
-}
-
-/* Medfield  */
-static const struct psb_offset mdfld_regmap[3] = {
-       {
-               .fp0 = MRST_FPA0,
-               .fp1 = MRST_FPA1,
-               .cntr = DSPACNTR,
-               .conf = PIPEACONF,
-               .src = PIPEASRC,
-               .dpll = MRST_DPLL_A,
-               .htotal = HTOTAL_A,
-               .hblank = HBLANK_A,
-               .hsync = HSYNC_A,
-               .vtotal = VTOTAL_A,
-               .vblank = VBLANK_A,
-               .vsync = VSYNC_A,
-               .stride = DSPASTRIDE,
-               .size = DSPASIZE,
-               .pos = DSPAPOS,
-               .surf = DSPASURF,
-               .addr = MRST_DSPABASE,
-               .status = PIPEASTAT,
-               .linoff = DSPALINOFF,
-               .tileoff = DSPATILEOFF,
-               .palette = PALETTE_A,
-       },
-       {
-               .fp0 = MDFLD_DPLL_DIV0,
-               .cntr = DSPBCNTR,
-               .conf = PIPEBCONF,
-               .src = PIPEBSRC,
-               .dpll = MDFLD_DPLL_B,
-               .htotal = HTOTAL_B,
-               .hblank = HBLANK_B,
-               .hsync = HSYNC_B,
-               .vtotal = VTOTAL_B,
-               .vblank = VBLANK_B,
-               .vsync = VSYNC_B,
-               .stride = DSPBSTRIDE,
-               .size = DSPBSIZE,
-               .pos = DSPBPOS,
-               .surf = DSPBSURF,
-               .addr = MRST_DSPBBASE,
-               .status = PIPEBSTAT,
-               .linoff = DSPBLINOFF,
-               .tileoff = DSPBTILEOFF,
-               .palette = PALETTE_B,
-       },
-       {
-               .fp0 = MRST_FPA0,       /* This is what the old code did ?? */
-               .cntr = DSPCCNTR,
-               .conf = PIPECCONF,
-               .src = PIPECSRC,
-               /* No DPLL_C */
-               .dpll = MRST_DPLL_A,
-               .htotal = HTOTAL_C,
-               .hblank = HBLANK_C,
-               .hsync = HSYNC_C,
-               .vtotal = VTOTAL_C,
-               .vblank = VBLANK_C,
-               .vsync = VSYNC_C,
-               .stride = DSPCSTRIDE,
-               .size = DSPBSIZE,
-               .pos = DSPCPOS,
-               .surf = DSPCSURF,
-               .addr = MDFLD_DSPCBASE,
-               .status = PIPECSTAT,
-               .linoff = DSPCLINOFF,
-               .tileoff = DSPCTILEOFF,
-               .palette = PALETTE_C,
-       },
-};
-
-/*
- * The GPIO lines for resetting DSI pipe 0 and 2 are available in the
- * PCI device 0000:00:0c.0 on the Medfield.
- */
-static struct gpiod_lookup_table mdfld_dsi_pipe_gpio_table = {
-       .table  = {
-               GPIO_LOOKUP("0000:00:0c.0", 128, "dsi-pipe0-reset",
-                           GPIO_ACTIVE_HIGH),
-               GPIO_LOOKUP("0000:00:0c.0", 34, "dsi-pipe2-reset",
-                           GPIO_ACTIVE_HIGH),
-               { },
-       },
-};
-
-static int mdfld_chip_setup(struct drm_device *dev)
-{
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-
-       if (pci_enable_msi(pdev))
-               dev_warn(dev->dev, "Enabling MSI failed!\n");
-       dev_priv->regmap = mdfld_regmap;
-
-       /* Associate the GPIO lines with the DRM device */
-       mdfld_dsi_pipe_gpio_table.dev_id = dev_name(dev->dev);
-       gpiod_add_lookup_table(&mdfld_dsi_pipe_gpio_table);
-
-       return mid_chip_setup(dev);
-}
-
-const struct psb_ops mdfld_chip_ops = {
-       .name = "mdfld",
-       .pipes = 3,
-       .crtcs = 3,
-       .lvds_mask = (1 << 1),
-       .hdmi_mask = (1 << 1),
-       .cursor_needs_phys = 0,
-       .sgx_offset = MRST_SGX_OFFSET,
-
-       .chip_setup = mdfld_chip_setup,
-       .crtc_helper = &mdfld_helper_funcs,
-       .crtc_funcs = &psb_intel_crtc_funcs,
-
-       .output_init = mdfld_output_init,
-
-#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
-       .backlight_init = mdfld_backlight_init,
-#endif
-
-       .save_regs = mdfld_save_registers,
-       .restore_regs = mdfld_restore_registers,
-       .save_crtc = gma_crtc_save,
-       .restore_crtc = gma_crtc_restore,
-       .power_down = mdfld_power_down,
-       .power_up = mdfld_power_up,
-};
diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_dpi.c b/drivers/gpu/drm/gma500/mdfld_dsi_dpi.c
deleted file mode 100644 (file)
index 4c5a2f7..0000000
+++ /dev/null
@@ -1,1017 +0,0 @@
-/*
- * Copyright Â© 2010 Intel Corporation
- *
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- * Authors:
- * jim liu <jim.liu@intel.com>
- * Jackie Li<yaodong.li@intel.com>
- */
-
-#include <linux/delay.h>
-
-#include <drm/drm_simple_kms_helper.h>
-
-#include "mdfld_dsi_dpi.h"
-#include "mdfld_dsi_pkg_sender.h"
-#include "mdfld_output.h"
-#include "psb_drv.h"
-#include "tc35876x-dsi-lvds.h"
-
-static void mdfld_dsi_dpi_shut_down(struct mdfld_dsi_dpi_output *output,
-                                                               int pipe);
-
-static void mdfld_wait_for_HS_DATA_FIFO(struct drm_device *dev, u32 pipe)
-{
-       u32 gen_fifo_stat_reg = MIPI_GEN_FIFO_STAT_REG(pipe);
-       int timeout = 0;
-
-       udelay(500);
-
-       /* This will time out after approximately 2+ seconds */
-       while ((timeout < 20000) &&
-               (REG_READ(gen_fifo_stat_reg) & DSI_FIFO_GEN_HS_DATA_FULL)) {
-               udelay(100);
-               timeout++;
-       }
-
-       if (timeout == 20000)
-               DRM_INFO("MIPI: HS Data FIFO was never cleared!\n");
-}
-
-static void mdfld_wait_for_HS_CTRL_FIFO(struct drm_device *dev, u32 pipe)
-{
-       u32 gen_fifo_stat_reg = MIPI_GEN_FIFO_STAT_REG(pipe);
-       int timeout = 0;
-
-       udelay(500);
-
-       /* This will time out after approximately 2+ seconds */
-       while ((timeout < 20000) && (REG_READ(gen_fifo_stat_reg)
-                                       & DSI_FIFO_GEN_HS_CTRL_FULL)) {
-               udelay(100);
-               timeout++;
-       }
-       if (timeout == 20000)
-               DRM_INFO("MIPI: HS CMD FIFO was never cleared!\n");
-}
-
-static void mdfld_wait_for_DPI_CTRL_FIFO(struct drm_device *dev, u32 pipe)
-{
-       u32 gen_fifo_stat_reg = MIPI_GEN_FIFO_STAT_REG(pipe);
-       int timeout = 0;
-
-       udelay(500);
-
-       /* This will time out after approximately 2+ seconds */
-       while ((timeout < 20000) && ((REG_READ(gen_fifo_stat_reg) &
-                                       DPI_FIFO_EMPTY) != DPI_FIFO_EMPTY)) {
-               udelay(100);
-               timeout++;
-       }
-
-       if (timeout == 20000)
-               DRM_ERROR("MIPI: DPI FIFO was never cleared\n");
-}
-
-static void mdfld_wait_for_SPL_PKG_SENT(struct drm_device *dev, u32 pipe)
-{
-       u32 intr_stat_reg = MIPI_INTR_STAT_REG(pipe);
-       int timeout = 0;
-
-       udelay(500);
-
-       /* This will time out after approximately 2+ seconds */
-       while ((timeout < 20000) && (!(REG_READ(intr_stat_reg)
-                                       & DSI_INTR_STATE_SPL_PKG_SENT))) {
-               udelay(100);
-               timeout++;
-       }
-
-       if (timeout == 20000)
-                DRM_ERROR("MIPI: SPL_PKT_SENT_INTERRUPT was not sent successfully!\n");
-}
-
-/* For TC35876X */
-
-static void dsi_set_device_ready_state(struct drm_device *dev, int state,
-                               int pipe)
-{
-       REG_FLD_MOD(MIPI_DEVICE_READY_REG(pipe), !!state, 0, 0);
-}
-
-static void dsi_set_pipe_plane_enable_state(struct drm_device *dev,
-                                                       int state, int pipe)
-{
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       u32 pipeconf_reg = PIPEACONF;
-       u32 dspcntr_reg = DSPACNTR;
-
-       u32 dspcntr = dev_priv->dspcntr[pipe];
-       u32 mipi = MIPI_PORT_EN | PASS_FROM_SPHY_TO_AFE | SEL_FLOPPED_HSTX;
-
-       if (pipe) {
-               pipeconf_reg = PIPECCONF;
-               dspcntr_reg = DSPCCNTR;
-       } else
-               mipi &= (~0x03);
-
-       if (state) {
-               /*Set up pipe */
-               REG_WRITE(pipeconf_reg, BIT(31));
-
-               if (REG_BIT_WAIT(pipeconf_reg, 1, 30))
-                       dev_err(dev->dev, "%s: Pipe enable timeout\n",
-                               __func__);
-
-               /*Set up display plane */
-               REG_WRITE(dspcntr_reg, dspcntr);
-       } else {
-               u32 dspbase_reg = pipe ? MDFLD_DSPCBASE : MRST_DSPABASE;
-
-               /* Put DSI lanes to ULPS to disable pipe */
-               REG_FLD_MOD(MIPI_DEVICE_READY_REG(pipe), 2, 2, 1);
-               REG_READ(MIPI_DEVICE_READY_REG(pipe)); /* posted write? */
-
-               /* LP Hold */
-               REG_FLD_MOD(MIPI_PORT_CONTROL(pipe), 0, 16, 16);
-               REG_READ(MIPI_PORT_CONTROL(pipe)); /* posted write? */
-
-               /* Disable display plane */
-               REG_FLD_MOD(dspcntr_reg, 0, 31, 31);
-
-               /* Flush the plane changes ??? posted write? */
-               REG_WRITE(dspbase_reg, REG_READ(dspbase_reg));
-               REG_READ(dspbase_reg);
-
-               /* Disable PIPE */
-               REG_FLD_MOD(pipeconf_reg, 0, 31, 31);
-
-               if (REG_BIT_WAIT(pipeconf_reg, 0, 30))
-                       dev_err(dev->dev, "%s: Pipe disable timeout\n",
-                               __func__);
-
-               if (REG_BIT_WAIT(MIPI_GEN_FIFO_STAT_REG(pipe), 1, 28))
-                       dev_err(dev->dev, "%s: FIFO not empty\n",
-                               __func__);
-       }
-}
-
-static void mdfld_dsi_configure_down(struct mdfld_dsi_encoder *dsi_encoder,
-                                                               int pipe)
-{
-       struct mdfld_dsi_dpi_output *dpi_output =
-                               MDFLD_DSI_DPI_OUTPUT(dsi_encoder);
-       struct mdfld_dsi_config *dsi_config =
-                               mdfld_dsi_encoder_get_config(dsi_encoder);
-       struct drm_device *dev = dsi_config->dev;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-
-       if (!dev_priv->dpi_panel_on[pipe]) {
-               dev_err(dev->dev, "DPI panel is already off\n");
-               return;
-       }
-       tc35876x_toshiba_bridge_panel_off(dev);
-       tc35876x_set_bridge_reset_state(dev, 1);
-       dsi_set_pipe_plane_enable_state(dev, 0, pipe);
-       mdfld_dsi_dpi_shut_down(dpi_output, pipe);
-       dsi_set_device_ready_state(dev, 0, pipe);
-}
-
-static void mdfld_dsi_configure_up(struct mdfld_dsi_encoder *dsi_encoder,
-                                                               int pipe)
-{
-       struct mdfld_dsi_dpi_output *dpi_output =
-                               MDFLD_DSI_DPI_OUTPUT(dsi_encoder);
-       struct mdfld_dsi_config *dsi_config =
-                               mdfld_dsi_encoder_get_config(dsi_encoder);
-       struct drm_device *dev = dsi_config->dev;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-
-       if (dev_priv->dpi_panel_on[pipe]) {
-               dev_err(dev->dev, "DPI panel is already on\n");
-               return;
-       }
-
-       /* For resume path sequence */
-       mdfld_dsi_dpi_shut_down(dpi_output, pipe);
-       dsi_set_device_ready_state(dev, 0, pipe);
-
-       dsi_set_device_ready_state(dev, 1, pipe);
-       tc35876x_set_bridge_reset_state(dev, 0);
-       tc35876x_configure_lvds_bridge(dev);
-       mdfld_dsi_dpi_turn_on(dpi_output, pipe);  /* Send turn on command */
-       dsi_set_pipe_plane_enable_state(dev, 1, pipe);
-}
-/* End for TC35876X */
-
-/* ************************************************************************* *\
- * FUNCTION: mdfld_dsi_tpo_ic_init
- *
- * DESCRIPTION:  This function is called only by mrst_dsi_mode_set and
- *               restore_display_registers.  since this function does not
- *               acquire the mutex, it is important that the calling function
- *               does!
-\* ************************************************************************* */
-static void mdfld_dsi_tpo_ic_init(struct mdfld_dsi_config *dsi_config, u32 pipe)
-{
-       struct drm_device *dev = dsi_config->dev;
-       u32 dcsChannelNumber = dsi_config->channel_num;
-       u32 gen_data_reg = MIPI_HS_GEN_DATA_REG(pipe);
-       u32 gen_ctrl_reg = MIPI_HS_GEN_CTRL_REG(pipe);
-       u32 gen_ctrl_val = GEN_LONG_WRITE;
-
-       DRM_INFO("Enter mrst init TPO MIPI display.\n");
-
-       gen_ctrl_val |= dcsChannelNumber << DCS_CHANNEL_NUMBER_POS;
-
-       /* Flip page order */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x00008036);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x02 << WORD_COUNTS_POS));
-
-       /* 0xF0 */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x005a5af0);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS));
-
-       /* Write protection key */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x005a5af1);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS));
-
-       /* 0xFC */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x005a5afc);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS));
-
-       /* 0xB7 */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x770000b7);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x00000044);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x05 << WORD_COUNTS_POS));
-
-       /* 0xB6 */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x000a0ab6);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS));
-
-       /* 0xF2 */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x081010f2);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x4a070708);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x000000c5);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x09 << WORD_COUNTS_POS));
-
-       /* 0xF8 */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x024003f8);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x01030a04);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x0e020220);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x00000004);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x0d << WORD_COUNTS_POS));
-
-       /* 0xE2 */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x398fc3e2);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x0000916f);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x06 << WORD_COUNTS_POS));
-
-       /* 0xB0 */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x000000b0);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x02 << WORD_COUNTS_POS));
-
-       /* 0xF4 */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x240242f4);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x78ee2002);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x2a071050);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x507fee10);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x10300710);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x14 << WORD_COUNTS_POS));
-
-       /* 0xBA */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x19fe07ba);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x101c0a31);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x00000010);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x09 << WORD_COUNTS_POS));
-
-       /* 0xBB */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x28ff07bb);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x24280a31);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x00000034);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x09 << WORD_COUNTS_POS));
-
-       /* 0xFB */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x535d05fb);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x1b1a2130);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x221e180e);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x131d2120);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x535d0508);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x1c1a2131);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x231f160d);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x111b2220);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x535c2008);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x1f1d2433);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x2c251a10);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x2c34372d);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x00000023);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x31 << WORD_COUNTS_POS));
-
-       /* 0xFA */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x525c0bfa);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x1c1c232f);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x2623190e);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x18212625);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x545d0d0e);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x1e1d2333);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x26231a10);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x1a222725);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x545d280f);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x21202635);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x31292013);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x31393d33);
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x00000029);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x31 << WORD_COUNTS_POS));
-
-       /* Set DM */
-       mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
-       REG_WRITE(gen_data_reg, 0x000100f7);
-       mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
-       REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS));
-}
-
-static u16 mdfld_dsi_dpi_to_byte_clock_count(int pixel_clock_count,
-                                               int num_lane, int bpp)
-{
-       return (u16)((pixel_clock_count * bpp) / (num_lane * 8));
-}
-
-/*
- * Calculate the dpi time basing on a given drm mode @mode
- * return 0 on success.
- * FIXME: I was using proposed mode value for calculation, may need to
- * use crtc mode values later
- */
-int mdfld_dsi_dpi_timing_calculation(struct drm_display_mode *mode,
-                               struct mdfld_dsi_dpi_timing *dpi_timing,
-                               int num_lane, int bpp)
-{
-       int pclk_hsync, pclk_hfp, pclk_hbp, pclk_hactive;
-       int pclk_vsync, pclk_vfp, pclk_vbp;
-
-       pclk_hactive = mode->hdisplay;
-       pclk_hfp = mode->hsync_start - mode->hdisplay;
-       pclk_hsync = mode->hsync_end - mode->hsync_start;
-       pclk_hbp = mode->htotal - mode->hsync_end;
-
-       pclk_vfp = mode->vsync_start - mode->vdisplay;
-       pclk_vsync = mode->vsync_end - mode->vsync_start;
-       pclk_vbp = mode->vtotal - mode->vsync_end;
-
-       /*
-        * byte clock counts were calculated by following formula
-        * bclock_count = pclk_count * bpp / num_lane / 8
-        */
-       dpi_timing->hsync_count = mdfld_dsi_dpi_to_byte_clock_count(
-                                               pclk_hsync, num_lane, bpp);
-       dpi_timing->hbp_count = mdfld_dsi_dpi_to_byte_clock_count(
-                                               pclk_hbp, num_lane, bpp);
-       dpi_timing->hfp_count = mdfld_dsi_dpi_to_byte_clock_count(
-                                               pclk_hfp, num_lane, bpp);
-       dpi_timing->hactive_count = mdfld_dsi_dpi_to_byte_clock_count(
-                                               pclk_hactive, num_lane, bpp);
-       dpi_timing->vsync_count = mdfld_dsi_dpi_to_byte_clock_count(
-                                               pclk_vsync, num_lane, bpp);
-       dpi_timing->vbp_count = mdfld_dsi_dpi_to_byte_clock_count(
-                                               pclk_vbp, num_lane, bpp);
-       dpi_timing->vfp_count = mdfld_dsi_dpi_to_byte_clock_count(
-                                               pclk_vfp, num_lane, bpp);
-
-       return 0;
-}
-
-void mdfld_dsi_dpi_controller_init(struct mdfld_dsi_config *dsi_config,
-                                                               int pipe)
-{
-       struct drm_device *dev = dsi_config->dev;
-       int lane_count = dsi_config->lane_count;
-       struct mdfld_dsi_dpi_timing dpi_timing;
-       struct drm_display_mode *mode = dsi_config->mode;
-       u32 val;
-
-       /*un-ready device*/
-       REG_FLD_MOD(MIPI_DEVICE_READY_REG(pipe), 0, 0, 0);
-
-       /*init dsi adapter before kicking off*/
-       REG_WRITE(MIPI_CTRL_REG(pipe), 0x00000018);
-
-       /*enable all interrupts*/
-       REG_WRITE(MIPI_INTR_EN_REG(pipe), 0xffffffff);
-
-       /*set up func_prg*/
-       val = lane_count;
-       val |= dsi_config->channel_num << DSI_DPI_VIRT_CHANNEL_OFFSET;
-
-       switch (dsi_config->bpp) {
-       case 16:
-               val |= DSI_DPI_COLOR_FORMAT_RGB565;
-               break;
-       case 18:
-               val |= DSI_DPI_COLOR_FORMAT_RGB666;
-               break;
-       case 24:
-               val |= DSI_DPI_COLOR_FORMAT_RGB888;
-               break;
-       default:
-               DRM_ERROR("unsupported color format, bpp = %d\n",
-                                                       dsi_config->bpp);
-       }
-       REG_WRITE(MIPI_DSI_FUNC_PRG_REG(pipe), val);
-
-       REG_WRITE(MIPI_HS_TX_TIMEOUT_REG(pipe),
-                       (mode->vtotal * mode->htotal * dsi_config->bpp /
-                               (8 * lane_count)) & DSI_HS_TX_TIMEOUT_MASK);
-       REG_WRITE(MIPI_LP_RX_TIMEOUT_REG(pipe),
-                               0xffff & DSI_LP_RX_TIMEOUT_MASK);
-
-       /*max value: 20 clock cycles of txclkesc*/
-       REG_WRITE(MIPI_TURN_AROUND_TIMEOUT_REG(pipe),
-                               0x14 & DSI_TURN_AROUND_TIMEOUT_MASK);
-
-       /*min 21 txclkesc, max: ffffh*/
-       REG_WRITE(MIPI_DEVICE_RESET_TIMER_REG(pipe),
-                               0xffff & DSI_RESET_TIMER_MASK);
-
-       REG_WRITE(MIPI_DPI_RESOLUTION_REG(pipe),
-                               mode->vdisplay << 16 | mode->hdisplay);
-
-       /*set DPI timing registers*/
-       mdfld_dsi_dpi_timing_calculation(mode, &dpi_timing,
-                               dsi_config->lane_count, dsi_config->bpp);
-
-       REG_WRITE(MIPI_HSYNC_COUNT_REG(pipe),
-                       dpi_timing.hsync_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_HBP_COUNT_REG(pipe),
-                       dpi_timing.hbp_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_HFP_COUNT_REG(pipe),
-                       dpi_timing.hfp_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_HACTIVE_COUNT_REG(pipe),
-                       dpi_timing.hactive_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_VSYNC_COUNT_REG(pipe),
-                       dpi_timing.vsync_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_VBP_COUNT_REG(pipe),
-                       dpi_timing.vbp_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_VFP_COUNT_REG(pipe),
-                       dpi_timing.vfp_count & DSI_DPI_TIMING_MASK);
-
-       REG_WRITE(MIPI_HIGH_LOW_SWITCH_COUNT_REG(pipe), 0x46);
-
-       /*min: 7d0 max: 4e20*/
-       REG_WRITE(MIPI_INIT_COUNT_REG(pipe), 0x000007d0);
-
-       /*set up video mode*/
-       val = dsi_config->video_mode | DSI_DPI_COMPLETE_LAST_LINE;
-       REG_WRITE(MIPI_VIDEO_MODE_FORMAT_REG(pipe), val);
-
-       REG_WRITE(MIPI_EOT_DISABLE_REG(pipe), 0x00000000);
-
-       REG_WRITE(MIPI_LP_BYTECLK_REG(pipe), 0x00000004);
-
-       /*TODO: figure out how to setup these registers*/
-       if (mdfld_get_panel_type(dev, pipe) == TC35876X)
-               REG_WRITE(MIPI_DPHY_PARAM_REG(pipe), 0x2A0c6008);
-       else
-               REG_WRITE(MIPI_DPHY_PARAM_REG(pipe), 0x150c3408);
-
-       REG_WRITE(MIPI_CLK_LANE_SWITCH_TIME_CNT_REG(pipe), (0xa << 16) | 0x14);
-
-       if (mdfld_get_panel_type(dev, pipe) == TC35876X)
-               tc35876x_set_bridge_reset_state(dev, 0);  /*Pull High Reset */
-
-       /*set device ready*/
-       REG_FLD_MOD(MIPI_DEVICE_READY_REG(pipe), 1, 0, 0);
-}
-
-void mdfld_dsi_dpi_turn_on(struct mdfld_dsi_dpi_output *output, int pipe)
-{
-       struct drm_device *dev = output->dev;
-
-       /* clear special packet sent bit */
-       if (REG_READ(MIPI_INTR_STAT_REG(pipe)) & DSI_INTR_STATE_SPL_PKG_SENT)
-               REG_WRITE(MIPI_INTR_STAT_REG(pipe),
-                                       DSI_INTR_STATE_SPL_PKG_SENT);
-
-       /*send turn on package*/
-       REG_WRITE(MIPI_DPI_CONTROL_REG(pipe), DSI_DPI_CTRL_HS_TURN_ON);
-
-       /*wait for SPL_PKG_SENT interrupt*/
-       mdfld_wait_for_SPL_PKG_SENT(dev, pipe);
-
-       if (REG_READ(MIPI_INTR_STAT_REG(pipe)) & DSI_INTR_STATE_SPL_PKG_SENT)
-               REG_WRITE(MIPI_INTR_STAT_REG(pipe),
-                                       DSI_INTR_STATE_SPL_PKG_SENT);
-
-       output->panel_on = 1;
-
-       /* FIXME the following is disabled to WA the X slow start issue
-          for TMD panel
-       if (pipe == 2)
-               dev_priv->dpi_panel_on2 = true;
-       else if (pipe == 0)
-               dev_priv->dpi_panel_on = true; */
-}
-
-static void mdfld_dsi_dpi_shut_down(struct mdfld_dsi_dpi_output *output,
-                                                               int pipe)
-{
-       struct drm_device *dev = output->dev;
-
-       /*if output is on, or mode setting didn't happen, ignore this*/
-       if ((!output->panel_on) || output->first_boot) {
-               output->first_boot = 0;
-               return;
-       }
-
-       /* Wait for dpi fifo to empty */
-       mdfld_wait_for_DPI_CTRL_FIFO(dev, pipe);
-
-       /* Clear the special packet interrupt bit if set */
-       if (REG_READ(MIPI_INTR_STAT_REG(pipe)) & DSI_INTR_STATE_SPL_PKG_SENT)
-               REG_WRITE(MIPI_INTR_STAT_REG(pipe),
-                                       DSI_INTR_STATE_SPL_PKG_SENT);
-
-       if (REG_READ(MIPI_DPI_CONTROL_REG(pipe)) == DSI_DPI_CTRL_HS_SHUTDOWN)
-               goto shutdown_out;
-
-       REG_WRITE(MIPI_DPI_CONTROL_REG(pipe), DSI_DPI_CTRL_HS_SHUTDOWN);
-
-shutdown_out:
-       output->panel_on = 0;
-       output->first_boot = 0;
-
-       /* FIXME the following is disabled to WA the X slow start issue
-          for TMD panel
-       if (pipe == 2)
-               dev_priv->dpi_panel_on2 = false;
-       else if (pipe == 0)
-               dev_priv->dpi_panel_on = false;  */
-}
-
-static void mdfld_dsi_dpi_set_power(struct drm_encoder *encoder, bool on)
-{
-       struct mdfld_dsi_encoder *dsi_encoder = mdfld_dsi_encoder(encoder);
-       struct mdfld_dsi_dpi_output *dpi_output =
-                               MDFLD_DSI_DPI_OUTPUT(dsi_encoder);
-       struct mdfld_dsi_config *dsi_config =
-                               mdfld_dsi_encoder_get_config(dsi_encoder);
-       int pipe = mdfld_dsi_encoder_get_pipe(dsi_encoder);
-       struct drm_device *dev = dsi_config->dev;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-
-       /*start up display island if it was shutdown*/
-       if (!gma_power_begin(dev, true))
-               return;
-
-       if (on) {
-               if (mdfld_get_panel_type(dev, pipe) == TMD_VID)
-                       mdfld_dsi_dpi_turn_on(dpi_output, pipe);
-               else if (mdfld_get_panel_type(dev, pipe) == TC35876X)
-                       mdfld_dsi_configure_up(dsi_encoder, pipe);
-               else {
-                       /*enable mipi port*/
-                       REG_WRITE(MIPI_PORT_CONTROL(pipe),
-                               REG_READ(MIPI_PORT_CONTROL(pipe)) | BIT(31));
-                       REG_READ(MIPI_PORT_CONTROL(pipe));
-
-                       mdfld_dsi_dpi_turn_on(dpi_output, pipe);
-                       mdfld_dsi_tpo_ic_init(dsi_config, pipe);
-               }
-               dev_priv->dpi_panel_on[pipe] = true;
-       } else {
-               if (mdfld_get_panel_type(dev, pipe) == TMD_VID)
-                       mdfld_dsi_dpi_shut_down(dpi_output, pipe);
-               else if (mdfld_get_panel_type(dev, pipe) == TC35876X)
-                       mdfld_dsi_configure_down(dsi_encoder, pipe);
-               else {
-                       mdfld_dsi_dpi_shut_down(dpi_output, pipe);
-
-                       /*disable mipi port*/
-                       REG_WRITE(MIPI_PORT_CONTROL(pipe),
-                               REG_READ(MIPI_PORT_CONTROL(pipe)) & ~BIT(31));
-                       REG_READ(MIPI_PORT_CONTROL(pipe));
-               }
-               dev_priv->dpi_panel_on[pipe] = false;
-       }
-       gma_power_end(dev);
-}
-
-void mdfld_dsi_dpi_dpms(struct drm_encoder *encoder, int mode)
-{
-       mdfld_dsi_dpi_set_power(encoder, mode == DRM_MODE_DPMS_ON);
-}
-
-bool mdfld_dsi_dpi_mode_fixup(struct drm_encoder *encoder,
-                                    const struct drm_display_mode *mode,
-                                    struct drm_display_mode *adjusted_mode)
-{
-       struct mdfld_dsi_encoder *dsi_encoder = mdfld_dsi_encoder(encoder);
-       struct mdfld_dsi_config *dsi_config =
-                               mdfld_dsi_encoder_get_config(dsi_encoder);
-       struct drm_display_mode *fixed_mode = dsi_config->fixed_mode;
-
-       if (fixed_mode) {
-               adjusted_mode->hdisplay = fixed_mode->hdisplay;
-               adjusted_mode->hsync_start = fixed_mode->hsync_start;
-               adjusted_mode->hsync_end = fixed_mode->hsync_end;
-               adjusted_mode->htotal = fixed_mode->htotal;
-               adjusted_mode->vdisplay = fixed_mode->vdisplay;
-               adjusted_mode->vsync_start = fixed_mode->vsync_start;
-               adjusted_mode->vsync_end = fixed_mode->vsync_end;
-               adjusted_mode->vtotal = fixed_mode->vtotal;
-               adjusted_mode->clock = fixed_mode->clock;
-               drm_mode_set_crtcinfo(adjusted_mode, CRTC_INTERLACE_HALVE_V);
-       }
-       return true;
-}
-
-void mdfld_dsi_dpi_prepare(struct drm_encoder *encoder)
-{
-       mdfld_dsi_dpi_set_power(encoder, false);
-}
-
-void mdfld_dsi_dpi_commit(struct drm_encoder *encoder)
-{
-       mdfld_dsi_dpi_set_power(encoder, true);
-}
-
-/* For TC35876X */
-/* This functionality was implemented in FW in iCDK */
-/* But removed in DV0 and later. So need to add here. */
-static void mipi_set_properties(struct mdfld_dsi_config *dsi_config, int pipe)
-{
-       struct drm_device *dev = dsi_config->dev;
-
-       REG_WRITE(MIPI_CTRL_REG(pipe), 0x00000018);
-       REG_WRITE(MIPI_INTR_EN_REG(pipe), 0xffffffff);
-       REG_WRITE(MIPI_HS_TX_TIMEOUT_REG(pipe), 0xffffff);
-       REG_WRITE(MIPI_LP_RX_TIMEOUT_REG(pipe), 0xffffff);
-       REG_WRITE(MIPI_TURN_AROUND_TIMEOUT_REG(pipe), 0x14);
-       REG_WRITE(MIPI_DEVICE_RESET_TIMER_REG(pipe), 0xff);
-       REG_WRITE(MIPI_HIGH_LOW_SWITCH_COUNT_REG(pipe), 0x25);
-       REG_WRITE(MIPI_INIT_COUNT_REG(pipe), 0xf0);
-       REG_WRITE(MIPI_EOT_DISABLE_REG(pipe), 0x00000000);
-       REG_WRITE(MIPI_LP_BYTECLK_REG(pipe), 0x00000004);
-       REG_WRITE(MIPI_DBI_BW_CTRL_REG(pipe), 0x00000820);
-       REG_WRITE(MIPI_CLK_LANE_SWITCH_TIME_CNT_REG(pipe), (0xa << 16) | 0x14);
-}
-
-static void mdfld_mipi_set_video_timing(struct mdfld_dsi_config *dsi_config,
-                                       int pipe)
-{
-       struct drm_device *dev = dsi_config->dev;
-       struct mdfld_dsi_dpi_timing dpi_timing;
-       struct drm_display_mode *mode = dsi_config->mode;
-
-       mdfld_dsi_dpi_timing_calculation(mode, &dpi_timing,
-                                       dsi_config->lane_count,
-                                       dsi_config->bpp);
-
-       REG_WRITE(MIPI_DPI_RESOLUTION_REG(pipe),
-               mode->vdisplay << 16 | mode->hdisplay);
-       REG_WRITE(MIPI_HSYNC_COUNT_REG(pipe),
-               dpi_timing.hsync_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_HBP_COUNT_REG(pipe),
-               dpi_timing.hbp_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_HFP_COUNT_REG(pipe),
-               dpi_timing.hfp_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_HACTIVE_COUNT_REG(pipe),
-               dpi_timing.hactive_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_VSYNC_COUNT_REG(pipe),
-               dpi_timing.vsync_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_VBP_COUNT_REG(pipe),
-               dpi_timing.vbp_count & DSI_DPI_TIMING_MASK);
-       REG_WRITE(MIPI_VFP_COUNT_REG(pipe),
-               dpi_timing.vfp_count & DSI_DPI_TIMING_MASK);
-}
-
-static void mdfld_mipi_config(struct mdfld_dsi_config *dsi_config, int pipe)
-{
-       struct drm_device *dev = dsi_config->dev;
-       int lane_count = dsi_config->lane_count;
-
-       if (pipe) {
-               REG_WRITE(MIPI_PORT_CONTROL(0), 0x00000002);
-               REG_WRITE(MIPI_PORT_CONTROL(2), 0x80000000);
-       } else {
-               REG_WRITE(MIPI_PORT_CONTROL(0), 0x80010000);
-               REG_WRITE(MIPI_PORT_CONTROL(2), 0x00);
-       }
-
-       REG_WRITE(MIPI_DPHY_PARAM_REG(pipe), 0x150A600F);
-       REG_WRITE(MIPI_VIDEO_MODE_FORMAT_REG(pipe), 0x0000000F);
-
-       /* lane_count = 3 */
-       REG_WRITE(MIPI_DSI_FUNC_PRG_REG(pipe), 0x00000200 | lane_count);
-
-       mdfld_mipi_set_video_timing(dsi_config, pipe);
-}
-
-static void mdfld_set_pipe_timing(struct mdfld_dsi_config *dsi_config, int pipe)
-{
-       struct drm_device *dev = dsi_config->dev;
-       struct drm_display_mode *mode = dsi_config->mode;
-
-       REG_WRITE(HTOTAL_A, ((mode->htotal - 1) << 16) | (mode->hdisplay - 1));
-       REG_WRITE(HBLANK_A, ((mode->htotal - 1) << 16) | (mode->hdisplay - 1));
-       REG_WRITE(HSYNC_A,
-               ((mode->hsync_end - 1) << 16) | (mode->hsync_start - 1));
-
-       REG_WRITE(VTOTAL_A, ((mode->vtotal - 1) << 16) | (mode->vdisplay - 1));
-       REG_WRITE(VBLANK_A, ((mode->vtotal - 1) << 16) | (mode->vdisplay - 1));
-       REG_WRITE(VSYNC_A,
-               ((mode->vsync_end - 1) << 16) | (mode->vsync_start - 1));
-
-       REG_WRITE(PIPEASRC,
-               ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1));
-}
-/* End for TC35876X */
-
-void mdfld_dsi_dpi_mode_set(struct drm_encoder *encoder,
-                                  struct drm_display_mode *mode,
-                                  struct drm_display_mode *adjusted_mode)
-{
-       struct mdfld_dsi_encoder *dsi_encoder = mdfld_dsi_encoder(encoder);
-       struct mdfld_dsi_dpi_output *dpi_output =
-                                       MDFLD_DSI_DPI_OUTPUT(dsi_encoder);
-       struct mdfld_dsi_config *dsi_config =
-                               mdfld_dsi_encoder_get_config(dsi_encoder);
-       struct drm_device *dev = dsi_config->dev;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       int pipe = mdfld_dsi_encoder_get_pipe(dsi_encoder);
-       u32 pipeconf_reg = PIPEACONF;
-       u32 dspcntr_reg = DSPACNTR;
-       u32 pipeconf, dspcntr;
-
-       u32 mipi = MIPI_PORT_EN | PASS_FROM_SPHY_TO_AFE | SEL_FLOPPED_HSTX;
-
-       if (WARN_ON(pipe < 0))
-               return;
-
-       pipeconf = dev_priv->pipeconf[pipe];
-       dspcntr = dev_priv->dspcntr[pipe];
-
-       if (pipe) {
-               pipeconf_reg = PIPECCONF;
-               dspcntr_reg = DSPCCNTR;
-       } else {
-               if (mdfld_get_panel_type(dev, pipe) == TC35876X)
-                       mipi &= (~0x03); /* Use all four lanes */
-               else
-                       mipi |= 2;
-       }
-
-       /*start up display island if it was shutdown*/
-       if (!gma_power_begin(dev, true))
-               return;
-
-       if (mdfld_get_panel_type(dev, pipe) == TC35876X) {
-               /*
-                * The following logic is required to reset the bridge and
-                * configure. This also starts the DSI clock at 200MHz.
-                */
-               tc35876x_set_bridge_reset_state(dev, 0);  /*Pull High Reset */
-               tc35876x_toshiba_bridge_panel_on(dev);
-               udelay(100);
-               /* Now start the DSI clock */
-               REG_WRITE(MRST_DPLL_A, 0x00);
-               REG_WRITE(MRST_FPA0, 0xC1);
-               REG_WRITE(MRST_DPLL_A, 0x00800000);
-               udelay(500);
-               REG_WRITE(MRST_DPLL_A, 0x80800000);
-
-               if (REG_BIT_WAIT(pipeconf_reg, 1, 29))
-                       dev_err(dev->dev, "%s: DSI PLL lock timeout\n",
-                               __func__);
-
-               REG_WRITE(MIPI_DPHY_PARAM_REG(pipe), 0x2A0c6008);
-
-               mipi_set_properties(dsi_config, pipe);
-               mdfld_mipi_config(dsi_config, pipe);
-               mdfld_set_pipe_timing(dsi_config, pipe);
-
-               REG_WRITE(DSPABASE, 0x00);
-               REG_WRITE(DSPASIZE,
-                       ((mode->vdisplay - 1) << 16) | (mode->hdisplay - 1));
-
-               REG_WRITE(DSPACNTR, 0x98000000);
-               REG_WRITE(DSPASURF, 0x00);
-
-               REG_WRITE(VGACNTRL, 0x80000000);
-               REG_WRITE(DEVICE_READY_REG, 0x00000001);
-
-               REG_WRITE(MIPI_PORT_CONTROL(pipe), 0x80810000);
-       } else {
-               /*set up mipi port FIXME: do at init time */
-               REG_WRITE(MIPI_PORT_CONTROL(pipe), mipi);
-       }
-       REG_READ(MIPI_PORT_CONTROL(pipe));
-
-       if (mdfld_get_panel_type(dev, pipe) == TMD_VID) {
-               /* NOP */
-       } else if (mdfld_get_panel_type(dev, pipe) == TC35876X) {
-               /* set up DSI controller DPI interface */
-               mdfld_dsi_dpi_controller_init(dsi_config, pipe);
-
-               /* Configure MIPI Bridge and Panel */
-               tc35876x_configure_lvds_bridge(dev);
-               dev_priv->dpi_panel_on[pipe] = true;
-       } else {
-               /*turn on DPI interface*/
-               mdfld_dsi_dpi_turn_on(dpi_output, pipe);
-       }
-
-       /*set up pipe*/
-       REG_WRITE(pipeconf_reg, pipeconf);
-       REG_READ(pipeconf_reg);
-
-       /*set up display plane*/
-       REG_WRITE(dspcntr_reg, dspcntr);
-       REG_READ(dspcntr_reg);
-
-       msleep(20); /* FIXME: this should wait for vblank */
-
-       if (mdfld_get_panel_type(dev, pipe) == TMD_VID) {
-               /* NOP */
-       } else if (mdfld_get_panel_type(dev, pipe) == TC35876X) {
-               mdfld_dsi_dpi_turn_on(dpi_output, pipe);
-       } else {
-               /* init driver ic */
-               mdfld_dsi_tpo_ic_init(dsi_config, pipe);
-               /*init backlight*/
-               mdfld_dsi_brightness_init(dsi_config, pipe);
-       }
-
-       gma_power_end(dev);
-}
-
-/*
- * Init DSI DPI encoder.
- * Allocate an mdfld_dsi_encoder and attach it to given @dsi_connector
- * return pointer of newly allocated DPI encoder, NULL on error
- */
-struct mdfld_dsi_encoder *mdfld_dsi_dpi_init(struct drm_device *dev,
-                               struct mdfld_dsi_connector *dsi_connector,
-                               const struct panel_funcs *p_funcs)
-{
-       struct mdfld_dsi_dpi_output *dpi_output = NULL;
-       struct mdfld_dsi_config *dsi_config;
-       struct drm_connector *connector = NULL;
-       struct drm_encoder *encoder = NULL;
-       int pipe;
-       u32 data;
-       int ret;
-
-       pipe = dsi_connector->pipe;
-
-       if (mdfld_get_panel_type(dev, pipe) != TC35876X) {
-               dsi_config = mdfld_dsi_get_config(dsi_connector);
-
-               /* panel hard-reset */
-               if (p_funcs->reset) {
-                       ret = p_funcs->reset(dev, pipe);
-                       if (ret) {
-                               DRM_ERROR("Panel %d hard-reset failed\n", pipe);
-                               return NULL;
-                       }
-               }
-
-               /* panel drvIC init */
-               if (p_funcs->drv_ic_init)
-                       p_funcs->drv_ic_init(dsi_config, pipe);
-
-               /* panel power mode detect */
-               ret = mdfld_dsi_get_power_mode(dsi_config, &data, false);
-               if (ret) {
-                       DRM_ERROR("Panel %d get power mode failed\n", pipe);
-                       dsi_connector->status = connector_status_disconnected;
-               } else {
-                       DRM_INFO("pipe %d power mode 0x%x\n", pipe, data);
-                       dsi_connector->status = connector_status_connected;
-               }
-       }
-
-       dpi_output = kzalloc(sizeof(struct mdfld_dsi_dpi_output), GFP_KERNEL);
-       if (!dpi_output) {
-               DRM_ERROR("No memory\n");
-               return NULL;
-       }
-
-       dpi_output->panel_on = 0;
-       dpi_output->dev = dev;
-       if (mdfld_get_panel_type(dev, pipe) != TC35876X)
-               dpi_output->p_funcs = p_funcs;
-       dpi_output->first_boot = 1;
-
-       /*get fixed mode*/
-       dsi_config = mdfld_dsi_get_config(dsi_connector);
-
-       /*create drm encoder object*/
-       connector = &dsi_connector->base.base;
-       encoder = &dpi_output->base.base.base;
-       drm_simple_encoder_init(dev, encoder, DRM_MODE_ENCODER_LVDS);
-       drm_encoder_helper_add(encoder,
-                               p_funcs->encoder_helper_funcs);
-
-       /*attach to given connector*/
-       drm_connector_attach_encoder(connector, encoder);
-
-       /*set possible crtcs and clones*/
-       if (dsi_connector->pipe) {
-               encoder->possible_crtcs = (1 << 2);
-               encoder->possible_clones = 0;
-       } else {
-               encoder->possible_crtcs = (1 << 0);
-               encoder->possible_clones = 0;
-       }
-
-       dsi_connector->base.encoder = &dpi_output->base.base;
-
-       return &dpi_output->base;
-}
diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_dpi.h b/drivers/gpu/drm/gma500/mdfld_dsi_dpi.h
deleted file mode 100644 (file)
index 2b40663..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright Â© 2010 Intel Corporation
- *
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- * Authors:
- * jim liu <jim.liu@intel.com>
- * Jackie Li<yaodong.li@intel.com>
- */
-
-#ifndef __MDFLD_DSI_DPI_H__
-#define __MDFLD_DSI_DPI_H__
-
-#include "mdfld_dsi_output.h"
-#include "mdfld_output.h"
-
-struct mdfld_dsi_dpi_timing {
-       u16 hsync_count;
-       u16 hbp_count;
-       u16 hfp_count;
-       u16 hactive_count;
-       u16 vsync_count;
-       u16 vbp_count;
-       u16 vfp_count;
-};
-
-struct mdfld_dsi_dpi_output {
-       struct mdfld_dsi_encoder base;
-       struct drm_device *dev;
-
-       int panel_on;
-       int first_boot;
-
-       const struct panel_funcs *p_funcs;
-};
-
-#define MDFLD_DSI_DPI_OUTPUT(dsi_encoder)\
-       container_of(dsi_encoder, struct mdfld_dsi_dpi_output, base)
-
-/* Export functions */
-extern int mdfld_dsi_dpi_timing_calculation(struct drm_display_mode *mode,
-                               struct mdfld_dsi_dpi_timing *dpi_timing,
-                               int num_lane, int bpp);
-extern struct mdfld_dsi_encoder *mdfld_dsi_dpi_init(struct drm_device *dev,
-                               struct mdfld_dsi_connector *dsi_connector,
-                               const struct panel_funcs *p_funcs);
-
-/* MDFLD DPI helper functions */
-extern void mdfld_dsi_dpi_dpms(struct drm_encoder *encoder, int mode);
-extern bool mdfld_dsi_dpi_mode_fixup(struct drm_encoder *encoder,
-                               const struct drm_display_mode *mode,
-                               struct drm_display_mode *adjusted_mode);
-extern void mdfld_dsi_dpi_prepare(struct drm_encoder *encoder);
-extern void mdfld_dsi_dpi_commit(struct drm_encoder *encoder);
-extern void mdfld_dsi_dpi_mode_set(struct drm_encoder *encoder,
-                               struct drm_display_mode *mode,
-                               struct drm_display_mode *adjusted_mode);
-extern void mdfld_dsi_dpi_turn_on(struct mdfld_dsi_dpi_output *output,
-                               int pipe);
-extern void mdfld_dsi_dpi_controller_init(struct mdfld_dsi_config *dsi_config,
-                               int pipe);
-#endif /*__MDFLD_DSI_DPI_H__*/
diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_output.c b/drivers/gpu/drm/gma500/mdfld_dsi_output.c
deleted file mode 100644 (file)
index 24105f4..0000000
+++ /dev/null
@@ -1,603 +0,0 @@
-/*
- * Copyright Â© 2010 Intel Corporation
- *
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- * Authors:
- * jim liu <jim.liu@intel.com>
- * Jackie Li<yaodong.li@intel.com>
- */
-
-#include <linux/delay.h>
-#include <linux/moduleparam.h>
-#include <linux/pm_runtime.h>
-#include <linux/gpio/consumer.h>
-
-#include <asm/intel_scu_ipc.h>
-
-#include "mdfld_dsi_dpi.h"
-#include "mdfld_dsi_output.h"
-#include "mdfld_dsi_pkg_sender.h"
-#include "mdfld_output.h"
-#include "tc35876x-dsi-lvds.h"
-
-/* get the LABC from command line. */
-static int LABC_control = 1;
-
-#ifdef MODULE
-module_param(LABC_control, int, 0644);
-#else
-
-static int __init parse_LABC_control(char *arg)
-{
-       /* LABC control can be passed in as a cmdline parameter */
-       /* to enable this feature add LABC=1 to cmdline */
-       /* to disable this feature add LABC=0 to cmdline */
-       if (!arg)
-               return -EINVAL;
-
-       if (!strcasecmp(arg, "0"))
-               LABC_control = 0;
-       else if (!strcasecmp(arg, "1"))
-               LABC_control = 1;
-
-       return 0;
-}
-early_param("LABC", parse_LABC_control);
-#endif
-
-/*
- * Check and see if the generic control or data buffer is empty and ready.
- */
-void mdfld_dsi_gen_fifo_ready(struct drm_device *dev, u32 gen_fifo_stat_reg,
-                                                       u32 fifo_stat)
-{
-       u32 GEN_BF_time_out_count;
-
-       /* Check MIPI Adatper command registers */
-       for (GEN_BF_time_out_count = 0;
-                       GEN_BF_time_out_count < GEN_FB_TIME_OUT;
-                       GEN_BF_time_out_count++) {
-               if ((REG_READ(gen_fifo_stat_reg) & fifo_stat) == fifo_stat)
-                       break;
-               udelay(100);
-       }
-
-       if (GEN_BF_time_out_count == GEN_FB_TIME_OUT)
-               DRM_ERROR("mdfld_dsi_gen_fifo_ready, Timeout. gen_fifo_stat_reg = 0x%x.\n",
-                                       gen_fifo_stat_reg);
-}
-
-/*
- * Manage the DSI MIPI keyboard and display brightness.
- * FIXME: this is exported to OSPM code. should work out an specific
- * display interface to OSPM.
- */
-
-void mdfld_dsi_brightness_init(struct mdfld_dsi_config *dsi_config, int pipe)
-{
-       struct mdfld_dsi_pkg_sender *sender =
-                               mdfld_dsi_get_pkg_sender(dsi_config);
-       struct drm_device *dev;
-       struct drm_psb_private *dev_priv;
-       u32 gen_ctrl_val;
-
-       if (!sender) {
-               DRM_ERROR("No sender found\n");
-               return;
-       }
-
-       dev = sender->dev;
-       dev_priv = dev->dev_private;
-
-       /* Set default display backlight value to 85% (0xd8)*/
-       mdfld_dsi_send_mcs_short(sender, write_display_brightness, 0xd8, 1,
-                               true);
-
-       /* Set minimum brightness setting of CABC function to 20% (0x33)*/
-       mdfld_dsi_send_mcs_short(sender, write_cabc_min_bright, 0x33, 1, true);
-
-       /* Enable backlight or/and LABC */
-       gen_ctrl_val = BRIGHT_CNTL_BLOCK_ON | DISPLAY_DIMMING_ON |
-                                                               BACKLIGHT_ON;
-       if (LABC_control == 1)
-               gen_ctrl_val |= DISPLAY_DIMMING_ON | DISPLAY_BRIGHTNESS_AUTO
-                                                               | GAMMA_AUTO;
-
-       if (LABC_control == 1)
-               gen_ctrl_val |= AMBIENT_LIGHT_SENSE_ON;
-
-       dev_priv->mipi_ctrl_display = gen_ctrl_val;
-
-       mdfld_dsi_send_mcs_short(sender, write_ctrl_display, (u8)gen_ctrl_val,
-                               1, true);
-
-       mdfld_dsi_send_mcs_short(sender, write_ctrl_cabc, UI_IMAGE, 1, true);
-}
-
-void mdfld_dsi_brightness_control(struct drm_device *dev, int pipe, int level)
-{
-       struct mdfld_dsi_pkg_sender *sender;
-       struct drm_psb_private *dev_priv;
-       struct mdfld_dsi_config *dsi_config;
-       u32 gen_ctrl_val = 0;
-       int p_type = TMD_VID;
-
-       if (!dev || (pipe != 0 && pipe != 2)) {
-               DRM_ERROR("Invalid parameter\n");
-               return;
-       }
-
-       p_type = mdfld_get_panel_type(dev, 0);
-
-       dev_priv = dev->dev_private;
-
-       if (pipe)
-               dsi_config = dev_priv->dsi_configs[1];
-       else
-               dsi_config = dev_priv->dsi_configs[0];
-
-       sender = mdfld_dsi_get_pkg_sender(dsi_config);
-
-       if (!sender) {
-               DRM_ERROR("No sender found\n");
-               return;
-       }
-
-       gen_ctrl_val = (level * 0xff / MDFLD_DSI_BRIGHTNESS_MAX_LEVEL) & 0xff;
-
-       dev_dbg(sender->dev->dev, "pipe = %d, gen_ctrl_val = %d.\n",
-                                                       pipe, gen_ctrl_val);
-
-       if (p_type == TMD_VID) {
-               /* Set display backlight value */
-               mdfld_dsi_send_mcs_short(sender, tmd_write_display_brightness,
-                                       (u8)gen_ctrl_val, 1, true);
-       } else {
-               /* Set display backlight value */
-               mdfld_dsi_send_mcs_short(sender, write_display_brightness,
-                                       (u8)gen_ctrl_val, 1, true);
-
-               /* Enable backlight control */
-               if (level == 0)
-                       gen_ctrl_val = 0;
-               else
-                       gen_ctrl_val = dev_priv->mipi_ctrl_display;
-
-               mdfld_dsi_send_mcs_short(sender, write_ctrl_display,
-                                       (u8)gen_ctrl_val, 1, true);
-       }
-}
-
-static int mdfld_dsi_get_panel_status(struct mdfld_dsi_config *dsi_config,
-                               u8 dcs, u32 *data, bool hs)
-{
-       struct mdfld_dsi_pkg_sender *sender
-               = mdfld_dsi_get_pkg_sender(dsi_config);
-
-       if (!sender || !data) {
-               DRM_ERROR("Invalid parameter\n");
-               return -EINVAL;
-       }
-
-       return mdfld_dsi_read_mcs(sender, dcs, data, 1, hs);
-}
-
-int mdfld_dsi_get_power_mode(struct mdfld_dsi_config *dsi_config, u32 *mode,
-                       bool hs)
-{
-       if (!dsi_config || !mode) {
-               DRM_ERROR("Invalid parameter\n");
-               return -EINVAL;
-       }
-
-       return mdfld_dsi_get_panel_status(dsi_config, 0x0a, mode, hs);
-}
-
-/*
- * NOTE: this function was used by OSPM.
- * TODO: will be removed later, should work out display interfaces for OSPM
- */
-void mdfld_dsi_controller_init(struct mdfld_dsi_config *dsi_config, int pipe)
-{
-       if (!dsi_config || ((pipe != 0) && (pipe != 2))) {
-               DRM_ERROR("Invalid parameters\n");
-               return;
-       }
-
-       mdfld_dsi_dpi_controller_init(dsi_config, pipe);
-}
-
-static void mdfld_dsi_connector_save(struct drm_connector *connector)
-{
-}
-
-static void mdfld_dsi_connector_restore(struct drm_connector *connector)
-{
-}
-
-/* FIXME: start using the force parameter */
-static enum drm_connector_status
-mdfld_dsi_connector_detect(struct drm_connector *connector, bool force)
-{
-       struct mdfld_dsi_connector *dsi_connector
-               = mdfld_dsi_connector(connector);
-
-       dsi_connector->status = connector_status_connected;
-
-       return dsi_connector->status;
-}
-
-static int mdfld_dsi_connector_set_property(struct drm_connector *connector,
-                               struct drm_property *property,
-                               uint64_t value)
-{
-       struct drm_encoder *encoder = connector->encoder;
-
-       if (!strcmp(property->name, "scaling mode") && encoder) {
-               struct gma_crtc *gma_crtc = to_gma_crtc(encoder->crtc);
-               bool centerechange;
-               uint64_t val;
-
-               if (!gma_crtc)
-                       goto set_prop_error;
-
-               switch (value) {
-               case DRM_MODE_SCALE_FULLSCREEN:
-                       break;
-               case DRM_MODE_SCALE_NO_SCALE:
-                       break;
-               case DRM_MODE_SCALE_ASPECT:
-                       break;
-               default:
-                       goto set_prop_error;
-               }
-
-               if (drm_object_property_get_value(&connector->base, property, &val))
-                       goto set_prop_error;
-
-               if (val == value)
-                       goto set_prop_done;
-
-               if (drm_object_property_set_value(&connector->base,
-                                                       property, value))
-                       goto set_prop_error;
-
-               centerechange = (val == DRM_MODE_SCALE_NO_SCALE) ||
-                       (value == DRM_MODE_SCALE_NO_SCALE);
-
-               if (gma_crtc->saved_mode.hdisplay != 0 &&
-                   gma_crtc->saved_mode.vdisplay != 0) {
-                       if (centerechange) {
-                               if (!drm_crtc_helper_set_mode(encoder->crtc,
-                                               &gma_crtc->saved_mode,
-                                               encoder->crtc->x,
-                                               encoder->crtc->y,
-                                               encoder->crtc->primary->fb))
-                                       goto set_prop_error;
-                       } else {
-                               const struct drm_encoder_helper_funcs *funcs =
-                                               encoder->helper_private;
-                               funcs->mode_set(encoder,
-                                       &gma_crtc->saved_mode,
-                                       &gma_crtc->saved_adjusted_mode);
-                       }
-               }
-       } else if (!strcmp(property->name, "backlight") && encoder) {
-               if (drm_object_property_set_value(&connector->base, property,
-                                                                       value))
-                       goto set_prop_error;
-               else
-                       gma_backlight_set(encoder->dev, value);
-       }
-set_prop_done:
-       return 0;
-set_prop_error:
-       return -1;
-}
-
-static void mdfld_dsi_connector_destroy(struct drm_connector *connector)
-{
-       struct mdfld_dsi_connector *dsi_connector =
-                                       mdfld_dsi_connector(connector);
-       struct mdfld_dsi_pkg_sender *sender;
-
-       if (!dsi_connector)
-               return;
-       drm_connector_unregister(connector);
-       drm_connector_cleanup(connector);
-       sender = dsi_connector->pkg_sender;
-       mdfld_dsi_pkg_sender_destroy(sender);
-       kfree(dsi_connector);
-}
-
-static int mdfld_dsi_connector_get_modes(struct drm_connector *connector)
-{
-       struct mdfld_dsi_connector *dsi_connector =
-                               mdfld_dsi_connector(connector);
-       struct mdfld_dsi_config *dsi_config =
-                               mdfld_dsi_get_config(dsi_connector);
-       struct drm_display_mode *fixed_mode = dsi_config->fixed_mode;
-       struct drm_display_mode *dup_mode = NULL;
-       struct drm_device *dev = connector->dev;
-
-       if (fixed_mode) {
-               dev_dbg(dev->dev, "fixed_mode %dx%d\n",
-                               fixed_mode->hdisplay, fixed_mode->vdisplay);
-               dup_mode = drm_mode_duplicate(dev, fixed_mode);
-               drm_mode_probed_add(connector, dup_mode);
-               return 1;
-       }
-       DRM_ERROR("Didn't get any modes!\n");
-       return 0;
-}
-
-static enum drm_mode_status mdfld_dsi_connector_mode_valid(struct drm_connector *connector,
-                                               struct drm_display_mode *mode)
-{
-       struct mdfld_dsi_connector *dsi_connector =
-                                       mdfld_dsi_connector(connector);
-       struct mdfld_dsi_config *dsi_config =
-                                       mdfld_dsi_get_config(dsi_connector);
-       struct drm_display_mode *fixed_mode = dsi_config->fixed_mode;
-
-       if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
-               return MODE_NO_DBLESCAN;
-
-       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
-               return MODE_NO_INTERLACE;
-
-       /**
-        * FIXME: current DC has no fitting unit, reject any mode setting
-        * request
-        * Will figure out a way to do up-scaling(panel fitting) later.
-        **/
-       if (fixed_mode) {
-               if (mode->hdisplay != fixed_mode->hdisplay)
-                       return MODE_PANEL;
-
-               if (mode->vdisplay != fixed_mode->vdisplay)
-                       return MODE_PANEL;
-       }
-
-       return MODE_OK;
-}
-
-static struct drm_encoder *mdfld_dsi_connector_best_encoder(
-                               struct drm_connector *connector)
-{
-       struct mdfld_dsi_connector *dsi_connector =
-                               mdfld_dsi_connector(connector);
-       struct mdfld_dsi_config *dsi_config =
-                               mdfld_dsi_get_config(dsi_connector);
-       return &dsi_config->encoder->base.base;
-}
-
-/*DSI connector funcs*/
-static const struct drm_connector_funcs mdfld_dsi_connector_funcs = {
-       .dpms = drm_helper_connector_dpms,
-       .detect = mdfld_dsi_connector_detect,
-       .fill_modes = drm_helper_probe_single_connector_modes,
-       .set_property = mdfld_dsi_connector_set_property,
-       .destroy = mdfld_dsi_connector_destroy,
-};
-
-/*DSI connector helper funcs*/
-static const struct drm_connector_helper_funcs
-       mdfld_dsi_connector_helper_funcs = {
-       .get_modes = mdfld_dsi_connector_get_modes,
-       .mode_valid = mdfld_dsi_connector_mode_valid,
-       .best_encoder = mdfld_dsi_connector_best_encoder,
-};
-
-static int mdfld_dsi_get_default_config(struct drm_device *dev,
-                               struct mdfld_dsi_config *config, int pipe)
-{
-       if (!dev || !config) {
-               DRM_ERROR("Invalid parameters");
-               return -EINVAL;
-       }
-
-       config->bpp = 24;
-       if (mdfld_get_panel_type(dev, pipe) == TC35876X)
-               config->lane_count = 4;
-       else
-               config->lane_count = 2;
-       config->channel_num = 0;
-
-       if (mdfld_get_panel_type(dev, pipe) == TMD_VID)
-               config->video_mode = MDFLD_DSI_VIDEO_NON_BURST_MODE_SYNC_PULSE;
-       else if (mdfld_get_panel_type(dev, pipe) == TC35876X)
-               config->video_mode =
-                               MDFLD_DSI_VIDEO_NON_BURST_MODE_SYNC_EVENTS;
-       else
-               config->video_mode = MDFLD_DSI_VIDEO_BURST_MODE;
-
-       return 0;
-}
-
-int mdfld_dsi_panel_reset(struct drm_device *ddev, int pipe)
-{
-       struct device *dev = ddev->dev;
-       struct gpio_desc *gpiod;
-
-       /*
-        * Raise the GPIO reset line for the corresponding pipe to HIGH,
-        * this is probably because it is active low so this takes the
-        * respective pipe out of reset. (We have no code to put it back
-        * into reset in this driver.)
-        */
-       switch (pipe) {
-       case 0:
-               gpiod = gpiod_get(dev, "dsi-pipe0-reset", GPIOD_OUT_HIGH);
-               if (IS_ERR(gpiod))
-                       return PTR_ERR(gpiod);
-               break;
-       case 2:
-               gpiod = gpiod_get(dev, "dsi-pipe2-reset", GPIOD_OUT_HIGH);
-               if (IS_ERR(gpiod))
-                       return PTR_ERR(gpiod);
-               break;
-       default:
-               DRM_DEV_ERROR(dev, "Invalid output pipe\n");
-               return -EINVAL;
-       }
-       gpiod_put(gpiod);
-
-       /* Flush posted writes on the device */
-       gpiod = gpiod_get(dev, "dsi-pipe0-reset", GPIOD_ASIS);
-       if (IS_ERR(gpiod))
-               return PTR_ERR(gpiod);
-       gpiod_get_value(gpiod);
-       gpiod_put(gpiod);
-
-       return 0;
-}
-
-/*
- * MIPI output init
- * @dev drm device
- * @pipe pipe number. 0 or 2
- * @config
- *
- * Do the initialization of a MIPI output, including create DRM mode objects
- * initialization of DSI output on @pipe
- */
-void mdfld_dsi_output_init(struct drm_device *dev,
-                          int pipe,
-                          const struct panel_funcs *p_vid_funcs)
-{
-       struct mdfld_dsi_config *dsi_config;
-       struct mdfld_dsi_connector *dsi_connector;
-       struct drm_connector *connector;
-       struct mdfld_dsi_encoder *encoder;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       struct panel_info dsi_panel_info;
-       u32 width_mm, height_mm;
-
-       dev_dbg(dev->dev, "init DSI output on pipe %d\n", pipe);
-
-       if (pipe != 0 && pipe != 2) {
-               DRM_ERROR("Invalid parameter\n");
-               return;
-       }
-
-       /*create a new connector*/
-       dsi_connector = kzalloc(sizeof(struct mdfld_dsi_connector), GFP_KERNEL);
-       if (!dsi_connector) {
-               DRM_ERROR("No memory");
-               return;
-       }
-
-       dsi_connector->pipe =  pipe;
-
-       dsi_config = kzalloc(sizeof(struct mdfld_dsi_config),
-                       GFP_KERNEL);
-       if (!dsi_config) {
-               DRM_ERROR("cannot allocate memory for DSI config\n");
-               goto dsi_init_err0;
-       }
-       mdfld_dsi_get_default_config(dev, dsi_config, pipe);
-
-       dsi_connector->private = dsi_config;
-
-       dsi_config->changed = 1;
-       dsi_config->dev = dev;
-
-       dsi_config->fixed_mode = p_vid_funcs->get_config_mode(dev);
-       if (p_vid_funcs->get_panel_info(dev, pipe, &dsi_panel_info))
-                       goto dsi_init_err0;
-
-       width_mm = dsi_panel_info.width_mm;
-       height_mm = dsi_panel_info.height_mm;
-
-       dsi_config->mode = dsi_config->fixed_mode;
-       dsi_config->connector = dsi_connector;
-
-       if (!dsi_config->fixed_mode) {
-               DRM_ERROR("No panel fixed mode was found\n");
-               goto dsi_init_err0;
-       }
-
-       if (pipe && dev_priv->dsi_configs[0]) {
-               dsi_config->dvr_ic_inited = 0;
-               dev_priv->dsi_configs[1] = dsi_config;
-       } else if (pipe == 0) {
-               dsi_config->dvr_ic_inited = 1;
-               dev_priv->dsi_configs[0] = dsi_config;
-       } else {
-               DRM_ERROR("Trying to init MIPI1 before MIPI0\n");
-               goto dsi_init_err0;
-       }
-
-
-       connector = &dsi_connector->base.base;
-       dsi_connector->base.save = mdfld_dsi_connector_save;
-       dsi_connector->base.restore = mdfld_dsi_connector_restore;
-
-       drm_connector_init(dev, connector, &mdfld_dsi_connector_funcs,
-                                               DRM_MODE_CONNECTOR_LVDS);
-       drm_connector_helper_add(connector, &mdfld_dsi_connector_helper_funcs);
-
-       connector->display_info.subpixel_order = SubPixelHorizontalRGB;
-       connector->display_info.width_mm = width_mm;
-       connector->display_info.height_mm = height_mm;
-       connector->interlace_allowed = false;
-       connector->doublescan_allowed = false;
-
-       /*attach properties*/
-       drm_object_attach_property(&connector->base,
-                               dev->mode_config.scaling_mode_property,
-                               DRM_MODE_SCALE_FULLSCREEN);
-       drm_object_attach_property(&connector->base,
-                               dev_priv->backlight_property,
-                               MDFLD_DSI_BRIGHTNESS_MAX_LEVEL);
-
-       /*init DSI package sender on this output*/
-       if (mdfld_dsi_pkg_sender_init(dsi_connector, pipe)) {
-               DRM_ERROR("Package Sender initialization failed on pipe %d\n",
-                                                                       pipe);
-               goto dsi_init_err0;
-       }
-
-       encoder = mdfld_dsi_dpi_init(dev, dsi_connector, p_vid_funcs);
-       if (!encoder) {
-               DRM_ERROR("Create DPI encoder failed\n");
-               goto dsi_init_err1;
-       }
-       encoder->private = dsi_config;
-       dsi_config->encoder = encoder;
-       encoder->base.type = (pipe == 0) ? INTEL_OUTPUT_MIPI :
-               INTEL_OUTPUT_MIPI2;
-       drm_connector_register(connector);
-       return;
-
-       /*TODO: add code to destroy outputs on error*/
-dsi_init_err1:
-       /*destroy sender*/
-       mdfld_dsi_pkg_sender_destroy(dsi_connector->pkg_sender);
-
-       drm_connector_cleanup(connector);
-
-       kfree(dsi_config->fixed_mode);
-       kfree(dsi_config);
-dsi_init_err0:
-       kfree(dsi_connector);
-}
diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_output.h b/drivers/gpu/drm/gma500/mdfld_dsi_output.h
deleted file mode 100644 (file)
index 5c0db3c..0000000
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Copyright Â© 2010 Intel Corporation
- *
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- * Authors:
- * jim liu <jim.liu@intel.com>
- * Jackie Li<yaodong.li@intel.com>
- */
-
-#ifndef __MDFLD_DSI_OUTPUT_H__
-#define __MDFLD_DSI_OUTPUT_H__
-
-#include <linux/backlight.h>
-
-#include <asm/intel-mid.h>
-
-#include <drm/drm.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_edid.h>
-
-#include "mdfld_output.h"
-#include "psb_drv.h"
-#include "psb_intel_drv.h"
-#include "psb_intel_reg.h"
-
-#define FLD_MASK(start, end)   (((1 << ((start) - (end) + 1)) - 1) << (end))
-#define FLD_VAL(val, start, end) (((val) << (end)) & FLD_MASK(start, end))
-#define FLD_GET(val, start, end) (((val) & FLD_MASK(start, end)) >> (end))
-#define FLD_MOD(orig, val, start, end) \
-       (((orig) & ~FLD_MASK(start, end)) | FLD_VAL(val, start, end))
-
-#define REG_FLD_MOD(reg, val, start, end) \
-       REG_WRITE(reg, FLD_MOD(REG_READ(reg), val, start, end))
-
-static inline int REGISTER_FLD_WAIT(struct drm_device *dev, u32 reg,
-               u32 val, int start, int end)
-{
-       int t = 100000;
-
-       while (FLD_GET(REG_READ(reg), start, end) != val) {
-               if (--t == 0)
-                       return 1;
-       }
-
-       return 0;
-}
-
-#define REG_FLD_WAIT(reg, val, start, end) \
-       REGISTER_FLD_WAIT(dev, reg, val, start, end)
-
-#define REG_BIT_WAIT(reg, val, bitnum) \
-       REGISTER_FLD_WAIT(dev, reg, val, bitnum, bitnum)
-
-#define MDFLD_DSI_BRIGHTNESS_MAX_LEVEL 100
-
-#ifdef DEBUG
-#define CHECK_PIPE(pipe) ({                    \
-       const typeof(pipe) __pipe = (pipe);     \
-       BUG_ON(__pipe != 0 && __pipe != 2);     \
-       __pipe; })
-#else
-#define CHECK_PIPE(pipe) (pipe)
-#endif
-
-/*
- * Actual MIPIA->MIPIC reg offset is 0x800, value 0x400 is valid for 0 and 2
- */
-#define REG_OFFSET(pipe) (CHECK_PIPE(pipe) * 0x400)
-
-/* mdfld DSI controller registers */
-#define MIPI_DEVICE_READY_REG(pipe)            (0xb000 + REG_OFFSET(pipe))
-#define MIPI_INTR_STAT_REG(pipe)               (0xb004 + REG_OFFSET(pipe))
-#define MIPI_INTR_EN_REG(pipe)                 (0xb008 + REG_OFFSET(pipe))
-#define MIPI_DSI_FUNC_PRG_REG(pipe)            (0xb00c + REG_OFFSET(pipe))
-#define MIPI_HS_TX_TIMEOUT_REG(pipe)           (0xb010 + REG_OFFSET(pipe))
-#define MIPI_LP_RX_TIMEOUT_REG(pipe)           (0xb014 + REG_OFFSET(pipe))
-#define MIPI_TURN_AROUND_TIMEOUT_REG(pipe)     (0xb018 + REG_OFFSET(pipe))
-#define MIPI_DEVICE_RESET_TIMER_REG(pipe)      (0xb01c + REG_OFFSET(pipe))
-#define MIPI_DPI_RESOLUTION_REG(pipe)          (0xb020 + REG_OFFSET(pipe))
-#define MIPI_DBI_FIFO_THROTTLE_REG(pipe)       (0xb024 + REG_OFFSET(pipe))
-#define MIPI_HSYNC_COUNT_REG(pipe)             (0xb028 + REG_OFFSET(pipe))
-#define MIPI_HBP_COUNT_REG(pipe)               (0xb02c + REG_OFFSET(pipe))
-#define MIPI_HFP_COUNT_REG(pipe)               (0xb030 + REG_OFFSET(pipe))
-#define MIPI_HACTIVE_COUNT_REG(pipe)           (0xb034 + REG_OFFSET(pipe))
-#define MIPI_VSYNC_COUNT_REG(pipe)             (0xb038 + REG_OFFSET(pipe))
-#define MIPI_VBP_COUNT_REG(pipe)               (0xb03c + REG_OFFSET(pipe))
-#define MIPI_VFP_COUNT_REG(pipe)               (0xb040 + REG_OFFSET(pipe))
-#define MIPI_HIGH_LOW_SWITCH_COUNT_REG(pipe)   (0xb044 + REG_OFFSET(pipe))
-#define MIPI_DPI_CONTROL_REG(pipe)             (0xb048 + REG_OFFSET(pipe))
-#define MIPI_DPI_DATA_REG(pipe)                        (0xb04c + REG_OFFSET(pipe))
-#define MIPI_INIT_COUNT_REG(pipe)              (0xb050 + REG_OFFSET(pipe))
-#define MIPI_MAX_RETURN_PACK_SIZE_REG(pipe)    (0xb054 + REG_OFFSET(pipe))
-#define MIPI_VIDEO_MODE_FORMAT_REG(pipe)       (0xb058 + REG_OFFSET(pipe))
-#define MIPI_EOT_DISABLE_REG(pipe)             (0xb05c + REG_OFFSET(pipe))
-#define MIPI_LP_BYTECLK_REG(pipe)              (0xb060 + REG_OFFSET(pipe))
-#define MIPI_LP_GEN_DATA_REG(pipe)             (0xb064 + REG_OFFSET(pipe))
-#define MIPI_HS_GEN_DATA_REG(pipe)             (0xb068 + REG_OFFSET(pipe))
-#define MIPI_LP_GEN_CTRL_REG(pipe)             (0xb06c + REG_OFFSET(pipe))
-#define MIPI_HS_GEN_CTRL_REG(pipe)             (0xb070 + REG_OFFSET(pipe))
-#define MIPI_GEN_FIFO_STAT_REG(pipe)           (0xb074 + REG_OFFSET(pipe))
-#define MIPI_HS_LS_DBI_ENABLE_REG(pipe)                (0xb078 + REG_OFFSET(pipe))
-#define MIPI_DPHY_PARAM_REG(pipe)              (0xb080 + REG_OFFSET(pipe))
-#define MIPI_DBI_BW_CTRL_REG(pipe)             (0xb084 + REG_OFFSET(pipe))
-#define MIPI_CLK_LANE_SWITCH_TIME_CNT_REG(pipe)        (0xb088 + REG_OFFSET(pipe))
-
-#define MIPI_CTRL_REG(pipe)                    (0xb104 + REG_OFFSET(pipe))
-#define MIPI_DATA_ADD_REG(pipe)                        (0xb108 + REG_OFFSET(pipe))
-#define MIPI_DATA_LEN_REG(pipe)                        (0xb10c + REG_OFFSET(pipe))
-#define MIPI_CMD_ADD_REG(pipe)                 (0xb110 + REG_OFFSET(pipe))
-#define MIPI_CMD_LEN_REG(pipe)                 (0xb114 + REG_OFFSET(pipe))
-
-/* non-uniform reg offset */
-#define MIPI_PORT_CONTROL(pipe)                (CHECK_PIPE(pipe) ? MIPI_C : MIPI)
-
-#define DSI_DEVICE_READY                               (0x1)
-#define DSI_POWER_STATE_ULPS_ENTER                     (0x2 << 1)
-#define DSI_POWER_STATE_ULPS_EXIT                      (0x1 << 1)
-#define DSI_POWER_STATE_ULPS_OFFSET                    (0x1)
-
-
-#define DSI_ONE_DATA_LANE                                      (0x1)
-#define DSI_TWO_DATA_LANE                                      (0x2)
-#define DSI_THREE_DATA_LANE                                    (0X3)
-#define DSI_FOUR_DATA_LANE                                     (0x4)
-#define DSI_DPI_VIRT_CHANNEL_OFFSET                    (0x3)
-#define DSI_DBI_VIRT_CHANNEL_OFFSET                    (0x5)
-#define DSI_DPI_COLOR_FORMAT_RGB565                    (0x01 << 7)
-#define DSI_DPI_COLOR_FORMAT_RGB666                    (0x02 << 7)
-#define DSI_DPI_COLOR_FORMAT_RGB666_UNPACK             (0x03 << 7)
-#define DSI_DPI_COLOR_FORMAT_RGB888                    (0x04 << 7)
-#define DSI_DBI_COLOR_FORMAT_OPTION2                   (0x05 << 13)
-
-#define DSI_INTR_STATE_RXSOTERROR                      BIT(0)
-
-#define DSI_INTR_STATE_SPL_PKG_SENT                    BIT(30)
-#define DSI_INTR_STATE_TE                              BIT(31)
-
-#define DSI_HS_TX_TIMEOUT_MASK                         (0xffffff)
-
-#define DSI_LP_RX_TIMEOUT_MASK                         (0xffffff)
-
-#define DSI_TURN_AROUND_TIMEOUT_MASK           (0x3f)
-
-#define DSI_RESET_TIMER_MASK                           (0xffff)
-
-#define DSI_DBI_FIFO_WM_HALF                           (0x0)
-#define DSI_DBI_FIFO_WM_QUARTER                                (0x1)
-#define DSI_DBI_FIFO_WM_LOW                                    (0x2)
-
-#define DSI_DPI_TIMING_MASK                                    (0xffff)
-
-#define DSI_INIT_TIMER_MASK                                    (0xffff)
-
-#define DSI_DBI_RETURN_PACK_SIZE_MASK          (0x3ff)
-
-#define DSI_LP_BYTECLK_MASK                                    (0x0ffff)
-
-#define DSI_HS_CTRL_GEN_SHORT_W0                       (0x03)
-#define DSI_HS_CTRL_GEN_SHORT_W1                       (0x13)
-#define DSI_HS_CTRL_GEN_SHORT_W2                       (0x23)
-#define DSI_HS_CTRL_GEN_R0                                     (0x04)
-#define DSI_HS_CTRL_GEN_R1                                     (0x14)
-#define DSI_HS_CTRL_GEN_R2                                     (0x24)
-#define DSI_HS_CTRL_GEN_LONG_W                         (0x29)
-#define DSI_HS_CTRL_MCS_SHORT_W0                       (0x05)
-#define DSI_HS_CTRL_MCS_SHORT_W1                       (0x15)
-#define DSI_HS_CTRL_MCS_R0                                     (0x06)
-#define DSI_HS_CTRL_MCS_LONG_W                         (0x39)
-#define DSI_HS_CTRL_VC_OFFSET                          (0x06)
-#define DSI_HS_CTRL_WC_OFFSET                          (0x08)
-
-#define        DSI_FIFO_GEN_HS_DATA_FULL                       BIT(0)
-#define DSI_FIFO_GEN_HS_DATA_HALF_EMPTY                BIT(1)
-#define DSI_FIFO_GEN_HS_DATA_EMPTY                     BIT(2)
-#define DSI_FIFO_GEN_LP_DATA_FULL                      BIT(8)
-#define DSI_FIFO_GEN_LP_DATA_HALF_EMPTY                BIT(9)
-#define DSI_FIFO_GEN_LP_DATA_EMPTY                     BIT(10)
-#define DSI_FIFO_GEN_HS_CTRL_FULL                      BIT(16)
-#define DSI_FIFO_GEN_HS_CTRL_HALF_EMPTY                BIT(17)
-#define DSI_FIFO_GEN_HS_CTRL_EMPTY                     BIT(18)
-#define DSI_FIFO_GEN_LP_CTRL_FULL                      BIT(24)
-#define DSI_FIFO_GEN_LP_CTRL_HALF_EMPTY                BIT(25)
-#define DSI_FIFO_GEN_LP_CTRL_EMPTY                     BIT(26)
-#define DSI_FIFO_DBI_EMPTY                                     BIT(27)
-#define DSI_FIFO_DPI_EMPTY                                     BIT(28)
-
-#define DSI_DBI_HS_LP_SWITCH_MASK                      (0x1)
-
-#define DSI_HS_LP_SWITCH_COUNTER_OFFSET                (0x0)
-#define DSI_LP_HS_SWITCH_COUNTER_OFFSET                (0x16)
-
-#define DSI_DPI_CTRL_HS_SHUTDOWN                       (0x00000001)
-#define DSI_DPI_CTRL_HS_TURN_ON                                (0x00000002)
-
-/*dsi power modes*/
-#define DSI_POWER_MODE_DISPLAY_ON      BIT(2)
-#define DSI_POWER_MODE_NORMAL_ON       BIT(3)
-#define DSI_POWER_MODE_SLEEP_OUT       BIT(4)
-#define DSI_POWER_MODE_PARTIAL_ON      BIT(5)
-#define DSI_POWER_MODE_IDLE_ON         BIT(6)
-
-enum {
-       MDFLD_DSI_VIDEO_NON_BURST_MODE_SYNC_PULSE = 1,
-       MDFLD_DSI_VIDEO_NON_BURST_MODE_SYNC_EVENTS = 2,
-       MDFLD_DSI_VIDEO_BURST_MODE = 3,
-};
-
-#define DSI_DPI_COMPLETE_LAST_LINE                     BIT(2)
-#define DSI_DPI_DISABLE_BTA                                    BIT(3)
-
-struct mdfld_dsi_connector {
-       struct gma_connector base;
-
-       int pipe;
-       void *private;
-       void *pkg_sender;
-
-       /* Connection status */
-       enum drm_connector_status status;
-};
-
-struct mdfld_dsi_encoder {
-       struct gma_encoder base;
-       void *private;
-};
-
-/*
- * DSI config, consists of one DSI connector, two DSI encoders.
- * DRM will pick up on DSI encoder basing on differents configs.
- */
-struct mdfld_dsi_config {
-       struct drm_device *dev;
-       struct drm_display_mode *fixed_mode;
-       struct drm_display_mode *mode;
-
-       struct mdfld_dsi_connector *connector;
-       struct mdfld_dsi_encoder *encoder;
-
-       int changed;
-
-       int bpp;
-       int lane_count;
-       /*Virtual channel number for this encoder*/
-       int channel_num;
-       /*video mode configure*/
-       int video_mode;
-
-       int dvr_ic_inited;
-};
-
-static inline struct mdfld_dsi_connector *mdfld_dsi_connector(
-               struct drm_connector *connector)
-{
-       struct gma_connector *gma_connector;
-
-       gma_connector = to_gma_connector(connector);
-
-       return container_of(gma_connector, struct mdfld_dsi_connector, base);
-}
-
-static inline struct mdfld_dsi_encoder *mdfld_dsi_encoder(
-               struct drm_encoder *encoder)
-{
-       struct gma_encoder *gma_encoder;
-
-       gma_encoder = to_gma_encoder(encoder);
-
-       return container_of(gma_encoder, struct mdfld_dsi_encoder, base);
-}
-
-static inline struct mdfld_dsi_config *
-       mdfld_dsi_get_config(struct mdfld_dsi_connector *connector)
-{
-       if (!connector)
-               return NULL;
-       return (struct mdfld_dsi_config *)connector->private;
-}
-
-static inline void *mdfld_dsi_get_pkg_sender(struct mdfld_dsi_config *config)
-{
-       struct mdfld_dsi_connector *dsi_connector;
-
-       if (!config)
-               return NULL;
-
-       dsi_connector = config->connector;
-
-       if (!dsi_connector)
-               return NULL;
-
-       return dsi_connector->pkg_sender;
-}
-
-static inline struct mdfld_dsi_config *
-       mdfld_dsi_encoder_get_config(struct mdfld_dsi_encoder *encoder)
-{
-       if (!encoder)
-               return NULL;
-       return (struct mdfld_dsi_config *)encoder->private;
-}
-
-static inline struct mdfld_dsi_connector *
-       mdfld_dsi_encoder_get_connector(struct mdfld_dsi_encoder *encoder)
-{
-       struct mdfld_dsi_config *config;
-
-       if (!encoder)
-               return NULL;
-
-       config = mdfld_dsi_encoder_get_config(encoder);
-       if (!config)
-               return NULL;
-
-       return config->connector;
-}
-
-static inline void *mdfld_dsi_encoder_get_pkg_sender(
-                               struct mdfld_dsi_encoder *encoder)
-{
-       struct mdfld_dsi_config *dsi_config;
-
-       dsi_config = mdfld_dsi_encoder_get_config(encoder);
-       if (!dsi_config)
-               return NULL;
-
-       return mdfld_dsi_get_pkg_sender(dsi_config);
-}
-
-static inline int mdfld_dsi_encoder_get_pipe(struct mdfld_dsi_encoder *encoder)
-{
-       struct mdfld_dsi_connector *connector;
-
-       if (!encoder)
-               return -1;
-
-       connector = mdfld_dsi_encoder_get_connector(encoder);
-       if (!connector)
-               return -1;
-       return connector->pipe;
-}
-
-/* Export functions */
-extern void mdfld_dsi_gen_fifo_ready(struct drm_device *dev,
-                                       u32 gen_fifo_stat_reg, u32 fifo_stat);
-extern void mdfld_dsi_brightness_init(struct mdfld_dsi_config *dsi_config,
-                                       int pipe);
-extern void mdfld_dsi_brightness_control(struct drm_device *dev, int pipe,
-                                       int level);
-extern void mdfld_dsi_output_init(struct drm_device *dev,
-                                       int pipe,
-                                       const struct panel_funcs *p_vid_funcs);
-extern void mdfld_dsi_controller_init(struct mdfld_dsi_config *dsi_config,
-                                       int pipe);
-
-extern int mdfld_dsi_get_power_mode(struct mdfld_dsi_config *dsi_config,
-                                       u32 *mode, bool hs);
-extern int mdfld_dsi_panel_reset(struct drm_device *dev, int pipe);
-
-#endif /*__MDFLD_DSI_OUTPUT_H__*/
diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c b/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c
deleted file mode 100644 (file)
index 6e0de83..0000000
+++ /dev/null
@@ -1,679 +0,0 @@
-/*
- * Copyright Â© 2010 Intel Corporation
- *
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- * Authors:
- * Jackie Li<yaodong.li@intel.com>
- */
-
-#include <linux/delay.h>
-#include <linux/freezer.h>
-
-#include <video/mipi_display.h>
-
-#include "mdfld_dsi_dpi.h"
-#include "mdfld_dsi_output.h"
-#include "mdfld_dsi_pkg_sender.h"
-
-#define MDFLD_DSI_READ_MAX_COUNT               5000
-
-enum {
-       MDFLD_DSI_PANEL_MODE_SLEEP = 0x1,
-};
-
-enum {
-       MDFLD_DSI_PKG_SENDER_FREE = 0x0,
-       MDFLD_DSI_PKG_SENDER_BUSY = 0x1,
-};
-
-static const char *const dsi_errors[] = {
-       "RX SOT Error",
-       "RX SOT Sync Error",
-       "RX EOT Sync Error",
-       "RX Escape Mode Entry Error",
-       "RX LP TX Sync Error",
-       "RX HS Receive Timeout Error",
-       "RX False Control Error",
-       "RX ECC Single Bit Error",
-       "RX ECC Multibit Error",
-       "RX Checksum Error",
-       "RX DSI Data Type Not Recognised",
-       "RX DSI VC ID Invalid",
-       "TX False Control Error",
-       "TX ECC Single Bit Error",
-       "TX ECC Multibit Error",
-       "TX Checksum Error",
-       "TX DSI Data Type Not Recognised",
-       "TX DSI VC ID invalid",
-       "High Contention",
-       "Low contention",
-       "DPI FIFO Under run",
-       "HS TX Timeout",
-       "LP RX Timeout",
-       "Turn Around ACK Timeout",
-       "ACK With No Error",
-       "RX Invalid TX Length",
-       "RX Prot Violation",
-       "HS Generic Write FIFO Full",
-       "LP Generic Write FIFO Full",
-       "Generic Read Data Avail",
-       "Special Packet Sent",
-       "Tearing Effect",
-};
-
-static inline int wait_for_gen_fifo_empty(struct mdfld_dsi_pkg_sender *sender,
-                                               u32 mask)
-{
-       struct drm_device *dev = sender->dev;
-       u32 gen_fifo_stat_reg = sender->mipi_gen_fifo_stat_reg;
-       int retry = 0xffff;
-
-       while (retry--) {
-               if ((mask & REG_READ(gen_fifo_stat_reg)) == mask)
-                       return 0;
-               udelay(100);
-       }
-       DRM_ERROR("fifo is NOT empty 0x%08x\n", REG_READ(gen_fifo_stat_reg));
-       return -EIO;
-}
-
-static int wait_for_all_fifos_empty(struct mdfld_dsi_pkg_sender *sender)
-{
-       return wait_for_gen_fifo_empty(sender, (BIT(2) | BIT(10) | BIT(18) |
-                                               BIT(26) | BIT(27) | BIT(28)));
-}
-
-static int wait_for_lp_fifos_empty(struct mdfld_dsi_pkg_sender *sender)
-{
-       return wait_for_gen_fifo_empty(sender, (BIT(10) | BIT(26)));
-}
-
-static int wait_for_hs_fifos_empty(struct mdfld_dsi_pkg_sender *sender)
-{
-       return wait_for_gen_fifo_empty(sender, (BIT(2) | BIT(18)));
-}
-
-static int handle_dsi_error(struct mdfld_dsi_pkg_sender *sender, u32 mask)
-{
-       u32 intr_stat_reg = sender->mipi_intr_stat_reg;
-       struct drm_device *dev = sender->dev;
-
-       dev_dbg(sender->dev->dev, "Handling error 0x%08x\n", mask);
-
-       switch (mask) {
-       case BIT(0):
-       case BIT(1):
-       case BIT(2):
-       case BIT(3):
-       case BIT(4):
-       case BIT(5):
-       case BIT(6):
-       case BIT(7):
-       case BIT(8):
-       case BIT(9):
-       case BIT(10):
-       case BIT(11):
-       case BIT(12):
-       case BIT(13):
-               dev_dbg(sender->dev->dev, "No Action required\n");
-               break;
-       case BIT(14):
-               /*wait for all fifo empty*/
-               /*wait_for_all_fifos_empty(sender)*/
-               break;
-       case BIT(15):
-               dev_dbg(sender->dev->dev, "No Action required\n");
-               break;
-       case BIT(16):
-               break;
-       case BIT(17):
-               break;
-       case BIT(18):
-       case BIT(19):
-               dev_dbg(sender->dev->dev, "High/Low contention detected\n");
-               /*wait for contention recovery time*/
-               /*mdelay(10);*/
-               /*wait for all fifo empty*/
-               if (0)
-                       wait_for_all_fifos_empty(sender);
-               break;
-       case BIT(20):
-               dev_dbg(sender->dev->dev, "No Action required\n");
-               break;
-       case BIT(21):
-               /*wait for all fifo empty*/
-               /*wait_for_all_fifos_empty(sender);*/
-               break;
-       case BIT(22):
-               break;
-       case BIT(23):
-       case BIT(24):
-       case BIT(25):
-       case BIT(26):
-       case BIT(27):
-               dev_dbg(sender->dev->dev, "HS Gen fifo full\n");
-               REG_WRITE(intr_stat_reg, mask);
-               wait_for_hs_fifos_empty(sender);
-               break;
-       case BIT(28):
-               dev_dbg(sender->dev->dev, "LP Gen fifo full\n");
-               REG_WRITE(intr_stat_reg, mask);
-               wait_for_lp_fifos_empty(sender);
-               break;
-       case BIT(29):
-       case BIT(30):
-       case BIT(31):
-               dev_dbg(sender->dev->dev, "No Action required\n");
-               break;
-       }
-
-       if (mask & REG_READ(intr_stat_reg))
-               dev_dbg(sender->dev->dev,
-                               "Cannot clean interrupt 0x%08x\n", mask);
-       return 0;
-}
-
-static int dsi_error_handler(struct mdfld_dsi_pkg_sender *sender)
-{
-       struct drm_device *dev = sender->dev;
-       u32 intr_stat_reg = sender->mipi_intr_stat_reg;
-       u32 mask;
-       u32 intr_stat;
-       int i;
-       int err = 0;
-
-       intr_stat = REG_READ(intr_stat_reg);
-
-       for (i = 0; i < 32; i++) {
-               mask = (0x00000001UL) << i;
-               if (intr_stat & mask) {
-                       dev_dbg(sender->dev->dev, "[DSI]: %s\n", dsi_errors[i]);
-                       err = handle_dsi_error(sender, mask);
-                       if (err)
-                               DRM_ERROR("Cannot handle error\n");
-               }
-       }
-       return err;
-}
-
-static int send_short_pkg(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
-                       u8 cmd, u8 param, bool hs)
-{
-       struct drm_device *dev = sender->dev;
-       u32 ctrl_reg;
-       u32 val;
-       u8 virtual_channel = 0;
-
-       if (hs) {
-               ctrl_reg = sender->mipi_hs_gen_ctrl_reg;
-
-               /* FIXME: wait_for_hs_fifos_empty(sender); */
-       } else {
-               ctrl_reg = sender->mipi_lp_gen_ctrl_reg;
-
-               /* FIXME: wait_for_lp_fifos_empty(sender); */
-       }
-
-       val = FLD_VAL(param, 23, 16) | FLD_VAL(cmd, 15, 8) |
-               FLD_VAL(virtual_channel, 7, 6) | FLD_VAL(data_type, 5, 0);
-
-       REG_WRITE(ctrl_reg, val);
-
-       return 0;
-}
-
-static int send_long_pkg(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
-                       u8 *data, int len, bool hs)
-{
-       struct drm_device *dev = sender->dev;
-       u32 ctrl_reg;
-       u32 data_reg;
-       u32 val;
-       u8 *p;
-       u8 b1, b2, b3, b4;
-       u8 virtual_channel = 0;
-       int i;
-
-       if (hs) {
-               ctrl_reg = sender->mipi_hs_gen_ctrl_reg;
-               data_reg = sender->mipi_hs_gen_data_reg;
-
-               /* FIXME: wait_for_hs_fifos_empty(sender); */
-       } else {
-               ctrl_reg = sender->mipi_lp_gen_ctrl_reg;
-               data_reg = sender->mipi_lp_gen_data_reg;
-
-               /* FIXME: wait_for_lp_fifos_empty(sender); */
-       }
-
-       p = data;
-       for (i = 0; i < len / 4; i++) {
-               b1 = *p++;
-               b2 = *p++;
-               b3 = *p++;
-               b4 = *p++;
-
-               REG_WRITE(data_reg, b4 << 24 | b3 << 16 | b2 << 8 | b1);
-       }
-
-       i = len % 4;
-       if (i) {
-               b1 = 0; b2 = 0; b3 = 0;
-
-               switch (i) {
-               case 3:
-                       b1 = *p++;
-                       b2 = *p++;
-                       b3 = *p++;
-                       break;
-               case 2:
-                       b1 = *p++;
-                       b2 = *p++;
-                       break;
-               case 1:
-                       b1 = *p++;
-                       break;
-               }
-
-               REG_WRITE(data_reg, b3 << 16 | b2 << 8 | b1);
-       }
-
-       val = FLD_VAL(len, 23, 8) | FLD_VAL(virtual_channel, 7, 6) |
-               FLD_VAL(data_type, 5, 0);
-
-       REG_WRITE(ctrl_reg, val);
-
-       return 0;
-}
-
-static int send_pkg_prepare(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
-                       u8 *data, u16 len)
-{
-       u8 cmd;
-
-       switch (data_type) {
-       case MIPI_DSI_DCS_SHORT_WRITE:
-       case MIPI_DSI_DCS_SHORT_WRITE_PARAM:
-       case MIPI_DSI_DCS_LONG_WRITE:
-               cmd = *data;
-               break;
-       default:
-               return 0;
-       }
-
-       /*this prevents other package sending while doing msleep*/
-       sender->status = MDFLD_DSI_PKG_SENDER_BUSY;
-
-       /*wait for 120 milliseconds in case exit_sleep_mode just be sent*/
-       if (unlikely(cmd == MIPI_DCS_ENTER_SLEEP_MODE)) {
-               /*TODO: replace it with msleep later*/
-               mdelay(120);
-       }
-
-       if (unlikely(cmd == MIPI_DCS_EXIT_SLEEP_MODE)) {
-               /*TODO: replace it with msleep later*/
-               mdelay(120);
-       }
-       return 0;
-}
-
-static int send_pkg_done(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
-                       u8 *data, u16 len)
-{
-       u8 cmd;
-
-       switch (data_type) {
-       case MIPI_DSI_DCS_SHORT_WRITE:
-       case MIPI_DSI_DCS_SHORT_WRITE_PARAM:
-       case MIPI_DSI_DCS_LONG_WRITE:
-               cmd = *data;
-               break;
-       default:
-               return 0;
-       }
-
-       /*update panel status*/
-       if (unlikely(cmd == MIPI_DCS_ENTER_SLEEP_MODE)) {
-               sender->panel_mode |= MDFLD_DSI_PANEL_MODE_SLEEP;
-               /*TODO: replace it with msleep later*/
-               mdelay(120);
-       } else if (unlikely(cmd == MIPI_DCS_EXIT_SLEEP_MODE)) {
-               sender->panel_mode &= ~MDFLD_DSI_PANEL_MODE_SLEEP;
-               /*TODO: replace it with msleep later*/
-               mdelay(120);
-       } else if (unlikely(cmd == MIPI_DCS_SOFT_RESET)) {
-               /*TODO: replace it with msleep later*/
-               mdelay(5);
-       }
-
-       sender->status = MDFLD_DSI_PKG_SENDER_FREE;
-
-       return 0;
-}
-
-static int send_pkg(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
-               u8 *data, u16 len, bool hs)
-{
-       int ret;
-
-       /*handle DSI error*/
-       ret = dsi_error_handler(sender);
-       if (ret) {
-               DRM_ERROR("Error handling failed\n");
-               return -EAGAIN;
-       }
-
-       /* send pkg */
-       if (sender->status == MDFLD_DSI_PKG_SENDER_BUSY) {
-               DRM_ERROR("sender is busy\n");
-               return -EAGAIN;
-       }
-
-       ret = send_pkg_prepare(sender, data_type, data, len);
-       if (ret) {
-               DRM_ERROR("send_pkg_prepare error\n");
-               return ret;
-       }
-
-       switch (data_type) {
-       case MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM:
-       case MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM:
-       case MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM:
-       case MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM:
-       case MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM:
-       case MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM:
-       case MIPI_DSI_DCS_SHORT_WRITE:
-       case MIPI_DSI_DCS_SHORT_WRITE_PARAM:
-       case MIPI_DSI_DCS_READ:
-               ret = send_short_pkg(sender, data_type, data[0], data[1], hs);
-               break;
-       case MIPI_DSI_GENERIC_LONG_WRITE:
-       case MIPI_DSI_DCS_LONG_WRITE:
-               ret = send_long_pkg(sender, data_type, data, len, hs);
-               break;
-       }
-
-       send_pkg_done(sender, data_type, data, len);
-
-       /*FIXME: should I query complete and fifo empty here?*/
-
-       return ret;
-}
-
-int mdfld_dsi_send_mcs_long(struct mdfld_dsi_pkg_sender *sender, u8 *data,
-                       u32 len, bool hs)
-{
-       unsigned long flags;
-
-       if (!sender || !data || !len) {
-               DRM_ERROR("Invalid parameters\n");
-               return -EINVAL;
-       }
-
-       spin_lock_irqsave(&sender->lock, flags);
-       send_pkg(sender, MIPI_DSI_DCS_LONG_WRITE, data, len, hs);
-       spin_unlock_irqrestore(&sender->lock, flags);
-
-       return 0;
-}
-
-int mdfld_dsi_send_mcs_short(struct mdfld_dsi_pkg_sender *sender, u8 cmd,
-                       u8 param, u8 param_num, bool hs)
-{
-       u8 data[2];
-       unsigned long flags;
-       u8 data_type;
-
-       if (!sender) {
-               DRM_ERROR("Invalid parameter\n");
-               return -EINVAL;
-       }
-
-       data[0] = cmd;
-
-       if (param_num) {
-               data_type = MIPI_DSI_DCS_SHORT_WRITE_PARAM;
-               data[1] = param;
-       } else {
-               data_type = MIPI_DSI_DCS_SHORT_WRITE;
-               data[1] = 0;
-       }
-
-       spin_lock_irqsave(&sender->lock, flags);
-       send_pkg(sender, data_type, data, sizeof(data), hs);
-       spin_unlock_irqrestore(&sender->lock, flags);
-
-       return 0;
-}
-
-int mdfld_dsi_send_gen_short(struct mdfld_dsi_pkg_sender *sender, u8 param0,
-                       u8 param1, u8 param_num, bool hs)
-{
-       u8 data[2];
-       unsigned long flags;
-       u8 data_type;
-
-       if (!sender || param_num > 2) {
-               DRM_ERROR("Invalid parameter\n");
-               return -EINVAL;
-       }
-
-       switch (param_num) {
-       case 0:
-               data_type = MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM;
-               data[0] = 0;
-               data[1] = 0;
-               break;
-       case 1:
-               data_type = MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM;
-               data[0] = param0;
-               data[1] = 0;
-               break;
-       case 2:
-               data_type = MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM;
-               data[0] = param0;
-               data[1] = param1;
-               break;
-       }
-
-       spin_lock_irqsave(&sender->lock, flags);
-       send_pkg(sender, data_type, data, sizeof(data), hs);
-       spin_unlock_irqrestore(&sender->lock, flags);
-
-       return 0;
-}
-
-int mdfld_dsi_send_gen_long(struct mdfld_dsi_pkg_sender *sender, u8 *data,
-                       u32 len, bool hs)
-{
-       unsigned long flags;
-
-       if (!sender || !data || !len) {
-               DRM_ERROR("Invalid parameters\n");
-               return -EINVAL;
-       }
-
-       spin_lock_irqsave(&sender->lock, flags);
-       send_pkg(sender, MIPI_DSI_GENERIC_LONG_WRITE, data, len, hs);
-       spin_unlock_irqrestore(&sender->lock, flags);
-
-       return 0;
-}
-
-static int __read_panel_data(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
-                       u8 *data, u16 len, u32 *data_out, u16 len_out, bool hs)
-{
-       unsigned long flags;
-       struct drm_device *dev;
-       int i;
-       u32 gen_data_reg;
-       int retry = MDFLD_DSI_READ_MAX_COUNT;
-
-       if (!sender || !data_out || !len_out) {
-               DRM_ERROR("Invalid parameters\n");
-               return -EINVAL;
-       }
-
-       dev = sender->dev;
-
-       /**
-        * do reading.
-        * 0) send out generic read request
-        * 1) polling read data avail interrupt
-        * 2) read data
-        */
-       spin_lock_irqsave(&sender->lock, flags);
-
-       REG_WRITE(sender->mipi_intr_stat_reg, BIT(29));
-
-       if ((REG_READ(sender->mipi_intr_stat_reg) & BIT(29)))
-               DRM_ERROR("Can NOT clean read data valid interrupt\n");
-
-       /*send out read request*/
-       send_pkg(sender, data_type, data, len, hs);
-
-       /*polling read data avail interrupt*/
-       while (retry && !(REG_READ(sender->mipi_intr_stat_reg) & BIT(29))) {
-               udelay(100);
-               retry--;
-       }
-
-       if (!retry) {
-               spin_unlock_irqrestore(&sender->lock, flags);
-               return -ETIMEDOUT;
-       }
-
-       REG_WRITE(sender->mipi_intr_stat_reg, BIT(29));
-
-       /*read data*/
-       if (hs)
-               gen_data_reg = sender->mipi_hs_gen_data_reg;
-       else
-               gen_data_reg = sender->mipi_lp_gen_data_reg;
-
-       for (i = 0; i < len_out; i++)
-               *(data_out + i) = REG_READ(gen_data_reg);
-
-       spin_unlock_irqrestore(&sender->lock, flags);
-
-       return 0;
-}
-
-int mdfld_dsi_read_mcs(struct mdfld_dsi_pkg_sender *sender, u8 cmd,
-               u32 *data, u16 len, bool hs)
-{
-       if (!sender || !data || !len) {
-               DRM_ERROR("Invalid parameters\n");
-               return -EINVAL;
-       }
-
-       return __read_panel_data(sender, MIPI_DSI_DCS_READ, &cmd, 1,
-                               data, len, hs);
-}
-
-int mdfld_dsi_pkg_sender_init(struct mdfld_dsi_connector *dsi_connector,
-                                                               int pipe)
-{
-       struct mdfld_dsi_pkg_sender *pkg_sender;
-       struct mdfld_dsi_config *dsi_config =
-                               mdfld_dsi_get_config(dsi_connector);
-       struct drm_device *dev = dsi_config->dev;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       const struct psb_offset *map = &dev_priv->regmap[pipe];
-       u32 mipi_val = 0;
-
-       if (!dsi_connector) {
-               DRM_ERROR("Invalid parameter\n");
-               return -EINVAL;
-       }
-
-       pkg_sender = dsi_connector->pkg_sender;
-
-       if (!pkg_sender || IS_ERR(pkg_sender)) {
-               pkg_sender = kzalloc(sizeof(struct mdfld_dsi_pkg_sender),
-                                                               GFP_KERNEL);
-               if (!pkg_sender) {
-                       DRM_ERROR("Create DSI pkg sender failed\n");
-                       return -ENOMEM;
-               }
-               dsi_connector->pkg_sender = (void *)pkg_sender;
-       }
-
-       pkg_sender->dev = dev;
-       pkg_sender->dsi_connector = dsi_connector;
-       pkg_sender->pipe = pipe;
-       pkg_sender->pkg_num = 0;
-       pkg_sender->panel_mode = 0;
-       pkg_sender->status = MDFLD_DSI_PKG_SENDER_FREE;
-
-       /*init regs*/
-       /* FIXME: should just copy the regmap ptr ? */
-       pkg_sender->dpll_reg = map->dpll;
-       pkg_sender->dspcntr_reg = map->cntr;
-       pkg_sender->pipeconf_reg = map->conf;
-       pkg_sender->dsplinoff_reg = map->linoff;
-       pkg_sender->dspsurf_reg = map->surf;
-       pkg_sender->pipestat_reg = map->status;
-
-       pkg_sender->mipi_intr_stat_reg = MIPI_INTR_STAT_REG(pipe);
-       pkg_sender->mipi_lp_gen_data_reg = MIPI_LP_GEN_DATA_REG(pipe);
-       pkg_sender->mipi_hs_gen_data_reg = MIPI_HS_GEN_DATA_REG(pipe);
-       pkg_sender->mipi_lp_gen_ctrl_reg = MIPI_LP_GEN_CTRL_REG(pipe);
-       pkg_sender->mipi_hs_gen_ctrl_reg = MIPI_HS_GEN_CTRL_REG(pipe);
-       pkg_sender->mipi_gen_fifo_stat_reg = MIPI_GEN_FIFO_STAT_REG(pipe);
-       pkg_sender->mipi_data_addr_reg = MIPI_DATA_ADD_REG(pipe);
-       pkg_sender->mipi_data_len_reg = MIPI_DATA_LEN_REG(pipe);
-       pkg_sender->mipi_cmd_addr_reg = MIPI_CMD_ADD_REG(pipe);
-       pkg_sender->mipi_cmd_len_reg = MIPI_CMD_LEN_REG(pipe);
-
-       /*init lock*/
-       spin_lock_init(&pkg_sender->lock);
-
-       if (mdfld_get_panel_type(dev, pipe) != TC35876X) {
-               /**
-                * For video mode, don't enable DPI timing output here,
-                * will init the DPI timing output during mode setting.
-                */
-               mipi_val = PASS_FROM_SPHY_TO_AFE | SEL_FLOPPED_HSTX;
-
-               if (pipe == 0)
-                       mipi_val |= 0x2;
-
-               REG_WRITE(MIPI_PORT_CONTROL(pipe), mipi_val);
-               REG_READ(MIPI_PORT_CONTROL(pipe));
-
-               /* do dsi controller init */
-               mdfld_dsi_controller_init(dsi_config, pipe);
-       }
-
-       return 0;
-}
-
-void mdfld_dsi_pkg_sender_destroy(struct mdfld_dsi_pkg_sender *sender)
-{
-       if (!sender || IS_ERR(sender))
-               return;
-
-       /*free*/
-       kfree(sender);
-}
-
-
diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.h b/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.h
deleted file mode 100644 (file)
index 0478a21..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright Â© 2010 Intel Corporation
- *
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- * Authors:
- * Jackie Li<yaodong.li@intel.com>
- */
-#ifndef __MDFLD_DSI_PKG_SENDER_H__
-#define __MDFLD_DSI_PKG_SENDER_H__
-
-#include <linux/kthread.h>
-
-#define MDFLD_MAX_DCS_PARAM    8
-
-struct mdfld_dsi_pkg_sender {
-       struct drm_device *dev;
-       struct mdfld_dsi_connector *dsi_connector;
-       u32 status;
-       u32 panel_mode;
-
-       int pipe;
-
-       spinlock_t lock;
-
-       u32 pkg_num;
-
-       /* Registers */
-       u32 dpll_reg;
-       u32 dspcntr_reg;
-       u32 pipeconf_reg;
-       u32 pipestat_reg;
-       u32 dsplinoff_reg;
-       u32 dspsurf_reg;
-
-       u32 mipi_intr_stat_reg;
-       u32 mipi_lp_gen_data_reg;
-       u32 mipi_hs_gen_data_reg;
-       u32 mipi_lp_gen_ctrl_reg;
-       u32 mipi_hs_gen_ctrl_reg;
-       u32 mipi_gen_fifo_stat_reg;
-       u32 mipi_data_addr_reg;
-       u32 mipi_data_len_reg;
-       u32 mipi_cmd_addr_reg;
-       u32 mipi_cmd_len_reg;
-};
-
-extern int mdfld_dsi_pkg_sender_init(struct mdfld_dsi_connector *dsi_connector,
-                                       int pipe);
-extern void mdfld_dsi_pkg_sender_destroy(struct mdfld_dsi_pkg_sender *sender);
-int mdfld_dsi_send_mcs_short(struct mdfld_dsi_pkg_sender *sender, u8 cmd,
-                                       u8 param, u8 param_num, bool hs);
-int mdfld_dsi_send_mcs_long(struct mdfld_dsi_pkg_sender *sender, u8 *data,
-                                       u32 len, bool hs);
-int mdfld_dsi_send_gen_short(struct mdfld_dsi_pkg_sender *sender, u8 param0,
-                                       u8 param1, u8 param_num, bool hs);
-int mdfld_dsi_send_gen_long(struct mdfld_dsi_pkg_sender *sender, u8 *data,
-                                       u32 len, bool hs);
-/* Read interfaces */
-int mdfld_dsi_read_mcs(struct mdfld_dsi_pkg_sender *sender, u8 cmd,
-               u32 *data, u16 len, bool hs);
-
-#endif
diff --git a/drivers/gpu/drm/gma500/mdfld_intel_display.c b/drivers/gpu/drm/gma500/mdfld_intel_display.c
deleted file mode 100644 (file)
index 462aba8..0000000
+++ /dev/null
@@ -1,966 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright Ã‚© 2006-2007 Intel Corporation
- *
- * Authors:
- *     Eric Anholt <eric@anholt.net>
- */
-
-#include <linux/delay.h>
-#include <linux/i2c.h>
-#include <linux/pm_runtime.h>
-
-#include <drm/drm_crtc.h>
-#include <drm/drm_fourcc.h>
-
-#include "framebuffer.h"
-#include "gma_display.h"
-#include "mdfld_dsi_output.h"
-#include "mdfld_output.h"
-#include "psb_intel_reg.h"
-
-/* Hardcoded currently */
-static int ksel = KSEL_CRYSTAL_19;
-
-struct psb_intel_range_t {
-       int min, max;
-};
-
-struct mrst_limit_t {
-       struct psb_intel_range_t dot, m, p1;
-};
-
-struct mrst_clock_t {
-       /* derived values */
-       int dot;
-       int m;
-       int p1;
-};
-
-#define COUNT_MAX 0x10000000
-
-void mdfldWaitForPipeDisable(struct drm_device *dev, int pipe)
-{
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       const struct psb_offset *map = &dev_priv->regmap[pipe];
-       int count, temp;
-
-       switch (pipe) {
-       case 0:
-       case 1:
-       case 2:
-               break;
-       default:
-               DRM_ERROR("Illegal Pipe Number.\n");
-               return;
-       }
-
-       /* FIXME JLIU7_PO */
-       gma_wait_for_vblank(dev);
-       return;
-
-       /* Wait for for the pipe disable to take effect. */
-       for (count = 0; count < COUNT_MAX; count++) {
-               temp = REG_READ(map->conf);
-               if ((temp & PIPEACONF_PIPE_STATE) == 0)
-                       break;
-       }
-}
-
-void mdfldWaitForPipeEnable(struct drm_device *dev, int pipe)
-{
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       const struct psb_offset *map = &dev_priv->regmap[pipe];
-       int count, temp;
-
-       switch (pipe) {
-       case 0:
-       case 1:
-       case 2:
-               break;
-       default:
-               DRM_ERROR("Illegal Pipe Number.\n");
-               return;
-       }
-
-       /* FIXME JLIU7_PO */
-       gma_wait_for_vblank(dev);
-       return;
-
-       /* Wait for for the pipe enable to take effect. */
-       for (count = 0; count < COUNT_MAX; count++) {
-               temp = REG_READ(map->conf);
-               if (temp & PIPEACONF_PIPE_STATE)
-                       break;
-       }
-}
-
-/*
- * Return the pipe currently connected to the panel fitter,
- * or -1 if the panel fitter is not present or not in use
- */
-static int psb_intel_panel_fitter_pipe(struct drm_device *dev)
-{
-       u32 pfit_control;
-
-       pfit_control = REG_READ(PFIT_CONTROL);
-
-       /* See if the panel fitter is in use */
-       if ((pfit_control & PFIT_ENABLE) == 0)
-               return -1;
-
-       /* 965 can place panel fitter on either pipe */
-       return (pfit_control >> 29) & 0x3;
-}
-
-static int check_fb(struct drm_framebuffer *fb)
-{
-       if (!fb)
-               return 0;
-
-       switch (fb->format->cpp[0] * 8) {
-       case 8:
-       case 16:
-       case 24:
-       case 32:
-               return 0;
-       default:
-               DRM_ERROR("Unknown color depth\n");
-               return -EINVAL;
-       }
-}
-
-static int mdfld__intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
-                               struct drm_framebuffer *old_fb)
-{
-       struct drm_device *dev = crtc->dev;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       struct drm_framebuffer *fb = crtc->primary->fb;
-       struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
-       int pipe = gma_crtc->pipe;
-       const struct psb_offset *map = &dev_priv->regmap[pipe];
-       unsigned long start, offset;
-       u32 dspcntr;
-       int ret;
-
-       dev_dbg(dev->dev, "pipe = 0x%x.\n", pipe);
-
-       /* no fb bound */
-       if (!fb) {
-               dev_dbg(dev->dev, "No FB bound\n");
-               return 0;
-       }
-
-       ret = check_fb(fb);
-       if (ret)
-               return ret;
-
-       if (pipe > 2) {
-               DRM_ERROR("Illegal Pipe Number.\n");
-               return -EINVAL;
-       }
-
-       if (!gma_power_begin(dev, true))
-               return 0;
-
-       start = to_gtt_range(fb->obj[0])->offset;
-       offset = y * fb->pitches[0] + x * fb->format->cpp[0];
-
-       REG_WRITE(map->stride, fb->pitches[0]);
-       dspcntr = REG_READ(map->cntr);
-       dspcntr &= ~DISPPLANE_PIXFORMAT_MASK;
-
-       switch (fb->format->cpp[0] * 8) {
-       case 8:
-               dspcntr |= DISPPLANE_8BPP;
-               break;
-       case 16:
-               if (fb->format->depth == 15)
-                       dspcntr |= DISPPLANE_15_16BPP;
-               else
-                       dspcntr |= DISPPLANE_16BPP;
-               break;
-       case 24:
-       case 32:
-               dspcntr |= DISPPLANE_32BPP_NO_ALPHA;
-               break;
-       }
-       REG_WRITE(map->cntr, dspcntr);
-
-       dev_dbg(dev->dev, "Writing base %08lX %08lX %d %d\n",
-                                               start, offset, x, y);
-       REG_WRITE(map->linoff, offset);
-       REG_READ(map->linoff);
-       REG_WRITE(map->surf, start);
-       REG_READ(map->surf);
-
-       gma_power_end(dev);
-
-       return 0;
-}
-
-/*
- * Disable the pipe, plane and pll.
- *
- */
-void mdfld_disable_crtc(struct drm_device *dev, int pipe)
-{
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       const struct psb_offset *map = &dev_priv->regmap[pipe];
-       u32 temp;
-
-       dev_dbg(dev->dev, "pipe = %d\n", pipe);
-
-
-       if (pipe != 1)
-               mdfld_dsi_gen_fifo_ready(dev, MIPI_GEN_FIFO_STAT_REG(pipe),
-                               HS_CTRL_FIFO_EMPTY | HS_DATA_FIFO_EMPTY);
-
-       /* Disable display plane */
-       temp = REG_READ(map->cntr);
-       if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
-               REG_WRITE(map->cntr,
-                         temp & ~DISPLAY_PLANE_ENABLE);
-               /* Flush the plane changes */
-               REG_WRITE(map->base, REG_READ(map->base));
-               REG_READ(map->base);
-       }
-
-       /* FIXME_JLIU7 MDFLD_PO revisit */
-
-       /* Next, disable display pipes */
-       temp = REG_READ(map->conf);
-       if ((temp & PIPEACONF_ENABLE) != 0) {
-               temp &= ~PIPEACONF_ENABLE;
-               temp |= PIPECONF_PLANE_OFF | PIPECONF_CURSOR_OFF;
-               REG_WRITE(map->conf, temp);
-               REG_READ(map->conf);
-
-               /* Wait for for the pipe disable to take effect. */
-               mdfldWaitForPipeDisable(dev, pipe);
-       }
-
-       temp = REG_READ(map->dpll);
-       if (temp & DPLL_VCO_ENABLE) {
-               if ((pipe != 1 &&
-                       !((REG_READ(PIPEACONF) | REG_READ(PIPECCONF))
-                               & PIPEACONF_ENABLE)) || pipe == 1) {
-                       temp &= ~(DPLL_VCO_ENABLE);
-                       REG_WRITE(map->dpll, temp);
-                       REG_READ(map->dpll);
-                       /* Wait for the clocks to turn off. */
-                       /* FIXME_MDFLD PO may need more delay */
-                       udelay(500);
-
-                       if (!(temp & MDFLD_PWR_GATE_EN)) {
-                               /* gating power of DPLL */
-                               REG_WRITE(map->dpll, temp | MDFLD_PWR_GATE_EN);
-                               /* FIXME_MDFLD PO - change 500 to 1 after PO */
-                               udelay(5000);
-                       }
-               }
-       }
-
-}
-
-/*
- * Sets the power management mode of the pipe and plane.
- *
- * This code should probably grow support for turning the cursor off and back
- * on appropriately at the same time as we're turning the pipe off/on.
- */
-static void mdfld_crtc_dpms(struct drm_crtc *crtc, int mode)
-{
-       struct drm_device *dev = crtc->dev;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
-       int pipe = gma_crtc->pipe;
-       const struct psb_offset *map = &dev_priv->regmap[pipe];
-       u32 pipeconf = dev_priv->pipeconf[pipe];
-       u32 temp;
-       int timeout = 0;
-
-       dev_dbg(dev->dev, "mode = %d, pipe = %d\n", mode, pipe);
-
-       /* Note: Old code uses pipe a stat for pipe b but that appears
-          to be a bug */
-
-       if (!gma_power_begin(dev, true))
-               return;
-
-       /* XXX: When our outputs are all unaware of DPMS modes other than off
-        * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC.
-        */
-       switch (mode) {
-       case DRM_MODE_DPMS_ON:
-       case DRM_MODE_DPMS_STANDBY:
-       case DRM_MODE_DPMS_SUSPEND:
-               /* Enable the DPLL */
-               temp = REG_READ(map->dpll);
-
-               if ((temp & DPLL_VCO_ENABLE) == 0) {
-                       /* When ungating power of DPLL, needs to wait 0.5us
-                          before enable the VCO */
-                       if (temp & MDFLD_PWR_GATE_EN) {
-                               temp &= ~MDFLD_PWR_GATE_EN;
-                               REG_WRITE(map->dpll, temp);
-                               /* FIXME_MDFLD PO - change 500 to 1 after PO */
-                               udelay(500);
-                       }
-
-                       REG_WRITE(map->dpll, temp);
-                       REG_READ(map->dpll);
-                       /* FIXME_MDFLD PO - change 500 to 1 after PO */
-                       udelay(500);
-
-                       REG_WRITE(map->dpll, temp | DPLL_VCO_ENABLE);
-                       REG_READ(map->dpll);
-
-                       /**
-                        * wait for DSI PLL to lock
-                        * NOTE: only need to poll status of pipe 0 and pipe 1,
-                        * since both MIPI pipes share the same PLL.
-                        */
-                       while ((pipe != 2) && (timeout < 20000) &&
-                         !(REG_READ(map->conf) & PIPECONF_DSIPLL_LOCK)) {
-                               udelay(150);
-                               timeout++;
-                       }
-               }
-
-               /* Enable the plane */
-               temp = REG_READ(map->cntr);
-               if ((temp & DISPLAY_PLANE_ENABLE) == 0) {
-                       REG_WRITE(map->cntr,
-                               temp | DISPLAY_PLANE_ENABLE);
-                       /* Flush the plane changes */
-                       REG_WRITE(map->base, REG_READ(map->base));
-               }
-
-               /* Enable the pipe */
-               temp = REG_READ(map->conf);
-               if ((temp & PIPEACONF_ENABLE) == 0) {
-                       REG_WRITE(map->conf, pipeconf);
-
-                       /* Wait for for the pipe enable to take effect. */
-                       mdfldWaitForPipeEnable(dev, pipe);
-               }
-
-               /*workaround for sighting 3741701 Random X blank display*/
-               /*perform w/a in video mode only on pipe A or C*/
-               if (pipe == 0 || pipe == 2) {
-                       REG_WRITE(map->status, REG_READ(map->status));
-                       msleep(100);
-                       if (PIPE_VBLANK_STATUS & REG_READ(map->status))
-                               dev_dbg(dev->dev, "OK");
-                       else {
-                               dev_dbg(dev->dev, "STUCK!!!!");
-                               /*shutdown controller*/
-                               temp = REG_READ(map->cntr);
-                               REG_WRITE(map->cntr,
-                                               temp & ~DISPLAY_PLANE_ENABLE);
-                               REG_WRITE(map->base, REG_READ(map->base));
-                               /*mdfld_dsi_dpi_shut_down(dev, pipe);*/
-                               REG_WRITE(0xb048, 1);
-                               msleep(100);
-                               temp = REG_READ(map->conf);
-                               temp &= ~PIPEACONF_ENABLE;
-                               REG_WRITE(map->conf, temp);
-                               msleep(100); /*wait for pipe disable*/
-                               REG_WRITE(MIPI_DEVICE_READY_REG(pipe), 0);
-                               msleep(100);
-                               REG_WRITE(0xb004, REG_READ(0xb004));
-                               /* try to bring the controller back up again*/
-                               REG_WRITE(MIPI_DEVICE_READY_REG(pipe), 1);
-                               temp = REG_READ(map->cntr);
-                               REG_WRITE(map->cntr,
-                                               temp | DISPLAY_PLANE_ENABLE);
-                               REG_WRITE(map->base, REG_READ(map->base));
-                               /*mdfld_dsi_dpi_turn_on(dev, pipe);*/
-                               REG_WRITE(0xb048, 2);
-                               msleep(100);
-                               temp = REG_READ(map->conf);
-                               temp |= PIPEACONF_ENABLE;
-                               REG_WRITE(map->conf, temp);
-                       }
-               }
-
-               gma_crtc_load_lut(crtc);
-
-               /* Give the overlay scaler a chance to enable
-                  if it's on this pipe */
-               /* psb_intel_crtc_dpms_video(crtc, true); TODO */
-
-               break;
-       case DRM_MODE_DPMS_OFF:
-               /* Give the overlay scaler a chance to disable
-                * if it's on this pipe */
-               /* psb_intel_crtc_dpms_video(crtc, FALSE); TODO */
-               if (pipe != 1)
-                       mdfld_dsi_gen_fifo_ready(dev,
-                               MIPI_GEN_FIFO_STAT_REG(pipe),
-                               HS_CTRL_FIFO_EMPTY | HS_DATA_FIFO_EMPTY);
-
-               /* Disable the VGA plane that we never use */
-               REG_WRITE(VGACNTRL, VGA_DISP_DISABLE);
-
-               /* Disable display plane */
-               temp = REG_READ(map->cntr);
-               if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
-                       REG_WRITE(map->cntr,
-                                 temp & ~DISPLAY_PLANE_ENABLE);
-                       /* Flush the plane changes */
-                       REG_WRITE(map->base, REG_READ(map->base));
-                       REG_READ(map->base);
-               }
-
-               /* Next, disable display pipes */
-               temp = REG_READ(map->conf);
-               if ((temp & PIPEACONF_ENABLE) != 0) {
-                       temp &= ~PIPEACONF_ENABLE;
-                       temp |= PIPECONF_PLANE_OFF | PIPECONF_CURSOR_OFF;
-                       REG_WRITE(map->conf, temp);
-                       REG_READ(map->conf);
-
-                       /* Wait for for the pipe disable to take effect. */
-                       mdfldWaitForPipeDisable(dev, pipe);
-               }
-
-               temp = REG_READ(map->dpll);
-               if (temp & DPLL_VCO_ENABLE) {
-                       if ((pipe != 1 && !((REG_READ(PIPEACONF)
-                               | REG_READ(PIPECCONF)) & PIPEACONF_ENABLE))
-                                       || pipe == 1) {
-                               temp &= ~(DPLL_VCO_ENABLE);
-                               REG_WRITE(map->dpll, temp);
-                               REG_READ(map->dpll);
-                               /* Wait for the clocks to turn off. */
-                               /* FIXME_MDFLD PO may need more delay */
-                               udelay(500);
-                       }
-               }
-               break;
-       }
-       gma_power_end(dev);
-}
-
-
-#define MDFLD_LIMT_DPLL_19         0
-#define MDFLD_LIMT_DPLL_25         1
-#define MDFLD_LIMT_DPLL_83         2
-#define MDFLD_LIMT_DPLL_100        3
-#define MDFLD_LIMT_DSIPLL_19       4
-#define MDFLD_LIMT_DSIPLL_25       5
-#define MDFLD_LIMT_DSIPLL_83       6
-#define MDFLD_LIMT_DSIPLL_100      7
-
-#define MDFLD_DOT_MIN            19750
-#define MDFLD_DOT_MAX            120000
-#define MDFLD_DPLL_M_MIN_19        113
-#define MDFLD_DPLL_M_MAX_19        155
-#define MDFLD_DPLL_P1_MIN_19       2
-#define MDFLD_DPLL_P1_MAX_19       10
-#define MDFLD_DPLL_M_MIN_25        101
-#define MDFLD_DPLL_M_MAX_25        130
-#define MDFLD_DPLL_P1_MIN_25       2
-#define MDFLD_DPLL_P1_MAX_25       10
-#define MDFLD_DPLL_M_MIN_83        64
-#define MDFLD_DPLL_M_MAX_83        64
-#define MDFLD_DPLL_P1_MIN_83       2
-#define MDFLD_DPLL_P1_MAX_83       2
-#define MDFLD_DPLL_M_MIN_100       64
-#define MDFLD_DPLL_M_MAX_100       64
-#define MDFLD_DPLL_P1_MIN_100      2
-#define MDFLD_DPLL_P1_MAX_100      2
-#define MDFLD_DSIPLL_M_MIN_19      131
-#define MDFLD_DSIPLL_M_MAX_19      175
-#define MDFLD_DSIPLL_P1_MIN_19     3
-#define MDFLD_DSIPLL_P1_MAX_19     8
-#define MDFLD_DSIPLL_M_MIN_25      97
-#define MDFLD_DSIPLL_M_MAX_25      140
-#define MDFLD_DSIPLL_P1_MIN_25     3
-#define MDFLD_DSIPLL_P1_MAX_25     9
-#define MDFLD_DSIPLL_M_MIN_83      33
-#define MDFLD_DSIPLL_M_MAX_83      92
-#define MDFLD_DSIPLL_P1_MIN_83     2
-#define MDFLD_DSIPLL_P1_MAX_83     3
-#define MDFLD_DSIPLL_M_MIN_100     97
-#define MDFLD_DSIPLL_M_MAX_100     140
-#define MDFLD_DSIPLL_P1_MIN_100            3
-#define MDFLD_DSIPLL_P1_MAX_100            9
-
-static const struct mrst_limit_t mdfld_limits[] = {
-       {                       /* MDFLD_LIMT_DPLL_19 */
-        .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
-        .m = {.min = MDFLD_DPLL_M_MIN_19, .max = MDFLD_DPLL_M_MAX_19},
-        .p1 = {.min = MDFLD_DPLL_P1_MIN_19, .max = MDFLD_DPLL_P1_MAX_19},
-        },
-       {                       /* MDFLD_LIMT_DPLL_25 */
-        .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
-        .m = {.min = MDFLD_DPLL_M_MIN_25, .max = MDFLD_DPLL_M_MAX_25},
-        .p1 = {.min = MDFLD_DPLL_P1_MIN_25, .max = MDFLD_DPLL_P1_MAX_25},
-        },
-       {                       /* MDFLD_LIMT_DPLL_83 */
-        .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
-        .m = {.min = MDFLD_DPLL_M_MIN_83, .max = MDFLD_DPLL_M_MAX_83},
-        .p1 = {.min = MDFLD_DPLL_P1_MIN_83, .max = MDFLD_DPLL_P1_MAX_83},
-        },
-       {                       /* MDFLD_LIMT_DPLL_100 */
-        .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
-        .m = {.min = MDFLD_DPLL_M_MIN_100, .max = MDFLD_DPLL_M_MAX_100},
-        .p1 = {.min = MDFLD_DPLL_P1_MIN_100, .max = MDFLD_DPLL_P1_MAX_100},
-        },
-       {                       /* MDFLD_LIMT_DSIPLL_19 */
-        .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
-        .m = {.min = MDFLD_DSIPLL_M_MIN_19, .max = MDFLD_DSIPLL_M_MAX_19},
-        .p1 = {.min = MDFLD_DSIPLL_P1_MIN_19, .max = MDFLD_DSIPLL_P1_MAX_19},
-        },
-       {                       /* MDFLD_LIMT_DSIPLL_25 */
-        .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
-        .m = {.min = MDFLD_DSIPLL_M_MIN_25, .max = MDFLD_DSIPLL_M_MAX_25},
-        .p1 = {.min = MDFLD_DSIPLL_P1_MIN_25, .max = MDFLD_DSIPLL_P1_MAX_25},
-        },
-       {                       /* MDFLD_LIMT_DSIPLL_83 */
-        .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
-        .m = {.min = MDFLD_DSIPLL_M_MIN_83, .max = MDFLD_DSIPLL_M_MAX_83},
-        .p1 = {.min = MDFLD_DSIPLL_P1_MIN_83, .max = MDFLD_DSIPLL_P1_MAX_83},
-        },
-       {                       /* MDFLD_LIMT_DSIPLL_100 */
-        .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
-        .m = {.min = MDFLD_DSIPLL_M_MIN_100, .max = MDFLD_DSIPLL_M_MAX_100},
-        .p1 = {.min = MDFLD_DSIPLL_P1_MIN_100, .max = MDFLD_DSIPLL_P1_MAX_100},
-        },
-};
-
-#define MDFLD_M_MIN        21
-#define MDFLD_M_MAX        180
-static const u32 mdfld_m_converts[] = {
-/* M configuration table from 9-bit LFSR table */
-       224, 368, 440, 220, 366, 439, 219, 365, 182, 347, /* 21 - 30 */
-       173, 342, 171, 85, 298, 149, 74, 37, 18, 265,   /* 31 - 40 */
-       388, 194, 353, 432, 216, 108, 310, 155, 333, 166, /* 41 - 50 */
-       83, 41, 276, 138, 325, 162, 337, 168, 340, 170, /* 51 - 60 */
-       341, 426, 469, 234, 373, 442, 221, 110, 311, 411, /* 61 - 70 */
-       461, 486, 243, 377, 188, 350, 175, 343, 427, 213, /* 71 - 80 */
-       106, 53, 282, 397, 354, 227, 113, 56, 284, 142, /* 81 - 90 */
-       71, 35, 273, 136, 324, 418, 465, 488, 500, 506, /* 91 - 100 */
-       253, 126, 63, 287, 399, 455, 483, 241, 376, 444, /* 101 - 110 */
-       478, 495, 503, 251, 381, 446, 479, 239, 375, 443, /* 111 - 120 */
-       477, 238, 119, 315, 157, 78, 295, 147, 329, 420, /* 121 - 130 */
-       210, 105, 308, 154, 77, 38, 275, 137, 68, 290, /* 131 - 140 */
-       145, 328, 164, 82, 297, 404, 458, 485, 498, 249, /* 141 - 150 */
-       380, 190, 351, 431, 471, 235, 117, 314, 413, 206, /* 151 - 160 */
-       103, 51, 25, 12, 262, 387, 193, 96, 48, 280, /* 161 - 170 */
-       396, 198, 99, 305, 152, 76, 294, 403, 457, 228, /* 171 - 180 */
-};
-
-static const struct mrst_limit_t *mdfld_limit(struct drm_crtc *crtc)
-{
-       const struct mrst_limit_t *limit = NULL;
-       struct drm_device *dev = crtc->dev;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-
-       if (gma_pipe_has_type(crtc, INTEL_OUTPUT_MIPI)
-           || gma_pipe_has_type(crtc, INTEL_OUTPUT_MIPI2)) {
-               if ((ksel == KSEL_CRYSTAL_19) || (ksel == KSEL_BYPASS_19))
-                       limit = &mdfld_limits[MDFLD_LIMT_DSIPLL_19];
-               else if (ksel == KSEL_BYPASS_25)
-                       limit = &mdfld_limits[MDFLD_LIMT_DSIPLL_25];
-               else if ((ksel == KSEL_BYPASS_83_100) &&
-                               (dev_priv->core_freq == 166))
-                       limit = &mdfld_limits[MDFLD_LIMT_DSIPLL_83];
-               else if ((ksel == KSEL_BYPASS_83_100) &&
-                        (dev_priv->core_freq == 100 ||
-                               dev_priv->core_freq == 200))
-                       limit = &mdfld_limits[MDFLD_LIMT_DSIPLL_100];
-       } else if (gma_pipe_has_type(crtc, INTEL_OUTPUT_HDMI)) {
-               if ((ksel == KSEL_CRYSTAL_19) || (ksel == KSEL_BYPASS_19))
-                       limit = &mdfld_limits[MDFLD_LIMT_DPLL_19];
-               else if (ksel == KSEL_BYPASS_25)
-                       limit = &mdfld_limits[MDFLD_LIMT_DPLL_25];
-               else if ((ksel == KSEL_BYPASS_83_100) &&
-                               (dev_priv->core_freq == 166))
-                       limit = &mdfld_limits[MDFLD_LIMT_DPLL_83];
-               else if ((ksel == KSEL_BYPASS_83_100) &&
-                                (dev_priv->core_freq == 100 ||
-                                dev_priv->core_freq == 200))
-                       limit = &mdfld_limits[MDFLD_LIMT_DPLL_100];
-       } else {
-               limit = NULL;
-               dev_dbg(dev->dev, "mdfld_limit Wrong display type.\n");
-       }
-
-       return limit;
-}
-
-/** Derive the pixel clock for the given refclk and divisors for 8xx chips. */
-static void mdfld_clock(int refclk, struct mrst_clock_t *clock)
-{
-       clock->dot = (refclk * clock->m) / clock->p1;
-}
-
-/*
- * Returns a set of divisors for the desired target clock with the given refclk,
- * or FALSE.  Divisor values are the actual divisors for
- */
-static bool
-mdfldFindBestPLL(struct drm_crtc *crtc, int target, int refclk,
-               struct mrst_clock_t *best_clock)
-{
-       struct mrst_clock_t clock;
-       const struct mrst_limit_t *limit = mdfld_limit(crtc);
-       int err = target;
-
-       memset(best_clock, 0, sizeof(*best_clock));
-
-       for (clock.m = limit->m.min; clock.m <= limit->m.max; clock.m++) {
-               for (clock.p1 = limit->p1.min; clock.p1 <= limit->p1.max;
-                    clock.p1++) {
-                       int this_err;
-
-                       mdfld_clock(refclk, &clock);
-
-                       this_err = abs(clock.dot - target);
-                       if (this_err < err) {
-                               *best_clock = clock;
-                               err = this_err;
-                       }
-               }
-       }
-       return err != target;
-}
-
-static int mdfld_crtc_mode_set(struct drm_crtc *crtc,
-                             struct drm_display_mode *mode,
-                             struct drm_display_mode *adjusted_mode,
-                             int x, int y,
-                             struct drm_framebuffer *old_fb)
-{
-       struct drm_device *dev = crtc->dev;
-       struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       int pipe = gma_crtc->pipe;
-       const struct psb_offset *map = &dev_priv->regmap[pipe];
-       int refclk = 0;
-       int clk_n = 0, clk_p2 = 0, clk_byte = 1, clk = 0, m_conv = 0,
-                                                               clk_tmp = 0;
-       struct mrst_clock_t clock;
-       bool ok;
-       u32 dpll = 0, fp = 0;
-       bool is_mipi = false, is_mipi2 = false, is_hdmi = false;
-       struct drm_mode_config *mode_config = &dev->mode_config;
-       struct gma_encoder *gma_encoder = NULL;
-       uint64_t scalingType = DRM_MODE_SCALE_FULLSCREEN;
-       struct drm_encoder *encoder;
-       struct drm_connector *connector;
-       int timeout = 0;
-       int ret;
-
-       dev_dbg(dev->dev, "pipe = 0x%x\n", pipe);
-
-       ret = check_fb(crtc->primary->fb);
-       if (ret)
-               return ret;
-
-       dev_dbg(dev->dev, "adjusted_hdisplay = %d\n",
-                adjusted_mode->hdisplay);
-       dev_dbg(dev->dev, "adjusted_vdisplay = %d\n",
-                adjusted_mode->vdisplay);
-       dev_dbg(dev->dev, "adjusted_hsync_start = %d\n",
-                adjusted_mode->hsync_start);
-       dev_dbg(dev->dev, "adjusted_hsync_end = %d\n",
-                adjusted_mode->hsync_end);
-       dev_dbg(dev->dev, "adjusted_htotal = %d\n",
-                adjusted_mode->htotal);
-       dev_dbg(dev->dev, "adjusted_vsync_start = %d\n",
-                adjusted_mode->vsync_start);
-       dev_dbg(dev->dev, "adjusted_vsync_end = %d\n",
-                adjusted_mode->vsync_end);
-       dev_dbg(dev->dev, "adjusted_vtotal = %d\n",
-                adjusted_mode->vtotal);
-       dev_dbg(dev->dev, "adjusted_clock = %d\n",
-                adjusted_mode->clock);
-       dev_dbg(dev->dev, "hdisplay = %d\n",
-                mode->hdisplay);
-       dev_dbg(dev->dev, "vdisplay = %d\n",
-                mode->vdisplay);
-
-       if (!gma_power_begin(dev, true))
-               return 0;
-
-       memcpy(&gma_crtc->saved_mode, mode,
-                                       sizeof(struct drm_display_mode));
-       memcpy(&gma_crtc->saved_adjusted_mode, adjusted_mode,
-                                       sizeof(struct drm_display_mode));
-
-       list_for_each_entry(connector, &mode_config->connector_list, head) {
-               encoder = connector->encoder;
-               if (!encoder)
-                       continue;
-
-               if (encoder->crtc != crtc)
-                       continue;
-
-               gma_encoder = gma_attached_encoder(connector);
-
-               switch (gma_encoder->type) {
-               case INTEL_OUTPUT_MIPI:
-                       is_mipi = true;
-                       break;
-               case INTEL_OUTPUT_MIPI2:
-                       is_mipi2 = true;
-                       break;
-               case INTEL_OUTPUT_HDMI:
-                       is_hdmi = true;
-                       break;
-               }
-       }
-
-       /* Disable the VGA plane that we never use */
-       REG_WRITE(VGACNTRL, VGA_DISP_DISABLE);
-
-       /* Disable the panel fitter if it was on our pipe */
-       if (psb_intel_panel_fitter_pipe(dev) == pipe)
-               REG_WRITE(PFIT_CONTROL, 0);
-
-       /* pipesrc and dspsize control the size that is scaled from,
-        * which should always be the user's requested size.
-        */
-       if (pipe == 1) {
-               /* FIXME: To make HDMI display with 864x480 (TPO), 480x864
-                * (PYR) or 480x854 (TMD), set the sprite width/height and
-                * souce image size registers with the adjusted mode for
-                * pipe B.
-                */
-
-               /*
-                * The defined sprite rectangle must always be completely
-                * contained within the displayable area of the screen image
-                * (frame buffer).
-                */
-               REG_WRITE(map->size, ((min(mode->crtc_vdisplay, adjusted_mode->crtc_vdisplay) - 1) << 16)
-                               | (min(mode->crtc_hdisplay, adjusted_mode->crtc_hdisplay) - 1));
-               /* Set the CRTC with encoder mode. */
-               REG_WRITE(map->src, ((mode->crtc_hdisplay - 1) << 16)
-                                | (mode->crtc_vdisplay - 1));
-       } else {
-               REG_WRITE(map->size,
-                               ((mode->crtc_vdisplay - 1) << 16) |
-                                               (mode->crtc_hdisplay - 1));
-               REG_WRITE(map->src,
-                               ((mode->crtc_hdisplay - 1) << 16) |
-                                               (mode->crtc_vdisplay - 1));
-       }
-
-       REG_WRITE(map->pos, 0);
-
-       if (gma_encoder)
-               drm_object_property_get_value(&connector->base,
-                       dev->mode_config.scaling_mode_property, &scalingType);
-
-       if (scalingType == DRM_MODE_SCALE_NO_SCALE) {
-               /* Medfield doesn't have register support for centering so we
-                * need to mess with the h/vblank and h/vsync start and ends
-                * to get centering
-                */
-               int offsetX = 0, offsetY = 0;
-
-               offsetX = (adjusted_mode->crtc_hdisplay -
-                                       mode->crtc_hdisplay) / 2;
-               offsetY = (adjusted_mode->crtc_vdisplay -
-                                       mode->crtc_vdisplay) / 2;
-
-               REG_WRITE(map->htotal, (mode->crtc_hdisplay - 1) |
-                       ((adjusted_mode->crtc_htotal - 1) << 16));
-               REG_WRITE(map->vtotal, (mode->crtc_vdisplay - 1) |
-                       ((adjusted_mode->crtc_vtotal - 1) << 16));
-               REG_WRITE(map->hblank, (adjusted_mode->crtc_hblank_start -
-                                                               offsetX - 1) |
-                       ((adjusted_mode->crtc_hblank_end - offsetX - 1) << 16));
-               REG_WRITE(map->hsync, (adjusted_mode->crtc_hsync_start -
-                                                               offsetX - 1) |
-                       ((adjusted_mode->crtc_hsync_end - offsetX - 1) << 16));
-               REG_WRITE(map->vblank, (adjusted_mode->crtc_vblank_start -
-                                                               offsetY - 1) |
-                       ((adjusted_mode->crtc_vblank_end - offsetY - 1) << 16));
-               REG_WRITE(map->vsync, (adjusted_mode->crtc_vsync_start -
-                                                               offsetY - 1) |
-                       ((adjusted_mode->crtc_vsync_end - offsetY - 1) << 16));
-       } else {
-               REG_WRITE(map->htotal, (adjusted_mode->crtc_hdisplay - 1) |
-                       ((adjusted_mode->crtc_htotal - 1) << 16));
-               REG_WRITE(map->vtotal, (adjusted_mode->crtc_vdisplay - 1) |
-                       ((adjusted_mode->crtc_vtotal - 1) << 16));
-               REG_WRITE(map->hblank, (adjusted_mode->crtc_hblank_start - 1) |
-                       ((adjusted_mode->crtc_hblank_end - 1) << 16));
-               REG_WRITE(map->hsync, (adjusted_mode->crtc_hsync_start - 1) |
-                       ((adjusted_mode->crtc_hsync_end - 1) << 16));
-               REG_WRITE(map->vblank, (adjusted_mode->crtc_vblank_start - 1) |
-                       ((adjusted_mode->crtc_vblank_end - 1) << 16));
-               REG_WRITE(map->vsync, (adjusted_mode->crtc_vsync_start - 1) |
-                       ((adjusted_mode->crtc_vsync_end - 1) << 16));
-       }
-
-       /* Flush the plane changes */
-       {
-               const struct drm_crtc_helper_funcs *crtc_funcs =
-                   crtc->helper_private;
-               crtc_funcs->mode_set_base(crtc, x, y, old_fb);
-       }
-
-       /* setup pipeconf */
-       dev_priv->pipeconf[pipe] = PIPEACONF_ENABLE; /* FIXME_JLIU7 REG_READ(pipeconf_reg); */
-
-       /* Set up the display plane register */
-       dev_priv->dspcntr[pipe] = REG_READ(map->cntr);
-       dev_priv->dspcntr[pipe] |= pipe << DISPPLANE_SEL_PIPE_POS;
-       dev_priv->dspcntr[pipe] |= DISPLAY_PLANE_ENABLE;
-
-       if (is_mipi2)
-               goto mrst_crtc_mode_set_exit;
-       clk = adjusted_mode->clock;
-
-       if (is_hdmi) {
-               if ((ksel == KSEL_CRYSTAL_19) || (ksel == KSEL_BYPASS_19)) {
-                       refclk = 19200;
-
-                       if (is_mipi || is_mipi2)
-                               clk_n = 1, clk_p2 = 8;
-                       else if (is_hdmi)
-                               clk_n = 1, clk_p2 = 10;
-               } else if (ksel == KSEL_BYPASS_25) {
-                       refclk = 25000;
-
-                       if (is_mipi || is_mipi2)
-                               clk_n = 1, clk_p2 = 8;
-                       else if (is_hdmi)
-                               clk_n = 1, clk_p2 = 10;
-               } else if ((ksel == KSEL_BYPASS_83_100) &&
-                                       dev_priv->core_freq == 166) {
-                       refclk = 83000;
-
-                       if (is_mipi || is_mipi2)
-                               clk_n = 4, clk_p2 = 8;
-                       else if (is_hdmi)
-                               clk_n = 4, clk_p2 = 10;
-               } else if ((ksel == KSEL_BYPASS_83_100) &&
-                                       (dev_priv->core_freq == 100 ||
-                                       dev_priv->core_freq == 200)) {
-                       refclk = 100000;
-                       if (is_mipi || is_mipi2)
-                               clk_n = 4, clk_p2 = 8;
-                       else if (is_hdmi)
-                               clk_n = 4, clk_p2 = 10;
-               }
-
-               if (is_mipi)
-                       clk_byte = dev_priv->bpp / 8;
-               else if (is_mipi2)
-                       clk_byte = dev_priv->bpp2 / 8;
-
-               clk_tmp = clk * clk_n * clk_p2 * clk_byte;
-
-               dev_dbg(dev->dev, "clk = %d, clk_n = %d, clk_p2 = %d.\n",
-                                       clk, clk_n, clk_p2);
-               dev_dbg(dev->dev, "adjusted_mode->clock = %d, clk_tmp = %d.\n",
-                                       adjusted_mode->clock, clk_tmp);
-
-               ok = mdfldFindBestPLL(crtc, clk_tmp, refclk, &clock);
-
-               if (!ok) {
-                       DRM_ERROR
-                           ("mdfldFindBestPLL fail in mdfld_crtc_mode_set.\n");
-               } else {
-                       m_conv = mdfld_m_converts[(clock.m - MDFLD_M_MIN)];
-
-                       dev_dbg(dev->dev, "dot clock = %d,"
-                                "m = %d, p1 = %d, m_conv = %d.\n",
-                                       clock.dot, clock.m,
-                                       clock.p1, m_conv);
-               }
-
-               dpll = REG_READ(map->dpll);
-
-               if (dpll & DPLL_VCO_ENABLE) {
-                       dpll &= ~DPLL_VCO_ENABLE;
-                       REG_WRITE(map->dpll, dpll);
-                       REG_READ(map->dpll);
-
-                       /* FIXME jliu7 check the DPLL lock bit PIPEACONF[29] */
-                       /* FIXME_MDFLD PO - change 500 to 1 after PO */
-                       udelay(500);
-
-                       /* reset M1, N1 & P1 */
-                       REG_WRITE(map->fp0, 0);
-                       dpll &= ~MDFLD_P1_MASK;
-                       REG_WRITE(map->dpll, dpll);
-                       /* FIXME_MDFLD PO - change 500 to 1 after PO */
-                       udelay(500);
-               }
-
-               /* When ungating power of DPLL, needs to wait 0.5us before
-                * enable the VCO */
-               if (dpll & MDFLD_PWR_GATE_EN) {
-                       dpll &= ~MDFLD_PWR_GATE_EN;
-                       REG_WRITE(map->dpll, dpll);
-                       /* FIXME_MDFLD PO - change 500 to 1 after PO */
-                       udelay(500);
-               }
-               dpll = 0;
-
-               if (is_hdmi)
-                       dpll |= MDFLD_VCO_SEL;
-
-               fp = (clk_n / 2) << 16;
-               fp |= m_conv;
-
-               /* compute bitmask from p1 value */
-               dpll |= (1 << (clock.p1 - 2)) << 17;
-
-       } else {
-               dpll = 0x00800000;
-               fp = 0x000000c1;
-       }
-
-       REG_WRITE(map->fp0, fp);
-       REG_WRITE(map->dpll, dpll);
-       /* FIXME_MDFLD PO - change 500 to 1 after PO */
-       udelay(500);
-
-       dpll |= DPLL_VCO_ENABLE;
-       REG_WRITE(map->dpll, dpll);
-       REG_READ(map->dpll);
-
-       /* wait for DSI PLL to lock */
-       while (timeout < 20000 &&
-                       !(REG_READ(map->conf) & PIPECONF_DSIPLL_LOCK)) {
-               udelay(150);
-               timeout++;
-       }
-
-       if (is_mipi)
-               goto mrst_crtc_mode_set_exit;
-
-       dev_dbg(dev->dev, "is_mipi = 0x%x\n", is_mipi);
-
-       REG_WRITE(map->conf, dev_priv->pipeconf[pipe]);
-       REG_READ(map->conf);
-
-       /* Wait for for the pipe enable to take effect. */
-       REG_WRITE(map->cntr, dev_priv->dspcntr[pipe]);
-       gma_wait_for_vblank(dev);
-
-mrst_crtc_mode_set_exit:
-
-       gma_power_end(dev);
-
-       return 0;
-}
-
-const struct drm_crtc_helper_funcs mdfld_helper_funcs = {
-       .dpms = mdfld_crtc_dpms,
-       .mode_set = mdfld_crtc_mode_set,
-       .mode_set_base = mdfld__intel_pipe_set_base,
-       .prepare = gma_crtc_prepare,
-       .commit = gma_crtc_commit,
-};
diff --git a/drivers/gpu/drm/gma500/mdfld_output.c b/drivers/gpu/drm/gma500/mdfld_output.c
deleted file mode 100644 (file)
index c95966b..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c)  2010 Intel Corporation
- *
- * 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, sublicensen
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- * Authors:
- * Thomas Eaton <thomas.g.eaton@intel.com>
- * Scott Rowe <scott.m.rowe@intel.com>
-*/
-
-#include "mdfld_output.h"
-#include "mdfld_dsi_dpi.h"
-#include "mdfld_dsi_output.h"
-
-#include "tc35876x-dsi-lvds.h"
-
-int mdfld_get_panel_type(struct drm_device *dev, int pipe)
-{
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       return dev_priv->mdfld_panel_id;
-}
-
-static void mdfld_init_panel(struct drm_device *dev, int mipi_pipe,
-                                                               int p_type)
-{
-       switch (p_type) {
-       case TPO_VID:
-               mdfld_dsi_output_init(dev, mipi_pipe, &mdfld_tpo_vid_funcs);
-               break;
-       case TC35876X:
-               tc35876x_init(dev);
-               mdfld_dsi_output_init(dev, mipi_pipe, &mdfld_tc35876x_funcs);
-               break;
-       case TMD_VID:
-               mdfld_dsi_output_init(dev, mipi_pipe, &mdfld_tmd_vid_funcs);
-               break;
-       case HDMI:
-/*             if (dev_priv->mdfld_hdmi_present)
-                       mdfld_hdmi_init(dev, &dev_priv->mode_dev); */
-               break;
-       }
-}
-
-
-int mdfld_output_init(struct drm_device *dev)
-{
-       struct drm_psb_private *dev_priv = dev->dev_private;
-
-       /* FIXME: hardcoded for now */
-       dev_priv->mdfld_panel_id = TC35876X;
-       /* MIPI panel 1 */
-       mdfld_init_panel(dev, 0, dev_priv->mdfld_panel_id);
-       /* HDMI panel */
-       mdfld_init_panel(dev, 1, HDMI);
-       return 0;
-}
-
diff --git a/drivers/gpu/drm/gma500/mdfld_output.h b/drivers/gpu/drm/gma500/mdfld_output.h
deleted file mode 100644 (file)
index 37a516c..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c)  2010 Intel Corporation
- *
- * 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, sublicensen
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- * Authors:
- * Thomas Eaton <thomas.g.eaton@intel.com>
- * Scott Rowe <scott.m.rowe@intel.com>
-*/
-
-#ifndef MDFLD_OUTPUT_H
-#define MDFLD_OUTPUT_H
-
-#include "psb_drv.h"
-
-#define TPO_PANEL_WIDTH                84
-#define TPO_PANEL_HEIGHT       46
-#define TMD_PANEL_WIDTH                39
-#define TMD_PANEL_HEIGHT       71
-
-struct mdfld_dsi_config;
-
-enum panel_type {
-       TPO_VID,
-       TMD_VID,
-       HDMI,
-       TC35876X,
-};
-
-struct panel_info {
-       u32 width_mm;
-       u32 height_mm;
-       /* Other info */
-};
-
-struct panel_funcs {
-       const struct drm_encoder_helper_funcs *encoder_helper_funcs;
-       struct drm_display_mode * (*get_config_mode)(struct drm_device *);
-       int (*get_panel_info)(struct drm_device *, int, struct panel_info *);
-       int (*reset)(struct drm_device *, int);
-       void (*drv_ic_init)(struct mdfld_dsi_config *dsi_config, int pipe);
-};
-
-int mdfld_output_init(struct drm_device *dev);
-
-struct backlight_device *mdfld_get_backlight_device(void);
-int mdfld_set_brightness(struct backlight_device *bd);
-
-int mdfld_get_panel_type(struct drm_device *dev, int pipe);
-
-extern const struct drm_crtc_helper_funcs mdfld_helper_funcs;
-
-extern const struct panel_funcs mdfld_tmd_vid_funcs;
-extern const struct panel_funcs mdfld_tpo_vid_funcs;
-
-extern void mdfld_disable_crtc(struct drm_device *dev, int pipe);
-extern void mdfldWaitForPipeEnable(struct drm_device *dev, int pipe);
-extern void mdfldWaitForPipeDisable(struct drm_device *dev, int pipe);
-#endif
diff --git a/drivers/gpu/drm/gma500/mdfld_tmd_vid.c b/drivers/gpu/drm/gma500/mdfld_tmd_vid.c
deleted file mode 100644 (file)
index 25e897b..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright Â© 2010 Intel Corporation
- *
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- * Authors:
- * Jim Liu <jim.liu@intel.com>
- * Jackie Li<yaodong.li@intel.com>
- * Gideon Eaton <eaton.
- * Scott Rowe <scott.m.rowe@intel.com>
- */
-
-#include <linux/delay.h>
-
-#include "mdfld_dsi_dpi.h"
-#include "mdfld_dsi_pkg_sender.h"
-
-static struct drm_display_mode *tmd_vid_get_config_mode(struct drm_device *dev)
-{
-       struct drm_display_mode *mode;
-       struct drm_psb_private *dev_priv = dev->dev_private;
-       struct oaktrail_timing_info *ti = &dev_priv->gct_data.DTD;
-       bool use_gct = false; /*Disable GCT for now*/
-
-       mode = kzalloc(sizeof(*mode), GFP_KERNEL);
-       if (!mode)
-               return NULL;
-
-       if (use_gct) {
-               mode->hdisplay = (ti->hactive_hi << 8) | ti->hactive_lo;
-               mode->vdisplay = (ti->vactive_hi << 8) | ti->vactive_lo;
-               mode->hsync_start = mode->hdisplay + \
-                               ((ti->hsync_offset_hi << 8) | \
-                               ti->hsync_offset_lo);
-               mode->hsync_end = mode->hsync_start + \
-                               ((ti->hsync_pulse_width_hi << 8) | \
-                               ti->hsync_pulse_width_lo);
-               mode->htotal = mode->hdisplay + ((ti->hblank_hi << 8) | \
-                                                               ti->hblank_lo);
-               mode->vsync_start = \
-                       mode->vdisplay + ((ti->vsync_offset_hi << 8) | \
-                                               ti->vsync_offset_lo);
-               mode->vsync_end = \
-                       mode->vsync_start + ((ti->vsync_pulse_width_hi << 8) | \
-                                               ti->vsync_pulse_width_lo);
-               mode->vtotal = mode->vdisplay + \
-                               ((ti->vblank_hi << 8) | ti->vblank_lo);
-               mode->clock = ti->pixel_clock * 10;
-
-               dev_dbg(dev->dev, "hdisplay is %d\n", mode->hdisplay);
-               dev_dbg(dev->dev, "vdisplay is %d\n", mode->vdisplay);
-               dev_dbg(dev->dev, "HSS is %d\n", mode->hsync_start);
-               dev_dbg(dev->dev, "HSE is %d\n", mode->hsync_end);
-               dev_dbg(dev->dev, "htotal is %d\n", mode->htotal);
-               dev_dbg(dev->dev, "VSS is %d\n", mode->vsync_start);
-               dev_dbg(dev->dev, "VSE is %d\n", mode->vsync_end);
-               dev_dbg(dev->dev, "vtotal is %d\n", mode->vtotal);
-               dev_dbg(dev->dev, "clock is %d\n", mode->clock);
-       } else {
-               mode->hdisplay = 480;
-               mode->vdisplay = 854;
-               mode->hsync_start = 487;
-               mode->hsync_end = 490;
-               mode->htotal = 499;
-               mode->vsync_start = 861;
-               mode->vsync_end = 865;
-               mode->vtotal = 873;
-               mode->clock = 33264;
-       }
-
-       drm_mode_set_name(mode);
-       drm_mode_set_crtcinfo(mode, 0);
-
-       mode->type |= DRM_MODE_TYPE_PREFERRED;
-
-       return mode;
-}
-
-static int tmd_vid_get_panel_info(struct drm_device *dev,
-                               int pipe,
-                               struct panel_info *pi)
-{
-       if (!dev || !pi)
-               return -EINVAL;
-
-       pi->width_mm = TMD_PANEL_WIDTH;
-       pi->height_mm = TMD_PANEL_HEIGHT;
-
-       return 0;
-}
-
-/* ************************************************************************* *\
- * FUNCTION: mdfld_init_TMD_MIPI
- *
- * DESCRIPTION:  This function is called only by mrst_dsi_mode_set and
- *               restore_display_registers.  since this function does not
- *               acquire the mutex, it is important that the calling function
- *               does!
-\* ************************************************************************* */
-
-/* FIXME: make the below data u8 instead of u32; note byte order! */
-static u32 tmd_cmd_mcap_off[] = {0x000000b2};
-static u32 tmd_cmd_enable_lane_switch[] = {0x000101ef};
-static u32 tmd_cmd_set_lane_num[] = {0x006360ef};
-static u32 tmd_cmd_pushing_clock0[] = {0x00cc2fef};
-static u32 tmd_cmd_pushing_clock1[] = {0x00dd6eef};
-static u32 tmd_cmd_set_mode[] = {0x000000b3};
-static u32 tmd_cmd_set_sync_pulse_mode[] = {0x000961ef};
-static u32 tmd_cmd_set_column[] = {0x0100002a, 0x000000df};
-static u32 tmd_cmd_set_page[] = {0x0300002b, 0x00000055};
-static u32 tmd_cmd_set_video_mode[] = {0x00000153};
-/*no auto_bl,need add in furture*/
-static u32 tmd_cmd_enable_backlight[] = {0x00005ab4};
-static u32 tmd_cmd_set_backlight_dimming[] = {0x00000ebd};
-
-static void mdfld_dsi_tmd_drv_ic_init(struct mdfld_dsi_config *dsi_config,
-                                     int pipe)
-{
-       struct mdfld_dsi_pkg_sender *sender
-                       = mdfld_dsi_get_pkg_sender(dsi_config);
-
-       DRM_INFO("Enter mdfld init TMD MIPI display.\n");
-
-       if (!sender) {
-               DRM_ERROR("Cannot get sender\n");
-               return;
-       }
-
-       if (dsi_config->dvr_ic_inited)
-               return;
-
-       msleep(3);
-
-       /* FIXME: make the below data u8 instead of u32; note byte order! */
-
-       mdfld_dsi_send_gen_long(sender, (u8 *) tmd_cmd_mcap_off,
-                               sizeof(tmd_cmd_mcap_off), false);
-       mdfld_dsi_send_gen_long(sender, (u8 *) tmd_cmd_enable_lane_switch,
-                               sizeof(tmd_cmd_enable_lane_switch), false);
-       mdfld_dsi_send_gen_long(sender, (u8 *) tmd_cmd_set_lane_num,
-                               sizeof(tmd_cmd_set_lane_num), false);
-       mdfld_dsi_send_gen_long(sender, (u8 *) tmd_cmd_pushing_clock0,
-                               sizeof(tmd_cmd_pushing_clock0), false);
-       mdfld_dsi_send_gen_long(sender, (u8 *) tmd_cmd_pushing_clock1,
-                               sizeof(tmd_cmd_pushing_clock1), false);
-       mdfld_dsi_send_gen_long(sender, (u8 *) tmd_cmd_set_mode,
-                               sizeof(tmd_cmd_set_mode), false);
-       mdfld_dsi_send_gen_long(sender, (u8 *) tmd_cmd_set_sync_pulse_mode,
-                               sizeof(tmd_cmd_set_sync_pulse_mode), false);
-       mdfld_dsi_send_mcs_long(sender, (u8 *) tmd_cmd_set_column,
-                               sizeof(tmd_cmd_set_column), false);
-       mdfld_dsi_send_mcs_long(sender, (u8 *) tmd_cmd_set_page,
-                               sizeof(tmd_cmd_set_page), false);
-       mdfld_dsi_send_gen_long(sender, (u8 *) tmd_cmd_set_video_mode,
-                               sizeof(tmd_cmd_set_video_mode), false);
-       mdfld_dsi_send_gen_long(sender, (u8 *) tmd_cmd_enable_backlight,
-                               sizeof(tmd_cmd_enable_backlight), false);
-       mdfld_dsi_send_gen_long(sender, (u8 *) tmd_cmd_set_backlight_dimming,
-                               sizeof(tmd_cmd_set_backlight_dimming), false);
-
-       dsi_config->dvr_ic_inited = 1;
-}
-
-/*TPO DPI encoder helper funcs*/
-static const struct drm_encoder_helper_funcs
-                               mdfld_tpo_dpi_encoder_helper_funcs = {
-       .dpms = mdfld_dsi_dpi_dpms,
-       .mode_fixup = mdfld_dsi_dpi_mode_fixup,
-       .prepare = mdfld_dsi_dpi_prepare,
-       .mode_set = mdfld_dsi_dpi_mode_set,
-       .commit = mdfld_dsi_dpi_commit,
-};
-
-const struct panel_funcs mdfld_tmd_vid_funcs = {
-       .encoder_helper_funcs = &mdfld_tpo_dpi_encoder_helper_funcs,
-       .get_config_mode = &tmd_vid_get_config_mode,
-       .get_panel_info = tmd_vid_get_panel_info,
-       .reset = mdfld_dsi_panel_reset,
-       .drv_ic_init = mdfld_dsi_tmd_drv_ic_init,
-};
diff --git a/drivers/gpu/drm/gma500/mdfld_tpo_vid.c b/drivers/gpu/drm/gma500/mdfld_tpo_vid.c
deleted file mode 100644 (file)
index 1184597..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright Â© 2010 Intel Corporation
- *
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- * Authors:
- * jim liu <jim.liu@intel.com>
- * Jackie Li<yaodong.li@intel.com>
- */
-
-#include "mdfld_dsi_dpi.h"
-
-static struct drm_display_mode *tpo_vid_get_config_mode(struct drm_device *dev)
-{
-       struct drm_display_mode *mode;
-
-       mode = kzalloc(sizeof(*mode), GFP_KERNEL);
-       if (!mode)
-               return NULL;
-
-       mode->hdisplay = 864;
-       mode->vdisplay = 480;
-       mode->hsync_start = 873;
-       mode->hsync_end = 876;
-       mode->htotal = 887;
-       mode->vsync_start = 487;
-       mode->vsync_end = 490;
-       mode->vtotal = 499;
-       mode->clock = 33264;
-
-       drm_mode_set_name(mode);
-       drm_mode_set_crtcinfo(mode, 0);
-
-       mode->type |= DRM_MODE_TYPE_PREFERRED;
-
-       return mode;
-}
-
-static int tpo_vid_get_panel_info(struct drm_device *dev,
-                               int pipe,
-                               struct panel_info *pi)
-{
-       if (!dev || !pi)
-               return -EINVAL;
-
-       pi->width_mm = TPO_PANEL_WIDTH;
-       pi->height_mm = TPO_PANEL_HEIGHT;
-
-       return 0;
-}
-
-/*TPO DPI encoder helper funcs*/
-static const struct drm_encoder_helper_funcs
-                               mdfld_tpo_dpi_encoder_helper_funcs = {
-       .dpms = mdfld_dsi_dpi_dpms,
-       .mode_fixup = mdfld_dsi_dpi_mode_fixup,
-       .prepare = mdfld_dsi_dpi_prepare,
-       .mode_set = mdfld_dsi_dpi_mode_set,
-       .commit = mdfld_dsi_dpi_commit,
-};
-
-const struct panel_funcs mdfld_tpo_vid_funcs = {
-       .encoder_helper_funcs = &mdfld_tpo_dpi_encoder_helper_funcs,
-       .get_config_mode = &tpo_vid_get_config_mode,
-       .get_panel_info = tpo_vid_get_panel_info,
-};
index 13aff19..d856580 100644 (file)
@@ -48,7 +48,6 @@ static inline uint32_t psb_mmu_pd_index(uint32_t offset)
        return offset >> PSB_PDE_SHIFT;
 }
 
-#if defined(CONFIG_X86)
 static inline void psb_clflush(void *addr)
 {
        __asm__ __volatile__("clflush (%0)\n" : : "r"(addr) : "memory");
@@ -63,13 +62,6 @@ static inline void psb_mmu_clflush(struct psb_mmu_driver *driver, void *addr)
        psb_clflush(addr);
        mb();
 }
-#else
-
-static inline void psb_mmu_clflush(struct psb_mmu_driver *driver, void *addr)
-{;
-}
-
-#endif
 
 static void psb_mmu_flush_pd_locked(struct psb_mmu_driver *driver, int force)
 {
@@ -293,7 +285,6 @@ static struct psb_mmu_pt *psb_mmu_alloc_pt(struct psb_mmu_pd *pd)
        for (i = 0; i < (PAGE_SIZE / sizeof(uint32_t)); ++i)
                *ptes++ = pd->invalid_pte;
 
-#if defined(CONFIG_X86)
        if (pd->driver->has_clflush && pd->hw_context != -1) {
                mb();
                for (i = 0; i < clflush_count; ++i) {
@@ -302,7 +293,6 @@ static struct psb_mmu_pt *psb_mmu_alloc_pt(struct psb_mmu_pd *pd)
                }
                mb();
        }
-#endif
        kunmap_atomic(v);
        spin_unlock(lock);
 
@@ -459,7 +449,6 @@ struct psb_mmu_driver *psb_mmu_driver_init(struct drm_device *dev,
 
        driver->has_clflush = 0;
 
-#if defined(CONFIG_X86)
        if (boot_cpu_has(X86_FEATURE_CLFLUSH)) {
                uint32_t tfms, misc, cap0, cap4, clflush_size;
 
@@ -476,7 +465,6 @@ struct psb_mmu_driver *psb_mmu_driver_init(struct drm_device *dev,
                driver->clflush_mask = driver->clflush_add - 1;
                driver->clflush_mask = ~driver->clflush_mask;
        }
-#endif
 
        up_write(&driver->sem);
        return driver;
@@ -486,7 +474,6 @@ out_err1:
        return NULL;
 }
 
-#if defined(CONFIG_X86)
 static void psb_mmu_flush_ptes(struct psb_mmu_pd *pd, unsigned long address,
                               uint32_t num_pages, uint32_t desired_tile_stride,
                               uint32_t hw_tile_stride)
@@ -534,14 +521,6 @@ static void psb_mmu_flush_ptes(struct psb_mmu_pd *pd, unsigned long address,
        }
        mb();
 }
-#else
-static void psb_mmu_flush_ptes(struct psb_mmu_pd *pd, unsigned long address,
-                              uint32_t num_pages, uint32_t desired_tile_stride,
-                              uint32_t hw_tile_stride)
-{
-       drm_ttm_cache_flush();
-}
-#endif
 
 void psb_mmu_remove_pfn_sequence(struct psb_mmu_pd *pd,
                                 unsigned long address, uint32_t num_pages)
index a19f60d..0bcab06 100644 (file)
@@ -46,13 +46,12 @@ static int psb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
  * PowerVR SGX535    - Poulsbo    - Intel GMA 500, Intel Atom Z5xx
  * PowerVR SGX535    - Moorestown - Intel GMA 600
  * PowerVR SGX535    - Oaktrail   - Intel GMA 600, Intel Atom Z6xx, E6xx
- * PowerVR SGX540    - Medfield   - Intel Atom Z2460
- * PowerVR SGX544MP2 - Medfield   -
  * PowerVR SGX545    - Cedartrail - Intel GMA 3600, Intel Atom D2500, N2600
  * PowerVR SGX545    - Cedartrail - Intel GMA 3650, Intel Atom D2550, D2700,
  *                                  N2800
  */
 static const struct pci_device_id pciidlist[] = {
+       /* Poulsbo */
        { 0x8086, 0x8108, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &psb_chip_ops },
        { 0x8086, 0x8109, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &psb_chip_ops },
 #if defined(CONFIG_DRM_GMA600)
@@ -66,17 +65,7 @@ static const struct pci_device_id pciidlist[] = {
        { 0x8086, 0x4107, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &oaktrail_chip_ops },
        { 0x8086, 0x4108, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &oaktrail_chip_ops },
 #endif
-#if defined(CONFIG_DRM_MEDFIELD)
-       { 0x8086, 0x0130, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &mdfld_chip_ops },
-       { 0x8086, 0x0131, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &mdfld_chip_ops },
-       { 0x8086, 0x0132, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &mdfld_chip_ops },
-       { 0x8086, 0x0133, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &mdfld_chip_ops },
-       { 0x8086, 0x0134, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &mdfld_chip_ops },
-       { 0x8086, 0x0135, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &mdfld_chip_ops },
-       { 0x8086, 0x0136, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &mdfld_chip_ops },
-       { 0x8086, 0x0137, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &mdfld_chip_ops },
-#endif
-#if defined(CONFIG_DRM_GMA3600)
+       /* Cedartrail */
        { 0x8086, 0x0be0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops },
        { 0x8086, 0x0be1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops },
        { 0x8086, 0x0be2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops },
@@ -93,7 +82,6 @@ static const struct pci_device_id pciidlist[] = {
        { 0x8086, 0x0bed, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops },
        { 0x8086, 0x0bee, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops },
        { 0x8086, 0x0bef, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops },
-#endif
        { 0, }
 };
 MODULE_DEVICE_TABLE(pci, pciidlist);
index d303f82..020a71b 100644 (file)
@@ -40,19 +40,16 @@ enum {
        CHIP_PSB_8108 = 0,              /* Poulsbo */
        CHIP_PSB_8109 = 1,              /* Poulsbo */
        CHIP_MRST_4100 = 2,             /* Moorestown/Oaktrail */
-       CHIP_MFLD_0130 = 3,             /* Medfield */
 };
 
 #define IS_PSB(drm) ((to_pci_dev((drm)->dev)->device & 0xfffe) == 0x8108)
 #define IS_MRST(drm) ((to_pci_dev((drm)->dev)->device & 0xfff0) == 0x4100)
-#define IS_MFLD(drm) ((to_pci_dev((drm)->dev)->device & 0xfff8) == 0x0130)
 #define IS_CDV(drm) ((to_pci_dev((drm)->dev)->device & 0xfff0) == 0x0be0)
 
 /* Hardware offsets */
 #define PSB_VDC_OFFSET          0x00000000
 #define PSB_VDC_SIZE            0x000080000
 #define MRST_MMIO_SIZE          0x0000C0000
-#define MDFLD_MMIO_SIZE          0x000100000
 #define PSB_SGX_SIZE            0x8000
 #define PSB_SGX_OFFSET          0x00040000
 #define MRST_SGX_OFFSET                 0x00080000
@@ -109,8 +106,6 @@ enum {
 #define _PSB_DPST_PIPEA_FLAG      (1<<6)
 #define _PSB_PIPEA_EVENT_FLAG     (1<<6)
 #define _PSB_VSYNC_PIPEA_FLAG    (1<<7)
-#define _MDFLD_MIPIA_FLAG        (1<<16)
-#define _MDFLD_MIPIC_FLAG        (1<<17)
 #define _PSB_IRQ_DISP_HOTSYNC    (1<<17)
 #define _PSB_IRQ_SGX_FLAG        (1<<18)
 #define _PSB_IRQ_MSVDX_FLAG      (1<<19)
@@ -119,13 +114,6 @@ enum {
 #define _PSB_PIPE_EVENT_FLAG   (_PSB_VSYNC_PIPEA_FLAG | \
                                 _PSB_VSYNC_PIPEB_FLAG)
 
-/* This flag includes all the display IRQ bits excepts the vblank irqs. */
-#define _MDFLD_DISP_ALL_IRQ_FLAG (_MDFLD_PIPEC_EVENT_FLAG | \
-                                 _MDFLD_PIPEB_EVENT_FLAG | \
-                                 _PSB_PIPEA_EVENT_FLAG | \
-                                 _PSB_VSYNC_PIPEA_FLAG | \
-                                 _MDFLD_MIPIA_FLAG | \
-                                 _MDFLD_MIPIC_FLAG)
 #define PSB_INT_IDENTITY_R       0x20A4
 #define PSB_INT_MASK_R           0x20A8
 #define PSB_INT_ENABLE_R         0x20A0
@@ -191,25 +179,6 @@ enum {
 #define PSB_WATCHDOG_DELAY (HZ * 2)
 #define PSB_LID_DELAY (HZ / 10)
 
-#define MDFLD_PNW_B0 0x04
-#define MDFLD_PNW_C0 0x08
-
-#define MDFLD_DSR_2D_3D_0      (1 << 0)
-#define MDFLD_DSR_2D_3D_2      (1 << 1)
-#define MDFLD_DSR_CURSOR_0     (1 << 2)
-#define MDFLD_DSR_CURSOR_2     (1 << 3)
-#define MDFLD_DSR_OVERLAY_0    (1 << 4)
-#define MDFLD_DSR_OVERLAY_2    (1 << 5)
-#define MDFLD_DSR_MIPI_CONTROL (1 << 6)
-#define MDFLD_DSR_DAMAGE_MASK_0        ((1 << 0) | (1 << 2) | (1 << 4))
-#define MDFLD_DSR_DAMAGE_MASK_2        ((1 << 1) | (1 << 3) | (1 << 5))
-#define MDFLD_DSR_2D_3D        (MDFLD_DSR_2D_3D_0 | MDFLD_DSR_2D_3D_2)
-
-#define MDFLD_DSR_RR           45
-#define MDFLD_DPU_ENABLE       (1 << 31)
-#define MDFLD_DSR_FULLSCREEN   (1 << 30)
-#define MDFLD_DSR_DELAY                (HZ / MDFLD_DSR_RR)
-
 #define PSB_PWR_STATE_ON               1
 #define PSB_PWR_STATE_OFF              2
 
@@ -382,16 +351,6 @@ struct psb_state {
        uint32_t savePWM_CONTROL_LOGIC;
 };
 
-struct medfield_state {
-       uint32_t saveMIPI;
-       uint32_t saveMIPI_C;
-
-       uint32_t savePFIT_CONTROL;
-       uint32_t savePFIT_PGM_RATIOS;
-       uint32_t saveHDMIPHYMISCCTL;
-       uint32_t saveHDMIB_CONTROL;
-};
-
 struct cdv_state {
        uint32_t saveDSPCLK_GATE_D;
        uint32_t saveRAMCLK_GATE_D;
@@ -417,7 +376,6 @@ struct psb_save_area {
        uint32_t saveVBT;
        union {
                struct psb_state psb;
-               struct medfield_state mdfld;
                struct cdv_state cdv;
        };
        uint32_t saveBLC_PWM_CTL2;
@@ -590,8 +548,6 @@ struct drm_psb_private {
        u32 pipeconf[3];
        u32 dspcntr[3];
 
-       int mdfld_panel_id;
-
        bool dplla_96mhz;       /* DPLL data from the VBT */
 
        struct {
@@ -737,9 +693,6 @@ extern const struct psb_ops psb_chip_ops;
 /* oaktrail_device.c */
 extern const struct psb_ops oaktrail_chip_ops;
 
-/* mdlfd_device.c */
-extern const struct psb_ops mdfld_chip_ops;
-
 /* cdv_device.c */
 extern const struct psb_ops cdv_chip_ops;
 
@@ -779,25 +732,6 @@ static inline void MRST_MSG_WRITE32(int domain, uint port, uint offset,
        pci_write_config_dword(pci_root, 0xD0, mcr);
        pci_dev_put(pci_root);
 }
-static inline u32 MDFLD_MSG_READ32(int domain, uint port, uint offset)
-{
-       int mcr = (0x10<<24) | (port << 16) | (offset << 8);
-       uint32_t ret_val = 0;
-       struct pci_dev *pci_root = pci_get_domain_bus_and_slot(domain, 0, 0);
-       pci_write_config_dword(pci_root, 0xD0, mcr);
-       pci_read_config_dword(pci_root, 0xD4, &ret_val);
-       pci_dev_put(pci_root);
-       return ret_val;
-}
-static inline void MDFLD_MSG_WRITE32(int domain, uint port, uint offset,
-                                    u32 value)
-{
-       int mcr = (0x11<<24) | (port << 16) | (offset << 8) | 0xF0;
-       struct pci_dev *pci_root = pci_get_domain_bus_and_slot(domain, 0, 0);
-       pci_write_config_dword(pci_root, 0xD4, value);
-       pci_write_config_dword(pci_root, 0xD0, mcr);
-       pci_dev_put(pci_root);
-}
 
 static inline uint32_t REGISTER_READ(struct drm_device *dev, uint32_t reg)
 {
index 835cc92..364ea8f 100644 (file)
@@ -595,7 +595,7 @@ struct dpst_guardband {
 #define PIPE_PIXEL_MASK                0x00ffffff
 #define PIPE_PIXEL_SHIFT       0
 
-#define FW_BLC_SELF            0x20e0 
+#define FW_BLC_SELF            0x20e0
 #define FW_BLC_SELF_EN          (1<<15)
 
 #define DSPARB                 0x70030
@@ -789,17 +789,9 @@ struct dpst_guardband {
  * MOORESTOWN delta registers
  */
 #define MRST_DPLL_A            0x0f014
-#define MDFLD_DPLL_B           0x0f018
-#define MDFLD_INPUT_REF_SEL            (1 << 14)
-#define MDFLD_VCO_SEL                  (1 << 16)
 #define DPLLA_MODE_LVDS                        (2 << 26)       /* mrst */
-#define MDFLD_PLL_LATCHEN              (1 << 28)
-#define MDFLD_PWR_GATE_EN              (1 << 30)
-#define MDFLD_P1_MASK                  (0x1FF << 17)
 #define MRST_FPA0              0x0f040
 #define MRST_FPA1              0x0f044
-#define MDFLD_DPLL_DIV0                0x0f048
-#define MDFLD_DPLL_DIV1                0x0f04c
 #define MRST_PERF_MODE         0x020f4
 
 /*
@@ -848,7 +840,6 @@ struct dpst_guardband {
 
 #define MRST_DSPABASE          0x7019c
 #define MRST_DSPBBASE          0x7119c
-#define MDFLD_DSPCBASE         0x7219c
 
 /*
  * Moorestown registers.
@@ -930,7 +921,6 @@ struct dpst_guardband {
 #define DEVICE_RESET_REG               0xb01C
 #define DPI_RESOLUTION_REG             0xb020
 #define RES_V_POS                              0x10
-#define DBI_RESOLUTION_REG             0xb024 /* Reserved for MDFLD */
 #define HORIZ_SYNC_PAD_COUNT_REG       0xb028
 #define HORIZ_BACK_PORCH_COUNT_REG     0xb02C
 #define HORIZ_FRONT_PORCH_COUNT_REG    0xb030
index 5cceea9..ae9b100 100644 (file)
@@ -10,7 +10,6 @@
 
 #include <drm/drm_vblank.h>
 
-#include "mdfld_output.h"
 #include "power.h"
 #include "psb_drv.h"
 #include "psb_intel_reg.h"
@@ -164,8 +163,7 @@ static void mid_pipe_event_handler(struct drm_device *dev, int pipe)
                "%s, can't clear status bits for pipe %d, its value = 0x%x.\n",
                __func__, pipe, PSB_RVDC32(pipe_stat_reg));
 
-       if (pipe_stat_val & PIPE_VBLANK_STATUS ||
-           (IS_MFLD(dev) && pipe_stat_val & PIPE_TE_STATUS)) {
+       if (pipe_stat_val & PIPE_VBLANK_STATUS) {
                struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe);
                struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
                unsigned long flags;
@@ -263,11 +261,6 @@ irqreturn_t psb_irq_handler(int irq, void *arg)
        if (vdc_stat & (_PSB_PIPE_EVENT_FLAG|_PSB_IRQ_ASLE))
                dsp_int = 1;
 
-       /* FIXME: Handle Medfield
-       if (vdc_stat & _MDFLD_DISP_ALL_IRQ_FLAG)
-               dsp_int = 1;
-       */
-
        if (vdc_stat & _PSB_IRQ_SGX_FLAG)
                sgx_int = 1;
        if (vdc_stat & _PSB_IRQ_DISP_HOTSYNC)
@@ -325,13 +318,6 @@ void psb_irq_preinstall(struct drm_device *dev)
        if (dev->vblank[1].enabled)
                dev_priv->vdc_irq_mask |= _PSB_VSYNC_PIPEB_FLAG;
 
-       /* FIXME: Handle Medfield irq mask
-       if (dev->vblank[1].enabled)
-               dev_priv->vdc_irq_mask |= _MDFLD_PIPEB_EVENT_FLAG;
-       if (dev->vblank[2].enabled)
-               dev_priv->vdc_irq_mask |= _MDFLD_PIPEC_EVENT_FLAG;
-       */
-
        /* Revisit this area - want per device masks ? */
        if (dev_priv->ops->hotplug)
                dev_priv->vdc_irq_mask |= _PSB_IRQ_DISP_HOTSYNC;
@@ -504,11 +490,6 @@ int psb_enable_vblank(struct drm_crtc *crtc)
        uint32_t reg_val = 0;
        uint32_t pipeconf_reg = mid_pipeconf(pipe);
 
-       /* Medfield is different - we should perhaps extract out vblank
-          and blacklight etc ops */
-       if (IS_MFLD(dev))
-               return mdfld_enable_te(dev, pipe);
-
        if (gma_power_begin(dev, false)) {
                reg_val = REG_READ(pipeconf_reg);
                gma_power_end(dev);
@@ -543,8 +524,6 @@ void psb_disable_vblank(struct drm_crtc *crtc)
        struct drm_psb_private *dev_priv = dev->dev_private;
        unsigned long irqflags;
 
-       if (IS_MFLD(dev))
-               mdfld_disable_te(dev, pipe);
        spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
 
        if (pipe == 0)
@@ -559,55 +538,6 @@ void psb_disable_vblank(struct drm_crtc *crtc)
        spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
 }
 
-/*
- * It is used to enable TE interrupt
- */
-int mdfld_enable_te(struct drm_device *dev, int pipe)
-{
-       struct drm_psb_private *dev_priv =
-               (struct drm_psb_private *) dev->dev_private;
-       unsigned long irqflags;
-       uint32_t reg_val = 0;
-       uint32_t pipeconf_reg = mid_pipeconf(pipe);
-
-       if (gma_power_begin(dev, false)) {
-               reg_val = REG_READ(pipeconf_reg);
-               gma_power_end(dev);
-       }
-
-       if (!(reg_val & PIPEACONF_ENABLE))
-               return -EINVAL;
-
-       spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
-
-       mid_enable_pipe_event(dev_priv, pipe);
-       psb_enable_pipestat(dev_priv, pipe, PIPE_TE_ENABLE);
-
-       spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
-
-       return 0;
-}
-
-/*
- * It is used to disable TE interrupt
- */
-void mdfld_disable_te(struct drm_device *dev, int pipe)
-{
-       struct drm_psb_private *dev_priv =
-               (struct drm_psb_private *) dev->dev_private;
-       unsigned long irqflags;
-
-       if (!dev_priv->dsr_enable)
-               return;
-
-       spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
-
-       mid_disable_pipe_event(dev_priv, pipe);
-       psb_disable_pipestat(dev_priv, pipe, PIPE_TE_ENABLE);
-
-       spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
-}
-
 /* Called from drm generic code, passed a 'crtc', which
  * we use as a pipe index
  */
index 4f73998..1b577fa 100644 (file)
@@ -31,6 +31,4 @@ int  psb_enable_vblank(struct drm_crtc *crtc);
 void psb_disable_vblank(struct drm_crtc *crtc);
 u32  psb_get_vblank_counter(struct drm_crtc *crtc);
 
-int mdfld_enable_te(struct drm_device *dev, int pipe);
-void mdfld_disable_te(struct drm_device *dev, int pipe);
 #endif /* _PSB_IRQ_H_ */
index fb22bac..2a229a0 100644 (file)
 #define PSB_PM_SSC                     0x20
 #define PSB_PM_SSS                     0x30
 #define PSB_PWRGT_DISPLAY_MASK         0xc /*on a different BA than video/gfx*/
-#define MDFLD_PWRGT_DISPLAY_A_CNTR     0x0000000c
-#define MDFLD_PWRGT_DISPLAY_B_CNTR     0x0000c000
-#define MDFLD_PWRGT_DISPLAY_C_CNTR     0x00030000
-#define MDFLD_PWRGT_DISP_MIPI_CNTR     0x000c0000
-#define MDFLD_PWRGT_DISPLAY_CNTR    (MDFLD_PWRGT_DISPLAY_A_CNTR | MDFLD_PWRGT_DISPLAY_B_CNTR | MDFLD_PWRGT_DISPLAY_C_CNTR | MDFLD_PWRGT_DISP_MIPI_CNTR) /* 0x000fc00c */
 /* Display SSS register bits are different in A0 vs. B0 */
 #define PSB_PWRGT_GFX_MASK             0x3
-#define MDFLD_PWRGT_DISPLAY_A_STS      0x000000c0
-#define MDFLD_PWRGT_DISPLAY_B_STS      0x00000300
-#define MDFLD_PWRGT_DISPLAY_C_STS      0x00000c00
 #define PSB_PWRGT_GFX_MASK_B0          0xc3
-#define MDFLD_PWRGT_DISPLAY_A_STS_B0   0x0000000c
-#define MDFLD_PWRGT_DISPLAY_B_STS_B0   0x0000c000
-#define MDFLD_PWRGT_DISPLAY_C_STS_B0   0x00030000
-#define MDFLD_PWRGT_DISP_MIPI_STS      0x000c0000
-#define MDFLD_PWRGT_DISPLAY_STS_A0    (MDFLD_PWRGT_DISPLAY_A_STS | MDFLD_PWRGT_DISPLAY_B_STS | MDFLD_PWRGT_DISPLAY_C_STS | MDFLD_PWRGT_DISP_MIPI_STS) /* 0x000fc00c */
-#define MDFLD_PWRGT_DISPLAY_STS_B0    (MDFLD_PWRGT_DISPLAY_A_STS_B0 | MDFLD_PWRGT_DISPLAY_B_STS_B0 | MDFLD_PWRGT_DISPLAY_C_STS_B0 | MDFLD_PWRGT_DISP_MIPI_STS) /* 0x000fc00c */
 #endif
diff --git a/drivers/gpu/drm/gma500/tc35876x-dsi-lvds.c b/drivers/gpu/drm/gma500/tc35876x-dsi-lvds.c
deleted file mode 100644 (file)
index 99d2ffc..0000000
+++ /dev/null
@@ -1,805 +0,0 @@
-/*
- * Copyright Â© 2011 Intel Corporation
- *
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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 <linux/delay.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/gpio/consumer.h>
-
-#include <asm/intel_scu_ipc.h>
-
-#include "mdfld_dsi_dpi.h"
-#include "mdfld_dsi_pkg_sender.h"
-#include "mdfld_output.h"
-#include "tc35876x-dsi-lvds.h"
-
-static struct i2c_client *tc35876x_client;
-static struct i2c_client *cmi_lcd_i2c_client;
-/* Panel GPIOs */
-static struct gpio_desc *bridge_reset;
-static struct gpio_desc *bridge_bl_enable;
-static struct gpio_desc *backlight_voltage;
-
-
-#define FLD_MASK(start, end)   (((1 << ((start) - (end) + 1)) - 1) << (end))
-#define FLD_VAL(val, start, end) (((val) << (end)) & FLD_MASK(start, end))
-
-/* DSI D-PHY Layer Registers */
-#define D0W_DPHYCONTTX         0x0004
-#define CLW_DPHYCONTRX         0x0020
-#define D0W_DPHYCONTRX         0x0024
-#define D1W_DPHYCONTRX         0x0028
-#define D2W_DPHYCONTRX         0x002C
-#define D3W_DPHYCONTRX         0x0030
-#define COM_DPHYCONTRX         0x0038
-#define CLW_CNTRL              0x0040
-#define D0W_CNTRL              0x0044
-#define D1W_CNTRL              0x0048
-#define D2W_CNTRL              0x004C
-#define D3W_CNTRL              0x0050
-#define DFTMODE_CNTRL          0x0054
-
-/* DSI PPI Layer Registers */
-#define PPI_STARTPPI           0x0104
-#define PPI_BUSYPPI            0x0108
-#define PPI_LINEINITCNT                0x0110
-#define PPI_LPTXTIMECNT                0x0114
-#define PPI_LANEENABLE         0x0134
-#define PPI_TX_RX_TA           0x013C
-#define PPI_CLS_ATMR           0x0140
-#define PPI_D0S_ATMR           0x0144
-#define PPI_D1S_ATMR           0x0148
-#define PPI_D2S_ATMR           0x014C
-#define PPI_D3S_ATMR           0x0150
-#define PPI_D0S_CLRSIPOCOUNT   0x0164
-#define PPI_D1S_CLRSIPOCOUNT   0x0168
-#define PPI_D2S_CLRSIPOCOUNT   0x016C
-#define PPI_D3S_CLRSIPOCOUNT   0x0170
-#define CLS_PRE                        0x0180
-#define D0S_PRE                        0x0184
-#define D1S_PRE                        0x0188
-#define D2S_PRE                        0x018C
-#define D3S_PRE                        0x0190
-#define CLS_PREP               0x01A0
-#define D0S_PREP               0x01A4
-#define D1S_PREP               0x01A8
-#define D2S_PREP               0x01AC
-#define D3S_PREP               0x01B0
-#define CLS_ZERO               0x01C0
-#define D0S_ZERO               0x01C4
-#define D1S_ZERO               0x01C8
-#define D2S_ZERO               0x01CC
-#define D3S_ZERO               0x01D0
-#define PPI_CLRFLG             0x01E0
-#define PPI_CLRSIPO            0x01E4
-#define HSTIMEOUT              0x01F0
-#define HSTIMEOUTENABLE                0x01F4
-
-/* DSI Protocol Layer Registers */
-#define DSI_STARTDSI           0x0204
-#define DSI_BUSYDSI            0x0208
-#define DSI_LANEENABLE         0x0210
-#define DSI_LANESTATUS0                0x0214
-#define DSI_LANESTATUS1                0x0218
-#define DSI_INTSTATUS          0x0220
-#define DSI_INTMASK            0x0224
-#define DSI_INTCLR             0x0228
-#define DSI_LPTXTO             0x0230
-
-/* DSI General Registers */
-#define DSIERRCNT              0x0300
-
-/* DSI Application Layer Registers */
-#define APLCTRL                        0x0400
-#define RDPKTLN                        0x0404
-
-/* Video Path Registers */
-#define VPCTRL                 0x0450
-#define HTIM1                  0x0454
-#define HTIM2                  0x0458
-#define VTIM1                  0x045C
-#define VTIM2                  0x0460
-#define VFUEN                  0x0464
-
-/* LVDS Registers */
-#define LVMX0003               0x0480
-#define LVMX0407               0x0484
-#define LVMX0811               0x0488
-#define LVMX1215               0x048C
-#define LVMX1619               0x0490
-#define LVMX2023               0x0494
-#define LVMX2427               0x0498
-#define LVCFG                  0x049C
-#define LVPHY0                 0x04A0
-#define LVPHY1                 0x04A4
-
-/* System Registers */
-#define SYSSTAT                        0x0500
-#define SYSRST                 0x0504
-
-/* GPIO Registers */
-/*#define GPIOC                        0x0520*/
-#define GPIOO                  0x0524
-#define GPIOI                  0x0528
-
-/* I2C Registers */
-#define I2CTIMCTRL             0x0540
-#define I2CMADDR               0x0544
-#define WDATAQ                 0x0548
-#define RDATAQ                 0x054C
-
-/* Chip/Rev Registers */
-#define IDREG                  0x0580
-
-/* Debug Registers */
-#define DEBUG00                        0x05A0
-#define DEBUG01                        0x05A4
-
-/* Panel CABC registers */
-#define PANEL_PWM_CONTROL      0x90
-#define PANEL_FREQ_DIVIDER_HI  0x91
-#define PANEL_FREQ_DIVIDER_LO  0x92
-#define PANEL_DUTY_CONTROL     0x93
-#define PANEL_MODIFY_RGB       0x94
-#define PANEL_FRAMERATE_CONTROL        0x96
-#define PANEL_PWM_MIN          0x97
-#define PANEL_PWM_REF          0x98
-#define PANEL_PWM_MAX          0x99
-#define PANEL_ALLOW_DISTORT    0x9A
-#define PANEL_BYPASS_PWMI      0x9B
-
-/* Panel color management registers */
-#define PANEL_CM_ENABLE                0x700
-#define PANEL_CM_HUE           0x701
-#define PANEL_CM_SATURATION    0x702
-#define PANEL_CM_INTENSITY     0x703
-#define PANEL_CM_BRIGHTNESS    0x704
-#define PANEL_CM_CE_ENABLE     0x705
-#define PANEL_CM_PEAK_EN       0x710
-#define PANEL_CM_GAIN          0x711
-#define PANEL_CM_HUETABLE_START        0x730
-#define PANEL_CM_HUETABLE_END  0x747 /* inclusive */
-
-/* Input muxing for registers LVMX0003...LVMX2427 */
-enum {
-       INPUT_R0,       /* 0 */
-       INPUT_R1,
-       INPUT_R2,
-       INPUT_R3,
-       INPUT_R4,
-       INPUT_R5,
-       INPUT_R6,
-       INPUT_R7,
-       INPUT_G0,       /* 8 */
-       INPUT_G1,
-       INPUT_G2,
-       INPUT_G3,
-       INPUT_G4,
-       INPUT_G5,
-       INPUT_G6,
-       INPUT_G7,
-       INPUT_B0,       /* 16 */
-       INPUT_B1,
-       INPUT_B2,
-       INPUT_B3,
-       INPUT_B4,
-       INPUT_B5,
-       INPUT_B6,
-       INPUT_B7,
-       INPUT_HSYNC,    /* 24 */
-       INPUT_VSYNC,
-       INPUT_DE,
-       LOGIC_0,
-       /* 28...31 undefined */
-};
-
-#define INPUT_MUX(lvmx03, lvmx02, lvmx01, lvmx00)              \
-       (FLD_VAL(lvmx03, 29, 24) | FLD_VAL(lvmx02, 20, 16) |    \
-       FLD_VAL(lvmx01, 12, 8) | FLD_VAL(lvmx00, 4, 0))
-
-/**
- * tc35876x_regw - Write DSI-LVDS bridge register using I2C
- * @client: struct i2c_client to use
- * @reg: register address
- * @value: value to write
- *
- * Returns 0 on success, or a negative error value.
- */
-static int tc35876x_regw(struct i2c_client *client, u16 reg, u32 value)
-{
-       int r;
-       u8 tx_data[] = {
-               /* NOTE: Register address big-endian, data little-endian. */
-               (reg >> 8) & 0xff,
-               reg & 0xff,
-               value & 0xff,
-               (value >> 8) & 0xff,
-               (value >> 16) & 0xff,
-               (value >> 24) & 0xff,
-       };
-       struct i2c_msg msgs[] = {
-               {
-                       .addr = client->addr,
-                       .flags = 0,
-                       .buf = tx_data,
-                       .len = ARRAY_SIZE(tx_data),
-               },
-       };
-
-       r = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
-       if (r < 0) {
-               dev_err(&client->dev, "%s: reg 0x%04x val 0x%08x error %d\n",
-                       __func__, reg, value, r);
-               return r;
-       }
-
-       if (r < ARRAY_SIZE(msgs)) {
-               dev_err(&client->dev, "%s: reg 0x%04x val 0x%08x msgs %d\n",
-                       __func__, reg, value, r);
-               return -EAGAIN;
-       }
-
-       dev_dbg(&client->dev, "%s: reg 0x%04x val 0x%08x\n",
-                       __func__, reg, value);
-
-       return 0;
-}
-
-/**
- * tc35876x_regr - Read DSI-LVDS bridge register using I2C
- * @client: struct i2c_client to use
- * @reg: register address
- * @value: pointer for storing the value
- *
- * Returns 0 on success, or a negative error value.
- */
-static int tc35876x_regr(struct i2c_client *client, u16 reg, u32 *value)
-{
-       int r;
-       u8 tx_data[] = {
-               (reg >> 8) & 0xff,
-               reg & 0xff,
-       };
-       u8 rx_data[4];
-       struct i2c_msg msgs[] = {
-               {
-                       .addr = client->addr,
-                       .flags = 0,
-                       .buf = tx_data,
-                       .len = ARRAY_SIZE(tx_data),
-               },
-               {
-                       .addr = client->addr,
-                       .flags = I2C_M_RD,
-                       .buf = rx_data,
-                       .len = ARRAY_SIZE(rx_data),
-                },
-       };
-
-       r = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
-       if (r < 0) {
-               dev_err(&client->dev, "%s: reg 0x%04x error %d\n", __func__,
-                       reg, r);
-               return r;
-       }
-
-       if (r < ARRAY_SIZE(msgs)) {
-               dev_err(&client->dev, "%s: reg 0x%04x msgs %d\n", __func__,
-                       reg, r);
-               return -EAGAIN;
-       }
-
-       *value = rx_data[0] << 24 | rx_data[1] << 16 |
-               rx_data[2] << 8 | rx_data[3];
-
-       dev_dbg(&client->dev, "%s: reg 0x%04x value 0x%08x\n", __func__,
-               reg, *value);
-
-       return 0;
-}
-
-void tc35876x_set_bridge_reset_state(struct drm_device *dev, int state)
-{
-       if (WARN(!tc35876x_client, "%s called before probe", __func__))
-               return;
-
-       dev_dbg(&tc35876x_client->dev, "%s: state %d\n", __func__, state);
-
-       if (!bridge_reset)
-               return;
-
-       if (state) {
-               gpiod_set_value_cansleep(bridge_reset, 0);
-               mdelay(10);
-       } else {
-               /* Pull MIPI Bridge reset pin to Low */
-               gpiod_set_value_cansleep(bridge_reset, 0);
-               mdelay(20);
-               /* Pull MIPI Bridge reset pin to High */
-               gpiod_set_value_cansleep(bridge_reset, 1);
-               mdelay(40);
-       }
-}
-
-void tc35876x_configure_lvds_bridge(struct drm_device *dev)
-{
-       struct i2c_client *i2c = tc35876x_client;
-       u32 ppi_lptxtimecnt;
-       u32 txtagocnt;
-       u32 txtasurecnt;
-       u32 id;
-
-       if (WARN(!tc35876x_client, "%s called before probe", __func__))
-               return;
-
-       dev_dbg(&tc35876x_client->dev, "%s\n", __func__);
-
-       if (!tc35876x_regr(i2c, IDREG, &id))
-               dev_info(&tc35876x_client->dev, "tc35876x ID 0x%08x\n", id);
-       else
-               dev_err(&tc35876x_client->dev, "Cannot read ID\n");
-
-       ppi_lptxtimecnt = 4;
-       txtagocnt = (5 * ppi_lptxtimecnt - 3) / 4;
-       txtasurecnt = 3 * ppi_lptxtimecnt / 2;
-       tc35876x_regw(i2c, PPI_TX_RX_TA, FLD_VAL(txtagocnt, 26, 16) |
-               FLD_VAL(txtasurecnt, 10, 0));
-       tc35876x_regw(i2c, PPI_LPTXTIMECNT, FLD_VAL(ppi_lptxtimecnt, 10, 0));
-
-       tc35876x_regw(i2c, PPI_D0S_CLRSIPOCOUNT, FLD_VAL(1, 5, 0));
-       tc35876x_regw(i2c, PPI_D1S_CLRSIPOCOUNT, FLD_VAL(1, 5, 0));
-       tc35876x_regw(i2c, PPI_D2S_CLRSIPOCOUNT, FLD_VAL(1, 5, 0));
-       tc35876x_regw(i2c, PPI_D3S_CLRSIPOCOUNT, FLD_VAL(1, 5, 0));
-
-       /* Enabling MIPI & PPI lanes, Enable 4 lanes */
-       tc35876x_regw(i2c, PPI_LANEENABLE,
-               BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0));
-       tc35876x_regw(i2c, DSI_LANEENABLE,
-               BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0));
-       tc35876x_regw(i2c, PPI_STARTPPI, BIT(0));
-       tc35876x_regw(i2c, DSI_STARTDSI, BIT(0));
-
-       /* Setting LVDS output frequency */
-       tc35876x_regw(i2c, LVPHY0, FLD_VAL(1, 20, 16) |
-               FLD_VAL(2, 15, 14) | FLD_VAL(6, 4, 0)); /* 0x00048006 */
-
-       /* Setting video panel control register,0x00000120 VTGen=ON ?!?!? */
-       tc35876x_regw(i2c, VPCTRL, BIT(8) | BIT(5));
-
-       /* Horizontal back porch and horizontal pulse width. 0x00280028 */
-       tc35876x_regw(i2c, HTIM1, FLD_VAL(40, 24, 16) | FLD_VAL(40, 8, 0));
-
-       /* Horizontal front porch and horizontal active video size. 0x00500500*/
-       tc35876x_regw(i2c, HTIM2, FLD_VAL(80, 24, 16) | FLD_VAL(1280, 10, 0));
-
-       /* Vertical back porch and vertical sync pulse width. 0x000e000a */
-       tc35876x_regw(i2c, VTIM1, FLD_VAL(14, 23, 16) | FLD_VAL(10, 7, 0));
-
-       /* Vertical front porch and vertical display size. 0x000e0320 */
-       tc35876x_regw(i2c, VTIM2, FLD_VAL(14, 23, 16) | FLD_VAL(800, 10, 0));
-
-       /* Set above HTIM1, HTIM2, VTIM1, and VTIM2 at next VSYNC. */
-       tc35876x_regw(i2c, VFUEN, BIT(0));
-
-       /* Soft reset LCD controller. */
-       tc35876x_regw(i2c, SYSRST, BIT(2));
-
-       /* LVDS-TX input muxing */
-       tc35876x_regw(i2c, LVMX0003,
-               INPUT_MUX(INPUT_R5, INPUT_R4, INPUT_R3, INPUT_R2));
-       tc35876x_regw(i2c, LVMX0407,
-               INPUT_MUX(INPUT_G2, INPUT_R7, INPUT_R1, INPUT_R6));
-       tc35876x_regw(i2c, LVMX0811,
-               INPUT_MUX(INPUT_G1, INPUT_G0, INPUT_G4, INPUT_G3));
-       tc35876x_regw(i2c, LVMX1215,
-               INPUT_MUX(INPUT_B2, INPUT_G7, INPUT_G6, INPUT_G5));
-       tc35876x_regw(i2c, LVMX1619,
-               INPUT_MUX(INPUT_B4, INPUT_B3, INPUT_B1, INPUT_B0));
-       tc35876x_regw(i2c, LVMX2023,
-               INPUT_MUX(LOGIC_0,  INPUT_B7, INPUT_B6, INPUT_B5));
-       tc35876x_regw(i2c, LVMX2427,
-               INPUT_MUX(INPUT_R0, INPUT_DE, INPUT_VSYNC, INPUT_HSYNC));
-
-       /* Enable LVDS transmitter. */
-       tc35876x_regw(i2c, LVCFG, BIT(0));
-
-       /* Clear notifications. Don't write reserved bits. Was write 0xffffffff
-        * to 0x0288, must be in error?! */
-       tc35876x_regw(i2c, DSI_INTCLR, FLD_MASK(31, 30) | FLD_MASK(22, 0));
-}
-
-#define GPIOPWMCTRL    0x38F
-#define PWM0CLKDIV0    0x62 /* low byte */
-#define PWM0CLKDIV1    0x61 /* high byte */
-
-#define SYSTEMCLK      19200000UL /* 19.2 MHz */
-#define PWM_FREQUENCY  9600 /* Hz */
-
-/* f = baseclk / (clkdiv + 1) => clkdiv = (baseclk - f) / f */
-static inline u16 calc_clkdiv(unsigned long baseclk, unsigned int f)
-{
-       return (baseclk - f) / f;
-}
-
-static void tc35876x_brightness_init(struct drm_device *dev)
-{
-       int ret;
-       u8 pwmctrl;
-       u16 clkdiv;
-
-       /* Make sure the PWM reference is the 19.2 MHz system clock. Read first
-        * instead of setting directly to catch potential conflicts between PWM
-        * users. */
-       ret = intel_scu_ipc_ioread8(GPIOPWMCTRL, &pwmctrl);
-       if (ret || pwmctrl != 0x01) {
-               if (ret)
-                       dev_err(dev->dev, "GPIOPWMCTRL read failed\n");
-               else
-                       dev_warn(dev->dev, "GPIOPWMCTRL was not set to system clock (pwmctrl = 0x%02x)\n", pwmctrl);
-
-               ret = intel_scu_ipc_iowrite8(GPIOPWMCTRL, 0x01);
-               if (ret)
-                       dev_err(dev->dev, "GPIOPWMCTRL set failed\n");
-       }
-
-       clkdiv = calc_clkdiv(SYSTEMCLK, PWM_FREQUENCY);
-
-       ret = intel_scu_ipc_iowrite8(PWM0CLKDIV1, (clkdiv >> 8) & 0xff);
-       if (!ret)
-               ret = intel_scu_ipc_iowrite8(PWM0CLKDIV0, clkdiv & 0xff);
-
-       if (ret)
-               dev_err(dev->dev, "PWM0CLKDIV set failed\n");
-       else
-               dev_dbg(dev->dev, "PWM0CLKDIV set to 0x%04x (%d Hz)\n",
-                       clkdiv, PWM_FREQUENCY);
-}
-
-#define PWM0DUTYCYCLE                  0x67
-
-void tc35876x_brightness_control(struct drm_device *dev, int level)
-{
-       int ret;
-       u8 duty_val;
-       u8 panel_duty_val;
-
-       level = clamp(level, 0, MDFLD_DSI_BRIGHTNESS_MAX_LEVEL);
-
-       /* PWM duty cycle 0x00...0x63 corresponds to 0...99% */
-       duty_val = level * 0x63 / MDFLD_DSI_BRIGHTNESS_MAX_LEVEL;
-
-       /* I won't pretend to understand this formula. The panel spec is quite
-        * bad engrish.
-        */
-       panel_duty_val = (2 * level - 100) * 0xA9 /
-                        MDFLD_DSI_BRIGHTNESS_MAX_LEVEL + 0x56;
-
-       ret = intel_scu_ipc_iowrite8(PWM0DUTYCYCLE, duty_val);
-       if (ret)
-               dev_err(&tc35876x_client->dev, "%s: ipc write fail\n",
-                       __func__);
-
-       if (cmi_lcd_i2c_client) {
-               ret = i2c_smbus_write_byte_data(cmi_lcd_i2c_client,
-                                               PANEL_PWM_MAX, panel_duty_val);
-               if (ret < 0)
-                       dev_err(&cmi_lcd_i2c_client->dev, "%s: i2c write failed\n",
-                               __func__);
-       }
-}
-
-void tc35876x_toshiba_bridge_panel_off(struct drm_device *dev)
-{
-       if (WARN(!tc35876x_client, "%s called before probe", __func__))
-               return;
-
-       dev_dbg(&tc35876x_client->dev, "%s\n", __func__);
-
-       if (bridge_bl_enable)
-               gpiod_set_value_cansleep(bridge_bl_enable, 0);
-
-       if (backlight_voltage)
-               gpiod_set_value_cansleep(backlight_voltage, 0);
-}
-
-void tc35876x_toshiba_bridge_panel_on(struct drm_device *dev)
-{
-       struct drm_psb_private *dev_priv = dev->dev_private;
-
-       if (WARN(!tc35876x_client, "%s called before probe", __func__))
-               return;
-
-       dev_dbg(&tc35876x_client->dev, "%s\n", __func__);
-
-       if (backlight_voltage) {
-               gpiod_set_value_cansleep(backlight_voltage, 1);
-               msleep(260);
-       }
-
-       if (cmi_lcd_i2c_client) {
-               int ret;
-               dev_dbg(&cmi_lcd_i2c_client->dev, "setting TCON\n");
-               /* Bit 4 is average_saving. Setting it to 1, the brightness is
-                * referenced to the average of the frame content. 0 means
-                * reference to the maximum of frame contents. Bits 3:0 are
-                * allow_distort. When set to a nonzero value, all color values
-                * between 255-allow_distort*2 and 255 are mapped to the
-                * 255-allow_distort*2 value.
-                */
-               ret = i2c_smbus_write_byte_data(cmi_lcd_i2c_client,
-                                               PANEL_ALLOW_DISTORT, 0x10);
-               if (ret < 0)
-                       dev_err(&cmi_lcd_i2c_client->dev,
-                               "i2c write failed (%d)\n", ret);
-               ret = i2c_smbus_write_byte_data(cmi_lcd_i2c_client,
-                                               PANEL_BYPASS_PWMI, 0);
-               if (ret < 0)
-                       dev_err(&cmi_lcd_i2c_client->dev,
-                               "i2c write failed (%d)\n", ret);
-               /* Set minimum brightness value - this is tunable */
-               ret = i2c_smbus_write_byte_data(cmi_lcd_i2c_client,
-                                               PANEL_PWM_MIN, 0x35);
-               if (ret < 0)
-                       dev_err(&cmi_lcd_i2c_client->dev,
-                               "i2c write failed (%d)\n", ret);
-       }
-
-       if (bridge_bl_enable)
-               gpiod_set_value_cansleep(bridge_bl_enable, 1);
-
-       tc35876x_brightness_control(dev, dev_priv->brightness_adjusted);
-}
-
-static struct drm_display_mode *tc35876x_get_config_mode(struct drm_device *dev)
-{
-       struct drm_display_mode *mode;
-
-       dev_dbg(dev->dev, "%s\n", __func__);
-
-       mode = kzalloc(sizeof(*mode), GFP_KERNEL);
-       if (!mode)
-               return NULL;
-
-       /* FIXME: do this properly. */
-       mode->hdisplay = 1280;
-       mode->vdisplay = 800;
-       mode->hsync_start = 1360;
-       mode->hsync_end = 1400;
-       mode->htotal = 1440;
-       mode->vsync_start = 814;
-       mode->vsync_end = 824;
-       mode->vtotal = 838;
-       mode->clock = 33324 << 1;
-
-       dev_info(dev->dev, "hdisplay(w) = %d\n", mode->hdisplay);
-       dev_info(dev->dev, "vdisplay(h) = %d\n", mode->vdisplay);
-       dev_info(dev->dev, "HSS = %d\n", mode->hsync_start);
-       dev_info(dev->dev, "HSE = %d\n", mode->hsync_end);
-       dev_info(dev->dev, "htotal = %d\n", mode->htotal);
-       dev_info(dev->dev, "VSS = %d\n", mode->vsync_start);
-       dev_info(dev->dev, "VSE = %d\n", mode->vsync_end);
-       dev_info(dev->dev, "vtotal = %d\n", mode->vtotal);
-       dev_info(dev->dev, "clock = %d\n", mode->clock);
-
-       drm_mode_set_name(mode);
-       drm_mode_set_crtcinfo(mode, 0);
-
-       mode->type |= DRM_MODE_TYPE_PREFERRED;
-
-       return mode;
-}
-
-/* DV1 Active area 216.96 x 135.6 mm */
-#define DV1_PANEL_WIDTH 217
-#define DV1_PANEL_HEIGHT 136
-
-static int tc35876x_get_panel_info(struct drm_device *dev, int pipe,
-                               struct panel_info *pi)
-{
-       if (!dev || !pi)
-               return -EINVAL;
-
-       pi->width_mm = DV1_PANEL_WIDTH;
-       pi->height_mm = DV1_PANEL_HEIGHT;
-
-       return 0;
-}
-
-static int tc35876x_bridge_probe(struct i2c_client *client,
-                               const struct i2c_device_id *id)
-{
-       dev_info(&client->dev, "%s\n", __func__);
-
-       if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
-               dev_err(&client->dev, "%s: i2c_check_functionality() failed\n",
-                       __func__);
-               return -ENODEV;
-       }
-
-       bridge_reset = devm_gpiod_get_optional(&client->dev, "bridge-reset", GPIOD_OUT_LOW);
-       if (IS_ERR(bridge_reset))
-               return PTR_ERR(bridge_reset);
-       if (bridge_reset)
-               gpiod_set_consumer_name(bridge_reset, "tc35876x bridge reset");
-
-       bridge_bl_enable = devm_gpiod_get_optional(&client->dev, "bl-en", GPIOD_OUT_LOW);
-       if (IS_ERR(bridge_bl_enable))
-               return PTR_ERR(bridge_bl_enable);
-       if (bridge_bl_enable)
-               gpiod_set_consumer_name(bridge_bl_enable, "tc35876x panel bl en");
-
-       backlight_voltage = devm_gpiod_get_optional(&client->dev, "vadd", GPIOD_OUT_LOW);
-       if (IS_ERR(backlight_voltage))
-               return PTR_ERR(backlight_voltage);
-       if (backlight_voltage)
-               gpiod_set_consumer_name(backlight_voltage, "tc35876x panel vadd");
-
-       tc35876x_client = client;
-
-       return 0;
-}
-
-static int tc35876x_bridge_remove(struct i2c_client *client)
-{
-       dev_dbg(&client->dev, "%s\n", __func__);
-
-       tc35876x_client = NULL;
-
-       return 0;
-}
-
-static const struct i2c_device_id tc35876x_bridge_id[] = {
-       { "i2c_disp_brig", 0 },
-       { }
-};
-MODULE_DEVICE_TABLE(i2c, tc35876x_bridge_id);
-
-static struct i2c_driver tc35876x_bridge_i2c_driver = {
-       .driver = {
-               .name = "i2c_disp_brig",
-       },
-       .id_table = tc35876x_bridge_id,
-       .probe = tc35876x_bridge_probe,
-       .remove = tc35876x_bridge_remove,
-};
-
-/* LCD panel I2C */
-static int cmi_lcd_i2c_probe(struct i2c_client *client,
-                            const struct i2c_device_id *id)
-{
-       dev_info(&client->dev, "%s\n", __func__);
-
-       if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
-               dev_err(&client->dev, "%s: i2c_check_functionality() failed\n",
-                       __func__);
-               return -ENODEV;
-       }
-
-       cmi_lcd_i2c_client = client;
-
-       return 0;
-}
-
-static int cmi_lcd_i2c_remove(struct i2c_client *client)
-{
-       dev_dbg(&client->dev, "%s\n", __func__);
-
-       cmi_lcd_i2c_client = NULL;
-
-       return 0;
-}
-
-static const struct i2c_device_id cmi_lcd_i2c_id[] = {
-       { "cmi-lcd", 0 },
-       { }
-};
-MODULE_DEVICE_TABLE(i2c, cmi_lcd_i2c_id);
-
-static struct i2c_driver cmi_lcd_i2c_driver = {
-       .driver = {
-               .name = "cmi-lcd",
-       },
-       .id_table = cmi_lcd_i2c_id,
-       .probe = cmi_lcd_i2c_probe,
-       .remove = cmi_lcd_i2c_remove,
-};
-
-/* HACK to create I2C device while it's not created by platform code */
-#define CMI_LCD_I2C_ADAPTER    2
-#define CMI_LCD_I2C_ADDR       0x60
-
-static int cmi_lcd_hack_create_device(void)
-{
-       struct i2c_adapter *adapter;
-       struct i2c_client *client;
-       struct i2c_board_info info = {
-               .type = "cmi-lcd",
-               .addr = CMI_LCD_I2C_ADDR,
-       };
-
-       pr_debug("%s\n", __func__);
-
-       adapter = i2c_get_adapter(CMI_LCD_I2C_ADAPTER);
-       if (!adapter) {
-               pr_err("%s: i2c_get_adapter(%d) failed\n", __func__,
-                       CMI_LCD_I2C_ADAPTER);
-               return -EINVAL;
-       }
-
-       client = i2c_new_client_device(adapter, &info);
-       if (IS_ERR(client)) {
-               pr_err("%s: creating I2C device failed\n", __func__);
-               i2c_put_adapter(adapter);
-               return PTR_ERR(client);
-       }
-
-       return 0;
-}
-
-static const struct drm_encoder_helper_funcs tc35876x_encoder_helper_funcs = {
-       .dpms = mdfld_dsi_dpi_dpms,
-       .mode_fixup = mdfld_dsi_dpi_mode_fixup,
-       .prepare = mdfld_dsi_dpi_prepare,
-       .mode_set = mdfld_dsi_dpi_mode_set,
-       .commit = mdfld_dsi_dpi_commit,
-};
-
-const struct panel_funcs mdfld_tc35876x_funcs = {
-       .encoder_helper_funcs = &tc35876x_encoder_helper_funcs,
-       .get_config_mode = tc35876x_get_config_mode,
-       .get_panel_info = tc35876x_get_panel_info,
-};
-
-void tc35876x_init(struct drm_device *dev)
-{
-       int r;
-
-       dev_dbg(dev->dev, "%s\n", __func__);
-
-       cmi_lcd_hack_create_device();
-
-       r = i2c_add_driver(&cmi_lcd_i2c_driver);
-       if (r < 0)
-               dev_err(dev->dev,
-                       "%s: i2c_add_driver() for %s failed (%d)\n",
-                       __func__, cmi_lcd_i2c_driver.driver.name, r);
-
-       r = i2c_add_driver(&tc35876x_bridge_i2c_driver);
-       if (r < 0)
-               dev_err(dev->dev,
-                       "%s: i2c_add_driver() for %s failed (%d)\n",
-                       __func__, tc35876x_bridge_i2c_driver.driver.name, r);
-
-       tc35876x_brightness_init(dev);
-}
-
-void tc35876x_exit(void)
-{
-       pr_debug("%s\n", __func__);
-
-       i2c_del_driver(&tc35876x_bridge_i2c_driver);
-
-       if (cmi_lcd_i2c_client)
-               i2c_del_driver(&cmi_lcd_i2c_driver);
-}
diff --git a/drivers/gpu/drm/gma500/tc35876x-dsi-lvds.h b/drivers/gpu/drm/gma500/tc35876x-dsi-lvds.h
deleted file mode 100644 (file)
index b14b7f9..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright Â© 2011 Intel Corporation
- *
- * 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 (including the next
- * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- */
-
-#ifndef __MDFLD_DSI_LVDS_BRIDGE_H__
-#define __MDFLD_DSI_LVDS_BRIDGE_H__
-
-void tc35876x_set_bridge_reset_state(struct drm_device *dev, int state);
-void tc35876x_configure_lvds_bridge(struct drm_device *dev);
-void tc35876x_brightness_control(struct drm_device *dev, int level);
-void tc35876x_toshiba_bridge_panel_off(struct drm_device *dev);
-void tc35876x_toshiba_bridge_panel_on(struct drm_device *dev);
-void tc35876x_init(struct drm_device *dev);
-void tc35876x_exit(void);
-
-extern const struct panel_funcs mdfld_tc35876x_funcs;
-
-#endif /*__MDFLD_DSI_LVDS_BRIDGE_H__*/
index 63b4c56..5cc20b4 100644 (file)
@@ -201,7 +201,7 @@ static int lima_pm_busy(struct lima_device *ldev)
        int ret;
 
        /* resume GPU if it has been suspended by runtime PM */
-       ret = pm_runtime_get_sync(ldev->dev);
+       ret = pm_runtime_resume_and_get(ldev->dev);
        if (ret < 0)
                return ret;
 
index 57d4f45..0b86c44 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 e9468c9..d351ac8 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 c920939..a18b6cf 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 c6b401a..e58923b 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 ce98efd..070462b 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 3981cb1..fd9a3f9 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 76288c6..1665738 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 f938f02..d5530fa 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 86f420f..cfd2da8 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 66c5c5e..9da9176 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 0f6fa66..d08d333 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 2e12cdb..a003da3 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 27c1f86..306125d 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 b335f3a..54fab7c 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 1530c81..b28b752 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 8585a31..f137f27 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 83bb2fc..ac8f08c 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 69e09fd..81c2b6f 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 9e11cef..2d5fa96 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 1b3183e..97bd309 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 33e6ba8..1a259c5 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 4d754e7..af89d46 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 f14e98a..37ed7ab 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 34dc765..06264c8 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 2e91769..b1a53ff 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 8984415..1bab268 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 fbf27b2..3083a58 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 836d8b9..c0b254f 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 14b09f7..4f07836 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 f2860f8..b61cfb0 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 ae9ad6c..2ac03bb 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 bf937e7..05b99c9 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 50cc7c0..848b5d9 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 a513c16..581458a 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 2ecd52a..ef6a629 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 00111c3..dabbef0 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 cdcce5e..0e46ea1 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 06db676..cf42a59 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 640f649..146e132 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 f483dcd..7400d62 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 c74ab7c..f967b97 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 d76f60d..d32a326 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 e45ca45..cb86a56 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 54cdcb0..0911e73 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 78df1e9..7d4132a 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 4803a4f..74c19bd 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 5ff6d1f..f57a3a5 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 62c34f9..bd04f49 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 d06dcbe..439a3f7 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 7be0e7e..ee75c55 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 45053a2..0be86d5 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 f08b31d..0a9334d 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 7cc683b..e8c445e 100644 (file)
@@ -2083,13 +2083,11 @@ nouveau_bios_init(struct drm_device *dev)
 {
        struct nouveau_drm *drm = nouveau_drm(dev);
        struct nvbios *bios = &drm->vbios;
-       struct pci_dev *pdev;
        int ret;
 
        /* only relevant for PCI devices */
        if (!dev_is_pci(dev->dev))
                return 0;
-       pdev = to_pci_dev(dev->dev);
 
        if (!NVInitVBIOS(dev))
                return -ENODEV;
index e48f1f7..7cfac26 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 1b2169e..885815e 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 e84a2e2..a463289 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 1a47c40..e41a39a 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 38130ef..c69daac 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 49d468b..a74b7ac 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 44e116f..39f6db2 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 ad9f855..b9cc395 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 9e0b53a..27f29eb 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 c0df7da..c3c4765 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 c6fa8b2..d2db618 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 c771045..a4f08a4 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 985c8f6..180d497 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 63ac51a..704df0f 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 fcda3de..cd5e9cd 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 b4308e2..e5ff92d 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 68ffb52..be2a718 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 cdcc851..b930f53 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 54eab5e..93949b3 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 1478947..fea9d8f 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 cbd33e8..5daa777 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 50e3539..a7a7eb0 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 731f188..156bbe8 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 def54fe..3425b5d 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 aa2e564..68aa525 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 e675d9b..a6bafe7 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 4c3439b..3b79cf2 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 bc6f475..988eb12 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 031cf6b..5d8108f 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 ec9c33a..f7bb660 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 8471de3..af0ca81 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 a3779c5..065fea1 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 f801837..22bc269 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 7581efc..63a912b 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 c103252..53879d5 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 cfdce23..762a59f 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 85d9329..e5c58aa 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 b780ba1..a12097d 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 e21556b..3f20e49 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 db31b37..025cacd 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 f815a53..ec57d8b 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 4c85d1d..f5f8dc8 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 11b7b8f..425cde3 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 efec5d3..99a1e07 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 34c7660..fd1d1fc 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 c65a4c2..a5af0df 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 30747a0..ea5a889 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 77aca7b..6e8f796 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 0c9d964..d403bed 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 8675613..43b7dec 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 c773caf..2ed4ff0 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 d834853..8d95764 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 177e105..e535043 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 a5c998f..353b77d 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 7c125a1..f7ac106 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 2269866..cfbe096 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 60ca794..727bc89 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 85f7dbf..c44d7c8 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 5735ff7..af8bdf2 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 c213122..dbcdc5f 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 f5f355f..07d80d5 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 7edc6a5..edd70a1 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 5f722c6..0411fb9 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 ff7b529..c0a7d0f 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 5a39e51..8b4f36b 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 c73b7ea..69da601 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 4398b34..f2d12ae 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 f820969..915278c 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 2f54787..cb70369 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 a814c4e..6e35cf4 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 c2a2e45..7af6e68 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 b8cfe3b..573658c 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 70b4fee..556c97e 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 2c7a017..6b46b6b 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 8c65ad4..7a5929c 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 75f9632..4e78bbe 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 728a1ed..b6900a5 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 a7462cf..ee4967b 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 6ee1bb3..70e16a9 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 c1d1b1a..c6730c1 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 e5eccee..3f23bcd 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 f9a87de..f8887f0 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 f6d383a..3f94c7b 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 2d61fd8..f9ea468 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 fa6e094..be94156 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 87d30b6..0111e7e 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 0ef8baa..8992728 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 14e5b70..e417044 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 d41fb94..61759f5 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 da1ba74..65c3321 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 749f73f..397ff4f 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 dfd5dd7..c0038f9 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 0536fe8..3acd99c 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 14284b0..030640b 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 2807525..616e2de 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 235c3fb..669e753 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 7eac385..5b09bda 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 89f51d7..b680eaa 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 735f05e..103e06a 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 adc971b..034d0b1 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 aa0eff6..116d682 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 6d4d728..be0b2ce 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 09bb78b..3109871 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 8151370..5c38ff0 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 1aab691..ec1c46e 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 ddba7ce..0550dd6 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 c083f37..5b001f3 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 f6a31e9..2655574 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 2c80c6a..adabc04 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 2be8f41..7310f04 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 6edc4bc..e13683b 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 c711a55..1dfc65d 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 fa103df..fcb5ead 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 2189a8f..4d043c1 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 eb1a906..cf782b6 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 c91eb56..6f90a63 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 9c2e985..0bc1a23 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 4ebbfbd..942450b 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 4327bae..5cfe927 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 3e2c685..69ece25 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 12437d0..e39dfc7 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 d837630..6bff10c 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 e57407a..c0d2be5 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 32d29d3..f3a56f1 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 f941062..f268d26 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 785ec95..e5737cd 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 bd610d7..1ab2da8 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 89db7f5..591260f 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 5f1ad83..67f3535 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 e612879..f3d3d3a 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 45ff802..22b6a38 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 df16ffd..563a100 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 465f4da..84388c4 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 3b30f24..9b2c66e 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 6039f99..1a8a218 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 c0e11a0..0fcc0ff 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 7fea7d4..b1054db 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 b3e1315..9f30aaa 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 b5ec7c5..1791674 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 c3cf02e..521ce43 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 6df880a..e6374f3 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 80211f7..842fcfb 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 f30cf1d..ecb06d6 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 cfe1aa8..0a69bd7 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 24272b4..a08991d 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 cf6e59a..791fb03 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 86445a2..2bc5537 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 bfae5e6..45a9411 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 c45dbf7..160120b 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 803c62a..debed9a 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 49cbf72..a2fd736 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 f20b109..582ab8c 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 745bbb6..7be42b9 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 4a2a9f0..cfa2065 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 1695e53..8d58ad8 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 b640cd6..b28be28 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 201e8ef..d7489f9 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 a0f540e..16c30b6 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 5cd1e83..f729d91 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 9b23c1b..b0181cc 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 0ab27ab..8c44ce4 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 e14da8b..0920f6a 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 484100e..c39e797 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 d249c8f..f44d41b 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 100fa5e..4130a2b 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 b2785be..8fe0444 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 6e441dd..0086d00 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 fe2532e..8e02701 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 461bb21..bc4b014 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 49b24c9..5055658 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 9170025..c61e8c0 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 07f946d..75bf3df 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 5cf5dd5..25874c5 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 c9227ad..54c23e2 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 3fda594..eba5b3b 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 8ed1932..afb7984 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 cc5a41d..bbd3404 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 cd6f8f7..6ae25d3 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 6d2a7f0..1b87df0 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 41318aa..092c6d0 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 bccf7ac..44e39f5 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 e770c94..3e9f5c8 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 8cbc0b7..af19229 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 a231c1c..f3faeb7 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 7be3198..14871d0 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 ea8f424..55abf83 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 b6675fe..4aa5757 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 09d22fc..e79e640 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 01573d1..1fdd094 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 6d18fc6..d9d83b1 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 7a96178..b502266 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 7054938..f7d3ba0 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 c6a3448..262641a 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 fb4fff1..2cb24ff 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 c962df9..af6cac6 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 cd41b2e..cdb1ead 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 b1ecc58..54e996f 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 80eb9d8..fb9132a 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 67a7c14..373d638 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 8249f0d..f03ba02 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 d71af17..c30b841 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 c4981bc..05a87e7 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 209a6a4..d017a1b 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 87f26f5..77a41bc 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 a3dcb09..51070b7 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 4ae4c71..328a68b 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 35878fb..eead8ab 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 3ddf922..da95307 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 1ed6170..4acdb4f 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 f23a0cc..27d8a1b 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 e4193de..dedee93 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 869ad18..daebfc9 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 798f65e..c25ab40 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 f3c30b2..d0f52d5 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 52ad73b..0e5a46d 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 9700b5c..a0d6e2d 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 e0930d5..53a6651 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 2b44ba5..cfed17c 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 5153d89..ad8da52 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 19e10fd..3a1e45a 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 76f7ba1..2e9345b 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 dc184e8..57199be 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 f97e3ec..07157cf 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 7f67f9f..6eea11a 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 0b37e3d..0d8e2dd 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 218893e..d573fb0 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 0d14509..286413f 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 b284e94..a139daf 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 f0a2688..b5f3969 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 4884eb4..81f103f 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 b280f85..ca13598 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 2ab9b9b..7ddd8ce 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 da1770e..8306776 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 7c77132..5b4cb7e 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 81dfb37..810cc57 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 4756019..dd49817 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 e895289..c224702 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 a9d4584..05729ca 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 636a921..6b280b0 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 8b1b34c..051cfd6 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 28ca01b..4323732 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 59940da..a308b9b 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 9a8522f..dc026ac 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 fbde682..b4d1688 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 ce4f718..fb90d47 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 317ce9f..88bc890 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 15b029d..06ad8a6 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 9891ead..1410bef 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 570822f..a6aa878 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 fefafec..4cc5ef9 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 4ef04e0..67f46df 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 d7947c4..380995d 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 e8d37a6..987a7f4 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 05961e6..dd8b038 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 9a469bf..634f64f 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 f6dca97..fd54fa5 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 f6b189c..6af7959 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 9e66d1f..89e0bc9 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 2707be4..cd9d2ad 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 f6f1dd7..36681c3 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 f080051..91eb672 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 5940e0d..6faaea9 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 06bf95c..770a4ad 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 bf82686..b47bebf 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 bcecf84..6ea7908 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 e8dc4e9..9dcc40f 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 2ed7cda..0cac7b0 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 4a9f463..76678dd 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 48fd98e..f73442c 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 0695e5d..45d6cdf 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 a7e29b1..6bc42f8 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 69c876d..de52462 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 d3b8c33..5acf8d1 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 12db61e..86f61a3 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 8205ce4..09e943e 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 fc8c93a..0e78b3d 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 af8e439..84c9815 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 9266559..c1ec975 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 feda86a..63daa83 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 73b3b86..70c7b08 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 6d11e32..308d955 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 c886664..8d5a007 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 c998b7e..7d2c16b 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 7b9f04f..4bdad2a 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 a021d21..d254f27 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 7709f5f..47da66d 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 8aa7826..0f87efb 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 6e83dcf..0694dcf 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 2a07617..1a39770 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 9551607..77dbb9d 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 b77f08d..0f9d9e4 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 b59dc48..b1046ee 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 cab7d20..0d78de4 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 a8b0ad4..5cedde2 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 d0b317b..95cc099 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 6a6f0c0..c9f3148 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 b2f5bf8..95fd8f8 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 5e2b0c9..a5e6738 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 66932ac..3f1be97 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 b11867f..03b1bdb 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 d350d92..2b678b6 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 1c3c18e..375dfce 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 13671fe..01f7706 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 9aff4ea..7dc9949 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 514c193..2505e8e 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 2edc612..e83d0c3 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 9142764..048bcc7 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 6dcda55..114728c 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 62c791b..4a96f92 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 bb7400d..ecb19e4 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 2ead515..c0e4cdb 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 ae3499b..48ad29b 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 73923fd..b86c497 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 59e39af..6590d81 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 5a32df0..2257488 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 2114f9b..2ac7fc9 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 92820fb..19381dd 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 7193450..cb5cb53 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 bb2a31d..e5bad08 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 ae4aad3..cda30ee 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 6f2b02a..e9c6a6c 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 f9f6bf4..d35aa6f 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 8e3bfa1..9fec6af 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 7b2375b..46917eb 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 18776f4..ecfcf14 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 6b762f7..ad1d3fd 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 75640ab..2f94bed 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 e35f603..f9d79f7 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/gf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gf100.c
deleted file mode 100644 (file)
index 1115376..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright 2012 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.
- *
- * Authors: Ben Skeggs
- */
-#include "priv.h"
-#include <subdev/timer.h>
-
-static void
-gf100_ibus_intr_hub(struct nvkm_subdev *ibus, int i)
-{
-       struct nvkm_device *device = ibus->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);
-}
-
-static void
-gf100_ibus_intr_rop(struct nvkm_subdev *ibus, int i)
-{
-       struct nvkm_device *device = ibus->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);
-}
-
-static void
-gf100_ibus_intr_gpc(struct nvkm_subdev *ibus, int i)
-{
-       struct nvkm_device *device = ibus->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);
-}
-
-void
-gf100_ibus_intr(struct nvkm_subdev *ibus)
-{
-       struct nvkm_device *device = ibus->device;
-       u32 intr0 = nvkm_rd32(device, 0x121c58);
-       u32 intr1 = nvkm_rd32(device, 0x121c5c);
-       u32 hubnr = nvkm_rd32(device, 0x121c70);
-       u32 ropnr = nvkm_rd32(device, 0x121c74);
-       u32 gpcnr = nvkm_rd32(device, 0x121c78);
-       u32 i;
-
-       for (i = 0; (intr0 & 0x0000ff00) && i < hubnr; i++) {
-               u32 stat = 0x00000100 << i;
-               if (intr0 & stat) {
-                       gf100_ibus_intr_hub(ibus, i);
-                       intr0 &= ~stat;
-               }
-       }
-
-       for (i = 0; (intr0 & 0xffff0000) && i < ropnr; i++) {
-               u32 stat = 0x00010000 << i;
-               if (intr0 & stat) {
-                       gf100_ibus_intr_rop(ibus, i);
-                       intr0 &= ~stat;
-               }
-       }
-
-       for (i = 0; intr1 && i < gpcnr; i++) {
-               u32 stat = 0x00000001 << i;
-               if (intr1 & stat) {
-                       gf100_ibus_intr_gpc(ibus, i);
-                       intr1 &= ~stat;
-               }
-       }
-
-       nvkm_mask(device, 0x121c4c, 0x0000003f, 0x00000002);
-       nvkm_msec(device, 2000,
-               if (!(nvkm_rd32(device, 0x121c4c) & 0x0000003f))
-                       break;
-       );
-}
-
-static int
-gf100_ibus_init(struct nvkm_subdev *ibus)
-{
-       struct nvkm_device *device = ibus->device;
-       nvkm_mask(device, 0x122310, 0x0003ffff, 0x00000800);
-       nvkm_wr32(device, 0x12232c, 0x00100064);
-       nvkm_wr32(device, 0x122330, 0x00100064);
-       nvkm_wr32(device, 0x122334, 0x00100064);
-       nvkm_mask(device, 0x122348, 0x0003ffff, 0x00000100);
-       return 0;
-}
-
-static const struct nvkm_subdev_func
-gf100_ibus = {
-       .init = gf100_ibus_init,
-       .intr = gf100_ibus_intr,
-};
-
-int
-gf100_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
-{
-       return nvkm_subdev_new_(&gf100_ibus, device, index, pibus);
-}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gf117.c b/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gf117.c
deleted file mode 100644 (file)
index 1124dad..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2015 Samuel Pitosiet
- *
- * 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.
- *
- * Authors: Samuel Pitoiset
- */
-#include "priv.h"
-
-static int
-gf117_ibus_init(struct nvkm_subdev *ibus)
-{
-       struct nvkm_device *device = ibus->device;
-       nvkm_mask(device, 0x122310, 0x0003ffff, 0x00000800);
-       nvkm_mask(device, 0x122348, 0x0003ffff, 0x00000100);
-       nvkm_mask(device, 0x1223b0, 0x0003ffff, 0x00000fff);
-       return 0;
-}
-
-static const struct nvkm_subdev_func
-gf117_ibus = {
-       .init = gf117_ibus_init,
-       .intr = gf100_ibus_intr,
-};
-
-int
-gf117_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
-{
-       return nvkm_subdev_new_(&gf117_ibus, device, index, pibus);
-}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk104.c b/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk104.c
deleted file mode 100644 (file)
index 22e487b..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2012 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.
- *
- * Authors: Ben Skeggs
- */
-#include "priv.h"
-#include <subdev/timer.h>
-
-static void
-gk104_ibus_intr_hub(struct nvkm_subdev *ibus, int i)
-{
-       struct nvkm_device *device = ibus->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);
-}
-
-static void
-gk104_ibus_intr_rop(struct nvkm_subdev *ibus, int i)
-{
-       struct nvkm_device *device = ibus->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);
-}
-
-static void
-gk104_ibus_intr_gpc(struct nvkm_subdev *ibus, int i)
-{
-       struct nvkm_device *device = ibus->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);
-}
-
-void
-gk104_ibus_intr(struct nvkm_subdev *ibus)
-{
-       struct nvkm_device *device = ibus->device;
-       u32 intr0 = nvkm_rd32(device, 0x120058);
-       u32 intr1 = nvkm_rd32(device, 0x12005c);
-       u32 hubnr = nvkm_rd32(device, 0x120070);
-       u32 ropnr = nvkm_rd32(device, 0x120074);
-       u32 gpcnr = nvkm_rd32(device, 0x120078);
-       u32 i;
-
-       for (i = 0; (intr0 & 0x0000ff00) && i < hubnr; i++) {
-               u32 stat = 0x00000100 << i;
-               if (intr0 & stat) {
-                       gk104_ibus_intr_hub(ibus, i);
-                       intr0 &= ~stat;
-               }
-       }
-
-       for (i = 0; (intr0 & 0xffff0000) && i < ropnr; i++) {
-               u32 stat = 0x00010000 << i;
-               if (intr0 & stat) {
-                       gk104_ibus_intr_rop(ibus, i);
-                       intr0 &= ~stat;
-               }
-       }
-
-       for (i = 0; intr1 && i < gpcnr; i++) {
-               u32 stat = 0x00000001 << i;
-               if (intr1 & stat) {
-                       gk104_ibus_intr_gpc(ibus, i);
-                       intr1 &= ~stat;
-               }
-       }
-
-       nvkm_mask(device, 0x12004c, 0x0000003f, 0x00000002);
-       nvkm_msec(device, 2000,
-               if (!(nvkm_rd32(device, 0x12004c) & 0x0000003f))
-                       break;
-       );
-}
-
-static int
-gk104_ibus_init(struct nvkm_subdev *ibus)
-{
-       struct nvkm_device *device = ibus->device;
-       nvkm_mask(device, 0x122318, 0x0003ffff, 0x00001000);
-       nvkm_mask(device, 0x12231c, 0x0003ffff, 0x00000200);
-       nvkm_mask(device, 0x122310, 0x0003ffff, 0x00000800);
-       nvkm_mask(device, 0x122348, 0x0003ffff, 0x00000100);
-       nvkm_mask(device, 0x1223b0, 0x0003ffff, 0x00000fff);
-       nvkm_mask(device, 0x122348, 0x0003ffff, 0x00000200);
-       nvkm_mask(device, 0x122358, 0x0003ffff, 0x00002880);
-       return 0;
-}
-
-static const struct nvkm_subdev_func
-gk104_ibus = {
-       .preinit = gk104_ibus_init,
-       .init = gk104_ibus_init,
-       .intr = gk104_ibus_intr,
-};
-
-int
-gk104_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
-{
-       return nvkm_subdev_new_(&gk104_ibus, device, index, pibus);
-}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk20a.c b/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk20a.c
deleted file mode 100644 (file)
index 187d544..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
- *
- * 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 AUTHORS OR COPYRIGHT HOLDERS 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 <subdev/ibus.h>
-#include <subdev/timer.h>
-
-static void
-gk20a_ibus_init_ibus_ring(struct nvkm_subdev *ibus)
-{
-       struct nvkm_device *device = ibus->device;
-       nvkm_mask(device, 0x137250, 0x3f, 0);
-
-       nvkm_mask(device, 0x000200, 0x20, 0);
-       udelay(20);
-       nvkm_mask(device, 0x000200, 0x20, 0x20);
-
-       nvkm_wr32(device, 0x12004c, 0x4);
-       nvkm_wr32(device, 0x122204, 0x2);
-       nvkm_rd32(device, 0x122204);
-
-       /*
-        * Bug: increase clock timeout to avoid operation failure at high
-        * gpcclk rate.
-        */
-       nvkm_wr32(device, 0x122354, 0x800);
-       nvkm_wr32(device, 0x128328, 0x800);
-       nvkm_wr32(device, 0x124320, 0x800);
-}
-
-static void
-gk20a_ibus_intr(struct nvkm_subdev *ibus)
-{
-       struct nvkm_device *device = ibus->device;
-       u32 status0 = nvkm_rd32(device, 0x120058);
-
-       if (status0 & 0x7) {
-               nvkm_debug(ibus, "resetting ibus ring\n");
-               gk20a_ibus_init_ibus_ring(ibus);
-       }
-
-       /* Acknowledge interrupt */
-       nvkm_mask(device, 0x12004c, 0x2, 0x2);
-       nvkm_msec(device, 2000,
-               if (!(nvkm_rd32(device, 0x12004c) & 0x0000003f))
-                       break;
-       );
-}
-
-static int
-gk20a_ibus_init(struct nvkm_subdev *ibus)
-{
-       gk20a_ibus_init_ibus_ring(ibus);
-       return 0;
-}
-
-static const struct nvkm_subdev_func
-gk20a_ibus = {
-       .init = gk20a_ibus_init,
-       .intr = gk20a_ibus_intr,
-};
-
-int
-gk20a_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
-{
-       return nvkm_subdev_new_(&gk20a_ibus, device, index, pibus);
-}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gm200.c b/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gm200.c
deleted file mode 100644 (file)
index 0f1f0ad..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2015 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.
- *
- * Authors: Ben Skeggs <bskeggs@redhat.com>
- */
-#include "priv.h"
-
-static const struct nvkm_subdev_func
-gm200_ibus = {
-       .intr = gk104_ibus_intr,
-};
-
-int
-gm200_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
-{
-       return nvkm_subdev_new_(&gm200_ibus, device, index, pibus);
-}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gp10b.c b/drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gp10b.c
deleted file mode 100644 (file)
index 0347b36..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
- *
- * 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 AUTHORS OR COPYRIGHT HOLDERS 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 <subdev/ibus.h>
-
-#include "priv.h"
-
-static int
-gp10b_ibus_init(struct nvkm_subdev *ibus)
-{
-       struct nvkm_device *device = ibus->device;
-
-       nvkm_wr32(device, 0x1200a8, 0x0);
-
-       /* init ring */
-       nvkm_wr32(device, 0x12004c, 0x4);
-       nvkm_wr32(device, 0x122204, 0x2);
-       nvkm_rd32(device, 0x122204);
-
-       /* timeout configuration */
-       nvkm_wr32(device, 0x009080, 0x800186a0);
-
-       return 0;
-}
-
-static const struct nvkm_subdev_func
-gp10b_ibus = {
-       .init = gp10b_ibus_init,
-       .intr = gk104_ibus_intr,
-};
-
-int
-gp10b_ibus_new(struct nvkm_device *device, int index,
-              struct nvkm_subdev **pibus)
-{
-       return nvkm_subdev_new_(&gp10b_ibus, device, index, pibus);
-}
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 fecfa6a..8f0ccd3 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 cccff1c..3eabf49 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 cc09c6c..c334411 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 364ea44..cd8163a 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 13d4d7a..648ecf5 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 6bf0dad..25603b0 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 086c118..6b462f9 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 02c4eb2..96aca0e 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 f5da8fc..56c15e3 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 2324217..fa683c1 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 a21ef45..fd8aeaf 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 b4f6e00..94aa092 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 ec0a384..54d1d65 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 e18e0dc..8cfdbbd 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 e923ed7..a4a6cd9 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 601747a..ff05d61 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 c0063c7..dfebd79 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 eca5a71..2bebe13 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 09f669a..21c4af3 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 430a61c..4cfc1c9 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 93ad498..b7e58d7 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 967eb3a..4105175 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 f937664..3a589c6 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 7b8c6ec..d9b9067 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 ca1bf32..0359029 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 43db245..5fd1a05 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 45c62f5..dd581d0 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 99d50a3..1b4d435 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 6509def..bc0d09b 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 9213107..ab59ca1 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 64bf5bb..03d756e 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 65fa44a..95f6576 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 fe93b4f..fce3613 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 0d01b2c..c8bcabb 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 af0afd1..58db83e 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 6d5212a..ad3b44a 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 8accda5..ce47a3b 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 2cd5ec8..7a28b1d 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 3d7d1eb..34c9b2b 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 ac74965..a7db29c 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 83990c8..e1696f6 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 7353a94..e6e1a8a 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 65cb9d2..daa5ab0 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 0a50be9..edd0bf9 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 e0997ee..fb8bdc8 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 0527b50..514876d 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 d201c88..0674aa8 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 adca818..909f92b 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 598c53a..dd2a8d4 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 c0083dd..78d46e3 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 479b023..5265bf4 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 94081f3..8d060ce 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 6a2d9eb..5438384 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 1d33696..3198467 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 2d89e27..b7548dc 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 b1294d0..6cb5eef 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 f44682d..c1acfe6 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 70e2c41..f316790 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 fc8f69e..fcacb6c 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 ee2431a..a7d42ea 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 62438d8..5b29aac 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 4887435..a9e0674 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 09adb37..7bacd06 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 00a5e7d..0999060 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 11bf419..bcde609 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 e680305..6be87ec 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 82c5234..a5fafda 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 5b1ed42..9ab6419 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 6eb4177..6a3c31c 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 fc617e4..9cad17f 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 1f1b26b..741e34b 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 7009aad..9b75835 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 a0fe607..2438287 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 3ecb3d9..f725a3e 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 8dd0271..0f4b669 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 8b70cc1..9e7631d 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 0081f21..dbaefee 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 b227c70..a08fb04 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 26c1adf..a67a42e 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 5afb55e..622ee63 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 383376a..5968c76 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 8f6ed53..1487069 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 3d8ce14..00da1b8 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 9c237c4..461f722 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 88b9099..b0407b8 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 276b6d7..e7860d1 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
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf100.c
new file mode 100644 (file)
index 0000000..ef7caca
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2012 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.
+ *
+ * Authors: Ben Skeggs
+ */
+#include "priv.h"
+#include <subdev/timer.h>
+
+static void
+gf100_privring_intr_hub(struct nvkm_subdev *privring, int i)
+{
+       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(privring, "HUB%d: %06x %08x (%08x)\n", i, addr, data, stat);
+}
+
+static void
+gf100_privring_intr_rop(struct nvkm_subdev *privring, int i)
+{
+       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(privring, "ROP%d: %06x %08x (%08x)\n", i, addr, data, stat);
+}
+
+static void
+gf100_privring_intr_gpc(struct nvkm_subdev *privring, int i)
+{
+       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(privring, "GPC%d: %06x %08x (%08x)\n", i, addr, data, stat);
+}
+
+void
+gf100_privring_intr(struct nvkm_subdev *privring)
+{
+       struct nvkm_device *device = privring->device;
+       u32 intr0 = nvkm_rd32(device, 0x121c58);
+       u32 intr1 = nvkm_rd32(device, 0x121c5c);
+       u32 hubnr = nvkm_rd32(device, 0x121c70);
+       u32 ropnr = nvkm_rd32(device, 0x121c74);
+       u32 gpcnr = nvkm_rd32(device, 0x121c78);
+       u32 i;
+
+       for (i = 0; (intr0 & 0x0000ff00) && i < hubnr; i++) {
+               u32 stat = 0x00000100 << i;
+               if (intr0 & stat) {
+                       gf100_privring_intr_hub(privring, i);
+                       intr0 &= ~stat;
+               }
+       }
+
+       for (i = 0; (intr0 & 0xffff0000) && i < ropnr; i++) {
+               u32 stat = 0x00010000 << i;
+               if (intr0 & stat) {
+                       gf100_privring_intr_rop(privring, i);
+                       intr0 &= ~stat;
+               }
+       }
+
+       for (i = 0; intr1 && i < gpcnr; i++) {
+               u32 stat = 0x00000001 << i;
+               if (intr1 & stat) {
+                       gf100_privring_intr_gpc(privring, i);
+                       intr1 &= ~stat;
+               }
+       }
+
+       nvkm_mask(device, 0x121c4c, 0x0000003f, 0x00000002);
+       nvkm_msec(device, 2000,
+               if (!(nvkm_rd32(device, 0x121c4c) & 0x0000003f))
+                       break;
+       );
+}
+
+static int
+gf100_privring_init(struct nvkm_subdev *privring)
+{
+       struct nvkm_device *device = privring->device;
+       nvkm_mask(device, 0x122310, 0x0003ffff, 0x00000800);
+       nvkm_wr32(device, 0x12232c, 0x00100064);
+       nvkm_wr32(device, 0x122330, 0x00100064);
+       nvkm_wr32(device, 0x122334, 0x00100064);
+       nvkm_mask(device, 0x122348, 0x0003ffff, 0x00000100);
+       return 0;
+}
+
+static const struct nvkm_subdev_func
+gf100_privring = {
+       .init = gf100_privring_init,
+       .intr = gf100_privring_intr,
+};
+
+int
+gf100_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
+{
+       return nvkm_subdev_new_(&gf100_privring, device, type, inst, pprivring);
+}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf117.c b/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf117.c
new file mode 100644 (file)
index 0000000..c78721f
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2015 Samuel Pitosiet
+ *
+ * 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.
+ *
+ * Authors: Samuel Pitoiset
+ */
+#include "priv.h"
+
+static int
+gf117_privring_init(struct nvkm_subdev *privring)
+{
+       struct nvkm_device *device = privring->device;
+       nvkm_mask(device, 0x122310, 0x0003ffff, 0x00000800);
+       nvkm_mask(device, 0x122348, 0x0003ffff, 0x00000100);
+       nvkm_mask(device, 0x1223b0, 0x0003ffff, 0x00000fff);
+       return 0;
+}
+
+static const struct nvkm_subdev_func
+gf117_privring = {
+       .init = gf117_privring_init,
+       .intr = gf100_privring_intr,
+};
+
+int
+gf117_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
+{
+       return nvkm_subdev_new_(&gf117_privring, device, type, inst, pprivring);
+}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk104.c b/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk104.c
new file mode 100644 (file)
index 0000000..568a4c0
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2012 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.
+ *
+ * Authors: Ben Skeggs
+ */
+#include "priv.h"
+#include <subdev/timer.h>
+
+static void
+gk104_privring_intr_hub(struct nvkm_subdev *privring, int i)
+{
+       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(privring, "HUB%d: %06x %08x (%08x)\n", i, addr, data, stat);
+}
+
+static void
+gk104_privring_intr_rop(struct nvkm_subdev *privring, int i)
+{
+       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(privring, "ROP%d: %06x %08x (%08x)\n", i, addr, data, stat);
+}
+
+static void
+gk104_privring_intr_gpc(struct nvkm_subdev *privring, int i)
+{
+       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(privring, "GPC%d: %06x %08x (%08x)\n", i, addr, data, stat);
+}
+
+void
+gk104_privring_intr(struct nvkm_subdev *privring)
+{
+       struct nvkm_device *device = privring->device;
+       u32 intr0 = nvkm_rd32(device, 0x120058);
+       u32 intr1 = nvkm_rd32(device, 0x12005c);
+       u32 hubnr = nvkm_rd32(device, 0x120070);
+       u32 ropnr = nvkm_rd32(device, 0x120074);
+       u32 gpcnr = nvkm_rd32(device, 0x120078);
+       u32 i;
+
+       for (i = 0; (intr0 & 0x0000ff00) && i < hubnr; i++) {
+               u32 stat = 0x00000100 << i;
+               if (intr0 & stat) {
+                       gk104_privring_intr_hub(privring, i);
+                       intr0 &= ~stat;
+               }
+       }
+
+       for (i = 0; (intr0 & 0xffff0000) && i < ropnr; i++) {
+               u32 stat = 0x00010000 << i;
+               if (intr0 & stat) {
+                       gk104_privring_intr_rop(privring, i);
+                       intr0 &= ~stat;
+               }
+       }
+
+       for (i = 0; intr1 && i < gpcnr; i++) {
+               u32 stat = 0x00000001 << i;
+               if (intr1 & stat) {
+                       gk104_privring_intr_gpc(privring, i);
+                       intr1 &= ~stat;
+               }
+       }
+
+       nvkm_mask(device, 0x12004c, 0x0000003f, 0x00000002);
+       nvkm_msec(device, 2000,
+               if (!(nvkm_rd32(device, 0x12004c) & 0x0000003f))
+                       break;
+       );
+}
+
+static int
+gk104_privring_init(struct nvkm_subdev *privring)
+{
+       struct nvkm_device *device = privring->device;
+       nvkm_mask(device, 0x122318, 0x0003ffff, 0x00001000);
+       nvkm_mask(device, 0x12231c, 0x0003ffff, 0x00000200);
+       nvkm_mask(device, 0x122310, 0x0003ffff, 0x00000800);
+       nvkm_mask(device, 0x122348, 0x0003ffff, 0x00000100);
+       nvkm_mask(device, 0x1223b0, 0x0003ffff, 0x00000fff);
+       nvkm_mask(device, 0x122348, 0x0003ffff, 0x00000200);
+       nvkm_mask(device, 0x122358, 0x0003ffff, 0x00002880);
+       return 0;
+}
+
+static const struct nvkm_subdev_func
+gk104_privring = {
+       .preinit = gk104_privring_init,
+       .init = gk104_privring_init,
+       .intr = gk104_privring_intr,
+};
+
+int
+gk104_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
+{
+       return nvkm_subdev_new_(&gk104_privring, device, type, inst, pprivring);
+}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk20a.c b/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk20a.c
new file mode 100644 (file)
index 0000000..55e4a60
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
+ *
+ * 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 AUTHORS OR COPYRIGHT HOLDERS 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 <subdev/privring.h>
+#include <subdev/timer.h>
+
+static void
+gk20a_privring_init_privring_ring(struct nvkm_subdev *privring)
+{
+       struct nvkm_device *device = privring->device;
+       nvkm_mask(device, 0x137250, 0x3f, 0);
+
+       nvkm_mask(device, 0x000200, 0x20, 0);
+       udelay(20);
+       nvkm_mask(device, 0x000200, 0x20, 0x20);
+
+       nvkm_wr32(device, 0x12004c, 0x4);
+       nvkm_wr32(device, 0x122204, 0x2);
+       nvkm_rd32(device, 0x122204);
+
+       /*
+        * Bug: increase clock timeout to avoid operation failure at high
+        * gpcclk rate.
+        */
+       nvkm_wr32(device, 0x122354, 0x800);
+       nvkm_wr32(device, 0x128328, 0x800);
+       nvkm_wr32(device, 0x124320, 0x800);
+}
+
+static void
+gk20a_privring_intr(struct nvkm_subdev *privring)
+{
+       struct nvkm_device *device = privring->device;
+       u32 status0 = nvkm_rd32(device, 0x120058);
+
+       if (status0 & 0x7) {
+               nvkm_debug(privring, "resetting privring ring\n");
+               gk20a_privring_init_privring_ring(privring);
+       }
+
+       /* Acknowledge interrupt */
+       nvkm_mask(device, 0x12004c, 0x2, 0x2);
+       nvkm_msec(device, 2000,
+               if (!(nvkm_rd32(device, 0x12004c) & 0x0000003f))
+                       break;
+       );
+}
+
+static int
+gk20a_privring_init(struct nvkm_subdev *privring)
+{
+       gk20a_privring_init_privring_ring(privring);
+       return 0;
+}
+
+static const struct nvkm_subdev_func
+gk20a_privring = {
+       .init = gk20a_privring_init,
+       .intr = gk20a_privring_intr,
+};
+
+int
+gk20a_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
+{
+       return nvkm_subdev_new_(&gk20a_privring, device, type, inst, pprivring);
+}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gm200.c b/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gm200.c
new file mode 100644 (file)
index 0000000..b4eaf6d
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015 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.
+ *
+ * Authors: Ben Skeggs <bskeggs@redhat.com>
+ */
+#include "priv.h"
+
+static const struct nvkm_subdev_func
+gm200_privring = {
+       .intr = gk104_privring_intr,
+};
+
+int
+gm200_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
+{
+       return nvkm_subdev_new_(&gm200_privring, device, type, inst, pprivring);
+}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gp10b.c b/drivers/gpu/drm/nouveau/nvkm/subdev/privring/gp10b.c
new file mode 100644 (file)
index 0000000..4534111
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
+ *
+ * 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 AUTHORS OR COPYRIGHT HOLDERS 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 <subdev/privring.h>
+
+#include "priv.h"
+
+static int
+gp10b_privring_init(struct nvkm_subdev *privring)
+{
+       struct nvkm_device *device = privring->device;
+
+       nvkm_wr32(device, 0x1200a8, 0x0);
+
+       /* init ring */
+       nvkm_wr32(device, 0x12004c, 0x4);
+       nvkm_wr32(device, 0x122204, 0x2);
+       nvkm_rd32(device, 0x122204);
+
+       /* timeout configuration */
+       nvkm_wr32(device, 0x009080, 0x800186a0);
+
+       return 0;
+}
+
+static const struct nvkm_subdev_func
+gp10b_privring = {
+       .init = gp10b_privring_init,
+       .intr = gk104_privring_intr,
+};
+
+int
+gp10b_privring_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
+                  struct nvkm_subdev **pprivring)
+{
+       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 4a4d1e2..fc5ee11 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 96f8da4..4af86f2 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 0981b02..2b031d4 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 4e03971..45e295c 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 293e774..9a86414 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 86848ec..c845fd3 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 73dc780..e0cdd12 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 9f0dea3..44f0213 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 c08097f..9e451bd 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 2c92ffb..c13fee9 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 9b57b43..9cf16a7 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 21659da..54e9605 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 dd92203..8b0da0c 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 9ed5f64..73c3776 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 7f48249..0058e85 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 bb99a15..7e1f8c2 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 3cf9ec1..c2b2637 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 89e9729..e6debe7 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 438d9d7..d5db845 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 cce6e4e..28d0789 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 1156634..4dcad97 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 a16baa2..8e103a8 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 e344901..a17a6dd 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 d9ed692..b47a1c0 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 547a58f..03c8a2c 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 1c744e0..d1ce430 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 ce5d83c..8c2faa9 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 6a6c97f..01f8a5f 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 2925b9c..c2e9694 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 2340938..d6a587d 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 75f13a3..24e2d16 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 *);
index b641252..445d3ba 100644 (file)
@@ -1026,7 +1026,6 @@ int vc4_queue_seqno_cb(struct drm_device *dev,
                       void (*func)(struct vc4_seqno_cb *cb))
 {
        struct vc4_dev *vc4 = to_vc4_dev(dev);
-       int ret = 0;
        unsigned long irqflags;
 
        cb->func = func;
@@ -1041,7 +1040,7 @@ int vc4_queue_seqno_cb(struct drm_device *dev,
        }
        spin_unlock_irqrestore(&vc4->job_lock, irqflags);
 
-       return ret;
+       return 0;
 }
 
 /* Scheduled when any job has been completed, this walks the list of
index bd75146..1fda574 100644 (file)
@@ -132,24 +132,57 @@ static void vc5_hdmi_reset(struct vc4_hdmi *vc4_hdmi)
                   HDMI_READ(HDMI_CLOCK_STOP) | VC4_DVP_HT_CLOCK_STOP_PIXEL);
 }
 
+#ifdef CONFIG_DRM_VC4_HDMI_CEC
+static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi)
+{
+       u16 clk_cnt;
+       u32 value;
+
+       value = HDMI_READ(HDMI_CEC_CNTRL_1);
+       value &= ~VC4_HDMI_CEC_DIV_CLK_CNT_MASK;
+
+       /*
+        * Set the clock divider: the hsm_clock rate and this divider
+        * setting will give a 40 kHz CEC clock.
+        */
+       clk_cnt = clk_get_rate(vc4_hdmi->cec_clock) / CEC_CLOCK_FREQ;
+       value |= clk_cnt << VC4_HDMI_CEC_DIV_CLK_CNT_SHIFT;
+       HDMI_WRITE(HDMI_CEC_CNTRL_1, value);
+}
+#else
+static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) {}
+#endif
+
 static enum drm_connector_status
 vc4_hdmi_connector_detect(struct drm_connector *connector, bool force)
 {
        struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
+       bool connected = false;
 
        if (vc4_hdmi->hpd_gpio) {
                if (gpio_get_value_cansleep(vc4_hdmi->hpd_gpio) ^
                    vc4_hdmi->hpd_active_low)
-                       return connector_status_connected;
-               cec_phys_addr_invalidate(vc4_hdmi->cec_adap);
-               return connector_status_disconnected;
+                       connected = true;
+       } else if (drm_probe_ddc(vc4_hdmi->ddc)) {
+               connected = true;
+       } else if (HDMI_READ(HDMI_HOTPLUG) & VC4_HDMI_HOTPLUG_CONNECTED) {
+               connected = true;
        }
 
-       if (drm_probe_ddc(vc4_hdmi->ddc))
-               return connector_status_connected;
+       if (connected) {
+               if (connector->status != connector_status_connected) {
+                       struct edid *edid = drm_get_edid(connector, vc4_hdmi->ddc);
+
+                       if (edid) {
+                               cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
+                               vc4_hdmi->encoder.hdmi_monitor = drm_detect_hdmi_monitor(edid);
+                               kfree(edid);
+                       }
+               }
 
-       if (HDMI_READ(HDMI_HOTPLUG) & VC4_HDMI_HOTPLUG_CONNECTED)
                return connector_status_connected;
+       }
+
        cec_phys_addr_invalidate(vc4_hdmi->cec_adap);
        return connector_status_disconnected;
 }
@@ -758,6 +791,8 @@ static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder,
                return;
        }
 
+       vc4_hdmi_cec_update_clk_div(vc4_hdmi);
+
        /*
         * FIXME: When the pixel freq is 594MHz (4k60), this needs to be setup
         * at 300MHz.
@@ -779,9 +814,6 @@ static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder,
                return;
        }
 
-       if (vc4_hdmi->variant->reset)
-               vc4_hdmi->variant->reset(vc4_hdmi);
-
        if (vc4_hdmi->variant->phy_init)
                vc4_hdmi->variant->phy_init(vc4_hdmi, vc4_conn_state);
 
@@ -1423,15 +1455,22 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi)
 }
 
 #ifdef CONFIG_DRM_VC4_HDMI_CEC
-static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv)
+static irqreturn_t vc4_cec_irq_handler_rx_thread(int irq, void *priv)
+{
+       struct vc4_hdmi *vc4_hdmi = priv;
+
+       if (vc4_hdmi->cec_rx_msg.len)
+               cec_received_msg(vc4_hdmi->cec_adap,
+                                &vc4_hdmi->cec_rx_msg);
+
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t vc4_cec_irq_handler_tx_thread(int irq, void *priv)
 {
        struct vc4_hdmi *vc4_hdmi = priv;
 
-       if (vc4_hdmi->cec_irq_was_rx) {
-               if (vc4_hdmi->cec_rx_msg.len)
-                       cec_received_msg(vc4_hdmi->cec_adap,
-                                        &vc4_hdmi->cec_rx_msg);
-       } else if (vc4_hdmi->cec_tx_ok) {
+       if (vc4_hdmi->cec_tx_ok) {
                cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_OK,
                                  0, 0, 0, 0);
        } else {
@@ -1445,15 +1484,35 @@ static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv)
        return IRQ_HANDLED;
 }
 
+static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv)
+{
+       struct vc4_hdmi *vc4_hdmi = priv;
+       irqreturn_t ret;
+
+       if (vc4_hdmi->cec_irq_was_rx)
+               ret = vc4_cec_irq_handler_rx_thread(irq, priv);
+       else
+               ret = vc4_cec_irq_handler_tx_thread(irq, priv);
+
+       return ret;
+}
+
 static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1)
 {
+       struct drm_device *dev = vc4_hdmi->connector.dev;
        struct cec_msg *msg = &vc4_hdmi->cec_rx_msg;
        unsigned int i;
 
        msg->len = 1 + ((cntrl1 & VC4_HDMI_CEC_REC_WRD_CNT_MASK) >>
                                        VC4_HDMI_CEC_REC_WRD_CNT_SHIFT);
+
+       if (msg->len > 16) {
+               drm_err(dev, "Attempting to read too much data (%d)\n", msg->len);
+               return;
+       }
+
        for (i = 0; i < msg->len; i += 4) {
-               u32 val = HDMI_READ(HDMI_CEC_RX_DATA_1 + i);
+               u32 val = HDMI_READ(HDMI_CEC_RX_DATA_1 + (i >> 2));
 
                msg->msg[i] = val & 0xff;
                msg->msg[i + 1] = (val >> 8) & 0xff;
@@ -1462,31 +1521,55 @@ static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1)
        }
 }
 
+static irqreturn_t vc4_cec_irq_handler_tx_bare(int irq, void *priv)
+{
+       struct vc4_hdmi *vc4_hdmi = priv;
+       u32 cntrl1;
+
+       cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
+       vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD;
+       cntrl1 &= ~VC4_HDMI_CEC_START_XMIT_BEGIN;
+       HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
+
+       return IRQ_WAKE_THREAD;
+}
+
+static irqreturn_t vc4_cec_irq_handler_rx_bare(int irq, void *priv)
+{
+       struct vc4_hdmi *vc4_hdmi = priv;
+       u32 cntrl1;
+
+       vc4_hdmi->cec_rx_msg.len = 0;
+       cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
+       vc4_cec_read_msg(vc4_hdmi, cntrl1);
+       cntrl1 |= VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
+       HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
+       cntrl1 &= ~VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
+
+       HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
+
+       return IRQ_WAKE_THREAD;
+}
+
 static irqreturn_t vc4_cec_irq_handler(int irq, void *priv)
 {
        struct vc4_hdmi *vc4_hdmi = priv;
        u32 stat = HDMI_READ(HDMI_CEC_CPU_STATUS);
-       u32 cntrl1, cntrl5;
+       irqreturn_t ret;
+       u32 cntrl5;
 
        if (!(stat & VC4_HDMI_CPU_CEC))
                return IRQ_NONE;
-       vc4_hdmi->cec_rx_msg.len = 0;
-       cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
+
        cntrl5 = HDMI_READ(HDMI_CEC_CNTRL_5);
        vc4_hdmi->cec_irq_was_rx = cntrl5 & VC4_HDMI_CEC_RX_CEC_INT;
-       if (vc4_hdmi->cec_irq_was_rx) {
-               vc4_cec_read_msg(vc4_hdmi, cntrl1);
-               cntrl1 |= VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
-               HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
-               cntrl1 &= ~VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
-       } else {
-               vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD;
-               cntrl1 &= ~VC4_HDMI_CEC_START_XMIT_BEGIN;
-       }
-       HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
-       HDMI_WRITE(HDMI_CEC_CPU_CLEAR, VC4_HDMI_CPU_CEC);
+       if (vc4_hdmi->cec_irq_was_rx)
+               ret = vc4_cec_irq_handler_rx_bare(irq, priv);
+       else
+               ret = vc4_cec_irq_handler_tx_bare(irq, priv);
 
-       return IRQ_WAKE_THREAD;
+       HDMI_WRITE(HDMI_CEC_CPU_CLEAR, VC4_HDMI_CPU_CEC);
+       return ret;
 }
 
 static int vc4_hdmi_cec_adap_enable(struct cec_adapter *adap, bool enable)
@@ -1523,9 +1606,11 @@ static int vc4_hdmi_cec_adap_enable(struct cec_adapter *adap, bool enable)
                           ((3600 / usecs) << VC4_HDMI_CEC_CNT_TO_3600_US_SHIFT) |
                           ((3500 / usecs) << VC4_HDMI_CEC_CNT_TO_3500_US_SHIFT));
 
-               HDMI_WRITE(HDMI_CEC_CPU_MASK_CLEAR, VC4_HDMI_CPU_CEC);
+               if (!vc4_hdmi->variant->external_irq_controller)
+                       HDMI_WRITE(HDMI_CEC_CPU_MASK_CLEAR, VC4_HDMI_CPU_CEC);
        } else {
-               HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, VC4_HDMI_CPU_CEC);
+               if (!vc4_hdmi->variant->external_irq_controller)
+                       HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, VC4_HDMI_CPU_CEC);
                HDMI_WRITE(HDMI_CEC_CNTRL_5, val |
                           VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET);
        }
@@ -1546,11 +1631,17 @@ static int vc4_hdmi_cec_adap_transmit(struct cec_adapter *adap, u8 attempts,
                                      u32 signal_free_time, struct cec_msg *msg)
 {
        struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
+       struct drm_device *dev = vc4_hdmi->connector.dev;
        u32 val;
        unsigned int i;
 
+       if (msg->len > 16) {
+               drm_err(dev, "Attempting to transmit too much data (%d)\n", msg->len);
+               return -ENOMEM;
+       }
+
        for (i = 0; i < msg->len; i += 4)
-               HDMI_WRITE(HDMI_CEC_TX_DATA_1 + i,
+               HDMI_WRITE(HDMI_CEC_TX_DATA_1 + (i >> 2),
                           (msg->msg[i]) |
                           (msg->msg[i + 1] << 8) |
                           (msg->msg[i + 2] << 16) |
@@ -1577,11 +1668,14 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi)
 {
        struct cec_connector_info conn_info;
        struct platform_device *pdev = vc4_hdmi->pdev;
+       struct device *dev = &pdev->dev;
        u32 value;
        int ret;
 
-       if (!vc4_hdmi->variant->cec_available)
+       if (!of_find_property(dev->of_node, "interrupts", NULL)) {
+               dev_warn(dev, "'interrupts' DT property is missing, no CEC\n");
                return 0;
+       }
 
        vc4_hdmi->cec_adap = cec_allocate_adapter(&vc4_hdmi_cec_adap_ops,
                                                  vc4_hdmi, "vc4",
@@ -1594,23 +1688,39 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi)
        cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector);
        cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info);
 
-       HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, 0xffffffff);
        value = HDMI_READ(HDMI_CEC_CNTRL_1);
-       value &= ~VC4_HDMI_CEC_DIV_CLK_CNT_MASK;
-       /*
-        * Set the logical address to Unregistered and set the clock
-        * divider: the hsm_clock rate and this divider setting will
-        * give a 40 kHz CEC clock.
-        */
-       value |= VC4_HDMI_CEC_ADDR_MASK |
-                (4091 << VC4_HDMI_CEC_DIV_CLK_CNT_SHIFT);
+       /* Set the logical address to Unregistered */
+       value |= VC4_HDMI_CEC_ADDR_MASK;
        HDMI_WRITE(HDMI_CEC_CNTRL_1, value);
-       ret = devm_request_threaded_irq(&pdev->dev, platform_get_irq(pdev, 0),
-                                       vc4_cec_irq_handler,
-                                       vc4_cec_irq_handler_thread, 0,
-                                       "vc4 hdmi cec", vc4_hdmi);
-       if (ret)
-               goto err_delete_cec_adap;
+
+       vc4_hdmi_cec_update_clk_div(vc4_hdmi);
+
+       if (vc4_hdmi->variant->external_irq_controller) {
+               ret = devm_request_threaded_irq(&pdev->dev,
+                                               platform_get_irq_byname(pdev, "cec-rx"),
+                                               vc4_cec_irq_handler_rx_bare,
+                                               vc4_cec_irq_handler_rx_thread, 0,
+                                               "vc4 hdmi cec rx", vc4_hdmi);
+               if (ret)
+                       goto err_delete_cec_adap;
+
+               ret = devm_request_threaded_irq(&pdev->dev,
+                                               platform_get_irq_byname(pdev, "cec-tx"),
+                                               vc4_cec_irq_handler_tx_bare,
+                                               vc4_cec_irq_handler_tx_thread, 0,
+                                               "vc4 hdmi cec tx", vc4_hdmi);
+               if (ret)
+                       goto err_delete_cec_adap;
+       } else {
+               HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, 0xffffffff);
+
+               ret = devm_request_threaded_irq(&pdev->dev, platform_get_irq(pdev, 0),
+                                               vc4_cec_irq_handler,
+                                               vc4_cec_irq_handler_thread, 0,
+                                               "vc4 hdmi cec", vc4_hdmi);
+               if (ret)
+                       goto err_delete_cec_adap;
+       }
 
        ret = cec_register_adapter(vc4_hdmi->cec_adap, &pdev->dev);
        if (ret < 0)
@@ -1710,6 +1820,7 @@ static int vc4_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi)
                return PTR_ERR(vc4_hdmi->hsm_clock);
        }
        vc4_hdmi->audio_clock = vc4_hdmi->hsm_clock;
+       vc4_hdmi->cec_clock = vc4_hdmi->hsm_clock;
 
        return 0;
 }
@@ -1803,6 +1914,12 @@ static int vc5_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi)
                return PTR_ERR(vc4_hdmi->audio_clock);
        }
 
+       vc4_hdmi->cec_clock = devm_clk_get(dev, "cec");
+       if (IS_ERR(vc4_hdmi->cec_clock)) {
+               DRM_ERROR("Failed to get CEC clock\n");
+               return PTR_ERR(vc4_hdmi->cec_clock);
+       }
+
        vc4_hdmi->reset = devm_reset_control_get(dev, NULL);
        if (IS_ERR(vc4_hdmi->reset)) {
                DRM_ERROR("Failed to get HDMI reset line\n");
@@ -1875,6 +1992,9 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
        vc4_hdmi->disable_wifi_frequencies =
                of_property_read_bool(dev->of_node, "wifi-2.4ghz-coexistence");
 
+       if (vc4_hdmi->variant->reset)
+               vc4_hdmi->variant->reset(vc4_hdmi);
+
        pm_runtime_enable(dev);
 
        drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS);
@@ -1970,7 +2090,6 @@ static const struct vc4_hdmi_variant bcm2835_variant = {
        .debugfs_name           = "hdmi_regs",
        .card_name              = "vc4-hdmi",
        .max_pixel_clock        = 162000000,
-       .cec_available          = true,
        .registers              = vc4_hdmi_fields,
        .num_registers          = ARRAY_SIZE(vc4_hdmi_fields),
 
@@ -1999,6 +2118,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi0_variant = {
                PHY_LANE_CK,
        },
        .unsupported_odd_h_timings      = true,
+       .external_irq_controller        = true,
 
        .init_resources         = vc5_hdmi_init_resources,
        .csc_setup              = vc5_hdmi_csc_setup,
@@ -2025,6 +2145,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = {
                PHY_LANE_2,
        },
        .unsupported_odd_h_timings      = true,
+       .external_irq_controller        = true,
 
        .init_resources         = vc5_hdmi_init_resources,
        .csc_setup              = vc5_hdmi_csc_setup,
index 4c8994c..3cebd1f 100644 (file)
@@ -42,9 +42,6 @@ struct vc4_hdmi_variant {
        /* Filename to expose the registers in debugfs */
        const char *debugfs_name;
 
-       /* Set to true when the CEC support is available */
-       bool cec_available;
-
        /* Maximum pixel clock supported by the controller (in Hz) */
        unsigned long long max_pixel_clock;
 
@@ -64,6 +61,13 @@ struct vc4_hdmi_variant {
        /* The BCM2711 cannot deal with odd horizontal pixel timings */
        bool unsupported_odd_h_timings;
 
+       /*
+        * The BCM2711 CEC/hotplug IRQ controller is shared between the
+        * two HDMI controllers, and we have a proper irqchip driver for
+        * it.
+        */
+       bool external_irq_controller;
+
        /* Callback to get the resources (memory region, interrupts,
         * clocks, etc) for that variant.
         */
@@ -155,6 +159,7 @@ struct vc4_hdmi {
        bool cec_tx_ok;
        bool cec_irq_was_rx;
 
+       struct clk *cec_clock;
        struct clk *pixel_clock;
        struct clk *hsm_clock;
        struct clk *audio_clock;
index 401863c..e1b58ea 100644 (file)
@@ -29,6 +29,7 @@ enum vc4_hdmi_field {
        HDMI_CEC_CPU_MASK_SET,
        HDMI_CEC_CPU_MASK_STATUS,
        HDMI_CEC_CPU_STATUS,
+       HDMI_CEC_CPU_SET,
 
        /*
         * Transmit data, first byte is low byte of the 32-bit reg.
@@ -199,9 +200,10 @@ static const struct vc4_hdmi_register __maybe_unused vc4_hdmi_fields[] = {
        VC4_HDMI_REG(HDMI_TX_PHY_RESET_CTL, 0x02c0),
        VC4_HDMI_REG(HDMI_TX_PHY_CTL_0, 0x02c4),
        VC4_HDMI_REG(HDMI_CEC_CPU_STATUS, 0x0340),
+       VC4_HDMI_REG(HDMI_CEC_CPU_SET, 0x0344),
        VC4_HDMI_REG(HDMI_CEC_CPU_CLEAR, 0x0348),
        VC4_HDMI_REG(HDMI_CEC_CPU_MASK_STATUS, 0x034c),
-       VC4_HDMI_REG(HDMI_CEC_CPU_MASK_SET, 0x034c),
+       VC4_HDMI_REG(HDMI_CEC_CPU_MASK_SET, 0x0350),
        VC4_HDMI_REG(HDMI_CEC_CPU_MASK_CLEAR, 0x0354),
        VC4_HDMI_REG(HDMI_RAM_PACKET_START, 0x0400),
 };
index b4ec479..b375394 100644 (file)
@@ -163,6 +163,7 @@ int virtio_gpu_init(struct drm_device *dev)
                                             vgdev->host_visible_region.len,
                                             dev_name(&vgdev->vdev->dev))) {
                        DRM_ERROR("Could not reserve host visible region\n");
+                       ret = -EBUSY;
                        goto err_vqs;
                }
 
index 408847a..dd69b51 100644 (file)
@@ -668,9 +668,10 @@ static int vmw_setup_pci_resources(struct vmw_private *dev,
                                      fifo_size,
                                      MEMREMAP_WB);
 
-       if (unlikely(dev->fifo_mem == NULL)) {
+       if (IS_ERR(dev->fifo_mem)) {
                DRM_ERROR("Failed mapping FIFO memory.\n");
-               return -ENOMEM;
+               pci_release_regions(pdev);
+               return PTR_ERR(dev->fifo_mem);
        }
 
        /*
@@ -716,7 +717,7 @@ static int vmw_driver_load(struct vmw_private *dev_priv, u32 pci_id)
                return ret;
        ret = vmw_detect_version(dev_priv);
        if (ret)
-               return ret;
+               goto out_no_pci_or_version;
 
        mutex_init(&dev_priv->cmdbuf_mutex);
        mutex_init(&dev_priv->release_mutex);
@@ -1013,7 +1014,6 @@ out_no_fman:
        if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
                vmw_irq_uninstall(&dev_priv->drm);
 out_no_irq:
-       pci_release_regions(pdev);
        ttm_object_device_release(&dev_priv->tdev);
 out_err0:
        for (i = vmw_res_context; i < vmw_res_max; ++i)
@@ -1021,7 +1021,8 @@ out_err0:
 
        if (dev_priv->ctx.staged_bindings)
                vmw_binding_state_free(dev_priv->ctx.staged_bindings);
-       kfree(dev_priv);
+out_no_pci_or_version:
+       pci_release_regions(pdev);
        return ret;
 }
 
@@ -1059,7 +1060,6 @@ static void vmw_driver_unload(struct drm_device *dev)
        vmw_fence_manager_takedown(dev_priv->fman);
        if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
                vmw_irq_uninstall(&dev_priv->drm);
-       pci_release_regions(pdev);
 
        ttm_object_device_release(&dev_priv->tdev);
        if (dev_priv->ctx.staged_bindings)
@@ -1068,7 +1068,7 @@ static void vmw_driver_unload(struct drm_device *dev)
        for (i = vmw_res_context; i < vmw_res_max; ++i)
                idr_destroy(&dev_priv->res_idr[i]);
 
-       kfree(dev_priv);
+       pci_release_regions(pdev);
 }
 
 static void vmw_postclose(struct drm_device *dev,